@hexclave/next 1.0.0 → 1.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 (365) hide show
  1. package/README.md +7 -23
  2. package/dist/components/api-key-dialogs.js +18 -18
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/api-key-table.js +19 -19
  5. package/dist/components/api-key-table.js.map +1 -1
  6. package/dist/components/credential-sign-in.js +12 -12
  7. package/dist/components/credential-sign-in.js.map +1 -1
  8. package/dist/components/credential-sign-up.js +19 -19
  9. package/dist/components/credential-sign-up.js.map +1 -1
  10. package/dist/components/elements/separator-with-text.js +3 -3
  11. package/dist/components/elements/separator-with-text.js.map +1 -1
  12. package/dist/components/elements/sidebar-layout.js +15 -15
  13. package/dist/components/elements/sidebar-layout.js.map +1 -1
  14. package/dist/components/elements/user-avatar.js +3 -3
  15. package/dist/components/elements/user-avatar.js.map +1 -1
  16. package/dist/components/link.js +2 -2
  17. package/dist/components/link.js.map +1 -1
  18. package/dist/components/magic-link-sign-in.js +17 -17
  19. package/dist/components/magic-link-sign-in.js.map +1 -1
  20. package/dist/components/message-cards/known-error-message-card.js +2 -2
  21. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  22. package/dist/components/message-cards/message-card.js +4 -4
  23. package/dist/components/message-cards/message-card.js.map +1 -1
  24. package/dist/components/message-cards/predefined-message-card.js +2 -2
  25. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  26. package/dist/components/oauth-button.js +15 -15
  27. package/dist/components/oauth-button.js.map +1 -1
  28. package/dist/components/passkey-button.js +2 -2
  29. package/dist/components/passkey-button.js.map +1 -1
  30. package/dist/components/profile-image-editor.js +9 -9
  31. package/dist/components/profile-image-editor.js.map +1 -1
  32. package/dist/components/selected-team-switcher.js +4 -4
  33. package/dist/components/selected-team-switcher.js.map +1 -1
  34. package/dist/components/team-icon.js +4 -4
  35. package/dist/components/team-icon.js.map +1 -1
  36. package/dist/components/team-switcher.js +21 -21
  37. package/dist/components/team-switcher.js.map +1 -1
  38. package/dist/components/user-button.js +13 -13
  39. package/dist/components/user-button.js.map +1 -1
  40. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +32 -32
  41. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  42. package/dist/components-page/account-settings/api-keys/api-keys-page.js +2 -2
  43. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  44. package/dist/components-page/account-settings/editable-text.js +5 -5
  45. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  46. package/dist/components-page/account-settings/email-and-auth/emails-section.js +22 -22
  47. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  48. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +17 -17
  49. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  50. package/dist/components-page/account-settings/email-and-auth/otp-section.js +9 -9
  51. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  52. package/dist/components-page/account-settings/email-and-auth/passkey-section.js +9 -9
  53. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  54. package/dist/components-page/account-settings/email-and-auth/password-section.js +23 -23
  55. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  56. package/dist/components-page/account-settings/notifications/notifications-page.js +6 -6
  57. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  58. package/dist/components-page/account-settings/payments/payments-panel.js +52 -52
  59. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
  60. package/dist/components-page/account-settings/section.js +4 -4
  61. package/dist/components-page/account-settings/section.js.map +1 -1
  62. package/dist/components-page/account-settings/settings/delete-account-section.js +7 -7
  63. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  64. package/dist/components-page/account-settings/settings/sign-out-section.js +2 -2
  65. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  66. package/dist/components-page/account-settings/teams/leave-team-section.js +5 -5
  67. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  68. package/dist/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  69. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  70. package/dist/components-page/account-settings/teams/team-creation-page.js +7 -7
  71. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  72. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +20 -20
  73. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  74. package/dist/components-page/account-settings/teams/team-member-list-section.js +5 -5
  75. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  76. package/dist/components-page/account-settings.js +22 -22
  77. package/dist/components-page/account-settings.js.map +1 -1
  78. package/dist/components-page/auth-page.js +23 -23
  79. package/dist/components-page/auth-page.js.map +1 -1
  80. package/dist/components-page/cli-auth-confirm.js +9 -9
  81. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  82. package/dist/components-page/cli-auth-confirm.test.js +4 -4
  83. package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
  84. package/dist/components-page/email-verification.js +6 -6
  85. package/dist/components-page/email-verification.js.map +1 -1
  86. package/dist/components-page/error-page.js +11 -11
  87. package/dist/components-page/error-page.js.map +1 -1
  88. package/dist/components-page/forgot-password.js +11 -11
  89. package/dist/components-page/forgot-password.js.map +1 -1
  90. package/dist/components-page/magic-link-callback.js +8 -8
  91. package/dist/components-page/magic-link-callback.js.map +1 -1
  92. package/dist/components-page/mfa.js +13 -13
  93. package/dist/components-page/mfa.js.map +1 -1
  94. package/dist/components-page/oauth-callback.js +9 -9
  95. package/dist/components-page/oauth-callback.js.map +1 -1
  96. package/dist/components-page/onboarding.js +11 -11
  97. package/dist/components-page/onboarding.js.map +1 -1
  98. package/dist/components-page/password-reset.js +27 -27
  99. package/dist/components-page/password-reset.js.map +1 -1
  100. package/dist/components-page/section.js +1 -1
  101. package/dist/components-page/sign-out.js +4 -4
  102. package/dist/components-page/sign-out.js.map +1 -1
  103. package/dist/components-page/stack-handler-client.js +9 -9
  104. package/dist/components-page/stack-handler-client.js.map +1 -1
  105. package/dist/components-page/stack-handler.d.ts +14 -9
  106. package/dist/components-page/stack-handler.d.ts.map +1 -1
  107. package/dist/components-page/stack-handler.js +8 -2
  108. package/dist/components-page/stack-handler.js.map +1 -1
  109. package/dist/components-page/team-creation.js +9 -9
  110. package/dist/components-page/team-creation.js.map +1 -1
  111. package/dist/components-page/team-invitation.js +20 -20
  112. package/dist/components-page/team-invitation.js.map +1 -1
  113. package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
  114. package/dist/dev-tool/dev-tool-core.js +25 -25
  115. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  116. package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -1
  117. package/dist/dev-tool/index.js +6 -6
  118. package/dist/dev-tool/index.js.map +1 -1
  119. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  120. package/dist/esm/components/api-key-table.js.map +1 -1
  121. package/dist/esm/components/credential-sign-in.js.map +1 -1
  122. package/dist/esm/components/credential-sign-up.js.map +1 -1
  123. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  124. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  125. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  126. package/dist/esm/components/link.js.map +1 -1
  127. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  128. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  129. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  130. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  131. package/dist/esm/components/oauth-button.js.map +1 -1
  132. package/dist/esm/components/passkey-button.js.map +1 -1
  133. package/dist/esm/components/profile-image-editor.js.map +1 -1
  134. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  135. package/dist/esm/components/team-icon.js.map +1 -1
  136. package/dist/esm/components/team-switcher.js.map +1 -1
  137. package/dist/esm/components/user-button.js.map +1 -1
  138. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  139. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  140. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  141. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  142. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  143. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  144. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  145. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  146. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  147. package/dist/esm/components-page/account-settings/payments/payments-panel.js +1 -1
  148. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
  149. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  150. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  151. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  152. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  153. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  154. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  155. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  156. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  157. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  158. package/dist/esm/components-page/account-settings.js.map +1 -1
  159. package/dist/esm/components-page/auth-page.js.map +1 -1
  160. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  161. package/dist/esm/components-page/cli-auth-confirm.test.js +2 -2
  162. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
  163. package/dist/esm/components-page/email-verification.js.map +1 -1
  164. package/dist/esm/components-page/error-page.js.map +1 -1
  165. package/dist/esm/components-page/forgot-password.js.map +1 -1
  166. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  167. package/dist/esm/components-page/mfa.js.map +1 -1
  168. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  169. package/dist/esm/components-page/onboarding.js.map +1 -1
  170. package/dist/esm/components-page/password-reset.js.map +1 -1
  171. package/dist/esm/components-page/sign-out.js.map +1 -1
  172. package/dist/esm/components-page/stack-handler-client.js +2 -2
  173. package/dist/esm/components-page/stack-handler-client.js.map +1 -1
  174. package/dist/esm/components-page/stack-handler.d.ts +13 -9
  175. package/dist/esm/components-page/stack-handler.d.ts.map +1 -1
  176. package/dist/esm/components-page/stack-handler.js +5 -2
  177. package/dist/esm/components-page/stack-handler.js.map +1 -1
  178. package/dist/esm/components-page/team-creation.js.map +1 -1
  179. package/dist/esm/components-page/team-invitation.js.map +1 -1
  180. package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
  181. package/dist/esm/dev-tool/dev-tool-core.js +4 -4
  182. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  183. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +1 -1
  184. package/dist/esm/dev-tool/index.js.map +1 -1
  185. package/dist/esm/generated/global-css.d.ts +1 -1
  186. package/dist/esm/generated/global-css.js +1 -1
  187. package/dist/esm/generated/global-css.js.map +1 -1
  188. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  189. package/dist/esm/index.d.ts +5 -5
  190. package/dist/esm/index.js +5 -6
  191. package/dist/esm/integrations/convex.js.map +1 -1
  192. package/dist/esm/lib/auth.js +1 -1
  193. package/dist/esm/lib/auth.js.map +1 -1
  194. package/dist/esm/lib/auth.test.js.map +1 -1
  195. package/dist/esm/lib/cookie.js.map +1 -1
  196. package/dist/esm/lib/hooks.d.ts +11 -1
  197. package/dist/esm/lib/hooks.d.ts.map +1 -1
  198. package/dist/esm/lib/hooks.js +19 -9
  199. package/dist/esm/lib/hooks.js.map +1 -1
  200. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
  201. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
  202. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  203. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +3 -1
  204. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  205. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +3 -3
  206. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  207. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +2 -2
  208. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  209. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
  210. package/dist/esm/lib/stack-app/apps/implementations/common.js +3 -3
  211. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  212. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
  213. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
  214. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
  215. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
  216. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  217. package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
  218. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js +3 -2
  219. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
  220. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
  221. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
  222. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -0
  223. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  224. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
  225. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
  226. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -0
  227. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  228. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts +4 -0
  229. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
  230. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -0
  231. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  232. package/dist/esm/lib/stack-app/common.d.ts +1 -1
  233. package/dist/esm/lib/stack-app/common.js.map +1 -1
  234. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
  235. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
  236. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
  237. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
  238. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  239. package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
  240. package/dist/esm/lib/stack-app/url-targets.js.map +1 -1
  241. package/dist/esm/lib/stack-app/url-targets.test.js +1 -1
  242. package/dist/esm/lib/stack-app/url-targets.test.js.map +1 -1
  243. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  244. package/dist/esm/providers/stack-context.d.ts +3 -2
  245. package/dist/esm/providers/stack-context.d.ts.map +1 -1
  246. package/dist/esm/providers/stack-context.js +3 -1
  247. package/dist/esm/providers/stack-context.js.map +1 -1
  248. package/dist/esm/providers/stack-provider-client.js.map +1 -1
  249. package/dist/esm/providers/stack-provider.d.ts +5 -1
  250. package/dist/esm/providers/stack-provider.d.ts.map +1 -1
  251. package/dist/esm/providers/stack-provider.js +5 -1
  252. package/dist/esm/providers/stack-provider.js.map +1 -1
  253. package/dist/esm/providers/theme-provider.d.ts +6 -2
  254. package/dist/esm/providers/theme-provider.d.ts.map +1 -1
  255. package/dist/esm/providers/theme-provider.js +6 -2
  256. package/dist/esm/providers/theme-provider.js.map +1 -1
  257. package/dist/esm/providers/translation-provider-client.d.ts +4 -3
  258. package/dist/esm/providers/translation-provider-client.d.ts.map +1 -1
  259. package/dist/esm/providers/translation-provider-client.js +4 -2
  260. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  261. package/dist/esm/providers/translation-provider.js.map +1 -1
  262. package/dist/esm/utils/url.js.map +1 -1
  263. package/dist/generated/global-css.d.ts +1 -1
  264. package/dist/generated/global-css.js +1 -1
  265. package/dist/generated/global-css.js.map +1 -1
  266. package/dist/generated/quetzal-translations.js +16 -16
  267. package/dist/generated/quetzal-translations.js.map +1 -1
  268. package/dist/index.d.ts +6 -6
  269. package/dist/index.js +9 -12
  270. package/dist/integrations/convex/component/convex.config.d.ts +1 -1
  271. package/dist/integrations/convex.js +5 -5
  272. package/dist/integrations/convex.js.map +1 -1
  273. package/dist/lib/auth.js +12 -12
  274. package/dist/lib/auth.js.map +1 -1
  275. package/dist/lib/auth.test.js +2 -2
  276. package/dist/lib/auth.test.js.map +1 -1
  277. package/dist/lib/cookie.js +13 -13
  278. package/dist/lib/cookie.js.map +1 -1
  279. package/dist/lib/hooks.d.ts +11 -1
  280. package/dist/lib/hooks.d.ts.map +1 -1
  281. package/dist/lib/hooks.js +19 -8
  282. package/dist/lib/hooks.js.map +1 -1
  283. package/dist/lib/stack-app/api-keys/index.js +2 -2
  284. package/dist/lib/stack-app/api-keys/index.js.map +1 -1
  285. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
  286. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  287. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +39 -37
  288. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  289. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +3 -3
  290. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  291. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +213 -213
  292. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  293. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
  294. package/dist/lib/stack-app/apps/implementations/common.js +30 -30
  295. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  296. package/dist/lib/stack-app/apps/implementations/event-tracker.js +7 -7
  297. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
  298. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +3 -3
  299. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
  300. package/dist/lib/stack-app/apps/implementations/index.js +4 -4
  301. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
  302. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js +8 -8
  303. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
  304. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +70 -70
  305. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  306. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
  307. package/dist/lib/stack-app/apps/implementations/session-replay.js +13 -12
  308. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
  309. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
  310. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
  311. package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -0
  312. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  313. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
  314. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
  315. package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -0
  316. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  317. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +5 -1
  318. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
  319. package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -0
  320. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  321. package/dist/lib/stack-app/common.d.ts +1 -1
  322. package/dist/lib/stack-app/common.js.map +1 -1
  323. package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
  324. package/dist/lib/stack-app/email-templates/index.js.map +1 -1
  325. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
  326. package/dist/lib/stack-app/permissions/index.js.map +1 -1
  327. package/dist/lib/stack-app/projects/index.js.map +1 -1
  328. package/dist/lib/stack-app/teams/index.js.map +1 -1
  329. package/dist/lib/stack-app/url-targets.js +6 -6
  330. package/dist/lib/stack-app/url-targets.js.map +1 -1
  331. package/dist/lib/stack-app/url-targets.test.js +1 -1
  332. package/dist/lib/stack-app/url-targets.test.js.map +1 -1
  333. package/dist/lib/stack-app/users/index.js +3 -3
  334. package/dist/lib/stack-app/users/index.js.map +1 -1
  335. package/dist/providers/stack-context.d.ts +3 -2
  336. package/dist/providers/stack-context.d.ts.map +1 -1
  337. package/dist/providers/stack-context.js +3 -1
  338. package/dist/providers/stack-context.js.map +1 -1
  339. package/dist/providers/stack-provider-client.js +2 -2
  340. package/dist/providers/stack-provider-client.js.map +1 -1
  341. package/dist/providers/stack-provider.d.ts +6 -1
  342. package/dist/providers/stack-provider.d.ts.map +1 -1
  343. package/dist/providers/stack-provider.js +8 -1
  344. package/dist/providers/stack-provider.js.map +1 -1
  345. package/dist/providers/theme-provider.d.ts +6 -2
  346. package/dist/providers/theme-provider.d.ts.map +1 -1
  347. package/dist/providers/theme-provider.js +10 -5
  348. package/dist/providers/theme-provider.js.map +1 -1
  349. package/dist/providers/translation-provider-client.d.ts +4 -3
  350. package/dist/providers/translation-provider-client.d.ts.map +1 -1
  351. package/dist/providers/translation-provider-client.js +4 -1
  352. package/dist/providers/translation-provider-client.js.map +1 -1
  353. package/dist/providers/translation-provider.js +2 -2
  354. package/dist/providers/translation-provider.js.map +1 -1
  355. package/dist/{storage-DxMLntUt.d.ts → storage-kTmOAWHW.d.ts} +1 -1
  356. package/dist/{storage-DxMLntUt.d.ts.map → storage-kTmOAWHW.d.ts.map} +1 -1
  357. package/dist/utils/url.js +2 -2
  358. package/dist/utils/url.js.map +1 -1
  359. package/package.json +5 -5
  360. package/dist/esm/internal/deprecation-warning.d.ts +0 -1
  361. package/dist/esm/internal/deprecation-warning.js +0 -24
  362. package/dist/esm/internal/deprecation-warning.js.map +0 -1
  363. package/dist/internal/deprecation-warning.d.ts +0 -1
  364. package/dist/internal/deprecation-warning.js +0 -24
  365. package/dist/internal/deprecation-warning.js.map +0 -1
