@hexclave/react 1.0.3 → 1.0.6

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 (897) hide show
  1. package/dist/components/api-key-dialogs.d.ts +1 -1
  2. package/dist/components/api-key-dialogs.js +5 -5
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/api-key-table.d.ts +1 -1
  5. package/dist/components/api-key-table.js.map +1 -1
  6. package/dist/components/credential-sign-in.js +3 -3
  7. package/dist/components/credential-sign-in.js.map +1 -1
  8. package/dist/components/credential-sign-up.js +5 -5
  9. package/dist/components/credential-sign-up.js.map +1 -1
  10. package/dist/components/elements/form-warning.js.map +1 -1
  11. package/dist/components/elements/maybe-full-page.js.map +1 -1
  12. package/dist/components/elements/separator-with-text.js.map +1 -1
  13. package/dist/components/elements/sidebar-layout.js +1 -1
  14. package/dist/components/elements/sidebar-layout.js.map +1 -1
  15. package/dist/components/elements/ssr-layout-effect.js.map +1 -1
  16. package/dist/components/elements/user-avatar.js +1 -1
  17. package/dist/components/elements/user-avatar.js.map +1 -1
  18. package/dist/components/link.js.map +1 -1
  19. package/dist/components/magic-link-sign-in.js +6 -6
  20. package/dist/components/magic-link-sign-in.js.map +1 -1
  21. package/dist/components/message-cards/known-error-message-card.js +2 -2
  22. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  23. package/dist/components/message-cards/message-card.js.map +1 -1
  24. package/dist/components/message-cards/predefined-message-card.js +10 -10
  25. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  26. package/dist/components/oauth-button-group.js +2 -2
  27. package/dist/components/oauth-button-group.js.map +1 -1
  28. package/dist/components/oauth-button.js +2 -2
  29. package/dist/components/oauth-button.js.map +1 -1
  30. package/dist/components/passkey-button.js +3 -3
  31. package/dist/components/passkey-button.js.map +1 -1
  32. package/dist/components/profile-image-editor.js +1 -1
  33. package/dist/components/profile-image-editor.js.map +1 -1
  34. package/dist/components/selected-team-switcher.d.ts +1 -1
  35. package/dist/components/selected-team-switcher.js.map +1 -1
  36. package/dist/components/team-icon.d.ts +1 -1
  37. package/dist/components/team-icon.js +1 -1
  38. package/dist/components/team-icon.js.map +1 -1
  39. package/dist/components/team-switcher.d.ts +1 -1
  40. package/dist/components/team-switcher.js +2 -2
  41. package/dist/components/team-switcher.js.map +1 -1
  42. package/dist/components/use-in-iframe.js.map +1 -1
  43. package/dist/components/user-button.js +1 -1
  44. package/dist/components/user-button.js.map +1 -1
  45. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  46. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  47. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  48. package/dist/components-page/account-settings/editable-text.js +1 -1
  49. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  50. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  51. package/dist/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  52. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  53. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  54. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  55. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  56. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  57. package/dist/components-page/account-settings/email-and-auth/password-section.js +3 -3
  58. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  59. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  60. package/dist/components-page/account-settings/page-layout.js.map +1 -1
  61. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  62. package/dist/components-page/account-settings/payments/payments-page.js.map +1 -1
  63. package/dist/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  64. package/dist/components-page/account-settings/payments/payments-panel.js +6 -6
  65. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
  66. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  67. package/dist/components-page/account-settings/section.js.map +1 -1
  68. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  69. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  70. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  71. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  72. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  73. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  74. package/dist/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  75. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  76. package/dist/components-page/account-settings/teams/team-creation-page.js +3 -3
  77. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  78. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  79. package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  80. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  81. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  82. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  83. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  84. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  85. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  86. package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
  87. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  88. package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  89. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  90. package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  91. package/dist/components-page/account-settings.js +3 -3
  92. package/dist/components-page/account-settings.js.map +1 -1
  93. package/dist/components-page/auth-page.d.ts.map +1 -1
  94. package/dist/components-page/auth-page.js +56 -11
  95. package/dist/components-page/auth-page.js.map +1 -1
  96. package/dist/components-page/cli-auth-confirm.js +4 -4
  97. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  98. package/dist/components-page/cli-auth-confirm.test.js +4 -4
  99. package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
  100. package/dist/components-page/email-verification.js +6 -6
  101. package/dist/components-page/email-verification.js.map +1 -1
  102. package/dist/components-page/error-page.js +9 -9
  103. package/dist/components-page/error-page.js.map +1 -1
  104. package/dist/components-page/forgot-password.js +9 -9
  105. package/dist/components-page/forgot-password.js.map +1 -1
  106. package/dist/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +16 -4
  107. package/dist/components-page/hexclave-handler-client.d.ts.map +1 -0
  108. package/dist/components-page/{stack-handler-client.js → hexclave-handler-client.js} +66 -30
  109. package/dist/components-page/hexclave-handler-client.js.map +1 -0
  110. package/dist/components-page/hexclave-handler-client.test.js +51 -0
  111. package/dist/components-page/hexclave-handler-client.test.js.map +1 -0
  112. package/dist/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  113. package/dist/components-page/hexclave-handler.d.ts.map +1 -0
  114. package/dist/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  115. package/dist/components-page/hexclave-handler.js.map +1 -0
  116. package/dist/components-page/magic-link-callback.js +9 -9
  117. package/dist/components-page/magic-link-callback.js.map +1 -1
  118. package/dist/components-page/mfa.js +7 -7
  119. package/dist/components-page/mfa.js.map +1 -1
  120. package/dist/components-page/oauth-callback.js +6 -6
  121. package/dist/components-page/oauth-callback.js.map +1 -1
  122. package/dist/components-page/onboarding.js +7 -7
  123. package/dist/components-page/onboarding.js.map +1 -1
  124. package/dist/components-page/password-reset.js +16 -16
  125. package/dist/components-page/password-reset.js.map +1 -1
  126. package/dist/components-page/sign-in.js.map +1 -1
  127. package/dist/components-page/sign-out.d.ts +1 -0
  128. package/dist/components-page/sign-out.d.ts.map +1 -1
  129. package/dist/components-page/sign-out.js +11 -5
  130. package/dist/components-page/sign-out.js.map +1 -1
  131. package/dist/components-page/sign-up.js.map +1 -1
  132. package/dist/components-page/team-creation.js +5 -5
  133. package/dist/components-page/team-creation.js.map +1 -1
  134. package/dist/components-page/team-invitation.js +17 -17
  135. package/dist/components-page/team-invitation.js.map +1 -1
  136. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  137. package/dist/dev-tool/dev-tool-core.js +13 -13
  138. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  139. package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
  140. package/dist/dev-tool/dev-tool-styles.js +371 -371
  141. package/dist/dev-tool/dev-tool-styles.js.map +1 -1
  142. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
  143. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  144. package/dist/dev-tool/index.d.ts +4 -4
  145. package/dist/dev-tool/index.js +5 -5
  146. package/dist/dev-tool/index.js.map +1 -1
  147. package/dist/esm/components/api-key-dialogs.d.ts +1 -1
  148. package/dist/esm/components/api-key-dialogs.js +5 -5
  149. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  150. package/dist/esm/components/api-key-table.d.ts +1 -1
  151. package/dist/esm/components/api-key-table.js.map +1 -1
  152. package/dist/esm/components/credential-sign-in.js +3 -3
  153. package/dist/esm/components/credential-sign-in.js.map +1 -1
  154. package/dist/esm/components/credential-sign-up.js +5 -5
  155. package/dist/esm/components/credential-sign-up.js.map +1 -1
  156. package/dist/esm/components/elements/form-warning.js.map +1 -1
  157. package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
  158. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  159. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  160. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  161. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
  162. package/dist/esm/components/elements/user-avatar.js +1 -1
  163. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  164. package/dist/esm/components/link.js.map +1 -1
  165. package/dist/esm/components/magic-link-sign-in.js +6 -6
  166. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  167. package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
  168. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  169. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  170. package/dist/esm/components/message-cards/predefined-message-card.js +10 -10
  171. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  172. package/dist/esm/components/oauth-button-group.js +2 -2
  173. package/dist/esm/components/oauth-button-group.js.map +1 -1
  174. package/dist/esm/components/oauth-button.js +2 -2
  175. package/dist/esm/components/oauth-button.js.map +1 -1
  176. package/dist/esm/components/passkey-button.js +3 -3
  177. package/dist/esm/components/passkey-button.js.map +1 -1
  178. package/dist/esm/components/profile-image-editor.js +1 -1
  179. package/dist/esm/components/profile-image-editor.js.map +1 -1
  180. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  181. package/dist/esm/components/team-icon.js +1 -1
  182. package/dist/esm/components/team-icon.js.map +1 -1
  183. package/dist/esm/components/team-switcher.js +2 -2
  184. package/dist/esm/components/team-switcher.js.map +1 -1
  185. package/dist/esm/components/use-in-iframe.js.map +1 -1
  186. package/dist/esm/components/user-button.js +1 -1
  187. package/dist/esm/components/user-button.js.map +1 -1
  188. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  189. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  190. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  191. package/dist/esm/components-page/account-settings/editable-text.js +1 -1
  192. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  193. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  194. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  195. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  196. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  197. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  198. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  199. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  200. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +3 -3
  201. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  202. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  203. package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
  204. package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -1
  205. package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  206. package/dist/esm/components-page/account-settings/payments/payments-panel.js +5 -5
  207. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
  208. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  209. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  210. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  211. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  212. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  213. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  214. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  215. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  216. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  217. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +3 -3
  218. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  219. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  220. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  221. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  222. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  223. package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
  224. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  225. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  226. package/dist/esm/components-page/account-settings.d.ts +1 -1
  227. package/dist/esm/components-page/account-settings.js +3 -3
  228. package/dist/esm/components-page/account-settings.js.map +1 -1
  229. package/dist/esm/components-page/auth-page.d.ts.map +1 -1
  230. package/dist/esm/components-page/auth-page.js +57 -12
  231. package/dist/esm/components-page/auth-page.js.map +1 -1
  232. package/dist/esm/components-page/cli-auth-confirm.js +4 -4
  233. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  234. package/dist/esm/components-page/cli-auth-confirm.test.js +4 -4
  235. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
  236. package/dist/esm/components-page/email-verification.js +6 -6
  237. package/dist/esm/components-page/email-verification.js.map +1 -1
  238. package/dist/esm/components-page/error-page.js +9 -9
  239. package/dist/esm/components-page/error-page.js.map +1 -1
  240. package/dist/esm/components-page/forgot-password.js +9 -9
  241. package/dist/esm/components-page/forgot-password.js.map +1 -1
  242. package/dist/esm/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +15 -4
  243. package/dist/esm/components-page/hexclave-handler-client.d.ts.map +1 -0
  244. package/dist/esm/components-page/{stack-handler-client.js → hexclave-handler-client.js} +64 -29
  245. package/dist/esm/components-page/hexclave-handler-client.js.map +1 -0
  246. package/dist/esm/components-page/hexclave-handler-client.test.js +51 -0
  247. package/dist/esm/components-page/hexclave-handler-client.test.js.map +1 -0
  248. package/dist/esm/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  249. package/dist/esm/components-page/hexclave-handler.d.ts.map +1 -0
  250. package/dist/esm/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  251. package/dist/esm/components-page/hexclave-handler.js.map +1 -0
  252. package/dist/esm/components-page/magic-link-callback.js +9 -9
  253. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  254. package/dist/esm/components-page/mfa.js +7 -7
  255. package/dist/esm/components-page/mfa.js.map +1 -1
  256. package/dist/esm/components-page/oauth-callback.js +6 -6
  257. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  258. package/dist/esm/components-page/onboarding.js +7 -7
  259. package/dist/esm/components-page/onboarding.js.map +1 -1
  260. package/dist/esm/components-page/password-reset.js +16 -16
  261. package/dist/esm/components-page/password-reset.js.map +1 -1
  262. package/dist/esm/components-page/sign-in.js.map +1 -1
  263. package/dist/esm/components-page/sign-out.d.ts +1 -0
  264. package/dist/esm/components-page/sign-out.d.ts.map +1 -1
  265. package/dist/esm/components-page/sign-out.js +11 -5
  266. package/dist/esm/components-page/sign-out.js.map +1 -1
  267. package/dist/esm/components-page/sign-up.js.map +1 -1
  268. package/dist/esm/components-page/team-creation.js +5 -5
  269. package/dist/esm/components-page/team-creation.js.map +1 -1
  270. package/dist/esm/components-page/team-invitation.js +17 -17
  271. package/dist/esm/components-page/team-invitation.js.map +1 -1
  272. package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
  273. package/dist/esm/dev-tool/dev-tool-core.js +12 -12
  274. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  275. package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
  276. package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
  277. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
  278. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
  279. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  280. package/dist/esm/dev-tool/index.d.ts +4 -4
  281. package/dist/esm/dev-tool/index.js +5 -5
  282. package/dist/esm/dev-tool/index.js.map +1 -1
  283. package/dist/esm/generated/env.d.ts +26 -0
  284. package/dist/esm/{lib → generated}/env.d.ts.map +1 -1
  285. package/dist/esm/generated/env.js +67 -0
  286. package/dist/esm/generated/env.js.map +1 -0
  287. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  288. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  289. package/dist/esm/global.d.ts +8 -1
  290. package/dist/esm/global.d.ts.map +1 -0
  291. package/dist/esm/index.d.ts +4 -4
  292. package/dist/esm/index.js +3 -3
  293. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  294. package/dist/esm/integrations/convex.js +1 -1
  295. package/dist/esm/integrations/convex.js.map +1 -1
  296. package/dist/esm/lib/auth.js +1 -1
  297. package/dist/esm/lib/auth.js.map +1 -1
  298. package/dist/esm/lib/auth.test.js +1 -1
  299. package/dist/esm/lib/auth.test.js.map +1 -1
  300. package/dist/esm/lib/cookie.js.map +1 -1
  301. package/dist/{lib/stack-app → esm/lib/hexclave-app}/api-keys/index.d.ts +2 -2
  302. package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
  303. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  304. package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
  305. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +7 -7
  306. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  307. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +8 -8
  308. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  309. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +381 -0
  310. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  311. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +17 -15
  312. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  313. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +77 -57
  314. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  315. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  316. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  317. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.d.ts +11 -11
  318. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  319. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +35 -21
  320. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  321. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  322. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
  323. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  324. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  325. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  326. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  327. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  328. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  329. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
  330. package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  331. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  332. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  333. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  334. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  335. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +5 -5
  336. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  337. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +8 -8
  338. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  339. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  340. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  341. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  342. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  343. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  344. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  345. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  346. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
  347. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +2 -2
  348. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  349. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  350. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  351. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  352. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
  353. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
  354. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  355. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  356. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
  357. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
  358. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  359. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  360. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
  361. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
  362. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  363. package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  364. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
  365. package/dist/esm/lib/hexclave-app/common.js +7 -0
  366. package/dist/esm/lib/hexclave-app/common.js.map +1 -0
  367. package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  368. package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
  369. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  370. package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
  371. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  372. package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
  373. package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  374. package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
  375. package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  376. package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
  377. package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  378. package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
  379. package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
  380. package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
  381. package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  382. package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
  383. package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  384. package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
  385. package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  386. package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
  387. package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  388. package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  389. package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  390. package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
  391. package/dist/{lib/stack-app → esm/lib/hexclave-app}/permissions/index.d.ts +1 -1
  392. package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
  393. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  394. package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
  395. package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  396. package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
  397. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  398. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
  399. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  400. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
  401. package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
  402. package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
  403. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  404. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
  405. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  406. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
  407. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  408. package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
  409. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +26 -12
  410. package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
  411. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +13 -1
  412. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
  413. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +2 -2
  414. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
  415. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  416. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
  417. package/dist/esm/lib/hooks.d.ts +1 -1
  418. package/dist/esm/lib/hooks.js +9 -9
  419. package/dist/esm/lib/hooks.js.map +1 -1
  420. package/dist/esm/lib/translations.js.map +1 -1
  421. package/dist/esm/providers/hexclave-context.d.ts +11 -0
  422. package/dist/esm/providers/hexclave-context.d.ts.map +1 -0
  423. package/dist/esm/providers/hexclave-context.js +12 -0
  424. package/dist/esm/providers/hexclave-context.js.map +1 -0
  425. package/dist/esm/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  426. package/dist/esm/providers/hexclave-provider-client.d.ts.map +1 -0
  427. package/dist/esm/providers/hexclave-provider-client.js +30 -0
  428. package/dist/esm/providers/hexclave-provider-client.js.map +1 -0
  429. package/dist/esm/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  430. package/dist/esm/providers/hexclave-provider.d.ts.map +1 -0
  431. package/dist/esm/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  432. package/dist/esm/providers/hexclave-provider.js.map +1 -0
  433. package/dist/esm/providers/theme-provider.js.map +1 -1
  434. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  435. package/dist/esm/providers/translation-provider.js +1 -1
  436. package/dist/esm/providers/translation-provider.js.map +1 -1
  437. package/dist/esm/tanstack-start-server-context.d.ts +1 -1
  438. package/dist/esm/utils/browser-script.js.map +1 -1
  439. package/dist/esm/utils/constants.js.map +1 -1
  440. package/dist/esm/utils/url.js.map +1 -1
  441. package/dist/generated/env.d.ts +26 -0
  442. package/dist/{lib → generated}/env.d.ts.map +1 -1
  443. package/dist/generated/env.js +69 -0
  444. package/dist/generated/env.js.map +1 -0
  445. package/dist/generated/quetzal-translations.d.ts +2 -2
  446. package/dist/generated/quetzal-translations.js.map +1 -1
  447. package/dist/global.d.ts +8 -1
  448. package/dist/global.d.ts.map +1 -0
  449. package/dist/index.d.ts +18 -18
  450. package/dist/index.js +9 -9
  451. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  452. package/dist/integrations/convex.js +2 -2
  453. package/dist/integrations/convex.js.map +1 -1
  454. package/dist/lib/auth.js +1 -1
  455. package/dist/lib/auth.js.map +1 -1
  456. package/dist/lib/auth.test.js +1 -1
  457. package/dist/lib/auth.test.js.map +1 -1
  458. package/dist/lib/cookie.js.map +1 -1
  459. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts +2 -2
  460. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
  461. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  462. package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
  463. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  464. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  465. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +6 -6
  466. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  467. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +381 -0
  468. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  469. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +16 -14
  470. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  471. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +75 -55
  472. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  473. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  474. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  475. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.d.ts +11 -11
  476. package/dist/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  477. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +34 -20
  478. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  479. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  480. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
  481. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  482. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  483. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  484. package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  485. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  486. package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  487. package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
  488. package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  489. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  490. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  491. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  492. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  493. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  494. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
  495. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +7 -7
  496. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  497. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  498. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
  499. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  500. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  501. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  502. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  503. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  504. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
  505. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +2 -2
  506. package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  507. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.d.ts +1 -0
  508. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  509. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  510. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  511. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
  512. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
  513. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  514. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  515. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
  516. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
  517. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  518. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  519. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
  520. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
  521. package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  522. package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  523. package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
  524. package/dist/lib/hexclave-app/common.js +9 -0
  525. package/dist/lib/hexclave-app/common.js.map +1 -0
  526. package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  527. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
  528. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  529. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
  530. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  531. package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
  532. package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  533. package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
  534. package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  535. package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
  536. package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  537. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
  538. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
  539. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
  540. package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  541. package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
  542. package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  543. package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
  544. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  545. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
  546. package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  547. package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  548. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  549. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
  550. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts +1 -1
  551. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
  552. package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  553. package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
  554. package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  555. package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
  556. package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  557. package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
  558. package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  559. package/dist/lib/hexclave-app/projects/index.js.map +1 -0
  560. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
  561. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
  562. package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  563. package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
  564. package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  565. package/dist/lib/hexclave-app/teams/index.js.map +1 -0
  566. package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  567. package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
  568. package/dist/lib/{stack-app → hexclave-app}/url-targets.js +26 -12
  569. package/dist/lib/hexclave-app/url-targets.js.map +1 -0
  570. package/dist/lib/hexclave-app/url-targets.test.d.ts +1 -0
  571. package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +13 -1
  572. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
  573. package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  574. package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
  575. package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  576. package/dist/lib/hexclave-app/users/index.js.map +1 -0
  577. package/dist/lib/hooks.d.ts +3 -3
  578. package/dist/lib/hooks.d.ts.map +1 -1
  579. package/dist/lib/hooks.js +9 -9
  580. package/dist/lib/hooks.js.map +1 -1
  581. package/dist/lib/translations.js.map +1 -1
  582. package/dist/providers/hexclave-context.d.ts +11 -0
  583. package/dist/providers/hexclave-context.d.ts.map +1 -0
  584. package/dist/providers/hexclave-context.js +15 -0
  585. package/dist/providers/hexclave-context.js.map +1 -0
  586. package/dist/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  587. package/dist/providers/hexclave-provider-client.d.ts.map +1 -0
  588. package/dist/providers/{stack-provider-client.js → hexclave-provider-client.js} +9 -9
  589. package/dist/providers/hexclave-provider-client.js.map +1 -0
  590. package/dist/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  591. package/dist/providers/hexclave-provider.d.ts.map +1 -0
  592. package/dist/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  593. package/dist/providers/hexclave-provider.js.map +1 -0
  594. package/dist/providers/theme-provider.js.map +1 -1
  595. package/dist/providers/translation-provider-client.js.map +1 -1
  596. package/dist/providers/translation-provider.js +1 -1
  597. package/dist/providers/translation-provider.js.map +1 -1
  598. package/dist/tanstack-start-server-context.d.ts +1 -1
  599. package/dist/utils/browser-script.js.map +1 -1
  600. package/dist/utils/constants.js.map +1 -1
  601. package/dist/utils/url.js.map +1 -1
  602. package/package.json +10 -7
  603. package/src/components/api-key-dialogs.tsx +173 -0
  604. package/src/components/api-key-table.tsx +127 -0
  605. package/src/components/credential-sign-in.tsx +83 -0
  606. package/src/components/credential-sign-up.tsx +108 -0
  607. package/src/components/elements/form-warning.tsx +17 -0
  608. package/src/components/elements/maybe-full-page.tsx +60 -0
  609. package/src/components/elements/separator-with-text.tsx +22 -0
  610. package/src/components/elements/sidebar-layout.tsx +136 -0
  611. package/src/components/elements/ssr-layout-effect.tsx +24 -0
  612. package/src/components/elements/user-avatar.tsx +32 -0
  613. package/src/components/link.tsx +38 -0
  614. package/src/components/magic-link-sign-in.tsx +143 -0
  615. package/src/components/message-cards/known-error-message-card.tsx +33 -0
  616. package/src/components/message-cards/message-card.tsx +46 -0
  617. package/src/components/message-cards/predefined-message-card.tsx +88 -0
  618. package/src/components/oauth-button-group.tsx +35 -0
  619. package/src/components/oauth-button.tsx +222 -0
  620. package/src/components/passkey-button.tsx +43 -0
  621. package/src/components/profile-image-editor.tsx +194 -0
  622. package/src/components/selected-team-switcher.tsx +97 -0
  623. package/src/components/team-icon.tsx +30 -0
  624. package/src/components/team-switcher.tsx +191 -0
  625. package/src/components/use-in-iframe.tsx +18 -0
  626. package/src/components/user-button.tsx +157 -0
  627. package/src/components-page/account-settings/active-sessions/active-sessions-page.tsx +238 -0
  628. package/src/components-page/account-settings/api-keys/api-keys-page.tsx +157 -0
  629. package/src/components-page/account-settings/editable-text.tsx +53 -0
  630. package/src/components-page/account-settings/email-and-auth/email-and-auth-page.tsx +24 -0
  631. package/src/components-page/account-settings/email-and-auth/emails-section.tsx +201 -0
  632. package/src/components-page/account-settings/email-and-auth/mfa-section.tsx +139 -0
  633. package/src/components-page/account-settings/email-and-auth/otp-section.tsx +102 -0
  634. package/src/components-page/account-settings/email-and-auth/passkey-section.tsx +112 -0
  635. package/src/components-page/account-settings/email-and-auth/password-section.tsx +174 -0
  636. package/src/components-page/account-settings/notifications/notifications-page.tsx +44 -0
  637. package/src/components-page/account-settings/page-layout.tsx +11 -0
  638. package/src/components-page/account-settings/payments/payments-page.tsx +73 -0
  639. package/src/components-page/account-settings/payments/payments-panel.tsx +543 -0
  640. package/src/components-page/account-settings/profile-page/profile-page.tsx +61 -0
  641. package/src/components-page/account-settings/section.tsx +26 -0
  642. package/src/components-page/account-settings/settings/delete-account-section.tsx +85 -0
  643. package/src/components-page/account-settings/settings/settings-page.tsx +19 -0
  644. package/src/components-page/account-settings/settings/sign-out-section.tsx +40 -0
  645. package/src/components-page/account-settings/teams/leave-team-section.tsx +57 -0
  646. package/src/components-page/account-settings/teams/team-api-keys-section.tsx +74 -0
  647. package/src/components-page/account-settings/teams/team-creation-page.tsx +92 -0
  648. package/src/components-page/account-settings/teams/team-display-name-section.tsx +31 -0
  649. package/src/components-page/account-settings/teams/team-member-invitation-section.tsx +128 -0
  650. package/src/components-page/account-settings/teams/team-member-list-section.tsx +59 -0
  651. package/src/components-page/account-settings/teams/team-page.tsx +28 -0
  652. package/src/components-page/account-settings/teams/team-profile-image-section.tsx +33 -0
  653. package/src/components-page/account-settings/teams/team-profile-user-section.tsx +29 -0
  654. package/src/components-page/account-settings.tsx +343 -0
  655. package/src/components-page/auth-page.tsx +206 -0
  656. package/src/components-page/cli-auth-confirm.test.tsx +204 -0
  657. package/src/components-page/cli-auth-confirm.tsx +278 -0
  658. package/src/components-page/email-verification.tsx +76 -0
  659. package/src/components-page/error-page.tsx +105 -0
  660. package/src/components-page/forgot-password.tsx +105 -0
  661. package/src/components-page/hexclave-handler-client.test.tsx +64 -0
  662. package/src/components-page/hexclave-handler-client.tsx +400 -0
  663. package/src/components-page/hexclave-handler.tsx +48 -0
  664. package/src/components-page/magic-link-callback.tsx +92 -0
  665. package/src/components-page/mfa.tsx +222 -0
  666. package/src/components-page/oauth-callback.tsx +78 -0
  667. package/src/components-page/onboarding.tsx +176 -0
  668. package/src/components-page/password-reset.tsx +185 -0
  669. package/src/components-page/section.tsx +27 -0
  670. package/src/components-page/sign-in.tsx +34 -0
  671. package/src/components-page/sign-out.tsx +37 -0
  672. package/src/components-page/sign-up.tsx +24 -0
  673. package/src/components-page/team-creation.tsx +78 -0
  674. package/src/components-page/team-invitation.tsx +150 -0
  675. package/src/dev-tool/dev-tool-core.ts +2460 -0
  676. package/src/dev-tool/dev-tool-styles.ts +2758 -0
  677. package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
  678. package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
  679. package/src/dev-tool/index.ts +149 -0
  680. package/src/generated/.gitignore +3 -0
  681. package/src/generated/quetzal-translations.ts +4312 -0
  682. package/src/global.css +13 -0
  683. package/src/global.d.ts +12 -0
  684. package/src/index.ts +39 -0
  685. package/src/integrations/convex/component/README.md +74 -0
  686. package/src/integrations/convex/component/convex.config.ts +9 -0
  687. package/src/integrations/convex.ts +28 -0
  688. package/src/lib/auth.test.ts +67 -0
  689. package/src/lib/auth.ts +175 -0
  690. package/src/lib/cookie.ts +327 -0
  691. package/src/lib/hexclave-app/api-keys/index.ts +73 -0
  692. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1261 -0
  693. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +454 -0
  694. package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
  695. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3942 -0
  696. package/src/lib/hexclave-app/apps/implementations/common.ts +264 -0
  697. package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
  698. package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
  699. package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
  700. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
  701. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1619 -0
  702. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
  703. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
  704. package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
  705. package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
  706. package/src/lib/hexclave-app/apps/index.ts +40 -0
  707. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +192 -0
  708. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +180 -0
  709. package/src/lib/hexclave-app/apps/interfaces/server-app.ts +129 -0
  710. package/src/lib/hexclave-app/common.ts +215 -0
  711. package/src/lib/hexclave-app/connected-accounts/index.ts +49 -0
  712. package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
  713. package/src/lib/hexclave-app/customers/index.ts +158 -0
  714. package/src/lib/hexclave-app/data-vault/index.ts +12 -0
  715. package/src/lib/hexclave-app/email/index.ts +280 -0
  716. package/src/lib/hexclave-app/email-templates/index.ts +24 -0
  717. package/src/lib/hexclave-app/index.ts +146 -0
  718. package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
  719. package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
  720. package/src/lib/hexclave-app/permissions/index.ts +75 -0
  721. package/src/lib/hexclave-app/project-configs/index.ts +103 -0
  722. package/src/lib/hexclave-app/projects/index.ts +236 -0
  723. package/src/lib/hexclave-app/session-replays/index.ts +72 -0
  724. package/src/lib/hexclave-app/teams/index.ts +206 -0
  725. package/src/lib/hexclave-app/url-targets.test.ts +270 -0
  726. package/src/lib/hexclave-app/url-targets.ts +413 -0
  727. package/src/lib/hexclave-app/users/index.ts +523 -0
  728. package/src/lib/hooks.tsx +63 -0
  729. package/src/lib/translations.tsx +23 -0
  730. package/src/providers/hexclave-context.tsx +20 -0
  731. package/src/providers/hexclave-provider-client.tsx +39 -0
  732. package/src/providers/hexclave-provider.tsx +48 -0
  733. package/src/providers/theme-provider.tsx +121 -0
  734. package/src/providers/translation-provider-client.tsx +35 -0
  735. package/src/providers/translation-provider.tsx +25 -0
  736. package/src/tanstack-start-server-context.d.ts +13 -0
  737. package/src/utils/browser-script.tsx +135 -0
  738. package/src/utils/constants.tsx +58 -0
  739. package/src/utils/url.ts +24 -0
  740. package/dist/components-page/stack-handler-client.d.ts.map +0 -1
  741. package/dist/components-page/stack-handler-client.js.map +0 -1
  742. package/dist/components-page/stack-handler.d.ts.map +0 -1
  743. package/dist/components-page/stack-handler.js.map +0 -1
  744. package/dist/esm/components-page/stack-handler-client.d.ts.map +0 -1
  745. package/dist/esm/components-page/stack-handler-client.js.map +0 -1
  746. package/dist/esm/components-page/stack-handler.d.ts.map +0 -1
  747. package/dist/esm/components-page/stack-handler.js.map +0 -1
  748. package/dist/esm/lib/env.d.ts +0 -42
  749. package/dist/esm/lib/env.js +0 -93
  750. package/dist/esm/lib/env.js.map +0 -1
  751. package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
  752. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  753. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  754. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +0 -121
  755. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  756. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  757. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  758. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  759. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  760. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
  761. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  762. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  763. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
  764. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  765. package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
  766. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
  767. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  768. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  769. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  770. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  771. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  772. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  773. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  774. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  775. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  776. package/dist/esm/lib/stack-app/common.js +0 -7
  777. package/dist/esm/lib/stack-app/common.js.map +0 -1
  778. package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
  779. package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
  780. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
  781. package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
  782. package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
  783. package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
  784. package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
  785. package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
  786. package/dist/esm/lib/stack-app/users/index.js.map +0 -1
  787. package/dist/esm/providers/stack-context.d.ts +0 -11
  788. package/dist/esm/providers/stack-context.d.ts.map +0 -1
  789. package/dist/esm/providers/stack-context.js +0 -12
  790. package/dist/esm/providers/stack-context.js.map +0 -1
  791. package/dist/esm/providers/stack-provider-client.d.ts.map +0 -1
  792. package/dist/esm/providers/stack-provider-client.js +0 -30
  793. package/dist/esm/providers/stack-provider-client.js.map +0 -1
  794. package/dist/esm/providers/stack-provider.d.ts.map +0 -1
  795. package/dist/esm/providers/stack-provider.js.map +0 -1
  796. package/dist/lib/env.d.ts +0 -42
  797. package/dist/lib/env.js +0 -95
  798. package/dist/lib/env.js.map +0 -1
  799. package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
  800. package/dist/lib/stack-app/api-keys/index.js.map +0 -1
  801. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  802. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  803. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +0 -121
  804. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  805. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  806. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  807. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  808. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  809. package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
  810. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
  811. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  812. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  813. package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
  814. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  815. package/dist/lib/stack-app/apps/implementations/index.js +0 -31
  816. package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
  817. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
  818. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  819. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
  820. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  821. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
  822. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  823. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  824. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
  825. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  826. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  827. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
  828. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  829. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
  830. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  831. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
  832. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  833. package/dist/lib/stack-app/common.d.ts.map +0 -1
  834. package/dist/lib/stack-app/common.js +0 -9
  835. package/dist/lib/stack-app/common.js.map +0 -1
  836. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
  837. package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
  838. package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
  839. package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
  840. package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
  841. package/dist/lib/stack-app/email/index.d.ts.map +0 -1
  842. package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
  843. package/dist/lib/stack-app/email-templates/index.js.map +0 -1
  844. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
  845. package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
  846. package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
  847. package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
  848. package/dist/lib/stack-app/permissions/index.js.map +0 -1
  849. package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
  850. package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
  851. package/dist/lib/stack-app/projects/index.js.map +0 -1
  852. package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
  853. package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
  854. package/dist/lib/stack-app/teams/index.js.map +0 -1
  855. package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
  856. package/dist/lib/stack-app/url-targets.js.map +0 -1
  857. package/dist/lib/stack-app/url-targets.test.js.map +0 -1
  858. package/dist/lib/stack-app/users/index.d.ts.map +0 -1
  859. package/dist/lib/stack-app/users/index.js.map +0 -1
  860. package/dist/providers/stack-context.d.ts +0 -11
  861. package/dist/providers/stack-context.d.ts.map +0 -1
  862. package/dist/providers/stack-context.js +0 -15
  863. package/dist/providers/stack-context.js.map +0 -1
  864. package/dist/providers/stack-provider-client.d.ts.map +0 -1
  865. package/dist/providers/stack-provider-client.js.map +0 -1
  866. package/dist/providers/stack-provider.d.ts.map +0 -1
  867. package/dist/providers/stack-provider.js.map +0 -1
  868. /package/dist/{esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts → components-page/hexclave-handler-client.test.d.ts} +0 -0
  869. /package/dist/esm/{lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts → components-page/hexclave-handler-client.test.d.ts} +0 -0
  870. /package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  871. /package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  872. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  873. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  874. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  875. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  876. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  877. /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  878. /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  879. /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  880. /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  881. /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  882. /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  883. /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  884. /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
  885. /package/dist/lib/{stack-app/apps/implementations/event-tracker.test.d.ts → hexclave-app/apps/implementations/client-app-impl.cross-domain.test.d.ts} +0 -0
  886. /package/dist/lib/{stack-app/apps/implementations/session-refresh-subscription.test.d.ts → hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts} +0 -0
  887. /package/dist/lib/{stack-app/apps/implementations/session-replay.test.d.ts → hexclave-app/apps/implementations/event-tracker.test.d.ts} +0 -0
  888. /package/dist/lib/{stack-app/url-targets.test.d.ts → hexclave-app/apps/implementations/session-refresh-subscription.test.d.ts} +0 -0
  889. /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  890. /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  891. /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  892. /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  893. /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  894. /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  895. /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  896. /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  897. /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"emails-section.js","names":["Typography","Input","Button","FormWarningText","Table","TableBody","TableRow","TableCell","Badge","ActionCell","KnownErrors"],"sources":["../../../../src/components-page/account-settings/email-and-auth/emails-section.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 { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function EmailsSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n </div>\n <Typography variant='secondary'>{t(\"Email management is not available in demo mode.\")}</Typography>\n </div>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to redirect\n }\n\n const contactChannels = user.useContactChannels();\n const [addingEmail, setAddingEmail] = useState(contactChannels.length === 0);\n const [addingEmailLoading, setAddingEmailLoading] = useState(false);\n const [addedEmail, setAddedEmail] = useState<string | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isLastEmailUsedForAuth = contactChannels.filter(x => x.usedForAuth && x.type === 'email').length === 1;\n\n useEffect(() => {\n if (addedEmail) {\n runAsynchronously(async () => {\n const cc = contactChannels.find(x => x.value === addedEmail);\n if (cc && !cc.isVerified) {\n await cc.sendVerificationEmail();\n }\n setAddedEmail(null);\n });\n }\n }, [contactChannels, addedEmail]);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .notOneOf(contactChannels.map(x => x.value), t('Email already exists'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors }, reset } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setAddingEmailLoading(true);\n try {\n await user.createContactChannel({ type: 'email', value: data.email, usedForAuth: false });\n setAddedEmail(data.email);\n } finally {\n setAddingEmailLoading(false);\n }\n setAddingEmail(false);\n reset();\n };\n\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n {addingEmail ? (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n runAsynchronously(handleSubmit(onSubmit));\n }}\n className='flex flex-col'\n >\n <div className='flex gap-2'>\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter email\")}\n />\n <Button type=\"submit\" loading={addingEmailLoading}>\n {t(\"Add\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => {\n setAddingEmail(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n {errors.email && <FormWarningText text={errors.email.message} />}\n </form>\n ) : (\n <div className='flex md:justify-end'>\n <Button variant='secondary' onClick={() => setAddingEmail(true)}>{t(\"Add an email\")}</Button>\n </div>\n )}\n </div>\n\n {contactChannels.length > 0 ? (\n <div className='border rounded-md'>\n <Table>\n <TableBody>\n {/*eslint-disable-next-line @typescript-eslint/no-unnecessary-condition*/}\n {contactChannels.filter(x => x.type === 'email')\n .sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1;\n if (a.isVerified !== b.isVerified) return a.isVerified ? -1 : 1;\n return 0;\n })\n .map(x => (\n <TableRow key={x.id}>\n <TableCell>\n <div className='flex flex-col md:flex-row gap-2 md:gap-4'>\n {x.value}\n <div className='flex gap-2'>\n {x.isPrimary ? <Badge>{t(\"Primary\")}</Badge> : null}\n {!x.isVerified ? <Badge variant='destructive'>{t(\"Unverified\")}</Badge> : null}\n {x.usedForAuth ? <Badge variant='outline'>{t(\"Used for sign-in\")}</Badge> : null}\n </div>\n </div>\n </TableCell>\n <TableCell className=\"flex justify-end\">\n <ActionCell items={[\n ...(!x.isVerified ? [{\n item: t(\"Send verification email\"),\n onClick: async () => { await x.sendVerificationEmail(); },\n }] : []),\n ...(!x.isPrimary && x.isVerified ? [{\n item: t(\"Set as primary\"),\n onClick: async () => { await x.update({ isPrimary: true }); },\n }] :\n !x.isPrimary ? [{\n item: t(\"Set as primary\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"Please verify your email first\"),\n }] : []),\n ...(!x.usedForAuth && x.isVerified ? [{\n item: t(\"Use for sign-in\"),\n onClick: async () => {\n try {\n await x.update({ usedForAuth: true });\n } catch (e) {\n if (KnownErrors.ContactChannelAlreadyUsedForAuthBySomeoneElse.isInstance(e)) {\n alert(t(\"This email is already used for sign-in by another user.\"));\n }\n }\n }\n }] : []),\n ...(x.usedForAuth && !isLastEmailUsedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => { await x.update({ usedForAuth: false }); },\n }] : x.usedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }] : []),\n // Determine if this email can be removed\n ...(!isLastEmailUsedForAuth || !x.usedForAuth ? [{\n item: t(\"Remove\"),\n onClick: async () => { await x.delete(); },\n danger: true,\n }] : [{\n item: t(\"Remove\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }]),\n ]}/>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"emails-section.js","names":["Typography","Input","Button","FormWarningText","Table","TableBody","TableRow","TableCell","Badge","ActionCell","KnownErrors"],"sources":["../../../../src/components-page/account-settings/email-and-auth/emails-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function EmailsSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n </div>\n <Typography variant='secondary'>{t(\"Email management is not available in demo mode.\")}</Typography>\n </div>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to redirect\n }\n\n const contactChannels = user.useContactChannels();\n const [addingEmail, setAddingEmail] = useState(contactChannels.length === 0);\n const [addingEmailLoading, setAddingEmailLoading] = useState(false);\n const [addedEmail, setAddedEmail] = useState<string | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isLastEmailUsedForAuth = contactChannels.filter(x => x.usedForAuth && x.type === 'email').length === 1;\n\n useEffect(() => {\n if (addedEmail) {\n runAsynchronously(async () => {\n const cc = contactChannels.find(x => x.value === addedEmail);\n if (cc && !cc.isVerified) {\n await cc.sendVerificationEmail();\n }\n setAddedEmail(null);\n });\n }\n }, [contactChannels, addedEmail]);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .notOneOf(contactChannels.map(x => x.value), t('Email already exists'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors }, reset } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setAddingEmailLoading(true);\n try {\n await user.createContactChannel({ type: 'email', value: data.email, usedForAuth: false });\n setAddedEmail(data.email);\n } finally {\n setAddingEmailLoading(false);\n }\n setAddingEmail(false);\n reset();\n };\n\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n {addingEmail ? (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n runAsynchronously(handleSubmit(onSubmit));\n }}\n className='flex flex-col'\n >\n <div className='flex gap-2'>\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter email\")}\n />\n <Button type=\"submit\" loading={addingEmailLoading}>\n {t(\"Add\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => {\n setAddingEmail(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n {errors.email && <FormWarningText text={errors.email.message} />}\n </form>\n ) : (\n <div className='flex md:justify-end'>\n <Button variant='secondary' onClick={() => setAddingEmail(true)}>{t(\"Add an email\")}</Button>\n </div>\n )}\n </div>\n\n {contactChannels.length > 0 ? (\n <div className='border rounded-md'>\n <Table>\n <TableBody>\n {/*eslint-disable-next-line @typescript-eslint/no-unnecessary-condition*/}\n {contactChannels.filter(x => x.type === 'email')\n .sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1;\n if (a.isVerified !== b.isVerified) return a.isVerified ? -1 : 1;\n return 0;\n })\n .map(x => (\n <TableRow key={x.id}>\n <TableCell>\n <div className='flex flex-col md:flex-row gap-2 md:gap-4'>\n {x.value}\n <div className='flex gap-2'>\n {x.isPrimary ? <Badge>{t(\"Primary\")}</Badge> : null}\n {!x.isVerified ? <Badge variant='destructive'>{t(\"Unverified\")}</Badge> : null}\n {x.usedForAuth ? <Badge variant='outline'>{t(\"Used for sign-in\")}</Badge> : null}\n </div>\n </div>\n </TableCell>\n <TableCell className=\"flex justify-end\">\n <ActionCell items={[\n ...(!x.isVerified ? [{\n item: t(\"Send verification email\"),\n onClick: async () => { await x.sendVerificationEmail(); },\n }] : []),\n ...(!x.isPrimary && x.isVerified ? [{\n item: t(\"Set as primary\"),\n onClick: async () => { await x.update({ isPrimary: true }); },\n }] :\n !x.isPrimary ? [{\n item: t(\"Set as primary\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"Please verify your email first\"),\n }] : []),\n ...(!x.usedForAuth && x.isVerified ? [{\n item: t(\"Use for sign-in\"),\n onClick: async () => {\n try {\n await x.update({ usedForAuth: true });\n } catch (e) {\n if (KnownErrors.ContactChannelAlreadyUsedForAuthBySomeoneElse.isInstance(e)) {\n alert(t(\"This email is already used for sign-in by another user.\"));\n }\n }\n }\n }] : []),\n ...(x.usedForAuth && !isLastEmailUsedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => { await x.update({ usedForAuth: false }); },\n }] : x.usedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }] : []),\n // Determine if this email can be removed\n ...(!isLastEmailUsedForAuth || !x.usedForAuth ? [{\n item: t(\"Remove\"),\n onClick: async () => { await x.delete(); },\n danger: true,\n }] : [{\n item: t(\"Remove\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }]),\n ]}/>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../chunk-BE-pF4vm.js');
3
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
3
4
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
5
  let _hexclave_ui = require("@hexclave/ui");
5
6
  let react = require("react");
6
7
  let react_jsx_runtime = require("react/jsx-runtime");
7
- let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
8
8
  let _________lib_hooks_js = require("../../../lib/hooks.js");
9
9
  let _________lib_translations_js = require("../../../lib/translations.js");
10
10
  let _oslojs_otp = require("@oslojs/otp");
@@ -1 +1 @@
1
- {"version":3,"file":"mfa-section.js","names":["Section","Typography","Input","Button","QRCode"],"sources":["../../../../src/components-page/account-settings/email-and-auth/mfa-section.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 { createTOTPKeyURI, verifyTOTP } from \"@oslojs/otp\";\nimport { useAsyncCallback } from '@hexclave/shared/dist/hooks/use-async-callback';\nimport { generateRandomValues } from '@hexclave/shared/dist/utils/crypto';\nimport { throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport * as QRCode from 'qrcode';\nimport { useEffect, useState } from \"react\";\nimport { CurrentUser, Project } from '../../..';\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function MfaSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const project = useStackApp().useProject();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={t(\"MFA management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"MFA management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const [generatedSecret, setGeneratedSecret] = useState<Uint8Array | null>(null);\n const [qrCodeUrl, setQrCodeUrl] = useState<string | null>(null);\n const [mfaCode, setMfaCode] = useState<string>(\"\");\n const [isMaybeWrong, setIsMaybeWrong] = useState(false);\n const isEnabled = user.isMultiFactorRequired;\n\n const [handleSubmit, isLoading] = useAsyncCallback(async () => {\n await user.update({\n totpMultiFactorSecret: generatedSecret,\n });\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }, [generatedSecret, user]);\n\n useEffect(() => {\n setIsMaybeWrong(false);\n runAsynchronouslyWithAlert(async () => {\n if (generatedSecret && verifyTOTP(generatedSecret, 30, 6, mfaCode)) {\n await handleSubmit();\n }\n setIsMaybeWrong(true);\n });\n }, [mfaCode, generatedSecret, handleSubmit]);\n\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={isEnabled\n ? t(\"Multi-factor authentication is currently enabled.\")\n : t(\"Multi-factor authentication is currently disabled.\")}\n >\n <div className='flex flex-col gap-4'>\n {!isEnabled && generatedSecret && (\n <>\n <Typography>{t(\"Scan this QR code with your authenticator app:\")}</Typography>\n <img width={200} height={200} src={qrCodeUrl ?? throwErr(\"TOTP QR code failed to generate\")} alt={t(\"TOTP multi-factor authentication QR code\")} />\n <Typography>{t(\"Then, enter your six-digit MFA code:\")}</Typography>\n <Input\n value={mfaCode}\n onChange={(e) => {\n setIsMaybeWrong(false);\n setMfaCode(e.target.value);\n }}\n placeholder=\"123456\"\n maxLength={6}\n disabled={isLoading}\n />\n {isMaybeWrong && mfaCode.length === 6 && (\n <Typography variant=\"destructive\">{t(\"Incorrect code. Please try again.\")}</Typography>\n )}\n <div className='flex'>\n <Button\n variant='secondary'\n onClick={() => {\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </>\n )}\n <div className='flex gap-2'>\n {isEnabled ? (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({\n totpMultiFactorSecret: null,\n });\n }}\n >\n {t(\"Disable MFA\")}\n </Button>\n ) : !generatedSecret && (\n <Button\n variant='secondary'\n onClick={async () => {\n const secret = generateRandomValues(new Uint8Array(20));\n setQrCodeUrl(await generateTotpQrCode(project, user, secret));\n setGeneratedSecret(secret);\n }}\n >\n {t(\"Enable MFA\")}\n </Button>\n )}\n </div>\n </div>\n </Section>\n );\n}\n\n\nasync function generateTotpQrCode(project: Project, user: CurrentUser, secret: Uint8Array) {\n const uri = createTOTPKeyURI(project.displayName, user.primaryEmail ?? user.id, secret, 30, 6);\n return await QRCode.toDataURL(uri) as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,CAAC,iBAAiB,0CAAkD,KAAK;CAC/E,MAAM,CAAC,WAAW,oCAAwC,KAAK;CAC/D,MAAM,CAAC,SAAS,kCAA+B,GAAG;CAClD,MAAM,CAAC,cAAc,uCAA4B,MAAM;CACvD,MAAM,YAAY,KAAK;CAEvB,MAAM,CAAC,cAAc,kFAA8B,YAAY;AAC7D,QAAM,KAAK,OAAO,EAChB,uBAAuB,iBACxB,CAAC;AACF,qBAAmB,KAAK;AACxB,eAAa,KAAK;AAClB,aAAW,GAAG;IACb,CAAC,iBAAiB,KAAK,CAAC;AAE3B,4BAAgB;AACd,kBAAgB,MAAM;AACtB,uEAA2B,YAAY;AACrC,OAAI,+CAA8B,iBAAiB,IAAI,GAAG,QAAQ,CAChE,OAAM,cAAc;AAEtB,mBAAgB,KAAK;IACrB;IACD;EAAC;EAAS;EAAiB;EAAa,CAAC;AAE5C,QACE,2CAACD;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,YACT,EAAE,oDAAoD,GACtD,EAAE,qDAAqD;YAE3D,4CAAC;GAAI,WAAU;cACZ,CAAC,aAAa,mBACb;IACE,2CAACC,qCAAY,EAAE,iDAAiD,GAAc;IAC9E,2CAAC;KAAI,OAAO;KAAK,QAAQ;KAAK,KAAK,8DAAsB,kCAAkC;KAAE,KAAK,EAAE,2CAA2C;MAAI;IACnJ,2CAACA,qCAAY,EAAE,uCAAuC,GAAc;IACpE,2CAACC;KACC,OAAO;KACP,WAAW,MAAM;AACf,sBAAgB,MAAM;AACtB,iBAAW,EAAE,OAAO,MAAM;;KAE5B,aAAY;KACZ,WAAW;KACX,UAAU;MACV;IACD,gBAAgB,QAAQ,WAAW,KAClC,2CAACD;KAAW,SAAQ;eAAe,EAAE,oCAAoC;MAAc;IAEzF,2CAAC;KAAI,WAAU;eACb,2CAACE;MACC,SAAQ;MACR,eAAe;AACb,0BAAmB,KAAK;AACxB,oBAAa,KAAK;AAClB,kBAAW,GAAG;;gBAGf,EAAE,SAAS;OACL;MACL;OACL,EAEL,2CAAC;IAAI,WAAU;cACZ,YACC,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;AACnB,YAAM,KAAK,OAAO,EAChB,uBAAuB,MACxB,CAAC;;eAGH,EAAE,cAAc;MACV,GACP,CAAC,mBACH,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;MACnB,MAAM,sEAA8B,IAAI,WAAW,GAAG,CAAC;AACvD,mBAAa,MAAM,mBAAmB,SAAS,MAAM,OAAO,CAAC;AAC7D,yBAAmB,OAAO;;eAG3B,EAAE,aAAa;MACT;KAEP;IACF;GACE;;AAKd,eAAe,mBAAmB,SAAkB,MAAmB,QAAoB;CACzF,MAAM,wCAAuB,QAAQ,aAAa,KAAK,gBAAgB,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC9F,QAAO,MAAMC,OAAO,UAAU,IAAI"}
1
+ {"version":3,"file":"mfa-section.js","names":["Section","Typography","Input","Button","QRCode"],"sources":["../../../../src/components-page/account-settings/email-and-auth/mfa-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { createTOTPKeyURI, verifyTOTP } from \"@oslojs/otp\";\nimport { useAsyncCallback } from '@hexclave/shared/dist/hooks/use-async-callback';\nimport { generateRandomValues } from '@hexclave/shared/dist/utils/crypto';\nimport { throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport * as QRCode from 'qrcode';\nimport { useEffect, useState } from \"react\";\nimport { CurrentUser, Project } from '../../..';\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function MfaSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const project = useStackApp().useProject();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={t(\"MFA management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"MFA management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const [generatedSecret, setGeneratedSecret] = useState<Uint8Array | null>(null);\n const [qrCodeUrl, setQrCodeUrl] = useState<string | null>(null);\n const [mfaCode, setMfaCode] = useState<string>(\"\");\n const [isMaybeWrong, setIsMaybeWrong] = useState(false);\n const isEnabled = user.isMultiFactorRequired;\n\n const [handleSubmit, isLoading] = useAsyncCallback(async () => {\n await user.update({\n totpMultiFactorSecret: generatedSecret,\n });\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }, [generatedSecret, user]);\n\n useEffect(() => {\n setIsMaybeWrong(false);\n runAsynchronouslyWithAlert(async () => {\n if (generatedSecret && verifyTOTP(generatedSecret, 30, 6, mfaCode)) {\n await handleSubmit();\n }\n setIsMaybeWrong(true);\n });\n }, [mfaCode, generatedSecret, handleSubmit]);\n\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={isEnabled\n ? t(\"Multi-factor authentication is currently enabled.\")\n : t(\"Multi-factor authentication is currently disabled.\")}\n >\n <div className='flex flex-col gap-4'>\n {!isEnabled && generatedSecret && (\n <>\n <Typography>{t(\"Scan this QR code with your authenticator app:\")}</Typography>\n <img width={200} height={200} src={qrCodeUrl ?? throwErr(\"TOTP QR code failed to generate\")} alt={t(\"TOTP multi-factor authentication QR code\")} />\n <Typography>{t(\"Then, enter your six-digit MFA code:\")}</Typography>\n <Input\n value={mfaCode}\n onChange={(e) => {\n setIsMaybeWrong(false);\n setMfaCode(e.target.value);\n }}\n placeholder=\"123456\"\n maxLength={6}\n disabled={isLoading}\n />\n {isMaybeWrong && mfaCode.length === 6 && (\n <Typography variant=\"destructive\">{t(\"Incorrect code. Please try again.\")}</Typography>\n )}\n <div className='flex'>\n <Button\n variant='secondary'\n onClick={() => {\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </>\n )}\n <div className='flex gap-2'>\n {isEnabled ? (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({\n totpMultiFactorSecret: null,\n });\n }}\n >\n {t(\"Disable MFA\")}\n </Button>\n ) : !generatedSecret && (\n <Button\n variant='secondary'\n onClick={async () => {\n const secret = generateRandomValues(new Uint8Array(20));\n setQrCodeUrl(await generateTotpQrCode(project, user, secret));\n setGeneratedSecret(secret);\n }}\n >\n {t(\"Enable MFA\")}\n </Button>\n )}\n </div>\n </div>\n </Section>\n );\n}\n\n\nasync function generateTotpQrCode(project: Project, user: CurrentUser, secret: Uint8Array) {\n const uri = createTOTPKeyURI(project.displayName, user.primaryEmail ?? user.id, secret, 30, 6);\n return await QRCode.toDataURL(uri) as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,CAAC,iBAAiB,0CAAkD,KAAK;CAC/E,MAAM,CAAC,WAAW,oCAAwC,KAAK;CAC/D,MAAM,CAAC,SAAS,kCAA+B,GAAG;CAClD,MAAM,CAAC,cAAc,uCAA4B,MAAM;CACvD,MAAM,YAAY,KAAK;CAEvB,MAAM,CAAC,cAAc,kFAA8B,YAAY;AAC7D,QAAM,KAAK,OAAO,EAChB,uBAAuB,iBACxB,CAAC;AACF,qBAAmB,KAAK;AACxB,eAAa,KAAK;AAClB,aAAW,GAAG;IACb,CAAC,iBAAiB,KAAK,CAAC;AAE3B,4BAAgB;AACd,kBAAgB,MAAM;AACtB,uEAA2B,YAAY;AACrC,OAAI,+CAA8B,iBAAiB,IAAI,GAAG,QAAQ,CAChE,OAAM,cAAc;AAEtB,mBAAgB,KAAK;IACrB;IACD;EAAC;EAAS;EAAiB;EAAa,CAAC;AAE5C,QACE,2CAACD;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,YACT,EAAE,oDAAoD,GACtD,EAAE,qDAAqD;YAE3D,4CAAC;GAAI,WAAU;cACZ,CAAC,aAAa,mBACb;IACE,2CAACC,qCAAY,EAAE,iDAAiD,GAAc;IAC9E,2CAAC;KAAI,OAAO;KAAK,QAAQ;KAAK,KAAK,8DAAsB,kCAAkC;KAAE,KAAK,EAAE,2CAA2C;MAAI;IACnJ,2CAACA,qCAAY,EAAE,uCAAuC,GAAc;IACpE,2CAACC;KACC,OAAO;KACP,WAAW,MAAM;AACf,sBAAgB,MAAM;AACtB,iBAAW,EAAE,OAAO,MAAM;;KAE5B,aAAY;KACZ,WAAW;KACX,UAAU;MACV;IACD,gBAAgB,QAAQ,WAAW,KAClC,2CAACD;KAAW,SAAQ;eAAe,EAAE,oCAAoC;MAAc;IAEzF,2CAAC;KAAI,WAAU;eACb,2CAACE;MACC,SAAQ;MACR,eAAe;AACb,0BAAmB,KAAK;AACxB,oBAAa,KAAK;AAClB,kBAAW,GAAG;;gBAGf,EAAE,SAAS;OACL;MACL;OACL,EAEL,2CAAC;IAAI,WAAU;cACZ,YACC,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;AACnB,YAAM,KAAK,OAAO,EAChB,uBAAuB,MACxB,CAAC;;eAGH,EAAE,cAAc;MACV,GACP,CAAC,mBACH,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;MACnB,MAAM,sEAA8B,IAAI,WAAW,GAAG,CAAC;AACvD,mBAAa,MAAM,mBAAmB,SAAS,MAAM,OAAO,CAAC;AAC7D,yBAAmB,OAAO;;eAG3B,EAAE,aAAa;MACT;KAEP;IACF;GACE;;AAKd,eAAe,mBAAmB,SAAkB,MAAmB,QAAoB;CACzF,MAAM,wCAAuB,QAAQ,aAAa,KAAK,gBAAgB,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC9F,QAAO,MAAMC,OAAO,UAAU,IAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"otp-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/otp-section.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, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function OtpSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"One-Time Password\")}\n description={t(\"OTP management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"OTP management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const project = useStackApp().useProject();\n const contactChannels = user.useContactChannels();\n const isLastAuth = user.otpAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.passkeyAuthEnabled;\n const [disabling, setDisabling] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.magicLinkEnabled) {\n return null;\n }\n\n const handleDisableOTP = async () => {\n await user.update({ otpAuthEnabled: false });\n setDisabling(false);\n };\n\n return (\n <Section title={t(\"OTP sign-in\")} description={user.otpAuthEnabled ? t(\"OTP/magic link sign-in is currently enabled.\") : t(\"Enable sign-in via magic link or OTP sent to your sign-in emails.\")}>\n <div className='flex md:justify-end'>\n {hasValidEmail ? (\n user.otpAuthEnabled ? (\n !isLastAuth ? (\n !disabling ? (\n <Button\n variant='secondary'\n onClick={() => setDisabling(true)}\n >\n {t(\"Disable OTP\")}\n </Button>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable OTP sign-in? You will not be able to sign in with only emails anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDisableOTP}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDisabling(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"OTP sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )\n ) : (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({ otpAuthEnabled: true });\n }}\n >\n {t(\"Enable OTP\")}\n </Button>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To enable OTP sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,kBAAkB,KAAK,oBAAoB;CACjD,MAAM,aAAa,KAAK,kBAAkB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CACzG,MAAM,CAAC,WAAW,oCAAyB,MAAM;CAGjD,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,iBAClB,QAAO;CAGT,MAAM,mBAAmB,YAAY;AACnC,QAAM,KAAK,OAAO,EAAE,gBAAgB,OAAO,CAAC;AAC5C,eAAa,MAAM;;AAGrB,QACE,2CAACD;EAAQ,OAAO,EAAE,cAAc;EAAE,aAAa,KAAK,iBAAiB,EAAE,+CAA+C,GAAG,EAAE,oEAAoE;YAC7L,2CAAC;GAAI,WAAU;aACZ,gBACC,KAAK,iBACH,CAAC,aACC,CAAC,YACC,2CAACE;IACC,SAAQ;IACR,eAAe,aAAa,KAAK;cAEhC,EAAE,cAAc;KACV,GAET,4CAAC;IAAI,WAAU;eACb,2CAACD;KAAW,SAAQ;eACjB,EAAE,0GAA0G;MAClG,EACb,4CAAC;KAAI,WAAU;gBACb,2CAACC;MACC,SAAQ;MACR,SAAS;gBAER,EAAE,UAAU;OACN,EACT,2CAACA;MACC,SAAQ;MACR,eAAe,aAAa,MAAM;gBAEjC,EAAE,SAAS;OACL;MACL;KACF,GAGR,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,2FAA2F;KAAc,GAG3J,2CAACC;IACC,SAAQ;IACR,SAAS,YAAY;AACnB,WAAM,KAAK,OAAO,EAAE,gBAAgB,MAAM,CAAC;;cAG5C,EAAE,aAAa;KACT,GAGX,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,8DAA8D;KAAc;IAE1H;GACE"}
1
+ {"version":3,"file":"otp-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/otp-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function OtpSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"One-Time Password\")}\n description={t(\"OTP management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"OTP management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const project = useStackApp().useProject();\n const contactChannels = user.useContactChannels();\n const isLastAuth = user.otpAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.passkeyAuthEnabled;\n const [disabling, setDisabling] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.magicLinkEnabled) {\n return null;\n }\n\n const handleDisableOTP = async () => {\n await user.update({ otpAuthEnabled: false });\n setDisabling(false);\n };\n\n return (\n <Section title={t(\"OTP sign-in\")} description={user.otpAuthEnabled ? t(\"OTP/magic link sign-in is currently enabled.\") : t(\"Enable sign-in via magic link or OTP sent to your sign-in emails.\")}>\n <div className='flex md:justify-end'>\n {hasValidEmail ? (\n user.otpAuthEnabled ? (\n !isLastAuth ? (\n !disabling ? (\n <Button\n variant='secondary'\n onClick={() => setDisabling(true)}\n >\n {t(\"Disable OTP\")}\n </Button>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable OTP sign-in? You will not be able to sign in with only emails anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDisableOTP}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDisabling(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"OTP sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )\n ) : (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({ otpAuthEnabled: true });\n }}\n >\n {t(\"Enable OTP\")}\n </Button>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To enable OTP sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,kBAAkB,KAAK,oBAAoB;CACjD,MAAM,aAAa,KAAK,kBAAkB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CACzG,MAAM,CAAC,WAAW,oCAAyB,MAAM;CAGjD,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,iBAClB,QAAO;CAGT,MAAM,mBAAmB,YAAY;AACnC,QAAM,KAAK,OAAO,EAAE,gBAAgB,OAAO,CAAC;AAC5C,eAAa,MAAM;;AAGrB,QACE,2CAACD;EAAQ,OAAO,EAAE,cAAc;EAAE,aAAa,KAAK,iBAAiB,EAAE,+CAA+C,GAAG,EAAE,oEAAoE;YAC7L,2CAAC;GAAI,WAAU;aACZ,gBACC,KAAK,iBACH,CAAC,aACC,CAAC,YACC,2CAACE;IACC,SAAQ;IACR,eAAe,aAAa,KAAK;cAEhC,EAAE,cAAc;KACV,GAET,4CAAC;IAAI,WAAU;eACb,2CAACD;KAAW,SAAQ;eACjB,EAAE,0GAA0G;MAClG,EACb,4CAAC;KAAI,WAAU;gBACb,2CAACC;MACC,SAAQ;MACR,SAAS;gBAER,EAAE,UAAU;OACN,EACT,2CAACA;MACC,SAAQ;MACR,eAAe,aAAa,MAAM;gBAEjC,EAAE,SAAS;OACL;MACL;KACF,GAGR,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,2FAA2F;KAAc,GAG3J,2CAACC;IACC,SAAQ;IACR,SAAS,YAAY;AACnB,WAAM,KAAK,OAAO,EAAE,gBAAgB,MAAM,CAAC;;cAG5C,EAAE,aAAa;KACT,GAGX,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,8DAA8D;KAAc;IAE1H;GACE"}
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/passkey-section.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, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function PasskeySection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Passkey\")}\n description={t(\"Passkey management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Passkey management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const stackApp = useStackApp();\n const project = stackApp.useProject();\n const contactChannels = user.useContactChannels();\n\n\n // passkey is enabled if there is a passkey\n const hasPasskey = user.passkeyAuthEnabled;\n\n const isLastAuth = user.passkeyAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.otpAuthEnabled;\n const [showConfirmationModal, setShowConfirmationModal] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.passkeyEnabled) {\n return null;\n }\n\n const handleDeletePasskey = async () => {\n await user.update({ passkeyAuthEnabled: false });\n setShowConfirmationModal(false);\n };\n\n\n const handleAddNewPasskey = async () => {\n await user.registerPasskey();\n };\n\n return (\n <>\n <Section title={t(\"Passkey\")} description={hasPasskey ? t(\"Passkey registered\") : t(\"Register a passkey\")}>\n <div className='flex md:justify-end gap-2'>\n {!hasValidEmail && (\n <Typography variant='secondary' type='label'>{t(\"To enable Passkey sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n {hasValidEmail && hasPasskey && isLastAuth && (\n <Typography variant='secondary' type='label'>{t(\"Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )}\n {!hasPasskey && hasValidEmail && (\n <div>\n <Button onClick={handleAddNewPasskey} variant='secondary'>{t(\"Add new passkey\")}</Button>\n </div>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && (\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(true)}\n >\n {t(\"Delete Passkey\")}\n </Button>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeletePasskey}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n\n </>\n\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAe,OAE5B;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,UAAU;EACnB,aAAa,EAAE,oDAAoD;YAEnE,2CAACC;GAAW,SAAQ;aAAa,EAAE,oDAAoD;IAAc;GAC7F;AAId,KAAI,CAAC,KACH,QAAO;CAGT,MAAM,8CADwB,CACL,YAAY;CACrC,MAAM,kBAAkB,KAAK,oBAAoB;CAIjD,MAAM,aAAa,KAAK;CAExB,MAAM,aAAa,KAAK,sBAAsB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CAC7G,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CAGzE,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,eAClB,QAAO;CAGT,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,OAAO,EAAE,oBAAoB,OAAO,CAAC;AAChD,2BAAyB,MAAM;;CAIjC,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,iBAAiB;;AAG9B,QACE,mFACE,2CAACD;EAAQ,OAAO,EAAE,UAAU;EAAE,aAAa,aAAa,EAAE,qBAAqB,GAAG,EAAE,qBAAqB;YACvG,4CAAC;GAAI,WAAU;;IACZ,CAAC,iBACA,2CAACC;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,kEAAkE;MAAc;IAEjI,iBAAiB,cAAc,cAC9B,2CAACA;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,+FAA+F;MAAc;IAE9J,CAAC,cAAc,iBACd,2CAAC,mBACC,2CAACC;KAAO,SAAS;KAAqB,SAAQ;eAAa,EAAE,kBAAkB;MAAU,GACrF;IAEP,iBAAiB,cAAc,CAAC,cAAc,CAAC,yBAC9C,2CAACA;KACC,SAAQ;KACR,eAAe,yBAAyB,KAAK;eAE5C,EAAE,iBAAiB;MACb;IAEV,iBAAiB,cAAc,CAAC,cAAc,yBAC7C,4CAAC;KAAI,WAAU;gBACb,2CAACD;MAAW,SAAQ;gBACjB,EAAE,+GAA+G;OACvG,EACb,4CAAC;MAAI,WAAU;iBACb,2CAACC;OACC,SAAQ;OACR,SAAS;iBAER,EAAE,UAAU;QACN,EACT,2CAACA;OACC,SAAQ;OACR,eAAe,yBAAyB,MAAM;iBAE7C,EAAE,SAAS;QACL;OACL;MACF;;IAEJ;GACE,GAGT"}
1
+ {"version":3,"file":"passkey-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/passkey-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function PasskeySection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Passkey\")}\n description={t(\"Passkey management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Passkey management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const hexclaveApp = useStackApp();\n const project = hexclaveApp.useProject();\n const contactChannels = user.useContactChannels();\n\n\n // passkey is enabled if there is a passkey\n const hasPasskey = user.passkeyAuthEnabled;\n\n const isLastAuth = user.passkeyAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.otpAuthEnabled;\n const [showConfirmationModal, setShowConfirmationModal] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.passkeyEnabled) {\n return null;\n }\n\n const handleDeletePasskey = async () => {\n await user.update({ passkeyAuthEnabled: false });\n setShowConfirmationModal(false);\n };\n\n\n const handleAddNewPasskey = async () => {\n await user.registerPasskey();\n };\n\n return (\n <>\n <Section title={t(\"Passkey\")} description={hasPasskey ? t(\"Passkey registered\") : t(\"Register a passkey\")}>\n <div className='flex md:justify-end gap-2'>\n {!hasValidEmail && (\n <Typography variant='secondary' type='label'>{t(\"To enable Passkey sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n {hasValidEmail && hasPasskey && isLastAuth && (\n <Typography variant='secondary' type='label'>{t(\"Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )}\n {!hasPasskey && hasValidEmail && (\n <div>\n <Button onClick={handleAddNewPasskey} variant='secondary'>{t(\"Add new passkey\")}</Button>\n </div>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && (\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(true)}\n >\n {t(\"Delete Passkey\")}\n </Button>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeletePasskey}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n\n </>\n\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAe,OAE5B;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,UAAU;EACnB,aAAa,EAAE,oDAAoD;YAEnE,2CAACC;GAAW,SAAQ;aAAa,EAAE,oDAAoD;IAAc;GAC7F;AAId,KAAI,CAAC,KACH,QAAO;CAGT,MAAM,8CAD2B,CACL,YAAY;CACxC,MAAM,kBAAkB,KAAK,oBAAoB;CAIjD,MAAM,aAAa,KAAK;CAExB,MAAM,aAAa,KAAK,sBAAsB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CAC7G,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CAGzE,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,eAClB,QAAO;CAGT,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,OAAO,EAAE,oBAAoB,OAAO,CAAC;AAChD,2BAAyB,MAAM;;CAIjC,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,iBAAiB;;AAG9B,QACE,mFACE,2CAACD;EAAQ,OAAO,EAAE,UAAU;EAAE,aAAa,aAAa,EAAE,qBAAqB,GAAG,EAAE,qBAAqB;YACvG,4CAAC;GAAI,WAAU;;IACZ,CAAC,iBACA,2CAACC;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,kEAAkE;MAAc;IAEjI,iBAAiB,cAAc,cAC9B,2CAACA;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,+FAA+F;MAAc;IAE9J,CAAC,cAAc,iBACd,2CAAC,mBACC,2CAACC;KAAO,SAAS;KAAqB,SAAQ;eAAa,EAAE,kBAAkB;MAAU,GACrF;IAEP,iBAAiB,cAAc,CAAC,cAAc,CAAC,yBAC9C,2CAACA;KACC,SAAQ;KACR,eAAe,yBAAyB,KAAK;eAE5C,EAAE,iBAAiB;MACb;IAEV,iBAAiB,cAAc,CAAC,cAAc,yBAC7C,4CAAC;KAAI,WAAU;gBACb,2CAACD;MAAW,SAAQ;gBACjB,EAAE,+GAA+G;OACvG,EACb,4CAAC;MAAI,WAAU;iBACb,2CAACC;OACC,SAAQ;OACR,SAAS;iBAER,EAAE,UAAU;QACN,EACT,2CAACA;OACC,SAAQ;OACR,eAAe,yBAAyB,MAAM;iBAE7C,EAAE,SAAS;QACL;OACL;MACF;;IAEJ;GACE,GAGT"}
@@ -1,12 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../chunk-BE-pF4vm.js');
3
+ let _hookform_resolvers_yup = require("@hookform/resolvers/yup");
4
+ let _hexclave_shared_dist_schema_fields = require("@hexclave/shared/dist/schema-fields");
3
5
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
6
  let _hexclave_ui = require("@hexclave/ui");
5
7
  let react = require("react");
6
- let react_jsx_runtime = require("react/jsx-runtime");
7
- let _hookform_resolvers_yup = require("@hookform/resolvers/yup");
8
- let _hexclave_shared_dist_schema_fields = require("@hexclave/shared/dist/schema-fields");
9
8
  let react_hook_form = require("react-hook-form");
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
10
  let _hexclave_shared_dist_helpers_password = require("@hexclave/shared/dist/helpers/password");
11
11
  let yup = require("yup");
12
12
  yup = require_chunk.__toESM(yup);
@@ -1 +1 @@
1
- {"version":3,"file":"password-section.js","names":["Section","Typography","schemaFieldsPasswordSchema","Button","Label","Input","FormWarningText","PasswordInput"],"sources":["../../../../src/components-page/account-settings/email-and-auth/password-section.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 { yupResolver } from \"@hookform/resolvers/yup\";\nimport { getPasswordError } from '@hexclave/shared/dist/helpers/password';\nimport { passwordSchema as schemaFieldsPasswordSchema, yupObject, yupString } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Label, PasswordInput, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp } from '../../..';\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\n\nexport function PasswordSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Password\")}\n description={t(\"Password management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Password management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const contactChannels = user.useContactChannels();\n const [changingPassword, setChangingPassword] = useState(false);\n const [loading, setLoading] = useState(false);\n const project = useStackApp().useProject();\n\n const passwordSchema = yupObject({\n oldPassword: user.hasPassword ? schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your old password')) : yupString(),\n newPassword: schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your password')).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n newPasswordRepeat: yupString().nullable().oneOf([yup.ref('newPassword'), \"\", null], t('Passwords do not match')).defined().nonEmpty(t('Please repeat your password'))\n });\n\n const { register, handleSubmit, setError, formState: { errors }, clearErrors, reset } = useForm({\n resolver: yupResolver(passwordSchema)\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.usedForAuth).length > 0;\n\n const onSubmit = async (data: yup.InferType<typeof passwordSchema>) => {\n setLoading(true);\n try {\n const { oldPassword, newPassword } = data;\n const error = user.hasPassword\n ? await user.updatePassword({ oldPassword: oldPassword!, newPassword })\n : await user.setPassword({ password: newPassword! });\n if (error) {\n setError('oldPassword', { type: 'manual', message: t('Incorrect password') });\n } else {\n reset();\n setChangingPassword(false);\n }\n } finally {\n setLoading(false);\n }\n };\n\n const registerPassword = register('newPassword');\n const registerPasswordRepeat = register('newPasswordRepeat');\n\n if (!project.config.credentialEnabled) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Password\")}\n description={user.hasPassword ? t(\"Update your password\") : t(\"Set a password for your account\")}\n >\n <div className='flex flex-col gap-4'>\n {!changingPassword ? (\n hasValidEmail ? (\n <Button\n variant='secondary'\n onClick={() => setChangingPassword(true)}\n >\n {user.hasPassword ? t(\"Update password\") : t(\"Set password\")}\n </Button>\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To set a password, please add a sign-in email.\")}</Typography>\n )\n ) : (\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n {user.hasPassword && (\n <>\n <Label htmlFor=\"old-password\" className=\"mb-1\">{t(\"Old password\")}</Label>\n <Input\n id=\"old-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n {...register(\"oldPassword\")}\n />\n <FormWarningText text={errors.oldPassword?.message?.toString()} />\n </>\n )}\n\n <Label htmlFor=\"new-password\" className=\"mt-4 mb-1\">{t(\"New password\")}</Label>\n <PasswordInput\n id=\"new-password\"\n autoComplete=\"new-password\"\n {...registerPassword}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPassword.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPassword?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat new password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...registerPasswordRepeat}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPasswordRepeat.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPasswordRepeat?.message?.toString()} />\n\n <div className=\"mt-6 flex gap-4\">\n <Button type=\"submit\" loading={loading}>\n {user.hasPassword ? t(\"Update Password\") : t(\"Set Password\")}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setChangingPassword(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </form>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"password-section.js","names":["Section","Typography","schemaFieldsPasswordSchema","Button","Label","Input","FormWarningText","PasswordInput"],"sources":["../../../../src/components-page/account-settings/email-and-auth/password-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { getPasswordError } from '@hexclave/shared/dist/helpers/password';\nimport { passwordSchema as schemaFieldsPasswordSchema, yupObject, yupString } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Label, PasswordInput, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp } from '../../..';\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\n\nexport function PasswordSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Password\")}\n description={t(\"Password management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Password management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const contactChannels = user.useContactChannels();\n const [changingPassword, setChangingPassword] = useState(false);\n const [loading, setLoading] = useState(false);\n const project = useStackApp().useProject();\n\n const passwordSchema = yupObject({\n oldPassword: user.hasPassword ? schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your old password')) : yupString(),\n newPassword: schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your password')).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n newPasswordRepeat: yupString().nullable().oneOf([yup.ref('newPassword'), \"\", null], t('Passwords do not match')).defined().nonEmpty(t('Please repeat your password'))\n });\n\n const { register, handleSubmit, setError, formState: { errors }, clearErrors, reset } = useForm({\n resolver: yupResolver(passwordSchema)\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.usedForAuth).length > 0;\n\n const onSubmit = async (data: yup.InferType<typeof passwordSchema>) => {\n setLoading(true);\n try {\n const { oldPassword, newPassword } = data;\n const error = user.hasPassword\n ? await user.updatePassword({ oldPassword: oldPassword!, newPassword })\n : await user.setPassword({ password: newPassword! });\n if (error) {\n setError('oldPassword', { type: 'manual', message: t('Incorrect password') });\n } else {\n reset();\n setChangingPassword(false);\n }\n } finally {\n setLoading(false);\n }\n };\n\n const registerPassword = register('newPassword');\n const registerPasswordRepeat = register('newPasswordRepeat');\n\n if (!project.config.credentialEnabled) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Password\")}\n description={user.hasPassword ? t(\"Update your password\") : t(\"Set a password for your account\")}\n >\n <div className='flex flex-col gap-4'>\n {!changingPassword ? (\n hasValidEmail ? (\n <Button\n variant='secondary'\n onClick={() => setChangingPassword(true)}\n >\n {user.hasPassword ? t(\"Update password\") : t(\"Set password\")}\n </Button>\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To set a password, please add a sign-in email.\")}</Typography>\n )\n ) : (\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n {user.hasPassword && (\n <>\n <Label htmlFor=\"old-password\" className=\"mb-1\">{t(\"Old password\")}</Label>\n <Input\n id=\"old-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n {...register(\"oldPassword\")}\n />\n <FormWarningText text={errors.oldPassword?.message?.toString()} />\n </>\n )}\n\n <Label htmlFor=\"new-password\" className=\"mt-4 mb-1\">{t(\"New password\")}</Label>\n <PasswordInput\n id=\"new-password\"\n autoComplete=\"new-password\"\n {...registerPassword}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPassword.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPassword?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat new password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...registerPasswordRepeat}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPasswordRepeat.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPasswordRepeat?.message?.toString()} />\n\n <div className=\"mt-6 flex gap-4\">\n <Button type=\"submit\" loading={loading}>\n {user.hasPassword ? t(\"Update Password\") : t(\"Set Password\")}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setChangingPassword(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </form>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"notifications-page.js","names":["PageLayout","Separator","Typography","Switch"],"sources":["../../../../src/components-page/account-settings/notifications/notifications-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 { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { Switch } from \"@hexclave/ui\";\nimport { Separator, Typography } from \"@hexclave/ui\";\n\n\nexport function NotificationsPage() {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const notificationCategories = user.useNotificationCategories();\n\n return (\n <PageLayout>\n <Separator />\n <div className='flex flex-col gap-2'>\n <div className='sm:flex-1 flex flex-col justify-center pb-2'>\n <Typography className=\"font-medium\">\n {t('Choose which emails you want to receive')}\n </Typography>\n </div>\n {notificationCategories.map((category) => (\n <div key={category.id} className=\"flex justify-start gap-4 items-center\">\n <Switch\n checked={category.enabled}\n onCheckedChange={(value) => void category.setEnabled(value)}\n disabled={!category.canDisable}\n />\n <Typography>{category.name}</Typography>\n {!category.canDisable && (\n <Typography variant='secondary' type='footnote'>\n (cannot be disabled)\n </Typography>\n )}\n </div>\n ))}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,oBAAoB;CAClC,MAAM,EAAE,wDAAsB;CAE9B,MAAM,4DADe,EAAE,IAAI,YAAY,CAAC,CACJ,2BAA2B;AAE/D,QACE,4CAACA,2CACC,2CAACC,2BAAY,EACb,4CAAC;EAAI,WAAU;aACb,2CAAC;GAAI,WAAU;aACb,2CAACC;IAAW,WAAU;cACnB,EAAE,0CAA0C;KAClC;IACT,EACL,uBAAuB,KAAK,aAC3B,4CAAC;GAAsB,WAAU;;IAC/B,2CAACC;KACC,SAAS,SAAS;KAClB,kBAAkB,UAAU,KAAK,SAAS,WAAW,MAAM;KAC3D,UAAU,CAAC,SAAS;MACpB;IACF,2CAACD,qCAAY,SAAS,OAAkB;IACvC,CAAC,SAAS,cACT,2CAACA;KAAW,SAAQ;KAAY,MAAK;eAAW;MAEnC;;KAVP,SAAS,GAYb,CACN;GACE,IACK"}
1
+ {"version":3,"file":"notifications-page.js","names":["PageLayout","Separator","Typography","Switch"],"sources":["../../../../src/components-page/account-settings/notifications/notifications-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { Switch } from \"@hexclave/ui\";\nimport { Separator, Typography } from \"@hexclave/ui\";\n\n\nexport function NotificationsPage() {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const notificationCategories = user.useNotificationCategories();\n\n return (\n <PageLayout>\n <Separator />\n <div className='flex flex-col gap-2'>\n <div className='sm:flex-1 flex flex-col justify-center pb-2'>\n <Typography className=\"font-medium\">\n {t('Choose which emails you want to receive')}\n </Typography>\n </div>\n {notificationCategories.map((category) => (\n <div key={category.id} className=\"flex justify-start gap-4 items-center\">\n <Switch\n checked={category.enabled}\n onCheckedChange={(value) => void category.setEnabled(value)}\n disabled={!category.canDisable}\n />\n <Typography>{category.name}</Typography>\n {!category.canDisable && (\n <Typography variant='secondary' type='footnote'>\n (cannot be disabled)\n </Typography>\n )}\n </div>\n ))}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,oBAAoB;CAClC,MAAM,EAAE,wDAAsB;CAE9B,MAAM,4DADe,EAAE,IAAI,YAAY,CAAC,CACJ,2BAA2B;AAE/D,QACE,4CAACA,2CACC,2CAACC,2BAAY,EACb,4CAAC;EAAI,WAAU;aACb,2CAAC;GAAI,WAAU;aACb,2CAACC;IAAW,WAAU;cACnB,EAAE,0CAA0C;KAClC;IACT,EACL,uBAAuB,KAAK,aAC3B,4CAAC;GAAsB,WAAU;;IAC/B,2CAACC;KACC,SAAS,SAAS;KAClB,kBAAkB,UAAU,KAAK,SAAS,WAAW,MAAM;KAC3D,UAAU,CAAC,SAAS;MACpB;IACF,2CAACD,qCAAY,SAAS,OAAkB;IACvC,CAAC,SAAS,cACT,2CAACA;KAAW,SAAQ;KAAY,MAAK;eAAW;MAEnC;;KAVP,SAAS,GAYb,CACN;GACE,IACK"}
@@ -1 +1 @@
1
- {"version":3,"file":"page-layout.js","names":[],"sources":["../../../src/components-page/account-settings/page-layout.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//===========================================\nexport function PageLayout(props: { children: React.ReactNode }) {\n return (\n <div className='flex flex-col gap-6'>\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;AAIA,SAAgB,WAAW,OAAsC;AAC/D,QACE,2CAAC;EAAI,WAAU;YACZ,MAAM;GACH"}
1
+ {"version":3,"file":"page-layout.js","names":[],"sources":["../../../src/components-page/account-settings/page-layout.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nexport function PageLayout(props: { children: React.ReactNode }) {\n return (\n <div className='flex flex-col gap-6'>\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;AAIA,SAAgB,WAAW,OAAsC;AAC/D,QACE,2CAAC;EAAI,WAAU;YACZ,MAAM;GACH"}
@@ -1,4 +1,4 @@
1
- import { Team } from "../../../lib/stack-app/teams/index.js";
1
+ import { Team } from "../../../lib/hexclave-app/teams/index.js";
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components-page/account-settings/payments/payments-page.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"payments-page.js","names":["PageLayout","PaymentsPanel","TeamSwitcher"],"sources":["../../../../src/components-page/account-settings/payments/payments-page.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 { useEffect, useState } from \"react\";\nimport { Team, TeamSwitcher } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { PaymentsPanel } from \"./payments-panel\";\n\nexport function PaymentsPage(props: { mockMode?: boolean, availableTeams?: Team[], allowPersonal?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props.mockMode ? \"return-null\" : \"redirect\" });\n const teams = props.availableTeams ?? user?.useTeams() ?? [];\n const allowPersonal = props.allowPersonal ?? true;\n const hasTeams = teams.length > 0;\n const [selectedTeam, setSelectedTeam] = useState<Team | null>(null);\n const effectiveSelectedTeam = selectedTeam ?? (!allowPersonal ? (teams[0] ?? null) : null);\n const customer = effectiveSelectedTeam ?? (allowPersonal ? user : null);\n const customerType = effectiveSelectedTeam ? \"team\" : \"user\";\n\n useEffect(() => {\n if (props.mockMode) {\n return;\n }\n if (!allowPersonal && !selectedTeam && teams.length > 0) {\n setSelectedTeam(teams[0]);\n return;\n }\n if (selectedTeam && !teams.some(team => team.id === selectedTeam.id)) {\n setSelectedTeam(allowPersonal ? null : (teams[0] ?? null));\n }\n }, [allowPersonal, props.mockMode, selectedTeam, teams]);\n\n if (props.mockMode) {\n return (\n <PageLayout>\n <PaymentsPanel\n mockMode\n />\n </PageLayout>\n );\n }\n\n if (!customer) {\n return null;\n }\n\n\n return (\n <PageLayout>\n {hasTeams ? (\n <TeamSwitcher\n team={effectiveSelectedTeam ?? undefined}\n teams={teams}\n allowNull={allowPersonal}\n nullLabel={t(\"Personal\")}\n onChange={async (team) => {\n setSelectedTeam(team);\n }}\n />\n ) : null}\n <PaymentsPanel\n customer={customer}\n customerType={customerType}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,aAAa,OAAiF;CAC5G,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,MAAM,WAAW,gBAAgB,YAAY,CAAC;CACzE,MAAM,QAAQ,MAAM,kBAAkB,MAAM,UAAU,IAAI,EAAE;CAC5D,MAAM,gBAAgB,MAAM,iBAAiB;CAC7C,MAAM,WAAW,MAAM,SAAS;CAChC,MAAM,CAAC,cAAc,uCAAyC,KAAK;CACnE,MAAM,wBAAwB,iBAAiB,CAAC,gBAAiB,MAAM,MAAM,OAAQ;CACrF,MAAM,WAAW,0BAA0B,gBAAgB,OAAO;CAClE,MAAM,eAAe,wBAAwB,SAAS;AAEtD,4BAAgB;AACd,MAAI,MAAM,SACR;AAEF,MAAI,CAAC,iBAAiB,CAAC,gBAAgB,MAAM,SAAS,GAAG;AACvD,mBAAgB,MAAM,GAAG;AACzB;;AAEF,MAAI,gBAAgB,CAAC,MAAM,MAAK,SAAQ,KAAK,OAAO,aAAa,GAAG,CAClE,iBAAgB,gBAAgB,OAAQ,MAAM,MAAM,KAAM;IAE3D;EAAC;EAAe,MAAM;EAAU;EAAc;EAAM,CAAC;AAExD,KAAI,MAAM,SACR,QACE,2CAACA,0CACC,2CAACC,qCACC,iBACA,GACS;AAIjB,KAAI,CAAC,SACH,QAAO;AAIT,QACE,4CAACD,2CACE,WACC,2CAACE;EACC,MAAM,yBAAyB;EACxB;EACP,WAAW;EACX,WAAW,EAAE,WAAW;EACxB,UAAU,OAAO,SAAS;AACxB,mBAAgB,KAAK;;GAEvB,GACA,MACJ,2CAACD;EACW;EACI;GACd,IACS"}
1
+ {"version":3,"file":"payments-page.js","names":["PageLayout","PaymentsPanel","TeamSwitcher"],"sources":["../../../../src/components-page/account-settings/payments/payments-page.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { useEffect, useState } from \"react\";\nimport { Team, TeamSwitcher } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { PaymentsPanel } from \"./payments-panel\";\n\nexport function PaymentsPage(props: { mockMode?: boolean, availableTeams?: Team[], allowPersonal?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props.mockMode ? \"return-null\" : \"redirect\" });\n const teams = props.availableTeams ?? user?.useTeams() ?? [];\n const allowPersonal = props.allowPersonal ?? true;\n const hasTeams = teams.length > 0;\n const [selectedTeam, setSelectedTeam] = useState<Team | null>(null);\n const effectiveSelectedTeam = selectedTeam ?? (!allowPersonal ? (teams[0] ?? null) : null);\n const customer = effectiveSelectedTeam ?? (allowPersonal ? user : null);\n const customerType = effectiveSelectedTeam ? \"team\" : \"user\";\n\n useEffect(() => {\n if (props.mockMode) {\n return;\n }\n if (!allowPersonal && !selectedTeam && teams.length > 0) {\n setSelectedTeam(teams[0]);\n return;\n }\n if (selectedTeam && !teams.some(team => team.id === selectedTeam.id)) {\n setSelectedTeam(allowPersonal ? null : (teams[0] ?? null));\n }\n }, [allowPersonal, props.mockMode, selectedTeam, teams]);\n\n if (props.mockMode) {\n return (\n <PageLayout>\n <PaymentsPanel\n mockMode\n />\n </PageLayout>\n );\n }\n\n if (!customer) {\n return null;\n }\n\n\n return (\n <PageLayout>\n {hasTeams ? (\n <TeamSwitcher\n team={effectiveSelectedTeam ?? undefined}\n teams={teams}\n allowNull={allowPersonal}\n nullLabel={t(\"Personal\")}\n onChange={async (team) => {\n setSelectedTeam(team);\n }}\n />\n ) : null}\n <PaymentsPanel\n customer={customer}\n customerType={customerType}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,aAAa,OAAiF;CAC5G,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,MAAM,WAAW,gBAAgB,YAAY,CAAC;CACzE,MAAM,QAAQ,MAAM,kBAAkB,MAAM,UAAU,IAAI,EAAE;CAC5D,MAAM,gBAAgB,MAAM,iBAAiB;CAC7C,MAAM,WAAW,MAAM,SAAS;CAChC,MAAM,CAAC,cAAc,uCAAyC,KAAK;CACnE,MAAM,wBAAwB,iBAAiB,CAAC,gBAAiB,MAAM,MAAM,OAAQ;CACrF,MAAM,WAAW,0BAA0B,gBAAgB,OAAO;CAClE,MAAM,eAAe,wBAAwB,SAAS;AAEtD,4BAAgB;AACd,MAAI,MAAM,SACR;AAEF,MAAI,CAAC,iBAAiB,CAAC,gBAAgB,MAAM,SAAS,GAAG;AACvD,mBAAgB,MAAM,GAAG;AACzB;;AAEF,MAAI,gBAAgB,CAAC,MAAM,MAAK,SAAQ,KAAK,OAAO,aAAa,GAAG,CAClE,iBAAgB,gBAAgB,OAAQ,MAAM,MAAM,KAAM;IAE3D;EAAC;EAAe,MAAM;EAAU;EAAc;EAAM,CAAC;AAExD,KAAI,MAAM,SACR,QACE,2CAACA,0CACC,2CAACC,qCACC,iBACA,GACS;AAIjB,KAAI,CAAC,SACH,QAAO;AAIT,QACE,4CAACD,2CACE,WACC,2CAACE;EACC,MAAM,yBAAyB;EACxB;EACP,WAAW;EACX,WAAW,EAAE,WAAW;EACxB,UAAU,OAAO,SAAS;AACxB,mBAAgB,KAAK;;GAEvB,GACA,MACJ,2CAACD;EACW;EACI;GACd,IACS"}
@@ -1,4 +1,4 @@
1
- import { CustomerInvoicesList, CustomerInvoicesListOptions } from "../../../lib/stack-app/customers/index.js";
1
+ import { CustomerInvoicesList, CustomerInvoicesListOptions } from "../../../lib/hexclave-app/customers/index.js";
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components-page/account-settings/payments/payments-panel.d.ts
@@ -13,7 +13,7 @@ let ___section_js = require("../section.js");
13
13
  let _________index_js = require("../../../index.js");
14
14
  let _stripe_react_stripe_js = require("@stripe/react-stripe-js");
15
15
  let _stripe_stripe_js = require("@stripe/stripe-js");
16
- let _________lib_env_js = require("../../../lib/env.js");
16
+ let _________generated_env_js = require("../../../generated/env.js");
17
17
 
18
18
  //#region src/components-page/account-settings/payments/payments-panel.tsx
19
19
  function formatPaymentMethod(pm) {
@@ -179,7 +179,7 @@ function MockPaymentsPanel(props) {
179
179
  }
180
180
  function RealPaymentsPanel(props) {
181
181
  const { t } = (0, _________lib_translations_js.useTranslation)();
182
- const stackApp = (0, _________index_js.useStackApp)();
182
+ const hexclaveApp = (0, _________index_js.useStackApp)();
183
183
  const defaultPaymentMethod = props.customer.useBilling().defaultPaymentMethod;
184
184
  const products = props.customer.useProducts();
185
185
  const invoices = props.customer.useInvoices({ limit: 10 });
@@ -192,7 +192,7 @@ function RealPaymentsPanel(props) {
192
192
  const [switchToProductId, setSwitchToProductId] = (0, react.useState)(null);
193
193
  const stripePromise = (0, react.useMemo)(() => {
194
194
  if (!setupIntentStripeAccountId) return null;
195
- const publishableKey = _________lib_env_js.envVars.NEXT_PUBLIC_STACK_STRIPE_PUBLISHABLE_KEY;
195
+ const publishableKey = _________generated_env_js.envVars.HEXCLAVE_STRIPE_PUBLISHABLE_KEY;
196
196
  if (!publishableKey) return null;
197
197
  return (0, _stripe_stripe_js.loadStripe)(publishableKey, { stripeAccount: setupIntentStripeAccountId });
198
198
  }, [setupIntentStripeAccountId]);
@@ -205,7 +205,7 @@ function RealPaymentsPanel(props) {
205
205
  });
206
206
  return;
207
207
  }
208
- alert(`An unhandled error occurred. Please ${_________lib_env_js.envVars.NODE_ENV === "development" ? "check the browser console for the full error." : "report this to the developer."}\n\n${error}`);
208
+ alert(`An unhandled error occurred. Please ${_________generated_env_js.envVars.NODE_ENV === "development" ? "check the browser console for the full error." : "report this to the developer."}\n\n${error}`);
209
209
  };
210
210
  const openPaymentDialog = () => {
211
211
  (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
@@ -331,12 +331,12 @@ function RealPaymentsPanel(props) {
331
331
  onClick: async () => {
332
332
  if (!cancelTarget) return;
333
333
  const { productId, subscriptionId } = cancelTarget;
334
- if (props.customerType === "team") await stackApp.cancelSubscription({
334
+ if (props.customerType === "team") await hexclaveApp.cancelSubscription({
335
335
  teamId: props.customer.id,
336
336
  productId,
337
337
  subscriptionId
338
338
  });
339
- else await stackApp.cancelSubscription({
339
+ else await hexclaveApp.cancelSubscription({
340
340
  productId,
341
341
  subscriptionId
342
342
  });
@@ -1 +1 @@
1
- {"version":3,"file":"payments-panel.js","names":["Typography","CardElement","Button","Section","envVars","KnownErrors","ActionDialog","Skeleton","Elements","Result","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Separator","Table","TableHeader","TableRow","TableHead","TableBody","TableCell"],"sources":["../../../../src/components-page/account-settings/payments/payments-panel.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 { KnownErrors } from \"@hexclave/shared\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionDialog, Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, toast, Typography } from \"@hexclave/ui\";\nimport { CardElement, Elements, useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport { loadStripe } from \"@stripe/stripe-js\";\nimport { useMemo, useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { envVars } from \"../../../lib/env\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport type { CustomerInvoiceStatus, CustomerInvoicesList, CustomerInvoicesListOptions } from \"../../../lib/stack-app/customers\";\n\ntype PaymentMethodSummary = {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n} | null;\n\nfunction formatPaymentMethod(pm: NonNullable<PaymentMethodSummary>) {\n const details = [\n pm.brand ? pm.brand.toUpperCase() : null,\n pm.last4 ? `•••• ${pm.last4}` : null,\n pm.exp_month && pm.exp_year ? `exp ${pm.exp_month}/${pm.exp_year}` : null,\n ].filter(Boolean);\n return details.join(\" · \");\n}\n\nconst formatInvoiceStatus = (status: CustomerInvoiceStatus, t: (value: string) => string) => {\n if (!status) {\n return t(\"Unknown\");\n }\n switch (status) {\n case \"draft\": {\n return t(\"Draft\");\n }\n case \"open\": {\n return t(\"Open\");\n }\n case \"paid\": {\n return t(\"Paid\");\n }\n case \"uncollectible\": {\n return t(\"Uncollectible\");\n }\n case \"void\": {\n return t(\"Void\");\n }\n default: {\n return t(\"Unknown\");\n }\n }\n};\n\nconst formatInvoiceAmount = (amountTotal: number | null | undefined, t: (value: string) => string) => {\n if (typeof amountTotal !== \"number\" || Number.isNaN(amountTotal)) {\n return t(\"Unknown\");\n }\n const normalized = amountTotal / 100;\n const formatted = new Intl.NumberFormat(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(normalized);\n return `$${formatted}`;\n};\n\nconst formatInvoiceDate = (date: Date | null | undefined, t: (value: string) => string) => {\n if (!date || Number.isNaN(date.getTime())) {\n return t(\"Unknown\");\n }\n return new Intl.DateTimeFormat(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" }).format(date);\n};\n\ntype CustomerBilling = {\n hasCustomer: boolean,\n defaultPaymentMethod: PaymentMethodSummary,\n};\n\ntype CustomerPaymentMethodSetupIntent = {\n clientSecret: string,\n stripeAccountId: string,\n};\n\ntype CustomerLike = {\n id: string,\n useBilling: () => CustomerBilling,\n useProducts: () => Array<{\n id: string | null,\n quantity: number,\n displayName: string,\n customerType: \"user\" | \"team\" | \"custom\",\n type?: \"one_time\" | \"subscription\",\n switchOptions?: Array<{\n productId: string,\n displayName: string,\n prices: Record<string, { interval?: [number, \"day\" | \"week\" | \"month\" | \"year\"] }>,\n }>,\n subscription: null | {\n subscriptionId: string | null,\n currentPeriodEnd: Date | null,\n cancelAtPeriodEnd: boolean,\n isCancelable: boolean,\n },\n }>,\n useInvoices: (options?: CustomerInvoicesListOptions) => CustomerInvoicesList,\n createPaymentMethodSetupIntent: () => Promise<CustomerPaymentMethodSetupIntent>,\n setDefaultPaymentMethodFromSetupIntent: (setupIntentId: string) => Promise<PaymentMethodSummary>,\n switchSubscription: (options: { fromProductId: string, toProductId: string, priceId?: string, quantity?: number }) => Promise<void>,\n};\n\nfunction SetDefaultPaymentMethodForm(props: {\n clientSecret: string,\n onSetupIntentSucceeded: (setupIntentId: string) => Promise<void>,\n}) {\n const stripe = useStripe();\n const elements = useElements();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const darkMode = \"color-scheme\" in document.documentElement.style && document.documentElement.style[\"color-scheme\"] === \"dark\";\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Typography className=\"font-medium\">Card details</Typography>\n <div className=\"rounded-md border border-input p-3\">\n <CardElement options={{ hidePostalCode: true, style: { base: { color: darkMode ? \"white\" : \"black\" } } }} />\n </div>\n </div>\n {errorMessage && (\n <Typography variant=\"secondary\" type=\"footnote\">\n {errorMessage}\n </Typography>\n )}\n <Button\n onClick={async () => {\n if (!stripe || !elements) {\n setErrorMessage(\"Stripe is still loading. Please try again.\");\n return;\n }\n const card = elements.getElement(CardElement);\n if (!card) {\n setErrorMessage(\"Card element not found.\");\n return;\n }\n\n const result = await stripe.confirmCardSetup(props.clientSecret, {\n payment_method: { card },\n });\n if (result.error) {\n setErrorMessage(result.error.message ?? \"Failed to save payment method.\");\n return;\n }\n if (!result.setupIntent.id) {\n setErrorMessage(\"No setup intent returned from Stripe.\");\n return;\n }\n await props.onSetupIntentSucceeded(result.setupIntent.id);\n }}\n >\n Save payment method\n </Button>\n </div>\n );\n}\n\nexport function PaymentsPanel(props: {\n title?: string,\n customer?: CustomerLike,\n customerType?: \"user\" | \"team\",\n mockMode?: boolean,\n}) {\n if (props.mockMode) {\n return <MockPaymentsPanel title={props.title} />;\n }\n if (!props.customer) {\n return null;\n }\n return <RealPaymentsPanel title={props.title} customer={props.customer} customerType={props.customerType ?? \"user\"} />;\n}\n\nfunction MockPaymentsPanel(props: { title?: string }) {\n const { t } = useTranslation();\n const defaultPaymentMethod: PaymentMethodSummary = {\n id: \"pm_mock\",\n brand: \"visa\",\n last4: \"4242\",\n exp_month: 12,\n exp_year: 2030,\n };\n\n return (\n <div className=\"space-y-4\">\n {props.title && <Typography className=\"font-medium\">{props.title}</Typography>}\n <Section\n title={t(\"Payment method\")}\n description={t(\"Manage the default payment method used for subscriptions and invoices.\")}\n >\n <Typography>{formatPaymentMethod(defaultPaymentMethod)}</Typography>\n <Button disabled>\n {t(\"Update payment method\")}\n </Button>\n </Section>\n\n <Section\n title={t(\"Active plans\")}\n description={t(\"View your active plans and purchases.\")}\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{t(\"Pro\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"Renews on\")} Jan 1, 2030</Typography>\n </div>\n <Button disabled variant=\"secondary\" color=\"neutral\">\n {t(\"Cancel subscription\")}\n </Button>\n </div>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{t(\"Credits pack\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"One-time purchase\")}</Typography>\n </div>\n </div>\n </div>\n </Section>\n </div>\n );\n}\n\nfunction RealPaymentsPanel(props: { title?: string, customer: CustomerLike, customerType: \"user\" | \"team\" }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const billing = props.customer.useBilling();\n const defaultPaymentMethod = billing.defaultPaymentMethod;\n const products = props.customer.useProducts();\n const invoices = props.customer.useInvoices({ limit: 10 });\n const productsForCustomerType = products.filter(product => product.customerType === props.customerType);\n\n const [paymentDialogOpen, setPaymentDialogOpen] = useState(false);\n const [setupIntentClientSecret, setSetupIntentClientSecret] = useState<string | null>(null);\n const [setupIntentStripeAccountId, setSetupIntentStripeAccountId] = useState<string | null>(null);\n const [cancelTarget, setCancelTarget] = useState<{ productId: string, subscriptionId?: string } | null>(null);\n const [switchFromProductId, setSwitchFromProductId] = useState<string | null>(null);\n const [switchToProductId, setSwitchToProductId] = useState<string | null>(null);\n\n const stripePromise = useMemo(() => {\n if (!setupIntentStripeAccountId) return null;\n const publishableKey = envVars.NEXT_PUBLIC_STACK_STRIPE_PUBLISHABLE_KEY;\n if (!publishableKey) return null;\n return loadStripe(publishableKey, { stripeAccount: setupIntentStripeAccountId });\n }, [setupIntentStripeAccountId]);\n\n const handleAsyncError = (error: unknown) => {\n if (error instanceof KnownErrors.DefaultPaymentMethodRequired) {\n toast({\n title: t(\"No default payment method\"),\n description: t(\"Add a payment method before switching plans.\"),\n variant: \"destructive\",\n });\n return;\n }\n alert(`An unhandled error occurred. Please ${envVars.NODE_ENV === \"development\" ? \"check the browser console for the full error.\" : \"report this to the developer.\"}\\n\\n${error}`);\n };\n\n const openPaymentDialog = () => {\n runAsynchronously(async () => {\n setPaymentDialogOpen(true);\n const res = await props.customer.createPaymentMethodSetupIntent();\n setSetupIntentClientSecret(res.clientSecret);\n setSetupIntentStripeAccountId(res.stripeAccountId);\n }, { onError: handleAsyncError });\n };\n\n const closePaymentDialog = () => {\n setPaymentDialogOpen(false);\n setSetupIntentClientSecret(null);\n setSetupIntentStripeAccountId(null);\n };\n\n const openSwitchDialog = (productId: string, firstOptionId: string | null) => {\n setSwitchFromProductId(productId);\n setSwitchToProductId(firstOptionId);\n };\n\n const closeSwitchDialog = () => {\n setSwitchFromProductId(null);\n setSwitchToProductId(null);\n };\n\n const switchSourceProduct = switchFromProductId\n ? productsForCustomerType.find((product) => product.id === switchFromProductId) ?? null\n : null;\n const switchOptions = switchSourceProduct?.switchOptions ?? [];\n const selectedSwitchOption = switchOptions.find((option) => option.productId === switchToProductId) ?? null;\n const selectedPriceId = selectedSwitchOption ? (Object.keys(selectedSwitchOption.prices)[0] ?? null) : null;\n\n return (\n <div className=\"space-y-4\">\n {props.title && <Typography className=\"font-medium\">{props.title}</Typography>}\n\n {defaultPaymentMethod && (\n <Section\n title={t(\"Payment method\")}\n description={t(\"Manage the default payment method used for subscriptions and invoices.\")}\n >\n <Typography>{formatPaymentMethod(defaultPaymentMethod)}</Typography>\n\n <Button onClick={openPaymentDialog}>\n {t(\"Update payment method\")}\n </Button>\n\n <ActionDialog\n open={paymentDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n closePaymentDialog();\n } else {\n setPaymentDialogOpen(true);\n }\n }}\n title={t(\"Update payment method\")}\n >\n {!setupIntentClientSecret || !setupIntentStripeAccountId || !stripePromise ? (\n <Skeleton className=\"h-10 w-full\" />\n ) : (\n <Elements\n stripe={stripePromise}\n options={{\n clientSecret: setupIntentClientSecret,\n }}\n >\n <SetDefaultPaymentMethodForm\n clientSecret={setupIntentClientSecret}\n onSetupIntentSucceeded={async (setupIntentId) => {\n await props.customer.setDefaultPaymentMethodFromSetupIntent(setupIntentId);\n closePaymentDialog();\n }}\n />\n </Elements>\n )}\n </ActionDialog>\n </Section>\n )}\n\n {productsForCustomerType.length > 0 && (\n <Section\n title={t(\"Active plans\")}\n description={t(\"View your active plans and purchases.\")}\n >\n <div className=\"space-y-3\">\n {productsForCustomerType.map((product, index) => {\n const quantitySuffix = product.quantity !== 1 ? ` ×${product.quantity}` : \"\";\n const isSubscription = product.type === \"subscription\";\n const isCancelable = isSubscription && !!product.subscription?.isCancelable;\n const canSwitchPlans = isSubscription && defaultPaymentMethod && !!product.id && (product.switchOptions?.length ?? 0) > 0;\n const renewsAt = isSubscription ? (product.subscription?.currentPeriodEnd ?? null) : null;\n const subtitle =\n product.type === \"one_time\"\n ? t(\"One-time purchase\")\n : renewsAt\n ? `${t(\"Renews on\")} ${new Intl.DateTimeFormat(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" }).format(renewsAt)}`\n : t(\"Subscription\");\n\n return (\n <div key={product.id ?? `${product.displayName}-${index}`} className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{product.displayName}{quantitySuffix}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{subtitle}</Typography>\n </div>\n\n <div className=\"flex flex-col items-end gap-2\">\n {canSwitchPlans && (\n <Button\n variant=\"secondary\"\n color=\"neutral\"\n onClick={() => openSwitchDialog(product.id!, product.switchOptions?.[0]?.productId ?? null)}\n >\n {t(\"Change plan\")}\n </Button>\n )}\n {isCancelable && (\n <Button\n variant=\"secondary\"\n color=\"neutral\"\n onClick={() => setCancelTarget({ productId: product.id ?? \"_inline\", subscriptionId: product.subscription?.subscriptionId ?? undefined })}\n >\n {t(\"Cancel subscription\")}\n </Button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n <ActionDialog\n open={cancelTarget !== null}\n onOpenChange={(open) => {\n if (!open) setCancelTarget(null);\n }}\n title={t(\"Cancel subscription\")}\n description={t(\"Canceling will stop future renewals for this subscription.\")}\n danger\n cancelButton\n okButton={{\n label: t(\"Cancel subscription\"),\n onClick: async () => {\n if (!cancelTarget) return;\n const { productId, subscriptionId } = cancelTarget;\n if (props.customerType === \"team\") {\n await stackApp.cancelSubscription({ teamId: props.customer.id, productId, subscriptionId });\n } else {\n await stackApp.cancelSubscription({ productId, subscriptionId });\n }\n setCancelTarget(null);\n },\n }}\n />\n\n <ActionDialog\n open={switchFromProductId !== null}\n onOpenChange={(open) => {\n if (!open) closeSwitchDialog();\n }}\n title={t(\"Change plan\")}\n description={t(\"Select a new plan from the same product line.\")}\n cancelButton\n okButton={{\n label: t(\"Switch plan\"),\n onClick: async () => {\n const fromProductId = switchFromProductId;\n const toProductId = switchToProductId;\n if (!fromProductId || !toProductId) return;\n if (!selectedPriceId) return;\n const result = await Result.fromThrowingAsync(() => props.customer.switchSubscription({\n fromProductId,\n toProductId,\n priceId: selectedPriceId,\n }));\n if (result.status === \"error\") {\n handleAsyncError(result.error);\n return \"prevent-close\";\n }\n closeSwitchDialog();\n },\n props: {\n disabled: !switchFromProductId || !switchToProductId || !selectedPriceId,\n },\n }}\n >\n <div className=\"space-y-2\">\n {switchOptions.length === 0 ? (\n <Typography variant=\"secondary\" type=\"footnote\">\n {t(\"No other plans available for this subscription.\")}\n </Typography>\n ) : (\n <>\n <Typography type=\"footnote\">{t(\"Choose a plan\")}</Typography>\n <Select\n value={switchToProductId ?? undefined}\n onValueChange={(value) => setSwitchToProductId(value || null)}\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue placeholder={t(\"Choose a plan\")} />\n </SelectTrigger>\n <SelectContent>\n {switchOptions.map((option: NonNullable<typeof switchOptions>[number]) => (\n <SelectItem key={option.productId} value={option.productId}>\n {option.displayName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </>\n )}\n </div>\n </ActionDialog>\n </Section>\n )\n }\n {invoices.length > 0 && (\n <>\n <Separator />\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Typography className=\"font-medium\">{t(\"Invoices\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"Review past invoices and receipts.\")}</Typography>\n </div>\n <div className=\"border rounded-md\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[140px]\">{t(\"Date\")}</TableHead>\n <TableHead className=\"w-[120px]\">{t(\"Status\")}</TableHead>\n <TableHead className=\"w-[120px]\">{t(\"Amount\")}</TableHead>\n <TableHead className=\"w-[120px] text-right\">{t(\"Invoice\")}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invoices.map((invoice, index) => {\n const createdAtTime = invoice.createdAt.getTime();\n const invoiceKey = Number.isNaN(createdAtTime) ? `invoice-${index}` : `invoice-${createdAtTime}-${index}`;\n return (\n <TableRow key={invoiceKey}>\n <TableCell>\n <Typography>{formatInvoiceDate(invoice.createdAt, t)}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{formatInvoiceStatus(invoice.status, t)}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{formatInvoiceAmount(invoice.amountTotal, t)}</Typography>\n </TableCell>\n <TableCell align=\"right\">\n {invoice.hostedInvoiceUrl ? (\n <Button asChild variant=\"secondary\" color=\"neutral\" size=\"sm\">\n <a href={invoice.hostedInvoiceUrl} target=\"_blank\" rel=\"noreferrer\">\n {t(\"View\")}\n </a>\n </Button>\n ) : (\n <Typography variant=\"secondary\" type=\"footnote\">\n {t(\"Unavailable\")}\n </Typography>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n </div>\n </>\n )}\n </div >\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"payments-panel.js","names":["Typography","CardElement","Button","Section","envVars","KnownErrors","ActionDialog","Skeleton","Elements","Result","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Separator","Table","TableHeader","TableRow","TableHead","TableBody","TableCell"],"sources":["../../../../src/components-page/account-settings/payments/payments-panel.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionDialog, Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, toast, Typography } from \"@hexclave/ui\";\nimport { CardElement, Elements, useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport { loadStripe } from \"@stripe/stripe-js\";\nimport { useMemo, useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { envVars } from \"../../../generated/env\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport type { CustomerInvoiceStatus, CustomerInvoicesList, CustomerInvoicesListOptions } from \"../../../lib/hexclave-app/customers\";\n\ntype PaymentMethodSummary = {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n} | null;\n\nfunction formatPaymentMethod(pm: NonNullable<PaymentMethodSummary>) {\n const details = [\n pm.brand ? pm.brand.toUpperCase() : null,\n pm.last4 ? `•••• ${pm.last4}` : null,\n pm.exp_month && pm.exp_year ? `exp ${pm.exp_month}/${pm.exp_year}` : null,\n ].filter(Boolean);\n return details.join(\" · \");\n}\n\nconst formatInvoiceStatus = (status: CustomerInvoiceStatus, t: (value: string) => string) => {\n if (!status) {\n return t(\"Unknown\");\n }\n switch (status) {\n case \"draft\": {\n return t(\"Draft\");\n }\n case \"open\": {\n return t(\"Open\");\n }\n case \"paid\": {\n return t(\"Paid\");\n }\n case \"uncollectible\": {\n return t(\"Uncollectible\");\n }\n case \"void\": {\n return t(\"Void\");\n }\n default: {\n return t(\"Unknown\");\n }\n }\n};\n\nconst formatInvoiceAmount = (amountTotal: number | null | undefined, t: (value: string) => string) => {\n if (typeof amountTotal !== \"number\" || Number.isNaN(amountTotal)) {\n return t(\"Unknown\");\n }\n const normalized = amountTotal / 100;\n const formatted = new Intl.NumberFormat(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(normalized);\n return `$${formatted}`;\n};\n\nconst formatInvoiceDate = (date: Date | null | undefined, t: (value: string) => string) => {\n if (!date || Number.isNaN(date.getTime())) {\n return t(\"Unknown\");\n }\n return new Intl.DateTimeFormat(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" }).format(date);\n};\n\ntype CustomerBilling = {\n hasCustomer: boolean,\n defaultPaymentMethod: PaymentMethodSummary,\n};\n\ntype CustomerPaymentMethodSetupIntent = {\n clientSecret: string,\n stripeAccountId: string,\n};\n\ntype CustomerLike = {\n id: string,\n useBilling: () => CustomerBilling,\n useProducts: () => Array<{\n id: string | null,\n quantity: number,\n displayName: string,\n customerType: \"user\" | \"team\" | \"custom\",\n type?: \"one_time\" | \"subscription\",\n switchOptions?: Array<{\n productId: string,\n displayName: string,\n prices: Record<string, { interval?: [number, \"day\" | \"week\" | \"month\" | \"year\"] }>,\n }>,\n subscription: null | {\n subscriptionId: string | null,\n currentPeriodEnd: Date | null,\n cancelAtPeriodEnd: boolean,\n isCancelable: boolean,\n },\n }>,\n useInvoices: (options?: CustomerInvoicesListOptions) => CustomerInvoicesList,\n createPaymentMethodSetupIntent: () => Promise<CustomerPaymentMethodSetupIntent>,\n setDefaultPaymentMethodFromSetupIntent: (setupIntentId: string) => Promise<PaymentMethodSummary>,\n switchSubscription: (options: { fromProductId: string, toProductId: string, priceId?: string, quantity?: number }) => Promise<void>,\n};\n\nfunction SetDefaultPaymentMethodForm(props: {\n clientSecret: string,\n onSetupIntentSucceeded: (setupIntentId: string) => Promise<void>,\n}) {\n const stripe = useStripe();\n const elements = useElements();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const darkMode = \"color-scheme\" in document.documentElement.style && document.documentElement.style[\"color-scheme\"] === \"dark\";\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Typography className=\"font-medium\">Card details</Typography>\n <div className=\"rounded-md border border-input p-3\">\n <CardElement options={{ hidePostalCode: true, style: { base: { color: darkMode ? \"white\" : \"black\" } } }} />\n </div>\n </div>\n {errorMessage && (\n <Typography variant=\"secondary\" type=\"footnote\">\n {errorMessage}\n </Typography>\n )}\n <Button\n onClick={async () => {\n if (!stripe || !elements) {\n setErrorMessage(\"Stripe is still loading. Please try again.\");\n return;\n }\n const card = elements.getElement(CardElement);\n if (!card) {\n setErrorMessage(\"Card element not found.\");\n return;\n }\n\n const result = await stripe.confirmCardSetup(props.clientSecret, {\n payment_method: { card },\n });\n if (result.error) {\n setErrorMessage(result.error.message ?? \"Failed to save payment method.\");\n return;\n }\n if (!result.setupIntent.id) {\n setErrorMessage(\"No setup intent returned from Stripe.\");\n return;\n }\n await props.onSetupIntentSucceeded(result.setupIntent.id);\n }}\n >\n Save payment method\n </Button>\n </div>\n );\n}\n\nexport function PaymentsPanel(props: {\n title?: string,\n customer?: CustomerLike,\n customerType?: \"user\" | \"team\",\n mockMode?: boolean,\n}) {\n if (props.mockMode) {\n return <MockPaymentsPanel title={props.title} />;\n }\n if (!props.customer) {\n return null;\n }\n return <RealPaymentsPanel title={props.title} customer={props.customer} customerType={props.customerType ?? \"user\"} />;\n}\n\nfunction MockPaymentsPanel(props: { title?: string }) {\n const { t } = useTranslation();\n const defaultPaymentMethod: PaymentMethodSummary = {\n id: \"pm_mock\",\n brand: \"visa\",\n last4: \"4242\",\n exp_month: 12,\n exp_year: 2030,\n };\n\n return (\n <div className=\"space-y-4\">\n {props.title && <Typography className=\"font-medium\">{props.title}</Typography>}\n <Section\n title={t(\"Payment method\")}\n description={t(\"Manage the default payment method used for subscriptions and invoices.\")}\n >\n <Typography>{formatPaymentMethod(defaultPaymentMethod)}</Typography>\n <Button disabled>\n {t(\"Update payment method\")}\n </Button>\n </Section>\n\n <Section\n title={t(\"Active plans\")}\n description={t(\"View your active plans and purchases.\")}\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{t(\"Pro\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"Renews on\")} Jan 1, 2030</Typography>\n </div>\n <Button disabled variant=\"secondary\" color=\"neutral\">\n {t(\"Cancel subscription\")}\n </Button>\n </div>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{t(\"Credits pack\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"One-time purchase\")}</Typography>\n </div>\n </div>\n </div>\n </Section>\n </div>\n );\n}\n\nfunction RealPaymentsPanel(props: { title?: string, customer: CustomerLike, customerType: \"user\" | \"team\" }) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const billing = props.customer.useBilling();\n const defaultPaymentMethod = billing.defaultPaymentMethod;\n const products = props.customer.useProducts();\n const invoices = props.customer.useInvoices({ limit: 10 });\n const productsForCustomerType = products.filter(product => product.customerType === props.customerType);\n\n const [paymentDialogOpen, setPaymentDialogOpen] = useState(false);\n const [setupIntentClientSecret, setSetupIntentClientSecret] = useState<string | null>(null);\n const [setupIntentStripeAccountId, setSetupIntentStripeAccountId] = useState<string | null>(null);\n const [cancelTarget, setCancelTarget] = useState<{ productId: string, subscriptionId?: string } | null>(null);\n const [switchFromProductId, setSwitchFromProductId] = useState<string | null>(null);\n const [switchToProductId, setSwitchToProductId] = useState<string | null>(null);\n\n const stripePromise = useMemo(() => {\n if (!setupIntentStripeAccountId) return null;\n const publishableKey = envVars.HEXCLAVE_STRIPE_PUBLISHABLE_KEY;\n if (!publishableKey) return null;\n return loadStripe(publishableKey, { stripeAccount: setupIntentStripeAccountId });\n }, [setupIntentStripeAccountId]);\n\n const handleAsyncError = (error: unknown) => {\n if (error instanceof KnownErrors.DefaultPaymentMethodRequired) {\n toast({\n title: t(\"No default payment method\"),\n description: t(\"Add a payment method before switching plans.\"),\n variant: \"destructive\",\n });\n return;\n }\n alert(`An unhandled error occurred. Please ${envVars.NODE_ENV === \"development\" ? \"check the browser console for the full error.\" : \"report this to the developer.\"}\\n\\n${error}`);\n };\n\n const openPaymentDialog = () => {\n runAsynchronously(async () => {\n setPaymentDialogOpen(true);\n const res = await props.customer.createPaymentMethodSetupIntent();\n setSetupIntentClientSecret(res.clientSecret);\n setSetupIntentStripeAccountId(res.stripeAccountId);\n }, { onError: handleAsyncError });\n };\n\n const closePaymentDialog = () => {\n setPaymentDialogOpen(false);\n setSetupIntentClientSecret(null);\n setSetupIntentStripeAccountId(null);\n };\n\n const openSwitchDialog = (productId: string, firstOptionId: string | null) => {\n setSwitchFromProductId(productId);\n setSwitchToProductId(firstOptionId);\n };\n\n const closeSwitchDialog = () => {\n setSwitchFromProductId(null);\n setSwitchToProductId(null);\n };\n\n const switchSourceProduct = switchFromProductId\n ? productsForCustomerType.find((product) => product.id === switchFromProductId) ?? null\n : null;\n const switchOptions = switchSourceProduct?.switchOptions ?? [];\n const selectedSwitchOption = switchOptions.find((option) => option.productId === switchToProductId) ?? null;\n const selectedPriceId = selectedSwitchOption ? (Object.keys(selectedSwitchOption.prices)[0] ?? null) : null;\n\n return (\n <div className=\"space-y-4\">\n {props.title && <Typography className=\"font-medium\">{props.title}</Typography>}\n\n {defaultPaymentMethod && (\n <Section\n title={t(\"Payment method\")}\n description={t(\"Manage the default payment method used for subscriptions and invoices.\")}\n >\n <Typography>{formatPaymentMethod(defaultPaymentMethod)}</Typography>\n\n <Button onClick={openPaymentDialog}>\n {t(\"Update payment method\")}\n </Button>\n\n <ActionDialog\n open={paymentDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n closePaymentDialog();\n } else {\n setPaymentDialogOpen(true);\n }\n }}\n title={t(\"Update payment method\")}\n >\n {!setupIntentClientSecret || !setupIntentStripeAccountId || !stripePromise ? (\n <Skeleton className=\"h-10 w-full\" />\n ) : (\n <Elements\n stripe={stripePromise}\n options={{\n clientSecret: setupIntentClientSecret,\n }}\n >\n <SetDefaultPaymentMethodForm\n clientSecret={setupIntentClientSecret}\n onSetupIntentSucceeded={async (setupIntentId) => {\n await props.customer.setDefaultPaymentMethodFromSetupIntent(setupIntentId);\n closePaymentDialog();\n }}\n />\n </Elements>\n )}\n </ActionDialog>\n </Section>\n )}\n\n {productsForCustomerType.length > 0 && (\n <Section\n title={t(\"Active plans\")}\n description={t(\"View your active plans and purchases.\")}\n >\n <div className=\"space-y-3\">\n {productsForCustomerType.map((product, index) => {\n const quantitySuffix = product.quantity !== 1 ? ` ×${product.quantity}` : \"\";\n const isSubscription = product.type === \"subscription\";\n const isCancelable = isSubscription && !!product.subscription?.isCancelable;\n const canSwitchPlans = isSubscription && defaultPaymentMethod && !!product.id && (product.switchOptions?.length ?? 0) > 0;\n const renewsAt = isSubscription ? (product.subscription?.currentPeriodEnd ?? null) : null;\n const subtitle =\n product.type === \"one_time\"\n ? t(\"One-time purchase\")\n : renewsAt\n ? `${t(\"Renews on\")} ${new Intl.DateTimeFormat(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" }).format(renewsAt)}`\n : t(\"Subscription\");\n\n return (\n <div key={product.id ?? `${product.displayName}-${index}`} className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <Typography className=\"truncate\">{product.displayName}{quantitySuffix}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{subtitle}</Typography>\n </div>\n\n <div className=\"flex flex-col items-end gap-2\">\n {canSwitchPlans && (\n <Button\n variant=\"secondary\"\n color=\"neutral\"\n onClick={() => openSwitchDialog(product.id!, product.switchOptions?.[0]?.productId ?? null)}\n >\n {t(\"Change plan\")}\n </Button>\n )}\n {isCancelable && (\n <Button\n variant=\"secondary\"\n color=\"neutral\"\n onClick={() => setCancelTarget({ productId: product.id ?? \"_inline\", subscriptionId: product.subscription?.subscriptionId ?? undefined })}\n >\n {t(\"Cancel subscription\")}\n </Button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n <ActionDialog\n open={cancelTarget !== null}\n onOpenChange={(open) => {\n if (!open) setCancelTarget(null);\n }}\n title={t(\"Cancel subscription\")}\n description={t(\"Canceling will stop future renewals for this subscription.\")}\n danger\n cancelButton\n okButton={{\n label: t(\"Cancel subscription\"),\n onClick: async () => {\n if (!cancelTarget) return;\n const { productId, subscriptionId } = cancelTarget;\n if (props.customerType === \"team\") {\n await hexclaveApp.cancelSubscription({ teamId: props.customer.id, productId, subscriptionId });\n } else {\n await hexclaveApp.cancelSubscription({ productId, subscriptionId });\n }\n setCancelTarget(null);\n },\n }}\n />\n\n <ActionDialog\n open={switchFromProductId !== null}\n onOpenChange={(open) => {\n if (!open) closeSwitchDialog();\n }}\n title={t(\"Change plan\")}\n description={t(\"Select a new plan from the same product line.\")}\n cancelButton\n okButton={{\n label: t(\"Switch plan\"),\n onClick: async () => {\n const fromProductId = switchFromProductId;\n const toProductId = switchToProductId;\n if (!fromProductId || !toProductId) return;\n if (!selectedPriceId) return;\n const result = await Result.fromThrowingAsync(() => props.customer.switchSubscription({\n fromProductId,\n toProductId,\n priceId: selectedPriceId,\n }));\n if (result.status === \"error\") {\n handleAsyncError(result.error);\n return \"prevent-close\";\n }\n closeSwitchDialog();\n },\n props: {\n disabled: !switchFromProductId || !switchToProductId || !selectedPriceId,\n },\n }}\n >\n <div className=\"space-y-2\">\n {switchOptions.length === 0 ? (\n <Typography variant=\"secondary\" type=\"footnote\">\n {t(\"No other plans available for this subscription.\")}\n </Typography>\n ) : (\n <>\n <Typography type=\"footnote\">{t(\"Choose a plan\")}</Typography>\n <Select\n value={switchToProductId ?? undefined}\n onValueChange={(value) => setSwitchToProductId(value || null)}\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue placeholder={t(\"Choose a plan\")} />\n </SelectTrigger>\n <SelectContent>\n {switchOptions.map((option: NonNullable<typeof switchOptions>[number]) => (\n <SelectItem key={option.productId} value={option.productId}>\n {option.displayName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </>\n )}\n </div>\n </ActionDialog>\n </Section>\n )\n }\n {invoices.length > 0 && (\n <>\n <Separator />\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Typography className=\"font-medium\">{t(\"Invoices\")}</Typography>\n <Typography variant=\"secondary\" type=\"footnote\">{t(\"Review past invoices and receipts.\")}</Typography>\n </div>\n <div className=\"border rounded-md\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[140px]\">{t(\"Date\")}</TableHead>\n <TableHead className=\"w-[120px]\">{t(\"Status\")}</TableHead>\n <TableHead className=\"w-[120px]\">{t(\"Amount\")}</TableHead>\n <TableHead className=\"w-[120px] text-right\">{t(\"Invoice\")}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invoices.map((invoice, index) => {\n const createdAtTime = invoice.createdAt.getTime();\n const invoiceKey = Number.isNaN(createdAtTime) ? `invoice-${index}` : `invoice-${createdAtTime}-${index}`;\n return (\n <TableRow key={invoiceKey}>\n <TableCell>\n <Typography>{formatInvoiceDate(invoice.createdAt, t)}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{formatInvoiceStatus(invoice.status, t)}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{formatInvoiceAmount(invoice.amountTotal, t)}</Typography>\n </TableCell>\n <TableCell align=\"right\">\n {invoice.hostedInvoiceUrl ? (\n <Button asChild variant=\"secondary\" color=\"neutral\" size=\"sm\">\n <a href={invoice.hostedInvoiceUrl} target=\"_blank\" rel=\"noreferrer\">\n {t(\"View\")}\n </a>\n </Button>\n ) : (\n <Typography variant=\"secondary\" type=\"footnote\">\n {t(\"Unavailable\")}\n </Typography>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n </div>\n </>\n )}\n </div >\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"profile-page.js","names":["PageLayout","Section","EditableText","ProfileImageEditor"],"sources":["../../../../src/components-page/account-settings/profile-page/profile-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 { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function ProfilePage(props?: {\n mockUser?: {\n displayName?: string,\n profileImageUrl?: string,\n },\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: props?.mockUser ? 'return-null' : 'redirect' });\n\n // Use mock data if provided, otherwise use real user\n const user = props?.mockUser ? {\n displayName: props.mockUser.displayName || 'John Doe',\n profileImageUrl: props.mockUser.profileImageUrl || null,\n update: async () => {\n // Mock update - do nothing in demo mode\n console.log('Mock update called');\n }\n } : userFromHook;\n\n if (!user) {\n return null; // This shouldn't happen in practice\n }\n\n return (\n <PageLayout>\n <Section\n title={t(\"User name\")}\n description={t(\"This is a display name and is not used for authentication\")}\n >\n <EditableText\n value={user.displayName || ''}\n onSave={async (newDisplayName) => {\n await user.update({ displayName: newDisplayName });\n }}/>\n </Section>\n\n <Section\n title={t(\"Profile image\")}\n description={t(\"Upload your own image as your avatar\")}\n >\n <ProfileImageEditor\n user={user as any}\n onProfileImageUrlChange={async (profileImageUrl: string | null) => {\n await user.update({ profileImageUrl });\n }}\n />\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,YAAY,OAKzB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,kDAAuB,EAAE,IAAI,OAAO,WAAW,gBAAgB,YAAY,CAAC;CAGlF,MAAM,OAAO,OAAO,WAAW;EAC7B,aAAa,MAAM,SAAS,eAAe;EAC3C,iBAAiB,MAAM,SAAS,mBAAmB;EACnD,QAAQ,YAAY;AAElB,WAAQ,IAAI,qBAAqB;;EAEpC,GAAG;AAEJ,KAAI,CAAC,KACH,QAAO;AAGT,QACE,4CAACA,2CACC,2CAACC;EACC,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,4DAA4D;YAE3E,2CAACC;GACC,OAAO,KAAK,eAAe;GAC3B,QAAQ,OAAO,mBAAmB;AAChC,UAAM,KAAK,OAAO,EAAE,aAAa,gBAAgB,CAAC;;IAChD;GACE,EAEV,2CAACD;EACC,OAAO,EAAE,gBAAgB;EACzB,aAAa,EAAE,uCAAuC;YAEtD,2CAACE;GACO;GACN,yBAAyB,OAAO,oBAAmC;AACjE,UAAM,KAAK,OAAO,EAAE,iBAAiB,CAAC;;IAExC;GACM,IACC"}
1
+ {"version":3,"file":"profile-page.js","names":["PageLayout","Section","EditableText","ProfileImageEditor"],"sources":["../../../../src/components-page/account-settings/profile-page/profile-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function ProfilePage(props?: {\n mockUser?: {\n displayName?: string,\n profileImageUrl?: string,\n },\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: props?.mockUser ? 'return-null' : 'redirect' });\n\n // Use mock data if provided, otherwise use real user\n const user = props?.mockUser ? {\n displayName: props.mockUser.displayName || 'John Doe',\n profileImageUrl: props.mockUser.profileImageUrl || null,\n update: async () => {\n // Mock update - do nothing in demo mode\n console.log('Mock update called');\n }\n } : userFromHook;\n\n if (!user) {\n return null; // This shouldn't happen in practice\n }\n\n return (\n <PageLayout>\n <Section\n title={t(\"User name\")}\n description={t(\"This is a display name and is not used for authentication\")}\n >\n <EditableText\n value={user.displayName || ''}\n onSave={async (newDisplayName) => {\n await user.update({ displayName: newDisplayName });\n }}/>\n </Section>\n\n <Section\n title={t(\"Profile image\")}\n description={t(\"Upload your own image as your avatar\")}\n >\n <ProfileImageEditor\n user={user as any}\n onProfileImageUrlChange={async (profileImageUrl: string | null) => {\n await user.update({ profileImageUrl });\n }}\n />\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,YAAY,OAKzB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,kDAAuB,EAAE,IAAI,OAAO,WAAW,gBAAgB,YAAY,CAAC;CAGlF,MAAM,OAAO,OAAO,WAAW;EAC7B,aAAa,MAAM,SAAS,eAAe;EAC3C,iBAAiB,MAAM,SAAS,mBAAmB;EACnD,QAAQ,YAAY;AAElB,WAAQ,IAAI,qBAAqB;;EAEpC,GAAG;AAEJ,KAAI,CAAC,KACH,QAAO;AAGT,QACE,4CAACA,2CACC,2CAACC;EACC,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,4DAA4D;YAE3E,2CAACC;GACC,OAAO,KAAK,eAAe;GAC3B,QAAQ,OAAO,mBAAmB;AAChC,UAAM,KAAK,OAAO,EAAE,aAAa,gBAAgB,CAAC;;IAChD;GACE,EAEV,2CAACD;EACC,OAAO,EAAE,gBAAgB;EACzB,aAAa,EAAE,uCAAuC;YAEtD,2CAACE;GACO;GACN,yBAAyB,OAAO,oBAAmC;AACjE,UAAM,KAAK,OAAO,EAAE,iBAAiB,CAAC;;IAExC;GACM,IACC"}
@@ -1 +1 @@
1
- {"version":3,"file":"section.js","names":["Separator","Typography"],"sources":["../../../src/components-page/account-settings/section.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 { Separator, Typography } from \"@hexclave/ui\";\n\nexport function Section(props: { title: string, description?: string, children: React.ReactNode }) {\n return (\n <>\n <Separator />\n <div className='flex flex-col sm:flex-row gap-2'>\n <div className='sm:flex-1 flex flex-col justify-center'>\n <Typography className='font-medium'>\n {props.title}\n </Typography>\n {props.description && <Typography variant='secondary' type='footnote'>\n {props.description}\n </Typography>}\n </div>\n <div className='sm:flex-1 sm:items-end flex flex-col gap-2 '>\n {props.children}\n </div>\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,QAAQ,OAA2E;AACjG,QACE,qFACE,2CAACA,2BAAY,EACb,4CAAC;EAAI,WAAU;aACb,4CAAC;GAAI,WAAU;cACb,2CAACC;IAAW,WAAU;cACnB,MAAM;KACI,EACZ,MAAM,eAAe,2CAACA;IAAW,SAAQ;IAAY,MAAK;cACxD,MAAM;KACI;IACT,EACN,2CAAC;GAAI,WAAU;aACZ,MAAM;IACH;GACF,IACL"}
1
+ {"version":3,"file":"section.js","names":["Separator","Typography"],"sources":["../../../src/components-page/account-settings/section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Separator, Typography } from \"@hexclave/ui\";\n\nexport function Section(props: { title: string, description?: string, children: React.ReactNode }) {\n return (\n <>\n <Separator />\n <div className='flex flex-col sm:flex-row gap-2'>\n <div className='sm:flex-1 flex flex-col justify-center'>\n <Typography className='font-medium'>\n {props.title}\n </Typography>\n {props.description && <Typography variant='secondary' type='footnote'>\n {props.description}\n </Typography>}\n </div>\n <div className='sm:flex-1 sm:items-end flex flex-col gap-2 '>\n {props.children}\n </div>\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,QAAQ,OAA2E;AACjG,QACE,qFACE,2CAACA,2BAAY,EACb,4CAAC;EAAI,WAAU;aACb,4CAAC;GAAI,WAAU;cACb,2CAACC;IAAW,WAAU;cACnB,MAAM;KACI,EACZ,MAAM,eAAe,2CAACA;IAAW,SAAQ;IAAY,MAAK;cACxD,MAAM;KACI;IACT,EACN,2CAAC;GAAI,WAAU;aACZ,MAAM;IACH;GACF,IACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-account-section.js","names":["Section","Accordion","AccordionItem","AccordionTrigger","AccordionContent","Button","Typography"],"sources":["../../../../src/components-page/account-settings/settings/delete-account-section.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 { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function DeleteAccountSection(props?: { mockMode?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n const app = useStackApp();\n const project = app.useProject();\n const [deleting, setDeleting] = useState(false);\n\n // In mock mode, always show the delete section\n const showDeleteSection = props?.mockMode || project.config.clientUserDeletionEnabled;\n\n if (!showDeleteSection) {\n return null;\n }\n\n const handleDeleteAccount = async () => {\n if (props?.mockMode) {\n // Mock mode - just show an alert\n alert(\"Mock mode: Account deletion clicked\");\n setDeleting(false);\n return;\n }\n\n if (user) {\n await user.delete();\n await app.redirectToHome();\n }\n };\n\n return (\n <Section\n title={t(\"Delete Account\")}\n description={t(\"Permanently remove your account and all associated data\")}\n >\n <div className='stack-scope flex flex-col items-stretch'>\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>{t(\"Danger zone\")}</AccordionTrigger>\n <AccordionContent>\n {!deleting ? (\n <div>\n <Button\n variant='destructive'\n onClick={() => setDeleting(true)}\n >\n {t(\"Delete account\")}\n </Button>\n </div>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to delete your account? This action is IRREVERSIBLE and will delete ALL associated data.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeleteAccount}\n >\n {t(\"Delete Account\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDeleting(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,qBAAqB,OAAgC;CACnE,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,YAAY,CAAC;CAC1E,MAAM,8CAAmB;CACzB,MAAM,UAAU,IAAI,YAAY;CAChC,MAAM,CAAC,UAAU,mCAAwB,MAAM;AAK/C,KAAI,EAFsB,OAAO,YAAY,QAAQ,OAAO,2BAG1D,QAAO;CAGT,MAAM,sBAAsB,YAAY;AACtC,MAAI,OAAO,UAAU;AAEnB,SAAM,sCAAsC;AAC5C,eAAY,MAAM;AAClB;;AAGF,MAAI,MAAM;AACR,SAAM,KAAK,QAAQ;AACnB,SAAM,IAAI,gBAAgB;;;AAI9B,QACE,2CAACA;EACC,OAAO,EAAE,iBAAiB;EAC1B,aAAa,EAAE,0DAA0D;YAEzE,2CAAC;GAAI,WAAU;aACb,2CAACC;IAAU,MAAK;IAAS;IAAY,WAAU;cAC7C,4CAACC;KAAc,OAAM;gBACnB,2CAACC,2CAAkB,EAAE,cAAc,GAAoB,EACvD,2CAACC,2CACE,CAAC,WACA,2CAAC,mBACC,2CAACC;MACC,SAAQ;MACR,eAAe,YAAY,KAAK;gBAE/B,EAAE,iBAAiB;OACb,GACL,GAEN,4CAAC;MAAI,WAAU;iBACb,2CAACC;OAAW,SAAQ;iBACjB,EAAE,iHAAiH;QACzG,EACb,4CAAC;OAAI,WAAU;kBACb,2CAACD;QACC,SAAQ;QACR,SAAS;kBAER,EAAE,iBAAiB;SACb,EACT,2CAACA;QACC,SAAQ;QACR,eAAe,YAAY,MAAM;kBAEhC,EAAE,SAAS;SACL;QACL;OACF,GAES;MACL;KACN;IACR;GACE"}
1
+ {"version":3,"file":"delete-account-section.js","names":["Section","Accordion","AccordionItem","AccordionTrigger","AccordionContent","Button","Typography"],"sources":["../../../../src/components-page/account-settings/settings/delete-account-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function DeleteAccountSection(props?: { mockMode?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n const app = useStackApp();\n const project = app.useProject();\n const [deleting, setDeleting] = useState(false);\n\n // In mock mode, always show the delete section\n const showDeleteSection = props?.mockMode || project.config.clientUserDeletionEnabled;\n\n if (!showDeleteSection) {\n return null;\n }\n\n const handleDeleteAccount = async () => {\n if (props?.mockMode) {\n // Mock mode - just show an alert\n alert(\"Mock mode: Account deletion clicked\");\n setDeleting(false);\n return;\n }\n\n if (user) {\n await user.delete();\n await app.redirectToHome();\n }\n };\n\n return (\n <Section\n title={t(\"Delete Account\")}\n description={t(\"Permanently remove your account and all associated data\")}\n >\n <div className='stack-scope flex flex-col items-stretch'>\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>{t(\"Danger zone\")}</AccordionTrigger>\n <AccordionContent>\n {!deleting ? (\n <div>\n <Button\n variant='destructive'\n onClick={() => setDeleting(true)}\n >\n {t(\"Delete account\")}\n </Button>\n </div>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to delete your account? This action is IRREVERSIBLE and will delete ALL associated data.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeleteAccount}\n >\n {t(\"Delete Account\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDeleting(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,qBAAqB,OAAgC;CACnE,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,YAAY,CAAC;CAC1E,MAAM,8CAAmB;CACzB,MAAM,UAAU,IAAI,YAAY;CAChC,MAAM,CAAC,UAAU,mCAAwB,MAAM;AAK/C,KAAI,EAFsB,OAAO,YAAY,QAAQ,OAAO,2BAG1D,QAAO;CAGT,MAAM,sBAAsB,YAAY;AACtC,MAAI,OAAO,UAAU;AAEnB,SAAM,sCAAsC;AAC5C,eAAY,MAAM;AAClB;;AAGF,MAAI,MAAM;AACR,SAAM,KAAK,QAAQ;AACnB,SAAM,IAAI,gBAAgB;;;AAI9B,QACE,2CAACA;EACC,OAAO,EAAE,iBAAiB;EAC1B,aAAa,EAAE,0DAA0D;YAEzE,2CAAC;GAAI,WAAU;aACb,2CAACC;IAAU,MAAK;IAAS;IAAY,WAAU;cAC7C,4CAACC;KAAc,OAAM;gBACnB,2CAACC,2CAAkB,EAAE,cAAc,GAAoB,EACvD,2CAACC,2CACE,CAAC,WACA,2CAAC,mBACC,2CAACC;MACC,SAAQ;MACR,eAAe,YAAY,KAAK;gBAE/B,EAAE,iBAAiB;OACb,GACL,GAEN,4CAAC;MAAI,WAAU;iBACb,2CAACC;OAAW,SAAQ;iBACjB,EAAE,iHAAiH;QACzG,EACb,4CAAC;OAAI,WAAU;kBACb,2CAACD;QACC,SAAQ;QACR,SAAS;kBAER,EAAE,iBAAiB;SACb,EACT,2CAACA;QACC,SAAQ;QACR,eAAe,YAAY,MAAM;kBAEhC,EAAE,SAAS;SACL;QACL;OACF,GAES;MACL;KACN;IACR;GACE"}