@jmruthers/pace-core 0.5.134 → 0.5.136
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-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
- package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
- package/dist/chunk-444EZN6N.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
- package/dist/chunk-4MT5BGGL.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-5DPZ5EAT.js +60 -0
- package/dist/chunk-5DPZ5EAT.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-APIBCTL2.js +670 -0
- package/dist/chunk-APIBCTL2.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-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-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
- package/dist/chunk-FHWWBIHA.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-HJGGOMQ6.js} +194 -518
- package/dist/chunk-HJGGOMQ6.js.map +1 -0
- package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
- package/dist/chunk-K2WWTH7O.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
- package/dist/chunk-L6PGMCMD.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.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-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
- package/dist/chunk-LTV3XIJJ.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
- package/dist/chunk-NOHEVYVX.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-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
- package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
- package/dist/chunk-TVYPTYOY.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
- package/dist/chunk-YLKIDTUK.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 +26 -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 +22 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +219 -9
- package/dist/index.js +49 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +5 -4
- package/dist/rbac/index.js +13 -12
- 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 +2 -2
- package/dist/types.js +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 +195 -232
- package/dist/utils.js +173 -331
- package/dist/utils.js.map +1 -1
- package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
- package/dist/validation.d.ts +261 -10
- package/dist/validation.js +82 -440
- 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/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 +3 -3
- 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 +90 -0
- package/docs/api/interfaces/ExportOptions.md +126 -0
- 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 +648 -212
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -2
- 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/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components/DataTable/index.ts +13 -0
- package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components/Dialog/index.ts +15 -0
- package/examples/components/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
- package/examples/index.ts +11 -3
- package/package.json +30 -10
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- 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__/styles.test.ts +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- 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/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- 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__/ImportModal.test.tsx +1 -1
- 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 +1 -1
- package/src/components/DataTable/types.ts +13 -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/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- 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.tsx +1 -1
- package/src/components/Form/Form.test.tsx +4 -509
- 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.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.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 +13 -12
- 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/index.ts +4 -2
- package/src/components/Select/Select.tsx +1 -1
- 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/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +4 -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__/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 +25 -8
- 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/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/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
- package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
- package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
- package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
- package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
- package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
- package/src/utils/{logger.ts → core/logger.ts} +4 -2
- package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
- package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
- package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
- package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
- package/src/utils/index.ts +32 -54
- package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
- package/src/utils/{security.ts → security/security.ts} +5 -2
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
- package/src/validation/index.ts +3 -34
- package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
- 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.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/src/components/Dialog/README.md +0 -804
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
- package/src/examples/PublicEventPage.tsx +0 -287
- package/src/examples/PublicPageApp.tsx +0 -321
- package/src/examples/PublicPageUsageExample.tsx +0 -218
- package/src/utils/schemaUtils.ts +0 -37
- 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-CYOHOX3O.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.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-2TWNJ46Y.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
- /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/index.ts +0 -0
- /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
- /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
- /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
- /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
- /package/src/utils/{cn.ts → core/cn.ts} +0 -0
- /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
- /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
- /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
- /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
- /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
- /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
- /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
- /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
- /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
- /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
- /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
- /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
- /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
- /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
- /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +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
- /package/src/utils/{validation.ts → validation/validation.ts} +0 -0
package/dist/components.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { A as Alert, m as AlertDescription, l as AlertTitle, n as Avatar, p as AvatarFallback, o as AvatarImage, B as Button, a as ButtonProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, q as Checkbox,
|
|
1
|
+
export { b as UnifiedAuthContextType, U as UnifiedAuthProvider, a as UnifiedAuthProviderProps, u as useUnifiedAuth } from './UnifiedAuthProvider-DJxGTftH.js';
|
|
2
|
+
export { A as Alert, m as AlertDescription, l as AlertTitle, n as Avatar, p as AvatarFallback, o as AvatarImage, B as Button, a as ButtonProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, q as Checkbox, b1 as DefaultPublicErrorFallback, D as Dialog, K as DialogBody, G as DialogClose, H as DialogContent, U as DialogContentProps, O as DialogDescription, Z as DialogDescriptionProps, M as DialogFooter, X as DialogFooterProps, J as DialogHeader, W as DialogHeaderProps, E as DialogOverlay, V as DialogOverlayProps, z as DialogPortal, Q as DialogProps, _ as DialogSize, N as DialogTitle, Y as DialogTitleProps, F as DialogTrigger, R as DialogTriggerProps, aB as ErrorBoundary, aC as ErrorBoundaryProps, aD as ErrorBoundaryState, b5 as EventLogo, b6 as EventLogoCompact, b7 as EventLogoLarge, b8 as EventLogoProps, aH as EventSelector, aK as FileDisplay, aL as FileDisplayProps, aI as FileUpload, aJ as FileUploadProps, ar as Footer, as as FooterProps, am as Form, an as FormProps, aq as Header, I as Input, j as InputProps, L as Label, k as LabelProps, aE as LoadingSpinner, ao as LoginForm, ap as LoginFormProps, ax as NavigationItem, av as NavigationMenu, aw as NavigationMenuProps, ay as OrganisationSelector, az as OrganisationSelectorProps, bg as PaceAppLayout, bf as PaceAppLayoutProps, bi as PaceLoginPage, bh as PaceLoginPageProps, P as Progress, at as ProtectedRoute, au as ProtectedRouteProps, a$ as PublicErrorBoundary, bc as PublicErrorBoundaryProps, bd as PublicErrorBoundaryState, b4 as PublicLoadingSkeleton, b2 as PublicLoadingSpinner, b3 as PublicLoadingSpinnerFullPage, be as PublicLoadingSpinnerProps, a_ as PublicPageContextChecker, aZ as PublicPageFooter, bb as PublicPageFooterProps, aV as PublicPageHeader, ba as PublicPageHeaderProps, aT as PublicPageLayout, b9 as PublicPageLayoutProps, aW as PublicPageProvider, $ as Select, a3 as SelectContent, a0 as SelectGroup, a5 as SelectItem, a4 as SelectLabel, a6 as SelectSeparator, a2 as SelectTrigger, a1 as SelectValue, aF as SessionRestorationLoader, aG as SessionRestorationLoaderProps, S as Switch, r as SwitchProps, T as Table, t as TableBody, u as TableCaption, v as TableCell, w as TableFooter, x as TableHead, s as TableHeader, y as TableRow, a7 as Toast, a9 as ToastAction, af as ToastActionElement, ae as ToastClose, ad as ToastDescription, ag as ToastProps, aa as ToastProvider, ac as ToastTitle, ab as ToastViewport, a8 as Toaster, ah as Tooltip, aj as TooltipContent, ak as TooltipProvider, al as TooltipRoot, ai as TooltipTrigger, aS as UseFileReferenceForRecordReturn, aQ as UseFileReferenceOptions, aR as UseFileReferenceReturn, aA as UserMenu, b0 as useErrorBoundary, aM as useFileReference, aO as useFileReferenceById, aN as useFileReferenceForRecord, aP as useFilesByCategory, aY as useIsPublicPage, aU as usePublicPageContext, aX as usePublicPageProviderContext } from './EventLogo-801uofbR.js';
|
|
3
3
|
export { u as useToast } from './useToast-C8gR5ir4.js';
|
|
4
|
-
export { D as DataTable, a as DataTableProps } from './DataTable-
|
|
5
|
-
export { A as AggregateConfig,
|
|
4
|
+
export { D as DataTable, a as DataTableProps } from './DataTable-CWAZZcXC.js';
|
|
5
|
+
export { A as AggregateConfig, c as DataRecord, a as DataTableAction, D as DataTableColumn, b as DataTableToolbarButton, E as EmptyStateConfig, G as GetRowId } from './types-Dfz9dmVH.js';
|
|
6
6
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
7
7
|
import React__default from 'react';
|
|
8
|
-
import { FieldValues, FieldPath
|
|
9
|
-
export {
|
|
8
|
+
import { FieldValues, FieldPath } from 'react-hook-form';
|
|
9
|
+
export { F as FileCategory, b as FileMetadata, a as FileReference, c as FileUploadOptions } from './file-reference-C6Gkn77H.js';
|
|
10
10
|
import '@supabase/supabase-js';
|
|
11
11
|
import './organisation-D6qRDtbF.js';
|
|
12
12
|
import './unified-DQ4VcT7H.js';
|
|
@@ -102,284 +102,4 @@ interface FormFieldProps<TFieldValues extends FieldValues = FieldValues, TName e
|
|
|
102
102
|
*/
|
|
103
103
|
declare function FormField<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ name, label, type, placeholder, inputProps, validation, render, 'data-testid': testId, className, }: FormFieldProps<TFieldValues, TName>): react_jsx_runtime.JSX.Element;
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
* @file FormErrorSummary Component
|
|
107
|
-
* @package @jmruthers/pace-core
|
|
108
|
-
* @module Components/Form
|
|
109
|
-
* @since 0.1.0
|
|
110
|
-
*
|
|
111
|
-
* A form error summary component that displays validation errors in a user-friendly format.
|
|
112
|
-
* Provides a centralized location for users to see all form errors at once.
|
|
113
|
-
*
|
|
114
|
-
* Features:
|
|
115
|
-
* - Displays all form errors in one place
|
|
116
|
-
* - Configurable error display format
|
|
117
|
-
* - Optional field name display
|
|
118
|
-
* - Accessible error presentation
|
|
119
|
-
* - Consistent styling with Alert component
|
|
120
|
-
* - Automatic error filtering
|
|
121
|
-
* - Responsive design
|
|
122
|
-
*
|
|
123
|
-
* @example
|
|
124
|
-
* ```tsx
|
|
125
|
-
* // Basic error summary
|
|
126
|
-
* <FormErrorSummary errors={formErrors} />
|
|
127
|
-
*
|
|
128
|
-
* // With custom title
|
|
129
|
-
* <FormErrorSummary
|
|
130
|
-
* errors={formErrors}
|
|
131
|
-
* title="Please correct the following issues:"
|
|
132
|
-
* />
|
|
133
|
-
*
|
|
134
|
-
* // Show field names with errors
|
|
135
|
-
* <FormErrorSummary
|
|
136
|
-
* errors={formErrors}
|
|
137
|
-
* showFieldNames={true}
|
|
138
|
-
* />
|
|
139
|
-
*
|
|
140
|
-
* // In a form with React Hook Form
|
|
141
|
-
* const { formState: { errors } } = useForm();
|
|
142
|
-
*
|
|
143
|
-
* <Form onSubmit={handleSubmit}>
|
|
144
|
-
* <FormField name="email" label="Email" />
|
|
145
|
-
* <FormField name="password" label="Password" />
|
|
146
|
-
* <FormErrorSummary errors={errors} />
|
|
147
|
-
* <Button type="submit">Submit</Button>
|
|
148
|
-
* </Form>
|
|
149
|
-
* ```
|
|
150
|
-
*
|
|
151
|
-
* @accessibility
|
|
152
|
-
* - Uses Alert component for consistent accessibility
|
|
153
|
-
* - Proper heading hierarchy with h3
|
|
154
|
-
* - List structure for error items
|
|
155
|
-
* - Screen reader friendly error announcements
|
|
156
|
-
* - High contrast support via Alert component
|
|
157
|
-
*
|
|
158
|
-
* @dependencies
|
|
159
|
-
* - Alert component for consistent styling
|
|
160
|
-
* - React 18+ - Component framework
|
|
161
|
-
* - Tailwind CSS - Styling
|
|
162
|
-
*/
|
|
163
|
-
interface FormErrorSummaryProps {
|
|
164
|
-
/** Form validation errors object */
|
|
165
|
-
errors?: Record<string, any>;
|
|
166
|
-
/** Title displayed above the error list */
|
|
167
|
-
title?: string;
|
|
168
|
-
/** Whether to show field names alongside error messages */
|
|
169
|
-
showFieldNames?: boolean;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* FormErrorSummary component for displaying form validation errors
|
|
173
|
-
*
|
|
174
|
-
* This component provides a user-friendly way to display all form errors
|
|
175
|
-
* in one centralized location, improving the user experience by making
|
|
176
|
-
* it clear what needs to be fixed.
|
|
177
|
-
*
|
|
178
|
-
* @param props - Component configuration
|
|
179
|
-
* @param props.errors - Form validation errors object
|
|
180
|
-
* @param props.title - Title displayed above the error list
|
|
181
|
-
* @param props.showFieldNames - Whether to show field names with errors
|
|
182
|
-
* @returns JSX.Element - The rendered error summary or null if no errors
|
|
183
|
-
*/
|
|
184
|
-
declare function FormErrorSummary({ errors, title, showFieldNames }: FormErrorSummaryProps): react_jsx_runtime.JSX.Element | null;
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* @file FormLiveRegion Component
|
|
188
|
-
* @package @jmruthers/pace-core
|
|
189
|
-
* @module Components/Form
|
|
190
|
-
* @since 0.1.0
|
|
191
|
-
*
|
|
192
|
-
* An accessible live region component for form validation announcements.
|
|
193
|
-
* Provides real-time feedback to screen readers about form validation states
|
|
194
|
-
* and error messages, improving accessibility for users with assistive technologies.
|
|
195
|
-
*
|
|
196
|
-
* Features:
|
|
197
|
-
* - Real-time form validation announcements
|
|
198
|
-
* - Configurable politeness levels (polite/assertive)
|
|
199
|
-
* - Customizable delay timing
|
|
200
|
-
* - Field-level and form-level announcements
|
|
201
|
-
* - Success message customization
|
|
202
|
-
* - Automatic error counting and field identification
|
|
203
|
-
* - Accessibility compliant with ARIA live regions
|
|
204
|
-
* - Integration with React Hook Form
|
|
205
|
-
*
|
|
206
|
-
* @example
|
|
207
|
-
* ```tsx
|
|
208
|
-
* // Basic live region
|
|
209
|
-
* const { control, formState } = useForm();
|
|
210
|
-
*
|
|
211
|
-
* <Form onSubmit={handleSubmit}>
|
|
212
|
-
* <FormField name="email" label="Email" />
|
|
213
|
-
* <FormField name="password" label="Password" />
|
|
214
|
-
* <FormLiveRegion form={{ control, formState }} />
|
|
215
|
-
* <Button type="submit">Submit</Button>
|
|
216
|
-
* </Form>
|
|
217
|
-
*
|
|
218
|
-
* // With custom configuration
|
|
219
|
-
* <FormLiveRegion
|
|
220
|
-
* form={{ control, formState }}
|
|
221
|
-
* politeness="assertive"
|
|
222
|
-
* delay={1000}
|
|
223
|
-
* successMessage="Your form was submitted successfully!"
|
|
224
|
-
* enableFieldAnnouncements={true}
|
|
225
|
-
* />
|
|
226
|
-
*
|
|
227
|
-
* // In a complex form
|
|
228
|
-
* function ComplexForm() {
|
|
229
|
-
* const methods = useForm({
|
|
230
|
-
* defaultValues: { name: '', email: '', message: '' }
|
|
231
|
-
* });
|
|
232
|
-
*
|
|
233
|
-
* return (
|
|
234
|
-
* <FormProvider {...methods}>
|
|
235
|
-
* <form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
236
|
-
* <FormField name="name" label="Name" />
|
|
237
|
-
* <FormField name="email" label="Email" />
|
|
238
|
-
* <FormField name="message" label="Message" />
|
|
239
|
-
* <FormLiveRegion
|
|
240
|
-
* form={methods}
|
|
241
|
-
* politeness="polite"
|
|
242
|
-
* delay={300}
|
|
243
|
-
* />
|
|
244
|
-
* <Button type="submit">Send Message</Button>
|
|
245
|
-
* </form>
|
|
246
|
-
* </FormProvider>
|
|
247
|
-
* );
|
|
248
|
-
* }
|
|
249
|
-
* ```
|
|
250
|
-
*
|
|
251
|
-
* @accessibility
|
|
252
|
-
* - ARIA live region for screen reader announcements
|
|
253
|
-
* - Configurable politeness levels for different message types
|
|
254
|
-
* - Automatic error counting and field identification
|
|
255
|
-
* - Non-intrusive validation feedback
|
|
256
|
-
* - WCAG 2.1 AA compliant
|
|
257
|
-
* - Screen reader friendly error announcements
|
|
258
|
-
*
|
|
259
|
-
* @dependencies
|
|
260
|
-
* - react-hook-form - Form state management
|
|
261
|
-
* - React 18+ - Hooks and effects
|
|
262
|
-
* - Tailwind CSS - Styling
|
|
263
|
-
*/
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Props for the FormLiveRegion component
|
|
267
|
-
*/
|
|
268
|
-
interface FormLiveRegionProps<T extends FieldValues> {
|
|
269
|
-
/** React Hook Form instance */
|
|
270
|
-
form: UseFormReturn<T>;
|
|
271
|
-
/** ARIA live region politeness level */
|
|
272
|
-
politeness?: 'polite' | 'assertive';
|
|
273
|
-
/** Delay before announcing messages (in ms) */
|
|
274
|
-
delay?: number;
|
|
275
|
-
/** Custom success message */
|
|
276
|
-
successMessage?: string;
|
|
277
|
-
/** Custom class name */
|
|
278
|
-
className?: string;
|
|
279
|
-
/** Enable field-level validation announcements */
|
|
280
|
-
enableFieldAnnouncements?: boolean;
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* FormLiveRegion component for accessible form validation announcements
|
|
284
|
-
*/
|
|
285
|
-
declare function FormLiveRegion<T extends FieldValues>({ form, politeness, delay, successMessage, className, enableFieldAnnouncements }: FormLiveRegionProps<T>): React__default.ReactElement;
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* @file FormFieldset Component
|
|
289
|
-
* @package @jmruthers/pace-core
|
|
290
|
-
* @module Components/Form
|
|
291
|
-
* @since 0.1.0
|
|
292
|
-
*
|
|
293
|
-
* A form fieldset component that groups related form fields together with a legend
|
|
294
|
-
* and optional description. Provides semantic structure and accessibility for form sections.
|
|
295
|
-
*
|
|
296
|
-
* Features:
|
|
297
|
-
* - Semantic fieldset grouping for related form fields
|
|
298
|
-
* - Accessible legend with required indicator
|
|
299
|
-
* - Optional description text with proper ARIA association
|
|
300
|
-
* - Consistent styling with design system
|
|
301
|
-
* - Forwarded ref support
|
|
302
|
-
* - Customizable styling via className
|
|
303
|
-
* - Required field indication
|
|
304
|
-
* - Responsive design
|
|
305
|
-
*
|
|
306
|
-
* @example
|
|
307
|
-
* ```tsx
|
|
308
|
-
* // Basic fieldset
|
|
309
|
-
* <FormFieldset legend="Personal Information">
|
|
310
|
-
* <FormField name="firstName" label="First Name" />
|
|
311
|
-
* <FormField name="lastName" label="Last Name" />
|
|
312
|
-
* <FormField name="email" label="Email" />
|
|
313
|
-
* </FormFieldset>
|
|
314
|
-
*
|
|
315
|
-
* // Fieldset with description
|
|
316
|
-
* <FormFieldset
|
|
317
|
-
* legend="Contact Details"
|
|
318
|
-
* description="We'll use this information to contact you about your order"
|
|
319
|
-
* >
|
|
320
|
-
* <FormField name="phone" label="Phone Number" />
|
|
321
|
-
* <FormField name="address" label="Address" />
|
|
322
|
-
* </FormFieldset>
|
|
323
|
-
*
|
|
324
|
-
* // Required fieldset
|
|
325
|
-
* <FormFieldset
|
|
326
|
-
* legend="Account Settings"
|
|
327
|
-
* required={true}
|
|
328
|
-
* description="These settings are required for account creation"
|
|
329
|
-
* >
|
|
330
|
-
* <FormField name="username" label="Username" required />
|
|
331
|
-
* <FormField name="password" label="Password" type="password" required />
|
|
332
|
-
* </FormFieldset>
|
|
333
|
-
*
|
|
334
|
-
* // With custom styling
|
|
335
|
-
* <FormFieldset
|
|
336
|
-
* legend="Preferences"
|
|
337
|
-
* className="bg-sec-50 border-sec-200"
|
|
338
|
-
* >
|
|
339
|
-
* <FormField name="newsletter" label="Subscribe to newsletter" type="checkbox" />
|
|
340
|
-
* <FormField name="notifications" label="Enable notifications" type="checkbox" />
|
|
341
|
-
* </FormFieldset>
|
|
342
|
-
* ```
|
|
343
|
-
*
|
|
344
|
-
* @accessibility
|
|
345
|
-
* - Proper semantic HTML with fieldset and legend
|
|
346
|
-
* - ARIA describedby association for descriptions
|
|
347
|
-
* - Required field indication with asterisk
|
|
348
|
-
* - Screen reader friendly structure
|
|
349
|
-
* - Keyboard navigation support
|
|
350
|
-
* - WCAG 2.1 AA compliant
|
|
351
|
-
*
|
|
352
|
-
* @dependencies
|
|
353
|
-
* - React 18+ - Component framework and hooks
|
|
354
|
-
* - Tailwind CSS - Styling
|
|
355
|
-
* - cn utility - Class name merging
|
|
356
|
-
*/
|
|
357
|
-
|
|
358
|
-
interface FormFieldsetProps extends React__default.FieldsetHTMLAttributes<HTMLFieldSetElement> {
|
|
359
|
-
/** The legend text for the fieldset */
|
|
360
|
-
legend: string;
|
|
361
|
-
/** Optional description text below the legend */
|
|
362
|
-
description?: string;
|
|
363
|
-
/** Whether the fieldset contains required fields */
|
|
364
|
-
required?: boolean;
|
|
365
|
-
/** Form fields to group within the fieldset */
|
|
366
|
-
children: React__default.ReactNode;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* FormFieldset component for grouping related form fields
|
|
370
|
-
*
|
|
371
|
-
* This component provides semantic grouping for form fields with proper
|
|
372
|
-
* accessibility support and consistent styling. Use it to organize
|
|
373
|
-
* related form inputs into logical sections.
|
|
374
|
-
*
|
|
375
|
-
* @param props - Component configuration
|
|
376
|
-
* @param props.legend - The legend text for the fieldset
|
|
377
|
-
* @param props.description - Optional description text
|
|
378
|
-
* @param props.required - Whether the fieldset contains required fields
|
|
379
|
-
* @param props.children - Form fields to group
|
|
380
|
-
* @param ref - Forwarded ref to the fieldset element
|
|
381
|
-
* @returns JSX.Element - The rendered fieldset with legend and fields
|
|
382
|
-
*/
|
|
383
|
-
declare const FormFieldset: React__default.ForwardRefExoticComponent<FormFieldsetProps & React__default.RefAttributes<HTMLFieldSetElement>>;
|
|
384
|
-
|
|
385
|
-
export { FormErrorSummary, type FormErrorSummaryProps, FormField, type FormFieldProps, FormFieldset, type FormFieldsetProps, FormLiveRegion, type FormLiveRegionProps };
|
|
105
|
+
export { FormField, type FormFieldProps };
|
package/dist/components.js
CHANGED
|
@@ -3,6 +3,9 @@ import {
|
|
|
3
3
|
AvatarFallback,
|
|
4
4
|
AvatarImage,
|
|
5
5
|
ErrorBoundary,
|
|
6
|
+
EventLogo,
|
|
7
|
+
EventLogoCompact,
|
|
8
|
+
EventLogoLarge,
|
|
6
9
|
EventSelector,
|
|
7
10
|
FileDisplay,
|
|
8
11
|
FileUpload,
|
|
@@ -15,14 +18,11 @@ import {
|
|
|
15
18
|
OrganisationSelector,
|
|
16
19
|
PaceAppLayout,
|
|
17
20
|
PaceLoginPage,
|
|
18
|
-
PasswordResetForm,
|
|
19
21
|
ProtectedRoute,
|
|
20
22
|
PublicLoadingSkeleton,
|
|
21
23
|
PublicLoadingSpinner,
|
|
22
24
|
PublicLoadingSpinnerFullPage,
|
|
23
25
|
PublicPageContextChecker,
|
|
24
|
-
PublicPageDebugger,
|
|
25
|
-
PublicPageDiagnostic,
|
|
26
26
|
PublicPageFooter,
|
|
27
27
|
PublicPageHeader,
|
|
28
28
|
PublicPageLayout,
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
useFileReferenceForRecord,
|
|
51
51
|
useFilesByCategory,
|
|
52
52
|
usePublicPageContext as usePublicPageContext2
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-NOHEVYVX.js";
|
|
54
54
|
import {
|
|
55
55
|
Alert,
|
|
56
56
|
AlertDescription,
|
|
@@ -91,10 +91,10 @@ import {
|
|
|
91
91
|
TooltipProvider,
|
|
92
92
|
TooltipRoot,
|
|
93
93
|
TooltipTrigger
|
|
94
|
-
} from "./chunk-
|
|
95
|
-
import "./chunk-
|
|
96
|
-
import "./chunk-
|
|
97
|
-
import "./chunk-
|
|
94
|
+
} from "./chunk-HJGGOMQ6.js";
|
|
95
|
+
import "./chunk-L6PGMCMD.js";
|
|
96
|
+
import "./chunk-BVYWGZVV.js";
|
|
97
|
+
import "./chunk-SBVILCCA.js";
|
|
98
98
|
import {
|
|
99
99
|
DefaultPublicErrorFallback,
|
|
100
100
|
PublicErrorBoundary,
|
|
@@ -102,33 +102,35 @@ import {
|
|
|
102
102
|
useErrorBoundary,
|
|
103
103
|
useIsPublicPage,
|
|
104
104
|
usePublicPageContext
|
|
105
|
-
} from "./chunk-
|
|
105
|
+
} from "./chunk-TVYPTYOY.js";
|
|
106
106
|
import {
|
|
107
107
|
useToast
|
|
108
|
-
} from "./chunk-
|
|
109
|
-
import "./chunk-
|
|
108
|
+
} from "./chunk-BESYRHQM.js";
|
|
109
|
+
import "./chunk-SL2YQDR6.js";
|
|
110
110
|
import {
|
|
111
111
|
init_UnifiedAuthProvider
|
|
112
|
-
} from "./chunk-
|
|
113
|
-
import "./chunk-
|
|
112
|
+
} from "./chunk-2TWNJ46Y.js";
|
|
113
|
+
import "./chunk-XARJS7CD.js";
|
|
114
114
|
import {
|
|
115
115
|
UnifiedAuthProvider,
|
|
116
116
|
useUnifiedAuth
|
|
117
|
-
} from "./chunk-
|
|
117
|
+
} from "./chunk-4MT5BGGL.js";
|
|
118
118
|
import {
|
|
119
119
|
FileCategory
|
|
120
120
|
} from "./chunk-XJ2HZOBU.js";
|
|
121
121
|
import {
|
|
122
122
|
LoadingSpinner
|
|
123
|
-
} from "./chunk-
|
|
124
|
-
import "./chunk-
|
|
125
|
-
import "./chunk-
|
|
123
|
+
} from "./chunk-S5OFRT4M.js";
|
|
124
|
+
import "./chunk-Q5QRDWKI.js";
|
|
125
|
+
import "./chunk-5DPZ5EAT.js";
|
|
126
|
+
import "./chunk-FMUCXFII.js";
|
|
126
127
|
import {
|
|
127
128
|
cn
|
|
128
|
-
} from "./chunk-
|
|
129
|
-
import "./chunk-
|
|
130
|
-
import "./chunk-
|
|
131
|
-
import "./chunk-
|
|
129
|
+
} from "./chunk-56XJ3TU6.js";
|
|
130
|
+
import "./chunk-K2WWTH7O.js";
|
|
131
|
+
import "./chunk-444EZN6N.js";
|
|
132
|
+
import "./chunk-ERISIBYU.js";
|
|
133
|
+
import "./chunk-XDNLUEXI.js";
|
|
132
134
|
import "./chunk-PLDDJCW6.js";
|
|
133
135
|
|
|
134
136
|
// src/components/index.ts
|
|
@@ -187,136 +189,6 @@ function FormField({
|
|
|
187
189
|
errorMessage && /* @__PURE__ */ jsx("p", { className: "text-destructive", role: "alert", children: errorMessage })
|
|
188
190
|
] });
|
|
189
191
|
}
|
|
190
|
-
|
|
191
|
-
// src/components/Form/FormErrorSummary.tsx
|
|
192
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
193
|
-
function FormErrorSummary({
|
|
194
|
-
errors = {},
|
|
195
|
-
title = "Please fix the following errors:",
|
|
196
|
-
showFieldNames = false
|
|
197
|
-
}) {
|
|
198
|
-
const errorEntries = Object.entries(errors).filter(([, value]) => Boolean(value));
|
|
199
|
-
if (errorEntries.length === 0) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
return /* @__PURE__ */ jsx2(Alert, { variant: "destructive", className: "mb-4", children: /* @__PURE__ */ jsxs2("div", { children: [
|
|
203
|
-
/* @__PURE__ */ jsx2("h3", { children: title }),
|
|
204
|
-
/* @__PURE__ */ jsx2("ul", { className: "list-disc list-inside space-y-1", children: errorEntries.map(([field, error], index) => {
|
|
205
|
-
const message = typeof error === "object" && error.message ? error.message : String(error);
|
|
206
|
-
return /* @__PURE__ */ jsx2("li", { className: "text-sm", children: showFieldNames ? `${field}: ${message}` : message }, index);
|
|
207
|
-
}) })
|
|
208
|
-
] }) });
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// src/components/Form/FormLiveRegion.tsx
|
|
212
|
-
import { useEffect, useState } from "react";
|
|
213
|
-
import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
|
|
214
|
-
function FormLiveRegion({
|
|
215
|
-
form,
|
|
216
|
-
politeness = "polite",
|
|
217
|
-
delay = 500,
|
|
218
|
-
successMessage = "Form submitted successfully",
|
|
219
|
-
className,
|
|
220
|
-
enableFieldAnnouncements = true
|
|
221
|
-
}) {
|
|
222
|
-
const [message, setMessage] = useState("");
|
|
223
|
-
const { formState } = form;
|
|
224
|
-
useEffect(() => {
|
|
225
|
-
let timeoutId;
|
|
226
|
-
if (formState.isSubmitting) {
|
|
227
|
-
setMessage("Submitting form...");
|
|
228
|
-
} else if (formState.isSubmitSuccessful) {
|
|
229
|
-
timeoutId = setTimeout(() => {
|
|
230
|
-
setMessage(successMessage);
|
|
231
|
-
}, delay);
|
|
232
|
-
} else if (formState.errors && Object.keys(formState.errors).length > 0) {
|
|
233
|
-
const errorCount = Object.keys(formState.errors).length;
|
|
234
|
-
const errorFields = Object.keys(formState.errors).join(", ");
|
|
235
|
-
setMessage(`Form has ${errorCount} error${errorCount === 1 ? "" : "s"} in: ${errorFields}`);
|
|
236
|
-
} else if (formState.isValid && formState.isDirty) {
|
|
237
|
-
setMessage("Form is valid");
|
|
238
|
-
} else {
|
|
239
|
-
setMessage("");
|
|
240
|
-
}
|
|
241
|
-
return () => {
|
|
242
|
-
if (timeoutId) {
|
|
243
|
-
clearTimeout(timeoutId);
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
}, [formState, delay, successMessage]);
|
|
247
|
-
useEffect(() => {
|
|
248
|
-
if (!enableFieldAnnouncements) return;
|
|
249
|
-
let timeoutId;
|
|
250
|
-
const fieldErrors = formState.errors;
|
|
251
|
-
const touchedFields = formState.touchedFields;
|
|
252
|
-
const newErrors = Object.keys(fieldErrors).filter((field) => {
|
|
253
|
-
const touchedField = touchedFields;
|
|
254
|
-
return touchedField[field] && fieldErrors[field];
|
|
255
|
-
});
|
|
256
|
-
if (newErrors.length > 0) {
|
|
257
|
-
timeoutId = setTimeout(() => {
|
|
258
|
-
const errorField = newErrors[0];
|
|
259
|
-
const errorData = fieldErrors[errorField];
|
|
260
|
-
const errorMessage = errorData?.message;
|
|
261
|
-
if (errorMessage) {
|
|
262
|
-
setMessage(`${errorField}: ${errorMessage}`);
|
|
263
|
-
}
|
|
264
|
-
}, delay);
|
|
265
|
-
}
|
|
266
|
-
return () => {
|
|
267
|
-
if (timeoutId) {
|
|
268
|
-
clearTimeout(timeoutId);
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
}, [formState.errors, formState.touchedFields, enableFieldAnnouncements, delay]);
|
|
272
|
-
if (!message) {
|
|
273
|
-
return /* @__PURE__ */ jsx3(Fragment, {});
|
|
274
|
-
}
|
|
275
|
-
return /* @__PURE__ */ jsx3(
|
|
276
|
-
"div",
|
|
277
|
-
{
|
|
278
|
-
role: "status",
|
|
279
|
-
"aria-live": politeness,
|
|
280
|
-
"aria-atomic": "true",
|
|
281
|
-
className: cn("sr-only", className),
|
|
282
|
-
style: {
|
|
283
|
-
position: "absolute",
|
|
284
|
-
left: "-10000px",
|
|
285
|
-
width: "1px",
|
|
286
|
-
height: "1px",
|
|
287
|
-
overflow: "hidden"
|
|
288
|
-
},
|
|
289
|
-
children: message
|
|
290
|
-
}
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// src/components/Form/FormFieldset.tsx
|
|
295
|
-
import React2 from "react";
|
|
296
|
-
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
297
|
-
var FormFieldset = React2.forwardRef(
|
|
298
|
-
({ legend, description, required, className, children, ...props }, ref) => {
|
|
299
|
-
const descriptionId = React2.useId();
|
|
300
|
-
return /* @__PURE__ */ jsxs3(
|
|
301
|
-
"fieldset",
|
|
302
|
-
{
|
|
303
|
-
ref,
|
|
304
|
-
className: cn("space-y-4 border border-input rounded-lg p-4", className),
|
|
305
|
-
"aria-describedby": description ? descriptionId : void 0,
|
|
306
|
-
...props,
|
|
307
|
-
children: [
|
|
308
|
-
/* @__PURE__ */ jsxs3("legend", { className: "px-2", children: [
|
|
309
|
-
legend,
|
|
310
|
-
required && /* @__PURE__ */ jsx4("span", { className: "text-destructive ml-1", children: "*" })
|
|
311
|
-
] }),
|
|
312
|
-
description && /* @__PURE__ */ jsx4("p", { id: descriptionId, className: "text-muted-foreground", children: description }),
|
|
313
|
-
children
|
|
314
|
-
]
|
|
315
|
-
}
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
);
|
|
319
|
-
FormFieldset.displayName = "FormFieldset";
|
|
320
192
|
export {
|
|
321
193
|
Alert,
|
|
322
194
|
AlertDescription,
|
|
@@ -347,16 +219,16 @@ export {
|
|
|
347
219
|
DialogTitle,
|
|
348
220
|
DialogTrigger,
|
|
349
221
|
ErrorBoundary,
|
|
222
|
+
EventLogo,
|
|
223
|
+
EventLogoCompact,
|
|
224
|
+
EventLogoLarge,
|
|
350
225
|
EventSelector,
|
|
351
226
|
FileCategory,
|
|
352
227
|
FileDisplay,
|
|
353
228
|
FileUpload,
|
|
354
229
|
Footer,
|
|
355
230
|
Form,
|
|
356
|
-
FormErrorSummary,
|
|
357
231
|
FormField,
|
|
358
|
-
FormFieldset,
|
|
359
|
-
FormLiveRegion,
|
|
360
232
|
Header,
|
|
361
233
|
Input,
|
|
362
234
|
Label,
|
|
@@ -366,7 +238,6 @@ export {
|
|
|
366
238
|
OrganisationSelector,
|
|
367
239
|
PaceAppLayout,
|
|
368
240
|
PaceLoginPage,
|
|
369
|
-
PasswordResetForm,
|
|
370
241
|
Progress,
|
|
371
242
|
ProtectedRoute,
|
|
372
243
|
PublicErrorBoundary,
|
|
@@ -374,8 +245,6 @@ export {
|
|
|
374
245
|
PublicLoadingSpinner,
|
|
375
246
|
PublicLoadingSpinnerFullPage,
|
|
376
247
|
PublicPageContextChecker,
|
|
377
|
-
PublicPageDebugger,
|
|
378
|
-
PublicPageDiagnostic,
|
|
379
248
|
PublicPageFooter,
|
|
380
249
|
PublicPageHeader,
|
|
381
250
|
PublicPageLayout,
|