@@ -2,8 +2,8 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
  const require_chunk = require('../chunk-BE-pF4vm.js');
5
- let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
6
- let _stackframe_stack_ui = require("@hexclave/ui");
5
+ let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
6
+ let _hexclave_ui = require("@hexclave/ui");
7
7
  let react = require("react");
8
8
  react = require_chunk.__toESM(react);
9
9
  let ___index_js = require("../index.js");
@@ -14,17 +14,17 @@ let __elements_user_avatar_js = require("./elements/user-avatar.js");
14
14
 
15
15
  //#region src/components/user-button.tsx
16
16
  function Item(props) {
17
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.DropdownMenuItem, {
18
- onClick: () => (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronouslyWithAlert)(props.onClick),
17
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuItem, {
18
+ onClick: () => (0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(props.onClick),
19
19
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
20
20
  className: "flex gap-2 items-center",
21
- children: [props.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: props.text })]
21
+ children: [props.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: props.text })]
22
22
  })
23
23
  });
24
24
  }
25
25
  function UserButton(props) {
26
26
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Suspense, {
27
- fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Skeleton, { className: "h-[34px] w-[34px] rounded-full stack-scope" }),
27
+ fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Skeleton, { className: "h-[34px] w-[34px] rounded-full stack-scope" }),
28
28
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UserButtonInner, { ...props })
29
29
  });
