@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.
Files changed (654) hide show
  1. package/README.md +782 -0
  2. package/dist/api/auth-handler.d.ts +67 -0
  3. package/dist/api/auth-handler.js +397 -0
  4. package/dist/api/index.d.ts +10 -0
  5. package/dist/api/index.js +19 -0
  6. package/dist/api-handlers/account/change-password.d.ts +9 -0
  7. package/dist/api-handlers/account/change-password.js +112 -0
  8. package/dist/api-handlers/account/masked-info.d.ts +2 -0
  9. package/dist/api-handlers/account/masked-info.js +41 -0
  10. package/dist/api-handlers/account/profile.d.ts +3 -0
  11. package/dist/api-handlers/account/profile.js +63 -0
  12. package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
  13. package/dist/api-handlers/account/recovery/initiate.js +26 -0
  14. package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
  15. package/dist/api-handlers/account/recovery/send-code.js +28 -0
  16. package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
  17. package/dist/api-handlers/account/recovery/verify-code.js +28 -0
  18. package/dist/api-handlers/account/reset-password.d.ts +2 -0
  19. package/dist/api-handlers/account/reset-password.js +26 -0
  20. package/dist/api-handlers/account/send-code.d.ts +24 -0
  21. package/dist/api-handlers/account/send-code.js +60 -0
  22. package/dist/api-handlers/account/update-phone.d.ts +27 -0
  23. package/dist/api-handlers/account/update-phone.js +64 -0
  24. package/dist/api-handlers/account/validate-password.d.ts +17 -0
  25. package/dist/api-handlers/account/validate-password.js +81 -0
  26. package/dist/api-handlers/account/verify-email.d.ts +26 -0
  27. package/dist/api-handlers/account/verify-email.js +106 -0
  28. package/dist/api-handlers/account/verify-sms.d.ts +26 -0
  29. package/dist/api-handlers/account/verify-sms.js +106 -0
  30. package/dist/api-handlers/admin/analytics.d.ts +20 -0
  31. package/dist/api-handlers/admin/analytics.js +379 -0
  32. package/dist/api-handlers/admin/audit.d.ts +20 -0
  33. package/dist/api-handlers/admin/audit.js +214 -0
  34. package/dist/api-handlers/admin/index.d.ts +21 -0
  35. package/dist/api-handlers/admin/index.js +41 -0
  36. package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
  37. package/dist/api-handlers/admin/redis-sessions.js +204 -0
  38. package/dist/api-handlers/admin/sessions.d.ts +21 -0
  39. package/dist/api-handlers/admin/sessions.js +284 -0
  40. package/dist/api-handlers/admin/site-logs.d.ts +46 -0
  41. package/dist/api-handlers/admin/site-logs.js +318 -0
  42. package/dist/api-handlers/admin/users.d.ts +20 -0
  43. package/dist/api-handlers/admin/users.js +222 -0
  44. package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
  45. package/dist/api-handlers/admin/vibe-data.js +268 -0
  46. package/dist/api-handlers/anon/preferences.d.ts +37 -0
  47. package/dist/api-handlers/anon/preferences.js +96 -0
  48. package/dist/api-handlers/auth/jwks.d.ts +2 -0
  49. package/dist/api-handlers/auth/jwks.js +24 -0
  50. package/dist/api-handlers/auth/login.d.ts +42 -0
  51. package/dist/api-handlers/auth/login.js +178 -0
  52. package/dist/api-handlers/auth/refresh.d.ts +74 -0
  53. package/dist/api-handlers/auth/refresh.js +635 -0
  54. package/dist/api-handlers/auth/signout.d.ts +37 -0
  55. package/dist/api-handlers/auth/signout.js +187 -0
  56. package/dist/api-handlers/auth/status.d.ts +8 -0
  57. package/dist/api-handlers/auth/status.js +26 -0
  58. package/dist/api-handlers/auth/update-session.d.ts +37 -0
  59. package/dist/api-handlers/auth/update-session.js +95 -0
  60. package/dist/api-handlers/auth/validate.d.ts +6 -0
  61. package/dist/api-handlers/auth/validate.js +43 -0
  62. package/dist/api-handlers/auth/verify-code.d.ts +43 -0
  63. package/dist/api-handlers/auth/verify-code.js +94 -0
  64. package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
  65. package/dist/api-handlers/session/refresh-viability.js +39 -0
  66. package/dist/api-handlers/session/viability.d.ts +13 -0
  67. package/dist/api-handlers/session/viability.js +146 -0
  68. package/dist/api-handlers/test/force-expire.d.ts +23 -0
  69. package/dist/api-handlers/test/force-expire.js +65 -0
  70. package/dist/auth/auth-decision.d.ts +39 -0
  71. package/dist/auth/auth-decision.js +182 -0
  72. package/dist/auth/auth-options.d.ts +57 -0
  73. package/dist/auth/auth-options.js +213 -0
  74. package/dist/auth/callbacks/index.d.ts +6 -0
  75. package/dist/auth/callbacks/index.js +12 -0
  76. package/dist/auth/callbacks/jwt.d.ts +45 -0
  77. package/dist/auth/callbacks/jwt.js +305 -0
  78. package/dist/auth/callbacks/session.d.ts +60 -0
  79. package/dist/auth/callbacks/session.js +170 -0
  80. package/dist/auth/callbacks/signin.d.ts +23 -0
  81. package/dist/auth/callbacks/signin.js +44 -0
  82. package/dist/auth/events/index.d.ts +4 -0
  83. package/dist/auth/events/index.js +8 -0
  84. package/dist/auth/events/signout.d.ts +17 -0
  85. package/dist/auth/events/signout.js +32 -0
  86. package/dist/auth/providers/credentials.d.ts +32 -0
  87. package/dist/auth/providers/credentials.js +223 -0
  88. package/dist/auth/providers/index.d.ts +5 -0
  89. package/dist/auth/providers/index.js +21 -0
  90. package/dist/auth/providers/oauth.d.ts +26 -0
  91. package/dist/auth/providers/oauth.js +105 -0
  92. package/dist/auth/route-config.d.ts +66 -0
  93. package/dist/auth/route-config.js +190 -0
  94. package/dist/auth/types/auth-types.d.ts +417 -0
  95. package/dist/auth/types/auth-types.js +53 -0
  96. package/dist/auth/types/index.d.ts +6 -0
  97. package/dist/auth/types/index.js +22 -0
  98. package/dist/auth/unauthenticated-routes.d.ts +1 -0
  99. package/dist/auth/unauthenticated-routes.js +19 -0
  100. package/dist/auth/utils/idp-client.d.ts +94 -0
  101. package/dist/auth/utils/idp-client.js +383 -0
  102. package/dist/auth/utils/index.d.ts +5 -0
  103. package/dist/auth/utils/index.js +21 -0
  104. package/dist/auth/utils/token-utils.d.ts +84 -0
  105. package/dist/auth/utils/token-utils.js +219 -0
  106. package/dist/client/AuthContext.d.ts +19 -0
  107. package/dist/client/AuthContext.js +112 -0
  108. package/dist/client/fetch-with-auth.d.ts +11 -0
  109. package/dist/client/fetch-with-auth.js +44 -0
  110. package/dist/client/fetchWithSession.d.ts +3 -0
  111. package/dist/client/fetchWithSession.js +24 -0
  112. package/dist/client/index.d.ts +9 -0
  113. package/dist/client/index.js +20 -0
  114. package/dist/client/useAnonSession.d.ts +36 -0
  115. package/dist/client/useAnonSession.js +99 -0
  116. package/dist/components/SessionSync.d.ts +13 -0
  117. package/dist/components/SessionSync.js +119 -0
  118. package/dist/components/SignalRHealthCheck.d.ts +10 -0
  119. package/dist/components/SignalRHealthCheck.js +97 -0
  120. package/dist/components/account/UserAvatarMenu.d.ts +20 -0
  121. package/dist/components/account/UserAvatarMenu.js +80 -0
  122. package/dist/components/account/index.d.ts +7 -0
  123. package/dist/components/account/index.js +10 -0
  124. package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
  125. package/dist/components/admin/AlertSettingsTab.js +351 -0
  126. package/dist/components/admin/AnalyticsTab.d.ts +22 -0
  127. package/dist/components/admin/AnalyticsTab.js +167 -0
  128. package/dist/components/admin/DataBrowserTab.d.ts +19 -0
  129. package/dist/components/admin/DataBrowserTab.js +252 -0
  130. package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
  131. package/dist/components/admin/LoggingSettingsTab.js +339 -0
  132. package/dist/components/admin/SessionsTab.d.ts +37 -0
  133. package/dist/components/admin/SessionsTab.js +165 -0
  134. package/dist/components/admin/StatsTab.d.ts +53 -0
  135. package/dist/components/admin/StatsTab.js +161 -0
  136. package/dist/components/admin/VibeAdminContext.d.ts +32 -0
  137. package/dist/components/admin/VibeAdminContext.js +38 -0
  138. package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
  139. package/dist/components/admin/VibeAdminLayout.js +69 -0
  140. package/dist/components/admin/index.d.ts +29 -0
  141. package/dist/components/admin/index.js +44 -0
  142. package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
  143. package/dist/components/auth/FederatedAuthSection.js +45 -0
  144. package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
  145. package/dist/components/auth/ModeAwareLoginPage.js +42 -0
  146. package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
  147. package/dist/components/auth/ModeAwareSignupPage.js +78 -0
  148. package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
  149. package/dist/components/auth/TraditionalAuthSection.js +20 -0
  150. package/dist/components/recovery/CompleteStep.d.ts +5 -0
  151. package/dist/components/recovery/CompleteStep.js +8 -0
  152. package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
  153. package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
  154. package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
  155. package/dist/components/recovery/SelectMethodStep.js +8 -0
  156. package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
  157. package/dist/components/recovery/SetPasswordStep.js +20 -0
  158. package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
  159. package/dist/components/recovery/VerifyCodeStep.js +24 -0
  160. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
  161. package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
  162. package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
  163. package/dist/components/reserved/ReservedStatusBox.js +71 -0
  164. package/dist/components/ui/BetaBadge.d.ts +29 -0
  165. package/dist/components/ui/BetaBadge.js +38 -0
  166. package/dist/components/ui/Footer.d.ts +37 -0
  167. package/dist/components/ui/Footer.js +41 -0
  168. package/dist/config/env.d.ts +66 -0
  169. package/dist/config/env.js +57 -0
  170. package/dist/config/logger.d.ts +57 -0
  171. package/dist/config/logger.js +73 -0
  172. package/dist/config/logging-config.d.ts +30 -0
  173. package/dist/config/logging-config.js +122 -0
  174. package/dist/config/unauthenticated-routes.d.ts +17 -0
  175. package/dist/config/unauthenticated-routes.js +24 -0
  176. package/dist/config/vibe-log-transport.d.ts +79 -0
  177. package/dist/config/vibe-log-transport.js +203 -0
  178. package/dist/edge/internal-api-url.d.ts +53 -0
  179. package/dist/edge/internal-api-url.js +63 -0
  180. package/dist/edge/middleware.d.ts +14 -0
  181. package/dist/edge/middleware.js +32 -0
  182. package/dist/hooks/useAuth.d.ts +23 -0
  183. package/dist/hooks/useAuth.js +81 -0
  184. package/dist/hooks/useAuthSettings.d.ts +59 -0
  185. package/dist/hooks/useAuthSettings.js +93 -0
  186. package/dist/hooks/useAvailableProviders.d.ts +45 -0
  187. package/dist/hooks/useAvailableProviders.js +108 -0
  188. package/dist/hooks/usePasswordValidation.d.ts +27 -0
  189. package/dist/hooks/usePasswordValidation.js +102 -0
  190. package/dist/hooks/useProfile.d.ts +15 -0
  191. package/dist/hooks/useProfile.js +59 -0
  192. package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
  193. package/dist/hooks/usePublicAuthSettings.js +131 -0
  194. package/dist/hooks/useSessionExpiration.d.ts +57 -0
  195. package/dist/hooks/useSessionExpiration.js +72 -0
  196. package/dist/hooks/useViabilitySession.d.ts +75 -0
  197. package/dist/hooks/useViabilitySession.js +268 -0
  198. package/dist/index.d.ts +12 -0
  199. package/dist/index.js +54 -0
  200. package/dist/lib/anon-session.d.ts +74 -0
  201. package/dist/lib/anon-session.js +169 -0
  202. package/dist/lib/api-handler.d.ts +123 -0
  203. package/dist/lib/api-handler.js +478 -0
  204. package/dist/lib/app-slug.d.ts +95 -0
  205. package/dist/lib/app-slug.js +172 -0
  206. package/dist/lib/demo-mode.d.ts +6 -0
  207. package/dist/lib/demo-mode.js +16 -0
  208. package/dist/lib/geolocation.d.ts +64 -0
  209. package/dist/lib/geolocation.js +235 -0
  210. package/dist/lib/idp-client-config.d.ts +75 -0
  211. package/dist/lib/idp-client-config.js +351 -0
  212. package/dist/lib/idp-fetch.d.ts +14 -0
  213. package/dist/lib/idp-fetch.js +91 -0
  214. package/dist/lib/internal-api.d.ts +87 -0
  215. package/dist/lib/internal-api.js +122 -0
  216. package/dist/lib/jwt-decode-client.d.ts +10 -0
  217. package/dist/lib/jwt-decode-client.js +46 -0
  218. package/dist/lib/jwt-decode.d.ts +48 -0
  219. package/dist/lib/jwt-decode.js +57 -0
  220. package/dist/lib/nextauth-secret.d.ts +10 -0
  221. package/dist/lib/nextauth-secret.js +104 -0
  222. package/dist/lib/rate-limit-service.d.ts +23 -0
  223. package/dist/lib/rate-limit-service.js +6 -0
  224. package/dist/lib/redis.d.ts +5 -0
  225. package/dist/lib/redis.js +28 -0
  226. package/dist/lib/refresh-token-validator.d.ts +13 -0
  227. package/dist/lib/refresh-token-validator.js +117 -0
  228. package/dist/lib/roles.d.ts +145 -0
  229. package/dist/lib/roles.js +168 -0
  230. package/dist/lib/secret-validation.d.ts +4 -0
  231. package/dist/lib/secret-validation.js +14 -0
  232. package/dist/lib/session-store.d.ts +166 -0
  233. package/dist/lib/session-store.js +537 -0
  234. package/dist/lib/session.d.ts +21 -0
  235. package/dist/lib/session.js +26 -0
  236. package/dist/lib/site-logger.d.ts +214 -0
  237. package/dist/lib/site-logger.js +210 -0
  238. package/dist/lib/standardized-client-api.d.ts +161 -0
  239. package/dist/lib/standardized-client-api.js +786 -0
  240. package/dist/lib/startup-init.d.ts +40 -0
  241. package/dist/lib/startup-init.js +261 -0
  242. package/dist/lib/test-aware-get-token.d.ts +2 -0
  243. package/dist/lib/test-aware-get-token.js +81 -0
  244. package/dist/lib/token-expiry.d.ts +14 -0
  245. package/dist/lib/token-expiry.js +39 -0
  246. package/dist/lib/token-lifecycle.d.ts +52 -0
  247. package/dist/lib/token-lifecycle.js +398 -0
  248. package/dist/lib/types/api-responses.d.ts +128 -0
  249. package/dist/lib/types/api-responses.js +171 -0
  250. package/dist/lib/user-agent-parser.d.ts +50 -0
  251. package/dist/lib/user-agent-parser.js +220 -0
  252. package/dist/logging/api/admin-analytics.d.ts +3 -0
  253. package/dist/logging/api/admin-analytics.js +45 -0
  254. package/dist/logging/api/audit-log.d.ts +3 -0
  255. package/dist/logging/api/audit-log.js +52 -0
  256. package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
  257. package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
  258. package/dist/logging/components/AuditLogViewer.d.ts +7 -0
  259. package/dist/logging/components/AuditLogViewer.js +51 -0
  260. package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
  261. package/dist/logging/components/ErrorMetricsCard.js +16 -0
  262. package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
  263. package/dist/logging/components/HealthMetricsCard.js +19 -0
  264. package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
  265. package/dist/logging/hooks/useAdminAnalytics.js +22 -0
  266. package/dist/logging/hooks/useAuditLog.d.ts +6 -0
  267. package/dist/logging/hooks/useAuditLog.js +25 -0
  268. package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
  269. package/dist/logging/hooks/useErrorMetrics.js +38 -0
  270. package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
  271. package/dist/logging/hooks/useHealthMetrics.js +41 -0
  272. package/dist/logging/index.d.ts +11 -0
  273. package/dist/logging/index.js +40 -0
  274. package/dist/logging/types/analytics.d.ts +68 -0
  275. package/dist/logging/types/analytics.js +3 -0
  276. package/dist/logging/types/audit.d.ts +29 -0
  277. package/dist/logging/types/audit.js +2 -0
  278. package/dist/logging/types/index.d.ts +2 -0
  279. package/dist/logging/types/index.js +19 -0
  280. package/dist/middleware/auth-decision.d.ts +33 -0
  281. package/dist/middleware/auth-decision.js +65 -0
  282. package/dist/middleware/create-middleware.d.ts +100 -0
  283. package/dist/middleware/create-middleware.js +445 -0
  284. package/dist/middleware/rbac-check.d.ts +44 -0
  285. package/dist/middleware/rbac-check.js +191 -0
  286. package/dist/middleware/twofa-presets.d.ts +134 -0
  287. package/dist/middleware/twofa-presets.js +175 -0
  288. package/dist/models/DecodedAccessToken.d.ts +17 -0
  289. package/dist/models/DecodedAccessToken.js +2 -0
  290. package/dist/models/SessionModel.d.ts +122 -0
  291. package/dist/models/SessionModel.js +136 -0
  292. package/dist/pages/admin-login/page.d.ts +31 -0
  293. package/dist/pages/admin-login/page.js +83 -0
  294. package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
  295. package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
  296. package/dist/pages/admin-roles/index.d.ts +8 -0
  297. package/dist/pages/admin-roles/index.js +15 -0
  298. package/dist/pages/admin-roles/modals.d.ts +72 -0
  299. package/dist/pages/admin-roles/modals.js +154 -0
  300. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
  301. package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
  302. package/dist/pages/client-admin/index.d.ts +32 -0
  303. package/dist/pages/client-admin/index.js +37 -0
  304. package/dist/pages/login/page.d.ts +22 -0
  305. package/dist/pages/login/page.js +239 -0
  306. package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
  307. package/dist/pages/profile/EnhancedProfilePage.js +150 -0
  308. package/dist/pages/profile/index.d.ts +8 -0
  309. package/dist/pages/profile/index.js +16 -0
  310. package/dist/pages/profile/page.d.ts +19 -0
  311. package/dist/pages/profile/page.js +47 -0
  312. package/dist/pages/profile/profile-patch.d.ts +1 -0
  313. package/dist/pages/profile/profile-patch.js +281 -0
  314. package/dist/pages/recovery/page.d.ts +1 -0
  315. package/dist/pages/recovery/page.js +142 -0
  316. package/dist/pages/roles/MyRolesPage.d.ts +24 -0
  317. package/dist/pages/roles/MyRolesPage.js +71 -0
  318. package/dist/pages/roles/components.d.ts +63 -0
  319. package/dist/pages/roles/components.js +108 -0
  320. package/dist/pages/roles/index.d.ts +8 -0
  321. package/dist/pages/roles/index.js +19 -0
  322. package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
  323. package/dist/pages/security/EnhancedSecurityPage.js +248 -0
  324. package/dist/pages/security/index.d.ts +8 -0
  325. package/dist/pages/security/index.js +16 -0
  326. package/dist/pages/security/page.d.ts +21 -0
  327. package/dist/pages/security/page.js +212 -0
  328. package/dist/pages/security/security-patch.d.ts +1 -0
  329. package/dist/pages/security/security-patch.js +302 -0
  330. package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
  331. package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
  332. package/dist/pages/settings/index.d.ts +8 -0
  333. package/dist/pages/settings/index.js +16 -0
  334. package/dist/pages/settings/page.d.ts +7 -0
  335. package/dist/pages/settings/page.js +26 -0
  336. package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
  337. package/dist/pages/showcase/ShowcasePage.js +140 -0
  338. package/dist/pages/showcase/index.d.ts +12 -0
  339. package/dist/pages/showcase/index.js +17 -0
  340. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
  341. package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
  342. package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
  343. package/dist/pages/test-env/JwtInspectPage.js +114 -0
  344. package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
  345. package/dist/pages/test-env/RefreshTokenPage.js +91 -0
  346. package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
  347. package/dist/pages/test-env/TestEnvPage.js +49 -0
  348. package/dist/pages/test-env/index.d.ts +24 -0
  349. package/dist/pages/test-env/index.js +32 -0
  350. package/dist/pages/verify-code/page.d.ts +30 -0
  351. package/dist/pages/verify-code/page.js +408 -0
  352. package/dist/routes/account/index.d.ts +28 -0
  353. package/dist/routes/account/index.js +71 -0
  354. package/dist/routes/account/masked-info.d.ts +33 -0
  355. package/dist/routes/account/masked-info.js +39 -0
  356. package/dist/routes/account/send-code.d.ts +37 -0
  357. package/dist/routes/account/send-code.js +42 -0
  358. package/dist/routes/account/update-phone.d.ts +13 -0
  359. package/dist/routes/account/update-phone.js +17 -0
  360. package/dist/routes/account/verify-email.d.ts +38 -0
  361. package/dist/routes/account/verify-email.js +43 -0
  362. package/dist/routes/account/verify-sms.d.ts +38 -0
  363. package/dist/routes/account/verify-sms.js +43 -0
  364. package/dist/routes/auth/index.d.ts +19 -0
  365. package/dist/routes/auth/index.js +64 -0
  366. package/dist/routes/auth/logout.d.ts +31 -0
  367. package/dist/routes/auth/logout.js +113 -0
  368. package/dist/routes/auth/nextauth.d.ts +19 -0
  369. package/dist/routes/auth/nextauth.js +72 -0
  370. package/dist/routes/auth/refresh.d.ts +30 -0
  371. package/dist/routes/auth/refresh.js +51 -0
  372. package/dist/routes/auth/session.d.ts +72 -0
  373. package/dist/routes/auth/session.js +180 -0
  374. package/dist/routes/auth/settings.d.ts +25 -0
  375. package/dist/routes/auth/settings.js +55 -0
  376. package/dist/routes/auth/viability.d.ts +52 -0
  377. package/dist/routes/auth/viability.js +201 -0
  378. package/dist/routes/index.d.ts +12 -0
  379. package/dist/routes/index.js +54 -0
  380. package/dist/routes/session/index.d.ts +6 -0
  381. package/dist/routes/session/index.js +10 -0
  382. package/dist/routes/session/refresh-viability.d.ts +16 -0
  383. package/dist/routes/session/refresh-viability.js +20 -0
  384. package/dist/services/signalrActivityService.d.ts +44 -0
  385. package/dist/services/signalrActivityService.js +257 -0
  386. package/dist/stores/authStore.d.ts +154 -0
  387. package/dist/stores/authStore.js +1531 -0
  388. package/dist/theme/ThemeProvider.d.ts +14 -0
  389. package/dist/theme/ThemeProvider.js +28 -0
  390. package/dist/theme/default.d.ts +8 -0
  391. package/dist/theme/default.js +33 -0
  392. package/dist/theme/index.d.ts +15 -0
  393. package/dist/theme/index.js +25 -0
  394. package/dist/theme/types.d.ts +56 -0
  395. package/dist/theme/types.js +8 -0
  396. package/dist/theme/useTheme.d.ts +60 -0
  397. package/dist/theme/useTheme.js +63 -0
  398. package/dist/theme/utils.d.ts +13 -0
  399. package/dist/theme/utils.js +39 -0
  400. package/dist/types/api.d.ts +134 -0
  401. package/dist/types/api.js +44 -0
  402. package/dist/types/auth.d.ts +19 -0
  403. package/dist/types/auth.js +2 -0
  404. package/dist/types/logging.d.ts +42 -0
  405. package/dist/types/logging.js +2 -0
  406. package/dist/types/recovery.d.ts +48 -0
  407. package/dist/types/recovery.js +2 -0
  408. package/dist/types/security.d.ts +1 -0
  409. package/dist/types/security.js +2 -0
  410. package/dist/utils/api.d.ts +85 -0
  411. package/dist/utils/api.js +287 -0
  412. package/dist/utils/circuitBreaker.d.ts +43 -0
  413. package/dist/utils/circuitBreaker.js +91 -0
  414. package/dist/utils/error-message.d.ts +1 -0
  415. package/dist/utils/error-message.js +103 -0
  416. package/dist/utils/layout/reservedSpace.d.ts +59 -0
  417. package/dist/utils/layout/reservedSpace.js +102 -0
  418. package/dist/utils/logout.d.ts +14 -0
  419. package/dist/utils/logout.js +32 -0
  420. package/dist/vibe/client.d.ts +261 -0
  421. package/dist/vibe/client.js +445 -0
  422. package/dist/vibe/errors.d.ts +83 -0
  423. package/dist/vibe/errors.js +146 -0
  424. package/dist/vibe/generic.d.ts +234 -0
  425. package/dist/vibe/generic.js +369 -0
  426. package/dist/vibe/hooks/index.d.ts +169 -0
  427. package/dist/vibe/hooks/index.js +252 -0
  428. package/dist/vibe/index.d.ts +23 -0
  429. package/dist/vibe/index.js +67 -0
  430. package/dist/vibe/sessions.d.ts +161 -0
  431. package/dist/vibe/sessions.js +391 -0
  432. package/dist/vibe/types.d.ts +353 -0
  433. package/dist/vibe/types.js +315 -0
  434. package/package.json +855 -0
  435. package/scripts/check-internal-url-usage.sh +73 -0
  436. package/scripts/dev-broker.ps1 +35 -0
  437. package/scripts/dev-local.ps1 +45 -0
  438. package/src/api/auth-handler.ts +550 -0
  439. package/src/api/index.ts +18 -0
  440. package/src/api-handlers/account/change-password.ts +145 -0
  441. package/src/api-handlers/account/masked-info.ts +45 -0
  442. package/src/api-handlers/account/profile.ts +80 -0
  443. package/src/api-handlers/account/recovery/initiate.ts +23 -0
  444. package/src/api-handlers/account/recovery/send-code.ts +25 -0
  445. package/src/api-handlers/account/recovery/verify-code.ts +25 -0
  446. package/src/api-handlers/account/reset-password.ts +23 -0
  447. package/src/api-handlers/account/send-code.ts +76 -0
  448. package/src/api-handlers/account/update-phone.ts +79 -0
  449. package/src/api-handlers/account/validate-password.ts +118 -0
  450. package/src/api-handlers/account/verify-email.ts +125 -0
  451. package/src/api-handlers/account/verify-sms.ts +125 -0
  452. package/src/api-handlers/admin/analytics.ts +445 -0
  453. package/src/api-handlers/admin/audit.ts +225 -0
  454. package/src/api-handlers/admin/index.ts +59 -0
  455. package/src/api-handlers/admin/redis-sessions.ts +253 -0
  456. package/src/api-handlers/admin/sessions.ts +320 -0
  457. package/src/api-handlers/admin/site-logs.ts +367 -0
  458. package/src/api-handlers/admin/users.ts +244 -0
  459. package/src/api-handlers/admin/vibe-data.ts +326 -0
  460. package/src/api-handlers/anon/preferences.ts +123 -0
  461. package/src/api-handlers/auth/jwks.ts +20 -0
  462. package/src/api-handlers/auth/login.ts +240 -0
  463. package/src/api-handlers/auth/refresh.ts +687 -0
  464. package/src/api-handlers/auth/signout.ts +212 -0
  465. package/src/api-handlers/auth/status.ts +23 -0
  466. package/src/api-handlers/auth/update-session.ts +125 -0
  467. package/src/api-handlers/auth/validate.ts +44 -0
  468. package/src/api-handlers/auth/verify-code.ts +129 -0
  469. package/src/api-handlers/session/refresh-viability.ts +36 -0
  470. package/src/api-handlers/session/viability.ts +166 -0
  471. package/src/api-handlers/test/force-expire.ts +67 -0
  472. package/src/auth/auth-decision.ts +230 -0
  473. package/src/auth/auth-options.ts +237 -0
  474. package/src/auth/callbacks/index.ts +7 -0
  475. package/src/auth/callbacks/jwt.ts +382 -0
  476. package/src/auth/callbacks/session.ts +243 -0
  477. package/src/auth/callbacks/signin.ts +56 -0
  478. package/src/auth/events/index.ts +5 -0
  479. package/src/auth/events/signout.ts +33 -0
  480. package/src/auth/providers/credentials.ts +256 -0
  481. package/src/auth/providers/index.ts +6 -0
  482. package/src/auth/providers/oauth.ts +114 -0
  483. package/src/auth/route-config.ts +220 -0
  484. package/src/auth/types/auth-types.ts +555 -0
  485. package/src/auth/types/index.ts +7 -0
  486. package/src/auth/unauthenticated-routes.ts +3 -0
  487. package/src/auth/utils/idp-client.ts +444 -0
  488. package/src/auth/utils/index.ts +6 -0
  489. package/src/auth/utils/token-utils.ts +244 -0
  490. package/src/client/AuthContext.tsx +140 -0
  491. package/src/client/fetch-with-auth.ts +48 -0
  492. package/src/client/fetchWithSession.ts +21 -0
  493. package/src/client/index.ts +13 -0
  494. package/src/client/useAnonSession.ts +131 -0
  495. package/src/components/SessionSync.tsx +137 -0
  496. package/src/components/SignalRHealthCheck.tsx +131 -0
  497. package/src/components/account/UserAvatarMenu.tsx +217 -0
  498. package/src/components/account/index.ts +8 -0
  499. package/src/components/admin/AlertSettingsTab.tsx +728 -0
  500. package/src/components/admin/AnalyticsTab.tsx +703 -0
  501. package/src/components/admin/DataBrowserTab.tsx +505 -0
  502. package/src/components/admin/LoggingSettingsTab.tsx +665 -0
  503. package/src/components/admin/SessionsTab.tsx +414 -0
  504. package/src/components/admin/StatsTab.tsx +379 -0
  505. package/src/components/admin/VibeAdminContext.tsx +87 -0
  506. package/src/components/admin/VibeAdminLayout.tsx +185 -0
  507. package/src/components/admin/index.ts +59 -0
  508. package/src/components/auth/FederatedAuthSection.tsx +95 -0
  509. package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
  510. package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
  511. package/src/components/auth/TraditionalAuthSection.tsx +99 -0
  512. package/src/components/recovery/CompleteStep.tsx +36 -0
  513. package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
  514. package/src/components/recovery/SelectMethodStep.tsx +73 -0
  515. package/src/components/recovery/SetPasswordStep.tsx +97 -0
  516. package/src/components/recovery/VerifyCodeStep.tsx +90 -0
  517. package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
  518. package/src/components/reserved/ReservedStatusBox.tsx +118 -0
  519. package/src/components/ui/BetaBadge.tsx +58 -0
  520. package/src/components/ui/Footer.tsx +93 -0
  521. package/src/config/env.ts +57 -0
  522. package/src/config/logger.ts +62 -0
  523. package/src/config/logging-config.ts +82 -0
  524. package/src/config/unauthenticated-routes.ts +19 -0
  525. package/src/config/vibe-log-transport.ts +250 -0
  526. package/src/edge/internal-api-url.ts +65 -0
  527. package/src/edge/middleware.ts +42 -0
  528. package/src/hooks/useAuth.ts +115 -0
  529. package/src/hooks/useAuthSettings.ts +97 -0
  530. package/src/hooks/useAvailableProviders.ts +118 -0
  531. package/src/hooks/usePasswordValidation.ts +127 -0
  532. package/src/hooks/useProfile.ts +75 -0
  533. package/src/hooks/usePublicAuthSettings.ts +149 -0
  534. package/src/hooks/useSessionExpiration.ts +102 -0
  535. package/src/hooks/useViabilitySession.ts +335 -0
  536. package/src/index.ts +63 -0
  537. package/src/lib/anon-session.ts +213 -0
  538. package/src/lib/api-handler.ts +625 -0
  539. package/src/lib/app-slug.ts +178 -0
  540. package/src/lib/demo-mode.ts +13 -0
  541. package/src/lib/geolocation.ts +265 -0
  542. package/src/lib/idp-client-config.ts +442 -0
  543. package/src/lib/idp-fetch.ts +101 -0
  544. package/src/lib/internal-api.ts +171 -0
  545. package/src/lib/jwt-decode-client.ts +45 -0
  546. package/src/lib/jwt-decode.ts +83 -0
  547. package/src/lib/nextauth-secret.ts +126 -0
  548. package/src/lib/rate-limit-service.ts +9 -0
  549. package/src/lib/redis.ts +27 -0
  550. package/src/lib/refresh-token-validator.ts +64 -0
  551. package/src/lib/roles.ts +177 -0
  552. package/src/lib/secret-validation.ts +8 -0
  553. package/src/lib/session-store.ts +637 -0
  554. package/src/lib/session.ts +34 -0
  555. package/src/lib/site-logger.ts +245 -0
  556. package/src/lib/standardized-client-api.ts +896 -0
  557. package/src/lib/startup-init.ts +247 -0
  558. package/src/lib/test-aware-get-token.ts +30 -0
  559. package/src/lib/token-expiry.ts +40 -0
  560. package/src/lib/token-lifecycle.ts +477 -0
  561. package/src/lib/types/api-responses.ts +336 -0
  562. package/src/lib/user-agent-parser.ts +252 -0
  563. package/src/logging/api/admin-analytics.ts +51 -0
  564. package/src/logging/api/audit-log.ts +53 -0
  565. package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
  566. package/src/logging/components/AuditLogViewer.tsx +125 -0
  567. package/src/logging/components/ErrorMetricsCard.tsx +98 -0
  568. package/src/logging/components/HealthMetricsCard.tsx +70 -0
  569. package/src/logging/hooks/useAdminAnalytics.ts +22 -0
  570. package/src/logging/hooks/useAuditLog.ts +24 -0
  571. package/src/logging/hooks/useErrorMetrics.ts +40 -0
  572. package/src/logging/hooks/useHealthMetrics.ts +44 -0
  573. package/src/logging/index.ts +18 -0
  574. package/src/logging/types/analytics.ts +81 -0
  575. package/src/logging/types/audit.ts +31 -0
  576. package/src/logging/types/index.ts +3 -0
  577. package/src/middleware/auth-decision.ts +43 -0
  578. package/src/middleware/create-middleware.ts +626 -0
  579. package/src/middleware/rbac-check.ts +244 -0
  580. package/src/middleware/twofa-presets.ts +224 -0
  581. package/src/models/DecodedAccessToken.ts +17 -0
  582. package/src/models/SessionModel.ts +258 -0
  583. package/src/pages/admin-login/page.tsx +229 -0
  584. package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
  585. package/src/pages/admin-roles/index.ts +9 -0
  586. package/src/pages/admin-roles/modals.tsx +469 -0
  587. package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
  588. package/src/pages/client-admin/index.ts +33 -0
  589. package/src/pages/login/page.tsx +463 -0
  590. package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
  591. package/src/pages/profile/index.ts +9 -0
  592. package/src/pages/profile/page.tsx +166 -0
  593. package/src/pages/recovery/page.tsx +234 -0
  594. package/src/pages/roles/MyRolesPage.tsx +211 -0
  595. package/src/pages/roles/components.tsx +294 -0
  596. package/src/pages/roles/index.ts +17 -0
  597. package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
  598. package/src/pages/security/index.ts +9 -0
  599. package/src/pages/security/page.tsx +507 -0
  600. package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
  601. package/src/pages/settings/index.ts +9 -0
  602. package/src/pages/settings/page.tsx +47 -0
  603. package/src/pages/showcase/ShowcasePage.tsx +530 -0
  604. package/src/pages/showcase/index.ts +13 -0
  605. package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
  606. package/src/pages/test-env/JwtInspectPage.tsx +418 -0
  607. package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
  608. package/src/pages/test-env/TestEnvPage.tsx +116 -0
  609. package/src/pages/test-env/index.ts +25 -0
  610. package/src/pages/verify-code/page.tsx +648 -0
  611. package/src/routes/account/index.ts +32 -0
  612. package/src/routes/account/masked-info.ts +37 -0
  613. package/src/routes/account/send-code.ts +40 -0
  614. package/src/routes/account/update-phone.ts +13 -0
  615. package/src/routes/account/verify-email.ts +41 -0
  616. package/src/routes/account/verify-sms.ts +41 -0
  617. package/src/routes/auth/index.ts +23 -0
  618. package/src/routes/auth/logout.ts +127 -0
  619. package/src/routes/auth/nextauth.ts +71 -0
  620. package/src/routes/auth/refresh.ts +54 -0
  621. package/src/routes/auth/session.ts +193 -0
  622. package/src/routes/auth/settings.ts +75 -0
  623. package/src/routes/auth/viability.ts +220 -0
  624. package/src/routes/index.ts +18 -0
  625. package/src/routes/session/index.ts +7 -0
  626. package/src/routes/session/refresh-viability.ts +17 -0
  627. package/src/services/signalrActivityService.ts +258 -0
  628. package/src/stores/authStore.ts +1904 -0
  629. package/src/templates/instrumentation.ts +41 -0
  630. package/src/theme/ThemeProvider.tsx +39 -0
  631. package/src/theme/default.ts +33 -0
  632. package/src/theme/index.ts +31 -0
  633. package/src/theme/types.ts +69 -0
  634. package/src/theme/useTheme.ts +57 -0
  635. package/src/theme/utils.ts +40 -0
  636. package/src/types/api.ts +13 -0
  637. package/src/types/auth.d.ts +15 -0
  638. package/src/types/auth.ts +22 -0
  639. package/src/types/logging.ts +11 -0
  640. package/src/types/next-auth.d.ts +15 -0
  641. package/src/types/recovery.ts +54 -0
  642. package/src/types/security.ts +1 -0
  643. package/src/utils/api.ts +353 -0
  644. package/src/utils/circuitBreaker.ts +40 -0
  645. package/src/utils/error-message.ts +108 -0
  646. package/src/utils/layout/reservedSpace.ts +124 -0
  647. package/src/utils/logout.ts +30 -0
  648. package/src/vibe/client.ts +590 -0
  649. package/src/vibe/errors.ts +185 -0
  650. package/src/vibe/generic.ts +429 -0
  651. package/src/vibe/hooks/index.ts +367 -0
  652. package/src/vibe/index.ts +121 -0
  653. package/src/vibe/sessions.ts +551 -0
  654. 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,5 @@
1
+ interface Props {
2
+ onGoToLogin: () => void;
3
+ }
4
+ export declare function CompleteStep({ onGoToLogin }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -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,6 @@
1
+ interface Props {
2
+ onSubmit: (password: string, confirmPassword: string) => void;
3
+ loading: boolean;
4
+ }
5
+ export declare function SetPasswordStep({ onSubmit, loading }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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
+ };