@jmruthers/pace-core 0.6.1 → 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 +43 -10
- package/cursor-rules/00-pace-core-compliance.mdc +18 -91
- package/cursor-rules/01-standards-compliance.mdc +16 -47
- package/cursor-rules/02-project-structure.mdc +4 -4
- package/cursor-rules/03-solid-principles.mdc +45 -164
- package/cursor-rules/04-testing-standards.mdc +22 -69
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
- package/cursor-rules/06-code-quality.mdc +42 -125
- package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +18 -0
- package/cursor-rules/README.md +2 -1
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +356 -111
- package/dist/{UnifiedAuthProvider-ATAP5UTR.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-4N5C5XZU.js → chunk-2UOI2FG5.js} +4 -4
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-T33XF5ZC.js → chunk-3XC4CPTD.js} +4317 -3963
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-BYFSK72L.js → chunk-EHMR7VYL.js} +4 -4
- 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-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
- 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-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-3XTALGJF.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-NECFR5MM.js} +254 -170
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-JBKQ3SAO.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-XWQCNGTQ.js} +724 -363
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +14 -11
- 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 +55 -122
- package/dist/hooks.js +8 -12
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +19 -19
- 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 +145 -114
- 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-BJAlWfuJ.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +31 -1
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +14 -14
- 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 +2 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +2 -24
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -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 +1 -0
- package/package.json +2 -1
- 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} +714 -687
- 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 +61 -936
- 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/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__/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 +14 -0
- package/src/components/Button/Button.tsx +22 -0
- package/src/components/Calendar/Calendar.tsx +8 -2
- 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.tsx +38 -4
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- 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 +196 -554
- 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 +8 -0
- 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 +8 -0
- 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 +61 -849
- 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/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 +12 -0
- 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/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/Dialog/Dialog.tsx +2 -2
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +3 -0
- 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 +14 -11
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Header/Header.tsx +21 -10
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +8 -4
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoginForm/LoginForm.tsx +4 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
- 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.test.tsx +4 -2
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +32 -11
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +80 -434
- 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 +4 -5
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.tsx +4 -0
- package/src/components/Tooltip/Tooltip.tsx +2 -2
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +21 -18
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +4 -0
- package/src/hooks/public/usePublicEventLogo.ts +4 -0
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +4 -0
- 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/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 +14 -0
- package/src/hooks/useFocusTrap.ts +3 -0
- package/src/hooks/useInactivityTracker.ts +3 -0
- 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 +7 -0
- 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 +1 -1
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- 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 +36 -0
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +2 -2
- 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/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +157 -17
- package/src/rbac/components/RoleBasedRouter.tsx +5 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +20 -5
- 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 +200 -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/dist/chunk-3QRJFVBR.js.map +0 -1
- package/dist/chunk-3XTALGJF.js.map +0 -1
- package/dist/chunk-4N5C5XZU.js.map +0 -1
- package/dist/chunk-4ZC4GX36.js.map +0 -1
- package/dist/chunk-BYFSK72L.js.map +0 -1
- package/dist/chunk-EXUD6RNJ.js +0 -451
- package/dist/chunk-EXUD6RNJ.js.map +0 -1
- package/dist/chunk-GLK6VM3F.js.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-JBKQ3SAO.js.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-LXQLPRQ2.js.map +0 -1
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-T33XF5ZC.js.map +0 -1
- package/dist/chunk-XM25TVIE.js.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 -681
- /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.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/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
|
@@ -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
|
|
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
- **08-markup-quality.mdc** - Enforces clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
12
|
+
|
|
13
|
+
## [1.1.0] - 2025-01-28
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **08-markup-quality.mdc** - Comprehensive guide for markup quality, semantic HTML, and pace-core component usage patterns
|
|
17
|
+
- Enforces pace-core component usage over custom solutions
|
|
18
|
+
- Prohibits `<div>` elements (except first child of `<body>` in `index.html`)
|
|
19
|
+
- Requires semantic HTML elements (`<main>`, `<section>`, `<article>`, etc.)
|
|
20
|
+
- Prohibits typography styling (relies on pace-core core.css)
|
|
21
|
+
- Requires React Fragments for grouping without semantic meaning
|
|
22
|
+
- Enforces minimal element nesting and clear semantic purpose
|
|
23
|
+
- Includes decision tree and comprehensive checklist
|
|
24
|
+
|
|
25
|
+
## [1.0.0] - 2025-01-15
|
|
26
|
+
|
|
10
27
|
### Added
|
|
11
28
|
- Initial release of cursor rules system
|
|
12
29
|
- 8 comprehensive rule files covering compliance, standards, structure, SOLID, testing, bug reports, code quality, and tech stack
|
|
@@ -89,6 +106,7 @@ This ensures pace-core rules (00-09) load first.
|
|
|
89
106
|
|
|
90
107
|
## Version History
|
|
91
108
|
|
|
109
|
+
- **1.1.0** (2025-01-28) - Added markup quality rule (08-markup-quality.mdc)
|
|
92
110
|
- **1.0.0** (2025-01-15) - Initial release
|
|
93
111
|
|
|
94
112
|
## Future Enhancements
|
package/cursor-rules/README.md
CHANGED
|
@@ -38,7 +38,7 @@ Copy all `.mdc` files from `node_modules/@jmruthers/pace-core/cursor-rules/` to
|
|
|
38
38
|
|
|
39
39
|
## Rule Files
|
|
40
40
|
|
|
41
|
-
The rules are numbered for ordering (00-
|
|
41
|
+
The rules are numbered for ordering (00-08):
|
|
42
42
|
|
|
43
43
|
- **00-pace-core-compliance.mdc** - Enforce pace-core usage patterns
|
|
44
44
|
- **01-standards-compliance.mdc** - Enforce all pace-core standards
|
|
@@ -48,6 +48,7 @@ The rules are numbered for ordering (00-07):
|
|
|
48
48
|
- **05-bug-reports-and-features.mdc** - Templates for bug reports and feature requests (guidance-only)
|
|
49
49
|
- **06-code-quality.mdc** - Enforce code quality standards
|
|
50
50
|
- **07-tech-stack-compliance.mdc** - Enforce tech stack versions and patterns
|
|
51
|
+
- **08-markup-quality.mdc** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
51
52
|
|
|
52
53
|
## Rule Numbering System
|
|
53
54
|
|
|
@@ -141,10 +141,21 @@ declare class EventService extends BaseService implements IEventService {
|
|
|
141
141
|
getNextEventByDate(events?: Event[]): Event | null;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
/**
|
|
145
|
+
* Event service context type.
|
|
146
|
+
* Provides event service instance to React components.
|
|
147
|
+
*/
|
|
144
148
|
interface EventServiceContextType {
|
|
145
149
|
eventService: EventService;
|
|
146
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Context for EventService.
|
|
153
|
+
* Provides event service instance to React components.
|
|
154
|
+
*/
|
|
147
155
|
declare const EventServiceContext: React__default.Context<EventServiceContextType | null>;
|
|
156
|
+
/**
|
|
157
|
+
* Props for the EventServiceProvider component.
|
|
158
|
+
*/
|
|
148
159
|
interface EventServiceProviderProps {
|
|
149
160
|
children: React__default.ReactNode;
|
|
150
161
|
supabaseClient: SupabaseClient;
|
|
@@ -154,6 +165,13 @@ interface EventServiceProviderProps {
|
|
|
154
165
|
selectedOrganisation: Organisation | null;
|
|
155
166
|
setSelectedEventId: (eventId: string | null) => void;
|
|
156
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* React provider for EventService.
|
|
170
|
+
* Provides event service instance to React components.
|
|
171
|
+
*
|
|
172
|
+
* @param props - Event service provider configuration
|
|
173
|
+
* @returns The event service provider
|
|
174
|
+
*/
|
|
157
175
|
declare function EventServiceProvider({ children, supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId }: EventServiceProviderProps): react_jsx_runtime.JSX.Element;
|
|
158
176
|
|
|
159
177
|
/**
|
|
@@ -246,16 +264,34 @@ declare class OrganisationService extends BaseService implements IOrganisationSe
|
|
|
246
264
|
private clearAllCachedData;
|
|
247
265
|
}
|
|
248
266
|
|
|
267
|
+
/**
|
|
268
|
+
* Organisation service context type.
|
|
269
|
+
* Provides organisation service instance to React components.
|
|
270
|
+
*/
|
|
249
271
|
interface OrganisationServiceContextType {
|
|
250
272
|
organisationService: OrganisationService;
|
|
251
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Context for OrganisationService.
|
|
276
|
+
* Provides organisation service instance to React components.
|
|
277
|
+
*/
|
|
252
278
|
declare const OrganisationServiceContext: React__default.Context<OrganisationServiceContextType | null>;
|
|
279
|
+
/**
|
|
280
|
+
* Props for the OrganisationServiceProvider component.
|
|
281
|
+
*/
|
|
253
282
|
interface OrganisationServiceProviderProps {
|
|
254
283
|
children: React__default.ReactNode;
|
|
255
284
|
supabaseClient: SupabaseClient;
|
|
256
285
|
user: User | null;
|
|
257
286
|
session: Session | null;
|
|
258
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* React provider for OrganisationService.
|
|
290
|
+
* Provides organisation service instance to React components.
|
|
291
|
+
*
|
|
292
|
+
* @param props - Organisation service provider configuration
|
|
293
|
+
* @returns The organisation service provider
|
|
294
|
+
*/
|
|
259
295
|
declare function OrganisationServiceProvider({ children, supabaseClient, user, session }: OrganisationServiceProviderProps): react_jsx_runtime.JSX.Element;
|
|
260
296
|
|
|
261
297
|
/**
|
|
@@ -343,10 +379,21 @@ declare class InactivityService extends BaseService implements IInactivityServic
|
|
|
343
379
|
private setupEventHandlers;
|
|
344
380
|
}
|
|
345
381
|
|
|
382
|
+
/**
|
|
383
|
+
* Inactivity service context type.
|
|
384
|
+
* Provides inactivity service instance to React components.
|
|
385
|
+
*/
|
|
346
386
|
interface InactivityServiceContextType {
|
|
347
387
|
inactivityService: InactivityService;
|
|
348
388
|
}
|
|
389
|
+
/**
|
|
390
|
+
* Context for InactivityService.
|
|
391
|
+
* Provides inactivity service instance to React components.
|
|
392
|
+
*/
|
|
349
393
|
declare const InactivityServiceContext: React__default.Context<InactivityServiceContextType | null>;
|
|
394
|
+
/**
|
|
395
|
+
* Props for the InactivityServiceProvider component.
|
|
396
|
+
*/
|
|
350
397
|
interface InactivityServiceProviderProps {
|
|
351
398
|
children: React__default.ReactNode;
|
|
352
399
|
supabaseClient: SupabaseClient;
|
|
@@ -356,6 +403,13 @@ interface InactivityServiceProviderProps {
|
|
|
356
403
|
warnBeforeMs: number;
|
|
357
404
|
onIdleLogout: (reason: 'inactivity') => void;
|
|
358
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* React provider for InactivityService.
|
|
408
|
+
* Provides inactivity service instance to React components.
|
|
409
|
+
*
|
|
410
|
+
* @param props - Inactivity service provider configuration
|
|
411
|
+
* @returns The inactivity service provider
|
|
412
|
+
*/
|
|
359
413
|
declare function InactivityServiceProvider({ children, supabaseClient, user, session, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
|
|
360
414
|
warnBeforeMs, // REQUIRED: No default - must be explicitly provided
|
|
361
415
|
onIdleLogout }: InactivityServiceProviderProps): react_jsx_runtime.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-
|
|
2
|
+
import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-CkbwOr4Y.js';
|
|
3
3
|
import React__default from 'react';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -129,6 +129,38 @@ interface DataTableProps<TData extends DataRecord> {
|
|
|
129
129
|
*
|
|
130
130
|
* Features are configured through the unified `features` prop for maximum flexibility.
|
|
131
131
|
*/
|
|
132
|
+
/**
|
|
133
|
+
* Enhanced DataTable component with performance optimizations and comprehensive features.
|
|
134
|
+
*
|
|
135
|
+
* This is the main entry point for the DataTable component. It wraps DataTableCore
|
|
136
|
+
* and provides feature normalization and validation.
|
|
137
|
+
*
|
|
138
|
+
* @template TData - The type of data records in the table
|
|
139
|
+
* @param props - DataTable configuration including data, columns, features, and RBAC
|
|
140
|
+
* @returns The rendered DataTable component
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```tsx
|
|
144
|
+
* <DataTable
|
|
145
|
+
* data={users}
|
|
146
|
+
* columns={userColumns}
|
|
147
|
+
* rbac={{ pageId: 'user-management' }}
|
|
148
|
+
* features={{
|
|
149
|
+
* search: true,
|
|
150
|
+
* pagination: true,
|
|
151
|
+
* sorting: true
|
|
152
|
+
* }}
|
|
153
|
+
* />
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
/**
|
|
157
|
+
* Comprehensive, feature-rich data table component built on top of TanStack Table.
|
|
158
|
+
* Provides advanced data management capabilities with a clean, accessible interface.
|
|
159
|
+
*
|
|
160
|
+
* @template TData - The type of data records in the table
|
|
161
|
+
* @param props - DataTable configuration and props
|
|
162
|
+
* @returns The rendered DataTable component
|
|
163
|
+
*/
|
|
132
164
|
declare function DataTable<TData extends DataRecord>(props: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
|
|
133
165
|
|
|
134
166
|
export { DataTable as D, type DataTableProps as a };
|
|
@@ -60,8 +60,8 @@ import {
|
|
|
60
60
|
sum,
|
|
61
61
|
validateHierarchicalData,
|
|
62
62
|
validatePaginationConfig
|
|
63
|
-
} from "./chunk-
|
|
64
|
-
import "./chunk-
|
|
63
|
+
} from "./chunk-3XC4CPTD.js";
|
|
64
|
+
import "./chunk-XWQCNGTQ.js";
|
|
65
65
|
import {
|
|
66
66
|
CircuitBreaker,
|
|
67
67
|
DEFAULT_FALLBACK_CONFIG,
|
|
@@ -79,15 +79,16 @@ import {
|
|
|
79
79
|
safeExecute,
|
|
80
80
|
throttle,
|
|
81
81
|
useDataTablePerformance
|
|
82
|
-
} from "./chunk-
|
|
83
|
-
import "./chunk-
|
|
82
|
+
} from "./chunk-6SOIHG6Z.js";
|
|
83
|
+
import "./chunk-MMZ7JXPU.js";
|
|
84
84
|
import "./chunk-KQCRWDSA.js";
|
|
85
|
-
import "./chunk-
|
|
86
|
-
import "./chunk-
|
|
85
|
+
import "./chunk-EHMR7VYL.js";
|
|
86
|
+
import "./chunk-24UVZUZG.js";
|
|
87
87
|
import "./chunk-63FOKYGO.js";
|
|
88
88
|
import "./chunk-QXHPKYJV.js";
|
|
89
|
-
import "./chunk-
|
|
90
|
-
import "./chunk-
|
|
89
|
+
import "./chunk-M43Y4SSO.js";
|
|
90
|
+
import "./chunk-F2IMUDXZ.js";
|
|
91
|
+
import "./chunk-FMUCXFII.js";
|
|
91
92
|
import "./chunk-VBXEHIUJ.js";
|
|
92
93
|
import "./chunk-PWLANIRT.js";
|
|
93
94
|
import "./chunk-7D4SUZUM.js";
|
|
@@ -170,4 +171,4 @@ export {
|
|
|
170
171
|
validateHierarchicalData,
|
|
171
172
|
validatePaginationConfig
|
|
172
173
|
};
|
|
173
|
-
//# sourceMappingURL=DataTable-
|
|
174
|
+
//# sourceMappingURL=DataTable-TPTKCX4D.js.map
|