30
30
  }
@@ -52,7 +52,7 @@ function UserButtonInnerInner(props) {
52
52
  size: 20,
53
53
  className: "h-4 w-4"
54
54
  };
55
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.DropdownMenuTrigger, {
55
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuTrigger, {
56
56
  className: "outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5",
57
57
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58
58
  className: "flex gap-2 items-center",
@@ -67,26 +67,26 @@ function UserButtonInnerInner(props) {
67
67
  })]
68
68
  })]
69
69
  })
70
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.DropdownMenuContent, {
70
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.DropdownMenuContent, {
71
71
  className: "stack-scope",
72
72
  children: [
73
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.DropdownMenuLabel, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
73
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuLabel, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
74
74
  className: "flex gap-2 items-center",
75
75
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__elements_user_avatar_js.UserAvatar, { user }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
76
- user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
76
+ user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
77
77
  className: "max-w-40 truncate",
78
78
  children: user.displayName
79
79
  }),
80
- user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
80
+ user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
81
81
  className: "max-w-40 truncate",
82
82
  variant: "secondary",
83
83
  type: "label",
84
84
  children: user.primaryEmail
85
85
  }),
86
- !user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: t("Not signed in") })
86
+ !user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Not signed in") })
87
87
  ] })]
88
88
  }) }),
