@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
|
@@ -1,804 +0,0 @@
|
|
|
1
|
-
# Dialog Component
|
|
2
|
-
|
|
3
|
-
A comprehensive, accessible dialog component system built on top of Radix UI primitives with enhanced features for modern web applications.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
### 🎯 **Core Features**
|
|
8
|
-
- **Semantic HTML Structure** - Uses native `<dialog>` element with proper header, main, footer elements
|
|
9
|
-
- **Accessibility First** - WCAG 2.1 AA compliant with full screen reader support
|
|
10
|
-
- **Focus Management** - Automatic focus trapping and restoration
|
|
11
|
-
- **Keyboard Navigation** - Escape to close, Tab for focus management
|
|
12
|
-
- **Responsive Design** - Adapts to all screen sizes with smart constraints
|
|
13
|
-
|
|
14
|
-
### 🚀 **Advanced Features**
|
|
15
|
-
- **Smart Height Management** - Automatic viewport-based height constraints
|
|
16
|
-
- **Scrollable Content** - Long content scrolls while keeping headers/footers visible
|
|
17
|
-
- **Sticky Headers/Footers** - Important UI elements remain accessible during scrolling
|
|
18
|
-
- **Multiple Size Variants** - sm, md, lg, xl, full, auto sizing options
|
|
19
|
-
- **Custom Dimensions** - Fine-grained control over width and height
|
|
20
|
-
- **Configurable Close Behavior** - Control escape key and outside click behavior
|
|
21
|
-
- **Smooth Animations** - Polished transitions and micro-interactions
|
|
22
|
-
- **HTML Content Rendering** - Safe HTML content with automatic sanitization
|
|
23
|
-
|
|
24
|
-
## Quick Start
|
|
25
|
-
|
|
26
|
-
```tsx
|
|
27
|
-
import {
|
|
28
|
-
Dialog,
|
|
29
|
-
DialogTrigger,
|
|
30
|
-
DialogContent,
|
|
31
|
-
DialogHeader,
|
|
32
|
-
DialogTitle,
|
|
33
|
-
DialogDescription,
|
|
34
|
-
DialogBody,
|
|
35
|
-
DialogFooter,
|
|
36
|
-
Button
|
|
37
|
-
} from '@jmruthers/pace-core';
|
|
38
|
-
|
|
39
|
-
// Basic dialog
|
|
40
|
-
<Dialog>
|
|
41
|
-
<DialogTrigger asChild>
|
|
42
|
-
<Button>Open Dialog</Button>
|
|
43
|
-
</DialogTrigger>
|
|
44
|
-
<DialogContent size="lg">
|
|
45
|
-
<DialogHeader>
|
|
46
|
-
<DialogTitle>Edit Profile</DialogTitle>
|
|
47
|
-
<DialogDescription>
|
|
48
|
-
Make changes to your profile here. Click save when you're done.
|
|
49
|
-
</DialogDescription>
|
|
50
|
-
</DialogHeader>
|
|
51
|
-
<DialogBody>
|
|
52
|
-
<section className="space-y-4">
|
|
53
|
-
<p>Your content goes here...</p>
|
|
54
|
-
</section>
|
|
55
|
-
</DialogBody>
|
|
56
|
-
<DialogFooter>
|
|
57
|
-
<Button variant="outline">Cancel</Button>
|
|
58
|
-
<Button>Save changes</Button>
|
|
59
|
-
</DialogFooter>
|
|
60
|
-
</DialogContent>
|
|
61
|
-
</Dialog>
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## HTML Content Rendering
|
|
65
|
-
|
|
66
|
-
The Dialog components support rich HTML content rendering with automatic sanitization. This is perfect for formatted instructions, feature announcements, error details, or any HTML that needs to be displayed in dialogs.
|
|
67
|
-
|
|
68
|
-
> **🎯 Key Features:**
|
|
69
|
-
> - **Rich HTML Rendering**: Full HTML support with proper styling
|
|
70
|
-
> - **Safe Sanitization**: Automatic XSS protection
|
|
71
|
-
> - **Prose Styling**: Typography classes for readable content
|
|
72
|
-
> - **Fallback Support**: Graceful degradation if HTML fails
|
|
73
|
-
|
|
74
|
-
### Quick Start
|
|
75
|
-
|
|
76
|
-
#### Basic HTML Content
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
<Dialog>
|
|
80
|
-
<DialogContent>
|
|
81
|
-
<DialogHeader>
|
|
82
|
-
<DialogTitle htmlContent="<h2>Import Instructions</h2>" allowHtml={true} />
|
|
83
|
-
</DialogHeader>
|
|
84
|
-
<DialogBody
|
|
85
|
-
htmlContent="<p>Upload a CSV file with the following format:</p><ul><li>Required columns: name, email</li><li>Optional columns: phone, address</li></ul>"
|
|
86
|
-
allowHtml={true}
|
|
87
|
-
>
|
|
88
|
-
{/* Fallback content if HTML rendering fails */}
|
|
89
|
-
<div className="text-acc-500">
|
|
90
|
-
HTML content failed to render. This is fallback content.
|
|
91
|
-
</div>
|
|
92
|
-
</DialogBody>
|
|
93
|
-
</DialogContent>
|
|
94
|
-
</Dialog>
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
#### Rich HTML Content with Styling
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
<DialogBody
|
|
101
|
-
htmlContent={`
|
|
102
|
-
<div class="space-y-4">
|
|
103
|
-
<div class="bg-main-50 p-4 rounded-lg">
|
|
104
|
-
<h3 class="font-semibold text-main-900 mb-2">📋 Required Format</h3>
|
|
105
|
-
<p class="text-sm text-main-800 mb-2">Your CSV file must include these columns:</p>
|
|
106
|
-
<ul class="text-sm text-main-700 list-disc list-inside ml-2">
|
|
107
|
-
<li><code>name</code> - Full name of the person</li>
|
|
108
|
-
<li><code>email</code> - Valid email address</li>
|
|
109
|
-
<li><code>phone</code> - Phone number (optional)</li>
|
|
110
|
-
</ul>
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
<div class="bg-main-50 p-4 rounded-lg">
|
|
114
|
-
<h3 class="font-semibold text-main-900 mb-2">✅ Example Data</h3>
|
|
115
|
-
<pre class="text-xs text-main-700 bg-main-50 p-2 rounded border">
|
|
116
|
-
name,email,phone
|
|
117
|
-
John Doe,john@example.com,555-0123
|
|
118
|
-
Jane Smith,jane@example.com,
|
|
119
|
-
</pre>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
<div class="bg-acc-50 p-3 rounded-lg">
|
|
123
|
-
<p class="text-sm text-acc-800">
|
|
124
|
-
<strong>⚠️ Important:</strong> Make sure your CSV file is properly formatted.
|
|
125
|
-
</p>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
`}
|
|
129
|
-
allowHtml={true}
|
|
130
|
-
/>
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Configuration Options
|
|
134
|
-
|
|
135
|
-
| Property | Type | Default | Description |
|
|
136
|
-
|----------|------|---------|-------------|
|
|
137
|
-
| `htmlContent` | `string` | `undefined` | HTML string to render |
|
|
138
|
-
| `allowHtml` | `boolean` | `true` | Enable/disable HTML rendering |
|
|
139
|
-
| `strictSanitization` | `boolean` | `true` | Use strict HTML sanitization |
|
|
140
|
-
| `logWarnings` | `boolean` | `false` | Log sanitization warnings to console |
|
|
141
|
-
|
|
142
|
-
### Supported HTML Elements
|
|
143
|
-
|
|
144
|
-
**Allowed HTML Elements:**
|
|
145
|
-
- Text formatting: `p`, `div`, `span`, `h1`-`h6`, `strong`, `em`, `b`, `i`, `u`, `s`, `mark`, `small`, `sub`, `sup`
|
|
146
|
-
- Lists: `ul`, `ol`, `li`, `dl`, `dt`, `dd`
|
|
147
|
-
- Code: `pre`, `code`, `kbd`, `samp`
|
|
148
|
-
- Links: `a` (with href validation)
|
|
149
|
-
- Tables: `table`, `thead`, `tbody`, `tfoot`, `tr`, `th`, `td`
|
|
150
|
-
- Media: `img` (with src validation)
|
|
151
|
-
- Layout: `section`, `article`, `aside`, `header`, `footer`, `main`, `nav`
|
|
152
|
-
- Interactive: `details`, `summary`
|
|
153
|
-
|
|
154
|
-
**Removed Elements:**
|
|
155
|
-
- Scripts: `script`, `iframe`, `object`, `embed`
|
|
156
|
-
- Forms: `form`, `input`, `button`
|
|
157
|
-
- Event handlers: `onclick`, `onload`, etc.
|
|
158
|
-
- Dangerous protocols: `javascript:`, `data:`
|
|
159
|
-
|
|
160
|
-
### Styling and Typography
|
|
161
|
-
|
|
162
|
-
HTML content is automatically styled with prose classes for optimal readability:
|
|
163
|
-
|
|
164
|
-
```css
|
|
165
|
-
/* Applied automatically to HTML content */
|
|
166
|
-
.prose {
|
|
167
|
-
color: inherit;
|
|
168
|
-
max-width: none;
|
|
169
|
-
font-size: 0.875rem;
|
|
170
|
-
line-height: 1.5;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 {
|
|
174
|
-
font-weight: 600;
|
|
175
|
-
margin-top: 1.5rem;
|
|
176
|
-
margin-bottom: 0.5rem;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
.prose p {
|
|
180
|
-
margin-top: 0.5rem;
|
|
181
|
-
margin-bottom: 0.5rem;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
.prose ul, .prose ol {
|
|
185
|
-
margin-top: 0.5rem;
|
|
186
|
-
margin-bottom: 0.5rem;
|
|
187
|
-
padding-left: 1.5rem;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
.prose code {
|
|
191
|
-
background-color: rgb(243 244 246);
|
|
192
|
-
padding: 0.125rem 0.25rem;
|
|
193
|
-
border-radius: 0.25rem;
|
|
194
|
-
font-size: 0.875em;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.prose pre {
|
|
198
|
-
background-color: rgb(243 244 246);
|
|
199
|
-
padding: 0.75rem;
|
|
200
|
-
border-radius: 0.5rem;
|
|
201
|
-
overflow-x: auto;
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### Complete Examples
|
|
206
|
-
|
|
207
|
-
#### Import Instructions Dialog
|
|
208
|
-
|
|
209
|
-
```tsx
|
|
210
|
-
function ImportInstructionsDialog() {
|
|
211
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
212
|
-
|
|
213
|
-
const importInstructions = `
|
|
214
|
-
<div class="space-y-4">
|
|
215
|
-
<p class="text-sm text-sec-600 mb-4">
|
|
216
|
-
Upload a CSV file with dish or recipe data. The system will automatically detect the format based on your column headers.
|
|
217
|
-
</p>
|
|
218
|
-
|
|
219
|
-
<div class="bg-main-50 p-4 rounded-lg">
|
|
220
|
-
<h3 class="font-semibold text-main-900 mb-2">🍽️ Dish Format (3 columns)</h3>
|
|
221
|
-
<p class="text-sm text-main-800 mb-2">Perfect for importing basic dish information:</p>
|
|
222
|
-
<div class="space-y-1">
|
|
223
|
-
<p class="text-sm"><strong>Required:</strong> <code>dish_code</code>, <code>dish_name</code>, <code>mealtype_name</code></p>
|
|
224
|
-
<p class="text-sm"><strong>Optional:</strong> <code>dish_description</code></p>
|
|
225
|
-
</div>
|
|
226
|
-
<div class="mt-2">
|
|
227
|
-
<p class="text-xs text-main-700"><strong>Examples:</strong></p>
|
|
228
|
-
<ul class="text-xs text-main-700 list-disc list-inside ml-2">
|
|
229
|
-
<li><code>dish_code</code>: BBQ, PC, CTY</li>
|
|
230
|
-
<li><code>dish_name</code>: BBQ hamburgers and potato salad</li>
|
|
231
|
-
<li><code>mealtype_name</code>: Breakfast, Lunch, Dinner</li>
|
|
232
|
-
</ul>
|
|
233
|
-
</div>
|
|
234
|
-
</div>
|
|
235
|
-
|
|
236
|
-
<div class="bg-main-50 p-4 rounded-lg">
|
|
237
|
-
<h3 class="font-semibold text-main-900 mb-2">📋 Recipe Format (8 columns)</h3>
|
|
238
|
-
<p class="text-sm text-main-800 mb-2">Perfect for importing detailed recipe ingredients:</p>
|
|
239
|
-
<div class="space-y-1">
|
|
240
|
-
<p class="text-sm"><strong>Required:</strong> <code>dish_code</code>, <code>dish_name</code>, <code>mealtype_name</code>, <code>diettype_name</code>, <code>item_name</code>, <code>recipe_qtypp</code>, <code>recipe_uptake</code></p>
|
|
241
|
-
<p class="text-sm"><strong>Optional:</strong> <code>item_brand</code></p>
|
|
242
|
-
</div>
|
|
243
|
-
<div class="mt-2">
|
|
244
|
-
<p class="text-xs text-main-700"><strong>Examples:</strong></p>
|
|
245
|
-
<ul class="text-xs text-main-700 list-disc list-inside ml-2">
|
|
246
|
-
<li><code>dish_code</code>: BBQ</li>
|
|
247
|
-
<li><code>dish_name</code>: BBQ hamburgers and potato salad</li>
|
|
248
|
-
<li><code>mealtype_name</code>: Dinner</li>
|
|
249
|
-
<li><code>diettype_name</code>: Standard, Gluten Free, Vegan</li>
|
|
250
|
-
<li><code>item_name</code>: Lettuce iceberg shredded</li>
|
|
251
|
-
<li><code>item_brand</code>: Masterfoods, Coles</li>
|
|
252
|
-
<li><code>recipe_qtypp</code>: 35, 1.66</li>
|
|
253
|
-
<li><code>recipe_uptake</code>: 1.0, 0.75</li>
|
|
254
|
-
</ul>
|
|
255
|
-
</div>
|
|
256
|
-
</div>
|
|
257
|
-
|
|
258
|
-
<div class="bg-acc-50 p-3 rounded-lg">
|
|
259
|
-
<p class="text-sm text-acc-800"><strong>⚠️ Important:</strong> Recipe imports will replace all existing recipe data for dishes in the file.</p>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
`;
|
|
263
|
-
|
|
264
|
-
return (
|
|
265
|
-
<>
|
|
266
|
-
<Button onClick={() => setIsOpen(true)}>
|
|
267
|
-
Show Import Instructions
|
|
268
|
-
</Button>
|
|
269
|
-
|
|
270
|
-
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
271
|
-
<DialogContent size="lg">
|
|
272
|
-
<DialogHeader>
|
|
273
|
-
<DialogTitle htmlContent="<h2>Import Dishes or Recipes</h2>" allowHtml={true} />
|
|
274
|
-
</DialogHeader>
|
|
275
|
-
|
|
276
|
-
<DialogBody
|
|
277
|
-
htmlContent={importInstructions}
|
|
278
|
-
allowHtml={true}
|
|
279
|
-
strictSanitization={true}
|
|
280
|
-
logWarnings={true}
|
|
281
|
-
>
|
|
282
|
-
{/* Fallback content if HTML rendering fails */}
|
|
283
|
-
<div className="text-acc-500">
|
|
284
|
-
HTML content failed to render. This is fallback content.
|
|
285
|
-
</div>
|
|
286
|
-
</DialogBody>
|
|
287
|
-
|
|
288
|
-
<DialogFooter>
|
|
289
|
-
<Button variant="outline" onClick={() => setIsOpen(false)}>
|
|
290
|
-
Cancel
|
|
291
|
-
</Button>
|
|
292
|
-
<Button onClick={() => setIsOpen(false)}>
|
|
293
|
-
Import Data
|
|
294
|
-
</Button>
|
|
295
|
-
</DialogFooter>
|
|
296
|
-
</DialogContent>
|
|
297
|
-
</Dialog>
|
|
298
|
-
</>
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Mixed Content
|
|
304
|
-
|
|
305
|
-
You can mix HTML content with React children:
|
|
306
|
-
|
|
307
|
-
```tsx
|
|
308
|
-
<DialogBody>
|
|
309
|
-
<div className="space-y-4">
|
|
310
|
-
<h3>React Content</h3>
|
|
311
|
-
<p>This is rendered using React children.</p>
|
|
312
|
-
</div>
|
|
313
|
-
<DialogBody
|
|
314
|
-
htmlContent="<h3>HTML Content</h3><p>This is rendered from HTML string.</p>"
|
|
315
|
-
allowHtml={true}
|
|
316
|
-
/>
|
|
317
|
-
</DialogBody>
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### Best Practices
|
|
321
|
-
|
|
322
|
-
#### 1. HTML Content Structure
|
|
323
|
-
- Use semantic HTML elements (`h1`-`h6`, `p`, `ul`, `ol`, etc.)
|
|
324
|
-
- Keep content well-structured and accessible
|
|
325
|
-
- Use proper heading hierarchy
|
|
326
|
-
- Include meaningful alt text for images
|
|
327
|
-
|
|
328
|
-
#### 2. Security
|
|
329
|
-
- Always use `strictSanitization: true` for user-generated content
|
|
330
|
-
- Never trust user input without sanitization
|
|
331
|
-
- Test with malicious HTML to ensure proper filtering
|
|
332
|
-
- Use `logWarnings: true` in development to catch issues
|
|
333
|
-
|
|
334
|
-
#### 3. Styling
|
|
335
|
-
- Use Tailwind CSS classes for consistent styling
|
|
336
|
-
- Leverage the automatic prose styling
|
|
337
|
-
- Test on different screen sizes
|
|
338
|
-
- Ensure good contrast and readability
|
|
339
|
-
|
|
340
|
-
#### 4. Fallback Content
|
|
341
|
-
- Always provide meaningful fallback content
|
|
342
|
-
- Test with HTML disabled to ensure graceful degradation
|
|
343
|
-
- Use clear error messages for failed rendering
|
|
344
|
-
|
|
345
|
-
### Troubleshooting
|
|
346
|
-
|
|
347
|
-
**Common Issues:**
|
|
348
|
-
|
|
349
|
-
1. **HTML not rendering:**
|
|
350
|
-
- Check that `allowHtml={true}` is set
|
|
351
|
-
- Verify HTML content is valid
|
|
352
|
-
- Check console for sanitization warnings
|
|
353
|
-
- Ensure content is not empty or undefined
|
|
354
|
-
|
|
355
|
-
2. **Styling not applied:**
|
|
356
|
-
- Verify Tailwind CSS classes are available
|
|
357
|
-
- Check for CSS conflicts
|
|
358
|
-
- Ensure proper class names are used
|
|
359
|
-
- Test with browser dev tools
|
|
360
|
-
|
|
361
|
-
3. **Content being stripped:**
|
|
362
|
-
- Check sanitization settings
|
|
363
|
-
- Verify HTML elements are allowed
|
|
364
|
-
- Review console warnings
|
|
365
|
-
- Test with simpler HTML first
|
|
366
|
-
|
|
367
|
-
**Debug Tips:**
|
|
368
|
-
1. **Enable logging**: Set `logWarnings={true}` to see sanitization warnings
|
|
369
|
-
2. **Test fallback**: Disable `allowHtml` to test fallback content
|
|
370
|
-
3. **Check console**: Look for JavaScript errors or warnings
|
|
371
|
-
4. **Validate HTML**: Use HTML validators to check content
|
|
372
|
-
5. **Test sanitization**: Try with malicious HTML to verify security
|
|
373
|
-
|
|
374
|
-
## API Reference
|
|
375
|
-
|
|
376
|
-
### DialogContent Props
|
|
377
|
-
|
|
378
|
-
The main content container with enhanced features:
|
|
379
|
-
|
|
380
|
-
```typescript
|
|
381
|
-
interface DialogContentProps {
|
|
382
|
-
/** Dialog size variant */
|
|
383
|
-
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'auto';
|
|
384
|
-
|
|
385
|
-
/** Whether to show the close button */
|
|
386
|
-
showCloseButton?: boolean;
|
|
387
|
-
|
|
388
|
-
/** Custom className for the overlay */
|
|
389
|
-
overlayClassName?: string;
|
|
390
|
-
|
|
391
|
-
/** Whether to prevent closing on escape key */
|
|
392
|
-
preventCloseOnEscape?: boolean;
|
|
393
|
-
|
|
394
|
-
/** Whether to prevent closing on outside click */
|
|
395
|
-
preventCloseOnOutsideClick?: boolean;
|
|
396
|
-
|
|
397
|
-
/** Maximum height as percentage of viewport height (0-100) */
|
|
398
|
-
maxHeightPercent?: number;
|
|
399
|
-
|
|
400
|
-
/** Maximum width as percentage of viewport width (0-100) */
|
|
401
|
-
maxWidthPercent?: number;
|
|
402
|
-
|
|
403
|
-
/** Enable smart scrolling with sticky header/footer */
|
|
404
|
-
enableScrolling?: boolean;
|
|
405
|
-
|
|
406
|
-
/** Custom max height in CSS units (overrides maxHeightPercent) */
|
|
407
|
-
maxHeight?: string;
|
|
408
|
-
|
|
409
|
-
/** Custom max width in CSS units (overrides maxWidthPercent and size) */
|
|
410
|
-
maxWidth?: string;
|
|
411
|
-
|
|
412
|
-
/** Minimum height in CSS units */
|
|
413
|
-
minHeight?: string;
|
|
414
|
-
|
|
415
|
-
/** Minimum width in CSS units */
|
|
416
|
-
minWidth?: string;
|
|
417
|
-
}
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
### DialogHeader Props
|
|
421
|
-
|
|
422
|
-
Semantic header container with optional sticky behavior:
|
|
423
|
-
|
|
424
|
-
```typescript
|
|
425
|
-
interface DialogHeaderProps {
|
|
426
|
-
/** Whether this header should be sticky when scrolling is enabled */
|
|
427
|
-
sticky?: boolean;
|
|
428
|
-
}
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
### DialogFooter Props
|
|
432
|
-
|
|
433
|
-
Semantic footer container with optional sticky behavior:
|
|
434
|
-
|
|
435
|
-
```typescript
|
|
436
|
-
interface DialogFooterProps {
|
|
437
|
-
/** Whether this footer should be sticky when scrolling is enabled */
|
|
438
|
-
sticky?: boolean;
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### DialogBody Props
|
|
443
|
-
|
|
444
|
-
Semantic main content area with scrollable functionality and HTML content support:
|
|
445
|
-
|
|
446
|
-
```typescript
|
|
447
|
-
interface DialogBodyProps {
|
|
448
|
-
/** Custom max height for the scrollable area */
|
|
449
|
-
maxHeight?: string;
|
|
450
|
-
/** HTML content to render (will be sanitized for security) */
|
|
451
|
-
htmlContent?: string;
|
|
452
|
-
/** Whether to allow HTML content rendering (default: true) */
|
|
453
|
-
allowHtml?: boolean;
|
|
454
|
-
/** Whether to use strict HTML sanitization (default: true) */
|
|
455
|
-
strictSanitization?: boolean;
|
|
456
|
-
/** Whether to log HTML sanitization warnings to console (default: false) */
|
|
457
|
-
logWarnings?: boolean;
|
|
458
|
-
}
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### DialogTitle Props
|
|
462
|
-
|
|
463
|
-
Dialog title with optional HTML content support:
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
interface DialogTitleProps {
|
|
467
|
-
/** HTML content to render as title (will be sanitized for security) */
|
|
468
|
-
htmlContent?: string;
|
|
469
|
-
/** Whether to allow HTML content rendering (default: true) */
|
|
470
|
-
allowHtml?: boolean;
|
|
471
|
-
}
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
### DialogDescription Props
|
|
475
|
-
|
|
476
|
-
Dialog description with optional HTML content support:
|
|
477
|
-
|
|
478
|
-
```typescript
|
|
479
|
-
interface DialogDescriptionProps {
|
|
480
|
-
/** HTML content to render as description (will be sanitized for security) */
|
|
481
|
-
htmlContent?: string;
|
|
482
|
-
/** Whether to allow HTML content rendering (default: true) */
|
|
483
|
-
allowHtml?: boolean;
|
|
484
|
-
}
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
## Examples
|
|
488
|
-
|
|
489
|
-
### Basic Dialog
|
|
490
|
-
|
|
491
|
-
```tsx
|
|
492
|
-
<Dialog>
|
|
493
|
-
<DialogTrigger asChild>
|
|
494
|
-
<Button>Open Dialog</Button>
|
|
495
|
-
</DialogTrigger>
|
|
496
|
-
<DialogContent size="md">
|
|
497
|
-
<DialogHeader>
|
|
498
|
-
<DialogTitle>Basic Dialog</DialogTitle>
|
|
499
|
-
<DialogDescription>
|
|
500
|
-
This is a standard dialog without scrolling enabled.
|
|
501
|
-
</DialogDescription>
|
|
502
|
-
</DialogHeader>
|
|
503
|
-
<DialogBody>
|
|
504
|
-
<section className="py-4">
|
|
505
|
-
<p>Simple content that fits nicely in the dialog.</p>
|
|
506
|
-
</section>
|
|
507
|
-
</DialogBody>
|
|
508
|
-
<DialogFooter>
|
|
509
|
-
<Button variant="outline">Cancel</Button>
|
|
510
|
-
<Button>Save</Button>
|
|
511
|
-
</DialogFooter>
|
|
512
|
-
</DialogContent>
|
|
513
|
-
</Dialog>
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
### Scrollable Dialog with Sticky Header/Footer
|
|
517
|
-
|
|
518
|
-
```tsx
|
|
519
|
-
<Dialog>
|
|
520
|
-
<DialogTrigger asChild>
|
|
521
|
-
<Button>Scrollable Dialog</Button>
|
|
522
|
-
</DialogTrigger>
|
|
523
|
-
<DialogContent
|
|
524
|
-
size="lg"
|
|
525
|
-
enableScrolling={true}
|
|
526
|
-
maxHeightPercent={80}
|
|
527
|
-
>
|
|
528
|
-
<DialogHeader sticky={true}>
|
|
529
|
-
<DialogTitle>Scrollable Dialog</DialogTitle>
|
|
530
|
-
<DialogDescription>
|
|
531
|
-
This dialog has lots of content and will scroll if needed.
|
|
532
|
-
The header stays sticky at the top.
|
|
533
|
-
</DialogDescription>
|
|
534
|
-
</DialogHeader>
|
|
535
|
-
<DialogBody>
|
|
536
|
-
<div className="space-y-4">
|
|
537
|
-
{Array.from({ length: 50 }, (_, i) => (
|
|
538
|
-
<div key={i} className="p-4 border rounded-lg">
|
|
539
|
-
<h4>Content Section {i + 1}</h4>
|
|
540
|
-
<p>This is content that will scroll...</p>
|
|
541
|
-
</div>
|
|
542
|
-
))}
|
|
543
|
-
</div>
|
|
544
|
-
</DialogBody>
|
|
545
|
-
<DialogFooter sticky={true}>
|
|
546
|
-
<Button variant="outline">Cancel</Button>
|
|
547
|
-
<Button>Save Changes</Button>
|
|
548
|
-
</DialogFooter>
|
|
549
|
-
</DialogContent>
|
|
550
|
-
</Dialog>
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### Custom Height Dialog
|
|
554
|
-
|
|
555
|
-
```tsx
|
|
556
|
-
<Dialog>
|
|
557
|
-
<DialogTrigger asChild>
|
|
558
|
-
<Button>Custom Height</Button>
|
|
559
|
-
</DialogTrigger>
|
|
560
|
-
<DialogContent
|
|
561
|
-
size="xl"
|
|
562
|
-
enableScrolling={true}
|
|
563
|
-
maxHeight="400px"
|
|
564
|
-
>
|
|
565
|
-
<DialogHeader>
|
|
566
|
-
<DialogTitle>Custom Height Dialog</DialogTitle>
|
|
567
|
-
<DialogDescription>
|
|
568
|
-
This dialog has a fixed maximum height of 400px.
|
|
569
|
-
</DialogDescription>
|
|
570
|
-
</DialogHeader>
|
|
571
|
-
<DialogBody>
|
|
572
|
-
<div className="space-y-4">
|
|
573
|
-
{/* Long content that will scroll */}
|
|
574
|
-
</div>
|
|
575
|
-
</DialogBody>
|
|
576
|
-
<DialogFooter>
|
|
577
|
-
<Button>Done</Button>
|
|
578
|
-
</DialogFooter>
|
|
579
|
-
</DialogContent>
|
|
580
|
-
</Dialog>
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
### Auto-Sizing Dialog
|
|
584
|
-
|
|
585
|
-
```tsx
|
|
586
|
-
<Dialog>
|
|
587
|
-
<DialogTrigger asChild>
|
|
588
|
-
<Button>Auto Size</Button>
|
|
589
|
-
</DialogTrigger>
|
|
590
|
-
<DialogContent size="auto">
|
|
591
|
-
<DialogHeader>
|
|
592
|
-
<DialogTitle>Auto-Sized Dialog</DialogTitle>
|
|
593
|
-
<DialogDescription>
|
|
594
|
-
This dialog automatically adjusts its width to fit the content.
|
|
595
|
-
</DialogDescription>
|
|
596
|
-
</DialogHeader>
|
|
597
|
-
<DialogBody>
|
|
598
|
-
<section>
|
|
599
|
-
<p>Content that determines the dialog width...</p>
|
|
600
|
-
</section>
|
|
601
|
-
</DialogBody>
|
|
602
|
-
</DialogContent>
|
|
603
|
-
</Dialog>
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
### Full Screen Dialog
|
|
607
|
-
|
|
608
|
-
```tsx
|
|
609
|
-
<Dialog>
|
|
610
|
-
<DialogTrigger asChild>
|
|
611
|
-
<Button>Full Screen</Button>
|
|
612
|
-
</DialogTrigger>
|
|
613
|
-
<DialogContent size="full" enableScrolling={true}>
|
|
614
|
-
<DialogHeader sticky={true}>
|
|
615
|
-
<DialogTitle>Full Screen Dialog</DialogTitle>
|
|
616
|
-
<DialogDescription>
|
|
617
|
-
This dialog takes up the full screen on mobile and large size on desktop.
|
|
618
|
-
</DialogDescription>
|
|
619
|
-
</DialogHeader>
|
|
620
|
-
<DialogBody>
|
|
621
|
-
<div className="space-y-6">
|
|
622
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
623
|
-
<div className="space-y-4">
|
|
624
|
-
<h3>Left Column</h3>
|
|
625
|
-
{/* Content */}
|
|
626
|
-
</div>
|
|
627
|
-
<div className="space-y-4">
|
|
628
|
-
<h3>Right Column</h3>
|
|
629
|
-
{/* Content */}
|
|
630
|
-
</div>
|
|
631
|
-
</div>
|
|
632
|
-
</div>
|
|
633
|
-
</DialogBody>
|
|
634
|
-
<DialogFooter sticky={true}>
|
|
635
|
-
<Button variant="outline">Cancel</Button>
|
|
636
|
-
<Button>Save All Changes</Button>
|
|
637
|
-
</DialogFooter>
|
|
638
|
-
</DialogContent>
|
|
639
|
-
</Dialog>
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
### Dialog with Custom Dimensions
|
|
643
|
-
|
|
644
|
-
```tsx
|
|
645
|
-
<Dialog>
|
|
646
|
-
<DialogTrigger asChild>
|
|
647
|
-
<Button>Custom Dimensions</Button>
|
|
648
|
-
</DialogTrigger>
|
|
649
|
-
<DialogContent
|
|
650
|
-
maxWidth="800px"
|
|
651
|
-
maxHeight="600px"
|
|
652
|
-
minWidth="400px"
|
|
653
|
-
enableScrolling={true}
|
|
654
|
-
>
|
|
655
|
-
<DialogHeader>
|
|
656
|
-
<DialogTitle>Custom Dimensions</DialogTitle>
|
|
657
|
-
<DialogDescription>
|
|
658
|
-
This dialog has custom width and height constraints.
|
|
659
|
-
</DialogDescription>
|
|
660
|
-
</DialogHeader>
|
|
661
|
-
<DialogBody>
|
|
662
|
-
{/* Content */}
|
|
663
|
-
</DialogBody>
|
|
664
|
-
<DialogFooter>
|
|
665
|
-
<Button>Save</Button>
|
|
666
|
-
</DialogFooter>
|
|
667
|
-
</DialogContent>
|
|
668
|
-
</Dialog>
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
### Dialog with Prevented Close Actions
|
|
672
|
-
|
|
673
|
-
```tsx
|
|
674
|
-
<Dialog>
|
|
675
|
-
<DialogTrigger asChild>
|
|
676
|
-
<Button>Important Dialog</Button>
|
|
677
|
-
</DialogTrigger>
|
|
678
|
-
<DialogContent
|
|
679
|
-
size="lg"
|
|
680
|
-
preventCloseOnEscape={true}
|
|
681
|
-
preventCloseOnOutsideClick={true}
|
|
682
|
-
showCloseButton={false}
|
|
683
|
-
>
|
|
684
|
-
<DialogHeader>
|
|
685
|
-
<DialogTitle>Important Action Required</DialogTitle>
|
|
686
|
-
<DialogDescription>
|
|
687
|
-
This dialog cannot be closed accidentally.
|
|
688
|
-
</DialogDescription>
|
|
689
|
-
</DialogHeader>
|
|
690
|
-
<DialogBody>
|
|
691
|
-
<p>Please complete the action below to continue.</p>
|
|
692
|
-
</DialogBody>
|
|
693
|
-
<DialogFooter>
|
|
694
|
-
<Button onClick={() => {/* handle action */}}>
|
|
695
|
-
Complete Action
|
|
696
|
-
</Button>
|
|
697
|
-
</DialogFooter>
|
|
698
|
-
</DialogContent>
|
|
699
|
-
</Dialog>
|
|
700
|
-
```
|
|
701
|
-
|
|
702
|
-
## Size Variants
|
|
703
|
-
|
|
704
|
-
| Size | Max Width | Use Case |
|
|
705
|
-
|------|-----------|----------|
|
|
706
|
-
| `sm` | 384px | Simple confirmations, alerts |
|
|
707
|
-
| `md` | 448px | Standard forms, basic content |
|
|
708
|
-
| `lg` | 512px | Complex forms, detailed content |
|
|
709
|
-
| `xl` | 576px | Large forms, data tables |
|
|
710
|
-
| `full` | 100% | Full screen experiences |
|
|
711
|
-
| `auto` | Content-based | Dynamic content sizing |
|
|
712
|
-
|
|
713
|
-
## Accessibility
|
|
714
|
-
|
|
715
|
-
### WCAG 2.1 AA Compliance
|
|
716
|
-
- **Semantic HTML** - Uses proper `<dialog>`, `<header>`, `<main>`, `<footer>` elements
|
|
717
|
-
- **Focus Management** - Automatic focus trapping and restoration
|
|
718
|
-
- **Keyboard Navigation** - Full keyboard support with proper tab order
|
|
719
|
-
- **Screen Reader Support** - Complete ARIA attributes and announcements
|
|
720
|
-
- **Landmark Navigation** - Proper semantic structure for screen reader navigation
|
|
721
|
-
|
|
722
|
-
### Keyboard Shortcuts
|
|
723
|
-
- **Escape** - Close dialog (configurable)
|
|
724
|
-
- **Tab** - Navigate through focusable elements
|
|
725
|
-
- **Shift + Tab** - Navigate backwards through focusable elements
|
|
726
|
-
|
|
727
|
-
### Screen Reader Features
|
|
728
|
-
- Dialog state announcements
|
|
729
|
-
- Focus restoration when closed
|
|
730
|
-
- Scrollable regions properly announced
|
|
731
|
-
- Complete semantic landmark structure
|
|
732
|
-
|
|
733
|
-
## Performance
|
|
734
|
-
|
|
735
|
-
### Optimizations
|
|
736
|
-
- **Efficient Focus Management** - Minimal DOM queries and updates
|
|
737
|
-
- **Optimized Animations** - Hardware-accelerated transitions
|
|
738
|
-
- **Memory Leak Prevention** - Proper cleanup of event listeners
|
|
739
|
-
- **Conditional Rendering** - Only renders when needed
|
|
740
|
-
- **Optimized Scroll Handling** - Debounced resize events
|
|
741
|
-
|
|
742
|
-
### Best Practices
|
|
743
|
-
- Use `enableScrolling={true}` for content that might overflow
|
|
744
|
-
- Set appropriate `maxHeightPercent` to prevent viewport overflow
|
|
745
|
-
- Use sticky headers/footers for important UI elements
|
|
746
|
-
- Consider `size="auto"` for dynamic content
|
|
747
|
-
|
|
748
|
-
## Dependencies
|
|
749
|
-
|
|
750
|
-
- **@radix-ui/react-dialog** - Core dialog functionality and accessibility
|
|
751
|
-
- **lucide-react** - Close button icon
|
|
752
|
-
- **React 18+** - Hooks and refs
|
|
753
|
-
- **Tailwind CSS** - Styling and animations
|
|
754
|
-
|
|
755
|
-
## Migration from Basic Dialogs
|
|
756
|
-
|
|
757
|
-
If you're upgrading from a basic dialog implementation:
|
|
758
|
-
|
|
759
|
-
```tsx
|
|
760
|
-
// Before: Basic dialog
|
|
761
|
-
<Dialog>
|
|
762
|
-
<DialogTrigger>Open</DialogTrigger>
|
|
763
|
-
<DialogContent>
|
|
764
|
-
<DialogTitle>Title</DialogTitle>
|
|
765
|
-
<div>Content</div>
|
|
766
|
-
<DialogFooter>Actions</DialogFooter>
|
|
767
|
-
</DialogContent>
|
|
768
|
-
</Dialog>
|
|
769
|
-
|
|
770
|
-
// After: Enhanced dialog with semantic structure
|
|
771
|
-
<Dialog>
|
|
772
|
-
<DialogTrigger asChild>
|
|
773
|
-
<Button>Open</Button>
|
|
774
|
-
</DialogTrigger>
|
|
775
|
-
<DialogContent size="lg" enableScrolling={true}>
|
|
776
|
-
<DialogHeader>
|
|
777
|
-
<DialogTitle>Title</DialogTitle>
|
|
778
|
-
<DialogDescription>Description</DialogDescription>
|
|
779
|
-
</DialogHeader>
|
|
780
|
-
<DialogBody>
|
|
781
|
-
<section>Content</section>
|
|
782
|
-
</DialogBody>
|
|
783
|
-
<DialogFooter>
|
|
784
|
-
Actions
|
|
785
|
-
</DialogFooter>
|
|
786
|
-
</DialogContent>
|
|
787
|
-
</Dialog>
|
|
788
|
-
```
|
|
789
|
-
|
|
790
|
-
## Troubleshooting
|
|
791
|
-
|
|
792
|
-
### Common Issues
|
|
793
|
-
|
|
794
|
-
1. **Content not scrolling** - Ensure `enableScrolling={true}` is set
|
|
795
|
-
2. **Header/footer not sticky** - Add `sticky={true}` to header/footer props
|
|
796
|
-
3. **Dialog too tall** - Use `maxHeightPercent` or `maxHeight` props
|
|
797
|
-
4. **Focus issues** - Ensure proper semantic structure with DialogBody
|
|
798
|
-
|
|
799
|
-
### Debug Tips
|
|
800
|
-
|
|
801
|
-
- Use browser dev tools to inspect the semantic structure
|
|
802
|
-
- Test with keyboard navigation
|
|
803
|
-
- Verify screen reader announcements
|
|
804
|
-
- Check responsive behavior at different screen sizes
|