@jmruthers/pace-core 0.5.181 → 0.5.183
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/usePublicEventLogo.test.ts +147 -0
- 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.test.ts +21 -0
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/organisation.roles.test.ts +55 -0
- 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/audit/audit.test.ts +65 -0
- package/src/utils/device/deviceFingerprint.test.ts +171 -0
- 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/__tests__/validationUtils.test.ts +72 -0
- 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
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
---
|
|
2
|
+
lastUpdated: 2025-11-18T14:00:00+11:00
|
|
3
|
+
version: 0.5.181
|
|
4
|
+
reviewedBy: documentation-standards-audit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Quick Start Guide
|
|
8
|
+
|
|
9
|
+
> **🚀 Build Your First App** | [← Back to Documentation](../README.md) | [Installation Guide](./installation-guide.md) | [Examples](./examples/README.md)
|
|
10
|
+
|
|
11
|
+
This guide walks you through building a minimal Supabase-backed admin screen end-to-end using PACE Core. You'll create a simple app with authentication, a data table, and basic navigation.
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Node.js 18+ installed
|
|
16
|
+
- A Supabase account (free tier works)
|
|
17
|
+
- Basic knowledge of React and TypeScript
|
|
18
|
+
|
|
19
|
+
## Step 1: Create Your Project
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Create a new Vite + React + TypeScript project
|
|
23
|
+
npm create vite@latest my-pace-app -- --template react-ts
|
|
24
|
+
cd my-pace-app
|
|
25
|
+
|
|
26
|
+
# Install dependencies
|
|
27
|
+
npm install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Step 2: Install PACE Core
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Install PACE Core and required peer dependencies
|
|
34
|
+
npm install @jmruthers/pace-core \
|
|
35
|
+
@supabase/supabase-js \
|
|
36
|
+
@tanstack/react-query @tanstack/react-table \
|
|
37
|
+
@radix-ui/react-avatar @radix-ui/react-checkbox @radix-ui/react-dialog \
|
|
38
|
+
@radix-ui/react-label @radix-ui/react-progress @radix-ui/react-slot \
|
|
39
|
+
@radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-tooltip \
|
|
40
|
+
clsx lucide-react react-day-picker react-hook-form react-router-dom tailwind-merge zod
|
|
41
|
+
|
|
42
|
+
# Install Tailwind v4
|
|
43
|
+
npm install -D tailwindcss@^4.0.0 @tailwindcss/vite
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Step 3: Configure Vite
|
|
47
|
+
|
|
48
|
+
Create or update `vite.config.ts`:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { defineConfig } from 'vite';
|
|
52
|
+
import react from '@vitejs/plugin-react';
|
|
53
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
54
|
+
|
|
55
|
+
export default defineConfig({
|
|
56
|
+
plugins: [
|
|
57
|
+
react(),
|
|
58
|
+
tailwindcss({
|
|
59
|
+
content: [
|
|
60
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
61
|
+
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
|
|
62
|
+
]
|
|
63
|
+
})
|
|
64
|
+
],
|
|
65
|
+
server: {
|
|
66
|
+
port: 3000,
|
|
67
|
+
open: true,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Step 4: Set Up Tailwind CSS
|
|
73
|
+
|
|
74
|
+
Create `src/app.css`:
|
|
75
|
+
|
|
76
|
+
```css
|
|
77
|
+
@import 'tailwindcss';
|
|
78
|
+
@import '@jmruthers/pace-core/src/styles/core.css';
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Step 5: Configure Supabase
|
|
82
|
+
|
|
83
|
+
Create `.env.local`:
|
|
84
|
+
|
|
85
|
+
```env
|
|
86
|
+
VITE_SUPABASE_URL=your_supabase_project_url
|
|
87
|
+
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Create `src/lib/supabase.ts`:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { createClient } from '@supabase/supabase-js';
|
|
94
|
+
|
|
95
|
+
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL!;
|
|
96
|
+
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY!;
|
|
97
|
+
|
|
98
|
+
export const supabase = createClient(supabaseUrl, supabaseAnonKey);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Step 6: Set Up Your Database
|
|
102
|
+
|
|
103
|
+
In your Supabase dashboard, run this SQL to create a simple `tasks` table:
|
|
104
|
+
|
|
105
|
+
```sql
|
|
106
|
+
-- Create tasks table
|
|
107
|
+
CREATE TABLE tasks (
|
|
108
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
109
|
+
title TEXT NOT NULL,
|
|
110
|
+
description TEXT,
|
|
111
|
+
completed BOOLEAN DEFAULT false,
|
|
112
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
113
|
+
user_id UUID REFERENCES auth.users(id)
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
-- Enable RLS
|
|
117
|
+
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
|
|
118
|
+
|
|
119
|
+
-- Create policy: users can only see their own tasks
|
|
120
|
+
CREATE POLICY "Users can view their own tasks" ON tasks
|
|
121
|
+
FOR SELECT USING (auth.uid() = user_id);
|
|
122
|
+
|
|
123
|
+
-- Create policy: users can insert their own tasks
|
|
124
|
+
CREATE POLICY "Users can insert their own tasks" ON tasks
|
|
125
|
+
FOR INSERT WITH CHECK (auth.uid() = user_id);
|
|
126
|
+
|
|
127
|
+
-- Create policy: users can update their own tasks
|
|
128
|
+
CREATE POLICY "Users can update their own tasks" ON tasks
|
|
129
|
+
FOR UPDATE USING (auth.uid() = user_id);
|
|
130
|
+
|
|
131
|
+
-- Create policy: users can delete their own tasks
|
|
132
|
+
CREATE POLICY "Users can delete their own tasks" ON tasks
|
|
133
|
+
FOR DELETE USING (auth.uid() = user_id);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Step 7: Create Your App
|
|
137
|
+
|
|
138
|
+
Update `src/main.tsx`:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import React from 'react';
|
|
142
|
+
import ReactDOM from 'react-dom/client';
|
|
143
|
+
import { BrowserRouter } from 'react-router-dom';
|
|
144
|
+
import { UnifiedAuthProvider } from '@jmruthers/pace-core';
|
|
145
|
+
import { supabase } from './lib/supabase';
|
|
146
|
+
import App from './App';
|
|
147
|
+
import './app.css';
|
|
148
|
+
|
|
149
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
150
|
+
<React.StrictMode>
|
|
151
|
+
<UnifiedAuthProvider
|
|
152
|
+
supabaseClient={supabase}
|
|
153
|
+
appName="My Task App"
|
|
154
|
+
idleTimeoutMs={30 * 60 * 1000} // 30 minutes
|
|
155
|
+
warnBeforeMs={60 * 1000} // 1 minute warning
|
|
156
|
+
onIdleLogout={() => window.location.assign('/login')}
|
|
157
|
+
>
|
|
158
|
+
<BrowserRouter>
|
|
159
|
+
<App />
|
|
160
|
+
</BrowserRouter>
|
|
161
|
+
</UnifiedAuthProvider>
|
|
162
|
+
</React.StrictMode>
|
|
163
|
+
);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Create `src/App.tsx`:
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
import { Routes, Route, Navigate } from 'react-router-dom';
|
|
170
|
+
import { useUnifiedAuth, PaceLoginPage, PaceAppLayout, ProtectedRoute } from '@jmruthers/pace-core';
|
|
171
|
+
import { TasksPage } from './pages/TasksPage';
|
|
172
|
+
import { DashboardPage } from './pages/DashboardPage';
|
|
173
|
+
|
|
174
|
+
function App() {
|
|
175
|
+
const { isAuthenticated } = useUnifiedAuth();
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<Routes>
|
|
179
|
+
<Route
|
|
180
|
+
path="/login"
|
|
181
|
+
element={isAuthenticated ? <Navigate to="/" replace /> : <PaceLoginPage appName="My Task App" />}
|
|
182
|
+
/>
|
|
183
|
+
<Route element={<ProtectedRoute />}>
|
|
184
|
+
<Route element={<PaceAppLayout appName="My Task App" />}>
|
|
185
|
+
<Route path="/" element={<DashboardPage />} />
|
|
186
|
+
<Route path="/tasks" element={<TasksPage />} />
|
|
187
|
+
</Route>
|
|
188
|
+
</Route>
|
|
189
|
+
</Routes>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export default App;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Step 8: Create the Dashboard Page
|
|
197
|
+
|
|
198
|
+
Create `src/pages/DashboardPage.tsx`:
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
202
|
+
import { Card, CardHeader, CardTitle, CardContent } from '@jmruthers/pace-core';
|
|
203
|
+
import { Link } from 'react-router-dom';
|
|
204
|
+
import { Button } from '@jmruthers/pace-core';
|
|
205
|
+
|
|
206
|
+
export function DashboardPage() {
|
|
207
|
+
const { user, signOut } = useUnifiedAuth();
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<div className="p-6">
|
|
211
|
+
<h1 className="text-3xl font-bold mb-6">Dashboard</h1>
|
|
212
|
+
|
|
213
|
+
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3 mb-6">
|
|
214
|
+
<Card>
|
|
215
|
+
<CardHeader>
|
|
216
|
+
<CardTitle>Welcome</CardTitle>
|
|
217
|
+
</CardHeader>
|
|
218
|
+
<CardContent>
|
|
219
|
+
<p className="text-sec-600">Hello, {user?.email}</p>
|
|
220
|
+
</CardContent>
|
|
221
|
+
</Card>
|
|
222
|
+
|
|
223
|
+
<Card>
|
|
224
|
+
<CardHeader>
|
|
225
|
+
<CardTitle>Quick Actions</CardTitle>
|
|
226
|
+
</CardHeader>
|
|
227
|
+
<CardContent>
|
|
228
|
+
<Link to="/tasks">
|
|
229
|
+
<Button className="w-full">View Tasks</Button>
|
|
230
|
+
</Link>
|
|
231
|
+
</CardContent>
|
|
232
|
+
</Card>
|
|
233
|
+
|
|
234
|
+
<Card>
|
|
235
|
+
<CardHeader>
|
|
236
|
+
<CardTitle>Account</CardTitle>
|
|
237
|
+
</CardHeader>
|
|
238
|
+
<CardContent>
|
|
239
|
+
<Button variant="outline" onClick={() => signOut()} className="w-full">
|
|
240
|
+
Sign Out
|
|
241
|
+
</Button>
|
|
242
|
+
</CardContent>
|
|
243
|
+
</Card>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Step 9: Create the Tasks Page with DataTable
|
|
251
|
+
|
|
252
|
+
Create `src/pages/TasksPage.tsx`:
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
import { useState, useEffect } from 'react';
|
|
256
|
+
import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';
|
|
257
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
258
|
+
import { supabase } from '../lib/supabase';
|
|
259
|
+
|
|
260
|
+
interface Task {
|
|
261
|
+
id: string;
|
|
262
|
+
title: string;
|
|
263
|
+
description: string | null;
|
|
264
|
+
completed: boolean;
|
|
265
|
+
created_at: string;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function TasksPage() {
|
|
269
|
+
const { user } = useUnifiedAuth();
|
|
270
|
+
const [tasks, setTasks] = useState<Task[]>([]);
|
|
271
|
+
const [loading, setLoading] = useState(true);
|
|
272
|
+
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
loadTasks();
|
|
275
|
+
}, [user]);
|
|
276
|
+
|
|
277
|
+
async function loadTasks() {
|
|
278
|
+
if (!user) return;
|
|
279
|
+
|
|
280
|
+
setLoading(true);
|
|
281
|
+
const { data, error } = await supabase
|
|
282
|
+
.from('tasks')
|
|
283
|
+
.select('*')
|
|
284
|
+
.eq('user_id', user.id)
|
|
285
|
+
.order('created_at', { ascending: false });
|
|
286
|
+
|
|
287
|
+
if (error) {
|
|
288
|
+
console.error('Error loading tasks:', error);
|
|
289
|
+
} else {
|
|
290
|
+
setTasks(data || []);
|
|
291
|
+
}
|
|
292
|
+
setLoading(false);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function handleCreateRow(newTask: Partial<Task>) {
|
|
296
|
+
if (!user) return;
|
|
297
|
+
|
|
298
|
+
const { data, error } = await supabase
|
|
299
|
+
.from('tasks')
|
|
300
|
+
.insert({
|
|
301
|
+
title: newTask.title || 'New Task',
|
|
302
|
+
description: newTask.description || null,
|
|
303
|
+
completed: false,
|
|
304
|
+
user_id: user.id,
|
|
305
|
+
})
|
|
306
|
+
.select()
|
|
307
|
+
.single();
|
|
308
|
+
|
|
309
|
+
if (error) {
|
|
310
|
+
console.error('Error creating task:', error);
|
|
311
|
+
} else {
|
|
312
|
+
await loadTasks();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async function handleEditRow(row: Task, updates: Partial<Task>) {
|
|
317
|
+
const { error } = await supabase
|
|
318
|
+
.from('tasks')
|
|
319
|
+
.update(updates)
|
|
320
|
+
.eq('id', row.id);
|
|
321
|
+
|
|
322
|
+
if (error) {
|
|
323
|
+
console.error('Error updating task:', error);
|
|
324
|
+
} else {
|
|
325
|
+
await loadTasks();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
async function handleDeleteRow(row: Task) {
|
|
330
|
+
const { error } = await supabase
|
|
331
|
+
.from('tasks')
|
|
332
|
+
.delete()
|
|
333
|
+
.eq('id', row.id);
|
|
334
|
+
|
|
335
|
+
if (error) {
|
|
336
|
+
console.error('Error deleting task:', error);
|
|
337
|
+
} else {
|
|
338
|
+
await loadTasks();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const columns: DataTableColumn<Task>[] = [
|
|
343
|
+
{
|
|
344
|
+
accessorKey: 'title',
|
|
345
|
+
header: 'Title',
|
|
346
|
+
sortable: true,
|
|
347
|
+
features: { search: true },
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
accessorKey: 'description',
|
|
351
|
+
header: 'Description',
|
|
352
|
+
sortable: true,
|
|
353
|
+
features: { search: true },
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
accessorKey: 'completed',
|
|
357
|
+
header: 'Status',
|
|
358
|
+
sortable: true,
|
|
359
|
+
cell: ({ row }) => (
|
|
360
|
+
<span className={`px-2 py-1 rounded text-xs ${
|
|
361
|
+
row.original.completed
|
|
362
|
+
? 'bg-main-100 text-main-800'
|
|
363
|
+
: 'bg-sec-100 text-sec-800'
|
|
364
|
+
}`}>
|
|
365
|
+
{row.original.completed ? 'Completed' : 'Pending'}
|
|
366
|
+
</span>
|
|
367
|
+
),
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
accessorKey: 'created_at',
|
|
371
|
+
header: 'Created',
|
|
372
|
+
sortable: true,
|
|
373
|
+
cell: ({ row }) => new Date(row.original.created_at).toLocaleDateString(),
|
|
374
|
+
},
|
|
375
|
+
];
|
|
376
|
+
|
|
377
|
+
return (
|
|
378
|
+
<div className="p-6">
|
|
379
|
+
<h1 className="text-3xl font-bold mb-6">Tasks</h1>
|
|
380
|
+
|
|
381
|
+
<DataTable
|
|
382
|
+
data={tasks}
|
|
383
|
+
columns={columns}
|
|
384
|
+
features={{
|
|
385
|
+
search: true,
|
|
386
|
+
pagination: true,
|
|
387
|
+
sorting: true,
|
|
388
|
+
creation: true,
|
|
389
|
+
editing: true,
|
|
390
|
+
deletion: true,
|
|
391
|
+
}}
|
|
392
|
+
onEditRow={handleEditRow}
|
|
393
|
+
onDeleteRow={handleDeleteRow}
|
|
394
|
+
onCreateRow={handleCreateRow}
|
|
395
|
+
isLoading={loading}
|
|
396
|
+
title="My Tasks"
|
|
397
|
+
description="Manage your tasks"
|
|
398
|
+
/>
|
|
399
|
+
</div>
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Step 10: Run Your App
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
npm run dev
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Your app should now be running at `http://localhost:3000`. You can:
|
|
411
|
+
|
|
412
|
+
1. Sign up for a new account or sign in
|
|
413
|
+
2. View your dashboard
|
|
414
|
+
3. Navigate to the Tasks page
|
|
415
|
+
4. Create, edit, and delete tasks
|
|
416
|
+
|
|
417
|
+
## Next Steps
|
|
418
|
+
|
|
419
|
+
- **Add RBAC**: See the [RBAC Quick Start](../rbac/quick-start.md) guide
|
|
420
|
+
- **Add Organisation Context**: See [Organisation Security](../implementation-guides/organisation-security.md)
|
|
421
|
+
- **Customize Styling**: See [Component Styling](../implementation-guides/component-styling.md)
|
|
422
|
+
- **Add More Features**: See [Full-Featured Example](./examples/full-featured-app.md)
|
|
423
|
+
|
|
424
|
+
## Troubleshooting
|
|
425
|
+
|
|
426
|
+
### Components appear unstyled
|
|
427
|
+
- Ensure you've imported `@jmruthers/pace-core/src/styles/core.css` in your `app.css`
|
|
428
|
+
- Verify Tailwind v4 is properly configured in `vite.config.ts`
|
|
429
|
+
- Check that pace-core source files are included in content scanning
|
|
430
|
+
|
|
431
|
+
### Authentication not working
|
|
432
|
+
- Verify your Supabase URL and anon key are correct in `.env.local`
|
|
433
|
+
- Check that email authentication is enabled in Supabase dashboard
|
|
434
|
+
- Ensure RLS policies are set up correctly
|
|
435
|
+
|
|
436
|
+
### DataTable not showing data
|
|
437
|
+
- Verify your database table exists and has data
|
|
438
|
+
- Check that RLS policies allow the current user to read data
|
|
439
|
+
- Check browser console for errors
|
|
440
|
+
|
|
441
|
+
## ♿ Accessibility
|
|
442
|
+
|
|
443
|
+
The app you've built includes accessibility features:
|
|
444
|
+
|
|
445
|
+
- **WCAG 2.1 AA compliant** - All PACE Core components meet accessibility standards
|
|
446
|
+
- **Semantic HTML** - Proper use of semantic elements in your components
|
|
447
|
+
- **Screen Reader Support** - All interactive elements have proper ARIA labels
|
|
448
|
+
- **Keyboard Navigation** - Full keyboard support for navigation and data tables
|
|
449
|
+
- **Focus Management** - Proper focus indicators and tab order
|
|
450
|
+
|
|
451
|
+
### Accessibility Best Practices
|
|
452
|
+
|
|
453
|
+
1. **Use semantic HTML** - Prefer `<nav>`, `<main>`, `<header>` over generic `<div>` elements
|
|
454
|
+
2. **Label form inputs** - Always associate labels with form inputs
|
|
455
|
+
3. **Test with screen readers** - Verify your app works with assistive technologies
|
|
456
|
+
4. **Maintain keyboard access** - Ensure all interactive elements are keyboard accessible
|
|
457
|
+
5. **Check color contrast** - Verify text meets WCAG contrast requirements
|
|
458
|
+
|
|
459
|
+
## ⚠️ Edge Cases
|
|
460
|
+
|
|
461
|
+
### Database Connection Failures
|
|
462
|
+
|
|
463
|
+
When database connection fails:
|
|
464
|
+
- Verify Supabase URL and keys are correct
|
|
465
|
+
- Check network connectivity
|
|
466
|
+
- Verify RLS policies allow access
|
|
467
|
+
- Check Supabase project status
|
|
468
|
+
- Review error messages in browser console
|
|
469
|
+
|
|
470
|
+
### Authentication Issues
|
|
471
|
+
|
|
472
|
+
When authentication doesn't work:
|
|
473
|
+
- Verify Supabase auth is enabled
|
|
474
|
+
- Check email/password format
|
|
475
|
+
- Verify user exists in Supabase
|
|
476
|
+
- Check RLS policies for auth tables
|
|
477
|
+
- Review authentication error messages
|
|
478
|
+
|
|
479
|
+
### DataTable Not Loading
|
|
480
|
+
|
|
481
|
+
When DataTable doesn't show data:
|
|
482
|
+
- Verify data structure matches column definitions
|
|
483
|
+
- Check that `getRowId` function returns unique IDs
|
|
484
|
+
- Verify data is not empty
|
|
485
|
+
- Check for JavaScript errors in console
|
|
486
|
+
- Ensure columns are properly defined
|
|
487
|
+
|
|
488
|
+
### Styling Issues
|
|
489
|
+
|
|
490
|
+
When components appear unstyled:
|
|
491
|
+
- Verify CSS is imported in entry point
|
|
492
|
+
- Check Vite config includes pace-core source files
|
|
493
|
+
- Ensure Tailwind v4 is installed
|
|
494
|
+
- Restart dev server after config changes
|
|
495
|
+
- Check browser console for CSS errors
|
|
496
|
+
|
|
497
|
+
### Build Errors
|
|
498
|
+
|
|
499
|
+
When build fails:
|
|
500
|
+
- Check for TypeScript errors
|
|
501
|
+
- Verify all imports are correct
|
|
502
|
+
- Check for missing dependencies
|
|
503
|
+
- Review build error messages
|
|
504
|
+
- Clear build cache and rebuild
|
|
505
|
+
|
|
506
|
+
## What You've Built
|
|
507
|
+
|
|
508
|
+
You've created a complete admin application with:
|
|
509
|
+
- ✅ User authentication (sign up, sign in, sign out)
|
|
510
|
+
- ✅ Protected routes
|
|
511
|
+
- ✅ Data table with CRUD operations
|
|
512
|
+
- ✅ Responsive layout
|
|
513
|
+
- ✅ Row-level security
|
|
514
|
+
- ✅ Session management
|
|
515
|
+
|
|
516
|
+
Congratulations! You're ready to build more complex features with PACE Core.
|
|
517
|
+
|
|
@@ -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
|
# App Layout
|
|
@@ -988,4 +988,46 @@ test('renders mobile layout correctly', () => {
|
|
|
988
988
|
- Ensure sufficient color contrast
|
|
989
989
|
- Test with screen readers
|
|
990
990
|
|
|
991
|
+
## ⚠️ Edge Cases
|
|
992
|
+
|
|
993
|
+
### Layout State Loss
|
|
994
|
+
|
|
995
|
+
When layout state is lost:
|
|
996
|
+
- Default states are restored
|
|
997
|
+
- Navigation rebuilds from configuration
|
|
998
|
+
- No data loss or corruption
|
|
999
|
+
- Graceful recovery from errors
|
|
1000
|
+
|
|
1001
|
+
### Permission Changes During Session
|
|
1002
|
+
|
|
1003
|
+
When user permissions change during active session:
|
|
1004
|
+
- Layout updates automatically
|
|
1005
|
+
- Navigation items appear/disappear dynamically
|
|
1006
|
+
- No page refresh required
|
|
1007
|
+
- Clear feedback explains permission changes
|
|
1008
|
+
|
|
1009
|
+
### Responsive Breakpoint Changes
|
|
1010
|
+
|
|
1011
|
+
When screen size changes rapidly:
|
|
1012
|
+
- Layout adapts smoothly to new breakpoints
|
|
1013
|
+
- Navigation state is preserved
|
|
1014
|
+
- No flickering or layout shifts
|
|
1015
|
+
- Smooth transitions maintained
|
|
1016
|
+
|
|
1017
|
+
### Missing Navigation Configuration
|
|
1018
|
+
|
|
1019
|
+
When navigation configuration is missing:
|
|
1020
|
+
- Layout gracefully handles missing items
|
|
1021
|
+
- Default navigation is shown
|
|
1022
|
+
- Error states are handled gracefully
|
|
1023
|
+
- User experience is not disrupted
|
|
1024
|
+
|
|
1025
|
+
### Concurrent Layout Updates
|
|
1026
|
+
|
|
1027
|
+
When multiple layout updates occur:
|
|
1028
|
+
- Updates are queued and processed in order
|
|
1029
|
+
- State conflicts are prevented
|
|
1030
|
+
- User feedback is provided
|
|
1031
|
+
- Data consistency is maintained
|
|
1032
|
+
|
|
991
1033
|
For more advanced layout patterns and examples, see the [Layout Examples](../examples/layouts.md) guide.
|
|
@@ -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
|
# Authentication Implementation Guide
|
|
@@ -93,7 +93,6 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
|
93
93
|
<UnifiedAuthProvider
|
|
94
94
|
supabaseClient={supabase}
|
|
95
95
|
appName="my-app"
|
|
96
|
-
enableRBAC={true}
|
|
97
96
|
requireOrganisationContext={true}
|
|
98
97
|
idleTimeoutMs={30 * 60 * 1000} // 30 minutes - REQUIRED
|
|
99
98
|
warnBeforeMs={60 * 1000} // 60 seconds - REQUIRED
|
|
@@ -202,7 +201,7 @@ interface UnifiedAuthProviderProps {
|
|
|
202
201
|
onIdleLogout: () => void; // Callback when session times out
|
|
203
202
|
|
|
204
203
|
// Optional props
|
|
205
|
-
|
|
204
|
+
// Note: RBAC is always enabled - no prop needed
|
|
206
205
|
requireOrganisationContext?: boolean; // Require organisation selection (default: false)
|
|
207
206
|
debug?: boolean; // Enable debug logging (default: false)
|
|
208
207
|
children: React.ReactNode;
|
|
@@ -215,7 +214,6 @@ interface UnifiedAuthProviderProps {
|
|
|
215
214
|
<UnifiedAuthProvider
|
|
216
215
|
supabaseClient={supabase}
|
|
217
216
|
appName="meal-manager"
|
|
218
|
-
enableRBAC={true}
|
|
219
217
|
requireOrganisationContext={true}
|
|
220
218
|
debug={process.env.NODE_ENV === 'development'}
|
|
221
219
|
idleTimeoutMs={30 * 60 * 1000} // 30 minutes
|
|
@@ -1040,8 +1038,69 @@ See the [Common Patterns Guide](./best-practices/common-patterns.md) for advance
|
|
|
1040
1038
|
- [Navigation Integration](./navigation.md) - Permission-based navigation
|
|
1041
1039
|
- [Troubleshooting Guide](./troubleshooting/README.md) - Common issues and solutions
|
|
1042
1040
|
|
|
1041
|
+
## ♿ Accessibility
|
|
1042
|
+
|
|
1043
|
+
The authentication system is designed with accessibility in mind:
|
|
1044
|
+
|
|
1045
|
+
- **WCAG 2.1 AA compliant** - All authentication components meet accessibility standards
|
|
1046
|
+
- **Keyboard Navigation** - Full keyboard support for all authentication forms and interactions
|
|
1047
|
+
- **Screen Reader Support** - Proper ARIA labels and roles for all form elements
|
|
1048
|
+
- **Focus Management** - Logical tab order and visible focus indicators
|
|
1049
|
+
- **Error Announcements** - Error messages are properly announced to screen readers
|
|
1050
|
+
- **Loading States** - Loading indicators are accessible and announced
|
|
1051
|
+
|
|
1052
|
+
### Accessibility Best Practices
|
|
1053
|
+
|
|
1054
|
+
1. **Use semantic HTML** - Prefer `<form>`, `<label>`, `<input>` over generic divs
|
|
1055
|
+
2. **Associate labels with inputs** - Use proper `htmlFor` and `id` attributes
|
|
1056
|
+
3. **Provide error feedback** - Use ARIA live regions for dynamic error messages
|
|
1057
|
+
4. **Test with screen readers** - Verify authentication flows work with assistive technologies
|
|
1058
|
+
5. **Ensure keyboard navigation** - All interactive elements should be keyboard accessible
|
|
1059
|
+
|
|
1060
|
+
## ⚠️ Edge Cases
|
|
1061
|
+
|
|
1062
|
+
### Session Expiration During Use
|
|
1063
|
+
|
|
1064
|
+
When a session expires while the user is actively using the app:
|
|
1065
|
+
- Inactivity warnings are shown before expiration
|
|
1066
|
+
- Users can extend their session before timeout
|
|
1067
|
+
- Automatic logout redirects to login page
|
|
1068
|
+
- Unsaved work should be preserved if possible
|
|
1069
|
+
|
|
1070
|
+
### Network Failures During Authentication
|
|
1071
|
+
|
|
1072
|
+
When network requests fail during login/signup:
|
|
1073
|
+
- Error messages are clearly displayed
|
|
1074
|
+
- Retry mechanisms are available
|
|
1075
|
+
- Partial form data is preserved when possible
|
|
1076
|
+
- User-friendly error messages guide recovery
|
|
1077
|
+
|
|
1078
|
+
### Multiple Tab Sessions
|
|
1079
|
+
|
|
1080
|
+
When users have multiple tabs open:
|
|
1081
|
+
- Session state is synchronized across tabs
|
|
1082
|
+
- Logout in one tab logs out all tabs
|
|
1083
|
+
- Organisation/event selection syncs across tabs
|
|
1084
|
+
- Inactivity tracking works across all tabs
|
|
1085
|
+
|
|
1086
|
+
### Invalid Credentials
|
|
1087
|
+
|
|
1088
|
+
When users enter invalid credentials:
|
|
1089
|
+
- Error messages are specific but don't reveal which field is wrong
|
|
1090
|
+
- Rate limiting prevents brute force attacks
|
|
1091
|
+
- Account lockout after multiple failed attempts
|
|
1092
|
+
- Clear guidance on password requirements
|
|
1093
|
+
|
|
1094
|
+
### Organisation Context Loss
|
|
1095
|
+
|
|
1096
|
+
When organisation context is lost:
|
|
1097
|
+
- User is redirected to organisation selection
|
|
1098
|
+
- Data is protected by RLS policies
|
|
1099
|
+
- Context is restored automatically when possible
|
|
1100
|
+
- Clear error messages explain the situation
|
|
1101
|
+
|
|
1043
1102
|
## Conclusion
|
|
1044
1103
|
|
|
1045
1104
|
PACE Core's authentication system provides a comprehensive solution for user authentication, session management, and access control. With built-in RBAC integration, event management, and inactivity handling, it provides everything needed for secure, user-friendly applications.
|
|
1046
1105
|
|
|
1047
|
-
The system is designed to be both powerful and easy to use, with extensive debugging support
|
|
1106
|
+
The system is designed to be both powerful and easy to use, with extensive debugging support, clear error messages, and full accessibility support to help developers build robust authentication flows.
|