89
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.DropdownMenuSeparator, {}),
89
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuSeparator, {}),
90
90
  user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Item, {
91
91
  text: t("Account settings"),
92
92
  onClick: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from \"@stackframe/stack-ui\";\nimport { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from \"lucide-react\";\nimport React, { Suspense } from \"react\";\nimport { CurrentUser, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { UserAvatar } from \"./elements/user-avatar\";\n\nfunction Item(props: { text: string, icon: React.ReactNode, onClick: () => void | Promise<void> }) {\n return (\n <DropdownMenuItem onClick={() => runAsynchronouslyWithAlert(props.onClick)}>\n <div className=\"flex gap-2 items-center\">\n {props.icon}\n <Typography>{props.text}</Typography>\n </div>\n </DropdownMenuItem>\n );\n}\n\ntype UserButtonProps = {\n showUserInfo?: boolean,\n colorModeToggle?: () => void | Promise<void>,\n extraItems?: {\n text: string,\n icon: React.ReactNode,\n onClick: () => void | Promise<void>,\n }[],\n mockUser?: {\n displayName?: string,\n primaryEmail?: string,\n profileImageUrl?: string,\n },\n};\n\nexport function UserButton(props: UserButtonProps) {\n return (\n <Suspense fallback={<Skeleton className=\"h-[34px] w-[34px] rounded-full stack-scope\" />}>\n <UserButtonInner {...props} />\n </Suspense>\n );\n}\n\nfunction UserButtonInner(props: UserButtonProps) {\n const userFromHook = useUser();\n\n // Use mock user if provided, otherwise use real user\n const user = props.mockUser ? {\n displayName: props.mockUser.displayName || 'Mock User',\n primaryEmail: props.mockUser.primaryEmail || 'mock@example.com',\n profileImageUrl: props.mockUser.profileImageUrl,\n signOut: () => {\n console.log('Mock sign out - no action taken in demo mode');\n return Promise.resolve();\n }\n } as CurrentUser : userFromHook;\n\n return <UserButtonInnerInner {...props} user={user} />;\n}\n\n\nfunction UserButtonInnerInner(props: UserButtonProps & { user: CurrentUser | null }) {\n const { t } = useTranslation();\n const user = props.user;\n const app = useStackApp();\n\n const iconProps = { size: 20, className: 'h-4 w-4' };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5\">\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n {user && props.showUserInfo &&\n <div className=\"flex flex-col justify-center text-left min-w-0\">\n <div className=\"max-w-40 truncate text-sm font-medium\">{user.displayName}</div>\n <div className=\"max-w-40 truncate text-xs text-muted-foreground\">{user.primaryEmail}</div>\n </div>\n }\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"stack-scope\">\n <DropdownMenuLabel>\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n <div>\n {user && <Typography className=\"max-w-40 truncate\">{user.displayName}</Typography>}\n {user && <Typography className=\"max-w-40 truncate\" variant=\"secondary\" type='label'>{user.primaryEmail}</Typography>}\n {!user && <Typography>{t('Not signed in')}</Typography>}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {user && <Item\n text={t('Account settings')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock account settings - no navigation in demo mode');\n } else {\n await app.redirectToAccountSettings();\n }\n }}\n icon={<CircleUser {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign in')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign in - no navigation in demo mode');\n } else {\n await app.redirectToSignIn();\n }\n }}\n icon={<LogIn {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign up')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign up - no navigation in demo mode');\n } else {\n await app.redirectToSignUp();\n }\n }}\n icon={<UserPlus {...iconProps}/> }\n />}\n {user && props.extraItems && props.extraItems.map((item, index) => (\n <Item key={index} {...item} />\n ))}\n {props.colorModeToggle && (\n <Item\n text={t('Toggle theme')}\n onClick={props.colorModeToggle}\n icon={<SunMoon {...iconProps} />}\n />\n )}\n {user && <Item\n text={t('Sign out')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign out - no action taken in demo mode');\n } else {\n await user.signOut();\n }\n }}\n icon={<LogOut {...iconProps} />}\n />}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,KAAK,OAAqF;AACjG,QACE,2CAACA;EAAiB,4FAA0C,MAAM,QAAQ;YACxE,4CAAC;GAAI,WAAU;cACZ,MAAM,MACP,2CAACC,6CAAY,MAAM,OAAkB;IACjC;GACW;;AAmBvB,SAAgB,WAAW,OAAwB;AACjD,QACE,2CAACC;EAAS,UAAU,2CAACC,iCAAS,WAAU,+CAA+C;YACrF,2CAAC,mBAAgB,GAAI,QAAS;GACrB;;AAIf,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,yCAAwB;CAG9B,MAAM,OAAO,MAAM,WAAW;EAC5B,aAAa,MAAM,SAAS,eAAe;EAC3C,cAAc,MAAM,SAAS,gBAAgB;EAC7C,iBAAiB,MAAM,SAAS;EAChC,eAAe;AACb,WAAQ,IAAI,+CAA+C;AAC3D,UAAO,QAAQ,SAAS;;EAE3B,GAAkB;AAEnB,QAAO,2CAAC;EAAqB,GAAI;EAAa;GAAQ;;AAIxD,SAAS,qBAAqB,OAAuD;CACnF,MAAM,EAAE,kDAAsB;CAC9B,MAAM,OAAO,MAAM;CACnB,MAAM,oCAAmB;CAEzB,MAAM,YAAY;EAAE,MAAM;EAAI,WAAW;EAAW;AAEpD,QACE,4CAACC,gDACC,2CAACC;EAAoB,WAAU;YAC7B,4CAAC;GAAI,WAAU;cACb,2CAACC,wCAAiB,OAAQ,EACzB,QAAQ,MAAM,gBACb,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eAAyC,KAAK;MAAkB,EAC/E,2CAAC;KAAI,WAAU;eAAmD,KAAK;MAAmB;KACtF;IAEJ;GACc,EACtB,4CAACC;EAAoB,WAAU;;GAC7B,2CAACC,oDACC,4CAAC;IAAI,WAAU;eACb,2CAACF,wCAAiB,OAAQ,EAC1B,4CAAC;KACE,QAAQ,2CAACL;MAAW,WAAU;gBAAqB,KAAK;OAAyB;KACjF,QAAQ,2CAACA;MAAW,WAAU;MAAoB,SAAQ;MAAY,MAAK;gBAAS,KAAK;OAA0B;KACnH,CAAC,QAAQ,2CAACA,6CAAY,EAAE,gBAAgB,GAAc;QACnD;KACF,GACY;GACpB,2CAACQ,+CAAwB;GACxB,QAAQ,2CAAC;IACR,MAAM,EAAE,mBAAmB;IAC3B,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,qDAAqD;SAEjE,OAAM,IAAI,2BAA2B;;IAGzC,MAAM,2CAACC,2BAAW,GAAI,YAAa;KACnC;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,sBAAM,GAAI,YAAa;KAC9B;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,yBAAS,GAAI,YAAY;KAChC;GACD,QAAQ,MAAM,cAAc,MAAM,WAAW,KAAK,MAAM,UACvD,2CAAC,QAAiB,GAAI,QAAX,MAAmB,CAC9B;GACD,MAAM,mBACL,2CAAC;IACC,MAAM,EAAE,eAAe;IACvB,SAAS,MAAM;IACf,MAAM,2CAACC,wBAAQ,GAAI,YAAa;KAChC;GAEH,QAAQ,2CAAC;IACR,MAAM,EAAE,WAAW;IACnB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,+CAA+C;SAE3D,OAAM,KAAK,SAAS;;IAGxB,MAAM,2CAACC,uBAAO,GAAI,YAAa;KAC/B;;GACkB,IACT"}
