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