@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.
- package/CHANGELOG.md +62 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +299 -0
- package/cursor-rules/01-standards-compliance.mdc +244 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +222 -0
- package/cursor-rules/04-testing-standards.mdc +268 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +309 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +119 -0
- package/cursor-rules/README.md +192 -0
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
- package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
- package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
- package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
- package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
- package/dist/chunk-24UVZUZG.js.map +1 -0
- package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
- package/dist/chunk-EHMR7VYL.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +15 -12
- package/dist/components.js.map +1 -1
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +59 -126
- package/dist/hooks.js +19 -28
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +63 -16
- package/dist/index.js +23 -24
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +146 -115
- package/dist/rbac/index.js +8 -11
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +15 -15
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +7 -1
- package/docs/api/classes/ColumnFactory.md +8 -8
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +18 -15
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +9 -2
- package/docs/api/interfaces/ButtonProps.md +7 -4
- package/docs/api/interfaces/CalendarProps.md +8 -5
- package/docs/api/interfaces/CardProps.md +8 -5
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +24 -21
- package/docs/api/interfaces/DataTableColumn.md +31 -31
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +26 -23
- package/docs/api/interfaces/FooterProps.md +10 -8
- package/docs/api/interfaces/FormFieldProps.md +10 -10
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +7 -4
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +14 -11
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +11 -11
- package/docs/api/interfaces/NavigationMenuProps.md +15 -15
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
- package/docs/api/interfaces/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +3 -3
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +4 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +14 -11
- package/docs/api/interfaces/UserMenuProps.md +8 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +575 -634
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +263 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +6 -28
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/standards/README.md +40 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +12 -6
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +454 -0
- package/scripts/audit/core/checks/documentation.cjs +203 -0
- package/scripts/audit/core/checks/environment.cjs +128 -0
- package/scripts/audit/core/checks/error-handling.cjs +299 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +86 -0
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/install-cursor-rules.cjs +236 -0
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +16 -4
- package/src/components/Button/Button.tsx +27 -4
- package/src/components/Calendar/Calendar.tsx +9 -3
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +40 -6
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +200 -561
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +9 -1
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +9 -1
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +8 -7
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +4 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- package/src/components/FileDisplay/FileDisplay.tsx +32 -18
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +15 -12
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +31 -26
- package/src/components/Header/Header.tsx +22 -11
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +36 -34
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +12 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +95 -438
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +22 -19
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +5 -1
- package/src/hooks/public/usePublicEventLogo.ts +5 -1
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +5 -1
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +4 -0
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +16 -2
- package/src/hooks/useFocusTrap.ts +7 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +4 -1
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +8 -1
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +3 -3
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/AuthServiceProvider.tsx +18 -0
- package/src/providers/services/EventServiceProvider.tsx +18 -0
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +14 -5
- package/src/rbac/api.ts +100 -67
- package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +5 -2
- package/src/rbac/components/PagePermissionGuard.tsx +158 -18
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +6 -2
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +21 -6
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +347 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +71 -64
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +33 -13
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.ts +212 -61
- package/src/rbac/types.ts +8 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-BC4IJKSL.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-IIELH4DL.js.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js +0 -412
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E.js +0 -68
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.map +0 -1
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -666
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
lastUpdated: 2025-01-28T00:00:00+11:00
|
|
3
|
+
version: 0.5.193
|
|
4
|
+
reviewedBy: react-19-upgrade
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# React 19 Migration Guide
|
|
8
|
+
|
|
9
|
+
This guide documents the React 19 upgrade for `@jmruthers/pace-core` and provides migration instructions for consuming apps.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
PACE Core has been upgraded from React 18.3.1 to React 19.2.3, including the React Compiler for automatic optimizations. This upgrade provides improved performance, better type safety, and new features.
|
|
14
|
+
|
|
15
|
+
## What Changed
|
|
16
|
+
|
|
17
|
+
### Core Upgrades
|
|
18
|
+
|
|
19
|
+
- **React**: `^18.3.1` → `^19.2.3`
|
|
20
|
+
- **React DOM**: `^18.3.1` → `^19.2.3`
|
|
21
|
+
- **@types/react**: `^18.3.17` → `^19.2.7`
|
|
22
|
+
- **@types/react-dom**: `^18.3.5` → `^19.2.3`
|
|
23
|
+
- **@vitejs/plugin-react**: `^4.5.1` → `^5.1.2`
|
|
24
|
+
- **React Compiler**: Added `babel-plugin-react-compiler@^1.0.0`
|
|
25
|
+
|
|
26
|
+
### React Compiler
|
|
27
|
+
|
|
28
|
+
The React Compiler is now configured in pace-core's build setup. It automatically optimizes React components by:
|
|
29
|
+
- Automatically memoizing components and values
|
|
30
|
+
- Reducing the need for manual `useMemo` and `useCallback`
|
|
31
|
+
- Optimizing re-renders based on actual dependencies
|
|
32
|
+
|
|
33
|
+
## Breaking Changes
|
|
34
|
+
|
|
35
|
+
### TypeScript Type Stricter
|
|
36
|
+
|
|
37
|
+
React 19 has stricter TypeScript types. The main change affects accessing `child.props` in React elements:
|
|
38
|
+
|
|
39
|
+
**Before (React 18)**:
|
|
40
|
+
```tsx
|
|
41
|
+
React.Children.map(children, (child) => {
|
|
42
|
+
if (React.isValidElement(child)) {
|
|
43
|
+
const variant = child.props.variant; // Works
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**After (React 19)**:
|
|
49
|
+
```tsx
|
|
50
|
+
React.Children.map(children, (child) => {
|
|
51
|
+
if (React.isValidElement(child)) {
|
|
52
|
+
const props = child.props as { variant?: string; [key: string]: unknown };
|
|
53
|
+
const variant = props.variant; // Type-safe
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Error Handling
|
|
59
|
+
|
|
60
|
+
React 19 changes how errors are handled:
|
|
61
|
+
- Errors during render are no longer re-thrown
|
|
62
|
+
- Uncaught errors are reported to `window.reportError`
|
|
63
|
+
- Error boundaries continue to work as before
|
|
64
|
+
|
|
65
|
+
### StrictMode Behavior
|
|
66
|
+
|
|
67
|
+
React 19 StrictMode changes:
|
|
68
|
+
- `useMemo` and `useCallback` reuse results from first render during second render
|
|
69
|
+
- Ref callbacks are double-invoked on initial mount
|
|
70
|
+
|
|
71
|
+
## Migration Steps for Consuming Apps
|
|
72
|
+
|
|
73
|
+
### Step 1: Update React Dependencies
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm install react@^19.2.3 react-dom@^19.2.3
|
|
77
|
+
npm install -D @types/react@^19.2.7 @types/react-dom@^19.2.3
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 2: Update Vite Plugin
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npm install -D @vitejs/plugin-react@^5.1.2
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Step 3: Install React Compiler (Recommended)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install -D babel-plugin-react-compiler@latest
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 4: Configure React Compiler in Vite
|
|
93
|
+
|
|
94
|
+
Update your `vite.config.ts`:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { defineConfig } from 'vite'
|
|
98
|
+
import react from '@vitejs/plugin-react'
|
|
99
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
100
|
+
|
|
101
|
+
export default defineConfig({
|
|
102
|
+
plugins: [
|
|
103
|
+
react({
|
|
104
|
+
babel: {
|
|
105
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
tailwindcss()
|
|
109
|
+
],
|
|
110
|
+
// ... rest of config
|
|
111
|
+
})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Step 5: Update TypeScript Types
|
|
115
|
+
|
|
116
|
+
If you have custom components that access `child.props`, update them:
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
// Before
|
|
120
|
+
const props = child.props;
|
|
121
|
+
|
|
122
|
+
// After
|
|
123
|
+
const props = child.props as { [key: string]: unknown };
|
|
124
|
+
// Or with specific types
|
|
125
|
+
const props = child.props as { variant?: string; size?: string; [key: string]: unknown };
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 6: Test Your Application
|
|
129
|
+
|
|
130
|
+
1. Run your test suite
|
|
131
|
+
2. Check for TypeScript errors
|
|
132
|
+
3. Verify components render correctly
|
|
133
|
+
4. Test error boundaries
|
|
134
|
+
5. Use React DevTools to verify React Compiler is working (look for "Memo ✨" badge)
|
|
135
|
+
|
|
136
|
+
## React Compiler Benefits
|
|
137
|
+
|
|
138
|
+
The React Compiler automatically:
|
|
139
|
+
- Memoizes components that don't need to re-render
|
|
140
|
+
- Optimizes `useMemo` and `useCallback` usage
|
|
141
|
+
- Reduces unnecessary re-renders
|
|
142
|
+
- Improves performance without manual optimization
|
|
143
|
+
|
|
144
|
+
### When to Keep Manual Optimizations
|
|
145
|
+
|
|
146
|
+
You can still use manual `useMemo`/`useCallback` for:
|
|
147
|
+
- Complex dependencies that the compiler can't analyze
|
|
148
|
+
- Performance-critical code where you want explicit control
|
|
149
|
+
- Cases where the compiler optimization doesn't match your needs
|
|
150
|
+
|
|
151
|
+
The compiler will work alongside your manual optimizations.
|
|
152
|
+
|
|
153
|
+
## Verification
|
|
154
|
+
|
|
155
|
+
### Check React Compiler is Working
|
|
156
|
+
|
|
157
|
+
1. Install React DevTools browser extension
|
|
158
|
+
2. Open your app in development mode
|
|
159
|
+
3. Open React DevTools
|
|
160
|
+
4. Look for components with "Memo ✨" badge - these are optimized by the compiler
|
|
161
|
+
|
|
162
|
+
### Build Verification
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Type checking
|
|
166
|
+
npm run type-check
|
|
167
|
+
|
|
168
|
+
# Build
|
|
169
|
+
npm run build
|
|
170
|
+
|
|
171
|
+
# Tests
|
|
172
|
+
npm run test
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Troubleshooting
|
|
176
|
+
|
|
177
|
+
### TypeScript Errors with child.props
|
|
178
|
+
|
|
179
|
+
If you see errors like `'child.props' is of type 'unknown'`, add type assertions:
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
const props = child.props as { [key: string]: unknown };
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### React Compiler Not Working
|
|
186
|
+
|
|
187
|
+
1. Verify `babel-plugin-react-compiler` is installed
|
|
188
|
+
2. Check `vite.config.ts` has the compiler configured
|
|
189
|
+
3. Restart your dev server
|
|
190
|
+
4. Check React DevTools for "Memo ✨" badges
|
|
191
|
+
|
|
192
|
+
### Test Failures
|
|
193
|
+
|
|
194
|
+
If tests fail after upgrading:
|
|
195
|
+
1. Update `@testing-library/react` to latest version
|
|
196
|
+
2. Check for StrictMode-related test issues
|
|
197
|
+
3. Verify error boundaries still work correctly
|
|
198
|
+
|
|
199
|
+
## Rollback Plan
|
|
200
|
+
|
|
201
|
+
If you encounter issues:
|
|
202
|
+
|
|
203
|
+
1. **Disable React Compiler**: Remove from `vite.config.ts`:
|
|
204
|
+
```typescript
|
|
205
|
+
react() // Remove babel config
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
2. **Downgrade React**: Temporarily downgrade to React 18.3.1 if needed
|
|
209
|
+
3. **Report Issues**: Open an issue with details about the problem
|
|
210
|
+
|
|
211
|
+
## Additional Resources
|
|
212
|
+
|
|
213
|
+
- [React 19 Upgrade Guide](https://react.dev/blog/2024/04/25/react-19-upgrade-guide)
|
|
214
|
+
- [React Compiler Documentation](https://react.dev/learn/react-compiler)
|
|
215
|
+
- [PACE Core Installation Guide](../getting-started/installation-guide.md)
|
|
216
|
+
|
|
217
|
+
## Support
|
|
218
|
+
|
|
219
|
+
If you encounter issues migrating to React 19:
|
|
220
|
+
1. Check this guide first
|
|
221
|
+
2. Review [Troubleshooting](../troubleshooting/README.md)
|
|
222
|
+
3. Open an issue on GitHub with:
|
|
223
|
+
- Package version
|
|
224
|
+
- React version
|
|
225
|
+
- Error messages
|
|
226
|
+
- Migration attempt details
|
|
227
|
+
|
|
@@ -427,7 +427,7 @@ const { data: files } = await supabase
|
|
|
427
427
|
|
|
428
428
|
**Migration:** `20251205211120_migrate_profiles_to_person_scoped.sql` + related migrations
|
|
429
429
|
**Date:** 2025-12-05
|
|
430
|
-
**Documentation:** See [Person-Scoped Profiles Migration Guide](./
|
|
430
|
+
**Documentation:** See [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md)
|
|
431
431
|
|
|
432
432
|
### Quick Summary
|
|
433
433
|
|
|
@@ -501,7 +501,7 @@ const { data } = await supabase
|
|
|
501
501
|
- [ ] Update `pace_contact` queries to use `person_id` instead of `member_id`
|
|
502
502
|
- [ ] Update profile creation logic (no `organisation_id` needed)
|
|
503
503
|
- [ ] Review profile access patterns (person-scoped, not org-scoped)
|
|
504
|
-
- [ ] See [Person-Scoped Profiles Migration Guide](./
|
|
504
|
+
- [ ] See [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md) for detailed checklist
|
|
505
505
|
|
|
506
506
|
### Phase 3: Testing
|
|
507
507
|
|
|
@@ -708,7 +708,7 @@ All migration files are located in:
|
|
|
708
708
|
|
|
709
709
|
### Documentation
|
|
710
710
|
|
|
711
|
-
- [Person-Scoped Profiles Migration Guide](./
|
|
711
|
+
- [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md)
|
|
712
712
|
- [API & RPC Standard](../standards/02-api-and-rpc-standard.md)
|
|
713
713
|
- [Database Schema Requirements](../architecture/database-schema-requirements.md)
|
|
714
714
|
|
|
@@ -973,7 +973,7 @@ VALUES (
|
|
|
973
973
|
- **[API Reference](./api-reference.md)** - Complete API documentation
|
|
974
974
|
- **[Examples](./examples.md)** - More complex usage patterns
|
|
975
975
|
- **[Troubleshooting](./troubleshooting.md)** - Advanced troubleshooting
|
|
976
|
-
- **[Migration Guide](../migration/
|
|
976
|
+
- **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - If migrating from legacy RBAC
|
|
977
977
|
|
|
978
978
|
## 🆘 Still Having Issues?
|
|
979
979
|
|
|
@@ -843,7 +843,7 @@ function AdaptiveComponent({ appId }) {
|
|
|
843
843
|
- [Examples](./examples.md) - More complex examples
|
|
844
844
|
- [Event-Based Apps](./event-based-apps.md) - Guide for event-based applications
|
|
845
845
|
- [Troubleshooting](./troubleshooting.md) - Common issues and solutions
|
|
846
|
-
- [Migration Guide](../migration/
|
|
846
|
+
- [Migration Guide](../migration/V0.4.0_rbac-migration.md) - Migrating from legacy RBAC
|
|
847
847
|
|
|
848
848
|
## ♿ Accessibility
|
|
849
849
|
|
package/docs/rbac/quick-start.md
CHANGED
|
@@ -740,7 +740,7 @@ The system will automatically resolve the organisation ID from the event context
|
|
|
740
740
|
- **[API Reference](./api-reference.md)** - Complete API documentation
|
|
741
741
|
- **[Examples](./examples.md)** - More complex usage patterns
|
|
742
742
|
- **[Troubleshooting](./troubleshooting.md)** - Advanced troubleshooting
|
|
743
|
-
- **[Migration Guide](../migration/
|
|
743
|
+
- **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - If migrating from legacy RBAC
|
|
744
744
|
|
|
745
745
|
## 🆘 Still Having Issues?
|
|
746
746
|
|
package/docs/standards/README.md
CHANGED
|
@@ -33,3 +33,43 @@ This document is the single source of truth for all engineering standards for pa
|
|
|
33
33
|
- Apply Cursor Checklists
|
|
34
34
|
- Prefer pace-core for reusable logic
|
|
35
35
|
- Update docs on API changes
|
|
36
|
+
|
|
37
|
+
## Cursor Rules
|
|
38
|
+
|
|
39
|
+
pace-core provides comprehensive Cursor rules that automatically enforce these standards in consuming apps.
|
|
40
|
+
|
|
41
|
+
### Installation
|
|
42
|
+
|
|
43
|
+
Install cursor rules in your consuming app:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Rule Files
|
|
50
|
+
|
|
51
|
+
The cursor rules cover:
|
|
52
|
+
- **00-pace-core-compliance** - Enforce pace-core usage patterns
|
|
53
|
+
- **01-standards-compliance** - Enforce all standards (this document)
|
|
54
|
+
- **02-project-structure** - Define standard folder structure
|
|
55
|
+
- **03-solid-principles** - Enforce SOLID architecture
|
|
56
|
+
- **04-testing-standards** - Enforce testing consistency
|
|
57
|
+
- **05-bug-reports-and-features** - Templates for issue reporting
|
|
58
|
+
- **06-code-quality** - Enforce code quality standards
|
|
59
|
+
- **07-tech-stack-compliance** - Enforce tech stack versions
|
|
60
|
+
- **08-markup-quality** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
61
|
+
|
|
62
|
+
### Audit Tool
|
|
63
|
+
|
|
64
|
+
Run comprehensive audits to check compliance:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
This generates timestamped markdown reports in `audit/` directory.
|
|
71
|
+
|
|
72
|
+
### Documentation
|
|
73
|
+
|
|
74
|
+
- [Cursor Rules Quick Start](../getting-started/cursor-rules.md)
|
|
75
|
+
- [Cursor Rules README](../../cursor-rules/README.md)
|
|
@@ -506,8 +506,8 @@ export default defineConfig({
|
|
|
506
506
|
|
|
507
507
|
// New dependencies
|
|
508
508
|
"@jmruthers/pace-core": "^2.0.0",
|
|
509
|
-
"react": "^
|
|
510
|
-
"react-dom": "^
|
|
509
|
+
"react": "^19.2.3",
|
|
510
|
+
"react-dom": "^19.2.3",
|
|
511
511
|
"@supabase/supabase-js": "^2.38.0",
|
|
512
512
|
"zod": "^3.22.0"
|
|
513
513
|
},
|
|
@@ -517,8 +517,8 @@ export default defineConfig({
|
|
|
517
517
|
"@types/react-dom": "^17.0.0",
|
|
518
518
|
|
|
519
519
|
// New dev dependencies
|
|
520
|
-
"@types/react": "^
|
|
521
|
-
"@types/react-dom": "^
|
|
520
|
+
"@types/react": "^19.2.7",
|
|
521
|
+
"@types/react-dom": "^19.2.3",
|
|
522
522
|
"@vitejs/plugin-react": "^4.0.0",
|
|
523
523
|
"vite": "^4.4.0",
|
|
524
524
|
"typescript": "^5.0.0"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -71,6 +71,10 @@
|
|
|
71
71
|
"./docs": "./docs/README.md",
|
|
72
72
|
"./package.json": "./package.json",
|
|
73
73
|
"./core-usage-manifest.json": "./core-usage-manifest.json",
|
|
74
|
+
"./cursor-rules": "./cursor-rules",
|
|
75
|
+
"./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
|
|
76
|
+
"./scripts/audit": "./scripts/audit/index.cjs",
|
|
77
|
+
"./scripts/audit-consuming-app": "./scripts/audit-consuming-app.cjs",
|
|
74
78
|
"./source": {
|
|
75
79
|
"import": "./src/index.ts",
|
|
76
80
|
"default": "./src/index.ts"
|
|
@@ -138,7 +142,8 @@
|
|
|
138
142
|
"docs",
|
|
139
143
|
"core-usage-manifest.json",
|
|
140
144
|
"eslint-config-pace-core.cjs",
|
|
141
|
-
"scripts"
|
|
145
|
+
"scripts",
|
|
146
|
+
"cursor-rules"
|
|
142
147
|
],
|
|
143
148
|
"scripts": {
|
|
144
149
|
"_comment_build": "Build package and documentation",
|
|
@@ -207,9 +212,9 @@
|
|
|
207
212
|
"@tanstack/react-table": "^8.0.0",
|
|
208
213
|
"clsx": "^2.0.0",
|
|
209
214
|
"lucide-react": "^0.400.0",
|
|
210
|
-
"react": "^
|
|
211
|
-
"react-dom": "^18.0.0",
|
|
215
|
+
"react": "^19.0.0",
|
|
212
216
|
"react-day-picker": "^9.0.0",
|
|
217
|
+
"react-dom": "^19.0.0",
|
|
213
218
|
"react-hook-form": "^7.0.0",
|
|
214
219
|
"react-router-dom": "^6.0.0",
|
|
215
220
|
"tailwind-merge": "^2.0.0",
|
|
@@ -222,8 +227,8 @@
|
|
|
222
227
|
"@testing-library/react": "^16.1.0",
|
|
223
228
|
"@testing-library/user-event": "^14.5.2",
|
|
224
229
|
"@types/papaparse": "^5.3.16",
|
|
225
|
-
"@types/react": "^
|
|
226
|
-
"@types/react-dom": "^
|
|
230
|
+
"@types/react": "^19.0.0",
|
|
231
|
+
"@types/react-dom": "^19.0.0",
|
|
227
232
|
"@types/react-window": "^1.8.8",
|
|
228
233
|
"@vitejs/plugin-react": "^4.5.1",
|
|
229
234
|
"@vitest/coverage-v8": "^3.2.3",
|
|
@@ -236,6 +241,7 @@
|
|
|
236
241
|
"typedoc": "^0.25.13",
|
|
237
242
|
"typedoc-plugin-markdown": "^3.17.1",
|
|
238
243
|
"typedoc-plugin-merge-modules": "^5.1.0",
|
|
244
|
+
"tsup": "^8.5.0",
|
|
239
245
|
"typescript": "^5.4.0",
|
|
240
246
|
"typescript-eslint": "^8.39.0",
|
|
241
247
|
"vite": "^6.0.3"
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Accessibility Check Module
|
|
5
|
+
* @package @jmruthers/pace-core
|
|
6
|
+
* @module Audit/Checks/Accessibility
|
|
7
|
+
*
|
|
8
|
+
* Checks for:
|
|
9
|
+
* - Missing aria-* attributes
|
|
10
|
+
* - Missing keyboard navigation
|
|
11
|
+
* - Missing focus management
|
|
12
|
+
* - Missing alt text on images
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const { getRelativePath, getLineNumber } = require('../utils.cjs');
|
|
17
|
+
|
|
18
|
+
const accessibilityCheck = {
|
|
19
|
+
name: 'accessibility',
|
|
20
|
+
description: 'Accessibility checks (aria attributes, keyboard navigation, alt text)',
|
|
21
|
+
severity: 'warning',
|
|
22
|
+
|
|
23
|
+
async run(context) {
|
|
24
|
+
const { projectRoot, files } = context;
|
|
25
|
+
const issues = [];
|
|
26
|
+
const warnings = [];
|
|
27
|
+
const suggestions = [];
|
|
28
|
+
|
|
29
|
+
if (!files || files.length === 0) {
|
|
30
|
+
return { issues, warnings, suggestions };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const filePath of files) {
|
|
34
|
+
try {
|
|
35
|
+
// Only check React component files
|
|
36
|
+
if (!filePath.match(/\.(tsx|jsx)$/)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
41
|
+
const relativePath = getRelativePath(filePath, projectRoot);
|
|
42
|
+
const normalizedPath = relativePath.replace(/\\/g, '/');
|
|
43
|
+
|
|
44
|
+
// Skip root-level src directory - in pace-core repository, this is a demo/showcase app
|
|
45
|
+
// Note: We DO check packages/core/ files because accessibility issues (missing alt attributes, missing form labels) are real issues that should be fixed
|
|
46
|
+
const isRootSrc = normalizedPath.startsWith('src/') && !normalizedPath.includes('packages/');
|
|
47
|
+
if (isRootSrc) {
|
|
48
|
+
continue; // Skip demo app files
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Skip scripts directory - utility scripts don't need accessibility validation
|
|
52
|
+
const isScript = normalizedPath.startsWith('scripts/') || normalizedPath.includes('/scripts/');
|
|
53
|
+
if (isScript) {
|
|
54
|
+
continue; // Skip script files
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Skip pace-core library components and examples - these are designed to accept accessibility props
|
|
58
|
+
// Library components accept id, aria-label, etc. via props spread
|
|
59
|
+
// Examples are demonstration code, not production code
|
|
60
|
+
const isPaceCorePackage = normalizedPath.includes('packages/core/') || normalizedPath.startsWith('packages/core/');
|
|
61
|
+
const isExample = normalizedPath.includes('/examples/');
|
|
62
|
+
const isLibraryComponent = isPaceCorePackage && !isExample;
|
|
63
|
+
|
|
64
|
+
// Check for images without alt text
|
|
65
|
+
// Skip library components - they accept alt as a prop
|
|
66
|
+
if (!isLibraryComponent) {
|
|
67
|
+
const imgPattern = /<img[^>]*>/g;
|
|
68
|
+
let imgMatch;
|
|
69
|
+
while ((imgMatch = imgPattern.exec(content)) !== null) {
|
|
70
|
+
const imgTag = imgMatch[0];
|
|
71
|
+
// Check for alt attribute, including React props (alt=, alt =, alt={)
|
|
72
|
+
const hasAlt = imgTag.includes('alt=') || imgTag.includes('alt =') || imgTag.includes('alt={');
|
|
73
|
+
if (!hasAlt) {
|
|
74
|
+
warnings.push({
|
|
75
|
+
type: 'missing-alt-text',
|
|
76
|
+
file: relativePath,
|
|
77
|
+
line: getLineNumber(content, imgMatch.index),
|
|
78
|
+
message: 'Image element missing alt attribute',
|
|
79
|
+
recommendation: 'Add alt text to all images for accessibility: <img alt="description" ... />'
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Check for buttons/clickable elements without aria-label or accessible text
|
|
86
|
+
const buttonPattern = /<(button|a|div)\s+[^>]*(onClick|role=["']button["'])[^>]*>/g;
|
|
87
|
+
let buttonMatch;
|
|
88
|
+
while ((buttonMatch = buttonPattern.exec(content)) !== null) {
|
|
89
|
+
const buttonTag = buttonMatch[0];
|
|
90
|
+
const hasAriaLabel = buttonTag.includes('aria-label=') || buttonTag.includes('ariaLabel=');
|
|
91
|
+
const hasAccessibleText = buttonTag.includes('>') && content.substring(buttonMatch.index).match(/<[^>]*>([^<]+)</);
|
|
92
|
+
|
|
93
|
+
if (!hasAriaLabel && !hasAccessibleText) {
|
|
94
|
+
warnings.push({
|
|
95
|
+
type: 'missing-aria-label',
|
|
96
|
+
file: relativePath,
|
|
97
|
+
line: getLineNumber(content, buttonMatch.index),
|
|
98
|
+
message: 'Interactive element missing accessible label',
|
|
99
|
+
recommendation: 'Add aria-label or ensure element contains accessible text content'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check for form inputs without labels
|
|
105
|
+
// Skip library components - they accept id, aria-label, etc. via props spread
|
|
106
|
+
// Skip examples - they're demonstration code
|
|
107
|
+
if (!isLibraryComponent && !isExample) {
|
|
108
|
+
const inputPattern = /<input[^>]*>/g;
|
|
109
|
+
let inputMatch;
|
|
110
|
+
while ((inputMatch = inputPattern.exec(content)) !== null) {
|
|
111
|
+
// Get the full input tag including multi-line attributes
|
|
112
|
+
const inputStart = inputMatch.index;
|
|
113
|
+
const afterInput = content.substring(inputStart, Math.min(content.length, inputStart + 500));
|
|
114
|
+
const inputTagEnd = afterInput.indexOf('>');
|
|
115
|
+
const fullInputTag = inputTagEnd !== -1 ? afterInput.substring(0, inputTagEnd + 1) : inputMatch[0];
|
|
116
|
+
|
|
117
|
+
// Check for id (including React props)
|
|
118
|
+
const hasId = /id=["']([^"']+)["']|id=\{/.test(fullInputTag);
|
|
119
|
+
// Check for aria-label (including React props)
|
|
120
|
+
const hasAriaLabel = /aria-label=["']|ariaLabel=|aria-label=\{/.test(fullInputTag);
|
|
121
|
+
|
|
122
|
+
if (hasId) {
|
|
123
|
+
const idMatch = fullInputTag.match(/id=["']([^"']+)["']/);
|
|
124
|
+
if (idMatch) {
|
|
125
|
+
const id = idMatch[1];
|
|
126
|
+
// Check if there's a corresponding label
|
|
127
|
+
const beforeInput = content.substring(Math.max(0, inputMatch.index - 200), inputMatch.index);
|
|
128
|
+
const hasLabel = new RegExp(`<label[^>]*for=["']${id}["']`, 'i').test(beforeInput);
|
|
129
|
+
|
|
130
|
+
if (!hasLabel && !hasAriaLabel) {
|
|
131
|
+
warnings.push({
|
|
132
|
+
type: 'missing-input-label',
|
|
133
|
+
file: relativePath,
|
|
134
|
+
line: getLineNumber(content, inputMatch.index),
|
|
135
|
+
message: 'Form input missing associated label',
|
|
136
|
+
recommendation: 'Add a <label> element with for attribute matching input id, or use aria-label'
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} else if (!hasAriaLabel) {
|
|
141
|
+
warnings.push({
|
|
142
|
+
type: 'missing-input-label',
|
|
143
|
+
file: relativePath,
|
|
144
|
+
line: getLineNumber(content, inputMatch.index),
|
|
145
|
+
message: 'Form input missing id and label',
|
|
146
|
+
recommendation: 'Add id to input and corresponding label, or use aria-label'
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check for missing focus management in modals/dialogs
|
|
153
|
+
const dialogPattern = /<Dialog|<dialog/gi;
|
|
154
|
+
if (dialogPattern.test(content)) {
|
|
155
|
+
// Skip Dialog.tsx itself - it IS the Dialog component
|
|
156
|
+
if (normalizedPath.includes('/Dialog/Dialog.tsx') || normalizedPath.includes('/Dialog/Dialog.jsx')) {
|
|
157
|
+
continue; // Skip the Dialog component file itself
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Check if Dialog from pace-core is used (which handles focus automatically)
|
|
161
|
+
// Check for both published package import and relative imports (within pace-core repo)
|
|
162
|
+
const usesPaceCoreDialog = content.includes('from \'@jmruthers/pace-core\'') ||
|
|
163
|
+
content.includes('from "@jmruthers/pace-core"') ||
|
|
164
|
+
content.includes('from \'../Dialog') ||
|
|
165
|
+
content.includes('from "../Dialog') ||
|
|
166
|
+
content.includes('from \'../../Dialog') ||
|
|
167
|
+
content.includes('from "../../Dialog') ||
|
|
168
|
+
content.includes('from \'../../../Dialog') ||
|
|
169
|
+
content.includes('from "../../../Dialog') ||
|
|
170
|
+
content.includes('from \'./Dialog') ||
|
|
171
|
+
content.includes('from "./Dialog');
|
|
172
|
+
|
|
173
|
+
if (!usesPaceCoreDialog) {
|
|
174
|
+
suggestions.push({
|
|
175
|
+
type: 'dialog-focus-management',
|
|
176
|
+
file: relativePath,
|
|
177
|
+
message: 'Custom dialog implementation detected',
|
|
178
|
+
recommendation: 'Use Dialog component from @jmruthers/pace-core which handles focus management automatically'
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check for color contrast issues (heuristic - check for color props without sufficient contrast)
|
|
184
|
+
const colorPattern = /(?:color|bg-|text-)=["']([^"']+)["']/g;
|
|
185
|
+
// This is a simplified check - full implementation would need color contrast calculation
|
|
186
|
+
// For now, just suggest using pace-core components which handle contrast
|
|
187
|
+
|
|
188
|
+
} catch (error) {
|
|
189
|
+
// Skip files with errors
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return { issues, warnings, suggestions };
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
module.exports = accessibilityCheck;
|