@jmruthers/pace-core 0.5.181 → 0.5.182
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- 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/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- 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 +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +56 -44
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-3JI76CYK.js +0 -2444
- package/dist/chunk-3JI76CYK.js.map +0 -1
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-5MT24GKJ.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-D7LCGMVS.js.map +0 -1
- package/dist/chunk-EGI6MUL6.js +0 -27
- package/dist/chunk-EGI6MUL6.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-HRO5HWN2.js.map +0 -1
- package/dist/chunk-HZLDFOE4.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-LIMSTKYD.js +0 -61
- package/dist/chunk-LIMSTKYD.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-PPMP5J6T.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-TUMEWN34.js +0 -15
- package/dist/chunk-TUMEWN34.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZYTYSTO5.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
lastUpdated: 2025-
|
|
3
|
-
version: 0.5.
|
|
4
|
-
reviewedBy:
|
|
2
|
+
lastUpdated: 2025-11-18T14:00:00+11:00
|
|
3
|
+
version: 0.5.181
|
|
4
|
+
reviewedBy: documentation-standards-audit
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Public Pages Implementation Guide
|
|
@@ -135,7 +135,7 @@ export function PublicRecipePage() {
|
|
|
135
135
|
// Step 4: Handle error
|
|
136
136
|
if (error || !event) {
|
|
137
137
|
return (
|
|
138
|
-
<div className="min-h-screen bg-
|
|
138
|
+
<div className="min-h-screen bg-background flex items-center justify-center">
|
|
139
139
|
<div className="text-center">
|
|
140
140
|
<h1 className="text-2xl font-bold text-sec-900 mb-4">
|
|
141
141
|
Recipe Grid Report Not Found
|
|
@@ -160,7 +160,7 @@ export function PublicRecipePage() {
|
|
|
160
160
|
|
|
161
161
|
<main className="max-w-6xl mx-auto px-4 py-8">
|
|
162
162
|
{/* Your public page content here */}
|
|
163
|
-
<div className="bg-
|
|
163
|
+
<div className="bg-background rounded-lg shadow p-6">
|
|
164
164
|
<h2 className="text-xl font-semibold mb-4">Recipe Grid Report</h2>
|
|
165
165
|
<p>Event: {event.event_name}</p>
|
|
166
166
|
<p>Code: {event.event_code}</p>
|
|
@@ -243,11 +243,19 @@ import { PublicPageLayout } from '@jmruthers/pace-core';
|
|
|
243
243
|
|
|
244
244
|
**Props:**
|
|
245
245
|
- `eventCode` (required) - The event code from the URL
|
|
246
|
-
- `
|
|
247
|
-
- `
|
|
248
|
-
- `
|
|
246
|
+
- `children` (required) - Child components to render
|
|
247
|
+
- `event` (optional) - Event data object (if not provided, will be fetched by parent component)
|
|
248
|
+
- `isLoading` (optional) - Loading state (if true, shows loading spinner)
|
|
249
|
+
- `error` (optional) - Error state (if provided, shows error message)
|
|
250
|
+
- `refetch` (optional) - Function to retry loading event data
|
|
251
|
+
- `showFooter` (optional) - Show/hide footer (default: true)
|
|
252
|
+
- `className` (optional, deprecated) - Custom CSS classes (deprecated, no longer used as wrapper div was removed)
|
|
249
253
|
- `errorFallback` (optional) - Custom error component
|
|
250
254
|
- `loadingFallback` (optional) - Custom loading component
|
|
255
|
+
- `customHeader` (optional) - Custom header component
|
|
256
|
+
- `customFooter` (optional) - Custom footer component
|
|
257
|
+
- `showValidationErrors` (optional) - Whether to show event validation errors (default: true)
|
|
258
|
+
- `loadingMessage` (optional) - Custom loading message
|
|
251
259
|
|
|
252
260
|
### PublicPageHeader
|
|
253
261
|
|
|
@@ -267,12 +275,15 @@ import { PublicPageHeader } from '@jmruthers/pace-core';
|
|
|
267
275
|
```
|
|
268
276
|
|
|
269
277
|
**Props:**
|
|
270
|
-
- `event` (required) - Event data object
|
|
271
278
|
- `eventCode` (required) - Event code from URL
|
|
279
|
+
- `event` (optional) - Event data object
|
|
272
280
|
- `title` (optional) - Page title
|
|
273
281
|
- `description` (optional) - Page description
|
|
274
|
-
- `showEventLogo` (optional) - Show event logo
|
|
275
|
-
- `showAppLogo` (optional) - Show app logo
|
|
282
|
+
- `showEventLogo` (optional) - Show event logo (default: true)
|
|
283
|
+
- `showAppLogo` (optional) - Show app logo (default: true)
|
|
284
|
+
- `className` (optional) - Custom CSS classes for the header
|
|
285
|
+
- `children` (optional) - Custom content to display in the header
|
|
286
|
+
- `customEventLogo` (optional) - Custom event logo component
|
|
276
287
|
|
|
277
288
|
### PublicPageFooter
|
|
278
289
|
|
|
@@ -420,7 +431,7 @@ function PublicInfoPage() {
|
|
|
420
431
|
const { pageId } = usePublicRouteParams({ fetchEventData: false });
|
|
421
432
|
|
|
422
433
|
return (
|
|
423
|
-
<div className="min-h-screen bg-
|
|
434
|
+
<div className="min-h-screen bg-background">
|
|
424
435
|
<div className="max-w-4xl mx-auto px-4 py-8">
|
|
425
436
|
<h1 className="text-3xl font-bold mb-6">Public Information</h1>
|
|
426
437
|
<p>Page ID: {pageId}</p>
|
|
@@ -709,7 +720,7 @@ export function PublicRecipePage() {
|
|
|
709
720
|
|
|
710
721
|
if (error || !event) {
|
|
711
722
|
return (
|
|
712
|
-
<div className="min-h-screen bg-
|
|
723
|
+
<div className="min-h-screen bg-background flex items-center justify-center">
|
|
713
724
|
<div className="text-center">
|
|
714
725
|
<h1 className="text-2xl font-bold text-sec-900 mb-4">
|
|
715
726
|
Recipe Grid Report Not Found
|
|
@@ -732,7 +743,7 @@ export function PublicRecipePage() {
|
|
|
732
743
|
/>
|
|
733
744
|
|
|
734
745
|
<main className="max-w-6xl mx-auto px-4 py-8">
|
|
735
|
-
<div className="bg-
|
|
746
|
+
<div className="bg-background rounded-lg shadow p-6">
|
|
736
747
|
<h2 className="text-xl font-semibold mb-4">Recipe Grid Report</h2>
|
|
737
748
|
<p>Event: {event.event_name}</p>
|
|
738
749
|
<p>Code: {event.event_code}</p>
|
|
@@ -755,4 +766,539 @@ export function PublicRecipePage() {
|
|
|
755
766
|
|
|
756
767
|
---
|
|
757
768
|
|
|
769
|
+
## 🚀 **Advanced Topics**
|
|
770
|
+
|
|
771
|
+
This section covers advanced topics for public pages, including event logos, caching strategies, SEO optimization, and performance tuning.
|
|
772
|
+
|
|
773
|
+
### EventLogo Component
|
|
774
|
+
|
|
775
|
+
A component for displaying event logos with automatic loading and caching.
|
|
776
|
+
|
|
777
|
+
#### Props
|
|
778
|
+
|
|
779
|
+
```typescript
|
|
780
|
+
interface EventLogoProps {
|
|
781
|
+
eventId: string;
|
|
782
|
+
size?: 'small' | 'medium' | 'large' | 'xlarge';
|
|
783
|
+
variant?: 'default' | 'square' | 'wide';
|
|
784
|
+
className?: string;
|
|
785
|
+
fallback?: React.ReactNode;
|
|
786
|
+
showLoading?: boolean;
|
|
787
|
+
}
|
|
788
|
+
```
|
|
789
|
+
|
|
790
|
+
#### Usage Examples
|
|
791
|
+
|
|
792
|
+
**Basic Logo:**
|
|
793
|
+
```tsx
|
|
794
|
+
<EventLogo eventId={eventId} size="medium" />
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
**Custom Styling:**
|
|
798
|
+
```tsx
|
|
799
|
+
<EventLogo
|
|
800
|
+
eventId={eventId}
|
|
801
|
+
size="large"
|
|
802
|
+
variant="square"
|
|
803
|
+
className="rounded-lg shadow-lg"
|
|
804
|
+
/>
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
**With Fallback:**
|
|
808
|
+
```tsx
|
|
809
|
+
<EventLogo
|
|
810
|
+
eventId={eventId}
|
|
811
|
+
size="medium"
|
|
812
|
+
fallback={
|
|
813
|
+
<div className="bg-sec-200 text-sec-500 p-4 rounded">
|
|
814
|
+
No Logo Available
|
|
815
|
+
</div>
|
|
816
|
+
}
|
|
817
|
+
/>
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
### usePublicEventLogo Hook
|
|
821
|
+
|
|
822
|
+
Hook for loading and caching event logos.
|
|
823
|
+
|
|
824
|
+
#### Interface
|
|
825
|
+
|
|
826
|
+
```typescript
|
|
827
|
+
interface UsePublicEventLogoReturn {
|
|
828
|
+
logoUrl: string | null;
|
|
829
|
+
loading: boolean;
|
|
830
|
+
error: Error | null;
|
|
831
|
+
refetch: () => Promise<void>;
|
|
832
|
+
clearCache: () => void;
|
|
833
|
+
}
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
#### Usage Examples
|
|
837
|
+
|
|
838
|
+
> **Storage path formats**
|
|
839
|
+
>
|
|
840
|
+
> When configuring `event_logo` for an event, Pace supports multiple formats:
|
|
841
|
+
>
|
|
842
|
+
> - A fully qualified `https://` URL will be used directly.
|
|
843
|
+
> - A storage path like `public-files/org-123/logo.png` automatically resolves against the standard buckets configured via `pace-core`.
|
|
844
|
+
> - If your deployment stores logos in a different bucket, prefix the path with the bucket name using `custombucket/org-123/logo.png` (alphanumeric names) or `custom-bucket::org-123/logo.png` (bucket names containing hyphens).
|
|
845
|
+
>
|
|
846
|
+
> The double colon form helps when your folders start with numbers (for example `2024/`), ensuring they are not mistaken for bucket names.
|
|
847
|
+
|
|
848
|
+
**Basic Logo Loading:**
|
|
849
|
+
```tsx
|
|
850
|
+
import { usePublicEventLogo } from '@jmruthers/pace-core';
|
|
851
|
+
|
|
852
|
+
function EventLogoDisplay({ eventId }: { eventId: string }) {
|
|
853
|
+
const { logoUrl, loading, error } = usePublicEventLogo(eventId, 'large');
|
|
854
|
+
|
|
855
|
+
if (loading) {
|
|
856
|
+
return <div className="animate-pulse bg-sec-200 w-32 h-32 rounded"></div>;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if (error) {
|
|
860
|
+
return <div className="text-sec-500">Logo unavailable</div>;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
if (!logoUrl) {
|
|
864
|
+
return <div className="bg-sec-200 text-sec-500 p-4 rounded">No logo</div>;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
return (
|
|
868
|
+
<img
|
|
869
|
+
src={logoUrl}
|
|
870
|
+
alt="Event logo"
|
|
871
|
+
className="w-32 h-32 object-contain"
|
|
872
|
+
/>
|
|
873
|
+
);
|
|
874
|
+
}
|
|
875
|
+
```
|
|
876
|
+
|
|
877
|
+
**With Caching Control:**
|
|
878
|
+
```tsx
|
|
879
|
+
import { usePublicEventLogo } from '@jmruthers/pace-core';
|
|
880
|
+
|
|
881
|
+
function LogoWithCacheControl({ eventId }: { eventId: string }) {
|
|
882
|
+
const {
|
|
883
|
+
logoUrl,
|
|
884
|
+
loading,
|
|
885
|
+
error,
|
|
886
|
+
refetch,
|
|
887
|
+
clearCache
|
|
888
|
+
} = usePublicEventLogo(eventId, 'medium');
|
|
889
|
+
|
|
890
|
+
const handleRefresh = async () => {
|
|
891
|
+
await refetch();
|
|
892
|
+
};
|
|
893
|
+
|
|
894
|
+
const handleClearCache = () => {
|
|
895
|
+
clearCache();
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
return (
|
|
899
|
+
<div className="space-y-4">
|
|
900
|
+
{loading && <div>Loading logo...</div>}
|
|
901
|
+
{error && <div>Error: {error.message}</div>}
|
|
902
|
+
{logoUrl && (
|
|
903
|
+
<img
|
|
904
|
+
src={logoUrl}
|
|
905
|
+
alt="Event logo"
|
|
906
|
+
className="w-16 h-16 object-contain"
|
|
907
|
+
/>
|
|
908
|
+
)}
|
|
909
|
+
|
|
910
|
+
<div className="space-x-2">
|
|
911
|
+
<Button onClick={handleRefresh} size="sm">
|
|
912
|
+
Refresh Logo
|
|
913
|
+
</Button>
|
|
914
|
+
<Button onClick={handleClearCache} size="sm" variant="outline">
|
|
915
|
+
Clear Cache
|
|
916
|
+
</Button>
|
|
917
|
+
</div>
|
|
918
|
+
</div>
|
|
919
|
+
);
|
|
920
|
+
}
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
### Caching Strategies
|
|
924
|
+
|
|
925
|
+
#### Client-Side Caching
|
|
926
|
+
|
|
927
|
+
```tsx
|
|
928
|
+
import { usePublicEvent, clearPublicEventCache } from '@jmruthers/pace-core';
|
|
929
|
+
|
|
930
|
+
function CachedEventPage({ eventId }: { eventId: string }) {
|
|
931
|
+
const { event, loading } = usePublicEvent(eventId);
|
|
932
|
+
|
|
933
|
+
// Cache management
|
|
934
|
+
const handleClearCache = () => {
|
|
935
|
+
clearPublicEventCache();
|
|
936
|
+
console.log('Event cache cleared');
|
|
937
|
+
};
|
|
938
|
+
|
|
939
|
+
return (
|
|
940
|
+
<div>
|
|
941
|
+
<h1>{event?.name}</h1>
|
|
942
|
+
|
|
943
|
+
<div className="space-x-2">
|
|
944
|
+
<Button onClick={handleClearCache}>
|
|
945
|
+
Clear Cache
|
|
946
|
+
</Button>
|
|
947
|
+
</div>
|
|
948
|
+
</div>
|
|
949
|
+
);
|
|
950
|
+
}
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
#### Cache Statistics
|
|
954
|
+
|
|
955
|
+
```tsx
|
|
956
|
+
import { getPublicEventCacheStats, getPublicLogoCacheStats } from '@jmruthers/pace-core';
|
|
957
|
+
|
|
958
|
+
function CacheStats() {
|
|
959
|
+
const eventStats = getPublicEventCacheStats();
|
|
960
|
+
const logoStats = getPublicLogoCacheStats();
|
|
961
|
+
|
|
962
|
+
return (
|
|
963
|
+
<div className="bg-sec-50 p-4 rounded">
|
|
964
|
+
<h3>Cache Statistics</h3>
|
|
965
|
+
<div className="grid grid-cols-2 gap-4">
|
|
966
|
+
<div>
|
|
967
|
+
<h4>Event Cache</h4>
|
|
968
|
+
<p>Entries: {eventStats.entryCount}</p>
|
|
969
|
+
<p>Hit Rate: {eventStats.hitRate}%</p>
|
|
970
|
+
<p>Memory Usage: {eventStats.memoryUsage} bytes</p>
|
|
971
|
+
</div>
|
|
972
|
+
<div>
|
|
973
|
+
<h4>Logo Cache</h4>
|
|
974
|
+
<p>Entries: {logoStats.entryCount}</p>
|
|
975
|
+
<p>Hit Rate: {logoStats.hitRate}%</p>
|
|
976
|
+
<p>Memory Usage: {logoStats.memoryUsage} bytes</p>
|
|
977
|
+
</div>
|
|
978
|
+
</div>
|
|
979
|
+
</div>
|
|
980
|
+
);
|
|
981
|
+
}
|
|
982
|
+
```
|
|
983
|
+
|
|
984
|
+
### SEO Optimization
|
|
985
|
+
|
|
986
|
+
#### Meta Tags and Structured Data
|
|
987
|
+
|
|
988
|
+
```tsx
|
|
989
|
+
import { usePublicEvent } from '@jmruthers/pace-core';
|
|
990
|
+
|
|
991
|
+
function SEOEventPage({ eventId }: { eventId: string }) {
|
|
992
|
+
const { event } = usePublicEvent(eventId);
|
|
993
|
+
|
|
994
|
+
// Generate structured data for search engines
|
|
995
|
+
const structuredData = event ? {
|
|
996
|
+
"@context": "https://schema.org",
|
|
997
|
+
"@type": "Event",
|
|
998
|
+
"name": event.name,
|
|
999
|
+
"description": event.description,
|
|
1000
|
+
"startDate": event.start_date,
|
|
1001
|
+
"endDate": event.end_date,
|
|
1002
|
+
"location": {
|
|
1003
|
+
"@type": "Place",
|
|
1004
|
+
"name": event.location
|
|
1005
|
+
},
|
|
1006
|
+
"url": event.public_url,
|
|
1007
|
+
"image": event.logo_url
|
|
1008
|
+
} : null;
|
|
1009
|
+
|
|
1010
|
+
return (
|
|
1011
|
+
<>
|
|
1012
|
+
{/* Meta tags */}
|
|
1013
|
+
<head>
|
|
1014
|
+
<title>{event?.name || 'Event'}</title>
|
|
1015
|
+
<meta name="description" content={event?.description} />
|
|
1016
|
+
<meta property="og:title" content={event?.name} />
|
|
1017
|
+
<meta property="og:description" content={event?.description} />
|
|
1018
|
+
<meta property="og:image" content={event?.logo_url} />
|
|
1019
|
+
<meta property="og:type" content="event" />
|
|
1020
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
1021
|
+
|
|
1022
|
+
{/* Structured data */}
|
|
1023
|
+
{structuredData && (
|
|
1024
|
+
<script
|
|
1025
|
+
type="application/ld+json"
|
|
1026
|
+
dangerouslySetInnerHTML={{
|
|
1027
|
+
__html: JSON.stringify(structuredData)
|
|
1028
|
+
}}
|
|
1029
|
+
/>
|
|
1030
|
+
)}
|
|
1031
|
+
</head>
|
|
1032
|
+
|
|
1033
|
+
<main>
|
|
1034
|
+
<h1>{event?.name}</h1>
|
|
1035
|
+
<p>{event?.description}</p>
|
|
1036
|
+
{/* Event content */}
|
|
1037
|
+
</main>
|
|
1038
|
+
</>
|
|
1039
|
+
);
|
|
1040
|
+
}
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
### Performance Optimization
|
|
1044
|
+
|
|
1045
|
+
#### Lazy Loading
|
|
1046
|
+
|
|
1047
|
+
```tsx
|
|
1048
|
+
import { lazy, Suspense } from 'react';
|
|
1049
|
+
import { usePublicEvent } from '@jmruthers/pace-core';
|
|
1050
|
+
|
|
1051
|
+
// Lazy load heavy components
|
|
1052
|
+
const EventSchedule = lazy(() => import('./EventSchedule'));
|
|
1053
|
+
const EventSpeakers = lazy(() => import('./EventSpeakers'));
|
|
1054
|
+
|
|
1055
|
+
function OptimizedEventPage({ eventId }: { eventId: string }) {
|
|
1056
|
+
const { event, loading } = usePublicEvent(eventId);
|
|
1057
|
+
|
|
1058
|
+
if (loading) return <div>Loading...</div>;
|
|
1059
|
+
if (!event) return <div>Event not found</div>;
|
|
1060
|
+
|
|
1061
|
+
return (
|
|
1062
|
+
<PublicPageLayout>
|
|
1063
|
+
<header>
|
|
1064
|
+
<h1>{event.name}</h1>
|
|
1065
|
+
<p>{event.description}</p>
|
|
1066
|
+
</header>
|
|
1067
|
+
|
|
1068
|
+
<main>
|
|
1069
|
+
{/* Critical content loads immediately */}
|
|
1070
|
+
<section>
|
|
1071
|
+
<h2>Event Details</h2>
|
|
1072
|
+
<p>Date: {new Date(event.start_date).toLocaleDateString()}</p>
|
|
1073
|
+
<p>Location: {event.location}</p>
|
|
1074
|
+
</section>
|
|
1075
|
+
|
|
1076
|
+
{/* Non-critical content loads lazily */}
|
|
1077
|
+
<Suspense fallback={<div>Loading schedule...</div>}>
|
|
1078
|
+
<EventSchedule eventId={eventId} />
|
|
1079
|
+
</Suspense>
|
|
1080
|
+
|
|
1081
|
+
<Suspense fallback={<div>Loading speakers...</div>}>
|
|
1082
|
+
<EventSpeakers eventId={eventId} />
|
|
1083
|
+
</Suspense>
|
|
1084
|
+
</main>
|
|
1085
|
+
</PublicPageLayout>
|
|
1086
|
+
);
|
|
1087
|
+
}
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
#### Image Optimization
|
|
1091
|
+
|
|
1092
|
+
```tsx
|
|
1093
|
+
import { EventLogo } from '@jmruthers/pace-core';
|
|
1094
|
+
|
|
1095
|
+
function OptimizedEventLogo({ eventId }: { eventId: string }) {
|
|
1096
|
+
return (
|
|
1097
|
+
<EventLogo
|
|
1098
|
+
eventId={eventId}
|
|
1099
|
+
size="large"
|
|
1100
|
+
className="w-full h-auto max-w-md mx-auto"
|
|
1101
|
+
// The component handles:
|
|
1102
|
+
// - WebP format when supported
|
|
1103
|
+
// - Responsive sizing
|
|
1104
|
+
// - Lazy loading
|
|
1105
|
+
// - Error fallbacks
|
|
1106
|
+
/>
|
|
1107
|
+
);
|
|
1108
|
+
}
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
### Advanced Error Handling
|
|
1112
|
+
|
|
1113
|
+
#### Graceful Degradation
|
|
1114
|
+
|
|
1115
|
+
```tsx
|
|
1116
|
+
import { usePublicEvent, usePublicEventLogo } from '@jmruthers/pace-core';
|
|
1117
|
+
|
|
1118
|
+
function RobustEventPage({ eventId }: { eventId: string }) {
|
|
1119
|
+
const {
|
|
1120
|
+
event,
|
|
1121
|
+
loading: eventLoading,
|
|
1122
|
+
error: eventError
|
|
1123
|
+
} = usePublicEvent(eventId);
|
|
1124
|
+
|
|
1125
|
+
const {
|
|
1126
|
+
logoUrl,
|
|
1127
|
+
loading: logoLoading,
|
|
1128
|
+
error: logoError
|
|
1129
|
+
} = usePublicEventLogo(eventId, 'large');
|
|
1130
|
+
|
|
1131
|
+
// Graceful degradation for missing data
|
|
1132
|
+
const displayName = event?.name || 'Event';
|
|
1133
|
+
const displayDescription = event?.description || 'Event details coming soon';
|
|
1134
|
+
const displayLogo = logoUrl || '/default-event-logo.png';
|
|
1135
|
+
|
|
1136
|
+
if (eventLoading) {
|
|
1137
|
+
return (
|
|
1138
|
+
<div className="min-h-screen flex items-center justify-center">
|
|
1139
|
+
<div className="text-center">
|
|
1140
|
+
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-main-600 mx-auto"></div>
|
|
1141
|
+
<p className="mt-4 text-sec-600">Loading event...</p>
|
|
1142
|
+
</div>
|
|
1143
|
+
</div>
|
|
1144
|
+
);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
if (eventError) {
|
|
1148
|
+
return (
|
|
1149
|
+
<div className="min-h-screen flex items-center justify-center">
|
|
1150
|
+
<div className="text-center">
|
|
1151
|
+
<h1 className="text-2xl font-bold text-sec-800 mb-2">
|
|
1152
|
+
Unable to load event
|
|
1153
|
+
</h1>
|
|
1154
|
+
<p className="text-sec-600 mb-4">
|
|
1155
|
+
{eventError.message}
|
|
1156
|
+
</p>
|
|
1157
|
+
<Button onClick={() => window.location.reload()}>
|
|
1158
|
+
Try Again
|
|
1159
|
+
</Button>
|
|
1160
|
+
</div>
|
|
1161
|
+
</div>
|
|
1162
|
+
);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
return (
|
|
1166
|
+
<PublicPageLayout>
|
|
1167
|
+
<header className="bg-main-50 py-8">
|
|
1168
|
+
<div className="container mx-auto px-4 text-center">
|
|
1169
|
+
{logoLoading ? (
|
|
1170
|
+
<div className="animate-pulse bg-sec-200 h-32 w-32 mx-auto rounded"></div>
|
|
1171
|
+
) : logoError ? (
|
|
1172
|
+
<div className="bg-sec-200 text-sec-500 h-32 w-32 mx-auto rounded flex items-center justify-center">
|
|
1173
|
+
No Logo
|
|
1174
|
+
</div>
|
|
1175
|
+
) : (
|
|
1176
|
+
<img
|
|
1177
|
+
src={displayLogo}
|
|
1178
|
+
alt={`${displayName} logo`}
|
|
1179
|
+
className="h-32 w-32 mx-auto object-contain"
|
|
1180
|
+
/>
|
|
1181
|
+
)}
|
|
1182
|
+
|
|
1183
|
+
<h1 className="text-3xl font-bold text-main-900 mt-4">
|
|
1184
|
+
{displayName}
|
|
1185
|
+
</h1>
|
|
1186
|
+
<p className="text-main-700 mt-2">
|
|
1187
|
+
{displayDescription}
|
|
1188
|
+
</p>
|
|
1189
|
+
</div>
|
|
1190
|
+
</header>
|
|
1191
|
+
|
|
1192
|
+
<main className="container mx-auto px-4 py-8">
|
|
1193
|
+
{/* Event content */}
|
|
1194
|
+
</main>
|
|
1195
|
+
</PublicPageLayout>
|
|
1196
|
+
);
|
|
1197
|
+
}
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
### Advanced Troubleshooting
|
|
1201
|
+
|
|
1202
|
+
#### Common Issues
|
|
1203
|
+
|
|
1204
|
+
**Issue: Event not loading**
|
|
1205
|
+
- Check that event exists and is published
|
|
1206
|
+
- Verify `is_public` flag is set to true
|
|
1207
|
+
- Check RLS policies allow public access
|
|
1208
|
+
|
|
1209
|
+
**Issue: Logo not displaying**
|
|
1210
|
+
- Verify logo file exists in storage bucket
|
|
1211
|
+
- Check storage bucket policies
|
|
1212
|
+
- Ensure logo URL is correct
|
|
1213
|
+
|
|
1214
|
+
**Issue: Cache not working**
|
|
1215
|
+
- Check browser storage permissions
|
|
1216
|
+
- Verify cache configuration
|
|
1217
|
+
- Clear browser cache and test
|
|
1218
|
+
|
|
1219
|
+
#### Debug Mode
|
|
1220
|
+
|
|
1221
|
+
```tsx
|
|
1222
|
+
import { usePublicEvent, usePublicEventLogo } from '@jmruthers/pace-core';
|
|
1223
|
+
|
|
1224
|
+
function DebugPublicPage({ eventId }: { eventId: string }) {
|
|
1225
|
+
const { event, loading, error } = usePublicEvent(eventId);
|
|
1226
|
+
const { logoUrl, loading: logoLoading, error: logoError } = usePublicEventLogo(eventId, 'large');
|
|
1227
|
+
|
|
1228
|
+
console.log('Event data:', { event, loading, error });
|
|
1229
|
+
console.log('Logo data:', { logoUrl, logoLoading, logoError });
|
|
1230
|
+
|
|
1231
|
+
return (
|
|
1232
|
+
<div>
|
|
1233
|
+
<h1>Debug Information</h1>
|
|
1234
|
+
<pre>{JSON.stringify({ event, loading, error }, null, 2)}</pre>
|
|
1235
|
+
<pre>{JSON.stringify({ logoUrl, logoLoading, logoError }, null, 2)}</pre>
|
|
1236
|
+
</div>
|
|
1237
|
+
);
|
|
1238
|
+
}
|
|
1239
|
+
```
|
|
1240
|
+
|
|
1241
|
+
## ♿ Accessibility
|
|
1242
|
+
|
|
1243
|
+
Public pages components are designed with accessibility in mind:
|
|
1244
|
+
|
|
1245
|
+
- **WCAG 2.1 AA compliant** - All components meet accessibility standards
|
|
1246
|
+
- **Semantic HTML** - Proper use of `<header>`, `<main>`, `<footer>` elements
|
|
1247
|
+
- **Screen reader friendly** - All interactive elements have proper ARIA labels
|
|
1248
|
+
- **Keyboard navigation** - Full keyboard support for all interactive elements
|
|
1249
|
+
- **High contrast support** - Colors meet WCAG contrast requirements
|
|
1250
|
+
- **Clear content hierarchy** - Proper heading structure and content organization
|
|
1251
|
+
|
|
1252
|
+
### Accessibility Best Practices
|
|
1253
|
+
|
|
1254
|
+
1. **Always provide alt text** for event logos and images
|
|
1255
|
+
2. **Use semantic HTML** - Prefer `<h1>`, `<h2>`, `<nav>`, etc. over generic `<div>` elements
|
|
1256
|
+
3. **Ensure keyboard navigation** - All interactive elements should be keyboard accessible
|
|
1257
|
+
4. **Test with screen readers** - Verify content is properly announced
|
|
1258
|
+
5. **Maintain focus management** - Ensure focus is properly managed during loading states
|
|
1259
|
+
|
|
1260
|
+
## ⚠️ Edge Cases
|
|
1261
|
+
|
|
1262
|
+
### Missing Event Data
|
|
1263
|
+
|
|
1264
|
+
When event data is not available:
|
|
1265
|
+
- `PublicPageLayout` automatically shows an error message
|
|
1266
|
+
- Error message includes the event code for debugging
|
|
1267
|
+
- Provides a "Try Again" button to retry loading
|
|
1268
|
+
- Can be customized with `errorFallback` prop
|
|
1269
|
+
|
|
1270
|
+
### Invalid Event Codes
|
|
1271
|
+
|
|
1272
|
+
When an invalid event code is provided:
|
|
1273
|
+
- `usePublicRouteParams` validates event code format
|
|
1274
|
+
- Invalid codes trigger error states
|
|
1275
|
+
- Error messages are user-friendly
|
|
1276
|
+
- Validation errors can be hidden with `showValidationErrors={false}`
|
|
1277
|
+
|
|
1278
|
+
### Network Failures
|
|
1279
|
+
|
|
1280
|
+
When network requests fail:
|
|
1281
|
+
- All hooks provide error states
|
|
1282
|
+
- Error objects include descriptive messages
|
|
1283
|
+
- Retry mechanisms are available via `refetch` functions
|
|
1284
|
+
- Graceful degradation with fallback UI
|
|
1285
|
+
|
|
1286
|
+
### Missing Logos
|
|
1287
|
+
|
|
1288
|
+
When event logos are not available:
|
|
1289
|
+
- Components show fallback UI with event initials
|
|
1290
|
+
- No broken image icons
|
|
1291
|
+
- Consistent styling regardless of logo availability
|
|
1292
|
+
- Custom fallback can be provided via `customEventLogo` prop
|
|
1293
|
+
|
|
1294
|
+
### Loading States
|
|
1295
|
+
|
|
1296
|
+
During data loading:
|
|
1297
|
+
- Loading spinners are shown automatically
|
|
1298
|
+
- Custom loading messages can be provided
|
|
1299
|
+
- Loading fallback components can be customized
|
|
1300
|
+
- Prevents layout shifts during loading
|
|
1301
|
+
|
|
1302
|
+
---
|
|
1303
|
+
|
|
758
1304
|
**Remember**: Public pages are completely separate from your main app. Keep them isolated and they'll work perfectly!
|