@jmruthers/pace-core 0.6.5 → 0.6.7
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 +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -17,13 +17,13 @@ const TestComponent = ({ options = {} }: { options?: any }) => {
|
|
|
17
17
|
const focusTrap = useFocusTrap(options);
|
|
18
18
|
|
|
19
19
|
return (
|
|
20
|
-
<
|
|
20
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
21
21
|
<button data-testid="button-1">Button 1</button>
|
|
22
22
|
<input data-testid="input-1" type="text" />
|
|
23
23
|
<button data-testid="button-2">Button 2</button>
|
|
24
24
|
<button data-testid="button-3" disabled>Disabled Button</button>
|
|
25
|
-
<
|
|
26
|
-
</
|
|
25
|
+
<p data-testid="non-focusable">Non-focusable</p>
|
|
26
|
+
</section>
|
|
27
27
|
);
|
|
28
28
|
};
|
|
29
29
|
|
|
@@ -39,26 +39,26 @@ describe('useFocusTrap', () => {
|
|
|
39
39
|
|
|
40
40
|
it('should render with container element', () => {
|
|
41
41
|
renderWithProviders(<TestComponent />);
|
|
42
|
-
expect(screen.getByTestId('container')).
|
|
42
|
+
expect(screen.getByTestId('container')).toBeDefined();
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
it('should render with focusable elements', () => {
|
|
46
46
|
renderWithProviders(<TestComponent />);
|
|
47
|
-
expect(screen.getByTestId('button-1')).
|
|
48
|
-
expect(screen.getByTestId('input-1')).
|
|
49
|
-
expect(screen.getByTestId('button-2')).
|
|
47
|
+
expect(screen.getByTestId('button-1')).toBeDefined();
|
|
48
|
+
expect(screen.getByTestId('input-1')).toBeDefined();
|
|
49
|
+
expect(screen.getByTestId('button-2')).toBeDefined();
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
it('should handle disabled elements', () => {
|
|
53
53
|
renderWithProviders(<TestComponent />);
|
|
54
54
|
const disabledButton = screen.getByTestId('button-3');
|
|
55
|
-
expect(disabledButton).
|
|
55
|
+
expect(disabledButton).toBeDefined();
|
|
56
56
|
expect(disabledButton).toBeDisabled();
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
it('should handle non-focusable elements', () => {
|
|
60
60
|
renderWithProviders(<TestComponent />);
|
|
61
|
-
expect(screen.getByTestId('non-focusable')).
|
|
61
|
+
expect(screen.getByTestId('non-focusable')).toBeDefined();
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
|
|
@@ -72,7 +72,7 @@ describe('useFocusTrap', () => {
|
|
|
72
72
|
expect(typeof focusTrap.focusLast).toBe('function');
|
|
73
73
|
expect(typeof focusTrap.getFocusableElements).toBe('function');
|
|
74
74
|
|
|
75
|
-
return <
|
|
75
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
renderWithProviders(<TestHook />);
|
|
@@ -85,7 +85,7 @@ describe('useFocusTrap', () => {
|
|
|
85
85
|
// Should work with default options
|
|
86
86
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
87
87
|
|
|
88
|
-
return <
|
|
88
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
89
89
|
};
|
|
90
90
|
|
|
91
91
|
renderWithProviders(<TestHook />);
|
|
@@ -103,7 +103,7 @@ describe('useFocusTrap', () => {
|
|
|
103
103
|
|
|
104
104
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
105
105
|
|
|
106
|
-
return <
|
|
106
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
109
|
renderWithProviders(<TestHook />);
|
|
@@ -120,7 +120,7 @@ describe('useFocusTrap', () => {
|
|
|
120
120
|
expect(() => focusTrap.focusLast()).not.toThrow();
|
|
121
121
|
expect(() => focusTrap.getFocusableElements()).not.toThrow();
|
|
122
122
|
|
|
123
|
-
return <
|
|
123
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
124
124
|
};
|
|
125
125
|
|
|
126
126
|
renderWithProviders(<TestHook />);
|
|
@@ -135,7 +135,7 @@ describe('useFocusTrap', () => {
|
|
|
135
135
|
expect(() => focusTrap.focusLast()).not.toThrow();
|
|
136
136
|
expect(() => focusTrap.getFocusableElements()).not.toThrow();
|
|
137
137
|
|
|
138
|
-
return <
|
|
138
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
139
139
|
};
|
|
140
140
|
|
|
141
141
|
renderWithProviders(<TestHook />);
|
|
@@ -147,7 +147,7 @@ describe('useFocusTrap', () => {
|
|
|
147
147
|
const TestHook = () => {
|
|
148
148
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
149
149
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
150
|
-
return <
|
|
150
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
renderWithProviders(<TestHook />);
|
|
@@ -157,7 +157,7 @@ describe('useFocusTrap', () => {
|
|
|
157
157
|
const TestHook = () => {
|
|
158
158
|
const focusTrap = useFocusTrap({ autoFocus: true });
|
|
159
159
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
160
|
-
return <
|
|
160
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
161
161
|
};
|
|
162
162
|
|
|
163
163
|
renderWithProviders(<TestHook />);
|
|
@@ -167,7 +167,7 @@ describe('useFocusTrap', () => {
|
|
|
167
167
|
const TestHook = () => {
|
|
168
168
|
const focusTrap = useFocusTrap({ restoreFocus: true });
|
|
169
169
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
170
|
-
return <
|
|
170
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
171
171
|
};
|
|
172
172
|
|
|
173
173
|
renderWithProviders(<TestHook />);
|
|
@@ -178,7 +178,7 @@ describe('useFocusTrap', () => {
|
|
|
178
178
|
const TestHook = () => {
|
|
179
179
|
const focusTrap = useFocusTrap({ onEscape });
|
|
180
180
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
181
|
-
return <
|
|
181
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
182
182
|
};
|
|
183
183
|
|
|
184
184
|
renderWithProviders(<TestHook />);
|
|
@@ -190,7 +190,7 @@ describe('useFocusTrap', () => {
|
|
|
190
190
|
focusableSelector: 'button:not([disabled])'
|
|
191
191
|
});
|
|
192
192
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
193
|
-
return <
|
|
193
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
194
194
|
};
|
|
195
195
|
|
|
196
196
|
renderWithProviders(<TestHook />);
|
|
@@ -207,16 +207,16 @@ describe('useFocusTrap', () => {
|
|
|
207
207
|
expect(focusTrap2.containerRef.current).toBeDefined();
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<
|
|
211
|
-
<
|
|
212
|
-
<
|
|
213
|
-
</
|
|
210
|
+
<section>
|
|
211
|
+
<section ref={focusTrap1.containerRef as any} data-testid="container-1" />
|
|
212
|
+
<section ref={focusTrap2.containerRef as any} data-testid="container-2" />
|
|
213
|
+
</section>
|
|
214
214
|
);
|
|
215
215
|
};
|
|
216
216
|
|
|
217
217
|
renderWithProviders(<TestMultiple />);
|
|
218
|
-
expect(screen.getByTestId('container-1')).
|
|
219
|
-
expect(screen.getByTestId('container-2')).
|
|
218
|
+
expect(screen.getByTestId('container-1')).toBeDefined();
|
|
219
|
+
expect(screen.getByTestId('container-2')).toBeDefined();
|
|
220
220
|
});
|
|
221
221
|
|
|
222
222
|
it('should handle component unmounting', () => {
|
|
@@ -238,11 +238,11 @@ describe('useFocusTrap', () => {
|
|
|
238
238
|
|
|
239
239
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
240
240
|
|
|
241
|
-
return <
|
|
241
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
242
242
|
};
|
|
243
243
|
|
|
244
244
|
renderWithProviders(<TestAllOptions />);
|
|
245
|
-
expect(screen.getByTestId('container')).
|
|
245
|
+
expect(screen.getByTestId('container')).toBeDefined();
|
|
246
246
|
});
|
|
247
247
|
});
|
|
248
248
|
|
|
@@ -256,7 +256,7 @@ describe('useFocusTrap', () => {
|
|
|
256
256
|
expect(() => focusTrap.focusLast()).not.toThrow();
|
|
257
257
|
expect(() => focusTrap.getFocusableElements()).not.toThrow();
|
|
258
258
|
|
|
259
|
-
return <
|
|
259
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
260
260
|
};
|
|
261
261
|
|
|
262
262
|
renderWithProviders(<TestNullRef />);
|
|
@@ -268,7 +268,7 @@ describe('useFocusTrap', () => {
|
|
|
268
268
|
|
|
269
269
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
270
270
|
|
|
271
|
-
return <
|
|
271
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
272
272
|
};
|
|
273
273
|
|
|
274
274
|
renderWithProviders(<TestUndefinedOptions />);
|
|
@@ -280,7 +280,7 @@ describe('useFocusTrap', () => {
|
|
|
280
280
|
|
|
281
281
|
expect(focusTrap.containerRef.current).toBeDefined();
|
|
282
282
|
|
|
283
|
-
return <
|
|
283
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
284
284
|
};
|
|
285
285
|
|
|
286
286
|
renderWithProviders(<TestPartialOptions />);
|
|
@@ -301,14 +301,14 @@ describe('useFocusTrap', () => {
|
|
|
301
301
|
}, []);
|
|
302
302
|
|
|
303
303
|
return (
|
|
304
|
-
<
|
|
304
|
+
<section>
|
|
305
305
|
<button ref={restoreButton} data-testid="restore-button">Restore Target</button>
|
|
306
|
-
<
|
|
306
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
307
307
|
<button data-testid="button-1">Button 1</button>
|
|
308
308
|
<button data-testid="button-2">Button 2</button>
|
|
309
|
-
</
|
|
309
|
+
</section>
|
|
310
310
|
<button onClick={() => setIsActive(false)} data-testid="deactivate">Deactivate</button>
|
|
311
|
-
</
|
|
311
|
+
</section>
|
|
312
312
|
);
|
|
313
313
|
};
|
|
314
314
|
|
|
@@ -338,13 +338,13 @@ describe('useFocusTrap', () => {
|
|
|
338
338
|
}, []);
|
|
339
339
|
|
|
340
340
|
return (
|
|
341
|
-
<
|
|
341
|
+
<section>
|
|
342
342
|
<button ref={restoreButton} data-testid="restore-button">Restore Target</button>
|
|
343
|
-
<
|
|
343
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
344
344
|
<button data-testid="button-1">Button 1</button>
|
|
345
|
-
</
|
|
345
|
+
</section>
|
|
346
346
|
<button onClick={() => setIsActive(false)} data-testid="deactivate">Deactivate</button>
|
|
347
|
-
</
|
|
347
|
+
</section>
|
|
348
348
|
);
|
|
349
349
|
};
|
|
350
350
|
|
|
@@ -361,10 +361,10 @@ describe('useFocusTrap', () => {
|
|
|
361
361
|
const focusTrap = useFocusTrap({ isActive: true, autoFocus: true });
|
|
362
362
|
|
|
363
363
|
return (
|
|
364
|
-
<
|
|
364
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
365
365
|
<button data-testid="button-1">Button 1</button>
|
|
366
366
|
<button data-testid="button-2">Button 2</button>
|
|
367
|
-
</
|
|
367
|
+
</section>
|
|
368
368
|
);
|
|
369
369
|
};
|
|
370
370
|
|
|
@@ -375,7 +375,7 @@ describe('useFocusTrap', () => {
|
|
|
375
375
|
|
|
376
376
|
const button1 = screen.getByTestId('button-1');
|
|
377
377
|
// The first button should be focused (though timing may vary)
|
|
378
|
-
expect(button1).
|
|
378
|
+
expect(button1).toBeDefined();
|
|
379
379
|
});
|
|
380
380
|
|
|
381
381
|
it('should not auto-focus when autoFocus=false', () => {
|
|
@@ -383,9 +383,9 @@ describe('useFocusTrap', () => {
|
|
|
383
383
|
const focusTrap = useFocusTrap({ isActive: true, autoFocus: false });
|
|
384
384
|
|
|
385
385
|
return (
|
|
386
|
-
<
|
|
386
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
387
387
|
<button data-testid="button-1">Button 1</button>
|
|
388
|
-
</
|
|
388
|
+
</section>
|
|
389
389
|
);
|
|
390
390
|
};
|
|
391
391
|
|
|
@@ -393,7 +393,7 @@ describe('useFocusTrap', () => {
|
|
|
393
393
|
|
|
394
394
|
const button1 = screen.getByTestId('button-1');
|
|
395
395
|
// When autoFocus is false, focus should not automatically move
|
|
396
|
-
expect(button1).
|
|
396
|
+
expect(button1).toBeDefined();
|
|
397
397
|
});
|
|
398
398
|
|
|
399
399
|
it('should not auto-focus when isActive=false', () => {
|
|
@@ -401,16 +401,16 @@ describe('useFocusTrap', () => {
|
|
|
401
401
|
const focusTrap = useFocusTrap({ isActive: false, autoFocus: true });
|
|
402
402
|
|
|
403
403
|
return (
|
|
404
|
-
<
|
|
404
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
405
405
|
<button data-testid="button-1">Button 1</button>
|
|
406
|
-
</
|
|
406
|
+
</section>
|
|
407
407
|
);
|
|
408
408
|
};
|
|
409
409
|
|
|
410
410
|
renderWithProviders(<TestInactive />);
|
|
411
411
|
|
|
412
412
|
// When inactive, auto-focus should not occur
|
|
413
|
-
expect(screen.getByTestId('button-1')).
|
|
413
|
+
expect(screen.getByTestId('button-1')).toBeDefined();
|
|
414
414
|
});
|
|
415
415
|
});
|
|
416
416
|
|
|
@@ -422,11 +422,11 @@ describe('useFocusTrap', () => {
|
|
|
422
422
|
});
|
|
423
423
|
|
|
424
424
|
return (
|
|
425
|
-
<
|
|
425
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
426
426
|
<button className="custom-focusable" data-testid="custom-1">Custom 1</button>
|
|
427
427
|
<button data-testid="regular-1">Regular 1</button>
|
|
428
428
|
<button className="custom-focusable" data-testid="custom-2">Custom 2</button>
|
|
429
|
-
</
|
|
429
|
+
</section>
|
|
430
430
|
);
|
|
431
431
|
};
|
|
432
432
|
|
|
@@ -443,11 +443,11 @@ describe('useFocusTrap', () => {
|
|
|
443
443
|
});
|
|
444
444
|
|
|
445
445
|
return (
|
|
446
|
-
<
|
|
446
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
447
447
|
<input type="text" data-testid="text-input" />
|
|
448
448
|
<input type="checkbox" data-testid="checkbox-input" />
|
|
449
449
|
<button data-testid="button">Button</button>
|
|
450
|
-
</
|
|
450
|
+
</section>
|
|
451
451
|
);
|
|
452
452
|
};
|
|
453
453
|
|
|
@@ -464,11 +464,11 @@ describe('useFocusTrap', () => {
|
|
|
464
464
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
465
465
|
|
|
466
466
|
return (
|
|
467
|
-
<
|
|
467
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
468
468
|
<button data-testid="button-1">Button 1</button>
|
|
469
469
|
<button data-testid="button-2">Button 2</button>
|
|
470
470
|
<button data-testid="button-3">Button 3</button>
|
|
471
|
-
</
|
|
471
|
+
</section>
|
|
472
472
|
);
|
|
473
473
|
};
|
|
474
474
|
|
|
@@ -486,7 +486,7 @@ describe('useFocusTrap', () => {
|
|
|
486
486
|
button1.dispatchEvent(tabEvent);
|
|
487
487
|
|
|
488
488
|
// Focus should move to button 2
|
|
489
|
-
expect(button1).
|
|
489
|
+
expect(button1).toBeDefined();
|
|
490
490
|
});
|
|
491
491
|
|
|
492
492
|
it('should handle Shift+Tab when focus is on last element', () => {
|
|
@@ -494,11 +494,11 @@ describe('useFocusTrap', () => {
|
|
|
494
494
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
495
495
|
|
|
496
496
|
return (
|
|
497
|
-
<
|
|
497
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
498
498
|
<button data-testid="button-1">Button 1</button>
|
|
499
499
|
<button data-testid="button-2">Button 2</button>
|
|
500
500
|
<button data-testid="button-3">Button 3</button>
|
|
501
|
-
</
|
|
501
|
+
</section>
|
|
502
502
|
);
|
|
503
503
|
};
|
|
504
504
|
|
|
@@ -517,7 +517,7 @@ describe('useFocusTrap', () => {
|
|
|
517
517
|
button3.dispatchEvent(shiftTabEvent);
|
|
518
518
|
|
|
519
519
|
// Focus should wrap to first element
|
|
520
|
-
expect(button3).
|
|
520
|
+
expect(button3).toBeDefined();
|
|
521
521
|
});
|
|
522
522
|
|
|
523
523
|
it('should handle Escape key with onEscape callback', () => {
|
|
@@ -526,9 +526,9 @@ describe('useFocusTrap', () => {
|
|
|
526
526
|
const focusTrap = useFocusTrap({ isActive: true, onEscape });
|
|
527
527
|
|
|
528
528
|
return (
|
|
529
|
-
<
|
|
529
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
530
530
|
<button data-testid="button-1">Button 1</button>
|
|
531
|
-
</
|
|
531
|
+
</section>
|
|
532
532
|
);
|
|
533
533
|
};
|
|
534
534
|
|
|
@@ -549,9 +549,9 @@ describe('useFocusTrap', () => {
|
|
|
549
549
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
550
550
|
|
|
551
551
|
return (
|
|
552
|
-
<
|
|
552
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
553
553
|
<button data-testid="button-1">Button 1</button>
|
|
554
|
-
</
|
|
554
|
+
</section>
|
|
555
555
|
);
|
|
556
556
|
};
|
|
557
557
|
|
|
@@ -572,9 +572,9 @@ describe('useFocusTrap', () => {
|
|
|
572
572
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
573
573
|
|
|
574
574
|
return (
|
|
575
|
-
<
|
|
576
|
-
<
|
|
577
|
-
</
|
|
575
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
576
|
+
<p data-testid="non-focusable">No focusable elements</p>
|
|
577
|
+
</section>
|
|
578
578
|
);
|
|
579
579
|
};
|
|
580
580
|
|
|
@@ -600,13 +600,13 @@ describe('useFocusTrap', () => {
|
|
|
600
600
|
expect(focusTrap.containerRef).toBeDefined();
|
|
601
601
|
expect(focusTrap.containerRef.current).toBeNull(); // Before render
|
|
602
602
|
|
|
603
|
-
return <
|
|
603
|
+
return <section ref={focusTrap.containerRef as any} data-testid="container" />;
|
|
604
604
|
};
|
|
605
605
|
|
|
606
606
|
renderWithProviders(<TestRefAttachment />);
|
|
607
607
|
|
|
608
608
|
const container = screen.getByTestId('container');
|
|
609
|
-
expect(container).
|
|
609
|
+
expect(container).toBeDefined();
|
|
610
610
|
});
|
|
611
611
|
|
|
612
612
|
it('should handle ref when container is conditionally rendered', () => {
|
|
@@ -615,20 +615,20 @@ describe('useFocusTrap', () => {
|
|
|
615
615
|
const focusTrap = useFocusTrap();
|
|
616
616
|
|
|
617
617
|
return (
|
|
618
|
-
<
|
|
618
|
+
<section>
|
|
619
619
|
{show && (
|
|
620
|
-
<
|
|
620
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
621
621
|
<button>Button</button>
|
|
622
|
-
</
|
|
622
|
+
</section>
|
|
623
623
|
)}
|
|
624
624
|
<button onClick={() => setShow(!show)} data-testid="toggle">Toggle</button>
|
|
625
|
-
</
|
|
625
|
+
</section>
|
|
626
626
|
);
|
|
627
627
|
};
|
|
628
628
|
|
|
629
629
|
const { getByTestId } = renderWithProviders(<TestConditionalRef />);
|
|
630
630
|
|
|
631
|
-
expect(screen.getByTestId('container')).
|
|
631
|
+
expect(screen.getByTestId('container')).toBeDefined();
|
|
632
632
|
|
|
633
633
|
act(() => {
|
|
634
634
|
getByTestId('toggle').click();
|
|
@@ -645,7 +645,7 @@ describe('useFocusTrap', () => {
|
|
|
645
645
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
646
646
|
|
|
647
647
|
return (
|
|
648
|
-
<
|
|
648
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
649
649
|
{elements.map((label, index) => (
|
|
650
650
|
<button key={index} data-testid={`button-${index}`}>{label}</button>
|
|
651
651
|
))}
|
|
@@ -655,19 +655,19 @@ describe('useFocusTrap', () => {
|
|
|
655
655
|
>
|
|
656
656
|
Add
|
|
657
657
|
</button>
|
|
658
|
-
</
|
|
658
|
+
</section>
|
|
659
659
|
);
|
|
660
660
|
};
|
|
661
661
|
|
|
662
662
|
const { getByTestId } = renderWithProviders(<TestDynamicElements />);
|
|
663
663
|
|
|
664
|
-
expect(screen.getByTestId('button-0')).
|
|
664
|
+
expect(screen.getByTestId('button-0')).toBeDefined();
|
|
665
665
|
|
|
666
666
|
act(() => {
|
|
667
667
|
getByTestId('add-button').click();
|
|
668
668
|
});
|
|
669
669
|
|
|
670
|
-
expect(screen.getByTestId('button-1')).
|
|
670
|
+
expect(screen.getByTestId('button-1')).toBeDefined();
|
|
671
671
|
|
|
672
672
|
// getFocusableElements should return the new elements
|
|
673
673
|
const container = screen.getByTestId('container');
|
|
@@ -681,9 +681,9 @@ describe('useFocusTrap', () => {
|
|
|
681
681
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
682
682
|
|
|
683
683
|
return (
|
|
684
|
-
<
|
|
684
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
685
685
|
{elements.map((label, index) => (
|
|
686
|
-
<
|
|
686
|
+
<section key={`${label}-${index}`} style={{ display: 'flex', gap: '8px' }}>
|
|
687
687
|
<button data-testid={`button-${label}`}>
|
|
688
688
|
{label}
|
|
689
689
|
</button>
|
|
@@ -693,17 +693,17 @@ describe('useFocusTrap', () => {
|
|
|
693
693
|
>
|
|
694
694
|
Remove
|
|
695
695
|
</button>
|
|
696
|
-
</
|
|
696
|
+
</section>
|
|
697
697
|
))}
|
|
698
|
-
</
|
|
698
|
+
</section>
|
|
699
699
|
);
|
|
700
700
|
};
|
|
701
701
|
|
|
702
702
|
const { getByTestId } = renderWithProviders(<TestRemoveElements />);
|
|
703
703
|
|
|
704
|
-
expect(screen.getByTestId('button-Button 1')).
|
|
705
|
-
expect(screen.getByTestId('button-Button 2')).
|
|
706
|
-
expect(screen.getByTestId('button-Button 3')).
|
|
704
|
+
expect(screen.getByTestId('button-Button 1')).toBeDefined();
|
|
705
|
+
expect(screen.getByTestId('button-Button 2')).toBeDefined();
|
|
706
|
+
expect(screen.getByTestId('button-Button 3')).toBeDefined();
|
|
707
707
|
|
|
708
708
|
act(() => {
|
|
709
709
|
getByTestId('remove-1').click();
|
|
@@ -715,9 +715,9 @@ describe('useFocusTrap', () => {
|
|
|
715
715
|
});
|
|
716
716
|
|
|
717
717
|
// Verify the removed button is gone and others remain
|
|
718
|
-
expect(screen.getByTestId('button-Button 1')).
|
|
719
|
-
expect(screen.getByTestId('button-Button 3')).
|
|
720
|
-
|
|
718
|
+
expect(screen.getByTestId('button-Button 1')).toBeDefined();
|
|
719
|
+
expect(screen.getByTestId('button-Button 3')).toBeDefined();
|
|
720
|
+
expect(screen.queryByTestId('button-Button 2')).not.toBeInTheDocument();
|
|
721
721
|
});
|
|
722
722
|
|
|
723
723
|
it('should handle elements becoming disabled/enabled', () => {
|
|
@@ -726,14 +726,14 @@ describe('useFocusTrap', () => {
|
|
|
726
726
|
const focusTrap = useFocusTrap({ isActive: true });
|
|
727
727
|
|
|
728
728
|
return (
|
|
729
|
-
<
|
|
729
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
730
730
|
<button disabled={disabled} data-testid="toggleable-button">
|
|
731
731
|
Toggleable Button
|
|
732
732
|
</button>
|
|
733
733
|
<button onClick={() => setDisabled(!disabled)} data-testid="toggle">
|
|
734
734
|
Toggle Disabled
|
|
735
735
|
</button>
|
|
736
|
-
</
|
|
736
|
+
</section>
|
|
737
737
|
);
|
|
738
738
|
};
|
|
739
739
|
|
|
@@ -762,10 +762,10 @@ describe('useFocusTrap', () => {
|
|
|
762
762
|
}, []);
|
|
763
763
|
|
|
764
764
|
return (
|
|
765
|
-
<
|
|
765
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
766
766
|
<button data-testid="button-1">Button 1</button>
|
|
767
767
|
<button data-testid="button-2">Button 2</button>
|
|
768
|
-
</
|
|
768
|
+
</section>
|
|
769
769
|
);
|
|
770
770
|
};
|
|
771
771
|
|
|
@@ -773,7 +773,7 @@ describe('useFocusTrap', () => {
|
|
|
773
773
|
|
|
774
774
|
const button1 = screen.getByTestId('button-1');
|
|
775
775
|
// focusFirst should focus the first element
|
|
776
|
-
expect(button1).
|
|
776
|
+
expect(button1).toBeDefined();
|
|
777
777
|
});
|
|
778
778
|
|
|
779
779
|
it('should focus last element when focusLast is called', () => {
|
|
@@ -785,10 +785,10 @@ describe('useFocusTrap', () => {
|
|
|
785
785
|
}, []);
|
|
786
786
|
|
|
787
787
|
return (
|
|
788
|
-
<
|
|
788
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
789
789
|
<button data-testid="button-1">Button 1</button>
|
|
790
790
|
<button data-testid="button-2">Button 2</button>
|
|
791
|
-
</
|
|
791
|
+
</section>
|
|
792
792
|
);
|
|
793
793
|
};
|
|
794
794
|
|
|
@@ -796,7 +796,7 @@ describe('useFocusTrap', () => {
|
|
|
796
796
|
|
|
797
797
|
const button2 = screen.getByTestId('button-2');
|
|
798
798
|
// focusLast should focus the last element
|
|
799
|
-
expect(button2).
|
|
799
|
+
expect(button2).toBeDefined();
|
|
800
800
|
});
|
|
801
801
|
|
|
802
802
|
it('getFocusableElements should return correct elements', () => {
|
|
@@ -810,19 +810,19 @@ describe('useFocusTrap', () => {
|
|
|
810
810
|
}, []);
|
|
811
811
|
|
|
812
812
|
return (
|
|
813
|
-
<
|
|
813
|
+
<section ref={focusTrap.containerRef as any} data-testid="container">
|
|
814
814
|
<button data-testid="button-1">Button 1</button>
|
|
815
815
|
<input data-testid="input-1" type="text" />
|
|
816
816
|
<button data-testid="button-2" disabled>Disabled</button>
|
|
817
|
-
<
|
|
818
|
-
</
|
|
817
|
+
<p data-testid="non-focusable">Non-focusable</p>
|
|
818
|
+
</section>
|
|
819
819
|
);
|
|
820
820
|
};
|
|
821
821
|
|
|
822
822
|
renderWithProviders(<TestGetFocusable />);
|
|
823
823
|
|
|
824
824
|
// getFocusableElements should return 2 (button-1 and input-1, excluding disabled button and div)
|
|
825
|
-
expect(screen.getByTestId('container')).
|
|
825
|
+
expect(screen.getByTestId('container')).toBeDefined();
|
|
826
826
|
});
|
|
827
827
|
});
|
|
828
828
|
});
|