1
+ {"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from \"@hexclave/ui\";\nimport { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from \"lucide-react\";\nimport React, { Suspense } from \"react\";\nimport { CurrentUser, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { UserAvatar } from \"./elements/user-avatar\";\n\nfunction Item(props: { text: string, icon: React.ReactNode, onClick: () => void | Promise<void> }) {\n return (\n <DropdownMenuItem onClick={() => runAsynchronouslyWithAlert(props.onClick)}>\n <div className=\"flex gap-2 items-center\">\n {props.icon}\n <Typography>{props.text}</Typography>\n </div>\n </DropdownMenuItem>\n );\n}\n\ntype UserButtonProps = {\n showUserInfo?: boolean,\n colorModeToggle?: () => void | Promise<void>,\n extraItems?: {\n text: string,\n icon: React.ReactNode,\n onClick: () => void | Promise<void>,\n }[],\n mockUser?: {\n displayName?: string,\n primaryEmail?: string,\n profileImageUrl?: string,\n },\n};\n\nexport function UserButton(props: UserButtonProps) {\n return (\n <Suspense fallback={<Skeleton className=\"h-[34px] w-[34px] rounded-full stack-scope\" />}>\n <UserButtonInner {...props} />\n </Suspense>\n );\n}\n\nfunction UserButtonInner(props: UserButtonProps) {\n const userFromHook = useUser();\n\n // Use mock user if provided, otherwise use real user\n const user = props.mockUser ? {\n displayName: props.mockUser.displayName || 'Mock User',\n primaryEmail: props.mockUser.primaryEmail || 'mock@example.com',\n profileImageUrl: props.mockUser.profileImageUrl,\n signOut: () => {\n console.log('Mock sign out - no action taken in demo mode');\n return Promise.resolve();\n }\n } as CurrentUser : userFromHook;\n\n return <UserButtonInnerInner {...props} user={user} />;\n}\n\n\nfunction UserButtonInnerInner(props: UserButtonProps & { user: CurrentUser | null }) {\n const { t } = useTranslation();\n const user = props.user;\n const app = useStackApp();\n\n const iconProps = { size: 20, className: 'h-4 w-4' };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5\">\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n {user && props.showUserInfo &&\n <div className=\"flex flex-col justify-center text-left min-w-0\">\n <div className=\"max-w-40 truncate text-sm font-medium\">{user.displayName}</div>\n <div className=\"max-w-40 truncate text-xs text-muted-foreground\">{user.primaryEmail}</div>\n </div>\n }\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"stack-scope\">\n <DropdownMenuLabel>\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n <div>\n {user && <Typography className=\"max-w-40 truncate\">{user.displayName}</Typography>}\n {user && <Typography className=\"max-w-40 truncate\" variant=\"secondary\" type='label'>{user.primaryEmail}</Typography>}\n {!user && <Typography>{t('Not signed in')}</Typography>}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {user && <Item\n text={t('Account settings')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock account settings - no navigation in demo mode');\n } else {\n await app.redirectToAccountSettings();\n }\n }}\n icon={<CircleUser {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign in')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign in - no navigation in demo mode');\n } else {\n await app.redirectToSignIn();\n }\n }}\n icon={<LogIn {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign up')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign up - no navigation in demo mode');\n } else {\n await app.redirectToSignUp();\n }\n }}\n icon={<UserPlus {...iconProps}/> }\n />}\n {user && props.extraItems && props.extraItems.map((item, index) => (\n <Item key={index} {...item} />\n ))}\n {props.colorModeToggle && (\n <Item\n text={t('Toggle theme')}\n onClick={props.colorModeToggle}\n icon={<SunMoon {...iconProps} />}\n />\n )}\n {user && <Item\n text={t('Sign out')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign out - no action taken in demo mode');\n } else {\n await user.signOut();\n }\n }}\n icon={<LogOut {...iconProps} />}\n />}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,KAAK,OAAqF;AACjG,QACE,2CAACA;EAAiB,oFAA0C,MAAM,QAAQ;YACxE,4CAAC;GAAI,WAAU;cACZ,MAAM,MACP,2CAACC,qCAAY,MAAM,OAAkB;IACjC;GACW;;AAmBvB,SAAgB,WAAW,OAAwB;AACjD,QACE,2CAACC;EAAS,UAAU,2CAACC,yBAAS,WAAU,+CAA+C;YACrF,2CAAC,mBAAgB,GAAI,QAAS;GACrB;;AAIf,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,yCAAwB;CAG9B,MAAM,OAAO,MAAM,WAAW;EAC5B,aAAa,MAAM,SAAS,eAAe;EAC3C,cAAc,MAAM,SAAS,gBAAgB;EAC7C,iBAAiB,MAAM,SAAS;EAChC,eAAe;AACb,WAAQ,IAAI,+CAA+C;AAC3D,UAAO,QAAQ,SAAS;;EAE3B,GAAkB;AAEnB,QAAO,2CAAC;EAAqB,GAAI;EAAa;GAAQ;;AAIxD,SAAS,qBAAqB,OAAuD;CACnF,MAAM,EAAE,kDAAsB;CAC9B,MAAM,OAAO,MAAM;CACnB,MAAM,oCAAmB;CAEzB,MAAM,YAAY;EAAE,MAAM;EAAI,WAAW;EAAW;AAEpD,QACE,4CAACC,wCACC,2CAACC;EAAoB,WAAU;YAC7B,4CAAC;GAAI,WAAU;cACb,2CAACC,wCAAiB,OAAQ,EACzB,QAAQ,MAAM,gBACb,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eAAyC,KAAK;MAAkB,EAC/E,2CAAC;KAAI,WAAU;eAAmD,KAAK;MAAmB;KACtF;IAEJ;GACc,EACtB,4CAACC;EAAoB,WAAU;;GAC7B,2CAACC,4CACC,4CAAC;IAAI,WAAU;eACb,2CAACF,wCAAiB,OAAQ,EAC1B,4CAAC;KACE,QAAQ,2CAACL;MAAW,WAAU;gBAAqB,KAAK;OAAyB;KACjF,QAAQ,2CAACA;MAAW,WAAU;MAAoB,SAAQ;MAAY,MAAK;gBAAS,KAAK;OAA0B;KACnH,CAAC,QAAQ,2CAACA,qCAAY,EAAE,gBAAgB,GAAc;QACnD;KACF,GACY;GACpB,2CAACQ,uCAAwB;GACxB,QAAQ,2CAAC;IACR,MAAM,EAAE,mBAAmB;IAC3B,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,qDAAqD;SAEjE,OAAM,IAAI,2BAA2B;;IAGzC,MAAM,2CAACC,2BAAW,GAAI,YAAa;KACnC;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,sBAAM,GAAI,YAAa;KAC9B;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,yBAAS,GAAI,YAAY;KAChC;GACD,QAAQ,MAAM,cAAc,MAAM,WAAW,KAAK,MAAM,UACvD,2CAAC,QAAiB,GAAI,QAAX,MAAmB,CAC9B;GACD,MAAM,mBACL,2CAAC;IACC,MAAM,EAAE,eAAe;IACvB,SAAS,MAAM;IACf,MAAM,2CAACC,wBAAQ,GAAI,YAAa;KAChC;GAEH,QAAQ,2CAAC;IACR,MAAM,EAAE,WAAW;IACnB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,+CAA+C;SAE3D,OAAM,KAAK,SAAS;;IAGxB,MAAM,2CAACC,uBAAO,GAAI,YAAa;KAC/B;;GACkB,IACT"}
@@ -1,11 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
- let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
5
- let _stackframe_stack_ui = require("@hexclave/ui");
3
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
+ let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
5
+ let _hexclave_ui = require("@hexclave/ui");
6
6
  let react = require("react");
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
- let _stackframe_stack_shared_dist_utils_dates = require("@hexclave/shared/dist/utils/dates");
8
+ let _hexclave_shared_dist_utils_dates = require("@hexclave/shared/dist/utils/dates");
9
9
  let _________lib_hooks_js = require("../../../lib/hooks.js");
10
10
  let _________lib_translations_js = require("../../../lib/translations.js");
11
11
  let ___page_layout_js = require("../page-layout.js");
@@ -56,7 +56,7 @@ function ActiveSessionsPage(props) {
56
56
  return;
57
57
  }
58
58
  if (!userFromHook) return;
59
- (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(async () => {
59
+ (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
60
60
  setIsLoading(true);
61
61
  setSessions(await userFromHook.getActiveSessions());
62
62
  setIsLoading(false);
@@ -72,7 +72,7 @@ function ActiveSessionsPage(props) {
72
72
  await userFromHook.revokeSession(sessionId);
73
73
  setSessions((prev) => prev.filter((session) => session.id !== sessionId));
74
74
  } catch (error) {
75
- (0, _stackframe_stack_shared_dist_utils_errors.captureError)("session-revoke", {
75
+ (0, _hexclave_shared_dist_utils_errors.captureError)("session-revoke", {
76
76
  sessionId,
77
77
  error
78
78
  });
@@ -89,7 +89,7 @@ function ActiveSessionsPage(props) {
89
89
  setSessions((prevSessions) => prevSessions.filter((session) => session.isCurrentSession));
90
90
  }
91
91
  } catch (error) {
92
- (0, _stackframe_stack_shared_dist_utils_errors.captureError)("all-sessions-revoke", {
92
+ (0, _hexclave_shared_dist_utils_errors.captureError)("all-sessions-revoke", {
93
93
  error,
94
94
  sessionIds: sessions.map((session) => session.id)
95
95
  });
@@ -102,95 +102,95 @@ function ActiveSessionsPage(props) {
102
102
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___page_layout_js.PageLayout, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
103
103
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
104
104
  className: "flex justify-between items-center mb-2",
105
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
105
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
106
106
  className: "font-medium",
107
107
  children: t("Active Sessions")
108
108
  }), sessions.filter((s) => !s.isCurrentSession).length > 0 && !isLoading && (showConfirmRevokeAll ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
109
109
  className: "flex gap-2",
110
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
110
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
111
111
  variant: "destructive",
112
112
  size: "sm",
113
113
  loading: isRevokingAll,
114
114
  onClick: handleRevokeAllSessions,
115
115
  children: t("Confirm")
116
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
116
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
117
117
  variant: "secondary",
118
118
  size: "sm",
119
119
  disabled: isRevokingAll,
120
120
  onClick: () => setShowConfirmRevokeAll(false),
121
121
  children: t("Cancel")
122
122
  })]
123
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
123
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
124
124
  variant: "outline",
125
125
  size: "sm",
126
126
  onClick: () => setShowConfirmRevokeAll(true),
127
127
  children: t("Revoke All Other Sessions")
128
128
  }))]
129
129
  }),
130
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
130
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
131
131
  variant: "secondary",
132
132
  type: "footnote",
133
133
  className: "mb-4",
134
134
  children: t("These are devices where you're currently logged in. You can revoke access to end a session.")
135
135
  }),
