@jmruthers/pace-core 0.5.135 → 0.5.137
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/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
- package/dist/chunk-22WKWKRX.js.map +1 -0
- package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
- package/dist/chunk-4C7EXCAR.js.map +1 -0
- package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
- package/dist/chunk-56XJ3TU6.js.map +1 -0
- package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
- package/dist/chunk-7QCC6MCP.js.map +1 -0
- package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
- package/dist/chunk-ANBQRTPX.js.map +1 -0
- package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
- package/dist/chunk-BCIBECNB.js.map +1 -0
- package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
- package/dist/chunk-BESYRHQM.js.map +1 -0
- package/dist/chunk-BJPBT3CU.js +21 -0
- package/dist/chunk-BJPBT3CU.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
- package/dist/chunk-BLCXZEYF.js.map +1 -0
- package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
- package/dist/chunk-BVYWGZVV.js.map +1 -0
- package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
- package/dist/chunk-ERISIBYU.js.map +1 -0
- package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
- package/dist/chunk-HAWZXGR2.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
- package/dist/chunk-JISYG63F.js +70 -0
- package/dist/chunk-JISYG63F.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
- package/dist/chunk-KYRHUBIU.js.map +1 -0
- package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
- package/dist/chunk-LS353YLY.js.map +1 -0
- package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
- package/dist/chunk-OWAG3GSU.js +58 -0
- package/dist/chunk-OWAG3GSU.js.map +1 -0
- package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
- package/dist/chunk-Q5QRDWKI.js.map +1 -0
- package/dist/chunk-S5OFRT4M.js +94 -0
- package/dist/chunk-S5OFRT4M.js.map +1 -0
- package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
- package/dist/chunk-SBVILCCA.js.map +1 -0
- package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
- package/dist/chunk-T6JN6LH6.js.map +1 -0
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
- package/dist/chunk-YCWDTTUK.js.map +1 -0
- package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
- package/dist/chunk-ZZ2SS7NI.js.map +1 -0
- package/dist/components.d.ts +7 -287
- package/dist/components.js +27 -157
- package/dist/components.js.map +1 -1
- package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
- package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
- package/dist/hooks.d.ts +3 -3
- package/dist/hooks.js +21 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +44 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/rbac/index.js +12 -12
- package/dist/schema-DTDZQe2u.d.ts +28 -0
- package/dist/styles/index.js +2 -1
- package/dist/theming/runtime.d.ts +2 -19
- package/dist/theming/runtime.js +2 -1
- package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
- package/dist/types.d.ts +153 -4
- package/dist/types.js +51 -16
- package/dist/types.js.map +1 -1
- package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
- package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
- package/dist/utils.d.ts +221 -173
- package/dist/utils.js +185 -225
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +24 -115
- package/dist/validation.js +19 -474
- package/dist/validation.js.map +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +6 -6
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +6 -6
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +7 -7
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/BadgeProps.md +27 -0
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +29 -4
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +18 -18
- package/docs/api/interfaces/DataTableColumn.md +61 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +15 -15
- 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 +1 -1
- package/docs/api/interfaces/FooterProps.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 +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +10 -10
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- 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 +27 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +4 -4
- package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
- package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
- package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +10 -10
- package/docs/api/interfaces/RouteConfig.md +10 -10
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
- 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/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +591 -220
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -3
- package/docs/implementation-guides/data-tables.md +277 -13
- package/docs/implementation-guides/forms.md +1 -16
- package/docs/implementation-guides/permission-enforcement.md +8 -2
- package/docs/styles/README.md +0 -2
- package/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components 2/DataTable/index.ts +13 -0
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components 2/Dialog/index.ts +15 -0
- package/examples/components 2/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
- package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
- package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
- package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
- package/examples/features/public-pages/index.ts +14 -0
- package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
- package/examples/features/rbac/EventBasedApp.tsx +239 -0
- package/examples/features/rbac/PermissionExample.tsx +151 -0
- package/examples/features/rbac/index.ts +13 -0
- package/examples/index.ts +11 -3
- package/package.json +30 -19
- package/src/__tests__/TEST_STANDARD.md +92 -0
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Badge/Badge.test.tsx +314 -0
- package/src/components/Badge/Badge.tsx +304 -0
- package/src/components/Badge/index.ts +3 -0
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Checkbox/Checkbox.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/DataTable.tsx +1 -30
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
- package/src/components/DataTable/__tests__/styles.test.ts +3 -3
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +4 -185
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
- package/src/components/DataTable/components/DataTableModals.tsx +1 -27
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +9 -3
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +2 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
- package/src/components/DataTable/index.ts +4 -0
- package/src/components/DataTable/styles.ts +28 -7
- package/src/components/DataTable/types.ts +13 -0
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
- package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
- package/src/components/DataTable/utils/columnUtils.ts +40 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
- package/src/components/EventSelector/EventSelector.tsx +3 -2
- package/src/components/FileDisplay/FileDisplay.tsx +2 -36
- package/src/components/FileUpload/FileUpload.test.tsx +2 -2
- package/src/components/FileUpload/FileUpload.tsx +2 -2
- package/src/components/Footer/Footer.test.tsx +1 -1
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +5 -510
- package/src/components/Form/Form.tsx +1 -1
- package/src/components/Form/FormField.tsx +1 -1
- package/src/components/Form/index.ts +0 -12
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +1 -1
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
- package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
- package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
- package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
- package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
- package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
- package/src/components/PublicLayout/index.ts +4 -2
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +21 -9
- package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
- package/src/components/SessionRestorationLoader/index.ts +3 -0
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Table/__tests__/Table.test.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +7 -10
- package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
- package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
- package/src/hooks/public/usePublicEvent.ts +7 -6
- package/src/hooks/public/usePublicEventLogo.ts +7 -4
- package/src/hooks/public/usePublicFileDisplay.ts +6 -150
- package/src/hooks/useComponentPerformance.ts +4 -1
- package/src/hooks/useDataTablePerformance.ts +4 -3
- package/src/hooks/useEventTheme.test.ts +18 -5
- package/src/hooks/useEventTheme.ts +4 -1
- package/src/hooks/useEvents.ts +2 -0
- package/src/hooks/useFileDisplay.ts +9 -8
- package/src/hooks/useFileReference.ts +4 -1
- package/src/hooks/useFileUrl.ts +4 -1
- package/src/hooks/useInactivityTracker.ts +5 -4
- package/src/hooks/useOrganisationSecurity.test.ts +33 -12
- package/src/hooks/useOrganisationSecurity.ts +8 -7
- package/src/hooks/usePerformanceMonitor.ts +6 -3
- package/src/hooks/usePermissionCache.ts +13 -6
- package/src/hooks/useSecureDataAccess.test.ts +2 -2
- package/src/hooks/useSecureDataAccess.ts +9 -8
- package/src/hooks/useSessionRestoration.ts +4 -1
- package/src/hooks/useStorage.ts +4 -1
- package/src/index.ts +20 -7
- package/src/providers/services/AuthServiceProvider.tsx +3 -2
- package/src/providers/services/EventServiceProvider.tsx +2 -1
- package/src/providers/services/InactivityServiceProvider.tsx +2 -1
- package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
- package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
- package/src/rbac/api.ts +5 -2
- package/src/rbac/audit-enhanced.ts +6 -6
- package/src/rbac/audit.test.ts +60 -38
- package/src/rbac/audit.ts +8 -8
- package/src/rbac/cache-invalidation.ts +7 -4
- package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
- package/src/rbac/components/NavigationGuard.tsx +7 -3
- package/src/rbac/components/NavigationProvider.tsx +6 -3
- package/src/rbac/components/PagePermissionGuard.tsx +28 -16
- package/src/rbac/components/PagePermissionProvider.tsx +4 -1
- package/src/rbac/components/PermissionEnforcer.tsx +9 -3
- package/src/rbac/components/RoleBasedRouter.tsx +3 -1
- package/src/rbac/components/SecureDataProvider.tsx +7 -3
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
- package/src/rbac/engine.ts +15 -7
- package/src/rbac/hooks/usePermissions.ts +7 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
- package/src/rbac/hooks/useResolvedScope.ts +10 -7
- package/src/rbac/permissions.ts +5 -2
- package/src/rbac/security.test.ts +27 -16
- package/src/rbac/security.ts +5 -4
- package/src/services/AuthService.ts +22 -21
- package/src/services/EventService.ts +12 -12
- package/src/services/InactivityService.ts +5 -4
- package/src/services/OrganisationService.ts +26 -25
- package/src/services/__tests__/AuthService.test.ts +51 -19
- package/src/services/__tests__/EventService.test.ts +37 -5
- package/src/services/__tests__/InactivityService.test.ts +38 -4
- package/src/services/__tests__/OrganisationService.test.ts +3 -8
- package/src/services/base/BaseService.ts +3 -1
- package/src/styles/core.css +3 -0
- package/src/theming/__tests__/runtime.test.ts +21 -12
- package/src/theming/parseEventColours.ts +5 -19
- package/src/theming/runtime.ts +8 -4
- package/src/types/validation.ts +2 -29
- package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
- package/src/utils/__tests__/audit.unit.test.ts +1 -1
- package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
- package/src/utils/__tests__/cn.unit.test.ts +1 -1
- package/src/utils/__tests__/debugLogger.test.ts +1 -1
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/formatting.unit.test.ts +1 -1
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
- package/src/utils/__tests__/logger.unit.test.ts +1 -1
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
- package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
- package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
- package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
- package/src/utils/__tests__/security.unit.test.ts +40 -18
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
- package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
- package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
- package/src/utils/app/appConfig.ts +47 -0
- package/src/utils/app/appIdResolver.test.ts +497 -0
- package/src/utils/app/appIdResolver.ts +133 -0
- package/src/utils/app/appNameResolver.simple.test.ts +212 -0
- package/src/utils/app/appNameResolver.test.ts +121 -0
- package/src/utils/app/appNameResolver.ts +195 -0
- package/src/utils/audit/audit.ts +127 -0
- package/src/utils/context/organisationContext.test.ts +322 -0
- package/src/utils/context/organisationContext.ts +156 -0
- package/src/utils/context/sessionTracking.ts +125 -0
- package/src/utils/core/cn.ts +7 -0
- package/src/utils/core/debugLogger.ts +67 -0
- package/src/utils/core/logger.ts +181 -0
- package/src/utils/device/deviceFingerprint.ts +215 -0
- package/src/utils/dynamic/dynamicUtils.ts +105 -0
- package/src/utils/dynamic/lazyLoad.tsx +44 -0
- package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
- package/src/utils/file-reference/index.ts +501 -0
- package/src/utils/formatting/formatDate.test.ts +237 -0
- package/src/utils/formatting/formatting.ts +133 -0
- package/src/utils/index.ts +39 -54
- package/src/utils/performance/bundleAnalysis.ts +129 -0
- package/src/utils/performance/performanceBenchmark.ts +64 -0
- package/src/utils/performance/performanceBudgets.ts +110 -0
- package/src/utils/permissions/permissionTypes.ts +37 -0
- package/src/utils/permissions/permissionUtils.test.ts +393 -0
- package/src/utils/permissions/permissionUtils.ts +34 -0
- package/src/utils/security/auth-utils.ts +96 -0
- package/src/utils/security/secureDataAccess.test.ts +711 -0
- package/src/utils/security/secureDataAccess.ts +377 -0
- package/src/utils/security/secureErrors.ts +82 -0
- package/src/utils/security/secureStorage.ts +244 -0
- package/src/utils/security/security.ts +159 -0
- package/src/utils/security/securityMonitor.ts +45 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/utils/validation/htmlSanitization.ts +184 -0
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/validation/sanitization.ts +333 -0
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/validation/validation.ts +111 -0
- package/src/utils/validation/validationUtils.ts +123 -0
- package/src/validation/index.ts +3 -34
- package/dist/chunk-24MKLB7U.js +0 -81
- package/dist/chunk-24MKLB7U.js.map +0 -1
- package/dist/chunk-3CG5L6RN.js.map +0 -1
- package/dist/chunk-3DBFLLLU.js.map +0 -1
- package/dist/chunk-5F3NDPJV.js.map +0 -1
- package/dist/chunk-66C4BSAY.js.map +0 -1
- package/dist/chunk-BDZUMRBD.js +0 -87
- package/dist/chunk-BDZUMRBD.js.map +0 -1
- package/dist/chunk-BYXRHAIF.js.map +0 -1
- package/dist/chunk-CDQ3PX7L.js +0 -18
- package/dist/chunk-CDQ3PX7L.js.map +0 -1
- package/dist/chunk-CQZU6TFE.js.map +0 -1
- package/dist/chunk-F64FFPOZ.js.map +0 -1
- package/dist/chunk-GEVIB2UB.js.map +0 -1
- package/dist/chunk-GKHF54DI.js.map +0 -1
- package/dist/chunk-GVDR7WNV.js.map +0 -1
- package/dist/chunk-HMNOSGVA.js.map +0 -1
- package/dist/chunk-JCQZ6LA7.js.map +0 -1
- package/dist/chunk-M6DDYFUD.js.map +0 -1
- package/dist/chunk-O3NWNXDY.js.map +0 -1
- package/dist/chunk-PYUXFQJ3.js.map +0 -1
- package/dist/chunk-UJI6WSMD.js.map +0 -1
- package/dist/chunk-VZ5OR6HD.js.map +0 -1
- package/dist/chunk-WP5I5GLN.js.map +0 -1
- package/dist/chunk-ZYZCRSBD.js.map +0 -1
- package/dist/validation-DnhrNMju.d.ts +0 -159
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -365
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
- package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
- package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
- package/src/validation/__tests__/user.unit.test.ts +0 -440
- package/src/validation/sanitization.ts +0 -96
- /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
- /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
- /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
- /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/src/{validation → utils/validation}/common.ts +0 -0
- /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
- /package/src/{validation → utils/validation}/user.ts +0 -0
|
@@ -346,11 +346,18 @@ const userSchema = z.object({
|
|
|
346
346
|
age: z.number().min(18, "Must be at least 18 years old")
|
|
347
347
|
});
|
|
348
348
|
|
|
349
|
+
import { logger } from '@jmruthers/pace-core/utils';
|
|
350
|
+
|
|
349
351
|
<Form
|
|
350
352
|
schema={userSchema}
|
|
351
353
|
defaultValues={{ name: "", email: "", age: 0 }}
|
|
352
|
-
onSubmit={(data) =>
|
|
353
|
-
|
|
354
|
+
onSubmit={(data) => {
|
|
355
|
+
// Handle form submission
|
|
356
|
+
logger.debug('Form', 'Form submitted:', data);
|
|
357
|
+
}}
|
|
358
|
+
onError={(errors) => {
|
|
359
|
+
logger.error('Form', 'Form validation errors:', errors);
|
|
360
|
+
}}
|
|
354
361
|
>
|
|
355
362
|
<FormField name="name" label="Name" />
|
|
356
363
|
<FormField name="email" label="Email" type="email" />
|
|
@@ -362,13 +369,29 @@ const userSchema = z.object({
|
|
|
362
369
|
### Form Components
|
|
363
370
|
|
|
364
371
|
- **FormField**: Individual form fields with validation
|
|
365
|
-
- **FormErrorSummary**: Error display for forms
|
|
366
|
-
- **FormLiveRegion**: Live region for accessibility
|
|
367
|
-
- **FormFieldset**: Grouped form fields
|
|
368
372
|
|
|
369
373
|
## Dialog
|
|
370
374
|
|
|
371
|
-
A comprehensive, accessible dialog component system
|
|
375
|
+
A comprehensive, accessible dialog component system built on top of Radix UI primitives with enhanced features for modern web applications.
|
|
376
|
+
|
|
377
|
+
### Features
|
|
378
|
+
|
|
379
|
+
#### Core Features
|
|
380
|
+
- **Semantic HTML Structure** - Uses native `<dialog>` element with proper header, main, footer elements
|
|
381
|
+
- **Accessibility First** - WCAG 2.1 AA compliant with full screen reader support
|
|
382
|
+
- **Focus Management** - Automatic focus trapping and restoration
|
|
383
|
+
- **Keyboard Navigation** - Escape to close, Tab for focus management
|
|
384
|
+
- **Responsive Design** - Adapts to all screen sizes with smart constraints
|
|
385
|
+
|
|
386
|
+
#### Advanced Features
|
|
387
|
+
- **Smart Height Management** - Automatic viewport-based height constraints
|
|
388
|
+
- **Scrollable Content** - Long content scrolls while keeping headers/footers visible
|
|
389
|
+
- **Sticky Headers/Footers** - Important UI elements remain accessible during scrolling
|
|
390
|
+
- **Multiple Size Variants** - sm, md, lg, xl, full, auto sizing options
|
|
391
|
+
- **Custom Dimensions** - Fine-grained control over width and height
|
|
392
|
+
- **Configurable Close Behavior** - Control escape key and outside click behavior
|
|
393
|
+
- **Smooth Animations** - Polished transitions and micro-interactions
|
|
394
|
+
- **HTML Content Rendering** - Safe HTML content with automatic sanitization
|
|
372
395
|
|
|
373
396
|
### Props
|
|
374
397
|
|
|
@@ -585,24 +608,40 @@ import {
|
|
|
585
608
|
</Dialog>
|
|
586
609
|
```
|
|
587
610
|
|
|
588
|
-
###
|
|
611
|
+
### HTML Content Rendering
|
|
589
612
|
|
|
590
|
-
|
|
591
|
-
- **Semantic HTML Structure**: Uses native `<dialog>` element with proper header, main, footer elements
|
|
592
|
-
- **Accessibility First**: WCAG 2.1 AA compliant with full screen reader support
|
|
593
|
-
- **Focus Management**: Automatic focus trapping and restoration
|
|
594
|
-
- **Keyboard Navigation**: Escape to close, Tab for focus management
|
|
595
|
-
- **Responsive Design**: Adapts to all screen sizes with smart constraints
|
|
613
|
+
The Dialog components support rich HTML content rendering with automatic sanitization. This is perfect for formatted instructions, feature announcements, error details, or any HTML that needs to be displayed in dialogs.
|
|
596
614
|
|
|
597
|
-
|
|
598
|
-
- **
|
|
599
|
-
- **
|
|
600
|
-
- **
|
|
601
|
-
- **
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
615
|
+
**Key Features:**
|
|
616
|
+
- **Rich HTML Rendering**: Full HTML support with proper styling
|
|
617
|
+
- **Safe Sanitization**: Automatic XSS protection
|
|
618
|
+
- **Prose Styling**: Typography classes for readable content
|
|
619
|
+
- **Fallback Support**: Graceful degradation if HTML fails
|
|
620
|
+
|
|
621
|
+
**Configuration Options:**
|
|
622
|
+
|
|
623
|
+
| Property | Type | Default | Description |
|
|
624
|
+
|----------|------|---------|-------------|
|
|
625
|
+
| `htmlContent` | `string` | `undefined` | HTML string to render |
|
|
626
|
+
| `allowHtml` | `boolean` | `true` | Enable/disable HTML rendering |
|
|
627
|
+
| `strictSanitization` | `boolean` | `true` | Use strict HTML sanitization |
|
|
628
|
+
| `logWarnings` | `boolean` | `false` | Log sanitization warnings to console |
|
|
629
|
+
|
|
630
|
+
**Supported HTML Elements:**
|
|
631
|
+
- Text formatting: `p`, `div`, `span`, `h1`-`h6`, `strong`, `em`, `b`, `i`, `u`, `s`, `mark`, `small`, `sub`, `sup`
|
|
632
|
+
- Lists: `ul`, `ol`, `li`, `dl`, `dt`, `dd`
|
|
633
|
+
- Code: `pre`, `code`, `kbd`, `samp`
|
|
634
|
+
- Links: `a` (with href validation)
|
|
635
|
+
- Tables: `table`, `thead`, `tbody`, `tfoot`, `tr`, `th`, `td`
|
|
636
|
+
- Media: `img` (with src validation)
|
|
637
|
+
- Layout: `section`, `article`, `aside`, `header`, `footer`, `main`, `nav`
|
|
638
|
+
- Interactive: `details`, `summary`
|
|
639
|
+
|
|
640
|
+
**Removed Elements (for security):**
|
|
641
|
+
- Scripts: `script`, `iframe`, `object`, `embed`
|
|
642
|
+
- Forms: `form`, `input`, `button`
|
|
643
|
+
- Event handlers: `onclick`, `onload`, etc.
|
|
644
|
+
- Dangerous protocols: `javascript:`, `data:`
|
|
606
645
|
|
|
607
646
|
### Size Variants
|
|
608
647
|
|
|
@@ -615,6 +654,46 @@ import {
|
|
|
615
654
|
| `full` | 100% | Full screen experiences |
|
|
616
655
|
| `auto` | Content-based | Dynamic content sizing |
|
|
617
656
|
|
|
657
|
+
### Accessibility
|
|
658
|
+
|
|
659
|
+
#### WCAG 2.1 AA Compliance
|
|
660
|
+
- **Semantic HTML** - Uses proper `<dialog>`, `<header>`, `<main>`, `<footer>` elements
|
|
661
|
+
- **Focus Management** - Automatic focus trapping and restoration
|
|
662
|
+
- **Keyboard Navigation** - Full keyboard support with proper tab order
|
|
663
|
+
- **Screen Reader Support** - Complete ARIA attributes and announcements
|
|
664
|
+
- **Landmark Navigation** - Proper semantic structure for screen reader navigation
|
|
665
|
+
|
|
666
|
+
#### Keyboard Shortcuts
|
|
667
|
+
- **Escape** - Close dialog (configurable)
|
|
668
|
+
- **Tab** - Navigate through focusable elements
|
|
669
|
+
- **Shift + Tab** - Navigate backwards through focusable elements
|
|
670
|
+
|
|
671
|
+
### Performance
|
|
672
|
+
|
|
673
|
+
#### Optimizations
|
|
674
|
+
- **Efficient Focus Management** - Minimal DOM queries and updates
|
|
675
|
+
- **Optimized Animations** - Hardware-accelerated transitions
|
|
676
|
+
- **Memory Leak Prevention** - Proper cleanup of event listeners
|
|
677
|
+
- **Conditional Rendering** - Only renders when needed
|
|
678
|
+
- **Optimized Scroll Handling** - Debounced resize events
|
|
679
|
+
|
|
680
|
+
#### Best Practices
|
|
681
|
+
- Use `enableScrolling={true}` for content that might overflow
|
|
682
|
+
- Set appropriate `maxHeightPercent` to prevent viewport overflow
|
|
683
|
+
- Use sticky headers/footers for important UI elements
|
|
684
|
+
- Consider `size="auto"` for dynamic content
|
|
685
|
+
|
|
686
|
+
### Troubleshooting
|
|
687
|
+
|
|
688
|
+
**Common Issues:**
|
|
689
|
+
|
|
690
|
+
1. **Content not scrolling** - Ensure `enableScrolling={true}` is set
|
|
691
|
+
2. **Header/footer not sticky** - Add `sticky={true}` to header/footer props
|
|
692
|
+
3. **Dialog too tall** - Use `maxHeightPercent` or `maxHeight` props
|
|
693
|
+
4. **Focus issues** - Ensure proper semantic structure with DialogBody
|
|
694
|
+
5. **HTML not rendering** - Check that `allowHtml={true}` is set and HTML is valid
|
|
695
|
+
6. **Content being stripped** - Check sanitization settings and verify HTML elements are allowed
|
|
696
|
+
|
|
618
697
|
## Select
|
|
619
698
|
|
|
620
699
|
A dropdown select component with search functionality and keyboard navigation.
|
|
@@ -1388,12 +1467,13 @@ For more details, see the [Authentication Implementation Guide](../implementatio
|
|
|
1388
1467
|
Form component for changing user passwords.
|
|
1389
1468
|
|
|
1390
1469
|
```tsx
|
|
1391
|
-
import { PasswordChangeForm } from '@jmruthers/pace-core';
|
|
1470
|
+
import { PasswordChangeForm, logger } from '@jmruthers/pace-core';
|
|
1392
1471
|
|
|
1393
1472
|
<PasswordChangeForm
|
|
1394
1473
|
onSubmit={(values) => {
|
|
1395
1474
|
// Handle password change
|
|
1396
|
-
|
|
1475
|
+
logger.debug('PasswordChange', 'Password change initiated');
|
|
1476
|
+
// Note: Never log actual password values in production
|
|
1397
1477
|
}}
|
|
1398
1478
|
/>
|
|
1399
1479
|
```
|
|
@@ -1594,11 +1674,11 @@ interface FileUploadProps {
|
|
|
1594
1674
|
#### Usage
|
|
1595
1675
|
|
|
1596
1676
|
```tsx
|
|
1597
|
-
import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
1677
|
+
import { FileUpload, FileCategory, logger } from '@jmruthers/pace-core';
|
|
1598
1678
|
|
|
1599
1679
|
function MyFileUpload() {
|
|
1600
1680
|
const handleUpload = (fileRef: FileReference) => {
|
|
1601
|
-
|
|
1681
|
+
logger.debug('FileUpload', 'File uploaded:', { fileId: fileRef.id, fileName: fileRef.name });
|
|
1602
1682
|
};
|
|
1603
1683
|
|
|
1604
1684
|
return (
|
|
@@ -229,8 +229,6 @@ graph TD
|
|
|
229
229
|
|
|
230
230
|
E --> R[Form]
|
|
231
231
|
E --> S[FormField]
|
|
232
|
-
E --> T[FormErrorSummary]
|
|
233
|
-
E --> U[FormLiveRegion]
|
|
234
232
|
```
|
|
235
233
|
|
|
236
234
|
### Styling Architecture
|
|
@@ -464,7 +462,6 @@ PACE Core is built as a single package with multiple entry points:
|
|
|
464
462
|
".": "./dist/index.js",
|
|
465
463
|
"./components": "./dist/components.js",
|
|
466
464
|
"./rbac": "./dist/rbac/index.js",
|
|
467
|
-
"./validation": "./dist/validation.js",
|
|
468
465
|
"./hooks": "./dist/hooks.js",
|
|
469
466
|
"./styles/core.css": "./src/styles/core.css"
|
|
470
467
|
}
|
|
@@ -532,6 +532,266 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
532
532
|
// 3. Parent-child relationships are maintained
|
|
533
533
|
```
|
|
534
534
|
|
|
535
|
+
## Grouped Row Aggregation
|
|
536
|
+
|
|
537
|
+
### Overview
|
|
538
|
+
|
|
539
|
+
The DataTable supports custom aggregation functions in grouped rows, allowing columns to display aggregated values (sum, average, count, etc.) instead of just row counts. This is particularly useful for data analysis and reporting use cases.
|
|
540
|
+
|
|
541
|
+
### Quick Start
|
|
542
|
+
|
|
543
|
+
#### 1. Enable Grouping
|
|
544
|
+
|
|
545
|
+
```tsx
|
|
546
|
+
<DataTable
|
|
547
|
+
data={data}
|
|
548
|
+
columns={columns}
|
|
549
|
+
features={{
|
|
550
|
+
grouping: true, // Enable grouping
|
|
551
|
+
}}
|
|
552
|
+
defaultGrouping={['category']} // Optional: group by category on load
|
|
553
|
+
/>
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
#### 2. Add Aggregation Functions to Columns
|
|
557
|
+
|
|
558
|
+
```tsx
|
|
559
|
+
import { DataTable, sum, average, count } from '@jmruthers/pace-core';
|
|
560
|
+
|
|
561
|
+
const columns: DataTableColumn<DinerData>[] = [
|
|
562
|
+
{
|
|
563
|
+
accessorKey: 'diet',
|
|
564
|
+
header: 'Diet',
|
|
565
|
+
enableGrouping: true,
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
accessorKey: 'youth',
|
|
569
|
+
header: 'Total Youth',
|
|
570
|
+
aggregateFn: sum('youth'), // Sum all youth values in the group
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
accessorKey: 'adults',
|
|
574
|
+
header: 'Total Adults',
|
|
575
|
+
aggregateFn: sum('adults'), // Sum all adult values in the group
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
accessorKey: 'cost',
|
|
579
|
+
header: 'Avg Cost',
|
|
580
|
+
aggregateFn: average('cost'), // Average cost across the group
|
|
581
|
+
},
|
|
582
|
+
];
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Built-in Aggregation Functions
|
|
586
|
+
|
|
587
|
+
The DataTable provides several built-in aggregation utility functions:
|
|
588
|
+
|
|
589
|
+
#### Sum
|
|
590
|
+
|
|
591
|
+
```tsx
|
|
592
|
+
{
|
|
593
|
+
accessorKey: 'quantity',
|
|
594
|
+
header: 'Total Quantity',
|
|
595
|
+
aggregateFn: sum('quantity'),
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
#### Average
|
|
600
|
+
|
|
601
|
+
```tsx
|
|
602
|
+
{
|
|
603
|
+
accessorKey: 'price',
|
|
604
|
+
header: 'Avg Price',
|
|
605
|
+
aggregateFn: average('price'),
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
#### Count
|
|
610
|
+
|
|
611
|
+
```tsx
|
|
612
|
+
{
|
|
613
|
+
accessorKey: 'id',
|
|
614
|
+
header: 'Count',
|
|
615
|
+
aggregateFn: count(),
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
#### Min
|
|
620
|
+
|
|
621
|
+
```tsx
|
|
622
|
+
{
|
|
623
|
+
accessorKey: 'price',
|
|
624
|
+
header: 'Min Price',
|
|
625
|
+
aggregateFn: min('price'),
|
|
626
|
+
}
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
#### Max
|
|
630
|
+
|
|
631
|
+
```tsx
|
|
632
|
+
{
|
|
633
|
+
accessorKey: 'price',
|
|
634
|
+
header: 'Max Price',
|
|
635
|
+
aggregateFn: max('price'),
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
### Custom Aggregation Functions
|
|
640
|
+
|
|
641
|
+
You can create custom aggregation functions for more complex calculations:
|
|
642
|
+
|
|
643
|
+
```tsx
|
|
644
|
+
const columns: DataTableColumn<DinerData>[] = [
|
|
645
|
+
{
|
|
646
|
+
accessorKey: 'diet',
|
|
647
|
+
header: 'Diet',
|
|
648
|
+
enableGrouping: true,
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
accessorKey: 'youth',
|
|
652
|
+
header: 'Total Diners',
|
|
653
|
+
aggregateFn: (rows) => {
|
|
654
|
+
// Custom: sum of youth + adults
|
|
655
|
+
return rows.reduce((total, row) => total + (row.youth || 0) + (row.adults || 0), 0);
|
|
656
|
+
},
|
|
657
|
+
},
|
|
658
|
+
];
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
### Custom Aggregate Cell Renderer
|
|
662
|
+
|
|
663
|
+
Use `aggregateCell` to customize how aggregated values are displayed:
|
|
664
|
+
|
|
665
|
+
```tsx
|
|
666
|
+
{
|
|
667
|
+
accessorKey: 'cost',
|
|
668
|
+
header: 'Total Cost',
|
|
669
|
+
aggregateFn: sum('cost'),
|
|
670
|
+
aggregateCell: (value) => {
|
|
671
|
+
// Custom formatting for aggregated value
|
|
672
|
+
return `$${value.toFixed(2)}`;
|
|
673
|
+
},
|
|
674
|
+
}
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
If `aggregateCell` is not provided, the column's regular `cell` renderer will be used, or the raw value will be displayed.
|
|
678
|
+
|
|
679
|
+
### Complete Example
|
|
680
|
+
|
|
681
|
+
```tsx
|
|
682
|
+
import { DataTable, sum, average, type DataTableColumn } from '@jmruthers/pace-core';
|
|
683
|
+
|
|
684
|
+
interface DinerData {
|
|
685
|
+
id: string;
|
|
686
|
+
diet: string;
|
|
687
|
+
youth: number;
|
|
688
|
+
adults: number;
|
|
689
|
+
cost: number;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
const dinerData: DinerData[] = [
|
|
693
|
+
{ id: '1', diet: 'Standard', youth: 10, adults: 5, cost: 100.50 },
|
|
694
|
+
{ id: '2', diet: 'Standard', youth: 15, adults: 8, cost: 150.75 },
|
|
695
|
+
{ id: '3', diet: 'Standard', youth: 20, adults: 10, cost: 200.00 },
|
|
696
|
+
{ id: '4', diet: 'Gluten Free', youth: 5, adults: 3, cost: 75.25 },
|
|
697
|
+
{ id: '5', diet: 'Gluten Free', youth: 8, adults: 4, cost: 120.00 },
|
|
698
|
+
];
|
|
699
|
+
|
|
700
|
+
const columns: DataTableColumn<DinerData>[] = [
|
|
701
|
+
{
|
|
702
|
+
accessorKey: 'diet',
|
|
703
|
+
header: 'Diet',
|
|
704
|
+
enableGrouping: true,
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
accessorKey: 'youth',
|
|
708
|
+
header: 'Youth',
|
|
709
|
+
sortable: true,
|
|
710
|
+
aggregateFn: sum('youth'),
|
|
711
|
+
aggregateCell: (value) => value.toLocaleString(),
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
accessorKey: 'adults',
|
|
715
|
+
header: 'Adults',
|
|
716
|
+
sortable: true,
|
|
717
|
+
aggregateFn: sum('adults'),
|
|
718
|
+
aggregateCell: (value) => value.toLocaleString(),
|
|
719
|
+
},
|
|
720
|
+
{
|
|
721
|
+
accessorKey: 'cost',
|
|
722
|
+
header: 'Avg Cost',
|
|
723
|
+
sortable: true,
|
|
724
|
+
aggregateFn: average('cost'),
|
|
725
|
+
aggregateCell: (value) => `$${value.toFixed(2)}`,
|
|
726
|
+
},
|
|
727
|
+
];
|
|
728
|
+
|
|
729
|
+
function DinersTable() {
|
|
730
|
+
return (
|
|
731
|
+
<DataTable
|
|
732
|
+
data={dinerData}
|
|
733
|
+
columns={columns}
|
|
734
|
+
rbac={{ pageName: 'diners' }}
|
|
735
|
+
features={{
|
|
736
|
+
grouping: true,
|
|
737
|
+
sorting: true,
|
|
738
|
+
pagination: true,
|
|
739
|
+
}}
|
|
740
|
+
defaultGrouping={['diet']}
|
|
741
|
+
getRowId={(row) => row.id}
|
|
742
|
+
/>
|
|
743
|
+
);
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
### Edge Cases and Best Practices
|
|
748
|
+
|
|
749
|
+
#### Handling Null/Undefined Values
|
|
750
|
+
|
|
751
|
+
Aggregation functions should handle null/undefined values gracefully:
|
|
752
|
+
|
|
753
|
+
```tsx
|
|
754
|
+
{
|
|
755
|
+
accessorKey: 'quantity',
|
|
756
|
+
header: 'Total',
|
|
757
|
+
aggregateFn: (rows) => {
|
|
758
|
+
return rows.reduce((sum, row) => {
|
|
759
|
+
const value = row.quantity;
|
|
760
|
+
return sum + (value != null ? value : 0);
|
|
761
|
+
}, 0);
|
|
762
|
+
},
|
|
763
|
+
}
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
The built-in aggregation functions (`sum`, `average`, etc.) already handle null/undefined values correctly.
|
|
767
|
+
|
|
768
|
+
#### Empty Groups
|
|
769
|
+
|
|
770
|
+
When a group has no rows, aggregation functions should return appropriate defaults:
|
|
771
|
+
- `sum`: Returns `0`
|
|
772
|
+
- `average`: Returns `0`
|
|
773
|
+
- `count`: Returns `0`
|
|
774
|
+
- `min`/`max`: Returns `null`
|
|
775
|
+
|
|
776
|
+
#### Columns Without Aggregation
|
|
777
|
+
|
|
778
|
+
Columns without an `aggregateFn` will show empty cells in grouped rows (current behavior). This is intentional and allows you to selectively aggregate only the columns that need it.
|
|
779
|
+
|
|
780
|
+
#### Performance Considerations
|
|
781
|
+
|
|
782
|
+
- Aggregation functions are called once per group when the group is rendered
|
|
783
|
+
- For large datasets, consider memoizing expensive aggregation functions
|
|
784
|
+
- Aggregated values are recalculated when group membership changes
|
|
785
|
+
|
|
786
|
+
### Integration with Other Features
|
|
787
|
+
|
|
788
|
+
Grouped row aggregation works seamlessly with:
|
|
789
|
+
- **Sorting**: Aggregated values can be sorted
|
|
790
|
+
- **Filtering**: Aggregated values respect filters
|
|
791
|
+
- **Pagination**: Aggregated values work with pagination
|
|
792
|
+
- **Search**: Aggregated values are searchable
|
|
793
|
+
- **Nested Grouping**: Aggregation works at each grouping level
|
|
794
|
+
|
|
535
795
|
## Advanced Filtering
|
|
536
796
|
|
|
537
797
|
### Filter Types
|
|
@@ -1019,12 +1279,14 @@ const columns = [
|
|
|
1019
1279
|
#### Real-Time Metrics
|
|
1020
1280
|
|
|
1021
1281
|
```tsx
|
|
1282
|
+
import { logger } from '@jmruthers/pace-core/utils';
|
|
1283
|
+
|
|
1022
1284
|
<DataTable
|
|
1023
1285
|
data={data}
|
|
1024
1286
|
columns={columns}
|
|
1025
1287
|
showPerformanceMetrics={true}
|
|
1026
1288
|
onPerformanceMetrics={(metrics) => {
|
|
1027
|
-
|
|
1289
|
+
logger.debug('DataTable', 'Performance metrics:', {
|
|
1028
1290
|
renderTime: metrics.renderTime,
|
|
1029
1291
|
memoryUsage: metrics.memoryUsage,
|
|
1030
1292
|
visibleRows: metrics.visibleRows,
|
|
@@ -1075,7 +1337,7 @@ const columns = [
|
|
|
1075
1337
|
|
|
1076
1338
|
```tsx
|
|
1077
1339
|
import { useState } from 'react';
|
|
1078
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
1340
|
+
import { DataTable, logger } from '@jmruthers/pace-core';
|
|
1079
1341
|
import { supabase } from '../supabaseClient';
|
|
1080
1342
|
|
|
1081
1343
|
interface User {
|
|
@@ -1101,7 +1363,7 @@ function UserManagement() {
|
|
|
1101
1363
|
if (error) throw error;
|
|
1102
1364
|
setUsers(data || []);
|
|
1103
1365
|
} catch (error) {
|
|
1104
|
-
|
|
1366
|
+
logger.error('UserManagement', 'Error fetching users:', error);
|
|
1105
1367
|
} finally {
|
|
1106
1368
|
setLoading(false);
|
|
1107
1369
|
}
|
|
@@ -1123,7 +1385,7 @@ function UserManagement() {
|
|
|
1123
1385
|
|
|
1124
1386
|
return { success: true, data };
|
|
1125
1387
|
} catch (error) {
|
|
1126
|
-
|
|
1388
|
+
logger.error('UserManagement', 'Error creating user:', error);
|
|
1127
1389
|
return { success: false, error };
|
|
1128
1390
|
}
|
|
1129
1391
|
};
|
|
@@ -1147,7 +1409,7 @@ function UserManagement() {
|
|
|
1147
1409
|
|
|
1148
1410
|
return { success: true, data };
|
|
1149
1411
|
} catch (error) {
|
|
1150
|
-
|
|
1412
|
+
logger.error('UserManagement', 'Error updating user:', error);
|
|
1151
1413
|
return { success: false, error };
|
|
1152
1414
|
}
|
|
1153
1415
|
};
|
|
@@ -1167,7 +1429,7 @@ function UserManagement() {
|
|
|
1167
1429
|
|
|
1168
1430
|
return { success: true };
|
|
1169
1431
|
} catch (error) {
|
|
1170
|
-
|
|
1432
|
+
logger.error('UserManagement', 'Error deleting user:', error);
|
|
1171
1433
|
return { success: false, error };
|
|
1172
1434
|
}
|
|
1173
1435
|
};
|
|
@@ -1187,7 +1449,7 @@ function UserManagement() {
|
|
|
1187
1449
|
|
|
1188
1450
|
return { success: true };
|
|
1189
1451
|
} catch (error) {
|
|
1190
|
-
|
|
1452
|
+
logger.error('UserManagement', 'Error deleting selected users:', error);
|
|
1191
1453
|
return { success: false, error };
|
|
1192
1454
|
}
|
|
1193
1455
|
};
|
|
@@ -1333,7 +1595,7 @@ const columns = [
|
|
|
1333
1595
|
|
|
1334
1596
|
```tsx
|
|
1335
1597
|
import { useState, useCallback, useMemo } from 'react';
|
|
1336
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
1598
|
+
import { DataTable, logger } from '@jmruthers/pace-core';
|
|
1337
1599
|
|
|
1338
1600
|
interface Item {
|
|
1339
1601
|
id: string;
|
|
@@ -1363,7 +1625,7 @@ function ItemsTable() {
|
|
|
1363
1625
|
};
|
|
1364
1626
|
|
|
1365
1627
|
setCategories(prev => [...prev, newCategory]);
|
|
1366
|
-
|
|
1628
|
+
logger.debug('CategoryManager', `Created new category: "${inputValue}"`);
|
|
1367
1629
|
|
|
1368
1630
|
return newCategory.value;
|
|
1369
1631
|
}, []);
|
|
@@ -1756,7 +2018,7 @@ The export filename is automatically generated from the table `title` prop:
|
|
|
1756
2018
|
By default, the DataTable exports all **visible columns**. To customize the export (different columns, custom filename, etc.), you can provide a custom `onExport` handler:
|
|
1757
2019
|
|
|
1758
2020
|
```tsx
|
|
1759
|
-
import { DataTable, type ExportOptions, exportToCSVWithTableRows, type ExportColumn } from '@jmruthers/pace-core';
|
|
2021
|
+
import { DataTable, type ExportOptions, exportToCSVWithTableRows, type ExportColumn, logger } from '@jmruthers/pace-core';
|
|
1760
2022
|
|
|
1761
2023
|
<DataTable
|
|
1762
2024
|
title="Meals"
|
|
@@ -1780,7 +2042,7 @@ import { DataTable, type ExportOptions, exportToCSVWithTableRows, type ExportCol
|
|
|
1780
2042
|
|
|
1781
2043
|
// Verify this column ID exists in the mapping (for getValue() to work)
|
|
1782
2044
|
if (!options.columnIdToTableColumn.has(tableColumnId)) {
|
|
1783
|
-
|
|
2045
|
+
logger.warn('DataTable', `Column ID ${tableColumnId} not found in columnIdToTableColumn map`);
|
|
1784
2046
|
return null;
|
|
1785
2047
|
}
|
|
1786
2048
|
|
|
@@ -2105,6 +2367,8 @@ Enable debug logging for DataTable issues:
|
|
|
2105
2367
|
|
|
2106
2368
|
Enable detailed logging:
|
|
2107
2369
|
```tsx
|
|
2370
|
+
import { logger } from '@jmruthers/pace-core/utils';
|
|
2371
|
+
|
|
2108
2372
|
<DataTable
|
|
2109
2373
|
data={data}
|
|
2110
2374
|
columns={columns}
|
|
@@ -2112,10 +2376,10 @@ Enable detailed logging:
|
|
|
2112
2376
|
onPerformanceMetrics={(metrics) => {
|
|
2113
2377
|
// Log performance issues
|
|
2114
2378
|
if (metrics.renderTime > 100) {
|
|
2115
|
-
|
|
2379
|
+
logger.warn('DataTable', 'Slow render detected:', metrics.renderTime);
|
|
2116
2380
|
}
|
|
2117
2381
|
if (metrics.memoryUsage > 100) {
|
|
2118
|
-
|
|
2382
|
+
logger.warn('DataTable', 'High memory usage:', metrics.memoryUsage);
|
|
2119
2383
|
}
|
|
2120
2384
|
}}
|
|
2121
2385
|
/>
|
|
@@ -484,22 +484,7 @@ function FormWithState() {
|
|
|
484
484
|
</p>
|
|
485
485
|
```
|
|
486
486
|
|
|
487
|
-
### 2.
|
|
488
|
-
|
|
489
|
-
```tsx
|
|
490
|
-
import { FormLiveRegion } from '@jmruthers/pace-core';
|
|
491
|
-
|
|
492
|
-
function AccessibleForm() {
|
|
493
|
-
return (
|
|
494
|
-
<Form schema={userSchema} onSubmit={handleSubmit}>
|
|
495
|
-
<FormLiveRegion />
|
|
496
|
-
{/* Form fields */}
|
|
497
|
-
</Form>
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
### 3. Keyboard Navigation
|
|
487
|
+
### 2. Keyboard Navigation
|
|
503
488
|
|
|
504
489
|
All form components support full keyboard navigation:
|
|
505
490
|
|
|
@@ -570,12 +570,15 @@ FOR SELECT USING (
|
|
|
570
570
|
Monitor permission checks for security:
|
|
571
571
|
|
|
572
572
|
```tsx
|
|
573
|
+
import { getRBACLogger } from '@jmruthers/pace-core/rbac';
|
|
574
|
+
|
|
573
575
|
// Enable audit trail in development
|
|
574
576
|
const { getAuditTrail } = usePermissionCache();
|
|
577
|
+
const rbacLogger = getRBACLogger();
|
|
575
578
|
|
|
576
579
|
// Log permission decisions
|
|
577
580
|
const auditTrail = getAuditTrail();
|
|
578
|
-
|
|
581
|
+
rbacLogger.debug('Permission audit:', auditTrail);
|
|
579
582
|
```
|
|
580
583
|
|
|
581
584
|
## Best Practices
|
|
@@ -743,12 +746,15 @@ setupRBAC(supabase);
|
|
|
743
746
|
Enable debug logging to troubleshoot permission issues:
|
|
744
747
|
|
|
745
748
|
```tsx
|
|
749
|
+
import { getRBACLogger } from '@jmruthers/pace-core/rbac';
|
|
750
|
+
|
|
746
751
|
// Add to your app for debugging
|
|
747
752
|
const { getDebugInfo } = usePermissionCache();
|
|
753
|
+
const rbacLogger = getRBACLogger();
|
|
748
754
|
|
|
749
755
|
// Log debug information
|
|
750
756
|
const debugInfo = getDebugInfo();
|
|
751
|
-
|
|
757
|
+
rbacLogger.debug('Permission debug:', debugInfo);
|
|
752
758
|
```
|
|
753
759
|
|
|
754
760
|
## 🎯 **Pattern Selection Guide**
|
package/docs/styles/README.md
CHANGED
|
@@ -100,7 +100,6 @@ Every app must define three color palettes with complete shade ranges (50-950):
|
|
|
100
100
|
@source "./node_modules/@jmruthers/pace-core/src/hooks/**/*.{js,ts,jsx,tsx}";
|
|
101
101
|
@source "./node_modules/@jmruthers/pace-core/src/utils/**/*.{js,ts,jsx,tsx}";
|
|
102
102
|
@source "./node_modules/@jmruthers/pace-core/src/types/**/*.{js,ts,jsx,tsx}";
|
|
103
|
-
@source "./node_modules/@jmruthers/pace-core/src/validation/**/*.{js,ts,jsx,tsx}";
|
|
104
103
|
@source "./node_modules/@jmruthers/pace-core/src/rbac/**/*.{js,ts,jsx,tsx}";
|
|
105
104
|
|
|
106
105
|
/* This file is only to contain the color palette for the app. NEVER ADD ANY CSS OVERRIDES TO THIS FILE!! */
|
|
@@ -215,7 +214,6 @@ Create `src/app.css` in your consuming app with your brand colors and source dir
|
|
|
215
214
|
@source "./node_modules/@jmruthers/pace-core/src/hooks/**/*.{js,ts,jsx,tsx}";
|
|
216
215
|
@source "./node_modules/@jmruthers/pace-core/src/utils/**/*.{js,ts,jsx,tsx}";
|
|
217
216
|
@source "./node_modules/@jmruthers/pace-core/src/types/**/*.{js,ts,jsx,tsx}";
|
|
218
|
-
@source "./node_modules/@jmruthers/pace-core/src/validation/**/*.{js,ts,jsx,tsx}";
|
|
219
217
|
@source "./node_modules/@jmruthers/pace-core/src/rbac/**/*.{js,ts,jsx,tsx}";
|
|
220
218
|
|
|
221
219
|
/* Define your brand color palettes */
|