@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
package/README.md ADDED
@@ -0,0 +1,782 @@
1
+ # @payez/next-mvp
2
+
3
+ PayEz IDP authentication package for Next.js 14/15 with pre-built UI components and complete authentication flow.
4
+
5
+ ## Version History
6
+
7
+ ### v2.4.2 (2025-11-14)
8
+ - **Fixed**: Redirect loop on token expiration - middleware now allows NextAuth JWT callback to refresh expired tokens instead of immediately redirecting to login, preventing infinite redirect loops when access tokens expire
9
+
10
+ ### v2.4.1 (2025-11-14)
11
+ - **Fixed**: Stale cookie detection - viability API now properly detects when JWT exists but Redis session is missing, preventing access with expired sessions
12
+ - **Fixed**: Token refresh field names - changed to PascalCase (`RefreshToken`, `AuthenticationMethods`, `AuthenticationLevel`, `TwoFactorMethod`) to match IDP requirements, resolving 400 errors during token refresh
13
+
14
+ ### v2.4.0
15
+ - Auth-ready v2 handlers with pre-configured routes
16
+ - Redis session management improvements
17
+ - Token refresh optimizations
18
+
19
+ ## Features
20
+
21
+ - ๐Ÿ” **Complete Authentication Flow** - Login, logout, session management, password recovery
22
+ - ๐ŸŽจ **Pre-built UI Components** - Ready-to-use login, recovery, and verify-code pages
23
+ - ๐Ÿ”„ **Automatic Token Refresh** - Built-in refresh token handling
24
+ - ๐ŸŽญ **Themeable** - Customize branding, colors, and layout via ThemeProvider
25
+ - ๐Ÿ“ฑ **Responsive Design** - Mobile-first Tailwind CSS components
26
+ - ๐Ÿš€ **Next.js 14/15 Ready** - Works with App Router and React Server Components
27
+ - ๐Ÿ”’ **Secure by Default** - JWT-based authentication with PayEz IDP
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ npm install @payez/next-mvp next-auth
33
+ # or
34
+ yarn add @payez/next-mvp next-auth
35
+ ```
36
+
37
+ ### Peer Dependencies
38
+
39
+ Ensure you have these installed:
40
+
41
+ ```bash
42
+ npm install next@^14.0.0 next-auth@^4.24.7 react@^18.2.0 react-dom@^18.2.0
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Development Scripts
48
+
49
+ PayEz MVP includes convenient development scripts for getting started quickly:
50
+
51
+ ### `npm run dev:local`
52
+
53
+ **Local Development Mode** - Perfect for first-time setup and testing without an external IDP:
54
+ - Auto-generates `NEXTAUTH_SECRET` for you
55
+ - No external IDP connection required
56
+ - Great for UI development and testing
57
+
58
+ ```bash
59
+ npm run dev:local
60
+ ```
61
+
62
+ This will:
63
+ 1. Generate a secure random `NEXTAUTH_SECRET`
64
+ 2. Display the secret (save it to your `.env.local`)
65
+ 3. Start the Next.js dev server on port 3000
66
+
67
+ ### `npm run dev:broker`
68
+
69
+ **Broker Mode** - Production-like authentication with PayEz IDP:
70
+ - Uses OAuth/OIDC flow with PayEz IDP
71
+ - Client assertion authentication
72
+ - Required for testing real authentication flows
73
+ - **This is a core feature for PayEz MVP users**
74
+
75
+ ```bash
76
+ npm run dev:broker
77
+ ```
78
+
79
+ This will:
80
+ 1. Enable broker mode (`USE_BROKER_MODE=true`)
81
+ 2. Set client ID for IDP authentication
82
+ 3. Start the Next.js dev server on port 3000
83
+ 4. Automatically kills any existing process on port 3000
84
+
85
+ **Custom Port & Client ID:**
86
+ ```bash
87
+ # In your consuming project's package.json
88
+ "scripts": {
89
+ "dev:broker": "pwsh -NoProfile -ExecutionPolicy Bypass -File node_modules/@payez/next-mvp/scripts/dev-broker.ps1 -ClientId 2 -Port 3400"
90
+ }
91
+ ```
92
+
93
+ ### Which Script to Use?
94
+
95
+ | Scenario | Script | When to Use |
96
+ |----------|--------|-------------|
97
+ | ๐ŸŽจ UI Development | `dev:local` | Building components, testing UI flows |
98
+ | ๐Ÿ” Auth Testing | `dev:broker` | Testing real OAuth flows, token management |
99
+ | ๐Ÿš€ Production-like | `dev:broker` | Testing with actual IDP integration |
100
+
101
+ ---
102
+
103
+ ## Quick Start (App Router with UI Components)
104
+
105
+ ### 1. Configure Next.js
106
+
107
+ Add to your `next.config.ts`:
108
+
109
+ ```typescript
110
+ import type { NextConfig } from "next";
111
+
112
+ const nextConfig: NextConfig = {
113
+ transpilePackages: ['@payez/next-mvp'],
114
+ };
115
+
116
+ export default nextConfig;
117
+ ```
118
+
119
+ ### 2. Set Environment Variables
120
+
121
+ Create `.env.local` (or `.env.development`) in your project root:
122
+
123
+ ```bash
124
+ # PayEz IDP Configuration (required)
125
+ CLIENT_ID=your_client_slug_from_payez # e.g., "payez_idp_admin_web"
126
+ IDP_URL=https://idp.payez.net # or http://localhost:32785 for local dev
127
+
128
+ # NextAuth trusts request headers for OAuth callback URLs
129
+ AUTH_TRUST_HOST=true
130
+
131
+ # NEXTAUTH_SECRET - DO NOT SET!
132
+ # The MVP broker fetches this securely from IDP at startup.
133
+ # Only set manually if you need to override the IDP-provided secret.
134
+
135
+ # Optional
136
+ REDIS_URL=redis://localhost:6379 # For session storage
137
+ NEXT_PUBLIC_IDP_BASE_URL=https://idp.payez.net # For client-side redirects
138
+ ```
139
+
140
+ > **Note:** `NEXTAUTH_SECRET` is intentionally omitted. The MVP automatically fetches it from the IDP at startup using the broker pattern. See [Environment Variables Reference](#environment-variables-reference) for details.
141
+
142
+ ### 3. Create NextAuth API Route
143
+
144
+ Create `app/api/auth/[...nextauth]/route.ts`:
145
+
146
+ ```typescript
147
+ /**
148
+ * NextAuth API Route Handler
149
+ * Uses pre-configured handler from @payez/next-mvp
150
+ */
151
+ export { GET, POST } from '@payez/next-mvp/routes/auth/nextauth';
152
+ ```
153
+
154
+ ### 4. Wrap Your App with Providers
155
+
156
+ Create `app/providers.tsx`:
157
+
158
+ ```typescript
159
+ 'use client';
160
+
161
+ import { SessionProvider } from 'next-auth/react';
162
+ import { ThemeProvider } from '@payez/next-mvp/theme';
163
+
164
+ export function Providers({ children }: { children: React.ReactNode }) {
165
+ return (
166
+ <SessionProvider>
167
+ <ThemeProvider>
168
+ {children}
169
+ </ThemeProvider>
170
+ </SessionProvider>
171
+ );
172
+ }
173
+ ```
174
+
175
+ Update `app/layout.tsx`:
176
+
177
+ ```typescript
178
+ import { Providers } from './providers';
179
+
180
+ export default function RootLayout({
181
+ children,
182
+ }: {
183
+ children: React.ReactNode;
184
+ }) {
185
+ return (
186
+ <html lang="en">
187
+ <body>
188
+ <Providers>
189
+ {children}
190
+ </Providers>
191
+ </body>
192
+ </html>
193
+ );
194
+ }
195
+ ```
196
+
197
+ ### 5. Add Authentication Pages
198
+
199
+ **Login Page** - `app/account-auth/login/page.tsx`:
200
+
201
+ ```typescript
202
+ 'use client';
203
+
204
+ import LoginPage from '@payez/next-mvp/dist/pages/login';
205
+
206
+ export default function LoginPageWrapper() {
207
+ return <LoginPage />;
208
+ }
209
+ ```
210
+
211
+ **Password Recovery** - `app/account-auth/recovery/page.tsx`:
212
+
213
+ ```typescript
214
+ 'use client';
215
+
216
+ import RecoveryPage from '@payez/next-mvp/dist/pages/recovery';
217
+
218
+ export default function RecoveryPageWrapper() {
219
+ return <RecoveryPage />;
220
+ }
221
+ ```
222
+
223
+ **Verify Code (2FA)** - `app/account-auth/verify-code/page.tsx`:
224
+
225
+ ```typescript
226
+ 'use client';
227
+
228
+ import VerifyCodePage from '@payez/next-mvp/dist/pages/verify-code';
229
+
230
+ export default function VerifyCodePageWrapper() {
231
+ return <VerifyCodePage />;
232
+ }
233
+ ```
234
+
235
+ ### 6. Protect Routes with Authentication
236
+
237
+ **Server-side protection:**
238
+
239
+ ```typescript
240
+ import { getServerSession } from 'next-auth';
241
+ import { redirect } from 'next/navigation';
242
+
243
+ export default async function DashboardPage() {
244
+ const session = await getServerSession();
245
+
246
+ if (!session) {
247
+ redirect('/account-auth/login');
248
+ }
249
+
250
+ return (
251
+ <div>
252
+ <h1>Welcome, {session.user?.email}</h1>
253
+ </div>
254
+ );
255
+ }
256
+ ```
257
+
258
+ **Client-side hook:**
259
+
260
+ ```typescript
261
+ 'use client';
262
+
263
+ import { useSession } from 'next-auth/react';
264
+
265
+ export default function ProfilePage() {
266
+ const { data: session, status } = useSession();
267
+
268
+ if (status === 'loading') return <div>Loading...</div>;
269
+ if (status === 'unauthenticated') return <div>Access Denied</div>;
270
+
271
+ return <div>Logged in as {session?.user?.email}</div>;
272
+ }
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Advanced: V2 Middleware-Based Setup
278
+
279
+ For applications requiring middleware-based route protection:
280
+
281
+ ### 1. Configure Public Routes
282
+
283
+ Create `src/lib/auth.ts`:
284
+
285
+ ```typescript
286
+ import { configurePublicRoutes, createAuthOptions } from '@payez/next-mvp';
287
+ import CredentialsProvider from 'next-auth/providers/credentials';
288
+
289
+ // Define routes that do NOT require authentication
290
+ const publicRoutes = [
291
+ '/',
292
+ '/login',
293
+ '/api/health',
294
+ '/api/public/*', // Wildcard example
295
+ ];
296
+
297
+ configurePublicRoutes(publicRoutes);
298
+
299
+ export const authOptions = createAuthOptions({
300
+ credentialsProvider: CredentialsProvider,
301
+ // Additional NextAuthOptions can be passed here
302
+ });
303
+
304
+ export { authOptions as GET, authOptions as POST } from './auth';
305
+ ```
306
+
307
+ ### 2. Setup NextAuth API Route
308
+
309
+ **For Pages Router (`pages/api/auth/[...nextauth].ts`):**
310
+
311
+ ```typescript
312
+ import NextAuth from 'next-auth';
313
+ import { authOptions } from '../../../src/lib/auth';
314
+
315
+ export default NextAuth(authOptions);
316
+ ```
317
+
318
+ **For App Router (`app/api/auth/[...nextauth]/route.ts`):**
319
+
320
+ ```typescript
321
+ export { GET, POST } from '../../../src/lib/auth';
322
+ ```
323
+
324
+ ### 3. Implement Middleware
325
+
326
+ Create `middleware.ts` at project root:
327
+
328
+ ```typescript
329
+ import { createMvpMiddleware } from '@payez/next-mvp';
330
+
331
+ export default createMvpMiddleware();
332
+
333
+ export const config = {
334
+ matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
335
+ };
336
+ ```
337
+
338
+ ### 4. Use `fetchWithAuth` for Protected API Calls
339
+
340
+ ```typescript
341
+ import { fetchWithAuth } from '@payez/next-mvp';
342
+
343
+ async function fetchData() {
344
+ try {
345
+ const response = await fetchWithAuth('/api/protected-data');
346
+ const data = await response.json();
347
+ console.log(data);
348
+ } catch (error) {
349
+ console.error('Failed to fetch protected data:', error);
350
+ }
351
+ }
352
+ ```
353
+
354
+ ### 5. Session Viability API Handler
355
+
356
+ **For Pages Router (`pages/api/session/viability.ts`):**
357
+
358
+ ```typescript
359
+ import viabilityHandler from '@payez/next-mvp/api-handlers/session/viability';
360
+
361
+ export default viabilityHandler;
362
+ ```
363
+
364
+ **For App Router (`app/api/session/viability/route.ts`):**
365
+
366
+ ```typescript
367
+ export { default as GET } from '@payez/next-mvp/api-handlers/session/viability';
368
+ ```
369
+
370
+ ---
371
+
372
+ ## Custom Theming
373
+
374
+ Customize branding and colors:
375
+
376
+ ```typescript
377
+ // lib/mvp-theme-config.ts
378
+ import { ThemeConfig } from '@payez/next-mvp/theme';
379
+
380
+ const customTheme: ThemeConfig = {
381
+ branding: {
382
+ companyName: "Your Company",
383
+ logoUrl: "/logo.svg",
384
+ logoAlt: "Your Company Logo"
385
+ },
386
+ colors: {
387
+ primary: "#3b82f6", // Blue
388
+ primaryHover: "#2563eb",
389
+ secondary: "#10b981", // Green
390
+ danger: "#ef4444", // Red
391
+ text: "#1f2937",
392
+ textLight: "#6b7280",
393
+ background: "#ffffff",
394
+ backgroundAlt: "#f9fafb",
395
+ border: "#e5e7eb"
396
+ },
397
+ layout: {
398
+ maxWidth: "28rem", // max-w-md
399
+ padding: "1.5rem", // p-6
400
+ borderRadius: "0.5rem" // rounded-lg
401
+ }
402
+ };
403
+
404
+ export default customTheme;
405
+ ```
406
+
407
+ Then use in your Providers:
408
+
409
+ ```typescript
410
+ import customTheme from '@/lib/mvp-theme-config';
411
+
412
+ export function Providers({ children }: { children: React.ReactNode }) {
413
+ return (
414
+ <SessionProvider>
415
+ <ThemeProvider theme={customTheme}>
416
+ {children}
417
+ </ThemeProvider>
418
+ </SessionProvider>
419
+ );
420
+ }
421
+ ```
422
+
423
+ ---
424
+
425
+ ## API Routes
426
+
427
+ Access pre-built API handlers:
428
+
429
+ ```typescript
430
+ // Session validation
431
+ import { GET as validateSession } from '@payez/next-mvp/routes/auth/session';
432
+
433
+ // Token refresh
434
+ import { POST as refreshToken } from '@payez/next-mvp/routes/auth/refresh';
435
+
436
+ // Logout
437
+ import { POST as logout } from '@payez/next-mvp/routes/auth/logout';
438
+ ```
439
+
440
+ ---
441
+
442
+ ## Environment Variables Reference
443
+
444
+ | Variable | Required | Description |
445
+ |----------|----------|-------------|
446
+ | `CLIENT_ID` | โœ… Yes | Your PayEz IDP client ID (string slug, e.g., `payez_idp_admin_web`) |
447
+ | `IDP_URL` | โœ… Yes | PayEz IDP base URL (e.g., `https://idp.payez.net` or `http://localhost:32785`) |
448
+ | `AUTH_TRUST_HOST` | โœ… Yes | Must be `true` - NextAuth derives OAuth URLs from request headers |
449
+ | `NEXTAUTH_SECRET` | ๐Ÿ”„ Broker | **Do NOT set** - fetched automatically from IDP at startup (see below) |
450
+ | `CLIENT_SECRET` | โš ๏ธ Legacy | Not needed with broker mode - IDP handles signing |
451
+ | `NEXT_PUBLIC_IDP_BASE_URL` | โš ๏ธ Optional | Public-facing IDP URL (for client-side redirects) |
452
+ | `REDIS_URL` | โš ๏ธ Optional | Redis connection string for session storage |
453
+
454
+ ### NEXTAUTH_SECRET Broker Flow
455
+
456
+ **The MVP uses a "broker" pattern for NEXTAUTH_SECRET** - the IDP securely provides it at startup rather than storing it in env files.
457
+
458
+ ```
459
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
460
+ โ”‚ App Startup (instrumentation.ts โ†’ ensureInitialized) โ”‚
461
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
462
+ โ”‚
463
+ โ–ผ
464
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
465
+ โ”‚ Is NEXTAUTH_SECRET set and non-empty? โ”‚
466
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
467
+ โ”‚ โ”‚
468
+ YES NO (recommended)
469
+ โ”‚ โ”‚
470
+ โ–ผ โ–ผ
471
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
472
+ โ”‚ Use as-is โ”‚ โ”‚ Fetch from IDP (Broker Mode) โ”‚
473
+ โ”‚ (override) โ”‚ โ”‚ 1. Sign client assertion โ”‚
474
+ โ”‚ โ”‚ โ”‚ 2. POST to /next-auth/secret โ”‚
475
+ โ”‚ โ”‚ โ”‚ 3. Set process.env at runtime โ”‚
476
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
477
+ ```
478
+
479
+ **Key points:**
480
+ - **Do NOT set `NEXTAUTH_SECRET` in `.env` files** - leave it undefined
481
+ - The IDP provides the secret securely at startup via client assertion
482
+ - Secret is cached for 5 minutes, then re-fetched if needed
483
+ - If you DO set it manually, that value takes precedence (useful for overrides)
484
+ - The broker needs `CLIENT_ID` and `IDP_URL` to fetch the secret
485
+
486
+ ---
487
+
488
+ ## Troubleshooting
489
+
490
+ ### SessionProvider Error
491
+
492
+ If you see `useSession must be wrapped in a <SessionProvider />`:
493
+
494
+ 1. Ensure `transpilePackages: ['@payez/next-mvp']` is in `next.config.ts`
495
+ 2. Make sure all page components using PayEz components have `'use client'` directive
496
+ 3. Verify your app is wrapped with `<Providers>` in `layout.tsx`
497
+
498
+ ### Module Resolution Errors
499
+
500
+ If you get `Module not found` errors:
501
+
502
+ 1. Clear Next.js cache: `rm -rf .next`
503
+ 2. Reinstall dependencies: `npm install`
504
+ 3. Restart dev server
505
+
506
+ ### Authentication Not Working
507
+
508
+ 1. Verify `CLIENT_ID` and `IDP_URL` are set correctly
509
+ 2. Check `CLIENT_ID` matches your PayEz IDP configuration (use the slug, not numeric ID)
510
+ 3. Verify IDP is running and reachable at `IDP_URL`
511
+ 4. Check server logs for broker startup messages - look for "NEXTAUTH_SECRET Successfully Fetched from IDP"
512
+ 5. If secret fetch fails, check IDP logs for client assertion errors
513
+ 6. Check browser console for error messages
514
+
515
+ ### NEXTAUTH_SECRET Issues
516
+
517
+ **"NEXTAUTH_SECRET not available" error:**
518
+ - This means the broker couldn't fetch the secret from IDP
519
+ - Check that `IDP_URL` is correct and IDP is running
520
+ - Verify `CLIENT_ID` is registered in the IDP
521
+ - Check network connectivity between your app and IDP
522
+
523
+ **Cookie cross-contamination (localhost development):**
524
+ - If running multiple apps on localhost (different ports), NextAuth cookies can conflict
525
+ - Clear `next-auth.*` cookies in browser, or use incognito
526
+ - Each app uses a unique cookie name based on CLIENT_ID to avoid conflicts
527
+
528
+ ---
529
+
530
+ ## Docker/CI Deployment (IMPORTANT)
531
+
532
+ When consuming `@payez/next-mvp` via a local `.tgz` file in Docker builds, you **must** use a local path reference.
533
+
534
+ ### The Problem
535
+
536
+ If your `package.json` references the MVP like this:
537
+ ```json
538
+ "@payez/next-mvp": "file:../PayEz-Next-MVP/packages/next-mvp/payez-next-mvp-2.6.50.tgz"
539
+ ```
540
+
541
+ Docker builds will **fail** with:
542
+ ```
543
+ npm error ENOENT: no such file or directory, open '/PayEz-Next-MVP/packages/next-mvp/payez-next-mvp-2.6.50.tgz'
544
+ ```
545
+
546
+ The relative path `../` resolves incorrectly inside the Docker container's `/app` working directory.
547
+
548
+ ### The Fix
549
+
550
+ 1. **Copy the `.tgz` file into your project root:**
551
+ ```bash
552
+ cp ../PayEz-Next-MVP/packages/next-mvp/payez-next-mvp-*.tgz ./
553
+ ```
554
+
555
+ 2. **Update `package.json` to use a local reference:**
556
+ ```json
557
+ "@payez/next-mvp": "file:./payez-next-mvp-2.6.50.tgz"
558
+ ```
559
+
560
+ 3. **Run `npm install` to update `package-lock.json`**
561
+
562
+ 4. **Ensure your Dockerfile copies the tgz:**
563
+ ```dockerfile
564
+ COPY payez-next-mvp-*.tgz ./
565
+ ```
566
+
567
+ ### Quick Fix Script
568
+
569
+ Run this in your consuming project to fix the path:
570
+ ```bash
571
+ # Copy latest tgz
572
+ cp ../PayEz-Next-MVP/packages/next-mvp/payez-next-mvp-*.tgz ./
573
+
574
+ # Update package.json path (adjust version as needed)
575
+ sed -i 's|file:../PayEz-Next-MVP/packages/next-mvp/|file:./|g' package.json
576
+
577
+ # Regenerate lockfile
578
+ npm install --legacy-peer-deps
579
+ ```
580
+
581
+ ### After MVP Version Updates
582
+
583
+ When you update the MVP package version, repeat steps 1-3 to copy the new `.tgz` and update references.
584
+
585
+ ---
586
+
587
+ ## Pre-Publishing Checklist (For Package Maintainers)
588
+
589
+ Before publishing this package to npm:
590
+
591
+ ### โœ… Code Quality
592
+ - [x] All `@/` path aliases converted to relative paths
593
+ - [x] TypeScript compiles without errors: `npm run build`
594
+ - [x] No hardcoded configuration values (use env variables)
595
+ - [ ] Unit tests pass (if implemented)
596
+
597
+ ### ๐Ÿ“ฆ Package Configuration
598
+
599
+ **CRITICAL FIXES NEEDED:**
600
+
601
+ 1. **Fix `main` field in package.json (Line 5):**
602
+ ```json
603
+ "main": "dist/index.js", // NOT "src/index.ts"
604
+ ```
605
+
606
+ 2. **Remove unused `tsc-alias` from devDependencies (Line 542):**
607
+ ```json
608
+ // DELETE this line:
609
+ "tsc-alias": "^1.8.16"
610
+ ```
611
+
612
+ 3. **Add package metadata:**
613
+ ```json
614
+ {
615
+ "description": "PayEz IDP authentication package for Next.js with ready-to-use login, recovery, and profile pages",
616
+ "keywords": ["nextjs", "authentication", "next-auth", "payez", "idp", "oauth"],
617
+ "author": "PayEz Team",
618
+ "license": "MIT",
619
+ "repository": {
620
+ "type": "git",
621
+ "url": "https://github.com/your-org/PayEz-Next-MVP"
622
+ },
623
+ "homepage": "https://github.com/your-org/PayEz-Next-MVP#readme",
624
+ "bugs": {
625
+ "url": "https://github.com/your-org/PayEz-Next-MVP/issues"
626
+ }
627
+ }
628
+ ```
629
+
630
+ ### ๐Ÿ“ Documentation
631
+ - [x] README.md is complete and accurate
632
+ - [ ] CHANGELOG.md exists with version history
633
+ - [ ] LICENSE file exists
634
+
635
+ ### ๐Ÿงช Testing
636
+ - [ ] Test fresh installation in new Next.js 14 project
637
+ - [ ] Test fresh installation in new Next.js 15 project
638
+ - [ ] Verify all exported modules work
639
+ - [ ] Test with React 18 and React 19
640
+ - [ ] Test package build: `npm pack --dry-run`
641
+
642
+ ### ๐Ÿš€ Publishing Steps
643
+
644
+ ```bash
645
+ # 1. Fix package.json issues (see above)
646
+
647
+ # 2. Login to npm
648
+ npm login
649
+
650
+ # 3. Build package
651
+ npm run build
652
+
653
+ # 4. Preview what will be published
654
+ npm pack --dry-run
655
+
656
+ # 5. Test the tarball locally
657
+ npm install ./payez-next-mvp-2.3.1.tgz
658
+
659
+ # 6. Bump version (patch/minor/major)
660
+ npm version patch # 2.3.1 -> 2.3.2
661
+ npm version minor # 2.3.1 -> 2.4.0
662
+ npm version major # 2.3.1 -> 3.0.0
663
+
664
+ # 7. Publish to npm
665
+ npm publish
666
+
667
+ # 8. Create git tag and push
668
+ git push origin main
669
+ git push origin --tags
670
+ ```
671
+
672
+ ### ๐Ÿ“‹ .npmignore
673
+
674
+ Create `.npmignore` to exclude unnecessary files:
675
+
676
+ ```
677
+ src/
678
+ *.test.ts
679
+ *.test.tsx
680
+ tsconfig.json
681
+ .gitignore
682
+ .git
683
+ node_modules/
684
+ *.tgz
685
+ .env*
686
+ ```
687
+
688
+ ### ๐Ÿ”’ Publish Configuration
689
+
690
+ Add to package.json:
691
+
692
+ ```json
693
+ "publishConfig": {
694
+ "access": "public",
695
+ "registry": "https://registry.npmjs.org/"
696
+ }
697
+ ```
698
+
699
+ ---
700
+
701
+ ## ๐Ÿ“š Complete Documentation
702
+
703
+ ### Core Guides
704
+
705
+ - **[THEMING.md](./docs/THEMING.md)** - Complete guide to customizing auth components
706
+ - Theme structure and configuration
707
+ - Creating light/dark modes
708
+ - Component-specific customization
709
+ - Common theming issues and solutions
710
+
711
+ - **[CSS_VARIABLES_INTEGRATION.md](./docs/CSS_VARIABLES_INTEGRATION.md)** - CSS variable injection for MVP components
712
+ - Why CSS variables are needed
713
+ - How to inject variables in your app
714
+ - Color conversion utilities
715
+ - Debugging CSS variable issues
716
+
717
+ - **[THEME_EXAMPLES.md](./docs/THEME_EXAMPLES.md)** - Ready-to-use theme examples
718
+ - 7 pre-built professional themes
719
+ - Multi-brand theme support
720
+ - Dynamic light/dark mode
721
+ - Copy-paste theme configurations
722
+
723
+ ### Topics Covered
724
+
725
+ #### Theming
726
+ - โœ… Brand colors and logos
727
+ - โœ… Light and dark modes
728
+ - โœ… Font families and typography
729
+ - โœ… Layout and spacing customization
730
+ - โœ… Component-specific styling
731
+ - โœ… Multi-tenant/white-label setups
732
+ - โœ… Accessibility and contrast
733
+
734
+ #### CSS Variables
735
+ - โœ… Understanding CSS custom properties
736
+ - โœ… Manual variable injection
737
+ - โœ… Color conversion (Tailwind โ†’ hex)
738
+ - โœ… Theme provider pattern
739
+ - โœ… Dynamic theme switching
740
+ - โœ… Debugging in DevTools
741
+
742
+ #### Examples
743
+ - โœ… Corporate themes
744
+ - โœ… SaaS themes
745
+ - โœ… Creative/design themes
746
+ - โœ… Accessible high-contrast themes
747
+ - โœ… Multi-brand configurations
748
+ - โœ… Gradient backgrounds
749
+ - โœ… Custom branding
750
+
751
+ ### Quick Links
752
+
753
+ **Getting Started with Themes:**
754
+ 1. Start with [THEMING.md](./docs/THEMING.md) - Quick Start section
755
+ 2. Copy a theme from [THEME_EXAMPLES.md](./docs/THEME_EXAMPLES.md)
756
+ 3. Follow integration pattern in [CSS_VARIABLES_INTEGRATION.md](./docs/CSS_VARIABLES_INTEGRATION.md)
757
+
758
+ **For Specific Tasks:**
759
+ - Want to change colors? โ†’ [THEMING.md - Creating a Theme](./docs/THEMING.md#creating-a-theme)
760
+ - Pages rendering white/no color? โ†’ [CSS_VARIABLES_INTEGRATION.md - Troubleshooting](./docs/CSS_VARIABLES_INTEGRATION.md#troubleshooting)
761
+ - Need a complete example? โ†’ [THEME_EXAMPLES.md](./docs/THEME_EXAMPLES.md)
762
+ - Debugging styling issues? โ†’ [THEMING.md - Common Issues](./docs/THEMING.md#common-issues--solutions)
763
+
764
+ ---
765
+
766
+ ## License
767
+
768
+ MIT
769
+
770
+ ## Support
771
+
772
+ For issues and questions:
773
+ - GitHub Issues: https://github.com/your-org/PayEz-Next-MVP/issues
774
+ - Documentation: https://docs.payez.net
775
+
776
+ ## Contributing
777
+
778
+ Contributions welcome! Please read our contributing guidelines first.
779
+
780
+ ---
781
+
782
+ Made with โค๏ธ by the PayEz Team