136
- isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Skeleton, { className: "h-[300px] w-full rounded-md" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
136
+ isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Skeleton, { className: "h-[300px] w-full rounded-md" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
137
137
  className: "border rounded-md",
138
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.Table, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHeader, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.TableRow, { children: [
139
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHead, {
138
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.Table, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHeader, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.TableRow, { children: [
139
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
140
140
  className: "w-[200px]",
141
141
  children: t("Session")
142
142
  }),
143
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHead, {
143
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
144
144
  className: "w-[150px]",
145
145
  children: t("IP Address")
146
146
  }),
147
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHead, {
147
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
148
148
  className: "w-[150px]",
149
149
  children: t("Location")
150
150
  }),
151
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHead, {
151
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
152
152
  className: "w-[150px]",
153
153
  children: t("Last used")
154
154
  }),
155
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableHead, { className: "w-[80px]" })
156
- ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableBody, { children: sessions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableRow, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, {
155
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, { className: "w-[80px]" })
156
+ ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableBody, { children: sessions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableRow, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, {
157
157
  colSpan: 5,
158
158
  className: "text-center py-6",
159
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
159
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
160
160
  variant: "secondary",
161
161
  children: t("No active sessions found")
162
162
  })
163
- }) }) : sessions.map((session) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.TableRow, { children: [
164
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
163
+ }) }) : sessions.map((session) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.TableRow, { children: [
164
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
165
165
  className: "flex flex-col",
166
166
  children: [
167
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: session.isCurrentSession ? t("Current Session") : t("Other Session") }),
168
- session.isImpersonation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Badge, {
167
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.isCurrentSession ? t("Current Session") : t("Other Session") }),
168
+ session.isImpersonation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Badge, {
169
169
  variant: "secondary",
170
170
  className: "w-fit mt-1",
171
171
  children: t("Impersonation")
172
172
  }),
173
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
173
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
174
174
  variant: "secondary",
175
175
  type: "footnote",
176
176
  children: t("Signed in {time}", { time: new Date(session.createdAt).toLocaleDateString() })
177
177
  })
178
178
  ]
179
179
  }) }),
180
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: session.geoInfo?.ip || t("-") }) }),
181
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: session.geoInfo?.cityName || t("Unknown") }) }),
182
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
180
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.geoInfo?.ip || t("-") }) }),
181
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.geoInfo?.cityName || t("Unknown") }) }),
182
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
183
183
  className: "flex flex-col",
184
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: session.lastUsedAt ? (0, _stackframe_stack_shared_dist_utils_dates.fromNow)(new Date(session.lastUsedAt)) : t("Never") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, {
184
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.lastUsedAt ? (0, _hexclave_shared_dist_utils_dates.fromNow)(new Date(session.lastUsedAt)) : t("Never") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
185
185
  variant: "secondary",
186
186
  type: "footnote",
187
187
  title: session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : "",
188
188
  children: session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : ""
189
189
  })]
190
190
  }) }),
