@jmruthers/pace-core 0.5.193 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +299 -0
- package/cursor-rules/01-standards-compliance.mdc +244 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +222 -0
- package/cursor-rules/04-testing-standards.mdc +268 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +309 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +119 -0
- package/cursor-rules/README.md +192 -0
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
- package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
- package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
- package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
- package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
- package/dist/chunk-24UVZUZG.js.map +1 -0
- package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
- package/dist/chunk-EHMR7VYL.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +15 -12
- package/dist/components.js.map +1 -1
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +59 -126
- package/dist/hooks.js +19 -28
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +63 -16
- package/dist/index.js +23 -24
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +146 -115
- package/dist/rbac/index.js +8 -11
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +15 -15
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +7 -1
- package/docs/api/classes/ColumnFactory.md +8 -8
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +18 -15
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +9 -2
- package/docs/api/interfaces/ButtonProps.md +7 -4
- package/docs/api/interfaces/CalendarProps.md +8 -5
- package/docs/api/interfaces/CardProps.md +8 -5
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +24 -21
- package/docs/api/interfaces/DataTableColumn.md +31 -31
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +26 -23
- package/docs/api/interfaces/FooterProps.md +10 -8
- package/docs/api/interfaces/FormFieldProps.md +10 -10
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +7 -4
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +14 -11
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +11 -11
- package/docs/api/interfaces/NavigationMenuProps.md +15 -15
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
- package/docs/api/interfaces/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +3 -3
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +4 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +14 -11
- package/docs/api/interfaces/UserMenuProps.md +8 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +575 -634
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +263 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +6 -28
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/standards/README.md +40 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +12 -6
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +454 -0
- package/scripts/audit/core/checks/documentation.cjs +203 -0
- package/scripts/audit/core/checks/environment.cjs +128 -0
- package/scripts/audit/core/checks/error-handling.cjs +299 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +86 -0
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/install-cursor-rules.cjs +236 -0
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +16 -4
- package/src/components/Button/Button.tsx +27 -4
- package/src/components/Calendar/Calendar.tsx +9 -3
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +40 -6
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +200 -561
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +9 -1
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +9 -1
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +8 -7
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +4 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- package/src/components/FileDisplay/FileDisplay.tsx +32 -18
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +15 -12
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +31 -26
- package/src/components/Header/Header.tsx +22 -11
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +36 -34
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +12 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +95 -438
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +22 -19
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +5 -1
- package/src/hooks/public/usePublicEventLogo.ts +5 -1
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +5 -1
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +4 -0
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +16 -2
- package/src/hooks/useFocusTrap.ts +7 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +4 -1
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +8 -1
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +3 -3
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/AuthServiceProvider.tsx +18 -0
- package/src/providers/services/EventServiceProvider.tsx +18 -0
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +14 -5
- package/src/rbac/api.ts +100 -67
- package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +5 -2
- package/src/rbac/components/PagePermissionGuard.tsx +158 -18
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +6 -2
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +21 -6
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +347 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +71 -64
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +33 -13
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.ts +212 -61
- package/src/rbac/types.ts +8 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-BC4IJKSL.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-IIELH4DL.js.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js +0 -412
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E.js +0 -68
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.map +0 -1
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -666
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce tech stack compliance including Tailwind v4, React 19+, Supabase, and other required technologies
|
|
3
|
+
globs: ["src/**/*.{ts,tsx,js,jsx,css}", "*.config.{ts,js}"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# Tech Stack Compliance Guide
|
|
9
|
+
|
|
10
|
+
This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
|
|
11
|
+
|
|
12
|
+
## Tailwind CSS v4
|
|
13
|
+
|
|
14
|
+
### MUST: Use Tailwind v4 CSS-First Approach
|
|
15
|
+
|
|
16
|
+
**MUST use Tailwind v4 CSS-first syntax, NOT v3 patterns:**
|
|
17
|
+
|
|
18
|
+
```css
|
|
19
|
+
/* ✅ CORRECT: Tailwind v4 CSS-first (@import 'tailwindcss'; @theme { ... }) */
|
|
20
|
+
/* ❌ WRONG: Tailwind v3 (@tailwind base/components/utilities directives) */
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### MUST NOT: Use Bracket Syntax
|
|
24
|
+
|
|
25
|
+
**MUST NOT use bracket syntax like `bg-[oklch(...)]`. Map everything through theme variables:**
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
// ❌ WRONG: Bracket syntax (bg-[oklch(...)])
|
|
29
|
+
// ✅ CORRECT: Theme variable (bg-main-500)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### MUST: Use Custom Color Namespaces
|
|
33
|
+
|
|
34
|
+
**MUST use custom color namespaces:**
|
|
35
|
+
- `main-*` for primary colors (green, emerald, teal, cyan, sky, blue)
|
|
36
|
+
- `sec-*` for secondary colors (indigo, violet, purple, fuchsia, slate, gray, zinc, neutral, stone)
|
|
37
|
+
- `acc-*` for accent colors (red, orange, amber, yellow, lime, pink, rose)
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
// ✅ CORRECT: Custom namespaces (main-*, sec-*, acc-*)
|
|
41
|
+
// ❌ WRONG: Standard Tailwind colors (blue-*, gray-*, red-*)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### MUST: Use Semantic Classes
|
|
45
|
+
|
|
46
|
+
**MUST use semantic classes mapped in index.css:**
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// ✅ CORRECT - Semantic classes
|
|
50
|
+
<div className="bg-background text-foreground">
|
|
51
|
+
|
|
52
|
+
// ❌ WRONG - Direct color classes (unless necessary)
|
|
53
|
+
<div className="bg-main-50 text-main-950">
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## React 19+
|
|
57
|
+
|
|
58
|
+
### MUST: Use React 19+ Features
|
|
59
|
+
|
|
60
|
+
**MUST use React 19+ patterns:**
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
// ✅ CORRECT: React 19+ features (Suspense, useTransition, etc.)
|
|
64
|
+
import { Suspense, useTransition } from 'react';
|
|
65
|
+
function App() {
|
|
66
|
+
const [isPending, startTransition] = useTransition();
|
|
67
|
+
return <Suspense fallback={<Loading />}><Component /></Suspense>;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### MUST: Use Functional Components
|
|
72
|
+
|
|
73
|
+
**MUST use functional components with hooks exclusively:**
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
// ✅ CORRECT: Functional components with hooks
|
|
77
|
+
function MyComponent() { const [state, setState] = useState(); return <div>...</div>; }
|
|
78
|
+
|
|
79
|
+
// ❌ WRONG: Class components
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Supabase
|
|
83
|
+
|
|
84
|
+
### MUST: Use Secure Supabase Client
|
|
85
|
+
|
|
86
|
+
**MUST use `useSecureSupabase()` for all database operations:**
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
// ✅ CORRECT: useSecureSupabase() from '@jmruthers/pace-core/rbac'
|
|
90
|
+
// ❌ WRONG: createClient() from '@supabase/supabase-js' (base client)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### MUST: Enforce RLS
|
|
94
|
+
|
|
95
|
+
**MUST ensure RLS is enabled on all tables. Never bypass RLS.**
|
|
96
|
+
|
|
97
|
+
### SHOULD: Use RPC Functions
|
|
98
|
+
|
|
99
|
+
**SHOULD use RPC functions for complex queries:**
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
// ✅ CORRECT: RPC functions for complex queries
|
|
103
|
+
const { data } = await secureSupabase.rpc('data_events_list', { organisation_id: orgId });
|
|
104
|
+
|
|
105
|
+
// ❌ AVOID: Complex client-side queries with many joins
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## TanStack Query
|
|
109
|
+
|
|
110
|
+
### MUST: Use TanStack Query for Server State
|
|
111
|
+
|
|
112
|
+
**MUST use TanStack Query for all server state management:**
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
// ✅ CORRECT: TanStack Query for server state
|
|
116
|
+
import { useQuery, useMutation } from '@tanstack/react-query';
|
|
117
|
+
const { data, isLoading } = useQuery({ queryKey: ['events', orgId], queryFn: () => fetchEvents(orgId) });
|
|
118
|
+
|
|
119
|
+
// ❌ WRONG: useState + useEffect for server state
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### SHOULD: Configure Query Client
|
|
123
|
+
|
|
124
|
+
**SHOULD configure QueryClient with appropriate defaults:**
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
// ✅ CORRECT: Configure QueryClient with appropriate defaults (staleTime, cacheTime, retry)
|
|
128
|
+
const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, cacheTime: 10 * 60 * 1000, retry: 1 } } });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## React Hook Form + Zod
|
|
132
|
+
|
|
133
|
+
### MUST: Use React Hook Form with Zod
|
|
134
|
+
|
|
135
|
+
**MUST use React Hook Form with Zod for all forms:**
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
// ✅ CORRECT: React Hook Form + Zod (useZodForm from pace-core)
|
|
139
|
+
import { useZodForm } from '@jmruthers/pace-core';
|
|
140
|
+
const schema = z.object({ email: z.string().email(), name: z.string().min(1) });
|
|
141
|
+
const form = useZodForm(schema);
|
|
142
|
+
|
|
143
|
+
// ❌ WRONG: Manual form handling (useState for form state)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Vite
|
|
147
|
+
|
|
148
|
+
### MUST: Use Vite for Build Tooling
|
|
149
|
+
|
|
150
|
+
**MUST use Vite for all build tooling:**
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// ✅ CORRECT: Vite for build tooling
|
|
154
|
+
import { defineConfig } from 'vite';
|
|
155
|
+
import react from '@vitejs/plugin-react';
|
|
156
|
+
export default defineConfig({ plugins: [react()] });
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### MUST: Use Environment Variables Correctly
|
|
160
|
+
|
|
161
|
+
**MUST use `import.meta.env` for environment variables:**
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
// ✅ CORRECT: import.meta.env.VITE_API_URL (Vite env vars)
|
|
165
|
+
// ❌ WRONG: process.env.VITE_API_URL (Node.js env vars)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## TypeScript
|
|
169
|
+
|
|
170
|
+
### MUST: Use TypeScript 5+
|
|
171
|
+
|
|
172
|
+
**MUST use TypeScript 5+ with strict mode:**
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
// ✅ CORRECT: TypeScript 5+ with strict mode
|
|
176
|
+
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "strict": true } }
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Version Requirements
|
|
180
|
+
|
|
181
|
+
### MUST: Use Required Versions
|
|
182
|
+
|
|
183
|
+
**MUST use compatible versions:**
|
|
184
|
+
|
|
185
|
+
- React: `^19.0.0`
|
|
186
|
+
- TypeScript: `^5.0.0`
|
|
187
|
+
- Tailwind CSS: `^4.0.0`
|
|
188
|
+
- Vite: `^6.0.0`
|
|
189
|
+
- Supabase: `^2.49.0+`
|
|
190
|
+
|
|
191
|
+
**Check `package.json` for exact versions required by pace-core.**
|
|
192
|
+
|
|
193
|
+
## Tech Stack Checklist
|
|
194
|
+
|
|
195
|
+
Before committing, verify:
|
|
196
|
+
- [ ] Tailwind v4 CSS-first syntax (no @tailwind directives)
|
|
197
|
+
- [ ] No bracket syntax for colors (use theme variables)
|
|
198
|
+
- [ ] Custom color namespaces (main-*, sec-*, acc-*)
|
|
199
|
+
- [ ] React 19+ functional components
|
|
200
|
+
- [ ] Secure Supabase client (useSecureSupabase)
|
|
201
|
+
- [ ] TanStack Query for server state
|
|
202
|
+
- [ ] React Hook Form + Zod for forms
|
|
203
|
+
- [ ] Vite for build tooling
|
|
204
|
+
- [ ] TypeScript 5+ with strict mode
|
|
205
|
+
- [ ] All versions compatible with pace-core
|
|
206
|
+
|
|
207
|
+
## Reference
|
|
208
|
+
|
|
209
|
+
- Tailwind v4: https://tailwindcss.com/blog/tailwindcss-v4
|
|
210
|
+
- React 19: https://react.dev/blog/2024/04/25/react-19-upgrade-guide
|
|
211
|
+
- Supabase: https://supabase.com/docs
|
|
212
|
+
- TanStack Query: https://tanstack.com/query
|
|
213
|
+
- React Hook Form: https://react-hook-form.com
|
|
214
|
+
- Vite: https://vitejs.dev
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
3
|
+
globs: ["src/**/*.{ts,tsx,js,jsx}"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# Markup Quality Guide
|
|
9
|
+
|
|
10
|
+
This guide enforces clean markup standards, semantic HTML usage, and proper pace-core component patterns to ensure maintainable, accessible, and consistent code.
|
|
11
|
+
|
|
12
|
+
## pace-core First
|
|
13
|
+
|
|
14
|
+
### MUST: Use pace-core Components
|
|
15
|
+
|
|
16
|
+
**MUST use pace-core components wherever possible:**
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
// ❌ WRONG: Custom button or native HTML element
|
|
20
|
+
<button className="btn-primary">Click me</button>
|
|
21
|
+
<input type="text" className="form-input" />
|
|
22
|
+
|
|
23
|
+
// ✅ CORRECT: Use pace-core components
|
|
24
|
+
import { Button, Input } from '@jmruthers/pace-core';
|
|
25
|
+
<Button>Click me</Button>
|
|
26
|
+
<Input type="text" />
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### MUST NOT: Add Custom Styles to pace-core Components
|
|
30
|
+
|
|
31
|
+
**MUST NOT add custom styles when pace-core components already provide styling:**
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
// ❌ WRONG: Overriding pace-core component styles
|
|
35
|
+
<Button className="custom-button-style">Click me</Button>
|
|
36
|
+
<Card className="custom-card-layout">Content</Card>
|
|
37
|
+
|
|
38
|
+
// ✅ CORRECT: Use pace-core component variants/props
|
|
39
|
+
<Button variant="default">Click me</Button>
|
|
40
|
+
<Card>Content</Card>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### MUST: Rely on pace-core core.css
|
|
44
|
+
|
|
45
|
+
**MUST rely on pace-core `core.css` for typography, spacing, and visual presentation:**
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
// ❌ WRONG: Custom typography classes
|
|
49
|
+
<h1 className="text-2xl font-bold">Title</h1>
|
|
50
|
+
<p className="text-gray-500 mb-4">Description</p>
|
|
51
|
+
|
|
52
|
+
// ✅ CORRECT: Typography defined in pace-core core.css
|
|
53
|
+
<h1>Title</h1>
|
|
54
|
+
<p>Description</p>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### SHOULD: Fall Back to Semantic HTML
|
|
58
|
+
|
|
59
|
+
**SHOULD only use plain semantic HTML when no suitable pace-core component exists:**
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
// ✅ CORRECT: Use semantic HTML when pace-core doesn't provide component
|
|
63
|
+
<main>
|
|
64
|
+
<section>
|
|
65
|
+
<article>
|
|
66
|
+
<h2>Article Title</h2>
|
|
67
|
+
<p>Article content</p>
|
|
68
|
+
</article>
|
|
69
|
+
</section>
|
|
70
|
+
</main>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Semantic HTML Only
|
|
74
|
+
|
|
75
|
+
### MUST: Use Semantic HTML Elements
|
|
76
|
+
|
|
77
|
+
**MUST use semantic HTML elements for their intended purpose:**
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
// ❌ WRONG: Non-semantic elements
|
|
81
|
+
<div onClick={handleClick}>Click me</div>
|
|
82
|
+
<div className="header">Header</div>
|
|
83
|
+
<div className="footer">Footer</div>
|
|
84
|
+
|
|
85
|
+
// ✅ CORRECT: Semantic HTML elements
|
|
86
|
+
<button onClick={handleClick}>Click me</button>
|
|
87
|
+
<header>Header</header>
|
|
88
|
+
<footer>Footer</footer>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### MUST NOT: Use `<div>` Elements
|
|
92
|
+
|
|
93
|
+
**MUST NOT use `<div>` elements (except for the first child of `<body>` in `index.html`, React portals, or when required by third-party libraries that mandate specific DOM structure):**
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
// ❌ WRONG: Using div elements
|
|
97
|
+
<div className="container">
|
|
98
|
+
<div className="content">Content</div>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
// ✅ CORRECT: Use semantic elements or React Fragments
|
|
102
|
+
<main>
|
|
103
|
+
<section>Content</section>
|
|
104
|
+
</main>
|
|
105
|
+
// Or for grouping without semantic meaning:
|
|
106
|
+
<>
|
|
107
|
+
<Component1 />
|
|
108
|
+
<Component2 />
|
|
109
|
+
</>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### MUST: Choose Most Semantic Element
|
|
113
|
+
|
|
114
|
+
**MUST choose the most semantically accurate element for the content:**
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
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>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Typography & Styling
|
|
129
|
+
|
|
130
|
+
### MUST NOT: Apply Typography Styles Directly
|
|
131
|
+
|
|
132
|
+
**MUST NOT apply typography styles directly to elements:**
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
// ❌ WRONG: Direct typography styling
|
|
136
|
+
<h1 className="text-2xl font-bold">Title</h1>
|
|
137
|
+
<p className="text-gray-500 leading-relaxed">Description</p>
|
|
138
|
+
<label className="text-sm uppercase">Label</label>
|
|
139
|
+
|
|
140
|
+
// ✅ CORRECT: Typography defined in pace-core core.css
|
|
141
|
+
<h1>Title</h1>
|
|
142
|
+
<p>Description</p>
|
|
143
|
+
<label>Label</label>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### MUST: Use pace-core Typography
|
|
147
|
+
|
|
148
|
+
**MUST rely on typography defined exclusively in `pace-core core.css`:**
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
// ✅ CORRECT: Typography comes from pace-core core.css
|
|
152
|
+
<h1>Heading 1</h1>
|
|
153
|
+
<h2>Heading 2</h2>
|
|
154
|
+
<h3>Heading 3</h3>
|
|
155
|
+
<p>Paragraph text</p>
|
|
156
|
+
<label>Form label</label>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### MUST NOT: Add Typography Utilities
|
|
160
|
+
|
|
161
|
+
**MUST NOT add utility classes, inline styles, or custom CSS for typography:**
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
// ❌ WRONG: Typography utilities or inline styles
|
|
165
|
+
<h1 className="text-3xl font-bold mb-4">Title</h1>
|
|
166
|
+
<p style={{ fontSize: '14px', color: 'gray' }}>Text</p>
|
|
167
|
+
<label className="uppercase tracking-wide">Label</label>
|
|
168
|
+
|
|
169
|
+
// ✅ CORRECT: No typography styling - pace-core handles it
|
|
170
|
+
<h1>Title</h1>
|
|
171
|
+
<p>Text</p>
|
|
172
|
+
<label>Label</label>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## React Structure Rules
|
|
176
|
+
|
|
177
|
+
### MUST NOT: Add Wrapper Elements for Single Root
|
|
178
|
+
|
|
179
|
+
**MUST NOT add wrapper elements solely to satisfy React's single-root requirement:**
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
// ❌ WRONG: Unnecessary wrapper for single root
|
|
183
|
+
function Component() {
|
|
184
|
+
return (
|
|
185
|
+
<div>
|
|
186
|
+
<Header />
|
|
187
|
+
<Main />
|
|
188
|
+
<Footer />
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ✅ CORRECT: Use React Fragment
|
|
194
|
+
function Component() {
|
|
195
|
+
return (
|
|
196
|
+
<>
|
|
197
|
+
<Header />
|
|
198
|
+
<Main />
|
|
199
|
+
<Footer />
|
|
200
|
+
</>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### MUST: Use React Fragments
|
|
206
|
+
|
|
207
|
+
**MUST use React Fragments for grouping without adding DOM elements:**
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
// ✅ CORRECT: Use React Fragments
|
|
211
|
+
function Component() {
|
|
212
|
+
return (
|
|
213
|
+
<>
|
|
214
|
+
<Component1 />
|
|
215
|
+
<Component2 />
|
|
216
|
+
<Component3 />
|
|
217
|
+
</>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### MUST NOT: Add Extra Elements
|
|
223
|
+
|
|
224
|
+
**MUST NOT introduce extra elements that provide no semantic or functional value:**
|
|
225
|
+
|
|
226
|
+
```tsx
|
|
227
|
+
// ❌ WRONG: Extra wrapper with no purpose
|
|
228
|
+
<article>
|
|
229
|
+
<div>
|
|
230
|
+
<h2>Title</h2>
|
|
231
|
+
<p>Content</p>
|
|
232
|
+
</div>
|
|
233
|
+
</article>
|
|
234
|
+
|
|
235
|
+
// ✅ CORRECT: Direct semantic structure
|
|
236
|
+
<article>
|
|
237
|
+
<h2>Title</h2>
|
|
238
|
+
<p>Content</p>
|
|
239
|
+
</article>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Styling & Layout Discipline
|
|
243
|
+
|
|
244
|
+
### MUST NOT: Add Wrappers for Styling
|
|
245
|
+
|
|
246
|
+
**MUST NOT add wrapper elements just to apply styles:**
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
// ❌ WRONG: Wrapper element for styling only
|
|
250
|
+
<div className="flex gap-4">
|
|
251
|
+
<Button>Button 1</Button>
|
|
252
|
+
<Button>Button 2</Button>
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
// ✅ CORRECT: Apply styles to existing parent or use pace-core components
|
|
256
|
+
<section className="flex gap-4">
|
|
257
|
+
<Button>Button 1</Button>
|
|
258
|
+
<Button>Button 2</Button>
|
|
259
|
+
</section>
|
|
260
|
+
// Or if no semantic parent exists, leave unstyled or use pace-core layout components
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### SHOULD: Apply Styles to Existing Elements
|
|
264
|
+
|
|
265
|
+
**SHOULD apply styles to existing parent components:**
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
// ✅ CORRECT: Apply styles to semantic parent
|
|
269
|
+
<main className="flex flex-col gap-4">
|
|
270
|
+
<section>Content 1</section>
|
|
271
|
+
<section>Content 2</section>
|
|
272
|
+
</main>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### SHOULD: Leave Unstyled When Appropriate
|
|
276
|
+
|
|
277
|
+
**SHOULD leave elements unstyled if styles aren't necessary:**
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
// ✅ CORRECT: Unstyled semantic structure
|
|
281
|
+
<article>
|
|
282
|
+
<h2>Title</h2>
|
|
283
|
+
<p>Content</p>
|
|
284
|
+
</article>
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### MUST: Use pace-core for Layout
|
|
288
|
+
|
|
289
|
+
**MUST assume most layout and styling will be handled by pace-core, not ad-hoc wrappers:**
|
|
290
|
+
|
|
291
|
+
```tsx
|
|
292
|
+
// ❌ WRONG: Custom layout wrapper
|
|
293
|
+
<div className="grid grid-cols-2 gap-4">
|
|
294
|
+
<Card>Card 1</Card>
|
|
295
|
+
<Card>Card 2</Card>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
// ✅ CORRECT: Use pace-core layout components or apply to semantic parent
|
|
299
|
+
<section className="grid grid-cols-2 gap-4">
|
|
300
|
+
<Card>Card 1</Card>
|
|
301
|
+
<Card>Card 2</Card>
|
|
302
|
+
</section>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Element Minimisation
|
|
306
|
+
|
|
307
|
+
### MUST: Use Fewest Elements Possible
|
|
308
|
+
|
|
309
|
+
**MUST use the fewest elements possible to achieve the desired structure:**
|
|
310
|
+
|
|
311
|
+
```tsx
|
|
312
|
+
// ❌ WRONG: Unnecessary nesting
|
|
313
|
+
<main>
|
|
314
|
+
<div>
|
|
315
|
+
<section>
|
|
316
|
+
<div>
|
|
317
|
+
<article>Content</article>
|
|
318
|
+
</div>
|
|
319
|
+
</section>
|
|
320
|
+
</div>
|
|
321
|
+
</main>
|
|
322
|
+
|
|
323
|
+
// ✅ CORRECT: Minimal structure
|
|
324
|
+
<main>
|
|
325
|
+
<section>
|
|
326
|
+
<article>Content</article>
|
|
327
|
+
</section>
|
|
328
|
+
</main>
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### MUST NOT: Create Redundant Nesting
|
|
332
|
+
|
|
333
|
+
**MUST NOT create redundant nesting:**
|
|
334
|
+
|
|
335
|
+
```tsx
|
|
336
|
+
// ❌ WRONG: Redundant wrapper
|
|
337
|
+
<article>
|
|
338
|
+
<div>
|
|
339
|
+
<h2>Title</h2>
|
|
340
|
+
</div>
|
|
341
|
+
<div>
|
|
342
|
+
<p>Content</p>
|
|
343
|
+
</div>
|
|
344
|
+
</article>
|
|
345
|
+
|
|
346
|
+
// ✅ CORRECT: Direct structure
|
|
347
|
+
<article>
|
|
348
|
+
<h2>Title</h2>
|
|
349
|
+
<p>Content</p>
|
|
350
|
+
</article>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### MUST: Clear Semantic Purpose
|
|
354
|
+
|
|
355
|
+
**MUST ensure every element has a clear semantic purpose:**
|
|
356
|
+
|
|
357
|
+
```tsx
|
|
358
|
+
// ❌ WRONG: Element without semantic purpose
|
|
359
|
+
<div>
|
|
360
|
+
<Component1 />
|
|
361
|
+
<Component2 />
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
// ✅ CORRECT: Semantic purpose or Fragment
|
|
365
|
+
<section>
|
|
366
|
+
<Component1 />
|
|
367
|
+
<Component2 />
|
|
368
|
+
</section>
|
|
369
|
+
// Or if no semantic grouping needed:
|
|
370
|
+
<>
|
|
371
|
+
<Component1 />
|
|
372
|
+
<Component2 />
|
|
373
|
+
</>
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## Prohibited Patterns
|
|
377
|
+
|
|
378
|
+
### MUST NOT: Use These Patterns
|
|
379
|
+
|
|
380
|
+
**MUST NOT use the following patterns:**
|
|
381
|
+
|
|
382
|
+
1. **`<div>` elements** - Use semantic HTML or React Fragments instead
|
|
383
|
+
2. **Wrapper elements for styling only** - Apply styles to existing elements or use pace-core components
|
|
384
|
+
3. **Wrapper elements as sole child** - Use React Fragments instead
|
|
385
|
+
4. **Custom typography classes** - Typography is defined in pace-core core.css
|
|
386
|
+
5. **Inline styles for typography** - Use pace-core typography
|
|
387
|
+
6. **Duplicating pace-core layout/visuals** - Use pace-core components instead
|
|
388
|
+
|
|
389
|
+
```tsx
|
|
390
|
+
// ❌ WRONG: All prohibited patterns
|
|
391
|
+
<div className="wrapper">
|
|
392
|
+
<div className="content">
|
|
393
|
+
<h1 className="text-2xl font-bold">Title</h1>
|
|
394
|
+
<p style={{ color: 'gray' }}>Text</p>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
|
|
398
|
+
// ✅ CORRECT: Clean, semantic markup
|
|
399
|
+
<main>
|
|
400
|
+
<section>
|
|
401
|
+
<h1>Title</h1>
|
|
402
|
+
<p>Text</p>
|
|
403
|
+
</section>
|
|
404
|
+
</main>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## Expected Outcome
|
|
408
|
+
|
|
409
|
+
### Code Quality Goals
|
|
410
|
+
|
|
411
|
+
Code produced under these rules SHOULD:
|
|
412
|
+
|
|
413
|
+
- **Be semantically correct** - Use appropriate HTML elements for their purpose
|
|
414
|
+
- **Be visually consistent** - Rely on pace-core for styling and typography
|
|
415
|
+
- **Contain minimal markup** - Use fewest elements necessary
|
|
416
|
+
- **Avoid unnecessary abstraction** - No wrappers without purpose
|
|
417
|
+
- **Remain easy to reason about** - Clear structure and purpose
|
|
418
|
+
- **Be easy to refactor** - Minimal coupling and dependencies
|
|
419
|
+
|
|
420
|
+
### Decision Tree
|
|
421
|
+
|
|
422
|
+
**When in doubt, follow this decision tree:**
|
|
423
|
+
|
|
424
|
+
1. **Does pace-core provide a component?** → Use pace-core component
|
|
425
|
+
2. **Is a semantic HTML element appropriate?** → Use semantic element (`<main>`, `<section>`, `<article>`, etc.)
|
|
426
|
+
3. **Do I need to group elements without semantic meaning?** → Use React Fragment (`<>...</>`)
|
|
427
|
+
4. **Do I need styling?** → Apply to existing semantic parent or use pace-core layout components
|
|
428
|
+
5. **Still unsure?** → Remove the element, remove the style, and rely on pace-core or semantic HTML
|
|
429
|
+
|
|
430
|
+
## Markup Quality Checklist
|
|
431
|
+
|
|
432
|
+
Before committing code, verify:
|
|
433
|
+
|
|
434
|
+
- [ ] No `<div>` elements (except first child of `<body>` in `index.html`)
|
|
435
|
+
- [ ] pace-core components used where available
|
|
436
|
+
- [ ] Semantic HTML elements used appropriately
|
|
437
|
+
- [ ] No typography styling applied directly
|
|
438
|
+
- [ ] No wrapper elements for styling only
|
|
439
|
+
- [ ] React Fragments used instead of unnecessary wrappers
|
|
440
|
+
- [ ] Minimal element nesting
|
|
441
|
+
- [ ] Every element has clear semantic purpose
|
|
442
|
+
- [ ] No custom styles overriding pace-core components
|
|
443
|
+
- [ ] Layout handled by pace-core or semantic parents
|
|
444
|
+
- [ ] Code is semantically correct and accessible
|
|
445
|
+
|
|
446
|
+
## Reference
|
|
447
|
+
|
|
448
|
+
- **pace-core Components**: See `00-pace-core-compliance.mdc` for component usage
|
|
449
|
+
- **Semantic HTML**: https://developer.mozilla.org/en-US/docs/Glossary/Semantics
|
|
450
|
+
- **React Fragments**: https://react.dev/reference/react/Fragment
|
|
451
|
+
- **Accessibility**: See `06-code-quality.mdc` for accessibility requirements
|
|
452
|
+
- **When in doubt**: Remove the element, remove the style, and rely on pace-core or semantic HTML
|