@payez/next-mvp 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +112 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +94 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +383 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +69 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +79 -0
- package/dist/config/vibe-log-transport.js +203 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +351 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +166 -0
- package/dist/lib/session-store.js +537 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +52 -0
- package/dist/lib/token-lifecycle.js +398 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +140 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +408 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +72 -0
- package/dist/routes/auth/session.js +180 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +201 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1531 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +23 -0
- package/dist/vibe/index.js +67 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Props {
|
|
3
|
+
email: string;
|
|
4
|
+
password: string;
|
|
5
|
+
onEmailChange: (email: string) => void;
|
|
6
|
+
onPasswordChange: (password: string) => void;
|
|
7
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
8
|
+
isLoading?: boolean;
|
|
9
|
+
buttonText?: string;
|
|
10
|
+
showForgotPassword?: boolean;
|
|
11
|
+
onForgotPassword?: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function TraditionalAuthSection({ email, password, onEmailChange, onPasswordChange, onSubmit, isLoading, buttonText, showForgotPassword, onForgotPassword, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TraditionalAuthSection = TraditionalAuthSection;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
function TraditionalAuthSection({ email, password, onEmailChange, onPasswordChange, onSubmit, isLoading, buttonText = 'Sign In', showForgotPassword = true, onForgotPassword, }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsxs)("form", { onSubmit: onSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "block text-sm font-medium mb-2", style: { color: 'var(--text-primary)' }, children: "Email Address" }), (0, jsx_runtime_1.jsx)("input", { type: "email", value: email, onChange: (e) => onEmailChange(e.target.value), placeholder: "you@example.com", disabled: isLoading, required: true, className: "w-full px-4 py-3 rounded-lg border transition-colors focus:outline-none focus:ring-2 disabled:opacity-50", style: {
|
|
8
|
+
border: '1px solid var(--border-default)',
|
|
9
|
+
color: 'var(--text-primary)',
|
|
10
|
+
background: 'var(--bg-default)',
|
|
11
|
+
} })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)("label", { className: "block text-sm font-medium", style: { color: 'var(--text-primary)' }, children: "Password" }), showForgotPassword && onForgotPassword && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onForgotPassword, className: "text-xs hover:underline", style: { color: 'var(--text-primary)' }, children: "Forgot?" }))] }), (0, jsx_runtime_1.jsx)("input", { type: "password", value: password, onChange: (e) => onPasswordChange(e.target.value), placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", disabled: isLoading, required: true, className: "w-full px-4 py-3 rounded-lg border transition-colors focus:outline-none focus:ring-2 disabled:opacity-50", style: {
|
|
12
|
+
border: '1px solid var(--border-default)',
|
|
13
|
+
color: 'var(--text-primary)',
|
|
14
|
+
background: 'var(--bg-default)',
|
|
15
|
+
} })] }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: isLoading, className: "w-full py-3 px-4 rounded-lg font-semibold focus:outline-none focus:ring-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors mt-6", style: {
|
|
16
|
+
border: '1px solid var(--border-default)',
|
|
17
|
+
color: 'white',
|
|
18
|
+
background: 'var(--color-primary, #10b981)',
|
|
19
|
+
}, children: isLoading ? 'Signing in...' : buttonText })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CompleteStep = CompleteStep;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
function CompleteStep({ onGoToLogin }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-white border border-gray-300 rounded p-8 text-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "bg-green-50 border border-green-200 rounded-full w-16 h-16 flex items-center justify-center mx-auto mb-4", children: (0, jsx_runtime_1.jsx)("svg", { className: "w-8 h-8 text-green-700", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }), (0, jsx_runtime_1.jsx)("h2", { className: "text-2xl font-semibold text-gray-900 mb-2", children: "Password Reset Complete" }), (0, jsx_runtime_1.jsx)("p", { className: "text-gray-600 mb-2", children: "Your password has been successfully reset and your account lockout has been cleared." }), (0, jsx_runtime_1.jsx)("p", { className: "text-gray-600 mb-6", children: "You can now log in with your new password." }), (0, jsx_runtime_1.jsx)("button", { onClick: onGoToLogin, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900", children: "Go to Login" })] }));
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
email: string;
|
|
3
|
+
setEmail: (email: string) => void;
|
|
4
|
+
onSubmit: () => void;
|
|
5
|
+
loading: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function InitiateRecoveryStep({ email, setEmail, onSubmit, loading }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.InitiateRecoveryStep = InitiateRecoveryStep;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
function InitiateRecoveryStep({ email, setEmail, onSubmit, loading }) {
|
|
7
|
+
const handleSubmit = (e) => {
|
|
8
|
+
e.preventDefault();
|
|
9
|
+
onSubmit();
|
|
10
|
+
};
|
|
11
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "rounded-2xl p-8", style: { background: 'var(--bg-card)', border: '1px solid var(--border-default)' }, children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold mb-2", style: { color: 'var(--text-primary)' }, children: "Account Recovery" }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm mb-6", style: { color: 'var(--text-secondary)' }, children: "Enter your email address to begin the account recovery process." }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "email", className: "block text-sm font-medium mb-1", style: { color: 'var(--text-primary)' }, children: "Email Address" }), (0, jsx_runtime_1.jsx)("input", { type: "email", id: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: loading, placeholder: "Enter your email address", className: "w-full px-3 py-2 rounded focus:ring-2 focus:outline-none disabled:opacity-50", style: {
|
|
12
|
+
border: '1px solid var(--border-default)',
|
|
13
|
+
color: 'var(--text-primary)',
|
|
14
|
+
background: 'var(--bg-default)'
|
|
15
|
+
} })] }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: loading || !email, className: "w-full py-2 px-4 rounded font-medium focus:outline-none focus:ring-2 disabled:opacity-50 disabled:cursor-not-allowed", style: {
|
|
16
|
+
border: '1px solid var(--border-default)',
|
|
17
|
+
color: 'var(--text-primary)',
|
|
18
|
+
background: 'var(--bg-default)'
|
|
19
|
+
}, children: loading ? 'Processing...' : 'Continue' }), (0, jsx_runtime_1.jsx)("div", { className: "text-center", children: (0, jsx_runtime_1.jsx)("a", { href: "/account-auth/login", className: "text-sm hover:underline font-medium", style: { color: 'var(--text-primary)' }, children: "Back to Login" }) })] })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RecoverySession } from '../../types/recovery';
|
|
2
|
+
interface Props {
|
|
3
|
+
session: RecoverySession;
|
|
4
|
+
onSelectMethod: (method: 'email' | 'sms' | 'authenticator') => void;
|
|
5
|
+
loading: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function SelectMethodStep({ session, onSelectMethod, loading }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.SelectMethodStep = SelectMethodStep;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
function SelectMethodStep({ session, onSelectMethod, loading }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-white border border-gray-300 rounded p-8", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Select Verification Method" }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-600 mb-6", children: "Choose how you would like to receive your verification code." }), (0, jsx_runtime_1.jsxs)("div", { className: "bg-gray-50 border border-gray-200 rounded p-3 mb-6 text-sm", children: [session.maskedEmail && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-gray-600", children: "Email: " }), (0, jsx_runtime_1.jsx)("span", { className: "text-gray-900 font-medium", children: session.maskedEmail })] })), session.maskedPhone && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-gray-600", children: "Phone: " }), (0, jsx_runtime_1.jsx)("span", { className: "text-gray-900 font-medium", children: session.maskedPhone })] })), session.hasAuthenticator && ((0, jsx_runtime_1.jsx)("div", { className: "text-gray-600", children: "* This account has 2FA enabled" }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-2", children: [session.availableMethods.includes('email') && ((0, jsx_runtime_1.jsx)("button", { onClick: () => onSelectMethod('email'), disabled: loading, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900 disabled:opacity-50 disabled:cursor-not-allowed", children: "Send Code via Email" })), session.availableMethods.includes('sms') && session.maskedPhone && ((0, jsx_runtime_1.jsx)("button", { onClick: () => onSelectMethod('sms'), disabled: loading, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900 disabled:opacity-50 disabled:cursor-not-allowed", children: "Send Code via SMS" })), session.availableMethods.includes('authenticator') && session.hasAuthenticator && ((0, jsx_runtime_1.jsx)("button", { onClick: () => onSelectMethod('authenticator'), disabled: loading, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900 disabled:opacity-50 disabled:cursor-not-allowed", children: "Use Authenticator App" }))] })] }));
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.SetPasswordStep = SetPasswordStep;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
function SetPasswordStep({ onSubmit, loading }) {
|
|
8
|
+
const [password, setPassword] = (0, react_1.useState)('');
|
|
9
|
+
const [confirmPassword, setConfirmPassword] = (0, react_1.useState)('');
|
|
10
|
+
const [showPassword, setShowPassword] = (0, react_1.useState)(false);
|
|
11
|
+
const [showConfirmPassword, setShowConfirmPassword] = (0, react_1.useState)(false);
|
|
12
|
+
const passwordsMatch = password === confirmPassword && password !== '';
|
|
13
|
+
const handleSubmit = (e) => {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
if (passwordsMatch) {
|
|
16
|
+
onSubmit(password, confirmPassword);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-white border border-gray-300 rounded p-8", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Set New Password" }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-600 mb-6", children: "Choose a strong password for your account." }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "password", className: "block text-sm font-medium text-gray-900 mb-1", children: "New Password" }), (0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsx)("input", { type: showPassword ? 'text' : 'password', id: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, disabled: loading, className: "w-full px-3 py-2 border border-gray-300 rounded focus:ring-2 focus:ring-gray-900 focus:outline-none disabled:opacity-50 disabled:bg-gray-50 pr-10" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-600 hover:text-gray-900", children: showPassword ? '👁️' : '👁️🗨️' })] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "confirmPassword", className: "block text-sm font-medium text-gray-900 mb-1", children: "Confirm New Password" }), (0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsx)("input", { type: showConfirmPassword ? 'text' : 'password', id: "confirmPassword", value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, disabled: loading, className: "w-full px-3 py-2 border border-gray-300 rounded focus:ring-2 focus:ring-gray-900 focus:outline-none disabled:opacity-50 disabled:bg-gray-50 pr-10" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setShowConfirmPassword(!showConfirmPassword), className: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-600 hover:text-gray-900", children: showConfirmPassword ? '👁️' : '👁️🗨️' })] })] }), !passwordsMatch && confirmPassword && ((0, jsx_runtime_1.jsx)("div", { className: "bg-red-50 border border-red-200 rounded p-3", children: (0, jsx_runtime_1.jsx)("p", { className: "text-red-700 text-sm", children: "Passwords do not match" }) })), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: !passwordsMatch || loading, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900 disabled:opacity-50 disabled:cursor-not-allowed", children: loading ? 'Resetting Password...' : 'Reset Password' })] })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
code: string;
|
|
3
|
+
setCode: (code: string) => void;
|
|
4
|
+
onSubmit: () => void;
|
|
5
|
+
onResend: () => void;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
maskedDestination?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function VerifyCodeStep({ code, setCode, onSubmit, onResend, loading, maskedDestination }: Props): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VerifyCodeStep = VerifyCodeStep;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
function VerifyCodeStep({ code, setCode, onSubmit, onResend, loading, maskedDestination }) {
|
|
8
|
+
const [resendCooldown, setResendCooldown] = (0, react_1.useState)(0);
|
|
9
|
+
(0, react_1.useEffect)(() => {
|
|
10
|
+
if (resendCooldown > 0) {
|
|
11
|
+
const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);
|
|
12
|
+
return () => clearTimeout(timer);
|
|
13
|
+
}
|
|
14
|
+
}, [resendCooldown]);
|
|
15
|
+
const handleSubmit = (e) => {
|
|
16
|
+
e.preventDefault();
|
|
17
|
+
onSubmit();
|
|
18
|
+
};
|
|
19
|
+
const handleResend = () => {
|
|
20
|
+
onResend();
|
|
21
|
+
setResendCooldown(30);
|
|
22
|
+
};
|
|
23
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-white border border-gray-300 rounded p-8", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Enter Verification Code" }), maskedDestination && ((0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-gray-600 mb-6", children: ["Enter the 6-digit code sent to ", (0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: maskedDestination })] })), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "code", className: "block text-sm font-medium text-gray-900 mb-1", children: "Verification Code" }), (0, jsx_runtime_1.jsx)("input", { type: "text", id: "code", value: code, onChange: (e) => setCode(e.target.value.replace(/\D/g, '').slice(0, 6)), required: true, disabled: loading, placeholder: "000000", maxLength: 6, className: "w-full px-3 py-2 border border-gray-300 rounded focus:ring-2 focus:ring-gray-900 focus:outline-none disabled:opacity-50 disabled:bg-gray-50 text-center text-2xl tracking-widest font-mono" }), (0, jsx_runtime_1.jsx)("p", { className: "text-xs text-gray-600 mt-1", children: "Code expires in 5 minutes" })] }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: loading || code.length !== 6, className: "w-full py-2 px-4 border border-gray-300 rounded text-gray-900 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900 disabled:opacity-50 disabled:cursor-not-allowed", children: loading ? 'Verifying...' : 'Verify Code' }), (0, jsx_runtime_1.jsx)("div", { className: "text-center", children: (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleResend, disabled: loading || resendCooldown > 0, className: "text-sm text-gray-900 hover:underline font-medium disabled:opacity-50 disabled:cursor-not-allowed disabled:no-underline", children: resendCooldown > 0 ? `Resend Code (${resendCooldown}s)` : 'Resend Code' }) })] })] }));
|
|
24
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReservedRecoveryWarning - Deterministic Reserved Space for Account Lockout Warning
|
|
3
|
+
*
|
|
4
|
+
* PURPOSE: Eliminate layout shift when the lockout warning appears/disappears
|
|
5
|
+
* by reserving exact height mathematically.
|
|
6
|
+
*
|
|
7
|
+
* MATHEMATICAL APPROACH:
|
|
8
|
+
* - Mirrors the complete DOM structure (icon+title row, body paragraph, CTA button)
|
|
9
|
+
* - Height = Σ(child block heights) + (vertical gaps from space-y-3) + (padding top/bottom from p-4) + (borders)
|
|
10
|
+
* - Text block heights from exact font-size × line-height and wrapping at actual width
|
|
11
|
+
* - space-y-3: 0.75rem = 12px gap between children
|
|
12
|
+
* - p-4: 1rem = 16px padding (top + bottom = 32px)
|
|
13
|
+
* - border: 1px (top + bottom = 2px)
|
|
14
|
+
* - Evaluated via offscreen DOM for precision across zoom/browsers
|
|
15
|
+
*
|
|
16
|
+
* CRITICAL: No transitions on height; reserves space even when hidden
|
|
17
|
+
*/
|
|
18
|
+
import React from "react";
|
|
19
|
+
type Props = {
|
|
20
|
+
className?: string;
|
|
21
|
+
/** Whether the warning is actually visible */
|
|
22
|
+
show?: boolean;
|
|
23
|
+
/** Provide the actual copy used so we can measure precise wrapping (localizable) */
|
|
24
|
+
titleText: string;
|
|
25
|
+
bodyText: string;
|
|
26
|
+
actionLabel: string;
|
|
27
|
+
/** Class recipes that match the live styles */
|
|
28
|
+
containerClass?: string;
|
|
29
|
+
titleClass?: string;
|
|
30
|
+
bodyClass?: string;
|
|
31
|
+
buttonClass?: string;
|
|
32
|
+
/** Icon size in px (default 20 for w-5 h-5) */
|
|
33
|
+
iconSizePx?: number;
|
|
34
|
+
/** The dynamic warning content */
|
|
35
|
+
children?: React.ReactNode;
|
|
36
|
+
};
|
|
37
|
+
export declare function ReservedRecoveryWarning({ className, show, titleText, bodyText, actionLabel, containerClass, titleClass, bodyClass, buttonClass, iconSizePx, children, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export default ReservedRecoveryWarning;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReservedRecoveryWarning = ReservedRecoveryWarning;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
/**
|
|
9
|
+
* ReservedRecoveryWarning - Deterministic Reserved Space for Account Lockout Warning
|
|
10
|
+
*
|
|
11
|
+
* PURPOSE: Eliminate layout shift when the lockout warning appears/disappears
|
|
12
|
+
* by reserving exact height mathematically.
|
|
13
|
+
*
|
|
14
|
+
* MATHEMATICAL APPROACH:
|
|
15
|
+
* - Mirrors the complete DOM structure (icon+title row, body paragraph, CTA button)
|
|
16
|
+
* - Height = Σ(child block heights) + (vertical gaps from space-y-3) + (padding top/bottom from p-4) + (borders)
|
|
17
|
+
* - Text block heights from exact font-size × line-height and wrapping at actual width
|
|
18
|
+
* - space-y-3: 0.75rem = 12px gap between children
|
|
19
|
+
* - p-4: 1rem = 16px padding (top + bottom = 32px)
|
|
20
|
+
* - border: 1px (top + bottom = 2px)
|
|
21
|
+
* - Evaluated via offscreen DOM for precision across zoom/browsers
|
|
22
|
+
*
|
|
23
|
+
* CRITICAL: No transitions on height; reserves space even when hidden
|
|
24
|
+
*/
|
|
25
|
+
const react_1 = __importDefault(require("react"));
|
|
26
|
+
const reservedSpace_1 = require("../../utils/layout/reservedSpace");
|
|
27
|
+
function ReservedRecoveryWarning({ className, show = false, titleText, bodyText, actionLabel, containerClass = "p-4 rounded-lg border", titleClass = "font-medium", bodyClass = "text-sm", buttonClass = "w-full py-2 px-4 text-sm font-medium rounded-md", iconSizePx = 20, children, }) {
|
|
28
|
+
const hostRef = react_1.default.useRef(null);
|
|
29
|
+
// Estimate initial height to prevent collapse during SSR/hydration
|
|
30
|
+
// Formula: icon (20px) + padding (p-4 = 32px) + border (2px) + title + body + button
|
|
31
|
+
// Conservative estimate: ~140px for typical warning with button
|
|
32
|
+
const estimatedMinHeight = 140;
|
|
33
|
+
const [minH, setMinH] = react_1.default.useState(estimatedMinHeight);
|
|
34
|
+
const recompute = react_1.default.useCallback(() => {
|
|
35
|
+
const el = hostRef.current;
|
|
36
|
+
if (!el)
|
|
37
|
+
return;
|
|
38
|
+
const width = el.clientWidth;
|
|
39
|
+
// Wait for layout - clientWidth === 0 means container not laid out yet
|
|
40
|
+
if (width === 0) {
|
|
41
|
+
// Retry after next frame when layout is ready
|
|
42
|
+
requestAnimationFrame(recompute);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const h = (0, reservedSpace_1.measureNodeHeightAtWidth)(() => {
|
|
46
|
+
// Mirror the real DOM of the warning
|
|
47
|
+
const outer = document.createElement("div");
|
|
48
|
+
outer.className = containerClass;
|
|
49
|
+
// Row: icon + title (flex items-start space-x-3)
|
|
50
|
+
const headerRow = document.createElement("div");
|
|
51
|
+
headerRow.className = "flex items-start space-x-3";
|
|
52
|
+
const icon = document.createElement("div");
|
|
53
|
+
icon.style.width = iconSizePx + "px";
|
|
54
|
+
icon.style.height = iconSizePx + "px";
|
|
55
|
+
icon.style.flexShrink = "0";
|
|
56
|
+
icon.style.marginTop = "2px"; // mt-0.5 to align with text
|
|
57
|
+
const titleContainer = document.createElement("div");
|
|
58
|
+
titleContainer.className = "flex-1";
|
|
59
|
+
const h3 = document.createElement("h3");
|
|
60
|
+
h3.className = titleClass;
|
|
61
|
+
h3.style.margin = "0";
|
|
62
|
+
h3.style.marginBottom = "8px"; // mb-2
|
|
63
|
+
h3.textContent = titleText;
|
|
64
|
+
// Body paragraph
|
|
65
|
+
const p = document.createElement("p");
|
|
66
|
+
p.className = bodyClass;
|
|
67
|
+
p.style.margin = "0";
|
|
68
|
+
p.style.marginBottom = "12px"; // mb-3
|
|
69
|
+
p.textContent = bodyText;
|
|
70
|
+
// Action button
|
|
71
|
+
const btn = document.createElement("button");
|
|
72
|
+
btn.className = buttonClass;
|
|
73
|
+
btn.textContent = actionLabel;
|
|
74
|
+
titleContainer.appendChild(h3);
|
|
75
|
+
titleContainer.appendChild(p);
|
|
76
|
+
titleContainer.appendChild(btn);
|
|
77
|
+
headerRow.appendChild(icon);
|
|
78
|
+
headerRow.appendChild(titleContainer);
|
|
79
|
+
outer.appendChild(headerRow);
|
|
80
|
+
return outer;
|
|
81
|
+
}, width);
|
|
82
|
+
setMinH(h);
|
|
83
|
+
}, [titleText, bodyText, actionLabel, containerClass, titleClass, bodyClass, buttonClass, iconSizePx]);
|
|
84
|
+
react_1.default.useLayoutEffect(() => {
|
|
85
|
+
recompute();
|
|
86
|
+
if (hostRef.current) {
|
|
87
|
+
return (0, reservedSpace_1.observeForRecalc)(hostRef.current, recompute);
|
|
88
|
+
}
|
|
89
|
+
}, [recompute]);
|
|
90
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: hostRef, className: className, style: { minHeight: minH ? `${minH}px` : undefined, transition: "none" }, "data-testid": "recovery-warning-wrap", children: show ? children : null }));
|
|
91
|
+
}
|
|
92
|
+
exports.default = ReservedRecoveryWarning;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReservedStatusBox - Deterministic Reserved Space for Status Messages
|
|
3
|
+
*
|
|
4
|
+
* PURPOSE: Eliminate layout shift when status messages (ready/submitting/error/success)
|
|
5
|
+
* appear/disappear by reserving exact height mathematically.
|
|
6
|
+
*
|
|
7
|
+
* MATHEMATICAL APPROACH:
|
|
8
|
+
* - Measures all candidate messages at current container width
|
|
9
|
+
* - Computes height = max(iconSizePx, text block height) + paddings + borders
|
|
10
|
+
* - Font metrics from Tailwind: text-sm (0.875rem = 14px), leading-relaxed (1.625)
|
|
11
|
+
* - Padding from p-3: 0.75rem = 12px (top + bottom = 24px)
|
|
12
|
+
* - Border from border class: 1px (top + bottom = 2px)
|
|
13
|
+
* - Sets minHeight to the maximum of all candidates
|
|
14
|
+
*
|
|
15
|
+
* CRITICAL: No transitions on height; exact px value at any zoom level
|
|
16
|
+
*/
|
|
17
|
+
import React from "react";
|
|
18
|
+
type Props = {
|
|
19
|
+
className?: string;
|
|
20
|
+
/** List of candidate messages representing the longest possible strings for each state */
|
|
21
|
+
candidates: string[];
|
|
22
|
+
/** Tailwind classes applied to the live status container (must match for accurate measurement) */
|
|
23
|
+
containerClass?: string;
|
|
24
|
+
/** Icon size in px (default 16 for w-4 h-4) */
|
|
25
|
+
iconSizePx?: number;
|
|
26
|
+
/** The dynamic status content */
|
|
27
|
+
children?: React.ReactNode;
|
|
28
|
+
};
|
|
29
|
+
export declare function ReservedStatusBox({ className, candidates, containerClass, iconSizePx, children, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export default ReservedStatusBox;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReservedStatusBox = ReservedStatusBox;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
/**
|
|
9
|
+
* ReservedStatusBox - Deterministic Reserved Space for Status Messages
|
|
10
|
+
*
|
|
11
|
+
* PURPOSE: Eliminate layout shift when status messages (ready/submitting/error/success)
|
|
12
|
+
* appear/disappear by reserving exact height mathematically.
|
|
13
|
+
*
|
|
14
|
+
* MATHEMATICAL APPROACH:
|
|
15
|
+
* - Measures all candidate messages at current container width
|
|
16
|
+
* - Computes height = max(iconSizePx, text block height) + paddings + borders
|
|
17
|
+
* - Font metrics from Tailwind: text-sm (0.875rem = 14px), leading-relaxed (1.625)
|
|
18
|
+
* - Padding from p-3: 0.75rem = 12px (top + bottom = 24px)
|
|
19
|
+
* - Border from border class: 1px (top + bottom = 2px)
|
|
20
|
+
* - Sets minHeight to the maximum of all candidates
|
|
21
|
+
*
|
|
22
|
+
* CRITICAL: No transitions on height; exact px value at any zoom level
|
|
23
|
+
*/
|
|
24
|
+
const react_1 = __importDefault(require("react"));
|
|
25
|
+
const reservedSpace_1 = require("../../utils/layout/reservedSpace");
|
|
26
|
+
function ReservedStatusBox({ className, candidates, containerClass = "p-3 text-sm leading-relaxed rounded-md border", iconSizePx = 16, children, }) {
|
|
27
|
+
const hostRef = react_1.default.useRef(null);
|
|
28
|
+
// Estimate initial height to prevent collapse during SSR/hydration
|
|
29
|
+
// Formula: iconSize + padding (p-3 = 24px) + border (2px) = conservative minimum
|
|
30
|
+
const estimatedMinHeight = iconSizePx + 24 + 2; // ~42px for 16px icon
|
|
31
|
+
const [minH, setMinH] = react_1.default.useState(estimatedMinHeight);
|
|
32
|
+
const recompute = react_1.default.useCallback(() => {
|
|
33
|
+
const el = hostRef.current;
|
|
34
|
+
if (!el)
|
|
35
|
+
return;
|
|
36
|
+
const width = el.clientWidth; // width the status box will render at
|
|
37
|
+
// Wait for layout - clientWidth === 0 means container not laid out yet
|
|
38
|
+
if (width === 0) {
|
|
39
|
+
// Retry after next frame when layout is ready
|
|
40
|
+
requestAnimationFrame(recompute);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// For each candidate, build a DOM subtree matching the live structure and measure its height
|
|
44
|
+
const heights = candidates.map((msg) => (0, reservedSpace_1.measureNodeHeightAtWidth)(() => {
|
|
45
|
+
const outer = document.createElement("div");
|
|
46
|
+
outer.className = containerClass + " flex items-center space-x-2"; // must match live
|
|
47
|
+
// icon placeholder
|
|
48
|
+
const icon = document.createElement("div");
|
|
49
|
+
icon.style.width = iconSizePx + "px";
|
|
50
|
+
icon.style.height = iconSizePx + "px";
|
|
51
|
+
icon.style.flexShrink = "0";
|
|
52
|
+
// message text
|
|
53
|
+
const span = document.createElement("span");
|
|
54
|
+
span.className = "flex-1"; // let text wrap if needed
|
|
55
|
+
span.textContent = msg;
|
|
56
|
+
outer.appendChild(icon);
|
|
57
|
+
outer.appendChild(span);
|
|
58
|
+
return outer;
|
|
59
|
+
}, width));
|
|
60
|
+
const max = Math.max(0, ...heights);
|
|
61
|
+
setMinH(max);
|
|
62
|
+
}, [candidates, containerClass, iconSizePx]);
|
|
63
|
+
react_1.default.useLayoutEffect(() => {
|
|
64
|
+
recompute();
|
|
65
|
+
if (hostRef.current) {
|
|
66
|
+
return (0, reservedSpace_1.observeForRecalc)(hostRef.current, recompute);
|
|
67
|
+
}
|
|
68
|
+
}, [recompute]);
|
|
69
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: hostRef, className: className, style: { minHeight: minH ? `${minH}px` : undefined, transition: "none" }, "data-testid": "status-wrap", children: children }));
|
|
70
|
+
}
|
|
71
|
+
exports.default = ReservedStatusBox;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface BetaBadgeProps {
|
|
2
|
+
/** Text to display (default: 'beta') */
|
|
3
|
+
text?: string;
|
|
4
|
+
/** Additional CSS classes */
|
|
5
|
+
className?: string;
|
|
6
|
+
/** Badge variant */
|
|
7
|
+
variant?: 'subtle' | 'outlined' | 'solid';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A subtle badge component for indicating pre-release status.
|
|
11
|
+
*
|
|
12
|
+
* Controlled by NEXT_PUBLIC_SHOW_BETA_BADGE env var.
|
|
13
|
+
* When env var is not 'true', renders nothing.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* // In your header, next to logo
|
|
18
|
+
* <Logo />
|
|
19
|
+
* <BetaBadge />
|
|
20
|
+
*
|
|
21
|
+
* // Custom text
|
|
22
|
+
* <BetaBadge text="preview" />
|
|
23
|
+
*
|
|
24
|
+
* // Different variant
|
|
25
|
+
* <BetaBadge variant="outlined" text="coming soon" />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function BetaBadge({ text, className, variant }: BetaBadgeProps): import("react/jsx-runtime").JSX.Element | null;
|
|
29
|
+
export default BetaBadge;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.BetaBadge = BetaBadge;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* A subtle badge component for indicating pre-release status.
|
|
8
|
+
*
|
|
9
|
+
* Controlled by NEXT_PUBLIC_SHOW_BETA_BADGE env var.
|
|
10
|
+
* When env var is not 'true', renders nothing.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* // In your header, next to logo
|
|
15
|
+
* <Logo />
|
|
16
|
+
* <BetaBadge />
|
|
17
|
+
*
|
|
18
|
+
* // Custom text
|
|
19
|
+
* <BetaBadge text="preview" />
|
|
20
|
+
*
|
|
21
|
+
* // Different variant
|
|
22
|
+
* <BetaBadge variant="outlined" text="coming soon" />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function BetaBadge({ text = 'beta', className = '', variant = 'subtle' }) {
|
|
26
|
+
// Check env var - only render if explicitly enabled
|
|
27
|
+
if (process.env.NEXT_PUBLIC_SHOW_BETA_BADGE !== 'true') {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const baseStyles = 'inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-full lowercase tracking-wide';
|
|
31
|
+
const variantStyles = {
|
|
32
|
+
subtle: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',
|
|
33
|
+
outlined: 'border border-gray-300 text-gray-500 dark:border-gray-600 dark:text-gray-400',
|
|
34
|
+
solid: 'bg-gray-500 text-white dark:bg-gray-600',
|
|
35
|
+
};
|
|
36
|
+
return ((0, jsx_runtime_1.jsx)("span", { className: `${baseStyles} ${variantStyles[variant]} ${className}`, children: text }));
|
|
37
|
+
}
|
|
38
|
+
exports.default = BetaBadge;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface FooterProps {
|
|
2
|
+
/** Company or product name (default: 'PayEz') */
|
|
3
|
+
companyName?: string;
|
|
4
|
+
/** Start year for copyright range (shows "2024-2025" format if provided) */
|
|
5
|
+
startYear?: number;
|
|
6
|
+
/** Additional links to display */
|
|
7
|
+
links?: Array<{
|
|
8
|
+
label: string;
|
|
9
|
+
href: string;
|
|
10
|
+
}>;
|
|
11
|
+
/** Additional CSS classes */
|
|
12
|
+
className?: string;
|
|
13
|
+
/** Variant style */
|
|
14
|
+
variant?: 'minimal' | 'standard';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A themeable footer component with dynamic copyright year.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* // Minimal footer
|
|
22
|
+
* <Footer />
|
|
23
|
+
*
|
|
24
|
+
* // With company name and start year
|
|
25
|
+
* <Footer companyName="Acme Inc" startYear={2020} />
|
|
26
|
+
*
|
|
27
|
+
* // With links
|
|
28
|
+
* <Footer
|
|
29
|
+
* links={[
|
|
30
|
+
* { label: 'Privacy', href: '/privacy' },
|
|
31
|
+
* { label: 'Terms', href: '/terms' }
|
|
32
|
+
* ]}
|
|
33
|
+
* />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function Footer({ companyName, startYear, links, className, variant }: FooterProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export default Footer;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Footer = Footer;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* A themeable footer component with dynamic copyright year.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* // Minimal footer
|
|
12
|
+
* <Footer />
|
|
13
|
+
*
|
|
14
|
+
* // With company name and start year
|
|
15
|
+
* <Footer companyName="Acme Inc" startYear={2020} />
|
|
16
|
+
*
|
|
17
|
+
* // With links
|
|
18
|
+
* <Footer
|
|
19
|
+
* links={[
|
|
20
|
+
* { label: 'Privacy', href: '/privacy' },
|
|
21
|
+
* { label: 'Terms', href: '/terms' }
|
|
22
|
+
* ]}
|
|
23
|
+
* />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function Footer({ companyName = 'PayEz', startYear, links = [], className = '', variant = 'minimal' }) {
|
|
27
|
+
const currentYear = new Date().getFullYear();
|
|
28
|
+
const yearDisplay = startYear && startYear < currentYear
|
|
29
|
+
? `${startYear}-${currentYear}`
|
|
30
|
+
: `${currentYear}`;
|
|
31
|
+
const baseStyles = 'w-full py-4 text-sm';
|
|
32
|
+
const variantStyles = {
|
|
33
|
+
minimal: 'text-center text-gray-500 dark:text-gray-400',
|
|
34
|
+
standard: 'border-t border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-400'
|
|
35
|
+
};
|
|
36
|
+
if (variant === 'minimal') {
|
|
37
|
+
return ((0, jsx_runtime_1.jsx)("footer", { className: `${baseStyles} ${variantStyles[variant]} ${className}`, children: (0, jsx_runtime_1.jsxs)("p", { children: ["\u00A9 ", yearDisplay, " ", companyName, ". All rights reserved."] }) }));
|
|
38
|
+
}
|
|
39
|
+
return ((0, jsx_runtime_1.jsx)("footer", { className: `${baseStyles} ${variantStyles[variant]} ${className}`, children: (0, jsx_runtime_1.jsx)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col sm:flex-row justify-between items-center gap-4", children: [(0, jsx_runtime_1.jsxs)("p", { children: ["\u00A9 ", yearDisplay, " ", companyName, ". All rights reserved."] }), links.length > 0 && ((0, jsx_runtime_1.jsx)("nav", { className: "flex gap-4", "aria-label": "Footer links", children: links.map((link, index) => ((0, jsx_runtime_1.jsx)("a", { href: link.href, className: "hover:text-gray-700 dark:hover:text-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900 rounded transition-colors", children: link.label }, `${index}-${link.label}`))) }))] }) }) }));
|
|
40
|
+
}
|
|
41
|
+
exports.default = Footer;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export declare const ENV_CONFIG: {
|
|
2
|
+
readonly CLIENT_ID: string | undefined;
|
|
3
|
+
readonly INTERNAL_URL: string | undefined;
|
|
4
|
+
readonly IDP_CLIENT_ID: number | undefined;
|
|
5
|
+
readonly IDP_URL: string | undefined;
|
|
6
|
+
readonly API_URL: string | undefined;
|
|
7
|
+
readonly PAYEZ_CORE_BASE_URL: string | undefined;
|
|
8
|
+
readonly SUPPORT_EMAIL: "support@PayEz.net";
|
|
9
|
+
readonly LOG_LEVEL: string;
|
|
10
|
+
readonly LOG_CONSOLE: boolean;
|
|
11
|
+
readonly GRAYLOG_HOST: string;
|
|
12
|
+
readonly GRAYLOG_PORT: number;
|
|
13
|
+
readonly REDIS_KEY_PREFIX: string;
|
|
14
|
+
readonly LOGOUT_REDIRECT_URL: string;
|
|
15
|
+
readonly UNAUTHENTICATED_REDIRECT_URL: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const API_ENDPOINTS: {
|
|
18
|
+
readonly account: {
|
|
19
|
+
readonly profile: "/api/account/profile";
|
|
20
|
+
readonly updateProfile: "/api/account/profile";
|
|
21
|
+
readonly maskedInfo: "/api/account/masked-info";
|
|
22
|
+
readonly sendResetCode: "/api/account/send-reset-code";
|
|
23
|
+
readonly verifyResetCode: "/api/account/verify-reset-code";
|
|
24
|
+
readonly resetPassword: "/api/account/reset-password";
|
|
25
|
+
readonly changePassword: "/api/account/change-password";
|
|
26
|
+
readonly validatePassword: "/api/account/validate-password";
|
|
27
|
+
};
|
|
28
|
+
readonly externalAuth: {
|
|
29
|
+
readonly login: "/api/ExternalAuth/login";
|
|
30
|
+
readonly refresh: "/api/ExternalAuth/refresh";
|
|
31
|
+
readonly validate: "/api/ExternalAuth/validate";
|
|
32
|
+
readonly verifyCode: "/api/ExternalAuth/verify-code";
|
|
33
|
+
readonly revoke: "/api/ExternalAuth/revoke";
|
|
34
|
+
readonly roles: (username: string) => string;
|
|
35
|
+
readonly jwks: "/api/ExternalAuth/.well-known/jwks.json";
|
|
36
|
+
readonly openidConfig: "/api/ExternalAuth/.well-known/openid-configuration";
|
|
37
|
+
readonly passwordless: {
|
|
38
|
+
readonly sms: {
|
|
39
|
+
readonly start: "/api/ExternalAuth/passwordless/sms/start";
|
|
40
|
+
readonly login: "/api/ExternalAuth/passwordless/sms/login";
|
|
41
|
+
readonly resend: "/api/ExternalAuth/passwordless/sms/resend";
|
|
42
|
+
};
|
|
43
|
+
readonly email: {
|
|
44
|
+
readonly start: "/api/ExternalAuth/passwordless/email/start";
|
|
45
|
+
readonly login: "/api/ExternalAuth/passwordless/email/login";
|
|
46
|
+
readonly resend: "/api/ExternalAuth/passwordless/email/resend";
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
readonly lead: {
|
|
50
|
+
readonly registration: "/api/ExternalAuth/lead/registration";
|
|
51
|
+
readonly verify: "/api/ExternalAuth/lead/verify";
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
readonly progressiveAuth: {
|
|
55
|
+
readonly step1: "/api/ProgressiveAuth/step1";
|
|
56
|
+
readonly step2: "/api/ProgressiveAuth/step2";
|
|
57
|
+
readonly step3: "/api/ProgressiveAuth/step3";
|
|
58
|
+
readonly step4: "/api/ProgressiveAuth/step4";
|
|
59
|
+
readonly step5: "/api/ProgressiveAuth/step5";
|
|
60
|
+
readonly verifyEmail: "/api/ProgressiveAuth/verify-email";
|
|
61
|
+
};
|
|
62
|
+
readonly azureAuth: {
|
|
63
|
+
readonly login: "/auth/azure/login";
|
|
64
|
+
readonly logout: "/auth/azure/logout";
|
|
65
|
+
};
|
|
66
|
+
};
|