191
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TableCell, {
191
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, {
192
192
  align: "right",
193
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.ActionCell, { items: [{
193
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.ActionCell, { items: [{
194
194
  item: t("Revoke"),
195
195
  onClick: () => handleRevokeSession(session.id),
196
196
  danger: true,
@@ -1 +1 @@
1
- {"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { fromNow } from \"@stackframe/stack-shared/dist/utils/dates\";\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@stackframe/stack-ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/stack-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { fromNow } from \"@hexclave/shared/dist/utils/dates\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/stack-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_ui = require("@hexclave/ui");
3
+ let _hexclave_ui = require("@hexclave/ui");
4
4
  let react = require("react");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  let _________lib_hooks_js = require("../../../lib/hooks.js");
@@ -91,7 +91,7 @@ function ApiKeysPage(props) {
91
91
  return await userFromHook.createApiKey(data);
92
92
  };
93
93
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(___page_layout_js.PageLayout, { children: [
94
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
94
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
95
95
  onClick: () => setIsNewApiKeyDialogOpen(true),
96
96
  children: t("Create API Key")
97
97
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { CreateApiKeyDialog, ShowApiKeyDialog } from \"../../../components/api-key-dialogs\";\nimport { ApiKeyTable } from \"../../../components/api-key-table\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ApiKey, ApiKeyCreationOptions } from \"../../../lib/stack-app/api-keys\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\n\nexport function ApiKeysPage(props?: {\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n // Check if we're in any kind of mock mode first\n const isInMockMode = !!(props?.mockApiKeys || props?.mockMode);\n\n const userFromHook = useUser({ or: isInMockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, we don't need a user - just show mock data\n if (isInMockMode && !userFromHook) {\n // This is expected in mock mode, continue with mock data\n }\n\n // Only return null if we're not in mock mode and don't have a user\n if (!isInMockMode && !userFromHook) {\n return null; // This shouldn't happen due to redirect, but just in case\n }\n\n // Use mock data if provided\n const mockApiKeysData = props?.mockApiKeys ? props.mockApiKeys.map(mockKey => ({\n id: mockKey.id,\n description: mockKey.description,\n createdAt: new Date(mockKey.createdAt),\n expiresAt: mockKey.expiresAt ? new Date(mockKey.expiresAt) : undefined,\n manuallyRevokedAt: mockKey.manuallyRevokedAt ? new Date(mockKey.manuallyRevokedAt) : null,\n value: {\n lastFour: mockKey.id.slice(-4).padStart(4, '0'), // Use last 4 chars of ID or pad with zeros\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => {\n const now = new Date();\n const isExpired = mockKey.expiresAt ? new Date(mockKey.expiresAt) < now : false;\n const isRevoked = !!mockKey.manuallyRevokedAt;\n return !isExpired && !isRevoked;\n },\n whyInvalid: () => {\n const now = new Date();\n if (mockKey.manuallyRevokedAt) return 'manually-revoked';\n if (mockKey.expiresAt && new Date(mockKey.expiresAt) < now) return 'expired';\n return null;\n },\n })) : [\n {\n id: 'key-1',\n description: 'Development Key',\n createdAt: new Date(Date.now() - 172800000), // 2 days ago\n expiresAt: undefined,\n manuallyRevokedAt: null,\n value: {\n lastFour: 'ey-1'.slice(-4).padStart(4, '0'),\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n }\n ];\n\n // Determine which API keys to use\n let apiKeys: any[];\n if (isInMockMode) {\n apiKeys = mockApiKeysData;\n } else if (userFromHook) {\n apiKeys = userFromHook.useApiKeys();\n } else {\n apiKeys = [];\n }\n\n const [isNewApiKeyDialogOpen, setIsNewApiKeyDialogOpen] = useState(false);\n const [returnedApiKey, setReturnedApiKey] = useState<ApiKey<\"user\", true> | null>(null);\n\n const CreateDialog = CreateApiKeyDialog<\"user\">;\n const ShowDialog = ShowApiKeyDialog<\"user\">;\n\n const handleCreateApiKey = async (data: ApiKeyCreationOptions<\"user\">) => {\n if (isInMockMode) {\n // Mock API key creation\n const mockApiKey = {\n id: `key-${Date.now()}`,\n description: data.description,\n createdAt: new Date().toISOString(),\n expiresAt: data.expiresAt?.toISOString(),\n value: 'sk_dev_mock_key_' + Math.random().toString(36).substring(2),\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n type: 'user' as const,\n userId: 'mock-user-id',\n };\n return mockApiKey as any;\n }\n\n if (!userFromHook) throw new Error('User not available');\n return await userFromHook.createApiKey(data);\n };\n\n return (\n <PageLayout>\n <Button onClick={() => setIsNewApiKeyDialogOpen(true)}>\n {t(\"Create API Key\")}\n </Button>\n <ApiKeyTable apiKeys={apiKeys} />\n <CreateDialog\n open={isNewApiKeyDialogOpen}\n onOpenChange={setIsNewApiKeyDialogOpen}\n onKeyCreated={setReturnedApiKey}\n createApiKey={handleCreateApiKey}\n mockMode={isInMockMode}\n />\n <ShowDialog\n apiKey={returnedApiKey}\n onClose={() => setReturnedApiKey(null)}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,OASzB;CACD,MAAM,EAAE,wDAAsB;CAG9B,MAAM,eAAe,CAAC,EAAE,OAAO,eAAe,OAAO;CAErD,MAAM,kDAAuB,EAAE,IAAI,eAAe,gBAAgB,YAAY,CAAC;AAG/E,KAAI,gBAAgB,CAAC,cAAc;AAKnC,KAAI,CAAC,gBAAgB,CAAC,aACpB,QAAO;CAIT,MAAM,kBAAkB,OAAO,cAAc,MAAM,YAAY,KAAI,aAAY;EAC7E,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,WAAW,IAAI,KAAK,QAAQ,UAAU;EACtC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG;EAC7D,mBAAmB,QAAQ,oBAAoB,IAAI,KAAK,QAAQ,kBAAkB,GAAG;EACrF,OAAO,EACL,UAAU,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAChD;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;GACb,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG,MAAM;GAC1E,MAAM,YAAY,CAAC,CAAC,QAAQ;AAC5B,UAAO,CAAC,aAAa,CAAC;;EAExB,kBAAkB;GAChB,MAAM,sBAAM,IAAI,MAAM;AACtB,OAAI,QAAQ,kBAAmB,QAAO;AACtC,OAAI,QAAQ,aAAa,IAAI,KAAK,QAAQ,UAAU,GAAG,IAAK,QAAO;AACnE,UAAO;;EAEV,EAAE,GAAG,CACJ;EACE,IAAI;EACJ,aAAa;EACb,2BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU;EAC3C,WAAW;EACX,mBAAmB;EACnB,OAAO,EACL,UAAU,OAAO,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAC5C;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;EACf,kBAAkB;EACnB,CACF;CAGD,IAAI;AACJ,KAAI,aACF,WAAU;UACD,aACT,WAAU,aAAa,YAAY;KAEnC,WAAU,EAAE;CAGd,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CACzE,MAAM,CAAC,gBAAgB,yCAA2D,KAAK;CAEvF,MAAM,eAAeA;CACrB,MAAM,aAAaC;CAEnB,MAAM,qBAAqB,OAAO,SAAwC;AACxE,MAAI,aAmBF,QAjBmB;GACjB,IAAI,OAAO,KAAK,KAAK;GACrB,aAAa,KAAK;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,WAAW,KAAK,WAAW,aAAa;GACxC,OAAO,qBAAqB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE;GACnE,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,eAAe;GACf,kBAAkB;GAClB,MAAM;GACN,QAAQ;GACT;AAIH,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,qBAAqB;AACxD,SAAO,MAAM,aAAa,aAAa,KAAK;;AAG9C,QACE,4CAACC;EACC,2CAACC;GAAO,eAAe,yBAAyB,KAAK;aAClD,EAAE,iBAAiB;IACb;EACT,2CAACC,oDAAqB,UAAW;EACjC,2CAAC;GACC,MAAM;GACN,cAAc;GACd,cAAc;GACd,cAAc;GACd,UAAU;IACV;EACF,2CAAC;GACC,QAAQ;GACR,eAAe,kBAAkB,KAAK;IACtC;KACS"}
1
+ {"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { CreateApiKeyDialog, ShowApiKeyDialog } from \"../../../components/api-key-dialogs\";\nimport { ApiKeyTable } from \"../../../components/api-key-table\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ApiKey, ApiKeyCreationOptions } from \"../../../lib/stack-app/api-keys\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\n\nexport function ApiKeysPage(props?: {\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n // Check if we're in any kind of mock mode first\n const isInMockMode = !!(props?.mockApiKeys || props?.mockMode);\n\n const userFromHook = useUser({ or: isInMockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, we don't need a user - just show mock data\n if (isInMockMode && !userFromHook) {\n // This is expected in mock mode, continue with mock data\n }\n\n // Only return null if we're not in mock mode and don't have a user\n if (!isInMockMode && !userFromHook) {\n return null; // This shouldn't happen due to redirect, but just in case\n }\n\n // Use mock data if provided\n const mockApiKeysData = props?.mockApiKeys ? props.mockApiKeys.map(mockKey => ({\n id: mockKey.id,\n description: mockKey.description,\n createdAt: new Date(mockKey.createdAt),\n expiresAt: mockKey.expiresAt ? new Date(mockKey.expiresAt) : undefined,\n manuallyRevokedAt: mockKey.manuallyRevokedAt ? new Date(mockKey.manuallyRevokedAt) : null,\n value: {\n lastFour: mockKey.id.slice(-4).padStart(4, '0'), // Use last 4 chars of ID or pad with zeros\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => {\n const now = new Date();\n const isExpired = mockKey.expiresAt ? new Date(mockKey.expiresAt) < now : false;\n const isRevoked = !!mockKey.manuallyRevokedAt;\n return !isExpired && !isRevoked;\n },\n whyInvalid: () => {\n const now = new Date();\n if (mockKey.manuallyRevokedAt) return 'manually-revoked';\n if (mockKey.expiresAt && new Date(mockKey.expiresAt) < now) return 'expired';\n return null;\n },\n })) : [\n {\n id: 'key-1',\n description: 'Development Key',\n createdAt: new Date(Date.now() - 172800000), // 2 days ago\n expiresAt: undefined,\n manuallyRevokedAt: null,\n value: {\n lastFour: 'ey-1'.slice(-4).padStart(4, '0'),\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n }\n ];\n\n // Determine which API keys to use\n let apiKeys: any[];\n if (isInMockMode) {\n apiKeys = mockApiKeysData;\n } else if (userFromHook) {\n apiKeys = userFromHook.useApiKeys();\n } else {\n apiKeys = [];\n }\n\n const [isNewApiKeyDialogOpen, setIsNewApiKeyDialogOpen] = useState(false);\n const [returnedApiKey, setReturnedApiKey] = useState<ApiKey<\"user\", true> | null>(null);\n\n const CreateDialog = CreateApiKeyDialog<\"user\">;\n const ShowDialog = ShowApiKeyDialog<\"user\">;\n\n const handleCreateApiKey = async (data: ApiKeyCreationOptions<\"user\">) => {\n if (isInMockMode) {\n // Mock API key creation\n const mockApiKey = {\n id: `key-${Date.now()}`,\n description: data.description,\n createdAt: new Date().toISOString(),\n expiresAt: data.expiresAt?.toISOString(),\n value: 'sk_dev_mock_key_' + Math.random().toString(36).substring(2),\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n type: 'user' as const,\n userId: 'mock-user-id',\n };\n return mockApiKey as any;\n }\n\n if (!userFromHook) throw new Error('User not available');\n return await userFromHook.createApiKey(data);\n };\n\n return (\n <PageLayout>\n <Button onClick={() => setIsNewApiKeyDialogOpen(true)}>\n {t(\"Create API Key\")}\n </Button>\n <ApiKeyTable apiKeys={apiKeys} />\n <CreateDialog\n open={isNewApiKeyDialogOpen}\n onOpenChange={setIsNewApiKeyDialogOpen}\n onKeyCreated={setReturnedApiKey}\n createApiKey={handleCreateApiKey}\n mockMode={isInMockMode}\n />\n <ShowDialog\n apiKey={returnedApiKey}\n onClose={() => setReturnedApiKey(null)}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,OASzB;CACD,MAAM,EAAE,wDAAsB;CAG9B,MAAM,eAAe,CAAC,EAAE,OAAO,eAAe,OAAO;CAErD,MAAM,kDAAuB,EAAE,IAAI,eAAe,gBAAgB,YAAY,CAAC;AAG/E,KAAI,gBAAgB,CAAC,cAAc;AAKnC,KAAI,CAAC,gBAAgB,CAAC,aACpB,QAAO;CAIT,MAAM,kBAAkB,OAAO,cAAc,MAAM,YAAY,KAAI,aAAY;EAC7E,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,WAAW,IAAI,KAAK,QAAQ,UAAU;EACtC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG;EAC7D,mBAAmB,QAAQ,oBAAoB,IAAI,KAAK,QAAQ,kBAAkB,GAAG;EACrF,OAAO,EACL,UAAU,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAChD;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;GACb,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG,MAAM;GAC1E,MAAM,YAAY,CAAC,CAAC,QAAQ;AAC5B,UAAO,CAAC,aAAa,CAAC;;EAExB,kBAAkB;GAChB,MAAM,sBAAM,IAAI,MAAM;AACtB,OAAI,QAAQ,kBAAmB,QAAO;AACtC,OAAI,QAAQ,aAAa,IAAI,KAAK,QAAQ,UAAU,GAAG,IAAK,QAAO;AACnE,UAAO;;EAEV,EAAE,GAAG,CACJ;EACE,IAAI;EACJ,aAAa;EACb,2BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU;EAC3C,WAAW;EACX,mBAAmB;EACnB,OAAO,EACL,UAAU,OAAO,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAC5C;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;EACf,kBAAkB;EACnB,CACF;CAGD,IAAI;AACJ,KAAI,aACF,WAAU;UACD,aACT,WAAU,aAAa,YAAY;KAEnC,WAAU,EAAE;CAGd,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CACzE,MAAM,CAAC,gBAAgB,yCAA2D,KAAK;CAEvF,MAAM,eAAeA;CACrB,MAAM,aAAaC;CAEnB,MAAM,qBAAqB,OAAO,SAAwC;AACxE,MAAI,aAmBF,QAjBmB;GACjB,IAAI,OAAO,KAAK,KAAK;GACrB,aAAa,KAAK;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,WAAW,KAAK,WAAW,aAAa;GACxC,OAAO,qBAAqB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE;GACnE,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,eAAe;GACf,kBAAkB;GAClB,MAAM;GACN,QAAQ;GACT;AAIH,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,qBAAqB;AACxD,SAAO,MAAM,aAAa,aAAa,KAAK;;AAG9C,QACE,4CAACC;EACC,2CAACC;GAAO,eAAe,yBAAyB,KAAK;aAClD,EAAE,iBAAiB;IACb;EACT,2CAACC,oDAAqB,UAAW;EACjC,2CAAC;GACC,MAAM;GACN,cAAc;GACd,cAAc;GACd,cAAc;GACd,UAAU;IACV;EACF,2CAAC;GACC,QAAQ;GACR,eAAe,kBAAkB,KAAK;IACtC;KACS"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_ui = require("@hexclave/ui");
3
+ let _hexclave_ui = require("@hexclave/ui");
4
4
  let react = require("react");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  let lucide_react = require("lucide-react");
@@ -14,11 +14,11 @@ function EditableText(props) {
14
14
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
15
15
  className: "flex items-center gap-2",
16
16
  children: editing ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
17
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Input, {
17
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Input, {
18
18
  value: editingValue,
19
19
  onChange: (e) => setEditingValue(e.target.value)
20
20
  }),
21
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
21
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
22
22
  size: "sm",
23
23
  onClick: async () => {
24
24
  await props.onSave?.(editingValue);
@@ -26,7 +26,7 @@ function EditableText(props) {
26
26
  },
27
27
  children: t("Save")
28
28
  }),
29
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
29
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
30
30
  size: "sm",
31
31
  variant: "secondary",
32
32
  onClick: () => {
@@ -35,7 +35,7 @@ function EditableText(props) {
35
35
  },
36
36
  children: t("Cancel")
37
37
  })
38
- ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: props.value }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Button, {
38
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: props.value }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
39
39
  onClick: () => setEditing(true),
40
40
  size: "icon",
41
41
  variant: "ghost",
@@ -1 +1 @@
1
- {"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Input, Typography } from \"@stackframe/stack-ui\";\nimport { Edit } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../../lib/translations\";\n\n\nexport function EditableText(props: { value: string, onSave?: (value: string) => void | Promise<void> }) {\n const [editing, setEditing] = useState(false);\n const [editingValue, setEditingValue] = useState(props.value);\n const { t } = useTranslation();\n\n return (\n <div className='flex items-center gap-2'>\n {editing ? (\n <>\n <Input\n value={editingValue}\n onChange={(e) => setEditingValue(e.target.value)}\n />\n <Button\n size='sm'\n onClick={async () => {\n await props.onSave?.(editingValue);\n setEditing(false);\n }}\n >\n {t(\"Save\")}\n </Button>\n <Button\n size='sm'\n variant='secondary'\n onClick={() => {\n setEditingValue(props.value);\n setEditing(false);\n }}>\n {t(\"Cancel\")}\n </Button>\n </>\n ) : (\n <>\n <Typography>{props.value}</Typography>\n <Button onClick={() => setEditing(true)} size='icon' variant='ghost'>\n <Edit className=\"w-4 h-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,aAAa,OAA4E;CACvG,MAAM,CAAC,SAAS,kCAAuB,MAAM;CAC7C,MAAM,CAAC,cAAc,uCAA4B,MAAM,MAAM;CAC7D,MAAM,EAAE,qDAAsB;AAE9B,QACE,2CAAC;EAAI,WAAU;YACZ,UACC;GACE,2CAACA;IACC,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;KAChD;GACF,2CAACC;IACC,MAAK;IACL,SAAS,YAAY;AACnB,WAAM,MAAM,SAAS,aAAa;AAClC,gBAAW,MAAM;;cAGlB,EAAE,OAAO;KACH;GACT,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAe;AACb,qBAAgB,MAAM,MAAM;AAC5B,gBAAW,MAAM;;cAElB,EAAE,SAAS;KACL;MACR,GAEH,qFACE,2CAACC,6CAAY,MAAM,QAAmB,EACtC,2CAACD;GAAO,eAAe,WAAW,KAAK;GAAE,MAAK;GAAO,SAAQ;aAC3D,2CAACE,qBAAK,WAAU,YAAY;IACrB,IACR;GAED"}
1
+ {"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { Edit } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../../lib/translations\";\n\n\nexport function EditableText(props: { value: string, onSave?: (value: string) => void | Promise<void> }) {\n const [editing, setEditing] = useState(false);\n const [editingValue, setEditingValue] = useState(props.value);\n const { t } = useTranslation();\n\n return (\n <div className='flex items-center gap-2'>\n {editing ? (\n <>\n <Input\n value={editingValue}\n onChange={(e) => setEditingValue(e.target.value)}\n />\n <Button\n size='sm'\n onClick={async () => {\n await props.onSave?.(editingValue);\n setEditing(false);\n }}\n >\n {t(\"Save\")}\n </Button>\n <Button\n size='sm'\n variant='secondary'\n onClick={() => {\n setEditingValue(props.value);\n setEditing(false);\n }}>\n {t(\"Cancel\")}\n </Button>\n </>\n ) : (\n <>\n <Typography>{props.value}</Typography>\n <Button onClick={() => setEditing(true)} size='icon' variant='ghost'>\n <Edit className=\"w-4 h-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,aAAa,OAA4E;CACvG,MAAM,CAAC,SAAS,kCAAuB,MAAM;CAC7C,MAAM,CAAC,cAAc,uCAA4B,MAAM,MAAM;CAC7D,MAAM,EAAE,qDAAsB;AAE9B,QACE,2CAAC;EAAI,WAAU;YACZ,UACC;GACE,2CAACA;IACC,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;KAChD;GACF,2CAACC;IACC,MAAK;IACL,SAAS,YAAY;AACnB,WAAM,MAAM,SAAS,aAAa;AAClC,gBAAW,MAAM;;cAGlB,EAAE,OAAO;KACH;GACT,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAe;AACb,qBAAgB,MAAM,MAAM;AAC5B,gBAAW,MAAM;;cAElB,EAAE,SAAS;KACL;MACR,GAEH,qFACE,2CAACC,qCAAY,MAAM,QAAmB,EACtC,2CAACD;GAAO,eAAe,WAAW,KAAK;GAAE,MAAK;GAAO,SAAQ;aAC3D,2CAACE,qBAAK,WAAU,YAAY;IACrB,IACR;GAED"}