@jmruthers/pace-core 0.5.54 → 0.5.55
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/README.md +0 -4
- package/dist/{DataTable-7FMFXA7A.js → DataTable-4T627QFJ.js} +11 -11
- package/dist/{PublicLoadingSpinner-Bq_-BeK-.d.ts → PublicLoadingSpinner-SL8WaQN7.d.ts} +2 -21
- package/dist/{api-H5A3H4IR.js → api-LUNF5O6M.js} +3 -3
- package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-DjpeG6P-.d.ts} +9 -1
- package/dist/{appNameResolver-7GHF5ED2.js → appNameResolver-UURKN7NF.js} +2 -2
- package/dist/{audit-BUW3LMJB.js → audit-6TOCAMKO.js} +2 -2
- package/dist/{chunk-MZBUOP4P.js → chunk-5BSLGBYI.js} +4 -3
- package/dist/chunk-5BSLGBYI.js.map +1 -0
- package/dist/{chunk-I5Z3QH5X.js → chunk-66C4BSAY.js} +2 -2
- package/dist/{chunk-I5Z3QH5X.js.map → chunk-66C4BSAY.js.map} +1 -1
- package/dist/{chunk-MYP2EGHX.js → chunk-AJ2KMES7.js} +21 -14
- package/dist/chunk-AJ2KMES7.js.map +1 -0
- package/dist/{chunk-EL2O4IUX.js → chunk-AQFRLC7K.js} +16 -24
- package/dist/{chunk-EL2O4IUX.js.map → chunk-AQFRLC7K.js.map} +1 -1
- package/dist/{chunk-7BNPOCLL.js → chunk-B2WTCLCV.js} +6 -2
- package/dist/chunk-B2WTCLCV.js.map +1 -0
- package/dist/{chunk-WJARTBCT.js → chunk-D7ARGIA3.js} +16 -7
- package/dist/chunk-D7ARGIA3.js.map +1 -0
- package/dist/{chunk-NRK4AIHQ.js → chunk-KBRACSJI.js} +3 -3
- package/dist/{chunk-NYUJ4FJR.js → chunk-KJDPSM64.js} +7 -7
- package/dist/chunk-KJDPSM64.js.map +1 -0
- package/dist/{chunk-GWSBHC4J.js → chunk-KLPVOPRI.js} +261 -38
- package/dist/chunk-KLPVOPRI.js.map +1 -0
- package/dist/{chunk-TRIZ7IB7.js → chunk-MPQDF75X.js} +148 -288
- package/dist/chunk-MPQDF75X.js.map +1 -0
- package/dist/{chunk-MSFACPQQ.js → chunk-PAEM3OWN.js} +11 -11
- package/dist/{chunk-MSFACPQQ.js.map → chunk-PAEM3OWN.js.map} +1 -1
- package/dist/{chunk-GIO7BFE7.js → chunk-RQD3D2CO.js} +66 -169
- package/dist/{chunk-GIO7BFE7.js.map → chunk-RQD3D2CO.js.map} +1 -1
- package/dist/{chunk-YDJW5XTN.js → chunk-STT7INZR.js} +25 -1
- package/dist/chunk-STT7INZR.js.map +1 -0
- package/dist/{chunk-6MTY77WU.js → chunk-TNMXZLDR.js} +3 -3
- package/dist/{chunk-BC3S53OZ.js → chunk-UQE2Y64H.js} +30 -14
- package/dist/chunk-UQE2Y64H.js.map +1 -0
- package/dist/{chunk-22KLBHPS.js → chunk-W66AZIOH.js} +2 -2
- package/dist/chunk-W66AZIOH.js.map +1 -0
- package/dist/{chunk-SS3E6QLB.js → chunk-YNUBMSMV.js} +2 -2
- package/dist/chunk-YNUBMSMV.js.map +1 -0
- package/dist/{chunk-NZ655MWE.js → chunk-ZOD2ZY6X.js} +5 -4
- package/dist/chunk-ZOD2ZY6X.js.map +1 -0
- package/dist/{chunk-74C6SNEC.js → chunk-ZPK5656W.js} +3 -3
- package/dist/{chunk-74C6SNEC.js.map → chunk-ZPK5656W.js.map} +1 -1
- package/dist/components.d.ts +22 -899
- package/dist/components.js +436 -3118
- package/dist/components.js.map +1 -1
- package/dist/file-reference-9xUOnwyt.d.ts +70 -0
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +10 -10
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +49 -9
- package/dist/index.js +190 -25
- package/dist/index.js.map +1 -1
- package/dist/{organisation-CO3Sh3_D.d.ts → organisation-t-vvQC3g.d.ts} +1 -8
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +5 -5
- package/dist/rbac/index.d.ts +65 -46
- package/dist/rbac/index.js +10 -12
- package/dist/styles/core.css +0 -125
- package/dist/types.d.ts +2 -1
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B2OcAsur.d.ts → usePublicRouteParams-CdoFxnJK.d.ts} +1 -1
- package/dist/utils.d.ts +3 -4
- package/dist/utils.js +44 -13
- package/dist/utils.js.map +1 -1
- package/docs/FILE_REFERENCE_SYSTEM.md +440 -0
- package/docs/INDEX.md +7 -5
- package/docs/README.md +0 -1
- package/docs/api/README.md +0 -4
- package/docs/api/classes/ErrorBoundary.md +1 -1
- 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 +2 -2
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +12 -12
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +6 -6
- 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 +281 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.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 +2 -2
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- 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/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +204 -200
- package/docs/api-reference/components.md +141 -163
- package/docs/api-reference/hooks.md +347 -0
- package/docs/core-concepts/rbac-system.md +69 -16
- package/docs/getting-started/examples/basic-auth-app.md +0 -1
- package/docs/implementation-guides/datatable-rbac-usage.md +12 -11
- package/docs/implementation-guides/file-upload-storage.md +733 -0
- package/docs/implementation-guides/inactivity-tracking.md +779 -0
- package/docs/implementation-guides/organisation-security.md +748 -0
- package/docs/implementation-guides/public-pages-advanced.md +1022 -0
- package/docs/migration/MIGRATION_GUIDE.md +684 -0
- package/docs/migration/README.md +13 -2
- package/docs/migration/rbac-migration.md +73 -0
- package/docs/rbac/examples/rbac-rls-integration-example.md +11 -13
- package/docs/style-guide.md +269 -1
- package/package.json +1 -1
- package/src/__tests__/TESTING_GUIDELINES.md +331 -18
- package/src/__tests__/helpers/supabaseMock.ts +99 -0
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -7
- package/src/__tests__/shared.ts +6 -0
- package/src/components/DataTable/components/ActionButtons.tsx +2 -2
- package/src/components/DataTable/components/DataTableCore.tsx +2 -2
- package/src/components/DataTable/components/UnifiedTableBody.tsx +1 -1
- package/src/components/DataTable/utils/debugTools.ts +2 -2
- package/src/components/Dialog/Dialog.test.tsx +12 -2
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +6 -6
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +2 -2
- package/src/components/FileDisplay.tsx +233 -0
- package/src/components/FileUpload.tsx +176 -0
- package/src/components/Footer/Footer.test.tsx +7 -7
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +13 -6
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +30 -3
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +558 -0
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
- package/src/components/PublicLayout/PublicPageDebugger.tsx +2 -2
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +2 -2
- package/src/components/PublicLayout/PublicPageProvider.tsx +2 -2
- package/src/components/Select/Select.test.tsx +50 -15
- package/src/components/SuperAdminGuard.tsx +2 -2
- package/src/components/__tests__/SuperAdminGuard.test.tsx +559 -0
- package/src/components/index.ts +0 -183
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +1 -1
- package/src/hooks/__tests__/useRBAC.unit.test.ts +191 -138
- package/src/hooks/public/usePublicEvent.ts +2 -2
- package/src/hooks/useAppConfig.ts +3 -3
- package/src/hooks/useComponentPerformance.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +1 -1
- package/src/hooks/useFileReference.ts +232 -0
- package/src/hooks/useOrganisationPermissions.test.ts +254 -344
- package/src/hooks/useOrganisationPermissions.ts +15 -7
- package/src/hooks/useOrganisationSecurity.test.ts +390 -402
- package/src/hooks/usePerformanceMonitor.ts +1 -1
- package/src/hooks/usePermissionCache.test.ts +264 -395
- package/src/hooks/usePermissionCache.ts +34 -4
- package/src/hooks/useSecureDataAccess.test.ts +486 -0
- package/src/hooks/useSecureDataAccess.ts +4 -1
- package/src/providers/InactivityProvider.tsx +2 -2
- package/src/providers/OrganisationProvider.test.simple.tsx +168 -0
- package/src/providers/OrganisationProvider.test.tsx +168 -0
- package/src/providers/OrganisationProvider.tsx +18 -31
- package/src/providers/UnifiedAuthProvider.test.simple.tsx +205 -0
- package/src/providers/UnifiedAuthProvider.test.tsx +128 -0
- package/src/providers/__tests__/InactivityProvider.test.tsx +3 -4
- package/src/providers/__tests__/OrganisationProvider.test.tsx +19 -14
- package/src/rbac/__tests__/integration.authflow.test.tsx +123 -0
- package/src/rbac/__tests__/integration.navigation.test.tsx +72 -0
- package/src/rbac/__tests__/integration.securedata.test.tsx +92 -0
- package/src/rbac/__tests__/integration.smoke.test.tsx +73 -0
- package/src/rbac/__tests__/rbac-core.test.tsx +26 -22
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +411 -0
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +285 -0
- package/src/rbac/__tests__/rbac-functions.test.ts +655 -0
- package/src/rbac/__tests__/rbac-integration.test.ts +532 -0
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +196 -0
- package/src/rbac/api.test.ts +6 -6
- package/src/rbac/api.ts +2 -2
- package/src/rbac/audit.test.ts +485 -0
- package/src/rbac/audit.ts +7 -1
- package/src/rbac/cache-invalidation.ts +318 -0
- package/src/rbac/cache.test.ts +286 -0
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +559 -0
- package/src/rbac/components/EnhancedNavigationMenu.tsx +29 -23
- package/src/rbac/components/NavigationProvider.test.tsx +449 -0
- package/src/rbac/components/PagePermissionGuard.tsx +4 -4
- package/src/rbac/components/PagePermissionProvider.test.tsx +479 -0
- package/src/rbac/components/SecureDataProvider.test.tsx +511 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +159 -430
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +4 -5
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +112 -118
- package/src/rbac/config.test.ts +410 -0
- package/src/rbac/engine.test.simple.ts +237 -0
- package/src/rbac/engine.test.ts +233 -0
- package/src/rbac/engine.ts +37 -41
- package/src/rbac/examples/CompleteRBACExample.tsx +3 -3
- package/src/rbac/examples/EventBasedApp.tsx +4 -4
- package/src/rbac/hooks/useRBAC.simple.test.ts +16 -0
- package/src/rbac/hooks/useRBAC.test.ts +207 -455
- package/src/rbac/hooks/useRBAC.ts +30 -22
- package/src/rbac/permissions.test.ts +128 -0
- package/src/rbac/permissions.ts +56 -141
- package/src/rbac/providers/RBACProvider.tsx +1 -1
- package/src/rbac/secureClient.test.ts +444 -0
- package/src/rbac/security.test.ts +390 -0
- package/src/rbac/security.ts +1 -1
- package/src/rbac/types.test.ts +382 -0
- package/src/rbac/types.ts +2 -2
- package/src/styles/core.css +0 -125
- package/src/types/file-reference.ts +77 -0
- package/src/types/rbac-functions.ts +290 -0
- package/src/types/supabase.ts +10 -28
- package/src/types/unified.ts +4 -1
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +81 -55
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +21 -12
- package/src/utils/__tests__/organisationContext.unit.test.ts +13 -7
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +3 -3
- package/src/utils/__tests__/sessionTracking.unit.test.ts +32 -12
- package/src/utils/appConfig.ts +1 -1
- package/src/utils/appIdResolver.test.ts +503 -0
- package/src/utils/appIdResolver.ts +1 -1
- package/src/utils/appNameResolver.test.ts +494 -0
- package/src/utils/appNameResolver.ts +3 -2
- package/src/utils/bundleAnalysis.ts +3 -3
- package/src/utils/debugLogger.ts +1 -1
- package/src/utils/file-reference.ts +263 -0
- package/src/utils/formatDate.test.ts +2 -2
- package/src/utils/organisationContext.test.ts +340 -0
- package/src/utils/organisationContext.ts +19 -6
- package/src/utils/performanceBudgets.ts +2 -2
- package/src/utils/permissionUtils.test.ts +393 -0
- package/src/utils/permissionUtils.ts +5 -2
- package/src/utils/secureDataAccess.test.ts +715 -0
- package/src/utils/secureDataAccess.ts +21 -5
- package/src/utils/sessionTracking.ts +34 -4
- package/src/utils/storage/__tests__/helpers.unit.test.ts +328 -0
- package/src/utils/storage/__tests__/index.unit.test.ts +16 -0
- package/src/utils/storage/helpers.ts +20 -25
- package/src/utils/storage/index.ts +29 -1
- package/src/vite-env.d.ts +17 -0
- package/dist/chunk-22KLBHPS.js.map +0 -1
- package/dist/chunk-7BNPOCLL.js.map +0 -1
- package/dist/chunk-BC3S53OZ.js.map +0 -1
- package/dist/chunk-GWSBHC4J.js.map +0 -1
- package/dist/chunk-MYP2EGHX.js.map +0 -1
- package/dist/chunk-MZBUOP4P.js.map +0 -1
- package/dist/chunk-NYUJ4FJR.js.map +0 -1
- package/dist/chunk-NZ655MWE.js.map +0 -1
- package/dist/chunk-SS3E6QLB.js.map +0 -1
- package/dist/chunk-TRIZ7IB7.js.map +0 -1
- package/dist/chunk-WJARTBCT.js.map +0 -1
- package/dist/chunk-YDJW5XTN.js.map +0 -1
- package/docs/print-components/README.md +0 -258
- package/docs/print-components/api-reference.md +0 -636
- package/docs/print-components/examples/README.md +0 -204
- package/docs/print-components/examples/basic-report.tsx +0 -92
- package/docs/print-components/examples/card-catalog.tsx +0 -149
- package/docs/print-components/examples/cover-page-report.tsx +0 -163
- package/docs/print-components/quick-start.md +0 -363
- package/src/components/PrintButton/PrintButton.tsx +0 -321
- package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
- package/src/components/PrintButton/PrintToolbar.tsx +0 -94
- package/src/components/PrintButton/__tests__/PrintButton.test.tsx +0 -271
- package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
- package/src/components/PrintButton/index.ts +0 -33
- package/src/components/PrintButton/types.ts +0 -173
- package/src/components/PrintCard/PrintCard.tsx +0 -154
- package/src/components/PrintCard/PrintCardContent.tsx +0 -57
- package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
- package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
- package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
- package/src/components/PrintCard/PrintCardImage.tsx +0 -81
- package/src/components/PrintCard/examples/PrintCardShowcase.tsx +0 -239
- package/src/components/PrintCard/index.ts +0 -34
- package/src/components/PrintCard/types.ts +0 -171
- package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
- package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
- package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
- package/src/components/PrintDataTable/index.ts +0 -25
- package/src/components/PrintDataTable/types.ts +0 -67
- package/src/components/PrintFooter/PrintFooter.tsx +0 -183
- package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
- package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
- package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
- package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
- package/src/components/PrintFooter/index.ts +0 -30
- package/src/components/PrintFooter/types.ts +0 -149
- package/src/components/PrintGrid/PrintGrid.tsx +0 -180
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
- package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
- package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
- package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
- package/src/components/PrintGrid/index.ts +0 -31
- package/src/components/PrintGrid/types.ts +0 -159
- package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
- package/src/components/PrintHeader/PrintHeader.tsx +0 -150
- package/src/components/PrintHeader/index.ts +0 -17
- package/src/components/PrintHeader/types.ts +0 -42
- package/src/components/PrintLayout/PrintLayout.tsx +0 -122
- package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
- package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
- package/src/components/PrintLayout/index.ts +0 -19
- package/src/components/PrintLayout/types.ts +0 -37
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
- package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
- package/src/components/PrintPageBreak/index.ts +0 -23
- package/src/components/PrintPageBreak/types.ts +0 -94
- package/src/components/PrintSection/PrintColumn.tsx +0 -104
- package/src/components/PrintSection/PrintDivider.tsx +0 -101
- package/src/components/PrintSection/PrintSection.tsx +0 -129
- package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
- package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
- package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
- package/src/components/PrintSection/index.ts +0 -33
- package/src/components/PrintSection/types.ts +0 -155
- package/src/components/PrintText/PrintText.tsx +0 -116
- package/src/components/PrintText/index.ts +0 -16
- package/src/components/PrintText/types.ts +0 -24
- package/src/rbac/__tests__/integration.test.tsx +0 -218
- package/src/utils/print/PrintDataProcessor.ts +0 -390
- package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +0 -397
- package/src/utils/print/index.ts +0 -29
- package/src/utils/print/types.ts +0 -196
- package/src/utils/print/usePrintOptimization.ts +0 -272
- /package/dist/{DataTable-7FMFXA7A.js.map → DataTable-4T627QFJ.js.map} +0 -0
- /package/dist/{api-H5A3H4IR.js.map → api-LUNF5O6M.js.map} +0 -0
- /package/dist/{appNameResolver-7GHF5ED2.js.map → appNameResolver-UURKN7NF.js.map} +0 -0
- /package/dist/{audit-BUW3LMJB.js.map → audit-6TOCAMKO.js.map} +0 -0
- /package/dist/{chunk-NRK4AIHQ.js.map → chunk-KBRACSJI.js.map} +0 -0
- /package/dist/{chunk-6MTY77WU.js.map → chunk-TNMXZLDR.js.map} +0 -0
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintCoverHeader Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintHeader
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Cover-style print header component for first pages with enhanced branding.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - Cover-style header design
|
|
11
|
-
* - Large logo and title support
|
|
12
|
-
* - Background image/color customization
|
|
13
|
-
* - Professional first page appearance
|
|
14
|
-
* - Flexible branding integration
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```tsx
|
|
18
|
-
* <PrintCoverHeader
|
|
19
|
-
* title="Annual Report 2024"
|
|
20
|
-
* subtitle="Financial Performance & Strategic Overview"
|
|
21
|
-
* branding={{
|
|
22
|
-
* logo: "/logo.png",
|
|
23
|
-
* companyName: "Acme Corporation",
|
|
24
|
-
* tagline: "Innovation Through Excellence"
|
|
25
|
-
* }}
|
|
26
|
-
* logoSize="large"
|
|
27
|
-
* titleSize="xl"
|
|
28
|
-
* showDivider={true}
|
|
29
|
-
* backgroundColor="#f8f9fa"
|
|
30
|
-
* metadata={[
|
|
31
|
-
* { label: "Period", value: "Jan 1 - Dec 31, 2024", icon: CalendarIcon },
|
|
32
|
-
* { label: "Prepared by", value: "Finance Team", icon: UserIcon }
|
|
33
|
-
* ]}
|
|
34
|
-
* />
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
import React from 'react';
|
|
39
|
-
import { cn } from '../../utils/cn';
|
|
40
|
-
import { PrintText } from '../PrintText';
|
|
41
|
-
import type { PrintCoverHeaderProps } from './types';
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* PrintCoverHeader component provides a cover-style header design for first pages.
|
|
45
|
-
*/
|
|
46
|
-
export function PrintCoverHeader({
|
|
47
|
-
title,
|
|
48
|
-
subtitle,
|
|
49
|
-
branding,
|
|
50
|
-
metadata = [],
|
|
51
|
-
printDate = true,
|
|
52
|
-
coverStyle = true,
|
|
53
|
-
logoSize = 'medium',
|
|
54
|
-
titleSize = 'large',
|
|
55
|
-
showDivider = false,
|
|
56
|
-
backgroundImage,
|
|
57
|
-
backgroundColor,
|
|
58
|
-
className,
|
|
59
|
-
}: PrintCoverHeaderProps) {
|
|
60
|
-
const formatPrintDate = () => {
|
|
61
|
-
return new Date().toLocaleDateString('en-AU', {
|
|
62
|
-
year: 'numeric',
|
|
63
|
-
month: 'long',
|
|
64
|
-
day: 'numeric',
|
|
65
|
-
});
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const getLogoSizeClasses = (size: 'small' | 'medium' | 'large') => {
|
|
69
|
-
switch (size) {
|
|
70
|
-
case 'small':
|
|
71
|
-
return 'h-16 w-auto print:h-12';
|
|
72
|
-
case 'medium':
|
|
73
|
-
return 'h-24 w-auto print:h-20';
|
|
74
|
-
case 'large':
|
|
75
|
-
return 'h-32 w-auto print:h-24';
|
|
76
|
-
default:
|
|
77
|
-
return 'h-24 w-auto print:h-20';
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const getTitleSizeClasses = (size: 'small' | 'medium' | 'large' | 'xl') => {
|
|
82
|
-
switch (size) {
|
|
83
|
-
case 'small':
|
|
84
|
-
return 'text-3xl print:text-2xl';
|
|
85
|
-
case 'medium':
|
|
86
|
-
return 'text-4xl print:text-3xl';
|
|
87
|
-
case 'large':
|
|
88
|
-
return 'text-5xl print:text-4xl';
|
|
89
|
-
case 'xl':
|
|
90
|
-
return 'text-6xl print:text-5xl';
|
|
91
|
-
default:
|
|
92
|
-
return 'text-4xl print:text-3xl';
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const getBackgroundStyle = () => {
|
|
97
|
-
const style: React.CSSProperties = {};
|
|
98
|
-
|
|
99
|
-
if (backgroundImage) {
|
|
100
|
-
style.backgroundImage = `url(${backgroundImage})`;
|
|
101
|
-
style.backgroundSize = 'cover';
|
|
102
|
-
style.backgroundPosition = 'center';
|
|
103
|
-
style.backgroundRepeat = 'no-repeat';
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (backgroundColor) {
|
|
107
|
-
style.backgroundColor = backgroundColor;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return style;
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const renderBranding = () => {
|
|
114
|
-
if (!branding) return null;
|
|
115
|
-
|
|
116
|
-
const { logo, companyName, projectName, version, tagline } = branding;
|
|
117
|
-
|
|
118
|
-
return (
|
|
119
|
-
<div className="flex flex-col items-center text-center mb-8">
|
|
120
|
-
{logo && (
|
|
121
|
-
<img
|
|
122
|
-
src={logo}
|
|
123
|
-
alt={companyName || 'Company Logo'}
|
|
124
|
-
className={cn(
|
|
125
|
-
getLogoSizeClasses(logoSize),
|
|
126
|
-
'mb-4'
|
|
127
|
-
)}
|
|
128
|
-
/>
|
|
129
|
-
)}
|
|
130
|
-
|
|
131
|
-
{companyName && (
|
|
132
|
-
<PrintText variant="subheading" weight="semibold" className="mb-2">
|
|
133
|
-
{companyName}
|
|
134
|
-
</PrintText>
|
|
135
|
-
)}
|
|
136
|
-
|
|
137
|
-
{projectName && (
|
|
138
|
-
<PrintText variant="body" color="muted" className="mb-2">
|
|
139
|
-
{projectName}
|
|
140
|
-
</PrintText>
|
|
141
|
-
)}
|
|
142
|
-
|
|
143
|
-
{version && (
|
|
144
|
-
<PrintText variant="small" color="muted" className="mb-2">
|
|
145
|
-
{version}
|
|
146
|
-
</PrintText>
|
|
147
|
-
)}
|
|
148
|
-
|
|
149
|
-
{tagline && (
|
|
150
|
-
<PrintText variant="small" color="muted" className="italic">
|
|
151
|
-
{tagline}
|
|
152
|
-
</PrintText>
|
|
153
|
-
)}
|
|
154
|
-
</div>
|
|
155
|
-
);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
const renderMetadata = () => {
|
|
159
|
-
if (metadata.length === 0) return null;
|
|
160
|
-
|
|
161
|
-
return (
|
|
162
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6 mb-8">
|
|
163
|
-
{metadata.map((item, index) => (
|
|
164
|
-
<div key={index} className="flex items-center space-x-3">
|
|
165
|
-
{item.icon && (
|
|
166
|
-
<item.icon className="h-5 w-5 text-muted-foreground print:h-4 print:w-4" />
|
|
167
|
-
)}
|
|
168
|
-
<div>
|
|
169
|
-
<PrintText variant="small" color="muted" className="block">
|
|
170
|
-
{item.label}
|
|
171
|
-
</PrintText>
|
|
172
|
-
<PrintText variant="body" weight="medium" className="block">
|
|
173
|
-
{item.value}
|
|
174
|
-
</PrintText>
|
|
175
|
-
</div>
|
|
176
|
-
</div>
|
|
177
|
-
))}
|
|
178
|
-
</div>
|
|
179
|
-
);
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<header
|
|
184
|
-
className={cn(
|
|
185
|
-
'print-cover-header min-h-[400px] flex flex-col justify-center px-8 py-12',
|
|
186
|
-
'print:min-h-[300px] print:px-6 print:py-8',
|
|
187
|
-
className
|
|
188
|
-
)}
|
|
189
|
-
style={getBackgroundStyle()}
|
|
190
|
-
>
|
|
191
|
-
{/* Branding */}
|
|
192
|
-
{renderBranding()}
|
|
193
|
-
|
|
194
|
-
{/* Title and Subtitle */}
|
|
195
|
-
<div className="text-center mb-8">
|
|
196
|
-
<PrintText
|
|
197
|
-
variant="heading"
|
|
198
|
-
className={cn(
|
|
199
|
-
'mb-4',
|
|
200
|
-
getTitleSizeClasses(titleSize)
|
|
201
|
-
)}
|
|
202
|
-
>
|
|
203
|
-
{title}
|
|
204
|
-
</PrintText>
|
|
205
|
-
{subtitle && (
|
|
206
|
-
<PrintText variant="subheading" color="muted" className="max-w-3xl mx-auto">
|
|
207
|
-
{subtitle}
|
|
208
|
-
</PrintText>
|
|
209
|
-
)}
|
|
210
|
-
</div>
|
|
211
|
-
|
|
212
|
-
{/* Divider */}
|
|
213
|
-
{showDivider && (
|
|
214
|
-
<div className="w-24 h-1 bg-primary mx-auto mb-8" />
|
|
215
|
-
)}
|
|
216
|
-
|
|
217
|
-
{/* Metadata */}
|
|
218
|
-
{renderMetadata()}
|
|
219
|
-
|
|
220
|
-
{/* Print Date */}
|
|
221
|
-
{printDate && (
|
|
222
|
-
<div className="flex justify-center mt-auto">
|
|
223
|
-
<PrintText variant="small" color="muted">
|
|
224
|
-
Printed on {formatPrintDate()}
|
|
225
|
-
</PrintText>
|
|
226
|
-
</div>
|
|
227
|
-
)}
|
|
228
|
-
</header>
|
|
229
|
-
);
|
|
230
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintHeader Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintHeader
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Flexible print header component with branding and metadata display.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - Flexible branding integration
|
|
11
|
-
* - Metadata display with icons
|
|
12
|
-
* - Print date automation
|
|
13
|
-
* - Responsive layout for screen/print
|
|
14
|
-
* - Integration with existing theme system
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```tsx
|
|
18
|
-
* <PrintHeader
|
|
19
|
-
* title="Data Report"
|
|
20
|
-
* subtitle="Q4 Analytics"
|
|
21
|
-
* branding={{
|
|
22
|
-
* companyName: "Acme Corp",
|
|
23
|
-
* projectName: "Q4 Analytics",
|
|
24
|
-
* version: "v1.2"
|
|
25
|
-
* }}
|
|
26
|
-
* metadata={[
|
|
27
|
-
* { label: "Status", value: "Complete", icon: CheckIcon },
|
|
28
|
-
* { label: "Generated", value: "2024-01-15", icon: CalendarIcon }
|
|
29
|
-
* ]}
|
|
30
|
-
* />
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
import React from 'react';
|
|
35
|
-
import { cn } from '../../utils/cn';
|
|
36
|
-
import { PrintText } from '../PrintText';
|
|
37
|
-
import type { PrintHeaderProps, PrintBranding, PrintMetadata } from './types';
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* PrintHeader component provides flexible branding and metadata display for print layouts.
|
|
41
|
-
*/
|
|
42
|
-
export function PrintHeader({
|
|
43
|
-
title,
|
|
44
|
-
subtitle,
|
|
45
|
-
branding,
|
|
46
|
-
metadata = [],
|
|
47
|
-
printDate = true,
|
|
48
|
-
className,
|
|
49
|
-
}: PrintHeaderProps) {
|
|
50
|
-
const formatPrintDate = () => {
|
|
51
|
-
return new Date().toLocaleDateString('en-AU', {
|
|
52
|
-
year: 'numeric',
|
|
53
|
-
month: 'long',
|
|
54
|
-
day: 'numeric',
|
|
55
|
-
});
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const renderBranding = (branding: PrintBranding) => {
|
|
59
|
-
const { logo, companyName, projectName, version, tagline } = branding;
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<div className="flex items-center space-x-4 mb-4">
|
|
63
|
-
{logo && (
|
|
64
|
-
<img
|
|
65
|
-
src={logo}
|
|
66
|
-
alt={companyName || 'Company Logo'}
|
|
67
|
-
className="h-8 w-auto print:h-6"
|
|
68
|
-
/>
|
|
69
|
-
)}
|
|
70
|
-
<div className="flex-1">
|
|
71
|
-
{companyName && (
|
|
72
|
-
<PrintText variant="subheading" weight="semibold" className="mb-1">
|
|
73
|
-
{companyName}
|
|
74
|
-
</PrintText>
|
|
75
|
-
)}
|
|
76
|
-
{projectName && (
|
|
77
|
-
<PrintText variant="body" color="muted" className="mb-1">
|
|
78
|
-
{projectName}
|
|
79
|
-
</PrintText>
|
|
80
|
-
)}
|
|
81
|
-
{version && (
|
|
82
|
-
<PrintText variant="small" color="muted">
|
|
83
|
-
{version}
|
|
84
|
-
</PrintText>
|
|
85
|
-
)}
|
|
86
|
-
{tagline && (
|
|
87
|
-
<PrintText variant="small" color="muted" className="italic">
|
|
88
|
-
{tagline}
|
|
89
|
-
</PrintText>
|
|
90
|
-
)}
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
);
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const renderMetadata = (metadata: PrintMetadata[]) => {
|
|
97
|
-
if (metadata.length === 0) return null;
|
|
98
|
-
|
|
99
|
-
return (
|
|
100
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mb-4">
|
|
101
|
-
{metadata.map((item, index) => (
|
|
102
|
-
<div key={index} className="flex items-center space-x-2">
|
|
103
|
-
{item.icon && (
|
|
104
|
-
<item.icon className="h-4 w-4 text-muted-foreground print:h-3 print:w-3" />
|
|
105
|
-
)}
|
|
106
|
-
<div>
|
|
107
|
-
<PrintText variant="small" color="muted" className="block">
|
|
108
|
-
{item.label}
|
|
109
|
-
</PrintText>
|
|
110
|
-
<PrintText variant="body" weight="medium" className="block">
|
|
111
|
-
{item.value}
|
|
112
|
-
</PrintText>
|
|
113
|
-
</div>
|
|
114
|
-
</div>
|
|
115
|
-
))}
|
|
116
|
-
</div>
|
|
117
|
-
);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
return (
|
|
121
|
-
<header className={cn('print-header border-b border-border pb-4 mb-6', className)}>
|
|
122
|
-
{/* Branding */}
|
|
123
|
-
{branding && renderBranding(branding)}
|
|
124
|
-
|
|
125
|
-
{/* Title and Subtitle */}
|
|
126
|
-
<div className="mb-4">
|
|
127
|
-
<PrintText variant="heading" className="mb-2">
|
|
128
|
-
{title}
|
|
129
|
-
</PrintText>
|
|
130
|
-
{subtitle && (
|
|
131
|
-
<PrintText variant="subheading" color="muted">
|
|
132
|
-
{subtitle}
|
|
133
|
-
</PrintText>
|
|
134
|
-
)}
|
|
135
|
-
</div>
|
|
136
|
-
|
|
137
|
-
{/* Metadata */}
|
|
138
|
-
{metadata.length > 0 && renderMetadata(metadata)}
|
|
139
|
-
|
|
140
|
-
{/* Print Date */}
|
|
141
|
-
{printDate && (
|
|
142
|
-
<div className="flex justify-end">
|
|
143
|
-
<PrintText variant="small" color="muted">
|
|
144
|
-
Printed on {formatPrintDate()}
|
|
145
|
-
</PrintText>
|
|
146
|
-
</div>
|
|
147
|
-
)}
|
|
148
|
-
</header>
|
|
149
|
-
);
|
|
150
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintHeader Component Exports
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintHeader
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Exports for PrintHeader and PrintCoverHeader components.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export { PrintHeader } from './PrintHeader';
|
|
11
|
-
export { PrintCoverHeader } from './PrintCoverHeader';
|
|
12
|
-
export type {
|
|
13
|
-
PrintHeaderProps,
|
|
14
|
-
PrintCoverHeaderProps,
|
|
15
|
-
PrintBranding,
|
|
16
|
-
PrintMetadata
|
|
17
|
-
} from './types';
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintHeader Types
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintHeader
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Type definitions for PrintHeader and PrintCoverHeader components.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { ReactNode, ComponentType } from 'react';
|
|
11
|
-
|
|
12
|
-
export interface PrintBranding {
|
|
13
|
-
logo?: string;
|
|
14
|
-
companyName?: string;
|
|
15
|
-
projectName?: string;
|
|
16
|
-
version?: string;
|
|
17
|
-
tagline?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface PrintMetadata {
|
|
21
|
-
label: string;
|
|
22
|
-
value: string;
|
|
23
|
-
icon?: ComponentType<{ className?: string }>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface PrintHeaderProps {
|
|
27
|
-
title: string;
|
|
28
|
-
subtitle?: string;
|
|
29
|
-
branding?: PrintBranding;
|
|
30
|
-
metadata?: PrintMetadata[];
|
|
31
|
-
printDate?: boolean;
|
|
32
|
-
className?: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface PrintCoverHeaderProps extends PrintHeaderProps {
|
|
36
|
-
coverStyle?: boolean;
|
|
37
|
-
logoSize?: 'small' | 'medium' | 'large';
|
|
38
|
-
titleSize?: 'small' | 'medium' | 'large' | 'xl';
|
|
39
|
-
showDivider?: boolean;
|
|
40
|
-
backgroundImage?: string;
|
|
41
|
-
backgroundColor?: string;
|
|
42
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintLayout Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintLayout
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Base print-optimized layout component with A4 support and first page header management.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - Print-optimized base layout
|
|
11
|
-
* - A4 page size support (portrait/landscape)
|
|
12
|
-
* - First page vs subsequent page header management
|
|
13
|
-
* - Print media query integration
|
|
14
|
-
* - Page break controls
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```tsx
|
|
18
|
-
* <PrintLayout orientation="portrait" pageSize="A4">
|
|
19
|
-
* <PrintHeader title="Report" />
|
|
20
|
-
* <PrintSection title="Data">
|
|
21
|
-
* <PrintDataTable data={data} columns={columns} />
|
|
22
|
-
* </PrintSection>
|
|
23
|
-
* </PrintLayout>
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```tsx
|
|
28
|
-
* <PrintLayout
|
|
29
|
-
* orientation="landscape"
|
|
30
|
-
* pageSize="A4"
|
|
31
|
-
* firstPageHeader={<PrintCoverHeader title="Annual Report" />}
|
|
32
|
-
* subsequentPageHeader={<PrintHeader title="Annual Report" />}
|
|
33
|
-
* >
|
|
34
|
-
* <PrintSection title="Executive Summary">
|
|
35
|
-
* Content goes here
|
|
36
|
-
* </PrintSection>
|
|
37
|
-
* </PrintLayout>
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
import React from 'react';
|
|
42
|
-
import { cn } from '../../utils/cn';
|
|
43
|
-
import { PrintLayoutProvider } from './PrintLayoutContext';
|
|
44
|
-
import type { PrintLayoutProps } from './types';
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* PrintLayout component provides a print-optimized base layout with support for
|
|
48
|
-
* different page sizes, orientations, and header management.
|
|
49
|
-
*/
|
|
50
|
-
export function PrintLayout({
|
|
51
|
-
children,
|
|
52
|
-
orientation = 'portrait',
|
|
53
|
-
pageSize = 'A4',
|
|
54
|
-
showHeader = true,
|
|
55
|
-
showFooter = true,
|
|
56
|
-
firstPageHeader,
|
|
57
|
-
subsequentPageHeader,
|
|
58
|
-
className,
|
|
59
|
-
...props
|
|
60
|
-
}: PrintLayoutProps) {
|
|
61
|
-
const hasFirstPageHeader = Boolean(firstPageHeader);
|
|
62
|
-
const hasSubsequentPageHeader = Boolean(subsequentPageHeader);
|
|
63
|
-
|
|
64
|
-
const getPageSizeClass = () => {
|
|
65
|
-
if (pageSize === 'A4') {
|
|
66
|
-
return orientation === 'landscape' ? 'print-a4-landscape' : 'print-a4-portrait';
|
|
67
|
-
}
|
|
68
|
-
// Future: Add A3, A5 support
|
|
69
|
-
return 'print-a4-portrait';
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const getHeaderClass = () => {
|
|
73
|
-
if (hasFirstPageHeader && hasSubsequentPageHeader) {
|
|
74
|
-
return 'print-first-page-header print-subsequent-header';
|
|
75
|
-
}
|
|
76
|
-
if (hasFirstPageHeader) {
|
|
77
|
-
return 'print-first-page-header';
|
|
78
|
-
}
|
|
79
|
-
if (hasSubsequentPageHeader) {
|
|
80
|
-
return 'print-subsequent-header';
|
|
81
|
-
}
|
|
82
|
-
return '';
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<PrintLayoutProvider
|
|
87
|
-
pageSize={pageSize}
|
|
88
|
-
orientation={orientation}
|
|
89
|
-
hasFirstPageHeader={hasFirstPageHeader}
|
|
90
|
-
hasSubsequentPageHeader={hasSubsequentPageHeader}
|
|
91
|
-
>
|
|
92
|
-
<div
|
|
93
|
-
className={cn(
|
|
94
|
-
'print-layout',
|
|
95
|
-
getPageSizeClass(),
|
|
96
|
-
getHeaderClass(),
|
|
97
|
-
className
|
|
98
|
-
)}
|
|
99
|
-
{...props}
|
|
100
|
-
>
|
|
101
|
-
{/* First page header */}
|
|
102
|
-
{hasFirstPageHeader && (
|
|
103
|
-
<div className="print-first-page-only">
|
|
104
|
-
{firstPageHeader}
|
|
105
|
-
</div>
|
|
106
|
-
)}
|
|
107
|
-
|
|
108
|
-
{/* Subsequent page header */}
|
|
109
|
-
{hasSubsequentPageHeader && (
|
|
110
|
-
<div className="print-subsequent-pages-only">
|
|
111
|
-
{subsequentPageHeader}
|
|
112
|
-
</div>
|
|
113
|
-
)}
|
|
114
|
-
|
|
115
|
-
{/* Main content */}
|
|
116
|
-
<div className="print-text">
|
|
117
|
-
{children}
|
|
118
|
-
</div>
|
|
119
|
-
</div>
|
|
120
|
-
</PrintLayoutProvider>
|
|
121
|
-
);
|
|
122
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintLayout Context
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintLayout
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Context for managing print layout state and page detection.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
11
|
-
import type { PrintLayoutContextType, PageSize, Orientation } from './types';
|
|
12
|
-
|
|
13
|
-
const PrintLayoutContext = createContext<PrintLayoutContextType | undefined>(undefined);
|
|
14
|
-
|
|
15
|
-
export interface PrintLayoutProviderProps {
|
|
16
|
-
children: React.ReactNode;
|
|
17
|
-
pageSize: PageSize;
|
|
18
|
-
orientation: Orientation;
|
|
19
|
-
hasFirstPageHeader: boolean;
|
|
20
|
-
hasSubsequentPageHeader: boolean;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function PrintLayoutProvider({
|
|
24
|
-
children,
|
|
25
|
-
pageSize,
|
|
26
|
-
orientation,
|
|
27
|
-
hasFirstPageHeader,
|
|
28
|
-
hasSubsequentPageHeader,
|
|
29
|
-
}: PrintLayoutProviderProps) {
|
|
30
|
-
const [isFirstPage, setIsFirstPage] = useState(true);
|
|
31
|
-
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
// Simple page detection - in a real implementation, this would be more sophisticated
|
|
34
|
-
// For now, we'll assume first page until content overflows
|
|
35
|
-
const handleResize = () => {
|
|
36
|
-
// This is a simplified implementation
|
|
37
|
-
// In a real scenario, you'd measure content height vs page height
|
|
38
|
-
setIsFirstPage(true);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
window.addEventListener('resize', handleResize);
|
|
42
|
-
return () => window.removeEventListener('resize', handleResize);
|
|
43
|
-
}, []);
|
|
44
|
-
|
|
45
|
-
const value: PrintLayoutContextType = {
|
|
46
|
-
isFirstPage,
|
|
47
|
-
pageSize,
|
|
48
|
-
orientation,
|
|
49
|
-
hasFirstPageHeader,
|
|
50
|
-
hasSubsequentPageHeader,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<PrintLayoutContext.Provider value={value}>
|
|
55
|
-
{children}
|
|
56
|
-
</PrintLayoutContext.Provider>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function usePrintLayout(): PrintLayoutContextType {
|
|
61
|
-
const context = useContext(PrintLayoutContext);
|
|
62
|
-
if (context === undefined) {
|
|
63
|
-
throw new Error('usePrintLayout must be used within a PrintLayoutProvider');
|
|
64
|
-
}
|
|
65
|
-
return context;
|
|
66
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file PrintPageBreak Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module PrintLayout
|
|
5
|
-
* @since 0.4.38
|
|
6
|
-
*
|
|
7
|
-
* Component for controlling page breaks in print layouts.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import React from 'react';
|
|
11
|
-
import { cn } from '../../utils/cn';
|
|
12
|
-
import type { PrintPageBreakProps } from './types';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* PrintPageBreak component for controlling page breaks in print layouts.
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```tsx
|
|
19
|
-
* <PrintPageBreak type="before" />
|
|
20
|
-
* <PrintPageBreak type="after" />
|
|
21
|
-
* <PrintPageBreak type="avoid" />
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export function PrintPageBreak({
|
|
25
|
-
type = 'after',
|
|
26
|
-
className,
|
|
27
|
-
...props
|
|
28
|
-
}: PrintPageBreakProps) {
|
|
29
|
-
const getBreakClass = () => {
|
|
30
|
-
switch (type) {
|
|
31
|
-
case 'before':
|
|
32
|
-
return 'print-break-before';
|
|
33
|
-
case 'after':
|
|
34
|
-
return 'print-break-after';
|
|
35
|
-
case 'avoid':
|
|
36
|
-
return 'print-break-avoid';
|
|
37
|
-
default:
|
|
38
|
-
return '';
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<div
|
|
44
|
-
className={cn(
|
|
45
|
-
getBreakClass(),
|
|
46
|
-
className
|
|
47
|
-
)}
|
|
48
|
-
aria-hidden="true"
|
|
49
|
-
{...props}
|
|
50
|
-
/>
|
|
51
|
-
);
|
|
52
|
-
}
|