@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
|
@@ -71,13 +71,15 @@ import { Settings } from 'lucide-react'; // for icon example
|
|
|
71
71
|
|
|
72
72
|
### Accessibility
|
|
73
73
|
|
|
74
|
-
- **Keyboard Navigation**: Fully keyboard accessible.
|
|
74
|
+
- **Keyboard Navigation**: Fully keyboard accessible via native HTML `<button>` element behavior. The `Enter` and `Space` keys automatically trigger button activation without requiring custom keyboard handlers. This is standard browser behavior for native button elements.
|
|
75
75
|
- **ARIA Attributes**: Supports all standard ARIA attributes via `React.ButtonHTMLAttributes`.
|
|
76
76
|
- **Disabled State**: When disabled, button is not focusable and has `aria-disabled="true"`.
|
|
77
77
|
- **Icon Buttons**: Always provide `aria-label` for icon-only buttons for screen readers.
|
|
78
78
|
- **Focus Management**: Visible focus indicators via `focus-visible` styles.
|
|
79
79
|
- **Screen Readers**: Button text is automatically announced. Use descriptive labels.
|
|
80
80
|
|
|
81
|
+
**Note**: The Button component renders a native HTML `<button>` element, which provides built-in keyboard accessibility. No additional keyboard event handlers are required - the browser handles `Enter` and `Space` key activation automatically.
|
|
82
|
+
|
|
81
83
|
### Edge Cases
|
|
82
84
|
|
|
83
85
|
- **asChild Prop**: When using `asChild`, the button renders as the child element (e.g., `<Link>`). The `type` attribute is not applied in this case.
|
|
@@ -282,8 +284,6 @@ interface HierarchicalConfig {
|
|
|
282
284
|
defaultExpanded?: boolean | string[];
|
|
283
285
|
/** Callback when expansion state changes */
|
|
284
286
|
onExpandedChange?: (expandedIds: string[]) => void;
|
|
285
|
-
/** Custom expand/collapse button component */
|
|
286
|
-
expandButton?: React.ComponentType<ExpandButtonProps>;
|
|
287
287
|
/** Indentation for child rows in pixels */
|
|
288
288
|
indentSize?: number;
|
|
289
289
|
/** CSS classes for parent rows */
|
|
@@ -1160,10 +1160,10 @@ function MyComponent() {
|
|
|
1160
1160
|
};
|
|
1161
1161
|
|
|
1162
1162
|
return (
|
|
1163
|
-
<
|
|
1163
|
+
<section>
|
|
1164
1164
|
<Button onClick={handleSuccess}>Save Changes</Button>
|
|
1165
1165
|
<Button onClick={handleError}>Trigger Error</Button>
|
|
1166
|
-
</
|
|
1166
|
+
</section>
|
|
1167
1167
|
);
|
|
1168
1168
|
}
|
|
1169
1169
|
|
|
@@ -1238,10 +1238,10 @@ import {
|
|
|
1238
1238
|
<Button>Advanced Tooltip</Button>
|
|
1239
1239
|
</TooltipTrigger>
|
|
1240
1240
|
<TooltipContent side="top" className="bg-main-500 text-main-50">
|
|
1241
|
-
<
|
|
1241
|
+
<section className="space-y-1">
|
|
1242
1242
|
<p className="font-semibold">Advanced Tooltip</p>
|
|
1243
1243
|
<p className="text-xs">With custom styling</p>
|
|
1244
|
-
</
|
|
1244
|
+
</section>
|
|
1245
1245
|
</TooltipContent>
|
|
1246
1246
|
</TooltipRoot>
|
|
1247
1247
|
</TooltipProvider>
|
|
@@ -1287,7 +1287,7 @@ A complete application layout with header, navigation, and content area.
|
|
|
1287
1287
|
import { PaceAppLayout } from '@jmruthers/pace-core';
|
|
1288
1288
|
|
|
1289
1289
|
<PaceAppLayout>
|
|
1290
|
-
<
|
|
1290
|
+
<main>Your app content</main>
|
|
1291
1291
|
</PaceAppLayout>
|
|
1292
1292
|
```
|
|
1293
1293
|
|
|
@@ -1573,10 +1573,10 @@ function App() {
|
|
|
1573
1573
|
loginPath="/login"
|
|
1574
1574
|
loadingFallback={<CustomLoader />}
|
|
1575
1575
|
noEventsFallback={
|
|
1576
|
-
<
|
|
1576
|
+
<section>
|
|
1577
1577
|
<h2>No Events Available</h2>
|
|
1578
1578
|
<p>Contact your administrator for access.</p>
|
|
1579
|
-
</
|
|
1579
|
+
</section>
|
|
1580
1580
|
}
|
|
1581
1581
|
/>
|
|
1582
1582
|
}>
|
|
@@ -1787,7 +1787,7 @@ function PublicEventPage() {
|
|
|
1787
1787
|
}
|
|
1788
1788
|
|
|
1789
1789
|
if (error || !event) {
|
|
1790
|
-
return <
|
|
1790
|
+
return <p>Event not found</p>;
|
|
1791
1791
|
}
|
|
1792
1792
|
|
|
1793
1793
|
return (
|
|
@@ -1883,9 +1883,9 @@ function MyFileUpload() {
|
|
|
1883
1883
|
console.log('URL:', result.file_url);
|
|
1884
1884
|
}}
|
|
1885
1885
|
>
|
|
1886
|
-
<
|
|
1886
|
+
<section className="border-2 border-dashed border-main-300 rounded-lg p-8 text-center">
|
|
1887
1887
|
<p>Drag and drop files here or click to browse</p>
|
|
1888
|
-
</
|
|
1888
|
+
</section>
|
|
1889
1889
|
</FileUpload>
|
|
1890
1890
|
);
|
|
1891
1891
|
}
|
|
@@ -1925,7 +1925,7 @@ function MyApp() {
|
|
|
1925
1925
|
});
|
|
1926
1926
|
|
|
1927
1927
|
return (
|
|
1928
|
-
<
|
|
1928
|
+
<main>
|
|
1929
1929
|
<h1>My App</h1>
|
|
1930
1930
|
|
|
1931
1931
|
<InactivityWarningModal
|
|
@@ -1936,7 +1936,7 @@ function MyApp() {
|
|
|
1936
1936
|
title="Session Timeout Warning"
|
|
1937
1937
|
message="You will be signed out due to inactivity."
|
|
1938
1938
|
/>
|
|
1939
|
-
</
|
|
1939
|
+
</main>
|
|
1940
1940
|
);
|
|
1941
1941
|
}
|
|
1942
1942
|
```
|
|
@@ -1967,14 +1967,14 @@ import { EventLogo } from '@jmruthers/pace-core';
|
|
|
1967
1967
|
|
|
1968
1968
|
function EventHeader({ eventId }: { eventId: string }) {
|
|
1969
1969
|
return (
|
|
1970
|
-
<
|
|
1970
|
+
<section className="text-center">
|
|
1971
1971
|
<EventLogo
|
|
1972
1972
|
eventId={eventId}
|
|
1973
1973
|
size="large"
|
|
1974
1974
|
className="mx-auto mb-4"
|
|
1975
1975
|
/>
|
|
1976
1976
|
<h1>Event Name</h1>
|
|
1977
|
-
</
|
|
1977
|
+
</section>
|
|
1978
1978
|
);
|
|
1979
1979
|
}
|
|
1980
1980
|
```
|
|
@@ -2238,10 +2238,10 @@ import {
|
|
|
2238
2238
|
- **[Component Styling](../styles/component-styling.md)** - How components are styled
|
|
2239
2239
|
- **[Custom Themes](../styles/custom-themes.md)** - Creating custom themes
|
|
2240
2240
|
|
|
2241
|
-
### Best Practices
|
|
2242
|
-
- **[
|
|
2243
|
-
- **[Performance
|
|
2244
|
-
- **[Accessibility
|
|
2241
|
+
### Standards & Best Practices
|
|
2242
|
+
- **[Architecture Standards](../standards/3-architecture-standards.md)** - Component design principles
|
|
2243
|
+
- **[Performance Optimization](../standards/9-operations-standards.md#performance-optimization)** - Performance optimization
|
|
2244
|
+
- **[Accessibility Requirements](../standards/4-code-quality-standards.md#accessibility-requirements)** - Accessibility requirements
|
|
2245
2245
|
|
|
2246
2246
|
### Troubleshooting
|
|
2247
2247
|
- **[Common Issues](../troubleshooting/common-issues.md)** - Component-related problems
|
|
@@ -276,28 +276,53 @@ const { data: roleId } = await supabase.rpc('rbac_role_grant', { ... });
|
|
|
276
276
|
|
|
277
277
|
### Legacy Event RPCs
|
|
278
278
|
|
|
279
|
-
**Status**:
|
|
279
|
+
**Status**: Removed
|
|
280
280
|
**Since**: v0.5.x
|
|
281
|
-
**
|
|
281
|
+
**Removed**: v0.6.x
|
|
282
282
|
|
|
283
|
-
**
|
|
284
|
-
- `get_pace_user_events` → Use `data_user_events_get`
|
|
283
|
+
**Removed Functions**:
|
|
284
|
+
- `get_pace_user_events` → Use `data_user_events_get` or `useEvents()` hook
|
|
285
|
+
- `get_public_event_by_code` → Use direct table queries or `usePublicEvent()` hook
|
|
286
|
+
- `get_public_event_logo` → Use direct table queries or `usePublicEventLogo()` hook
|
|
285
287
|
|
|
286
288
|
**Migration**:
|
|
287
289
|
```typescript
|
|
288
|
-
// Old
|
|
290
|
+
// Old - get_pace_user_events
|
|
289
291
|
const { data } = await supabase.rpc('get_pace_user_events', {
|
|
290
292
|
user_uuid: userId,
|
|
291
293
|
app_name: appName,
|
|
292
294
|
p_organisation_id: orgId
|
|
293
295
|
});
|
|
294
296
|
|
|
295
|
-
// New
|
|
297
|
+
// New - Modern RPC
|
|
296
298
|
const { data, error } = await supabase.rpc('data_user_events_get', {
|
|
297
299
|
p_user_id: userId,
|
|
298
300
|
p_app_id: appId, // Use app ID instead of app name
|
|
299
301
|
p_organisation_id: orgId
|
|
300
302
|
});
|
|
303
|
+
|
|
304
|
+
// Better - Use pace-core hook
|
|
305
|
+
import { useEvents } from '@jmruthers/pace-core';
|
|
306
|
+
const { events } = useEvents();
|
|
307
|
+
|
|
308
|
+
// Old - get_public_event_by_code
|
|
309
|
+
const { data } = await supabase.rpc('get_public_event_by_code', {
|
|
310
|
+
event_code_param: eventCode
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// New - Direct table query (pace-core handles this internally)
|
|
314
|
+
import { usePublicEvent } from '@jmruthers/pace-core';
|
|
315
|
+
const { event, isLoading, error } = usePublicEvent(eventCode);
|
|
316
|
+
|
|
317
|
+
// Old - get_public_event_logo
|
|
318
|
+
const { data } = await supabase.rpc('get_public_event_logo', {
|
|
319
|
+
event_id_param: eventId,
|
|
320
|
+
organisation_id_param: organisationId
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// New - Direct table query (pace-core handles this internally)
|
|
324
|
+
import { usePublicEventLogo } from '@jmruthers/pace-core';
|
|
325
|
+
const { logoUrl, loading, error } = usePublicEventLogo(eventId, eventName, organisationId);
|
|
301
326
|
```
|
|
302
327
|
|
|
303
328
|
### Legacy Data Access RPCs
|
|
@@ -111,11 +111,11 @@ function App() {
|
|
|
111
111
|
handleSignOutNow,
|
|
112
112
|
} = useUnifiedAuth();
|
|
113
113
|
|
|
114
|
-
if (isLoading) return <
|
|
115
|
-
if (authError) return <
|
|
114
|
+
if (isLoading) return <p>Loading...</p>;
|
|
115
|
+
if (authError) return <p>Error: {authError.message}</p>;
|
|
116
116
|
|
|
117
117
|
return (
|
|
118
|
-
<
|
|
118
|
+
<main>
|
|
119
119
|
{user ? (
|
|
120
120
|
<>
|
|
121
121
|
<p>Welcome, {user.email}</p>
|
|
@@ -129,7 +129,7 @@ function App() {
|
|
|
129
129
|
) : (
|
|
130
130
|
<LoginForm onSignIn={signIn} />
|
|
131
131
|
)}
|
|
132
|
-
</
|
|
132
|
+
</main>
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
```
|
|
@@ -220,22 +220,22 @@ function EventManager() {
|
|
|
220
220
|
hasAccess,
|
|
221
221
|
} = useEvents();
|
|
222
222
|
|
|
223
|
-
if (loading) return <
|
|
223
|
+
if (loading) return <p>Loading events...</p>;
|
|
224
224
|
|
|
225
225
|
return (
|
|
226
|
-
<
|
|
226
|
+
<section>
|
|
227
227
|
<h2>Available Events</h2>
|
|
228
228
|
{events.map(event => (
|
|
229
|
-
<
|
|
229
|
+
<section key={event.id}>
|
|
230
230
|
<span>{event.name}</span>
|
|
231
231
|
{hasAccess(event.id) && (
|
|
232
232
|
<button onClick={() => setSelectedEvent(event)}>
|
|
233
233
|
Select
|
|
234
234
|
</button>
|
|
235
235
|
)}
|
|
236
|
-
</
|
|
236
|
+
</section>
|
|
237
237
|
))}
|
|
238
|
-
</
|
|
238
|
+
</section>
|
|
239
239
|
);
|
|
240
240
|
}
|
|
241
241
|
```
|
|
@@ -281,9 +281,9 @@ function UserActions({ userId, scope }) {
|
|
|
281
281
|
}, [hasPermission, isLoading, userId, scope]);
|
|
282
282
|
|
|
283
283
|
return (
|
|
284
|
-
<
|
|
284
|
+
<section>
|
|
285
285
|
{canEdit && <EditButton />}
|
|
286
|
-
</
|
|
286
|
+
</section>
|
|
287
287
|
);
|
|
288
288
|
}
|
|
289
289
|
```
|
|
@@ -312,18 +312,18 @@ function PermissionDisplay({ userId, scope }) {
|
|
|
312
312
|
scope
|
|
313
313
|
});
|
|
314
314
|
|
|
315
|
-
if (isLoading) return <
|
|
316
|
-
if (error) return <
|
|
315
|
+
if (isLoading) return <p>Loading permissions...</p>;
|
|
316
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
317
317
|
|
|
318
318
|
return (
|
|
319
|
-
<
|
|
319
|
+
<section>
|
|
320
320
|
<h3>User Permissions</h3>
|
|
321
321
|
{Object.entries(permissions).map(([pageId, operations]) => (
|
|
322
|
-
<
|
|
322
|
+
<p key={pageId}>
|
|
323
323
|
<strong>{pageId}:</strong> {operations.join(', ')}
|
|
324
|
-
</
|
|
324
|
+
</p>
|
|
325
325
|
))}
|
|
326
|
-
</
|
|
326
|
+
</section>
|
|
327
327
|
);
|
|
328
328
|
}
|
|
329
329
|
```
|
|
@@ -352,13 +352,13 @@ function AccessLevelDisplay({ userId, scope }) {
|
|
|
352
352
|
scope
|
|
353
353
|
});
|
|
354
354
|
|
|
355
|
-
if (isLoading) return <
|
|
356
|
-
if (error) return <
|
|
355
|
+
if (isLoading) return <p>Loading access level...</p>;
|
|
356
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
357
357
|
|
|
358
358
|
return (
|
|
359
|
-
<
|
|
359
|
+
<section>
|
|
360
360
|
<p>Access Level: {accessLevel || 'None'}</p>
|
|
361
|
-
</
|
|
361
|
+
</section>
|
|
362
362
|
);
|
|
363
363
|
}
|
|
364
364
|
```
|
|
@@ -406,10 +406,10 @@ function NotificationExample() {
|
|
|
406
406
|
};
|
|
407
407
|
|
|
408
408
|
return (
|
|
409
|
-
<
|
|
409
|
+
<section>
|
|
410
410
|
<button onClick={handleSuccess}>Show Success</button>
|
|
411
411
|
<button onClick={handleError}>Show Error</button>
|
|
412
|
-
</
|
|
412
|
+
</section>
|
|
413
413
|
);
|
|
414
414
|
}
|
|
415
415
|
```
|
|
@@ -460,23 +460,23 @@ function UserForm() {
|
|
|
460
460
|
|
|
461
461
|
return (
|
|
462
462
|
<form onSubmit={handleSubmit(onSubmit)}>
|
|
463
|
-
<
|
|
463
|
+
<section>
|
|
464
464
|
<label>Name</label>
|
|
465
465
|
<input {...register('name')} />
|
|
466
466
|
{errors.name && <span>{errors.name.message}</span>}
|
|
467
|
-
</
|
|
467
|
+
</section>
|
|
468
468
|
|
|
469
|
-
<
|
|
469
|
+
<section>
|
|
470
470
|
<label>Email</label>
|
|
471
471
|
<input type="email" {...register('email')} />
|
|
472
472
|
{errors.email && <span>{errors.email.message}</span>}
|
|
473
|
-
</
|
|
473
|
+
</section>
|
|
474
474
|
|
|
475
|
-
<
|
|
475
|
+
<section>
|
|
476
476
|
<label>Age</label>
|
|
477
477
|
<input type="number" {...register('age')} />
|
|
478
478
|
{errors.age && <span>{errors.age.message}</span>}
|
|
479
|
-
</
|
|
479
|
+
</section>
|
|
480
480
|
|
|
481
481
|
<button type="submit" disabled={isSubmitting}>
|
|
482
482
|
{isSubmitting ? 'Submitting...' : 'Submit'}
|
|
@@ -654,18 +654,18 @@ function Dropdown() {
|
|
|
654
654
|
useClickOutside(dropdownRef, () => setIsOpen(false));
|
|
655
655
|
|
|
656
656
|
return (
|
|
657
|
-
<
|
|
657
|
+
<nav ref={dropdownRef}>
|
|
658
658
|
<button onClick={() => setIsOpen(!isOpen)}>
|
|
659
659
|
Toggle Dropdown
|
|
660
660
|
</button>
|
|
661
661
|
{isOpen && (
|
|
662
|
-
<
|
|
663
|
-
<
|
|
664
|
-
<
|
|
665
|
-
<
|
|
666
|
-
</
|
|
662
|
+
<section className="dropdown-content">
|
|
663
|
+
<button>Option 1</button>
|
|
664
|
+
<button>Option 2</button>
|
|
665
|
+
<button>Option 3</button>
|
|
666
|
+
</section>
|
|
667
667
|
)}
|
|
668
|
-
</
|
|
668
|
+
</nav>
|
|
669
669
|
);
|
|
670
670
|
}
|
|
671
671
|
```
|
|
@@ -696,11 +696,11 @@ function PerformanceDashboard() {
|
|
|
696
696
|
const metrics = usePerformanceMonitor();
|
|
697
697
|
|
|
698
698
|
return (
|
|
699
|
-
<
|
|
699
|
+
<section>
|
|
700
700
|
<p>Render time: {metrics.renderTime}ms</p>
|
|
701
701
|
<p>Memory usage: {metrics.memoryUsage}MB</p>
|
|
702
702
|
<p>Components: {metrics.componentCount}</p>
|
|
703
|
-
</
|
|
703
|
+
</section>
|
|
704
704
|
);
|
|
705
705
|
}
|
|
706
706
|
```
|
|
@@ -829,7 +829,7 @@ function PublicEventPage() {
|
|
|
829
829
|
console.log('Event Code:', eventCode);
|
|
830
830
|
console.log('Report ID:', reportId);
|
|
831
831
|
|
|
832
|
-
return <
|
|
832
|
+
return <p>Event: {eventCode}</p>;
|
|
833
833
|
}
|
|
834
834
|
```
|
|
835
835
|
|
|
@@ -856,11 +856,11 @@ function PublicEventPage() {
|
|
|
856
856
|
const { eventCode } = usePublicRouteParams({ fetchEventData: false });
|
|
857
857
|
const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
|
|
858
858
|
|
|
859
|
-
if (isLoading) return <
|
|
860
|
-
if (error) return <
|
|
861
|
-
if (!event) return <
|
|
862
|
-
|
|
863
|
-
return <
|
|
859
|
+
if (isLoading) return <p>Loading...</p>;
|
|
860
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
861
|
+
if (!event) return <p>Event not found</p>;
|
|
862
|
+
|
|
863
|
+
return <p>Event: {event.event_name}</p>;
|
|
864
864
|
}
|
|
865
865
|
```
|
|
866
866
|
|
|
@@ -880,10 +880,10 @@ function MyComponent() {
|
|
|
880
880
|
const isPublicPage = useIsPublicPage();
|
|
881
881
|
|
|
882
882
|
if (isPublicPage) {
|
|
883
|
-
return <
|
|
883
|
+
return <section>This is a public page</section>;
|
|
884
884
|
}
|
|
885
885
|
|
|
886
|
-
return <
|
|
886
|
+
return <section>This is an authenticated page</section>;
|
|
887
887
|
}
|
|
888
888
|
```
|
|
889
889
|
|
|
@@ -912,7 +912,7 @@ function PublicComponent() {
|
|
|
912
912
|
|
|
913
913
|
console.log('Supabase URL:', environment.supabaseUrl);
|
|
914
914
|
|
|
915
|
-
return <
|
|
915
|
+
return <section>Public component</section>;
|
|
916
916
|
}
|
|
917
917
|
```
|
|
918
918
|
|
|
@@ -973,16 +973,16 @@ function MyComponent() {
|
|
|
973
973
|
});
|
|
974
974
|
|
|
975
975
|
return (
|
|
976
|
-
<
|
|
976
|
+
<section>
|
|
977
977
|
<p>Idle: {isIdle ? 'Yes' : 'No'}</p>
|
|
978
978
|
<p>Time remaining: {Math.floor(timeRemaining / 1000)}s</p>
|
|
979
979
|
{showWarning && (
|
|
980
|
-
<
|
|
980
|
+
<section>
|
|
981
981
|
<p>You will be signed out soon due to inactivity.</p>
|
|
982
982
|
<button onClick={resetActivity}>Stay Active</button>
|
|
983
|
-
</
|
|
983
|
+
</section>
|
|
984
984
|
)}
|
|
985
|
-
</
|
|
985
|
+
</section>
|
|
986
986
|
);
|
|
987
987
|
}
|
|
988
988
|
```
|
|
@@ -1050,10 +1050,10 @@ function SecureComponent() {
|
|
|
1050
1050
|
};
|
|
1051
1051
|
|
|
1052
1052
|
return (
|
|
1053
|
-
<
|
|
1053
|
+
<section>
|
|
1054
1054
|
<p>Super Admin: {superAdminContext.isSuperAdmin ? 'Yes' : 'No'}</p>
|
|
1055
1055
|
<button onClick={handleSecureAction}>Perform Secure Action</button>
|
|
1056
|
-
</
|
|
1056
|
+
</section>
|
|
1057
1057
|
);
|
|
1058
1058
|
}
|
|
1059
1059
|
```
|
|
@@ -1105,15 +1105,15 @@ function FileUpload() {
|
|
|
1105
1105
|
};
|
|
1106
1106
|
|
|
1107
1107
|
return (
|
|
1108
|
-
<
|
|
1108
|
+
<section>
|
|
1109
1109
|
<input
|
|
1110
1110
|
type="file"
|
|
1111
1111
|
onChange={(e) => e.target.files?.[0] && handleFileUpload(e.target.files[0])}
|
|
1112
1112
|
disabled={isLoading}
|
|
1113
1113
|
/>
|
|
1114
|
-
{isLoading && <
|
|
1115
|
-
{error && <
|
|
1116
|
-
</
|
|
1114
|
+
{isLoading && <p>Uploading...</p>}
|
|
1115
|
+
{error && <p>Error: {error.message}</p>}
|
|
1116
|
+
</section>
|
|
1117
1117
|
);
|
|
1118
1118
|
}
|
|
1119
1119
|
```
|
|
@@ -1160,30 +1160,30 @@ function FileUploadWithProgress() {
|
|
|
1160
1160
|
};
|
|
1161
1161
|
|
|
1162
1162
|
return (
|
|
1163
|
-
<
|
|
1163
|
+
<section>
|
|
1164
1164
|
<input
|
|
1165
1165
|
type="file"
|
|
1166
1166
|
onChange={(e) => e.target.files?.[0] && handleFileUpload(e.target.files[0])}
|
|
1167
1167
|
disabled={isUploading}
|
|
1168
1168
|
/>
|
|
1169
1169
|
{isUploading && (
|
|
1170
|
-
<
|
|
1171
|
-
<
|
|
1172
|
-
<
|
|
1173
|
-
<
|
|
1170
|
+
<section>
|
|
1171
|
+
<p>Uploading... {uploadProgress}%</p>
|
|
1172
|
+
<section className="w-full bg-sec-200 rounded-full h-2" role="progressbar" aria-valuenow={uploadProgress} aria-valuemin={0} aria-valuemax={100}>
|
|
1173
|
+
<section
|
|
1174
1174
|
className="bg-main-600 h-2 rounded-full transition-all duration-300"
|
|
1175
1175
|
style={{ width: `${uploadProgress}%` }}
|
|
1176
1176
|
/>
|
|
1177
|
-
</
|
|
1178
|
-
</
|
|
1177
|
+
</section>
|
|
1178
|
+
</section>
|
|
1179
1179
|
)}
|
|
1180
1180
|
{error && (
|
|
1181
|
-
<
|
|
1182
|
-
<
|
|
1181
|
+
<section>
|
|
1182
|
+
<p>Error: {error.message}</p>
|
|
1183
1183
|
<button onClick={reset}>Try Again</button>
|
|
1184
|
-
</
|
|
1184
|
+
</section>
|
|
1185
1185
|
)}
|
|
1186
|
-
</
|
|
1186
|
+
</section>
|
|
1187
1187
|
);
|
|
1188
1188
|
}
|
|
1189
1189
|
```
|
|
@@ -1235,12 +1235,12 @@ function AppSettings() {
|
|
|
1235
1235
|
});
|
|
1236
1236
|
};
|
|
1237
1237
|
|
|
1238
|
-
if (isLoading) return <
|
|
1239
|
-
if (error) return <
|
|
1240
|
-
if (!config) return <
|
|
1238
|
+
if (isLoading) return <p>Loading configuration...</p>;
|
|
1239
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
1240
|
+
if (!config) return <p>No configuration available</p>;
|
|
1241
1241
|
|
|
1242
1242
|
return (
|
|
1243
|
-
<
|
|
1243
|
+
<section>
|
|
1244
1244
|
<h2>App Configuration</h2>
|
|
1245
1245
|
<p>App Name: {config.appName}</p>
|
|
1246
1246
|
<p>Version: {config.version}</p>
|
|
@@ -1257,7 +1257,7 @@ function AppSettings() {
|
|
|
1257
1257
|
{name}
|
|
1258
1258
|
</label>
|
|
1259
1259
|
))}
|
|
1260
|
-
</
|
|
1260
|
+
</section>
|
|
1261
1261
|
);
|
|
1262
1262
|
}
|
|
1263
1263
|
```
|
|
@@ -1295,9 +1295,9 @@ function Modal({ children, onClose }) {
|
|
|
1295
1295
|
});
|
|
1296
1296
|
|
|
1297
1297
|
return (
|
|
1298
|
-
<
|
|
1298
|
+
<section ref={containerRef}>
|
|
1299
1299
|
{children}
|
|
1300
|
-
</
|
|
1300
|
+
</section>
|
|
1301
1301
|
);
|
|
1302
1302
|
}
|
|
1303
1303
|
```
|
|
@@ -1333,9 +1333,9 @@ function Dialog({ isOpen, children, onClose }) {
|
|
|
1333
1333
|
if (!isOpen) return null;
|
|
1334
1334
|
|
|
1335
1335
|
return (
|
|
1336
|
-
<
|
|
1336
|
+
<section ref={containerRef}>
|
|
1337
1337
|
{children}
|
|
1338
|
-
</
|
|
1338
|
+
</section>
|
|
1339
1339
|
);
|
|
1340
1340
|
}
|
|
1341
1341
|
```
|
|
@@ -1391,9 +1391,9 @@ function ResponsiveLayout({ children }) {
|
|
|
1391
1391
|
const isMobile = useIsMobile();
|
|
1392
1392
|
|
|
1393
1393
|
return (
|
|
1394
|
-
<
|
|
1394
|
+
<section className={isMobile ? 'mobile' : 'desktop'}>
|
|
1395
1395
|
{children}
|
|
1396
|
-
</
|
|
1396
|
+
</section>
|
|
1397
1397
|
);
|
|
1398
1398
|
}
|
|
1399
1399
|
```
|
|
@@ -1491,7 +1491,7 @@ import { usePerformanceMonitor } from '@jmruthers/pace-core';
|
|
|
1491
1491
|
function PerformanceDashboard() {
|
|
1492
1492
|
const metrics = usePerformanceMonitor();
|
|
1493
1493
|
|
|
1494
|
-
return <
|
|
1494
|
+
return <p>Render time: {metrics.renderTime}ms</p>;
|
|
1495
1495
|
}
|
|
1496
1496
|
```
|
|
1497
1497
|
|