@payez/next-mvp 3.9.1 → 4.0.1

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 (526) hide show
  1. package/package.json +6 -18
  2. package/src/api/auth-handler.ts +550 -549
  3. package/src/api-handlers/account/change-password.ts +5 -8
  4. package/src/api-handlers/admin/analytics.ts +4 -6
  5. package/src/api-handlers/admin/audit.ts +5 -7
  6. package/src/api-handlers/admin/index.ts +1 -2
  7. package/src/api-handlers/admin/redis-sessions.ts +6 -8
  8. package/src/api-handlers/admin/sessions.ts +5 -7
  9. package/src/api-handlers/admin/site-logs.ts +8 -10
  10. package/src/api-handlers/admin/stats.ts +4 -6
  11. package/src/api-handlers/admin/users.ts +5 -7
  12. package/src/api-handlers/admin/vibe-data.ts +10 -12
  13. package/src/api-handlers/auth/refresh.ts +5 -7
  14. package/src/api-handlers/auth/signout.ts +5 -6
  15. package/src/api-handlers/auth/status.ts +4 -7
  16. package/src/api-handlers/auth/update-session.ts +123 -125
  17. package/src/api-handlers/auth/verify-code.ts +9 -13
  18. package/src/api-handlers/session/viability.ts +10 -47
  19. package/src/api-handlers/test/force-expire.ts +4 -11
  20. package/src/auth/auth-decision.ts +1 -1
  21. package/src/auth/better-auth.ts +138 -141
  22. package/src/auth/route-config.ts +219 -219
  23. package/src/auth/utils/token-utils.ts +0 -1
  24. package/src/client/AuthContext.tsx +6 -2
  25. package/src/client/fetch-with-auth.ts +47 -47
  26. package/src/components/SessionSync.tsx +6 -5
  27. package/src/components/account/MobileNavDrawer.tsx +3 -3
  28. package/src/components/account/UserAvatarMenu.tsx +6 -3
  29. package/src/components/admin/VibeAdminLayout.tsx +4 -2
  30. package/src/config/logger.ts +1 -1
  31. package/src/hooks/useAuth.ts +117 -115
  32. package/src/hooks/useAuthSettings.ts +2 -2
  33. package/src/hooks/useAvailableProviders.ts +9 -5
  34. package/src/hooks/useSessionExpiration.ts +101 -102
  35. package/src/hooks/useViabilitySession.ts +336 -335
  36. package/src/index.ts +60 -63
  37. package/src/lib/api-handler.ts +0 -1
  38. package/src/lib/app-slug.ts +6 -6
  39. package/src/lib/standardized-client-api.ts +901 -895
  40. package/src/lib/startup-init.ts +243 -247
  41. package/src/lib/test-aware-get-token.ts +22 -12
  42. package/src/lib/token-lifecycle.ts +12 -53
  43. package/src/pages/admin-login/page.tsx +9 -17
  44. package/src/pages/client-admin/ClientSiteAdminPage.tsx +4 -2
  45. package/src/pages/login/page.tsx +21 -28
  46. package/src/pages/showcase/ShowcasePage.tsx +4 -2
  47. package/src/pages/test-env/EmergencyLogoutPage.tsx +7 -6
  48. package/src/pages/test-env/JwtInspectPage.tsx +5 -3
  49. package/src/pages/test-env/RefreshTokenPage.tsx +157 -155
  50. package/src/pages/test-env/TestEnvPage.tsx +4 -2
  51. package/src/pages/verify-code/page.tsx +10 -6
  52. package/src/routes/auth/logout.ts +7 -25
  53. package/src/routes/auth/nextauth.ts +45 -71
  54. package/src/routes/auth/session.ts +25 -50
  55. package/src/routes/auth/viability.ts +7 -19
  56. package/src/server/auth.ts +60 -0
  57. package/src/stores/authStore.ts +1899 -1904
  58. package/src/utils/logout.ts +30 -30
  59. package/dist/api/auth-handler.d.ts +0 -67
  60. package/dist/api/auth-handler.js +0 -397
  61. package/dist/api/index.d.ts +0 -10
  62. package/dist/api/index.js +0 -19
  63. package/dist/api-handlers/account/change-password.d.ts +0 -9
  64. package/dist/api-handlers/account/change-password.js +0 -112
  65. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  66. package/dist/api-handlers/account/masked-info.js +0 -41
  67. package/dist/api-handlers/account/profile.d.ts +0 -3
  68. package/dist/api-handlers/account/profile.js +0 -63
  69. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  70. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  71. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  72. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  73. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  74. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  75. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  76. package/dist/api-handlers/account/reset-password.js +0 -26
  77. package/dist/api-handlers/account/send-code.d.ts +0 -24
  78. package/dist/api-handlers/account/send-code.js +0 -60
  79. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  80. package/dist/api-handlers/account/update-phone.js +0 -64
  81. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  82. package/dist/api-handlers/account/validate-password.js +0 -81
  83. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  84. package/dist/api-handlers/account/verify-email.js +0 -106
  85. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  86. package/dist/api-handlers/account/verify-sms.js +0 -106
  87. package/dist/api-handlers/admin/analytics.d.ts +0 -20
  88. package/dist/api-handlers/admin/analytics.js +0 -379
  89. package/dist/api-handlers/admin/audit.d.ts +0 -20
  90. package/dist/api-handlers/admin/audit.js +0 -214
  91. package/dist/api-handlers/admin/index.d.ts +0 -22
  92. package/dist/api-handlers/admin/index.js +0 -43
  93. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -36
  94. package/dist/api-handlers/admin/redis-sessions.js +0 -204
  95. package/dist/api-handlers/admin/sessions.d.ts +0 -21
  96. package/dist/api-handlers/admin/sessions.js +0 -284
  97. package/dist/api-handlers/admin/site-logs.d.ts +0 -46
  98. package/dist/api-handlers/admin/site-logs.js +0 -318
  99. package/dist/api-handlers/admin/stats.d.ts +0 -21
  100. package/dist/api-handlers/admin/stats.js +0 -240
  101. package/dist/api-handlers/admin/users.d.ts +0 -20
  102. package/dist/api-handlers/admin/users.js +0 -222
  103. package/dist/api-handlers/admin/vibe-data.d.ts +0 -80
  104. package/dist/api-handlers/admin/vibe-data.js +0 -268
  105. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  106. package/dist/api-handlers/anon/preferences.js +0 -96
  107. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  108. package/dist/api-handlers/auth/jwks.js +0 -24
  109. package/dist/api-handlers/auth/login.d.ts +0 -42
  110. package/dist/api-handlers/auth/login.js +0 -178
  111. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  112. package/dist/api-handlers/auth/refresh.js +0 -635
  113. package/dist/api-handlers/auth/signout.d.ts +0 -37
  114. package/dist/api-handlers/auth/signout.js +0 -187
  115. package/dist/api-handlers/auth/status.d.ts +0 -8
  116. package/dist/api-handlers/auth/status.js +0 -26
  117. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  118. package/dist/api-handlers/auth/update-session.js +0 -95
  119. package/dist/api-handlers/auth/validate.d.ts +0 -6
  120. package/dist/api-handlers/auth/validate.js +0 -43
  121. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  122. package/dist/api-handlers/auth/verify-code.js +0 -94
  123. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  124. package/dist/api-handlers/session/refresh-viability.js +0 -39
  125. package/dist/api-handlers/session/viability.d.ts +0 -13
  126. package/dist/api-handlers/session/viability.js +0 -146
  127. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  128. package/dist/api-handlers/test/force-expire.js +0 -65
  129. package/dist/auth/auth-decision.d.ts +0 -39
  130. package/dist/auth/auth-decision.js +0 -182
  131. package/dist/auth/auth-options.d.ts +0 -57
  132. package/dist/auth/auth-options.js +0 -213
  133. package/dist/auth/better-auth.d.ts +0 -82
  134. package/dist/auth/better-auth.js +0 -122
  135. package/dist/auth/callbacks/index.d.ts +0 -6
  136. package/dist/auth/callbacks/index.js +0 -12
  137. package/dist/auth/callbacks/jwt.d.ts +0 -45
  138. package/dist/auth/callbacks/jwt.js +0 -305
  139. package/dist/auth/callbacks/session.d.ts +0 -60
  140. package/dist/auth/callbacks/session.js +0 -170
  141. package/dist/auth/callbacks/signin.d.ts +0 -23
  142. package/dist/auth/callbacks/signin.js +0 -44
  143. package/dist/auth/events/index.d.ts +0 -4
  144. package/dist/auth/events/index.js +0 -8
  145. package/dist/auth/events/signout.d.ts +0 -17
  146. package/dist/auth/events/signout.js +0 -32
  147. package/dist/auth/providers/credentials.d.ts +0 -32
  148. package/dist/auth/providers/credentials.js +0 -223
  149. package/dist/auth/providers/index.d.ts +0 -5
  150. package/dist/auth/providers/index.js +0 -21
  151. package/dist/auth/providers/oauth.d.ts +0 -26
  152. package/dist/auth/providers/oauth.js +0 -105
  153. package/dist/auth/route-config.d.ts +0 -66
  154. package/dist/auth/route-config.js +0 -190
  155. package/dist/auth/types/auth-types.d.ts +0 -417
  156. package/dist/auth/types/auth-types.js +0 -53
  157. package/dist/auth/types/index.d.ts +0 -6
  158. package/dist/auth/types/index.js +0 -22
  159. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  160. package/dist/auth/unauthenticated-routes.js +0 -19
  161. package/dist/auth/utils/idp-client.d.ts +0 -94
  162. package/dist/auth/utils/idp-client.js +0 -384
  163. package/dist/auth/utils/index.d.ts +0 -5
  164. package/dist/auth/utils/index.js +0 -21
  165. package/dist/auth/utils/token-utils.d.ts +0 -84
  166. package/dist/auth/utils/token-utils.js +0 -219
  167. package/dist/client/AuthContext.d.ts +0 -19
  168. package/dist/client/AuthContext.js +0 -112
  169. package/dist/client/better-auth-client.d.ts +0 -1020
  170. package/dist/client/better-auth-client.js +0 -68
  171. package/dist/client/fetch-with-auth.d.ts +0 -11
  172. package/dist/client/fetch-with-auth.js +0 -44
  173. package/dist/client/fetchWithSession.d.ts +0 -3
  174. package/dist/client/fetchWithSession.js +0 -24
  175. package/dist/client/index.d.ts +0 -9
  176. package/dist/client/index.js +0 -20
  177. package/dist/client/useAnonSession.d.ts +0 -36
  178. package/dist/client/useAnonSession.js +0 -99
  179. package/dist/components/SessionSync.d.ts +0 -13
  180. package/dist/components/SessionSync.js +0 -119
  181. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  182. package/dist/components/SignalRHealthCheck.js +0 -97
  183. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  184. package/dist/components/account/MobileNavDrawer.js +0 -81
  185. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  186. package/dist/components/account/UserAvatarMenu.js +0 -88
  187. package/dist/components/account/index.d.ts +0 -9
  188. package/dist/components/account/index.js +0 -13
  189. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  190. package/dist/components/admin/AlertSettingsTab.js +0 -351
  191. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  192. package/dist/components/admin/AnalyticsTab.js +0 -167
  193. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  194. package/dist/components/admin/DataBrowserTab.js +0 -252
  195. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  196. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  197. package/dist/components/admin/SessionsTab.d.ts +0 -37
  198. package/dist/components/admin/SessionsTab.js +0 -165
  199. package/dist/components/admin/StatsTab.d.ts +0 -53
  200. package/dist/components/admin/StatsTab.js +0 -161
  201. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  202. package/dist/components/admin/VibeAdminContext.js +0 -38
  203. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  204. package/dist/components/admin/VibeAdminLayout.js +0 -69
  205. package/dist/components/admin/index.d.ts +0 -29
  206. package/dist/components/admin/index.js +0 -44
  207. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  208. package/dist/components/auth/FederatedAuthSection.js +0 -45
  209. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  210. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  211. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  212. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  213. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  214. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  215. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  216. package/dist/components/recovery/CompleteStep.js +0 -8
  217. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  218. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  219. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  220. package/dist/components/recovery/SelectMethodStep.js +0 -8
  221. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  222. package/dist/components/recovery/SetPasswordStep.js +0 -20
  223. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  224. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  225. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  226. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  227. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  228. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  229. package/dist/components/ui/BetaBadge.d.ts +0 -29
  230. package/dist/components/ui/BetaBadge.js +0 -38
  231. package/dist/components/ui/Footer.d.ts +0 -37
  232. package/dist/components/ui/Footer.js +0 -41
  233. package/dist/config/env.d.ts +0 -66
  234. package/dist/config/env.js +0 -57
  235. package/dist/config/logger.d.ts +0 -57
  236. package/dist/config/logger.js +0 -73
  237. package/dist/config/logging-config.d.ts +0 -30
  238. package/dist/config/logging-config.js +0 -122
  239. package/dist/config/unauthenticated-routes.d.ts +0 -17
  240. package/dist/config/unauthenticated-routes.js +0 -24
  241. package/dist/config/vibe-log-transport.d.ts +0 -81
  242. package/dist/config/vibe-log-transport.js +0 -212
  243. package/dist/edge/internal-api-url.d.ts +0 -53
  244. package/dist/edge/internal-api-url.js +0 -63
  245. package/dist/edge/middleware.d.ts +0 -14
  246. package/dist/edge/middleware.js +0 -32
  247. package/dist/hooks/useAuth.d.ts +0 -23
  248. package/dist/hooks/useAuth.js +0 -81
  249. package/dist/hooks/useAuthSettings.d.ts +0 -59
  250. package/dist/hooks/useAuthSettings.js +0 -93
  251. package/dist/hooks/useAvailableProviders.d.ts +0 -45
  252. package/dist/hooks/useAvailableProviders.js +0 -108
  253. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  254. package/dist/hooks/usePasswordValidation.js +0 -102
  255. package/dist/hooks/useProfile.d.ts +0 -15
  256. package/dist/hooks/useProfile.js +0 -59
  257. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  258. package/dist/hooks/usePublicAuthSettings.js +0 -131
  259. package/dist/hooks/useSessionExpiration.d.ts +0 -57
  260. package/dist/hooks/useSessionExpiration.js +0 -72
  261. package/dist/hooks/useViabilitySession.d.ts +0 -75
  262. package/dist/hooks/useViabilitySession.js +0 -268
  263. package/dist/index.d.ts +0 -12
  264. package/dist/index.js +0 -55
  265. package/dist/lib/anon-session.d.ts +0 -74
  266. package/dist/lib/anon-session.js +0 -169
  267. package/dist/lib/api-handler.d.ts +0 -123
  268. package/dist/lib/api-handler.js +0 -478
  269. package/dist/lib/app-slug.d.ts +0 -95
  270. package/dist/lib/app-slug.js +0 -172
  271. package/dist/lib/demo-mode.d.ts +0 -6
  272. package/dist/lib/demo-mode.js +0 -16
  273. package/dist/lib/geolocation.d.ts +0 -64
  274. package/dist/lib/geolocation.js +0 -235
  275. package/dist/lib/idp-client-config.d.ts +0 -75
  276. package/dist/lib/idp-client-config.js +0 -425
  277. package/dist/lib/idp-fetch.d.ts +0 -14
  278. package/dist/lib/idp-fetch.js +0 -91
  279. package/dist/lib/internal-api.d.ts +0 -87
  280. package/dist/lib/internal-api.js +0 -122
  281. package/dist/lib/jwt-decode-client.d.ts +0 -10
  282. package/dist/lib/jwt-decode-client.js +0 -46
  283. package/dist/lib/jwt-decode.d.ts +0 -48
  284. package/dist/lib/jwt-decode.js +0 -57
  285. package/dist/lib/nextauth-secret.d.ts +0 -10
  286. package/dist/lib/nextauth-secret.js +0 -100
  287. package/dist/lib/rate-limit-service.d.ts +0 -23
  288. package/dist/lib/rate-limit-service.js +0 -6
  289. package/dist/lib/redis.d.ts +0 -5
  290. package/dist/lib/redis.js +0 -28
  291. package/dist/lib/refresh-token-validator.d.ts +0 -13
  292. package/dist/lib/refresh-token-validator.js +0 -117
  293. package/dist/lib/roles.d.ts +0 -145
  294. package/dist/lib/roles.js +0 -168
  295. package/dist/lib/secret-validation.d.ts +0 -4
  296. package/dist/lib/secret-validation.js +0 -14
  297. package/dist/lib/session-store.d.ts +0 -170
  298. package/dist/lib/session-store.js +0 -545
  299. package/dist/lib/session.d.ts +0 -21
  300. package/dist/lib/session.js +0 -26
  301. package/dist/lib/site-logger.d.ts +0 -214
  302. package/dist/lib/site-logger.js +0 -210
  303. package/dist/lib/standardized-client-api.d.ts +0 -161
  304. package/dist/lib/standardized-client-api.js +0 -786
  305. package/dist/lib/startup-init.d.ts +0 -40
  306. package/dist/lib/startup-init.js +0 -261
  307. package/dist/lib/test-aware-get-token.d.ts +0 -2
  308. package/dist/lib/test-aware-get-token.js +0 -81
  309. package/dist/lib/token-expiry.d.ts +0 -14
  310. package/dist/lib/token-expiry.js +0 -39
  311. package/dist/lib/token-lifecycle.d.ts +0 -52
  312. package/dist/lib/token-lifecycle.js +0 -398
  313. package/dist/lib/types/api-responses.d.ts +0 -128
  314. package/dist/lib/types/api-responses.js +0 -171
  315. package/dist/lib/user-agent-parser.d.ts +0 -50
  316. package/dist/lib/user-agent-parser.js +0 -220
  317. package/dist/logging/api/admin-analytics.d.ts +0 -3
  318. package/dist/logging/api/admin-analytics.js +0 -45
  319. package/dist/logging/api/audit-log.d.ts +0 -3
  320. package/dist/logging/api/audit-log.js +0 -52
  321. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  322. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  323. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  324. package/dist/logging/components/AuditLogViewer.js +0 -51
  325. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  326. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  327. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  328. package/dist/logging/components/HealthMetricsCard.js +0 -19
  329. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  330. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  331. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  332. package/dist/logging/hooks/useAuditLog.js +0 -25
  333. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  334. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  335. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  336. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  337. package/dist/logging/index.d.ts +0 -11
  338. package/dist/logging/index.js +0 -40
  339. package/dist/logging/types/analytics.d.ts +0 -68
  340. package/dist/logging/types/analytics.js +0 -3
  341. package/dist/logging/types/audit.d.ts +0 -29
  342. package/dist/logging/types/audit.js +0 -2
  343. package/dist/logging/types/index.d.ts +0 -2
  344. package/dist/logging/types/index.js +0 -19
  345. package/dist/middleware/auth-decision.d.ts +0 -33
  346. package/dist/middleware/auth-decision.js +0 -65
  347. package/dist/middleware/create-middleware.d.ts +0 -102
  348. package/dist/middleware/create-middleware.js +0 -469
  349. package/dist/middleware/rbac-check.d.ts +0 -51
  350. package/dist/middleware/rbac-check.js +0 -219
  351. package/dist/middleware/twofa-presets.d.ts +0 -134
  352. package/dist/middleware/twofa-presets.js +0 -175
  353. package/dist/models/DecodedAccessToken.d.ts +0 -17
  354. package/dist/models/DecodedAccessToken.js +0 -2
  355. package/dist/models/SessionModel.d.ts +0 -122
  356. package/dist/models/SessionModel.js +0 -136
  357. package/dist/pages/admin-login/page.d.ts +0 -31
  358. package/dist/pages/admin-login/page.js +0 -83
  359. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  360. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  361. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  362. package/dist/pages/admin-page-permissions/index.js +0 -13
  363. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  364. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  365. package/dist/pages/admin-roles/index.d.ts +0 -8
  366. package/dist/pages/admin-roles/index.js +0 -15
  367. package/dist/pages/admin-roles/modals.d.ts +0 -72
  368. package/dist/pages/admin-roles/modals.js +0 -154
  369. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  370. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -177
  371. package/dist/pages/client-admin/index.d.ts +0 -32
  372. package/dist/pages/client-admin/index.js +0 -37
  373. package/dist/pages/coming-soon/page.d.ts +0 -8
  374. package/dist/pages/coming-soon/page.js +0 -28
  375. package/dist/pages/login/page.d.ts +0 -22
  376. package/dist/pages/login/page.js +0 -239
  377. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  378. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  379. package/dist/pages/profile/index.d.ts +0 -8
  380. package/dist/pages/profile/index.js +0 -16
  381. package/dist/pages/profile/page.d.ts +0 -19
  382. package/dist/pages/profile/page.js +0 -47
  383. package/dist/pages/profile/profile-patch.d.ts +0 -1
  384. package/dist/pages/profile/profile-patch.js +0 -281
  385. package/dist/pages/recovery/page.d.ts +0 -1
  386. package/dist/pages/recovery/page.js +0 -142
  387. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  388. package/dist/pages/roles/MyRolesPage.js +0 -71
  389. package/dist/pages/roles/components.d.ts +0 -63
  390. package/dist/pages/roles/components.js +0 -108
  391. package/dist/pages/roles/index.d.ts +0 -8
  392. package/dist/pages/roles/index.js +0 -19
  393. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  394. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  395. package/dist/pages/security/index.d.ts +0 -8
  396. package/dist/pages/security/index.js +0 -16
  397. package/dist/pages/security/page.d.ts +0 -21
  398. package/dist/pages/security/page.js +0 -212
  399. package/dist/pages/security/security-patch.d.ts +0 -1
  400. package/dist/pages/security/security-patch.js +0 -302
  401. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  402. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  403. package/dist/pages/settings/index.d.ts +0 -8
  404. package/dist/pages/settings/index.js +0 -16
  405. package/dist/pages/settings/page.d.ts +0 -7
  406. package/dist/pages/settings/page.js +0 -26
  407. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  408. package/dist/pages/showcase/ShowcasePage.js +0 -140
  409. package/dist/pages/showcase/index.d.ts +0 -12
  410. package/dist/pages/showcase/index.js +0 -17
  411. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  412. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -98
  413. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  414. package/dist/pages/test-env/JwtInspectPage.js +0 -114
  415. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  416. package/dist/pages/test-env/RefreshTokenPage.js +0 -91
  417. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  418. package/dist/pages/test-env/TestEnvPage.js +0 -49
  419. package/dist/pages/test-env/index.d.ts +0 -24
  420. package/dist/pages/test-env/index.js +0 -32
  421. package/dist/pages/verify-code/page.d.ts +0 -30
  422. package/dist/pages/verify-code/page.js +0 -408
  423. package/dist/routes/account/index.d.ts +0 -28
  424. package/dist/routes/account/index.js +0 -71
  425. package/dist/routes/account/masked-info.d.ts +0 -33
  426. package/dist/routes/account/masked-info.js +0 -39
  427. package/dist/routes/account/send-code.d.ts +0 -37
  428. package/dist/routes/account/send-code.js +0 -42
  429. package/dist/routes/account/update-phone.d.ts +0 -13
  430. package/dist/routes/account/update-phone.js +0 -17
  431. package/dist/routes/account/verify-email.d.ts +0 -38
  432. package/dist/routes/account/verify-email.js +0 -43
  433. package/dist/routes/account/verify-sms.d.ts +0 -38
  434. package/dist/routes/account/verify-sms.js +0 -43
  435. package/dist/routes/auth/index.d.ts +0 -19
  436. package/dist/routes/auth/index.js +0 -64
  437. package/dist/routes/auth/logout.d.ts +0 -31
  438. package/dist/routes/auth/logout.js +0 -113
  439. package/dist/routes/auth/nextauth.d.ts +0 -19
  440. package/dist/routes/auth/nextauth.js +0 -72
  441. package/dist/routes/auth/refresh.d.ts +0 -30
  442. package/dist/routes/auth/refresh.js +0 -51
  443. package/dist/routes/auth/session.d.ts +0 -43
  444. package/dist/routes/auth/session.js +0 -179
  445. package/dist/routes/auth/settings.d.ts +0 -25
  446. package/dist/routes/auth/settings.js +0 -55
  447. package/dist/routes/auth/viability.d.ts +0 -52
  448. package/dist/routes/auth/viability.js +0 -201
  449. package/dist/routes/index.d.ts +0 -12
  450. package/dist/routes/index.js +0 -54
  451. package/dist/routes/session/index.d.ts +0 -6
  452. package/dist/routes/session/index.js +0 -10
  453. package/dist/routes/session/refresh-viability.d.ts +0 -16
  454. package/dist/routes/session/refresh-viability.js +0 -20
  455. package/dist/server/auth-guard.d.ts +0 -46
  456. package/dist/server/auth-guard.js +0 -128
  457. package/dist/server/decode-session.d.ts +0 -30
  458. package/dist/server/decode-session.js +0 -78
  459. package/dist/server/slim-middleware.d.ts +0 -23
  460. package/dist/server/slim-middleware.js +0 -89
  461. package/dist/server/with-auth.d.ts +0 -33
  462. package/dist/server/with-auth.js +0 -59
  463. package/dist/services/signalrActivityService.d.ts +0 -44
  464. package/dist/services/signalrActivityService.js +0 -257
  465. package/dist/stores/authStore.d.ts +0 -154
  466. package/dist/stores/authStore.js +0 -1531
  467. package/dist/theme/ThemeProvider.d.ts +0 -14
  468. package/dist/theme/ThemeProvider.js +0 -28
  469. package/dist/theme/default.d.ts +0 -8
  470. package/dist/theme/default.js +0 -33
  471. package/dist/theme/index.d.ts +0 -15
  472. package/dist/theme/index.js +0 -25
  473. package/dist/theme/types.d.ts +0 -56
  474. package/dist/theme/types.js +0 -8
  475. package/dist/theme/useTheme.d.ts +0 -60
  476. package/dist/theme/useTheme.js +0 -63
  477. package/dist/theme/utils.d.ts +0 -13
  478. package/dist/theme/utils.js +0 -39
  479. package/dist/types/api.d.ts +0 -134
  480. package/dist/types/api.js +0 -44
  481. package/dist/types/auth.d.ts +0 -19
  482. package/dist/types/auth.js +0 -2
  483. package/dist/types/logging.d.ts +0 -42
  484. package/dist/types/logging.js +0 -2
  485. package/dist/types/recovery.d.ts +0 -48
  486. package/dist/types/recovery.js +0 -2
  487. package/dist/types/security.d.ts +0 -1
  488. package/dist/types/security.js +0 -2
  489. package/dist/utils/api.d.ts +0 -85
  490. package/dist/utils/api.js +0 -287
  491. package/dist/utils/circuitBreaker.d.ts +0 -43
  492. package/dist/utils/circuitBreaker.js +0 -91
  493. package/dist/utils/error-message.d.ts +0 -1
  494. package/dist/utils/error-message.js +0 -103
  495. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  496. package/dist/utils/layout/reservedSpace.js +0 -102
  497. package/dist/utils/logout.d.ts +0 -14
  498. package/dist/utils/logout.js +0 -32
  499. package/dist/vibe/client.d.ts +0 -261
  500. package/dist/vibe/client.js +0 -445
  501. package/dist/vibe/enterprise-auth.d.ts +0 -106
  502. package/dist/vibe/enterprise-auth.js +0 -173
  503. package/dist/vibe/errors.d.ts +0 -83
  504. package/dist/vibe/errors.js +0 -146
  505. package/dist/vibe/generic.d.ts +0 -234
  506. package/dist/vibe/generic.js +0 -369
  507. package/dist/vibe/hooks/index.d.ts +0 -169
  508. package/dist/vibe/hooks/index.js +0 -252
  509. package/dist/vibe/index.d.ts +0 -25
  510. package/dist/vibe/index.js +0 -72
  511. package/dist/vibe/sessions.d.ts +0 -161
  512. package/dist/vibe/sessions.js +0 -391
  513. package/dist/vibe/types.d.ts +0 -353
  514. package/dist/vibe/types.js +0 -315
  515. package/src/auth/auth-options.ts +0 -237
  516. package/src/auth/callbacks/index.ts +0 -7
  517. package/src/auth/callbacks/jwt.ts +0 -382
  518. package/src/auth/callbacks/session.ts +0 -243
  519. package/src/auth/callbacks/signin.ts +0 -56
  520. package/src/auth/events/index.ts +0 -5
  521. package/src/auth/events/signout.ts +0 -33
  522. package/src/auth/providers/credentials.ts +0 -256
  523. package/src/auth/providers/index.ts +0 -6
  524. package/src/auth/providers/oauth.ts +0 -114
  525. package/src/lib/nextauth-secret.ts +0 -121
  526. package/src/types/next-auth.d.ts +0 -15
