@jmruthers/pace-core 0.6.4 → 0.6.6
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/core-usage-manifest.json +93 -0
- package/cursor-rules/00-pace-core-compliance.mdc +128 -26
- package/cursor-rules/01-standards-compliance.mdc +49 -8
- package/cursor-rules/02-project-structure.mdc +6 -0
- package/cursor-rules/03-solid-principles.mdc +2 -0
- package/cursor-rules/04-testing-standards.mdc +2 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
- package/cursor-rules/06-code-quality.mdc +2 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
- package/cursor-rules/08-markup-quality.mdc +52 -27
- package/cursor-rules/09-rbac-compliance.mdc +462 -0
- package/cursor-rules/10-error-handling-patterns.mdc +179 -0
- package/cursor-rules/11-performance-optimization.mdc +169 -0
- package/cursor-rules/12-ci-cd-integration.mdc +150 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
- package/dist/DataTable-LRJL4IRV.js +15 -0
- package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
- package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
- package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/chunk-4T7OBVTU.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-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
- package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
- package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
- package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/chunk-OHIK3MIO.js +994 -0
- package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
- package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
- package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
- package/dist/components.d.ts +6 -6
- package/dist/components.js +57 -267
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +22 -0
- package/dist/eslint-rules/rules/compliance.cjs +348 -0
- package/dist/eslint-rules/rules/components.cjs +113 -0
- package/dist/eslint-rules/rules/imports.cjs +102 -0
- package/dist/eslint-rules/rules/rbac.cjs +790 -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 +5 -5
- package/dist/hooks.js +62 -270
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +36 -26
- package/dist/index.js +87 -690
- 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 +124 -594
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- 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-B-K_5VnO.d.ts} +4 -0
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +16 -6
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +454 -930
- package/docs/api-reference/components.md +3 -1
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/best-practices/accessibility.md +6 -3
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/permission-enforcement.md +4 -0
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +12 -3
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/secure-client-protection.md +0 -34
- package/docs/standards/00-pace-core-compliance.md +967 -0
- package/docs/standards/01-standards-compliance.md +188 -0
- package/docs/standards/02-project-structure.md +985 -0
- package/docs/standards/03-solid-principles.md +39 -0
- package/docs/standards/04-testing-standards.md +36 -0
- package/docs/standards/05-bug-reports-and-features.md +27 -0
- package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
- package/docs/standards/07-tech-stack-compliance.md +30 -0
- package/docs/standards/08-markup-quality.md +345 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
- package/docs/standards/10-error-handling-patterns.md +401 -0
- package/docs/standards/11-performance-optimization.md +348 -0
- package/docs/standards/12-ci-cd-integration.md +370 -0
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
- package/docs/standards/README.md +62 -33
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +20 -4
- package/package.json +31 -21
- package/scripts/audit/audit-compliance.cjs +1295 -0
- package/scripts/audit/audit-components.cjs +260 -0
- package/scripts/audit/audit-dependencies.cjs +395 -0
- package/scripts/audit/audit-rbac.cjs +954 -0
- package/scripts/audit/audit-standards.cjs +1268 -0
- package/scripts/audit/index.cjs +1898 -194
- package/scripts/install-cursor-rules.cjs +259 -8
- package/scripts/validate-master.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
- 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-utils.test.tsx +3 -3
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/ContextSelector/ContextSelector.tsx +42 -39
- package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
- package/src/components/DataTable/components/DataTableBody.tsx +55 -31
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +7 -2
- package/src/components/DataTable/components/ImportModal.tsx +4 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/core/DataTableContext.tsx +1 -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 -0
- package/src/components/DateTimeField/DateTimeField.tsx +20 -20
- package/src/components/DateTimeField/README.md +5 -2
- package/src/components/Dialog/Dialog.test.tsx +361 -318
- package/src/components/Dialog/Dialog.tsx +1154 -323
- package/src/components/Dialog/index.ts +3 -3
- package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
- package/src/components/FileDisplay/FileDisplay.tsx +28 -22
- package/src/components/Form/Form.test.tsx +9 -10
- package/src/components/Form/Form.tsx +369 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
- package/src/components/LoginForm/LoginForm.tsx +2 -2
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
- package/src/components/PaceAppLayout/README.md +10 -9
- package/src/components/PaceAppLayout/test-setup.tsx +40 -31
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
- package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
- package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
- package/src/components/Select/Select.tsx +23 -21
- package/src/components/Select/types.ts +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +38 -6
- package/src/components/UserMenu/UserMenu.tsx +39 -34
- package/src/components/index.ts +3 -4
- package/src/eslint-rules/index.cjs +22 -0
- package/src/eslint-rules/rules/compliance.cjs +348 -0
- package/src/eslint-rules/rules/components.cjs +113 -0
- package/src/eslint-rules/rules/imports.cjs +102 -0
- package/src/eslint-rules/rules/rbac.cjs +790 -0
- package/src/eslint-rules/utils/helpers.cjs +42 -0
- package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- 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 +62 -190
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +19 -9
- package/src/hooks/useAppConfig.ts +26 -24
- package/src/hooks/useEventTheme.test.ts +211 -233
- package/src/hooks/useEventTheme.ts +19 -28
- package/src/hooks/useEvents.ts +11 -7
- package/src/hooks/useKeyboardShortcuts.ts +1 -1
- package/src/hooks/useOrganisationPermissions.ts +9 -11
- package/src/hooks/useOrganisations.ts +13 -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 +16 -1
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
- package/src/rbac/README.md +20 -20
- 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/useRBAC.test.ts +21 -3
- package/src/rbac/hooks/useRBAC.ts +4 -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 +241 -60
- package/src/rbac/hooks/useResourcePermissions.ts +182 -63
- 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/permissions.ts +17 -17
- package/src/rbac/utils/contextValidator.ts +45 -7
- package/src/services/AuthService.ts +132 -23
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +155 -58
- 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 +4 -0
- package/src/types/database.generated.ts +4733 -3809
- 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/formatting/formatTime.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/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/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-E7YQZD7D.js +0 -175
- package/dist/DataTable-E7YQZD7D.js.map +0 -1
- package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
- package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
- package/dist/api-6LVZTHDS.js +0 -52
- package/dist/api-6LVZTHDS.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-36LVWXB2.js +0 -227
- package/dist/chunk-36LVWXB2.js.map +0 -1
- package/dist/chunk-3LPHPB62.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-5EC5MEWX.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6SOIHG6Z.js.map +0 -1
- package/dist/chunk-7JPAB3T5.js.map +0 -1
- package/dist/chunk-ATKZM7RX.js +0 -2053
- package/dist/chunk-ATKZM7RX.js.map +0 -1
- package/dist/chunk-AVMLPIM7.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.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-I6DAQMWX.js.map +0 -1
- package/dist/chunk-J36DSWQK.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-NN6WWZ5U.js.map +0 -1
- package/dist/chunk-OEWDTMG7.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-YKRAFF5K.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-OOPCLPZW.js +0 -9
- package/dist/contextValidator-OOPCLPZW.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/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/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/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/eslint-rules/pace-core-compliance.cjs +0 -510
- 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
|
@@ -7,6 +7,10 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# pace-core Compliance Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [00-pace-core-compliance.md](../../packages/core/docs/standards/00-pace-core-compliance.md) for complete documentation.
|
|
11
|
+
|
|
12
|
+
This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
|
|
13
|
+
|
|
10
14
|
This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
|
|
11
15
|
|
|
12
16
|
## MUST: Use pace-core Instead of Custom Solutions
|
|
@@ -27,7 +31,7 @@ This guide ensures consuming apps use pace-core components, hooks, and utilities
|
|
|
27
31
|
- Create custom button components when `Button` from pace-core exists
|
|
28
32
|
- Use native HTML elements (`<button>`, `<input>`) when pace-core provides components
|
|
29
33
|
- Import directly from `@radix-ui/*` - Use pace-core wrappers instead
|
|
30
|
-
- Import directly from `lucide-react` -
|
|
34
|
+
- Import directly from `lucide-react` - Import icons from `@jmruthers/pace-core/icons` instead
|
|
31
35
|
|
|
32
36
|
**Example:**
|
|
33
37
|
```tsx
|
|
@@ -77,45 +81,106 @@ This guide ensures consuming apps use pace-core components, hooks, and utilities
|
|
|
77
81
|
|
|
78
82
|
## MUST: Use Secure Supabase Client
|
|
79
83
|
|
|
80
|
-
**
|
|
84
|
+
**All database operations MUST use `useSecureSupabase()` (or the contract-approved pace-core secure client wrapper).**
|
|
85
|
+
Consuming apps **MUST NOT** use the base Supabase client directly for queries.
|
|
86
|
+
|
|
87
|
+
### Hard Requirements
|
|
88
|
+
|
|
89
|
+
- **MUST NOT** import or call `createClient()` from `@supabase/supabase-js` in consuming app code **except** for creating the base client passed to `UnifiedAuthProvider`.
|
|
90
|
+
- **MUST NOT** export, pass, or store an insecure Supabase client instance for general use.
|
|
91
|
+
- **MUST** perform all `.from(...)`, `.rpc(...)`, `.auth.*`, and storage operations via the secure client returned by `useSecureSupabase()` (or the approved pace-core equivalent).
|
|
92
|
+
- **MUST** create the base Supabase client ONCE and pass it to `UnifiedAuthProvider` as `supabaseClient` prop.
|
|
93
|
+
- **MUST** call `useSecureSupabase()` without parameters - it automatically uses the base client from `useUnifiedAuth()` provider layer.
|
|
94
|
+
- **MUST NOT** pass a base client directly to `useSecureSupabase()` - the hook gets it from the provider automatically.
|
|
81
95
|
|
|
82
|
-
|
|
96
|
+
### Why this is critical
|
|
97
|
+
|
|
98
|
+
Using `createClient()` directly for queries can bypass organisation context enforcement and RLS policies, leading to:
|
|
83
99
|
- Cross-organisation data access
|
|
84
|
-
- Security vulnerabilities
|
|
100
|
+
- Security vulnerabilities
|
|
85
101
|
- Data leakage between organisations
|
|
86
102
|
|
|
103
|
+
### Correct Pattern
|
|
104
|
+
|
|
87
105
|
```tsx
|
|
88
|
-
//
|
|
106
|
+
// ✅ CORRECT: Create base client ONCE for UnifiedAuthProvider
|
|
107
|
+
// main.tsx or App.tsx
|
|
89
108
|
import { createClient } from '@supabase/supabase-js';
|
|
90
|
-
|
|
91
|
-
|
|
109
|
+
import { UnifiedAuthProvider } from '@jmruthers/pace-core';
|
|
110
|
+
|
|
111
|
+
const supabase = createClient(
|
|
112
|
+
import.meta.env.VITE_SUPABASE_URL,
|
|
113
|
+
import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
function App() {
|
|
117
|
+
return (
|
|
118
|
+
<UnifiedAuthProvider
|
|
119
|
+
supabaseClient={supabase} // Pass base client to provider
|
|
120
|
+
appName="YourApp"
|
|
121
|
+
// ... other props
|
|
122
|
+
>
|
|
123
|
+
<YourApp />
|
|
124
|
+
</UnifiedAuthProvider>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
92
127
|
|
|
93
|
-
// ✅ CORRECT: Use secure
|
|
128
|
+
// ✅ CORRECT: Use secure client in components (no parameters needed)
|
|
129
|
+
// YourComponent.tsx
|
|
94
130
|
import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
|
|
95
|
-
const secureSupabase = useSecureSupabase();
|
|
96
|
-
// Organisation context is automatically enforced
|
|
97
|
-
```
|
|
98
131
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
132
|
+
function YourComponent() {
|
|
133
|
+
const secureSupabase = useSecureSupabase(); // Gets client from provider automatically
|
|
134
|
+
|
|
135
|
+
if (!secureSupabase) {
|
|
136
|
+
return <div>Loading...</div>;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Use secureSupabase for all queries
|
|
140
|
+
const { data } = await secureSupabase.from('users').select('*');
|
|
141
|
+
}
|
|
142
|
+
```
|
|
102
143
|
|
|
103
|
-
|
|
104
|
-
2. **Runtime Warnings**: Development mode warnings when insecure clients are detected
|
|
105
|
-
3. **Type Safety**: Use `isSecureClient()` to verify clients are secure
|
|
144
|
+
### Incorrect Patterns
|
|
106
145
|
|
|
107
146
|
```tsx
|
|
108
|
-
//
|
|
109
|
-
import {
|
|
147
|
+
// ❌ FORBIDDEN: Creating client in component or service
|
|
148
|
+
import { createClient } from '@supabase/supabase-js';
|
|
149
|
+
const supabase = createClient(url, key); // Don't do this for queries
|
|
110
150
|
|
|
111
|
-
|
|
112
|
-
|
|
151
|
+
// ❌ FORBIDDEN: Passing base client to useSecureSupabase
|
|
152
|
+
import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
|
|
153
|
+
import { supabase } from './supabase'; // Don't export base client
|
|
154
|
+
const secureSupabase = useSecureSupabase(supabase); // Don't pass it
|
|
113
155
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
156
|
+
// ❌ FORBIDDEN: Using base client directly for queries
|
|
157
|
+
const { data } = await supabase.from('users').select('*'); // Bypasses RLS
|
|
117
158
|
```
|
|
118
159
|
|
|
160
|
+
### Acceptable Exceptions
|
|
161
|
+
|
|
162
|
+
**The ONLY acceptable use of `createClient()` in consuming app code is:**
|
|
163
|
+
|
|
164
|
+
1. **Creating the base client for `UnifiedAuthProvider`** - This MUST be in one of these files:
|
|
165
|
+
- `src/main.tsx` (or `main.jsx`)
|
|
166
|
+
- `src/App.tsx` (or `App.jsx`)
|
|
167
|
+
- `src/lib/supabase.ts` (or `supabase.js`) - ONLY if this file is ONLY used to create the base client for the provider
|
|
168
|
+
|
|
169
|
+
**The file containing the base client creation MUST:**
|
|
170
|
+
- Be clearly named (e.g., `supabase.ts`, `main.tsx`)
|
|
171
|
+
- Only create the client once
|
|
172
|
+
- Pass it directly to `UnifiedAuthProvider` (not export it for general use)
|
|
173
|
+
- Include a comment explaining it's the base client for the provider
|
|
174
|
+
|
|
175
|
+
**NO OTHER EXCEPTIONS ARE PERMITTED** - All other uses of `createClient()` are security violations and MUST be fixed.
|
|
176
|
+
|
|
177
|
+
### Detection / Audit
|
|
178
|
+
|
|
179
|
+
- `rg "createClient\(" src` must return **exactly ONE match** in the file that creates the base client for `UnifiedAuthProvider`.
|
|
180
|
+
- That file MUST be one of: `main.tsx`, `App.tsx`, or `lib/supabase.ts` (or `.jsx`/`.js` equivalents).
|
|
181
|
+
- No `.from(` / `.rpc(` calls may be performed on an insecure client reference.
|
|
182
|
+
- All `useSecureSupabase()` calls should be without parameters.
|
|
183
|
+
|
|
119
184
|
## MUST: Setup RBAC Before Use
|
|
120
185
|
|
|
121
186
|
**You MUST call `setupRBAC()` before any RBAC usage.** This is non-negotiable.
|
|
@@ -240,13 +305,29 @@ import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core'
|
|
|
240
305
|
|
|
241
306
|
## MUST: Import Core Styles
|
|
242
307
|
|
|
243
|
-
**You MUST import pace-core styles:**
|
|
308
|
+
**You MUST import pace-core styles via app.css:**
|
|
309
|
+
|
|
310
|
+
The correct pattern is a two-file CSS architecture:
|
|
311
|
+
1. `src/app.css` - Contains `@import "@jmruthers/pace-core/styles/core.css";` (CSS @import)
|
|
312
|
+
2. `src/main.tsx` - Imports `./app.css` (JavaScript import)
|
|
244
313
|
|
|
245
314
|
```tsx
|
|
246
315
|
// main.tsx or App.tsx
|
|
247
|
-
import '
|
|
316
|
+
import './app.css'; // ✅ CORRECT - app.css imports core.css
|
|
248
317
|
```
|
|
249
318
|
|
|
319
|
+
```css
|
|
320
|
+
/* src/app.css */
|
|
321
|
+
@import "tailwindcss";
|
|
322
|
+
@import "@jmruthers/pace-core/styles/core.css"; // CSS @import, not JavaScript import
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**MUST NOT:**
|
|
326
|
+
- Import `core.css` directly in `main.tsx` or `App.tsx` - This causes duplicate imports
|
|
327
|
+
- Use JavaScript import for `core.css` - Use CSS `@import` in `app.css` instead
|
|
328
|
+
|
|
329
|
+
**See [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md) for complete CSS setup instructions.**
|
|
330
|
+
|
|
250
331
|
## MUST NOT: Use Inline Styles
|
|
251
332
|
|
|
252
333
|
**You MUST NOT use inline styles (`style={{...}}`).** All styling MUST come from pace-core components and Tailwind classes.
|
|
@@ -320,6 +401,27 @@ Before adding any styling:
|
|
|
320
401
|
7. **Missing styles** - Always import core.css
|
|
321
402
|
8. **Direct library imports** - Use pace-core wrappers instead
|
|
322
403
|
|
|
404
|
+
## Compliance Exceptions
|
|
405
|
+
|
|
406
|
+
**In general, pace-core compliance rules do NOT allow exceptions.** The rules are designed to ensure security, consistency, and maintainability across the PACE suite.
|
|
407
|
+
|
|
408
|
+
### When Exceptions Are NOT Allowed
|
|
409
|
+
|
|
410
|
+
- **Security rules** (e.g., `createClient()` usage) - NO exceptions except the one documented above
|
|
411
|
+
- **RBAC rules** - NO exceptions
|
|
412
|
+
- **Component usage** - NO exceptions (use pace-core components)
|
|
413
|
+
- **Hook usage** - NO exceptions (use pace-core hooks)
|
|
414
|
+
|
|
415
|
+
### Documenting Legitimate Edge Cases
|
|
416
|
+
|
|
417
|
+
If you encounter a situation where a rule seems to conflict with a legitimate requirement:
|
|
418
|
+
|
|
419
|
+
1. **First**: Verify that pace-core doesn't provide a solution
|
|
420
|
+
2. **Second**: Check if the requirement should be added to pace-core
|
|
421
|
+
3. **Third**: If truly unavoidable, document the case clearly with a comment explaining why
|
|
422
|
+
|
|
423
|
+
**Note**: Even with documentation, exceptions should be temporary, rare, reviewed, and tracked for eventual removal.
|
|
424
|
+
|
|
323
425
|
## Reference
|
|
324
426
|
|
|
325
427
|
- **pace-core Exports**: See `pace-core-exports.mdc` for complete export reference
|
|
@@ -9,6 +9,25 @@ rulesVersion: "2025-01-28"
|
|
|
9
9
|
|
|
10
10
|
This guide ensures consuming apps comply with all pace-core standards. Follow these standards to maintain quality, security, and consistency.
|
|
11
11
|
|
|
12
|
+
## MUST: Include Complete Cursor Ruleset
|
|
13
|
+
|
|
14
|
+
Consuming apps **MUST** include the complete pace-core ruleset in the repository so audits are deterministic and repeatable.
|
|
15
|
+
|
|
16
|
+
- **MUST** include these files under `.cursor/rules/` (exact filenames):
|
|
17
|
+
- `00-pace-core-compliance.mdc`
|
|
18
|
+
- `01-standards-compliance.mdc`
|
|
19
|
+
- `02-project-structure.mdc`
|
|
20
|
+
- `03-solid-principles.mdc`
|
|
21
|
+
- `06-code-quality.mdc`
|
|
22
|
+
- `07-tech-stack-compliance.mdc`
|
|
23
|
+
- `08-markup-quality.mdc`
|
|
24
|
+
- `09-rbac-compliance.mdc`
|
|
25
|
+
- `10-error-handling-patterns.mdc`
|
|
26
|
+
- `11-performance-optimization.mdc`
|
|
27
|
+
- **MUST NOT** rename or partially copy rules files.
|
|
28
|
+
- If a rule does not apply to a given app, document the exception and the reason, but keep the rule file present.
|
|
29
|
+
|
|
30
|
+
|
|
12
31
|
## Architecture Standard
|
|
13
32
|
|
|
14
33
|
### MUST: Follow Architecture Principles
|
|
@@ -171,6 +190,21 @@ type ApiError = { code: string; message: string; details?: object };
|
|
|
171
190
|
- ≥90% coverage for utils & hooks
|
|
172
191
|
- ≥70% coverage for components
|
|
173
192
|
|
|
193
|
+
|
|
194
|
+
### MUST: Enforce Coverage Thresholds in Tooling
|
|
195
|
+
|
|
196
|
+
Coverage requirements must be **machine-enforced**, not aspirational:
|
|
197
|
+
|
|
198
|
+
- **MUST** provide a script: `npm run test:coverage`
|
|
199
|
+
- **MUST** configure the test runner (Vitest/Jest) to enforce the thresholds:
|
|
200
|
+
- ≥90% for utils & hooks
|
|
201
|
+
- ≥70% for components
|
|
202
|
+
- **MUST** fail the command when thresholds are not met (CI or local execution).
|
|
203
|
+
|
|
204
|
+
**Verification:**
|
|
205
|
+
- `npm run test:coverage` exits non-zero when below threshold.
|
|
206
|
+
- A coverage summary artifact is produced (e.g., `coverage/coverage-summary.json` or equivalent).
|
|
207
|
+
|
|
174
208
|
### MUST: Use React Testing Library
|
|
175
209
|
|
|
176
210
|
**MUST use React Testing Library + userEvent for component tests.**
|
|
@@ -234,11 +268,18 @@ Before committing code, verify:
|
|
|
234
268
|
|
|
235
269
|
## Reference
|
|
236
270
|
|
|
237
|
-
See
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
-
|
|
241
|
-
-
|
|
242
|
-
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
271
|
+
**📚 Human-Readable Standard**: See [01-standards-compliance.md](../../packages/core/docs/standards/01-standards-compliance.md) for complete documentation.
|
|
272
|
+
|
|
273
|
+
**Related Standards** (all have corresponding cursor rules):
|
|
274
|
+
- **00-pace-core-compliance.mdc** - pace-core usage patterns
|
|
275
|
+
- **02-project-structure.mdc** - Project structure and organization
|
|
276
|
+
- **03-solid-principles.mdc** - SOLID architecture principles
|
|
277
|
+
- **04-testing-standards.mdc** - Testing framework standards
|
|
278
|
+
- **05-bug-reports-and-features.mdc** - Issue reporting templates
|
|
279
|
+
- **06-code-quality.mdc** - Code quality and TypeScript standards
|
|
280
|
+
- **07-tech-stack-compliance.mdc** - Tech stack and API/RPC standards
|
|
281
|
+
- **08-markup-quality.mdc** - Markup and styling standards
|
|
282
|
+
- **09-rbac-compliance.mdc** - RBAC and RLS standards
|
|
283
|
+
- **10-error-handling-patterns.mdc** - Error handling patterns
|
|
284
|
+
- **11-performance-optimization.mdc** - Performance optimization
|
|
285
|
+
- **12-ci-cd-integration.mdc** - CI/CD integration patterns
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Project Structure Standard
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [02-project-structure.md](../../packages/core/docs/standards/02-project-structure.md) for complete documentation including migration guides and detailed examples.
|
|
11
|
+
|
|
10
12
|
This guide defines the standard folder structure and file organization for consuming apps in the PACE suite.
|
|
11
13
|
|
|
12
14
|
## MUST: Follow Standard Directory Structure
|
|
@@ -98,6 +100,10 @@ src/
|
|
|
98
100
|
- Format: `YYYYMMDDHHMMSS_description.sql`
|
|
99
101
|
- Example: `20250115143022_add_user_preferences.sql`
|
|
100
102
|
|
|
103
|
+
- If this app **intentionally has no app-owned migrations** (e.g., relies on shared DB managed elsewhere), you MUST add `supabase/README.md` explaining:
|
|
104
|
+
- where migrations/RLS policies are managed
|
|
105
|
+
- whether the app is expected to add migrations in the future
|
|
106
|
+
|
|
101
107
|
## SHOULD: Organize by Domain
|
|
102
108
|
|
|
103
109
|
**For larger apps, SHOULD organize by domain/feature:**
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# SOLID Principles Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [03-solid-principles.md](../../packages/core/docs/standards/03-solid-principles.md) for complete documentation.
|
|
11
|
+
|
|
10
12
|
This guide enforces SOLID architecture principles to ensure maintainable, extensible, and testable code.
|
|
11
13
|
|
|
12
14
|
## Single Responsibility Principle (SRP)
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Testing Standards Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [04-testing-standards.md](../../packages/core/docs/standards/04-testing-standards.md) for complete documentation.
|
|
11
|
+
|
|
10
12
|
This guide ensures consistent, high-quality testing across consuming apps in the PACE suite.
|
|
11
13
|
|
|
12
14
|
## MUST: Meet Coverage Requirements
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Bug Reports and Feature Requests Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [05-bug-reports-and-features.md](../../packages/core/docs/standards/05-bug-reports-and-features.md) for complete documentation.
|
|
11
|
+
|
|
10
12
|
This guide provides standardized templates for reporting bugs and requesting features in pace-core. This is a reference guide - Cursor will use this for context when helping with issue reporting.
|
|
11
13
|
|
|
12
14
|
## Identifying Issues
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Code Quality Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [06-code-quality.md](../../packages/core/docs/standards/06-code-quality.md) for complete documentation.
|
|
11
|
+
|
|
10
12
|
This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
|
|
11
13
|
|
|
12
14
|
## TypeScript Standards
|
|
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Tech Stack Compliance Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [07-tech-stack-compliance.md](../../packages/core/docs/standards/07-tech-stack-compliance.md) for complete documentation.
|
|
11
|
+
|
|
10
12
|
This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
|
|
11
13
|
|
|
12
14
|
## Tailwind CSS v4
|
|
@@ -7,6 +7,27 @@ rulesVersion: "2025-01-28"
|
|
|
7
7
|
---
|
|
8
8
|
# Markup Quality Guide
|
|
9
9
|
|
|
10
|
+
**📚 Human-Readable Standard**: See [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md) for complete documentation including **CRITICAL CSS configuration requirements**.
|
|
11
|
+
|
|
12
|
+
**⚠️ IMPORTANT**: This rule is ALWAYS APPLIED. The standard includes required CSS setup that MUST be followed for pace-core components to render correctly.
|
|
13
|
+
|
|
14
|
+
## ⚠️ CRITICAL: CSS Configuration Required
|
|
15
|
+
|
|
16
|
+
**Before using pace-core components, you MUST configure CSS correctly.** Without proper configuration, pace-core components will appear unstyled or with incorrect styling.
|
|
17
|
+
|
|
18
|
+
**MUST read the standard for complete CSS setup instructions**: [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md)
|
|
19
|
+
|
|
20
|
+
**Quick checklist:**
|
|
21
|
+
- [ ] `src/app.css` exists with `@import "tailwindcss";`
|
|
22
|
+
- [ ] `@source` directives configured correctly (relative to CSS file location)
|
|
23
|
+
- [ ] `@import "@jmruthers/pace-core/styles/core.css";` in `app.css`
|
|
24
|
+
- [ ] All three color palettes defined (main, sec, acc) with all shades (50-950)
|
|
25
|
+
- [ ] `app.css` imported in `main.tsx` (NOT `core.css` directly)
|
|
26
|
+
|
|
27
|
+
**See the standard for detailed setup instructions and troubleshooting.**
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
10
31
|
This guide enforces clean markup standards, semantic HTML usage, and proper pace-core component patterns to ensure maintainable, accessible, and consistent code.
|
|
11
32
|
|
|
12
33
|
## pace-core First
|
|
@@ -88,41 +109,45 @@ import { Button, Input } from '@jmruthers/pace-core';
|
|
|
88
109
|
<footer>Footer</footer>
|
|
89
110
|
```
|
|
90
111
|
|
|
91
|
-
### MUST
|
|
112
|
+
### MUST: Prefer Semantic HTML (Limit `<div>`)
|
|
113
|
+
|
|
114
|
+
**You MUST prefer semantic HTML elements** (`<main>`, `<section>`, `<article>`, `<header>`, `<footer>`, `<nav>`, lists, etc.).
|
|
115
|
+
Using semantic elements improves accessibility, maintainability, and consistency.
|
|
116
|
+
|
|
117
|
+
#### `<div>` usage policy
|
|
118
|
+
|
|
119
|
+
- **MUST NOT** use `<div>` when a clear semantic element exists.
|
|
120
|
+
- `<div>` is **allowed only** for:
|
|
121
|
+
- purely presentational layout wrappers (flex/grid grouping) when no semantic element fits, OR
|
|
122
|
+
- React portal roots / app shell roots, OR
|
|
123
|
+
- third-party libraries that require specific DOM structure (document the reason in a short comment).
|
|
124
|
+
|
|
125
|
+
#### Severity guidance (for audits)
|
|
92
126
|
|
|
93
|
-
**
|
|
127
|
+
- **HIGH/BLOCKER**: `<div>` used in place of landmark/semantic structure (e.g., main page wrapper that should be `<main>`, navigation that should be `<nav>`, lists that should be `<ul>/<ol>`).
|
|
128
|
+
- **MEDIUM**: `<div>` used as a generic wrapper inside semantic structure where it could be a fragment or semantic element.
|
|
129
|
+
- **LOW**: `<div>` used for unavoidable third-party structure with a comment justifying it.
|
|
130
|
+
|
|
131
|
+
**Examples:**
|
|
94
132
|
|
|
95
133
|
```tsx
|
|
96
|
-
// ❌ WRONG:
|
|
97
|
-
<div className="
|
|
98
|
-
<div className="
|
|
134
|
+
// ❌ WRONG: Non-semantic page structure
|
|
135
|
+
<div className="page">
|
|
136
|
+
<div className="nav">...</div>
|
|
137
|
+
<div className="content">...</div>
|
|
99
138
|
</div>
|
|
100
139
|
|
|
101
|
-
// ✅ CORRECT:
|
|
140
|
+
// ✅ CORRECT: Semantic structure
|
|
102
141
|
<main>
|
|
103
|
-
<
|
|
142
|
+
<nav>...</nav>
|
|
143
|
+
<section>...</section>
|
|
104
144
|
</main>
|
|
105
|
-
// Or for grouping without semantic meaning:
|
|
106
|
-
<>
|
|
107
|
-
<Component1 />
|
|
108
|
-
<Component2 />
|
|
109
|
-
</>
|
|
110
|
-
```
|
|
111
145
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
// ✅ CORRECT: Choose appropriate semantic elements
|
|
118
|
-
<main>Main content</main>
|
|
119
|
-
<section>Section of content</section>
|
|
120
|
-
<article>Article content</article>
|
|
121
|
-
<header>Header content</header>
|
|
122
|
-
<footer>Footer content</footer>
|
|
123
|
-
<nav>Navigation</nav>
|
|
124
|
-
<ul><li>List items</li></ul>
|
|
125
|
-
<p>Paragraph text</p>
|
|
146
|
+
// ✅ ACCEPTABLE: Layout-only wrapper (no semantic fit)
|
|
147
|
+
// (Prefer fragments where possible)
|
|
148
|
+
<section>
|
|
149
|
+
<div className="flex gap-2">...</div>
|
|
150
|
+
</section>
|
|
126
151
|
```
|
|
127
152
|
|
|
128
153
|
## Typography & Styling
|