@@ -1,261 +0,0 @@
1
- "use strict";
2
- /**
3
- * Role Management Admin Page (/admin/roles)
4
- *
5
- * Design: Aurum (DESIGN_SPEC.md)
6
- * Three sections:
7
- * 1. Available Roles — Cards showing SiteAdmin, ClientAdmin
8
- * 2. User Assignments — Table with inline role dropdowns
9
- * 3. Change History — Audit log of role changes
10
- *
11
- * Design Principles:
12
- * - No shadows, gradients, or animation
13
- * - One accent color (blue #0066cc)
14
- * - Inline interactions (no modals)
15
- * - Scan-friendly tables and lists
16
- */
17
- 'use client';
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.default = RolesAdminPage;
20
- const jsx_runtime_1 = require("react/jsx-runtime");
21
- const react_1 = require("react");
22
- // Mock data
23
- const MOCK_ROLES = [
24
- {
25
- id: 1,
26
- name: 'SiteAdmin',
27
- description: 'System-wide administrator. Manages all vibe_app features.',
28
- userCount: 1,
29
- lastChanged: '3/10/2026 by Admin',
30
- },
31
- {
32
- id: 2,
33
- name: 'ClientAdmin',
34
- description: 'Resume admin for Ideal Resume. Manages users, resumes, audit logs.',
35
- userCount: 2,
36
- lastChanged: '3/9/2026 by Admin',
37
- },
38
- ];
39
- const MOCK_USERS = [
40
- { id: 1, email: 'alice@example.com', role: 'ClientAdmin', assigned: '3/10/2026' },
41
- { id: 2, email: 'bob@example.com', role: 'SiteAdmin', assigned: '2/28/2026' },
42
- { id: 3, email: 'carol@example.com', role: null, assigned: null },
43
- { id: 4, email: 'dave@example.com', role: 'ClientAdmin', assigned: '3/5/2026' },
44
- { id: 5, email: 'eve@example.com', role: 'ClientAdmin', assigned: '3/8/2026' },
45
- ];
46
- const MOCK_CHANGES = [
47
- { timestamp: '3/10/2026, 10:15 AM', event: 'Alice assigned to ClientAdmin by Admin User' },
48
- { timestamp: '3/9/2026, 2:30 PM', event: 'Bob assigned to SiteAdmin by Admin User' },
49
- { timestamp: '3/8/2026, 4:45 PM', event: 'Carol removed from ClientAdmin by Admin User' },
50
- { timestamp: '3/8/2026, 3:00 PM', event: 'SiteAdmin edited: Description changed by Admin User' },
51
- ];
52
- function RolesAdminPage() {
53
- const [users, setUsers] = (0, react_1.useState)(MOCK_USERS);
54
- const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
55
- const [editingUserId, setEditingUserId] = (0, react_1.useState)(null);
56
- const [tempRole, setTempRole] = (0, react_1.useState)(null);
57
- const [message, setMessage] = (0, react_1.useState)(null);
58
- const filteredUsers = users.filter((u) => u.email.toLowerCase().includes(searchQuery.toLowerCase()));
59
- const handleEditRole = (userId, currentRole) => {
60
- setEditingUserId(userId);
61
- setTempRole(currentRole);
62
- };
63
- const handleSaveRole = (userId) => {
64
- setUsers((prev) => prev.map((u) => u.id === userId ? { ...u, role: tempRole, assigned: '3/10/2026' } : u));
65
- setMessage(`Role updated`);
66
- setEditingUserId(null);
67
- setTimeout(() => setMessage(null), 3000);
68
- };
69
- const handleRemoveRole = (userId) => {
70
- setUsers((prev) => prev.map((u) => (u.id === userId ? { ...u, role: null, assigned: null } : u)));
71
- setMessage(`Role removed`);
72
- setTimeout(() => setMessage(null), 3000);
73
- };
74
- return ((0, jsx_runtime_1.jsx)("div", { style: { background: '#f8f8f8', minHeight: '100vh', padding: '40px 20px' }, children: (0, jsx_runtime_1.jsxs)("div", { style: { maxWidth: '1200px', margin: '0 auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { marginBottom: '40px' }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
75
- fontSize: '32px',
76
- fontWeight: 400,
77
- color: '#333',
78
- marginBottom: '8px',
79
- }, children: "Role Management" }), (0, jsx_runtime_1.jsx)("p", { style: { fontSize: '16px', color: '#666', fontWeight: 400 }, children: "Manage who has access to what role" })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '60px' }, children: [(0, jsx_runtime_1.jsx)("h2", { style: {
80
- fontSize: '18px',
81
- fontWeight: 400,
82
- color: '#666',
83
- marginBottom: '24px',
84
- textTransform: 'uppercase',
85
- letterSpacing: '1px',
86
- }, children: "Available Roles" }), (0, jsx_runtime_1.jsx)("div", { style: {
87
- display: 'grid',
88
- gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))',
89
- gap: '24px',
90
- }, children: MOCK_ROLES.map((role) => ((0, jsx_runtime_1.jsxs)("div", { style: {
91
- background: 'white',
92
- border: '1px solid #e0e0e0',
93
- borderRadius: '6px',
94
- padding: '20px',
95
- display: 'flex',
96
- flexDirection: 'column',
97
- transition: 'all 0.2s ease',
98
- cursor: 'default',
99
- }, onMouseEnter: (e) => {
100
- e.currentTarget.style.background = '#f9f9f9';
101
- e.currentTarget.style.borderColor = '#d0d0d0';
102
- }, onMouseLeave: (e) => {
103
- e.currentTarget.style.background = 'white';
104
- e.currentTarget.style.borderColor = '#e0e0e0';
105
- }, children: [(0, jsx_runtime_1.jsx)("h3", { style: {
106
- fontSize: '18px',
107
- fontWeight: 600,
108
- color: '#333',
109
- marginBottom: '8px',
110
- }, children: role.name }), (0, jsx_runtime_1.jsx)("p", { style: {
111
- fontSize: '14px',
112
- color: '#666',
113
- marginBottom: '16px',
114
- flex: 1,
115
- lineHeight: 1.6,
116
- }, children: role.description }), (0, jsx_runtime_1.jsxs)("div", { style: { marginBottom: '16px' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '12px', color: '#999' }, children: ["Users: ", role.userCount] }), (0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '12px', color: '#999' }, children: ["Last changed: ", role.lastChanged] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [(0, jsx_runtime_1.jsx)("button", { style: {
117
- padding: '8px 16px',
118
- fontSize: '13px',
119
- background: '#0066cc',
120
- color: 'white',
121
- border: 'none',
122
- borderRadius: '4px',
123
- cursor: 'pointer',
124
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#0052a3'), onMouseLeave: (e) => (e.currentTarget.style.background = '#0066cc'), children: "Edit" }), (0, jsx_runtime_1.jsx)("button", { style: {
125
- padding: '8px 16px',
126
- fontSize: '13px',
127
- background: 'white',
128
- color: '#333',
129
- border: '1px solid #e0e0e0',
130
- borderRadius: '4px',
131
- cursor: 'pointer',
132
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "Remove" })] })] }, role.id))) })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '60px' }, children: [(0, jsx_runtime_1.jsx)("h2", { style: {
133
- fontSize: '18px',
134
- fontWeight: 400,
135
- color: '#666',
136
- marginBottom: '24px',
137
- textTransform: 'uppercase',
138
- letterSpacing: '1px',
139
- }, children: "User Assignments" }), (0, jsx_runtime_1.jsx)("div", { style: { marginBottom: '24px' }, children: (0, jsx_runtime_1.jsx)("input", { type: "text", placeholder: "Search users...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), style: {
140
- width: '100%',
141
- padding: '10px 14px',
142
- fontSize: '14px',
143
- border: '1px solid #e0e0e0',
144
- borderRadius: '4px',
145
- background: 'white',
146
- boxSizing: 'border-box',
147
- } }) }), message && ((0, jsx_runtime_1.jsxs)("div", { style: {
148
- padding: '8px 12px',
149
- background: '#e8f5e9',
150
- color: '#2e7d32',
151
- borderRadius: '4px',
152
- marginBottom: '12px',
153
- fontSize: '13px',
154
- }, children: ["\u2713 ", message] })), (0, jsx_runtime_1.jsxs)("table", { style: {
155
- width: '100%',
156
- borderCollapse: 'collapse',
157
- background: 'white',
158
- border: '1px solid #e0e0e0',
159
- borderRadius: '4px',
160
- overflow: 'hidden',
161
- }, children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsxs)("tr", { style: { background: '#f8f8f8', borderBottom: '1px solid #e0e0e0' }, children: [(0, jsx_runtime_1.jsx)("th", { style: {
162
- padding: '16px',
163
- textAlign: 'left',
164
- fontSize: '12px',
165
- color: '#999',
166
- textTransform: 'uppercase',
167
- letterSpacing: '0.5px',
168
- fontWeight: 'normal',
169
- }, children: "User" }), (0, jsx_runtime_1.jsx)("th", { style: {
170
- padding: '16px',
171
- textAlign: 'left',
172
- fontSize: '12px',
173
- color: '#999',
174
- textTransform: 'uppercase',
175
- letterSpacing: '0.5px',
176
- fontWeight: 'normal',
177
- }, children: "Role" }), (0, jsx_runtime_1.jsx)("th", { style: {
178
- padding: '16px',
179
- textAlign: 'left',
180
- fontSize: '12px',
181
- color: '#999',
182
- textTransform: 'uppercase',
183
- letterSpacing: '0.5px',
184
- fontWeight: 'normal',
185
- }, children: "Assigned" }), (0, jsx_runtime_1.jsx)("th", { style: {
186
- padding: '16px',
187
- textAlign: 'left',
188
- fontSize: '12px',
189
- color: '#999',
190
- textTransform: 'uppercase',
191
- letterSpacing: '0.5px',
192
- fontWeight: 'normal',
193
- }, children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: filteredUsers.map((user) => ((0, jsx_runtime_1.jsxs)("tr", { style: {
194
- borderBottom: '1px solid #e0e0e0',
195
- height: '48px',
196
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: [(0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '14px', color: '#333' }, children: user.email }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '14px' }, children: editingUserId === user.id ? ((0, jsx_runtime_1.jsxs)("select", { value: tempRole || '', onChange: (e) => setTempRole(e.target.value || null), style: {
197
- padding: '6px 10px',
198
- fontSize: '13px',
199
- border: '1px solid #0066cc',
200
- borderRadius: '4px',
201
- background: 'white',
202
- color: '#333',
203
- }, children: [(0, jsx_runtime_1.jsx)("option", { value: "", children: "\u2014 Remove role \u2014" }), (0, jsx_runtime_1.jsx)("option", { value: "SiteAdmin", children: "SiteAdmin" }), (0, jsx_runtime_1.jsx)("option", { value: "ClientAdmin", children: "ClientAdmin" })] })) : user.role ? ((0, jsx_runtime_1.jsx)("span", { style: {
204
- background: '#e3f2fd',
205
- color: '#0066cc',
206
- padding: '6px 10px',
207
- borderRadius: '4px',
208
- fontSize: '13px',
209
- display: 'inline-block',
210
- }, children: user.role })) : ((0, jsx_runtime_1.jsx)("span", { style: { color: '#999', fontStyle: 'italic' }, children: "(none)" })) }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '12px', color: '#999' }, children: user.assigned || '—' }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '13px' }, children: editingUserId === user.id ? ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => handleSaveRole(user.id), style: {
211
- padding: '6px 12px',
212
- background: '#0066cc',
213
- color: 'white',
214
- border: 'none',
215
- borderRadius: '4px',
216
- cursor: 'pointer',
217
- fontSize: '12px',
218
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#0052a3'), onMouseLeave: (e) => (e.currentTarget.style.background = '#0066cc'), children: "Save" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setEditingUserId(null), style: {
219
- padding: '6px 12px',
220
- background: 'white',
221
- color: '#333',
222
- border: '1px solid #e0e0e0',
223
- borderRadius: '4px',
224
- cursor: 'pointer',
225
- fontSize: '12px',
226
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "Cancel" })] })) : ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [user.role && ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRole(user.id, user.role), style: {
227
- padding: '6px 10px',
228
- background: 'white',
229
- color: '#0066cc',
230
- border: '1px solid #e0e0e0',
231
- borderRadius: '4px',
232
- cursor: 'pointer',
233
- fontSize: '12px',
234
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "\u2193" })), !user.role ? ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRole(user.id, null), style: {
235
- padding: '6px 10px',
236
- background: 'white',
237
- color: '#0066cc',
238
- border: '1px solid #e0e0e0',
239
- borderRadius: '4px',
240
- cursor: 'pointer',
241
- fontSize: '12px',
242
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "+" })) : ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleRemoveRole(user.id), style: {
243
- padding: '6px 10px',
244
- background: 'white',
245
- color: '#cc0000',
246
- border: '1px solid #e0e0e0',
247
- borderRadius: '4px',
248
- cursor: 'pointer',
249
- fontSize: '12px',
250
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#fff0f0'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "\u2715" }))] })) })] }, user.id))) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { marginTop: '12px', fontSize: '12px', color: '#999' }, children: [filteredUsers.length, " of ", users.length, " users shown"] })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { children: [(0, jsx_runtime_1.jsx)("h2", { style: {
251
- fontSize: '18px',
252
- fontWeight: 400,
253
- color: '#666',
254
- marginBottom: '24px',
255
- textTransform: 'uppercase',
256
- letterSpacing: '1px',
257
- }, children: "Recent Changes" }), (0, jsx_runtime_1.jsx)("div", { style: { background: 'white', border: '1px solid #e0e0e0', borderRadius: '4px' }, children: MOCK_CHANGES.map((change, idx) => ((0, jsx_runtime_1.jsxs)("div", { style: {
258
- padding: '16px',
259
- borderBottom: idx < MOCK_CHANGES.length - 1 ? '1px solid #e0e0e0' : 'none',
260
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { fontSize: '12px', color: '#999', marginBottom: '4px' }, children: change.timestamp }), (0, jsx_runtime_1.jsx)("div", { style: { fontSize: '14px', color: '#333' }, children: change.event })] }, idx))) })] })] }) }));
261
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Admin Roles Page exports
3
- *
4
- * - RolesAdminPage: Read-only admin interface for viewing roles and permissions (/admin/roles)
5
- *
6
- * MVP scope: Role creation/editing deferred to post-MVP.
7
- */
8
- export { default as RolesAdminPage } from './RolesAdminPage';
@@ -1,15 +0,0 @@
1
- "use strict";
2
- /**
3
- * Admin Roles Page exports
4
- *
5
- * - RolesAdminPage: Read-only admin interface for viewing roles and permissions (/admin/roles)
6
- *
7
- * MVP scope: Role creation/editing deferred to post-MVP.
8
- */
9
- var __importDefault = (this && this.__importDefault) || function (mod) {
10
- return (mod && mod.__esModule) ? mod : { "default": mod };
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.RolesAdminPage = void 0;
14
- var RolesAdminPage_1 = require("./RolesAdminPage");
15
- Object.defineProperty(exports, "RolesAdminPage", { enumerable: true, get: function () { return __importDefault(RolesAdminPage_1).default; } });
@@ -1,72 +0,0 @@
1
- /**
2
- * Admin Role Modals for @payez/next-mvp
3
- *
4
- * - RoleEditorModal: Create/edit roles with permissions
5
- * - UserRoleAssignerModal: Assign roles to users
6
- *
7
- * Security Addendum implemented:
8
- * - Role name validation (3-50 chars, lowercase alphanumeric + underscore, no payez_ prefix)
9
- * - Last admin warning
10
- * - IDP roles read-only
11
- * - Self-assignment warning
12
- *
13
- * @see docs/specs/ROLES_MANAGEMENT_SPEC.md
14
- */
15
- interface PagePermission {
16
- page_permission_id: number;
17
- route_pattern: string;
18
- display_name: string;
19
- requires_2fa: boolean;
20
- }
21
- interface Role {
22
- role_id?: number;
23
- role_name: string;
24
- display_name?: string;
25
- description?: string;
26
- page_permissions?: string[];
27
- requires_2fa?: boolean;
28
- is_system_role?: boolean;
29
- }
30
- interface User {
31
- user_id: number;
32
- email: string;
33
- full_name?: string;
34
- roles: {
35
- idp: string[];
36
- app: string[];
37
- };
38
- }
39
- /**
40
- * RoleEditorModal - Create or edit a role
41
- */
42
- export declare function RoleEditorModal({ role, pagePermissions, adminAccessiblePages, onSave, onClose, isDark, }: {
43
- role?: Role;
44
- pagePermissions: PagePermission[];
45
- adminAccessiblePages?: string[];
46
- onSave: (data: {
47
- role_name: string;
48
- display_name?: string;
49
- description?: string;
50
- page_permissions: string[];
51
- requires_2fa: boolean;
52
- }) => Promise<void>;
53
- onClose: () => void;
54
- isDark?: boolean;
55
- }): import("react/jsx-runtime").JSX.Element;
56
- /**
57
- * UserRoleAssignerModal - Assign roles to a user
58
- */
59
- export declare function UserRoleAssignerModal({ user, availableRoles, isLastAdmin, currentUserId, onSave, onClose, isDark, }: {
60
- user: User;
61
- availableRoles: {
62
- role_name: string;
63
- display_name?: string;
64
- description?: string;
65
- }[];
66
- isLastAdmin?: boolean;
67
- currentUserId?: number;
68
- onSave: (userId: number, appRoles: string[]) => Promise<void>;
69
- onClose: () => void;
70
- isDark?: boolean;
71
- }): import("react/jsx-runtime").JSX.Element;
72
- export {};
@@ -1,154 +0,0 @@
1
- "use strict";
2
- /**
3
- * Admin Role Modals for @payez/next-mvp
4
- *
5
- * - RoleEditorModal: Create/edit roles with permissions
6
- * - UserRoleAssignerModal: Assign roles to users
7
- *
8
- * Security Addendum implemented:
9
- * - Role name validation (3-50 chars, lowercase alphanumeric + underscore, no payez_ prefix)
10
- * - Last admin warning
11
- * - IDP roles read-only
12
- * - Self-assignment warning
13
- *
14
- * @see docs/specs/ROLES_MANAGEMENT_SPEC.md
15
- */
16
- 'use client';
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.RoleEditorModal = RoleEditorModal;
19
- exports.UserRoleAssignerModal = UserRoleAssignerModal;
20
- const jsx_runtime_1 = require("react/jsx-runtime");
21
- const react_1 = require("react");
22
- // ============================================================================
23
- // VALIDATION
24
- // ============================================================================
25
- // Role name validation (Security Addendum)
26
- function validateRoleName(name) {
27
- if (!name)
28
- return { valid: false, error: 'Role name is required' };
29
- if (name.length < 3)
30
- return { valid: false, error: 'Role name must be at least 3 characters' };
31
- if (name.length > 50)
32
- return { valid: false, error: 'Role name must be at most 50 characters' };
33
- if (!/^[a-z0-9_]+$/.test(name))
34
- return { valid: false, error: 'Only lowercase letters, numbers, and underscores allowed' };
35
- if (name.startsWith('payez_'))
36
- return { valid: false, error: 'Role name cannot start with "payez_"' };
37
- return { valid: true };
38
- }
39
- // ============================================================================
40
- // ROLE EDITOR MODAL
41
- // ============================================================================
42
- /**
43
- * RoleEditorModal - Create or edit a role
44
- */
45
- function RoleEditorModal({ role, pagePermissions, adminAccessiblePages, onSave, onClose, isDark = true, }) {
46
- const isEditing = !!role?.role_id;
47
- // Form state
48
- const [roleName, setRoleName] = (0, react_1.useState)(role?.role_name || '');
49
- const [displayName, setDisplayName] = (0, react_1.useState)(role?.display_name || '');
50
- const [description, setDescription] = (0, react_1.useState)(role?.description || '');
51
- const [selectedPermissions, setSelectedPermissions] = (0, react_1.useState)(role?.page_permissions || []);
52
- const [requires2FA, setRequires2FA] = (0, react_1.useState)(role?.requires_2fa || false);
53
- const [error, setError] = (0, react_1.useState)('');
54
- const [saving, setSaving] = (0, react_1.useState)(false);
55
- // Role name validation
56
- const [nameValidation, setNameValidation] = (0, react_1.useState)({ valid: true });
57
- (0, react_1.useEffect)(() => {
58
- if (!isEditing && roleName) {
59
- setNameValidation(validateRoleName(roleName));
60
- }
61
- }, [roleName, isEditing]);
62
- // Filter permissions based on admin access (Security Addendum)
63
- const availablePermissions = adminAccessiblePages
64
- ? pagePermissions.filter((p) => adminAccessiblePages.some((ap) => p.route_pattern.startsWith(ap.replace('*', ''))))
65
- : pagePermissions;
66
- const handleSubmit = async (e) => {
67
- e.preventDefault();
68
- setError('');
69
- if (!isEditing) {
70
- const validation = validateRoleName(roleName);
71
- if (!validation.valid) {
72
- setError(validation.error || 'Invalid role name');
73
- return;
74
- }
75
- }
76
- try {
77
- setSaving(true);
78
- await onSave({
79
- role_name: roleName,
80
- display_name: displayName || undefined,
81
- description: description || undefined,
82
- page_permissions: selectedPermissions,
83
- requires_2fa: requires2FA,
84
- });
85
- onClose();
86
- }
87
- catch (err) {
88
- setError(err instanceof Error ? err.message : 'Failed to save role');
89
- }
90
- finally {
91
- setSaving(false);
92
- }
93
- };
94
- const togglePermission = (pattern) => {
95
- setSelectedPermissions((prev) => prev.includes(pattern) ? prev.filter((p) => p !== pattern) : [...prev, pattern]);
96
- };
97
- // Theme colors
98
- const modalBg = isDark ? 'bg-slate-800' : 'bg-white';
99
- const borderColor = isDark ? 'border-slate-700' : 'border-gray-200';
100
- const textPrimary = isDark ? 'text-white' : 'text-gray-900';
101
- const textMuted = isDark ? 'text-slate-400' : 'text-gray-500';
102
- const inputBg = isDark ? 'bg-slate-700' : 'bg-white';
103
- const inputBorder = isDark ? 'border-slate-600' : 'border-gray-300';
104
- return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-lg mx-4 rounded-lg shadow-xl ${modalBg} border ${borderColor} max-h-[90vh] overflow-hidden flex flex-col`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-b ${borderColor} flex items-center justify-between`, children: [(0, jsx_runtime_1.jsx)("h3", { className: `text-lg font-semibold ${textPrimary}`, children: isEditing ? `Edit Role: ${role?.role_name}` : 'Create New Role' }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, className: textMuted, children: (0, jsx_runtime_1.jsx)("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "flex-1 overflow-y-auto", children: [(0, jsx_runtime_1.jsxs)("div", { className: "px-6 py-4 space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: ["Role Name ", (0, jsx_runtime_1.jsx)("span", { className: "text-red-500", children: "*" })] }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: roleName, onChange: (e) => setRoleName(e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, '')), disabled: isEditing, className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary} ${isEditing ? 'opacity-50 cursor-not-allowed' : ''} font-mono`, placeholder: "e.g., content_editor" }), !isEditing && roleName && !nameValidation.valid && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-red-500", children: nameValidation.error })), !isEditing && ((0, jsx_runtime_1.jsx)("p", { className: `mt-1 text-xs ${textMuted}`, children: "3-50 characters, lowercase letters, numbers, underscores only" }))] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: "Display Name" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: displayName, onChange: (e) => setDisplayName(e.target.value), className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary}`, placeholder: "e.g., Content Editor" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: "Description" }), (0, jsx_runtime_1.jsx)("textarea", { value: description, onChange: (e) => setDescription(e.target.value), rows: 2, className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary}`, placeholder: "What does this role do?" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Page Permissions" }), (0, jsx_runtime_1.jsx)("div", { className: `border ${borderColor} rounded-md max-h-48 overflow-y-auto`, children: availablePermissions.length === 0 ? ((0, jsx_runtime_1.jsx)("p", { className: `p-3 text-sm ${textMuted}`, children: "No page permissions available" })) : (availablePermissions.map((perm) => ((0, jsx_runtime_1.jsxs)("label", { className: `flex items-center px-3 py-2 border-b last:border-b-0 ${borderColor} cursor-pointer hover:${isDark ? 'bg-slate-700' : 'bg-gray-50'}`, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: selectedPermissions.includes(perm.route_pattern), onChange: () => togglePermission(perm.route_pattern), className: "mr-3" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("span", { className: `font-mono text-sm ${textPrimary}`, children: perm.route_pattern }), perm.display_name && ((0, jsx_runtime_1.jsx)("span", { className: `block text-xs ${textMuted}`, children: perm.display_name }))] })] }, perm.page_permission_id)))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `border-t ${borderColor} pt-4`, children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Security Options" }), (0, jsx_runtime_1.jsxs)("label", { className: "flex items-center cursor-pointer", children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: requires2FA, onChange: (e) => setRequires2FA(e.target.checked), className: "mr-3" }), (0, jsx_runtime_1.jsx)("span", { className: textPrimary, children: "Requires 2FA for all pages" })] })] }), error && ((0, jsx_runtime_1.jsx)("div", { className: "bg-red-900/30 border border-red-600 rounded-lg p-3", children: (0, jsx_runtime_1.jsx)("p", { className: "text-red-400 text-sm", children: error }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-t ${borderColor} flex justify-end gap-3`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: `px-4 py-2 rounded-md border ${borderColor} ${textMuted}`, children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: saving || (!isEditing && !nameValidation.valid), className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50", children: saving ? 'Saving...' : isEditing ? 'Save Changes' : 'Create Role' })] })] })] }) }));
105
- }
106
- // ============================================================================
107
- // USER ROLE ASSIGNER MODAL
108
- // ============================================================================
109
- /**
110
- * UserRoleAssignerModal - Assign roles to a user
111
- */
112
- function UserRoleAssignerModal({ user, availableRoles, isLastAdmin, currentUserId, onSave, onClose, isDark = true, }) {
113
- const [selectedRoles, setSelectedRoles] = (0, react_1.useState)(user.roles.app);
114
- const [saving, setSaving] = (0, react_1.useState)(false);
115
- const [error, setError] = (0, react_1.useState)('');
116
- const handleSubmit = async (e) => {
117
- e.preventDefault();
118
- setError('');
119
- // Security: Self-assignment warning
120
- if (user.user_id === currentUserId) {
121
- if (!confirm('You are modifying your own roles. Changes take effect on next login. Continue?')) {
122
- return;
123
- }
124
- }
125
- // Security Addendum: Last admin warning
126
- const hadAdmin = user.roles.app.some((r) => r.includes('admin'));
127
- const hasAdmin = selectedRoles.some((r) => r.includes('admin'));
128
- if (hadAdmin && !hasAdmin && isLastAdmin) {
129
- if (!confirm('Warning: This is the last administrator. Removing admin access will lock out admin access. Continue?')) {
130
- return;
131
- }
132
- }
133
- try {
134
- setSaving(true);
135
- await onSave(user.user_id, selectedRoles);
136
- onClose();
137
- }
138
- catch (err) {
139
- setError(err instanceof Error ? err.message : 'Failed to update roles');
140
- }
141
- finally {
142
- setSaving(false);
143
- }
144
- };
145
- const toggleRole = (roleName) => {
146
- setSelectedRoles((prev) => prev.includes(roleName) ? prev.filter((r) => r !== roleName) : [...prev, roleName]);
147
- };
148
- // Theme colors
149
- const modalBg = isDark ? 'bg-slate-800' : 'bg-white';
150
- const borderColor = isDark ? 'border-slate-700' : 'border-gray-200';
151
- const textPrimary = isDark ? 'text-white' : 'text-gray-900';
152
- const textMuted = isDark ? 'text-slate-400' : 'text-gray-500';
153
- return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-md mx-4 rounded-lg shadow-xl ${modalBg} border ${borderColor}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-b ${borderColor} flex items-center justify-between`, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h3", { className: `text-lg font-semibold ${textPrimary}`, children: "Edit Roles" }), (0, jsx_runtime_1.jsx)("p", { className: `text-sm ${textMuted}`, children: user.full_name || user.email })] }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, className: textMuted, children: (0, jsx_runtime_1.jsx)("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, children: [(0, jsx_runtime_1.jsxs)("div", { className: "px-6 py-4 space-y-4", children: [user.roles.idp.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: ["IDP Roles (read-only)", (0, jsx_runtime_1.jsx)("svg", { className: "inline w-4 h-4 ml-1", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-1", children: user.roles.idp.map((role) => ((0, jsx_runtime_1.jsxs)("div", { className: `flex items-center px-3 py-2 rounded ${isDark ? 'bg-slate-700/50' : 'bg-gray-100'}`, children: [(0, jsx_runtime_1.jsx)("span", { className: textMuted, children: role }), (0, jsx_runtime_1.jsx)("span", { className: `ml-auto text-xs ${textMuted}`, children: "assigned by IDP" })] }, role))) })] })), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Application Roles" }), (0, jsx_runtime_1.jsx)("div", { className: `border ${borderColor} rounded-md`, children: availableRoles.map((role) => ((0, jsx_runtime_1.jsxs)("label", { className: `flex items-start px-3 py-2 border-b last:border-b-0 ${borderColor} cursor-pointer hover:${isDark ? 'bg-slate-700' : 'bg-gray-50'}`, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: selectedRoles.includes(role.role_name), onChange: () => toggleRole(role.role_name), className: "mt-1 mr-3" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("span", { className: textPrimary, children: role.display_name || role.role_name }), role.description && ((0, jsx_runtime_1.jsx)("span", { className: `block text-xs ${textMuted}`, children: role.description }))] })] }, role.role_name))) })] }), error && ((0, jsx_runtime_1.jsx)("div", { className: "bg-red-900/30 border border-red-600 rounded-lg p-3", children: (0, jsx_runtime_1.jsx)("p", { className: "text-red-400 text-sm", children: error }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-t ${borderColor} flex justify-end gap-3`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: `px-4 py-2 rounded-md border ${borderColor} ${textMuted}`, children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: saving, className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50", children: saving ? 'Saving...' : 'Save Changes' })] })] })] }) }));
154
- }
@@ -1,79 +0,0 @@
1
- /**
2
- * =============================================================================
3
- * CLIENT SITE ADMIN - Your App's Admin Dashboard
4
- * =============================================================================
5
- *
6
- * This is the foundation for YOUR app-specific admin area.
7
- * The MVP admin (/admin) handles membership - this handles YOUR data.
8
- *
9
- * SEPARATION OF CONCERNS:
10
- * ┌─────────────────────────────────────────────────────────────────────┐
11
- * │ /admin (MVP Admin) │ /admin/[your-area] (This) │
12
- * │ ───────────────── │ ──────────────────────── │
13
- * │ • User authentication │ • Your app's collections │
14
- * │ • Sessions management │ • Your app's features │
15
- * │ • Role assignments │ • Content moderation │
16
- * │ • Tier/subscription mgmt │ • App-specific analytics │
17
- * │ • Site-wide analytics │ • Custom admin tools │
18
- * │ • vibe_app collection │ • your_app collection │
19
- * └─────────────────────────────────────────────────────────────────────┘
20
- *
21
- * USAGE:
22
- * ```tsx
23
- * // app/admin/your-area/page.tsx
24
- * import { ClientSiteAdminPage } from '@payez/next-mvp/pages/client-admin';
25
- *
26
- * export default function YourAdminPage() {
27
- * return (
28
- * <ClientSiteAdminPage
29
- * title="Your Admin"
30
- * subtitle="Manage your app data"
31
- * collectionName="your_collection"
32
- * tabs={[
33
- * { id: 'overview', label: 'Overview', icon: '📊' },
34
- * { id: 'items', label: 'Items', icon: '📦', table: 'items' },
35
- * ]}
36
- * renderTabContent={(tab, data) => <YourCustomContent />}
37
- * />
38
- * );
39
- * }
40
- * ```
41
- *
42
- * =============================================================================
43
- */
44
- import React from 'react';
45
- export interface ClientAdminTab {
46
- id: string;
47
- label: string;
48
- icon: string;
49
- table?: string;
50
- }
51
- export interface TableStats {
52
- table: string;
53
- count: number;
54
- label: string;
55
- }
56
- export interface ClientSiteAdminProps {
57
- /** Admin area title */
58
- title: string;
59
- /** Subtitle shown under title */
60
- subtitle?: string;
61
- /** Vibe collection name for this admin area */
62
- collectionName: string;
63
- /** Tabs to display */
64
- tabs: ClientAdminTab[];
65
- /** Roles that can access (defaults to vibe_app_admin) */
66
- allowedRoles?: string[];
67
- /** Custom overview content renderer */
68
- renderOverview?: (stats: TableStats[]) => React.ReactNode;
69
- /** Custom tab content renderer */
70
- renderTabContent?: (tab: ClientAdminTab, data: any[], loading: boolean) => React.ReactNode;
71
- /** Theme detection function (optional) */
72
- isDark?: boolean;
73
- /** Back link URL (defaults to /) */
74
- backUrl?: string;
75
- /** Back link label (defaults to "Back to Site") */
76
- backLabel?: string;
77
- }
78
- export declare function ClientSiteAdminPage({ title, subtitle, collectionName, tabs, allowedRoles, renderOverview, renderTabContent, isDark: isDarkProp, backUrl, backLabel, }: ClientSiteAdminProps): import("react/jsx-runtime").JSX.Element | null;
79
- export default ClientSiteAdminPage;