@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":"oauth-button-group.js","names":["OAuthButton"],"sources":["../../src/components/oauth-button-group.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 { useStackApp } from \"../lib/hooks\";\nimport { OAuthButton } from \"./oauth-button\";\n\nexport function OAuthButtonGroup({\n type,\n mockProject,\n}: {\n type: 'sign-in' | 'sign-up',\n mockProject?: {\n config: {\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}) {\n const stackApp = useStackApp();\n const project = mockProject || stackApp.useProject();\n return (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {project.config.oauthProviders.map(p => (\n <OAuthButton key={p.id} provider={p.id} type={type}\n isMock={!!mockProject}\n />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,iBAAiB,EAC/B,MACA,eAUC;CACD,MAAM,6CAAwB;AAE9B,QACE,2CAAC;EAAI,WAAU;aAFD,eAAe,SAAS,YAAY,EAGvC,OAAO,eAAe,KAAI,MACjC,2CAACA;GAAuB,UAAU,EAAE;GAAU;GAC5C,QAAQ,CAAC,CAAC;KADM,EAAE,GAElB,CACF;GACE"}
1
+ {"version":3,"file":"oauth-button-group.js","names":["OAuthButton"],"sources":["../../src/components/oauth-button-group.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 { useStackApp } from \"../lib/hooks\";\nimport { OAuthButton } from \"./oauth-button\";\n\nexport function OAuthButtonGroup({\n type,\n mockProject,\n}: {\n type: 'sign-in' | 'sign-up',\n mockProject?: {\n config: {\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}) {\n const hexclaveApp = useStackApp();\n const project = mockProject || hexclaveApp.useProject();\n return (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {project.config.oauthProviders.map(p => (\n <OAuthButton key={p.id} provider={p.id} type={type}\n isMock={!!mockProject}\n />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,iBAAiB,EAC/B,MACA,eAUC;CACD,MAAM,gDAA2B;AAEjC,QACE,2CAAC;EAAI,WAAU;aAFD,eAAe,YAAY,YAAY,EAG1C,OAAO,eAAe,KAAI,MACjC,2CAACA;GAAuB,UAAU,EAAE;GAAU;GAC5C,QAAQ,CAAC,CAAC;KADM,EAAE,GAElB,CACF;GACE"}
@@ -19,7 +19,7 @@ const changeColor = (c, value) => {
19
19
  };
20
20
  function OAuthButton({ provider, type, isMock = false, onAuthenticate }) {
21
21
  const { t } = (0, ___lib_translations_js.useTranslation)();
22
- const stackApp = (0, ___lib_hooks_js.useStackApp)();
22
+ const hexclaveApp = (0, ___lib_hooks_js.useStackApp)();
23
23
  const styleId = (0, react.useId)().replaceAll(":", "-");
24
24
  const isIframe = (0, __use_in_iframe_js.useInIframe)();
25
25
  const [lastUsed, setLastUsed] = (0, react.useState)(null);
@@ -150,7 +150,7 @@ function OAuthButton({ provider, type, isMock = false, onAuthenticate }) {
150
150
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.Button, {
151
151
  onClick: async () => {
152
152
  localStorage.setItem("_HEXCLAVE.lastUsed", provider);
153
- await (onAuthenticate ? onAuthenticate() : stackApp.signInWithOAuth(provider));
153
+ await (onAuthenticate ? onAuthenticate() : hexclaveApp.signInWithOAuth(provider));
154
154
  },
155
155
  className: `stack-oauth-button-${styleId} stack-scope relative w-full`,
156
156
  disabled: isIframe,
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-button.js","names":["BrandIcons","SimpleTooltip","Button"],"sources":["../../src/components/oauth-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { BrandIcons, Button, SimpleTooltip } from '@hexclave/ui';\nimport Color, { ColorInstance } from 'color';\nimport type { ReactElement } from 'react';\nimport { useEffect, useId, useState } from 'react';\nimport { useStackApp } from '../lib/hooks';\nimport { useTranslation } from '../lib/translations';\nimport { useInIframe } from './use-in-iframe';\n\nconst iconSize = 22;\n\nconst changeColor = (c: ColorInstance, value: number) => {\n if (c.isLight()) {\n value = -value;\n }\n return c.hsl(c.hue(), c.saturationl(), c.lightness() + value).toString();\n};\n\nexport function OAuthButton({\n provider,\n type,\n isMock = false,\n onAuthenticate,\n}: {\n provider: string,\n type: 'sign-in' | 'sign-up',\n isMock?: boolean,\n onAuthenticate?: () => Promise<void>,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const styleId = useId().replaceAll(':', '-');\n const isIframe = useInIframe();\n\n const [lastUsed, setLastUsed] = useState<string | null>(null);\n useEffect(() => {\n // Hexclave rebrand: UI hint key — straight rename (dot delimiter preserved).\n setLastUsed(localStorage.getItem('_HEXCLAVE.lastUsed'));\n }, []);\n\n let style : {\n backgroundColor?: string,\n textColor?: string,\n name: string,\n icon: ReactElement | null,\n border?: string,\n };\n switch (provider) {\n case 'google': {\n style = {\n backgroundColor: '#fff',\n textColor: '#000',\n name: 'Google',\n border: '1px solid #ddd',\n icon: <BrandIcons.Google iconSize={iconSize} />,\n };\n break;\n }\n case 'github': {\n style = {\n backgroundColor: '#111',\n textColor: '#fff',\n border: '1px solid #333',\n name: 'GitHub',\n icon: <BrandIcons.GitHub iconSize={iconSize} />,\n };\n break;\n }\n case 'facebook': {\n style = {\n backgroundColor: '#1877F2',\n textColor: '#fff',\n name: 'Facebook',\n icon: <BrandIcons.Facebook iconSize={iconSize} />,\n };\n break;\n }\n case 'microsoft': {\n style = {\n backgroundColor: '#2f2f2f',\n textColor: '#fff',\n name: 'Microsoft',\n icon: <BrandIcons.Microsoft iconSize={iconSize} />,\n };\n break;\n }\n case 'spotify': {\n style = {\n backgroundColor: '#1DB954',\n textColor: '#fff',\n name: 'Spotify',\n icon: <BrandIcons.Spotify iconSize={iconSize} />,\n };\n break;\n }\n case 'discord': {\n style = {\n backgroundColor: '#5865F2',\n textColor: '#fff',\n name: 'Discord',\n icon: <BrandIcons.Discord iconSize={iconSize} />,\n };\n break;\n }\n case 'gitlab': {\n style = {\n backgroundColor: \"#111\",\n textColor: \"#fff\",\n border: \"1px solid #333\",\n name: \"Gitlab\",\n icon: <BrandIcons.Gitlab iconSize={iconSize} />,\n };\n break;\n }\n case 'apple': {\n style = {\n backgroundColor: \"#000\",\n textColor: \"#fff\",\n border: \"1px solid #333\",\n name: \"Apple\",\n icon: <BrandIcons.Apple iconSize={iconSize} />,\n };\n break;\n }\n case \"bitbucket\": {\n style = {\n backgroundColor: \"#fff\",\n textColor: \"#000\",\n border: \"1px solid #ddd\",\n name: \"Bitbucket\",\n icon: <BrandIcons.Bitbucket iconSize={iconSize} />,\n };\n break;\n }\n case 'linkedin': {\n style = {\n backgroundColor: \"#0073b1\",\n textColor: \"#fff\",\n name: \"LinkedIn\",\n icon: <BrandIcons.LinkedIn iconSize={iconSize} />,\n };\n break;\n }\n case 'x': {\n style = {\n backgroundColor: \"#000\",\n textColor: \"#fff\",\n name: \"X\",\n icon: <BrandIcons.X iconSize={iconSize} />,\n };\n break;\n }\n case 'twitch': {\n style = {\n backgroundColor: \"#6441a5\",\n textColor: \"#fff\",\n name: \"Twitch\",\n icon: <BrandIcons.Twitch iconSize={iconSize} />,\n };\n break;\n }\n default: {\n style = {\n name: provider,\n icon: null,\n };\n }\n }\n\n const styleSheet = `\n .stack-oauth-button-${styleId} {\n background-color: ${style.backgroundColor} !important;\n color: ${style.textColor} !important;\n border: ${style.border} !important;\n }\n .stack-oauth-button-${styleId}:hover {\n background-color: ${changeColor(Color(style.backgroundColor), 10)} !important;\n }\n `;\n\n return (\n <>\n <style>{styleSheet}</style>\n <SimpleTooltip\n disabled={!isIframe}\n tooltip={isIframe ? \"This auth provider is not supported in an iframe for security reasons.\" : undefined}\n className='stack-scope w-full inline-flex'\n >\n <Button\n onClick={async () => {\n // Hexclave rebrand: UI hint key — straight rename (dot delimiter preserved).\n localStorage.setItem('_HEXCLAVE.lastUsed', provider);\n await (onAuthenticate ? onAuthenticate() : stackApp.signInWithOAuth(provider));\n }}\n className={`stack-oauth-button-${styleId} stack-scope relative w-full`}\n disabled={isIframe}\n >\n {!isMock && lastUsed === provider && (\n <span className=\"absolute -top-2 -right-2 bg-blue-500 text-white text-xs px-2 py-1 rounded-md\">\n last\n </span>\n )}\n <div className='flex items-center w-full gap-4'>\n {style.icon}\n <span className='flex-1'>\n {type === 'sign-up' ?\n t('Sign up with {provider}', { provider: style.name }) :\n t('Sign in with {provider}', { provider: style.name })\n }\n </span>\n </div>\n </Button>\n </SimpleTooltip>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oauth-button.js","names":["BrandIcons","SimpleTooltip","Button"],"sources":["../../src/components/oauth-button.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 { BrandIcons, Button, SimpleTooltip } from '@hexclave/ui';\nimport Color, { ColorInstance } from 'color';\nimport type { ReactElement } from 'react';\nimport { useEffect, useId, useState } from 'react';\nimport { useStackApp } from '../lib/hooks';\nimport { useTranslation } from '../lib/translations';\nimport { useInIframe } from './use-in-iframe';\n\nconst iconSize = 22;\n\nconst changeColor = (c: ColorInstance, value: number) => {\n if (c.isLight()) {\n value = -value;\n }\n return c.hsl(c.hue(), c.saturationl(), c.lightness() + value).toString();\n};\n\nexport function OAuthButton({\n provider,\n type,\n isMock = false,\n onAuthenticate,\n}: {\n provider: string,\n type: 'sign-in' | 'sign-up',\n isMock?: boolean,\n onAuthenticate?: () => Promise<void>,\n}) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const styleId = useId().replaceAll(':', '-');\n const isIframe = useInIframe();\n\n const [lastUsed, setLastUsed] = useState<string | null>(null);\n useEffect(() => {\n // Hexclave rebrand: UI hint key — straight rename (dot delimiter preserved).\n setLastUsed(localStorage.getItem('_HEXCLAVE.lastUsed'));\n }, []);\n\n let style : {\n backgroundColor?: string,\n textColor?: string,\n name: string,\n icon: ReactElement | null,\n border?: string,\n };\n switch (provider) {\n case 'google': {\n style = {\n backgroundColor: '#fff',\n textColor: '#000',\n name: 'Google',\n border: '1px solid #ddd',\n icon: <BrandIcons.Google iconSize={iconSize} />,\n };\n break;\n }\n case 'github': {\n style = {\n backgroundColor: '#111',\n textColor: '#fff',\n border: '1px solid #333',\n name: 'GitHub',\n icon: <BrandIcons.GitHub iconSize={iconSize} />,\n };\n break;\n }\n case 'facebook': {\n style = {\n backgroundColor: '#1877F2',\n textColor: '#fff',\n name: 'Facebook',\n icon: <BrandIcons.Facebook iconSize={iconSize} />,\n };\n break;\n }\n case 'microsoft': {\n style = {\n backgroundColor: '#2f2f2f',\n textColor: '#fff',\n name: 'Microsoft',\n icon: <BrandIcons.Microsoft iconSize={iconSize} />,\n };\n break;\n }\n case 'spotify': {\n style = {\n backgroundColor: '#1DB954',\n textColor: '#fff',\n name: 'Spotify',\n icon: <BrandIcons.Spotify iconSize={iconSize} />,\n };\n break;\n }\n case 'discord': {\n style = {\n backgroundColor: '#5865F2',\n textColor: '#fff',\n name: 'Discord',\n icon: <BrandIcons.Discord iconSize={iconSize} />,\n };\n break;\n }\n case 'gitlab': {\n style = {\n backgroundColor: \"#111\",\n textColor: \"#fff\",\n border: \"1px solid #333\",\n name: \"Gitlab\",\n icon: <BrandIcons.Gitlab iconSize={iconSize} />,\n };\n break;\n }\n case 'apple': {\n style = {\n backgroundColor: \"#000\",\n textColor: \"#fff\",\n border: \"1px solid #333\",\n name: \"Apple\",\n icon: <BrandIcons.Apple iconSize={iconSize} />,\n };\n break;\n }\n case \"bitbucket\": {\n style = {\n backgroundColor: \"#fff\",\n textColor: \"#000\",\n border: \"1px solid #ddd\",\n name: \"Bitbucket\",\n icon: <BrandIcons.Bitbucket iconSize={iconSize} />,\n };\n break;\n }\n case 'linkedin': {\n style = {\n backgroundColor: \"#0073b1\",\n textColor: \"#fff\",\n name: \"LinkedIn\",\n icon: <BrandIcons.LinkedIn iconSize={iconSize} />,\n };\n break;\n }\n case 'x': {\n style = {\n backgroundColor: \"#000\",\n textColor: \"#fff\",\n name: \"X\",\n icon: <BrandIcons.X iconSize={iconSize} />,\n };\n break;\n }\n case 'twitch': {\n style = {\n backgroundColor: \"#6441a5\",\n textColor: \"#fff\",\n name: \"Twitch\",\n icon: <BrandIcons.Twitch iconSize={iconSize} />,\n };\n break;\n }\n default: {\n style = {\n name: provider,\n icon: null,\n };\n }\n }\n\n const styleSheet = `\n .stack-oauth-button-${styleId} {\n background-color: ${style.backgroundColor} !important;\n color: ${style.textColor} !important;\n border: ${style.border} !important;\n }\n .stack-oauth-button-${styleId}:hover {\n background-color: ${changeColor(Color(style.backgroundColor), 10)} !important;\n }\n `;\n\n return (\n <>\n <style>{styleSheet}</style>\n <SimpleTooltip\n disabled={!isIframe}\n tooltip={isIframe ? \"This auth provider is not supported in an iframe for security reasons.\" : undefined}\n className='stack-scope w-full inline-flex'\n >\n <Button\n onClick={async () => {\n // Hexclave rebrand: UI hint key — straight rename (dot delimiter preserved).\n localStorage.setItem('_HEXCLAVE.lastUsed', provider);\n await (onAuthenticate ? onAuthenticate() : hexclaveApp.signInWithOAuth(provider));\n }}\n className={`stack-oauth-button-${styleId} stack-scope relative w-full`}\n disabled={isIframe}\n >\n {!isMock && lastUsed === provider && (\n <span className=\"absolute -top-2 -right-2 bg-blue-500 text-white text-xs px-2 py-1 rounded-md\">\n last\n </span>\n )}\n <div className='flex items-center w-full gap-4'>\n {style.icon}\n <span className='flex-1'>\n {type === 'sign-up' ?\n t('Sign up with {provider}', { provider: style.name }) :\n t('Sign in with {provider}', { provider: style.name })\n }\n </span>\n </div>\n </Button>\n </SimpleTooltip>\n </>\n );\n}\n"],"mappings":"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"}
@@ -3,19 +3,19 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
  const require_chunk = require('../chunk-BE-pF4vm.js');
5
5
  let _hexclave_ui = require("@hexclave/ui");
6
- let lucide_react = require("lucide-react");
7
6
  let react = require("react");
8
7
  let ___index_js = require("../index.js");
9
8
  let ___lib_translations_js = require("../lib/translations.js");
10
9
  let react_jsx_runtime = require("react/jsx-runtime");
10
+ let lucide_react = require("lucide-react");
11
11
 
12
12
  //#region src/components/passkey-button.tsx
13
13
  function PasskeyButton({ type }) {
14
14
  const { t } = (0, ___lib_translations_js.useTranslation)();
15
- const stackApp = (0, ___index_js.useStackApp)();
15
+ const hexclaveApp = (0, ___index_js.useStackApp)();
16
16
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
17
17
  onClick: async () => {
18
- await stackApp.signInWithPasskey();
18
+ await hexclaveApp.signInWithPasskey();
19
19
  },
20
20
  className: `stack-oauth-button-${(0, react.useId)().replaceAll(":", "-")} stack-scope`,
21
21
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-button.js","names":["Button","KeyRound"],"sources":["../../src/components/passkey-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { Button } from '@hexclave/ui';\nimport { KeyRound } from 'lucide-react';\nimport { useId } from 'react';\nimport { useStackApp } from '..';\nimport { useTranslation } from '../lib/translations';\n\n\nexport function PasskeyButton({\n type,\n}: {\n type: 'sign-in' | 'sign-up',\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const styleId = useId().replaceAll(':', '-');\n\n\n return (\n <>\n <Button\n onClick={async () => { await stackApp.signInWithPasskey(); }}\n className={`stack-oauth-button-${styleId} stack-scope`}\n >\n <div className='flex items-center w-full gap-4'>\n <KeyRound />\n <span className='flex-1'>\n {type === 'sign-up' ?\n t('Sign up with Passkey') :\n t('Sign in with Passkey')\n }\n </span>\n </div>\n </Button>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,cAAc,EAC5B,QAGC;CACD,MAAM,EAAE,kDAAsB;CAC9B,MAAM,yCAAwB;AAI9B,QACE,mFACE,2CAACA;EACC,SAAS,YAAY;AAAE,SAAM,SAAS,mBAAmB;;EACzD,WAAW,wCAPM,CAAC,WAAW,KAAK,IAAI,CAOG;YAEzC,4CAAC;GAAI,WAAU;cACb,2CAACC,0BAAW,EACZ,2CAAC;IAAK,WAAU;cACb,SAAS,YACR,EAAE,uBAAuB,GACzB,EAAE,uBAAuB;KAEtB;IACH;GACC,GACR"}
1
+ {"version":3,"file":"passkey-button.js","names":["Button","KeyRound"],"sources":["../../src/components/passkey-button.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 { Button } from '@hexclave/ui';\nimport { KeyRound } from 'lucide-react';\nimport { useId } from 'react';\nimport { useStackApp } from '..';\nimport { useTranslation } from '../lib/translations';\n\n\nexport function PasskeyButton({\n type,\n}: {\n type: 'sign-in' | 'sign-up',\n}) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const styleId = useId().replaceAll(':', '-');\n\n\n return (\n <>\n <Button\n onClick={async () => { await hexclaveApp.signInWithPasskey(); }}\n className={`stack-oauth-button-${styleId} stack-scope`}\n >\n <div className='flex items-center w-full gap-4'>\n <KeyRound />\n <span className='flex-1'>\n {type === 'sign-up' ?\n t('Sign up with Passkey') :\n t('Sign in with Passkey')\n }\n </span>\n </div>\n </Button>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,cAAc,EAC5B,QAGC;CACD,MAAM,EAAE,kDAAsB;CAC9B,MAAM,4CAA2B;AAIjC,QACE,mFACE,2CAACA;EACC,SAAS,YAAY;AAAE,SAAM,YAAY,mBAAmB;;EAC5D,WAAW,wCAPM,CAAC,WAAW,KAAK,IAAI,CAOG;YAEzC,4CAAC;GAAI,WAAU;cACb,2CAACC,0BAAW,EACZ,2CAAC;IAAK,WAAU;cACb,SAAS,YACR,EAAE,uBAAuB,GACzB,EAAE,uBAAuB;KAEtB;IACH;GACC,GACR"}
@@ -2,10 +2,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../chunk-BE-pF4vm.js');
3
3
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
4
  let _hexclave_ui = require("@hexclave/ui");
5
- let lucide_react = require("lucide-react");
6
5
  let react = require("react");
7
6
  let ___lib_translations_js = require("../lib/translations.js");
8
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
+ let lucide_react = require("lucide-react");
9
9
  let _hexclave_shared_dist_utils_base64 = require("@hexclave/shared/dist/utils/base64");
10
10
  let browser_image_compression = require("browser-image-compression");
11
11
  browser_image_compression = require_chunk.__toESM(browser_image_compression);
@@ -1 +1 @@
1
- {"version":3,"file":"profile-image-editor.js","names":["UserAvatar","Upload","Typography","Cropper","Slider","Button","imageCompression"],"sources":["../../src/components/profile-image-editor.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 { fileToBase64 } from '@hexclave/shared/dist/utils/base64';\nimport { runAsynchronouslyWithAlert } from '@hexclave/shared/dist/utils/promises';\nimport { Button, Slider, Typography } from '@hexclave/ui';\nimport imageCompression from 'browser-image-compression';\nimport { Upload } from 'lucide-react';\nimport { ComponentProps, useCallback, useState } from 'react';\nimport Cropper, { Area } from 'react-easy-crop';\nimport { useTranslation } from '../lib/translations';\nimport { UserAvatar } from './elements/user-avatar';\n\nexport async function checkImageUrl(url: string){\n try {\n const res = await fetch(url, { method: 'HEAD' });\n const buff = await res.blob();\n return buff.type.startsWith('image/');\n } catch (e) {\n return false;\n }\n}\n\nconst createImage = (url: string): Promise<HTMLImageElement> =>\n new Promise((resolve, reject) => {\n const image = new Image();\n image.addEventListener('load', () => resolve(image));\n image.addEventListener('error', (error) => reject(error));\n image.setAttribute('crossOrigin', 'anonymous');\n image.src = url;\n });\n\nexport async function getCroppedImg(imageSrc: string, pixelCrop: Area): Promise<string | null> {\n const image = await createImage(imageSrc);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return null;\n }\n\n const safeCrop = {\n x: Math.max(0, pixelCrop.x),\n y: Math.max(0, pixelCrop.y),\n width: Math.max(1, pixelCrop.width),\n height: Math.max(1, pixelCrop.height),\n };\n\n canvas.width = safeCrop.width;\n canvas.height = safeCrop.height;\n\n ctx.drawImage(\n image,\n safeCrop.x,\n safeCrop.y,\n safeCrop.width,\n safeCrop.height,\n 0,\n 0,\n safeCrop.width,\n safeCrop.height\n );\n\n return canvas.toDataURL('image/jpeg');\n}\n\nexport function ProfileImageEditor(props: {\n user: NonNullable<ComponentProps<typeof UserAvatar>['user']>,\n onProfileImageUrlChange: (profileImageUrl: string | null) => void | Promise<void>,\n}) {\n const { t } = useTranslation();\n const [rawUrl, setRawUrl] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n\n function reset() {\n setRawUrl(null);\n setError(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n }\n\n const onCropChange = useCallback((crop: { x: number, y: number }) => {\n setCrop(crop);\n }, []);\n\n const onCropComplete = useCallback((croppedArea: Area, croppedAreaPixels: Area) => {\n setCroppedAreaPixels(croppedAreaPixels);\n }, []);\n\n const onZoomChange = useCallback((zoom: number) => {\n setZoom(zoom);\n }, []);\n\n\n function upload() {\n const input = document.createElement('input');\n input.type = 'file';\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n runAsynchronouslyWithAlert(async () => {\n const rawUrl = await fileToBase64(file);\n if (await checkImageUrl(rawUrl)) {\n setRawUrl(rawUrl);\n setError(null);\n } else {\n setError(t('Invalid image'));\n }\n input.remove();\n });\n };\n input.click();\n }\n\n if (!rawUrl) {\n return <div className='flex flex-col'>\n <div className='cursor-pointer relative' onClick={upload}>\n <UserAvatar\n size={60}\n user={props.user}\n border\n />\n <div className='absolute top-0 left-0 h-[60px] w-[60px] bg-gray-500/20 backdrop-blur-sm items-center justify-center rounded-full flex opacity-0 hover:opacity-100 transition-opacity'>\n <div className='bg-background p-2 rounded-full'>\n <Upload className='h-5 w-5' />\n </div>\n </div>\n </div>\n {error && <Typography variant='destructive' type='label'>{error}</Typography>}\n </div>;\n }\n\n return (\n <div className='flex flex-col items-center gap-4'>\n <div className='relative w-64 h-64'>\n <Cropper\n image={rawUrl || props.user.profileImageUrl || \"\"}\n crop={crop}\n zoom={zoom}\n aspect={1}\n cropShape=\"round\"\n showGrid={false}\n onCropChange={onCropChange}\n onCropComplete={onCropComplete}\n onZoomChange={onZoomChange}\n />\n </div>\n <Slider\n min={1}\n max={3}\n step={0.1}\n value={[zoom]}\n onValueChange={(v) => onZoomChange(v[0])}\n />\n\n <div className='flex flex-row gap-2'>\n <Button\n onClick={async () => {\n if (rawUrl && croppedAreaPixels) {\n const croppedImageUrl = await getCroppedImg(rawUrl, croppedAreaPixels);\n if (croppedImageUrl) {\n const compressedFile = await imageCompression(\n await imageCompression.getFilefromDataUrl(croppedImageUrl, 'profile-image'),\n {\n maxSizeMB: 0.1,\n fileType: \"image/jpeg\",\n }\n );\n const compressedUrl = await imageCompression.getDataUrlFromFile(compressedFile);\n await props.onProfileImageUrlChange(compressedUrl);\n reset();\n } else {\n setError(t('Could not crop image.'));\n }\n }\n }}\n >\n {t('Save')}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={reset}\n >\n {t('Cancel')}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"profile-image-editor.js","names":["UserAvatar","Upload","Typography","Cropper","Slider","Button","imageCompression"],"sources":["../../src/components/profile-image-editor.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 { fileToBase64 } from '@hexclave/shared/dist/utils/base64';\nimport { runAsynchronouslyWithAlert } from '@hexclave/shared/dist/utils/promises';\nimport { Button, Slider, Typography } from '@hexclave/ui';\nimport imageCompression from 'browser-image-compression';\nimport { Upload } from 'lucide-react';\nimport { ComponentProps, useCallback, useState } from 'react';\nimport Cropper, { Area } from 'react-easy-crop';\nimport { useTranslation } from '../lib/translations';\nimport { UserAvatar } from './elements/user-avatar';\n\nexport async function checkImageUrl(url: string){\n try {\n const res = await fetch(url, { method: 'HEAD' });\n const buff = await res.blob();\n return buff.type.startsWith('image/');\n } catch (e) {\n return false;\n }\n}\n\nconst createImage = (url: string): Promise<HTMLImageElement> =>\n new Promise((resolve, reject) => {\n const image = new Image();\n image.addEventListener('load', () => resolve(image));\n image.addEventListener('error', (error) => reject(error));\n image.setAttribute('crossOrigin', 'anonymous');\n image.src = url;\n });\n\nexport async function getCroppedImg(imageSrc: string, pixelCrop: Area): Promise<string | null> {\n const image = await createImage(imageSrc);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return null;\n }\n\n const safeCrop = {\n x: Math.max(0, pixelCrop.x),\n y: Math.max(0, pixelCrop.y),\n width: Math.max(1, pixelCrop.width),\n height: Math.max(1, pixelCrop.height),\n };\n\n canvas.width = safeCrop.width;\n canvas.height = safeCrop.height;\n\n ctx.drawImage(\n image,\n safeCrop.x,\n safeCrop.y,\n safeCrop.width,\n safeCrop.height,\n 0,\n 0,\n safeCrop.width,\n safeCrop.height\n );\n\n return canvas.toDataURL('image/jpeg');\n}\n\nexport function ProfileImageEditor(props: {\n user: NonNullable<ComponentProps<typeof UserAvatar>['user']>,\n onProfileImageUrlChange: (profileImageUrl: string | null) => void | Promise<void>,\n}) {\n const { t } = useTranslation();\n const [rawUrl, setRawUrl] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n\n function reset() {\n setRawUrl(null);\n setError(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n }\n\n const onCropChange = useCallback((crop: { x: number, y: number }) => {\n setCrop(crop);\n }, []);\n\n const onCropComplete = useCallback((croppedArea: Area, croppedAreaPixels: Area) => {\n setCroppedAreaPixels(croppedAreaPixels);\n }, []);\n\n const onZoomChange = useCallback((zoom: number) => {\n setZoom(zoom);\n }, []);\n\n\n function upload() {\n const input = document.createElement('input');\n input.type = 'file';\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n runAsynchronouslyWithAlert(async () => {\n const rawUrl = await fileToBase64(file);\n if (await checkImageUrl(rawUrl)) {\n setRawUrl(rawUrl);\n setError(null);\n } else {\n setError(t('Invalid image'));\n }\n input.remove();\n });\n };\n input.click();\n }\n\n if (!rawUrl) {\n return <div className='flex flex-col'>\n <div className='cursor-pointer relative' onClick={upload}>\n <UserAvatar\n size={60}\n user={props.user}\n border\n />\n <div className='absolute top-0 left-0 h-[60px] w-[60px] bg-gray-500/20 backdrop-blur-sm items-center justify-center rounded-full flex opacity-0 hover:opacity-100 transition-opacity'>\n <div className='bg-background p-2 rounded-full'>\n <Upload className='h-5 w-5' />\n </div>\n </div>\n </div>\n {error && <Typography variant='destructive' type='label'>{error}</Typography>}\n </div>;\n }\n\n return (\n <div className='flex flex-col items-center gap-4'>\n <div className='relative w-64 h-64'>\n <Cropper\n image={rawUrl || props.user.profileImageUrl || \"\"}\n crop={crop}\n zoom={zoom}\n aspect={1}\n cropShape=\"round\"\n showGrid={false}\n onCropChange={onCropChange}\n onCropComplete={onCropComplete}\n onZoomChange={onZoomChange}\n />\n </div>\n <Slider\n min={1}\n max={3}\n step={0.1}\n value={[zoom]}\n onValueChange={(v) => onZoomChange(v[0])}\n />\n\n <div className='flex flex-row gap-2'>\n <Button\n onClick={async () => {\n if (rawUrl && croppedAreaPixels) {\n const croppedImageUrl = await getCroppedImg(rawUrl, croppedAreaPixels);\n if (croppedImageUrl) {\n const compressedFile = await imageCompression(\n await imageCompression.getFilefromDataUrl(croppedImageUrl, 'profile-image'),\n {\n maxSizeMB: 0.1,\n fileType: \"image/jpeg\",\n }\n );\n const compressedUrl = await imageCompression.getDataUrlFromFile(compressedFile);\n await props.onProfileImageUrlChange(compressedUrl);\n reset();\n } else {\n setError(t('Could not crop image.'));\n }\n }\n }}\n >\n {t('Save')}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={reset}\n >\n {t('Cancel')}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -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/selected-team-switcher.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"selected-team-switcher.js","names":["Suspense","Skeleton","TeamSwitcher"],"sources":["../../src/components/selected-team-switcher.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//===========================================\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport {\n Skeleton,\n} from \"@hexclave/ui\";\nimport { Suspense, useEffect } from \"react\";\nimport { Team, useStackApp, useUser } from \"..\";\nimport { TeamSwitcher } from \"./team-switcher\";\n\ntype MockTeam = {\n id: string,\n displayName: string,\n profileImageUrl?: string | null,\n};\n\ntype SelectedTeamSwitcherProps<AllowNull extends boolean = false> = {\n urlMap?: (team: AllowNull extends true ? Team | null : Team) => string,\n selectedTeam?: Team,\n noUpdateSelectedTeam?: boolean,\n allowNull?: AllowNull,\n nullLabel?: string,\n onChange?: (team: AllowNull extends true ? Team | null : Team) => void,\n triggerClassName?: string,\n // Mock data props\n mockUser?: {\n selectedTeam?: MockTeam,\n },\n mockTeams?: MockTeam[],\n mockProject?: {\n config: {\n clientTeamCreationEnabled: boolean,\n },\n },\n};\n\nexport function SelectedTeamSwitcher<AllowNull extends boolean = false>(props: SelectedTeamSwitcherProps<AllowNull>) {\n return <Suspense fallback={<Fallback />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback() {\n return <Skeleton className=\"h-9 w-full max-w-64 stack-scope\" />;\n}\n\nfunction Inner<AllowNull extends boolean>(props: SelectedTeamSwitcherProps<AllowNull>) {\n const appFromHook = useStackApp();\n const userFromHook = useUser();\n\n // Use mock data if provided, otherwise use real data\n const app = props.mockUser ? {\n useProject: () => props.mockProject || { config: { clientTeamCreationEnabled: false } },\n useNavigate: () => () => {}, // Mock navigate function\n urls: { accountSettings: '/account-settings' },\n } : appFromHook;\n\n const user = props.mockUser ? {\n selectedTeam: props.mockUser.selectedTeam,\n useTeams: () => props.mockTeams || [],\n setSelectedTeam: async () => {}, // Mock function\n } : userFromHook;\n\n const navigate = app.useNavigate();\n\n useEffect(() => {\n if (!props.noUpdateSelectedTeam && props.selectedTeam && !props.mockUser) {\n runAsynchronouslyWithAlert(user?.setSelectedTeam(props.selectedTeam));\n }\n }, [props.noUpdateSelectedTeam, props.selectedTeam, props.mockUser]);\n\n return (\n <TeamSwitcher\n team={props.selectedTeam}\n allowNull={props.allowNull}\n nullLabel={props.nullLabel}\n triggerClassName={props.triggerClassName}\n onChange={async (team) => {\n if (props.onChange) {\n props.onChange(team as Team);\n }\n // Skip actual navigation/updates in mock mode\n if (props.mockUser) return;\n if (!props.noUpdateSelectedTeam) {\n await user?.setSelectedTeam(team as Team);\n }\n if (props.urlMap) {\n navigate(props.urlMap(team as Team));\n }\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;AAwCA,SAAgB,qBAAwD,OAA6C;AACnH,QAAO,2CAACA;EAAS,UAAU,2CAAC,aAAW;YACrC,2CAAC,SAAM,GAAI,QAAS;GACX;;AAGb,SAAS,WAAW;AAClB,QAAO,2CAACC,yBAAS,WAAU,oCAAoC;;AAGjE,SAAS,MAAiC,OAA6C;CACrF,MAAM,4CAA2B;CACjC,MAAM,yCAAwB;CAG9B,MAAM,MAAM,MAAM,WAAW;EAC3B,kBAAkB,MAAM,eAAe,EAAE,QAAQ,EAAE,2BAA2B,OAAO,EAAE;EACvF,yBAAyB;EACzB,MAAM,EAAE,iBAAiB,qBAAqB;EAC/C,GAAG;CAEJ,MAAM,OAAO,MAAM,WAAW;EAC5B,cAAc,MAAM,SAAS;EAC7B,gBAAgB,MAAM,aAAa,EAAE;EACrC,iBAAiB,YAAY;EAC9B,GAAG;CAEJ,MAAM,WAAW,IAAI,aAAa;AAElC,4BAAgB;AACd,MAAI,CAAC,MAAM,wBAAwB,MAAM,gBAAgB,CAAC,MAAM,SAC9D,sEAA2B,MAAM,gBAAgB,MAAM,aAAa,CAAC;IAEtE;EAAC,MAAM;EAAsB,MAAM;EAAc,MAAM;EAAS,CAAC;AAEpE,QACE,2CAACC;EACC,MAAM,MAAM;EACZ,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,kBAAkB,MAAM;EACxB,UAAU,OAAO,SAAS;AACxB,OAAI,MAAM,SACR,OAAM,SAAS,KAAa;AAG9B,OAAI,MAAM,SAAU;AACpB,OAAI,CAAC,MAAM,qBACT,OAAM,MAAM,gBAAgB,KAAa;AAE3C,OAAI,MAAM,OACR,UAAS,MAAM,OAAO,KAAa,CAAC;;GAGxC"}
1
+ {"version":3,"file":"selected-team-switcher.js","names":["Suspense","Skeleton","TeamSwitcher"],"sources":["../../src/components/selected-team-switcher.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//===========================================\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport {\n Skeleton,\n} from \"@hexclave/ui\";\nimport { Suspense, useEffect } from \"react\";\nimport { Team, useStackApp, useUser } from \"..\";\nimport { TeamSwitcher } from \"./team-switcher\";\n\ntype MockTeam = {\n id: string,\n displayName: string,\n profileImageUrl?: string | null,\n};\n\ntype SelectedTeamSwitcherProps<AllowNull extends boolean = false> = {\n urlMap?: (team: AllowNull extends true ? Team | null : Team) => string,\n selectedTeam?: Team,\n noUpdateSelectedTeam?: boolean,\n allowNull?: AllowNull,\n nullLabel?: string,\n onChange?: (team: AllowNull extends true ? Team | null : Team) => void,\n triggerClassName?: string,\n // Mock data props\n mockUser?: {\n selectedTeam?: MockTeam,\n },\n mockTeams?: MockTeam[],\n mockProject?: {\n config: {\n clientTeamCreationEnabled: boolean,\n },\n },\n};\n\nexport function SelectedTeamSwitcher<AllowNull extends boolean = false>(props: SelectedTeamSwitcherProps<AllowNull>) {\n return <Suspense fallback={<Fallback />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback() {\n return <Skeleton className=\"h-9 w-full max-w-64 stack-scope\" />;\n}\n\nfunction Inner<AllowNull extends boolean>(props: SelectedTeamSwitcherProps<AllowNull>) {\n const appFromHook = useStackApp();\n const userFromHook = useUser();\n\n // Use mock data if provided, otherwise use real data\n const app = props.mockUser ? {\n useProject: () => props.mockProject || { config: { clientTeamCreationEnabled: false } },\n useNavigate: () => () => {}, // Mock navigate function\n urls: { accountSettings: '/account-settings' },\n } : appFromHook;\n\n const user = props.mockUser ? {\n selectedTeam: props.mockUser.selectedTeam,\n useTeams: () => props.mockTeams || [],\n setSelectedTeam: async () => {}, // Mock function\n } : userFromHook;\n\n const navigate = app.useNavigate();\n\n useEffect(() => {\n if (!props.noUpdateSelectedTeam && props.selectedTeam && !props.mockUser) {\n runAsynchronouslyWithAlert(user?.setSelectedTeam(props.selectedTeam));\n }\n }, [props.noUpdateSelectedTeam, props.selectedTeam, props.mockUser]);\n\n return (\n <TeamSwitcher\n team={props.selectedTeam}\n allowNull={props.allowNull}\n nullLabel={props.nullLabel}\n triggerClassName={props.triggerClassName}\n onChange={async (team) => {\n if (props.onChange) {\n props.onChange(team as Team);\n }\n // Skip actual navigation/updates in mock mode\n if (props.mockUser) return;\n if (!props.noUpdateSelectedTeam) {\n await user?.setSelectedTeam(team as Team);\n }\n if (props.urlMap) {\n navigate(props.urlMap(team as Team));\n }\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;AAwCA,SAAgB,qBAAwD,OAA6C;AACnH,QAAO,2CAACA;EAAS,UAAU,2CAAC,aAAW;YACrC,2CAAC,SAAM,GAAI,QAAS;GACX;;AAGb,SAAS,WAAW;AAClB,QAAO,2CAACC,yBAAS,WAAU,oCAAoC;;AAGjE,SAAS,MAAiC,OAA6C;CACrF,MAAM,4CAA2B;CACjC,MAAM,yCAAwB;CAG9B,MAAM,MAAM,MAAM,WAAW;EAC3B,kBAAkB,MAAM,eAAe,EAAE,QAAQ,EAAE,2BAA2B,OAAO,EAAE;EACvF,yBAAyB;EACzB,MAAM,EAAE,iBAAiB,qBAAqB;EAC/C,GAAG;CAEJ,MAAM,OAAO,MAAM,WAAW;EAC5B,cAAc,MAAM,SAAS;EAC7B,gBAAgB,MAAM,aAAa,EAAE;EACrC,iBAAiB,YAAY;EAC9B,GAAG;CAEJ,MAAM,WAAW,IAAI,aAAa;AAElC,4BAAgB;AACd,MAAI,CAAC,MAAM,wBAAwB,MAAM,gBAAgB,CAAC,MAAM,SAC9D,sEAA2B,MAAM,gBAAgB,MAAM,aAAa,CAAC;IAEtE;EAAC,MAAM;EAAsB,MAAM;EAAc,MAAM;EAAS,CAAC;AAEpE,QACE,2CAACC;EACC,MAAM,MAAM;EACZ,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,kBAAkB,MAAM;EACxB,UAAU,OAAO,SAAS;AACxB,OAAI,MAAM,SACR,OAAM,SAAS,KAAa;AAG9B,OAAI,MAAM,SAAU;AACpB,OAAI,CAAC,MAAM,qBACT,OAAM,MAAM,gBAAgB,KAAa;AAE3C,OAAI,MAAM,OACR,UAAS,MAAM,OAAO,KAAa,CAAC;;GAGxC"}
@@ -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/team-icon.d.ts
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../chunk-BE-pF4vm.js');
3
3
  let _hexclave_ui = require("@hexclave/ui");
4
- let lucide_react = require("lucide-react");
5
4
  let react_jsx_runtime = require("react/jsx-runtime");
5
+ let lucide_react = require("lucide-react");
6
6
 
7
7
  //#region src/components/team-icon.tsx
8
8
  function TeamIcon(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"team-icon.js","names":["User2","Avatar","AvatarImage","Typography"],"sources":["../../src/components/team-icon.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 { Avatar, AvatarImage, Typography } from \"@hexclave/ui\";\nimport { User2 } from \"lucide-react\";\nimport { Team } from \"..\";\n\nexport function TeamIcon(props: { team: Team | 'personal' }) {\n if (props.team === 'personal') {\n return (\n <div className=\"flex items-center justify-center min-w-6 min-h-6 max-w-6 max-h-6 rounded bg-zinc-200\">\n <User2 className=\"w-4 h-4\" />\n </div>\n );\n }\n if (props.team.profileImageUrl) {\n return (\n <Avatar className=\"min-w-6 min-h-6 max-w-6 max-h-6 rounded\">\n <AvatarImage src={props.team.profileImageUrl} alt={props.team.displayName} />\n </Avatar>\n );\n } else {\n return (\n <div className=\"flex items-center justify-center min-w-6 min-h-6 max-w-6 max-h-6 rounded bg-zinc-200\">\n <Typography className=\"text-zinc-800 dark:text-zinc-800\">{props.team.displayName.slice(0, 1).toUpperCase()}</Typography>\n </div>\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,SAAS,OAAoC;AAC3D,KAAI,MAAM,SAAS,WACjB,QACE,2CAAC;EAAI,WAAU;YACb,2CAACA,sBAAM,WAAU,YAAY;GACzB;AAGV,KAAI,MAAM,KAAK,gBACb,QACE,2CAACC;EAAO,WAAU;YAChB,2CAACC;GAAY,KAAK,MAAM,KAAK;GAAiB,KAAK,MAAM,KAAK;IAAe;GACtE;KAGX,QACE,2CAAC;EAAI,WAAU;YACb,2CAACC;GAAW,WAAU;aAAoC,MAAM,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC,aAAa;IAAc;GACpH"}
1
+ {"version":3,"file":"team-icon.js","names":["User2","Avatar","AvatarImage","Typography"],"sources":["../../src/components/team-icon.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 { Avatar, AvatarImage, Typography } from \"@hexclave/ui\";\nimport { User2 } from \"lucide-react\";\nimport { Team } from \"..\";\n\nexport function TeamIcon(props: { team: Team | 'personal' }) {\n if (props.team === 'personal') {\n return (\n <div className=\"flex items-center justify-center min-w-6 min-h-6 max-w-6 max-h-6 rounded bg-zinc-200\">\n <User2 className=\"w-4 h-4\" />\n </div>\n );\n }\n if (props.team.profileImageUrl) {\n return (\n <Avatar className=\"min-w-6 min-h-6 max-w-6 max-h-6 rounded\">\n <AvatarImage src={props.team.profileImageUrl} alt={props.team.displayName} />\n </Avatar>\n );\n } else {\n return (\n <div className=\"flex items-center justify-center min-w-6 min-h-6 max-w-6 max-h-6 rounded bg-zinc-200\">\n <Typography className=\"text-zinc-800 dark:text-zinc-800\">{props.team.displayName.slice(0, 1).toUpperCase()}</Typography>\n </div>\n );\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,SAAS,OAAoC;AAC3D,KAAI,MAAM,SAAS,WACjB,QACE,2CAAC;EAAI,WAAU;YACb,2CAACA,sBAAM,WAAU,YAAY;GACzB;AAGV,KAAI,MAAM,KAAK,gBACb,QACE,2CAACC;EAAO,WAAU;YAChB,2CAACC;GAAY,KAAK,MAAM,KAAK;GAAiB,KAAK,MAAM,KAAK;IAAe;GACtE;KAGX,QACE,2CAAC;EAAI,WAAU;YACb,2CAACC;GAAW,WAAU;aAAoC,MAAM,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC,aAAa;IAAc;GACpH"}
@@ -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/team-switcher.d.ts
@@ -2,14 +2,14 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
  const require_chunk = require('../chunk-BE-pF4vm.js');
5
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
5
6
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
6
7
  let _hexclave_ui = require("@hexclave/ui");
7
- let lucide_react = require("lucide-react");
8
8
  let react = require("react");
9
9
  let ___index_js = require("../index.js");
10
10
  let ___lib_translations_js = require("../lib/translations.js");
11
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
- let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
12
+ let lucide_react = require("lucide-react");
13
13
  let __team_icon_js = require("./team-icon.js");
14
14
 
15
15
  //#region src/components/team-switcher.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"team-switcher.js","names":["Suspense","Skeleton","Select","HexclaveAssertionError","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectLabel","Button","Settings","SelectItem","TeamIcon","Typography","SelectSeparator","PlusCircle"],"sources":["../../src/components/team-switcher.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//===========================================\nimport { HexclaveAssertionError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport {\n Button,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Typography,\n cn,\n} from \"@hexclave/ui\";\nimport { PlusCircle, Settings } from \"lucide-react\";\nimport { Suspense, useMemo } from \"react\";\nimport { Team, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { TeamIcon } from \"./team-icon\";\n\ntype MockTeam = {\n id: string,\n displayName: string,\n profileImageUrl?: string | null,\n};\n\ntype TeamSwitcherProps<AllowNull extends boolean = false> = {\n team?: Team,\n teamId?: string,\n teams?: Team[],\n allowNull?: AllowNull,\n nullLabel?: string,\n triggerClassName?: string,\n onChange?: (team: AllowNull extends true ? Team | null : Team) => Promise<void>,\n // Mock data props\n mockUser?: {\n team?: MockTeam,\n },\n mockTeams?: MockTeam[],\n mockProject?: {\n config: {\n clientTeamCreationEnabled: boolean,\n },\n },\n};\n\nexport function TeamSwitcher<AllowNull extends boolean = false>(props: TeamSwitcherProps<AllowNull>) {\n return <Suspense fallback={<Fallback />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback() {\n return <Skeleton className=\"h-9 w-full max-w-64 stack-scope\" />;\n}\n\nfunction Inner<AllowNull extends boolean>(props: TeamSwitcherProps<AllowNull>) {\n const { t } = useTranslation();\n const appFromHook = useStackApp();\n const userFromHook = useUser();\n\n // Use mock data if provided, otherwise use real data\n const app = props.mockUser ? {\n useProject: () => props.mockProject || { config: { clientTeamCreationEnabled: false } },\n useNavigate: () => () => {}, // Mock navigate function\n urls: { accountSettings: '/account-settings' },\n } : appFromHook;\n\n const user = props.mockUser ? {\n selectedTeam: props.mockUser.team,\n useTeams: () => props.mockTeams || [],\n setSelectedTeam: async () => {}, // Mock function\n } : userFromHook;\n\n const navigate = app.useNavigate();\n const project = app.useProject();\n const rawTeams = props.teams ?? user?.useTeams();\n const selectedTeam = props.team || rawTeams?.find(team => team.id === props.teamId);\n const teams = useMemo(() => rawTeams?.sort((a, b) => b.id === selectedTeam?.id ? 1 : -1), [rawTeams, selectedTeam]);\n\n\n return (\n <Select\n value={selectedTeam?.id || (props.allowNull ? 'null-sentinel' : undefined)}\n onValueChange={(value) => {\n runAsynchronouslyWithAlert(async () => {\n let team: MockTeam | null = null;\n if (value !== 'null-sentinel') {\n team = teams?.find(team => team.id === value) || null;\n if (!team) {\n throw new HexclaveAssertionError('Team not found, this should not happen');\n }\n } else {\n team = null;\n }\n\n // Call onChange callback if provided\n if (props.onChange) {\n await props.onChange(team as Team);\n }\n });\n }}\n >\n <SelectTrigger className={cn(\"stack-scope max-w-64\", props.triggerClassName)}>\n <SelectValue placeholder=\"Select team\"/>\n </SelectTrigger>\n <SelectContent className=\"stack-scope\">\n {selectedTeam ? <SelectGroup>\n <SelectLabel>\n <div className=\"flex items-center justify-between\">\n <span>\n {t('Current team')}\n </span>\n <Button\n variant='ghost'\n size='icon'\n className=\"h-6 w-6\"\n onClick={() => {\n if (!props.mockUser) {\n navigate(`${app.urls.accountSettings}#team-${selectedTeam.id}`);\n }\n }}\n >\n <Settings className=\"h-4 w-4\"/>\n </Button>\n </div>\n </SelectLabel>\n <SelectItem value={selectedTeam.id}>\n <div className=\"flex items-center gap-2\">\n <TeamIcon team={selectedTeam as Team} />\n <Typography className=\"max-w-40 truncate\">{selectedTeam.displayName}</Typography>\n </div>\n </SelectItem>\n </SelectGroup> : undefined}\n\n {props.allowNull && <SelectGroup>\n <SelectItem value=\"null-sentinel\">\n <div className=\"flex items-center gap-2\">\n <TeamIcon team='personal' />\n <Typography className=\"max-w-40 truncate\">{props.nullLabel || t('No team')}</Typography>\n </div>\n </SelectItem>\n </SelectGroup>}\n\n {teams?.length ?\n <SelectGroup>\n <SelectLabel>{t('Other teams')}</SelectLabel>\n {teams.filter(team => team.id !== selectedTeam?.id)\n .map(team => (\n <SelectItem value={team.id} key={team.id}>\n <div className=\"flex items-center gap-2\">\n <TeamIcon team={team as Team} />\n <Typography className=\"max-w-64 truncate\">{team.displayName}</Typography>\n </div>\n </SelectItem>\n ))}\n </SelectGroup> : null}\n\n {!teams?.length && !props.allowNull ?\n <SelectGroup>\n <SelectLabel>{t('No teams yet')}</SelectLabel>\n </SelectGroup> : null}\n\n {project.config.clientTeamCreationEnabled && <>\n <SelectSeparator/>\n <div>\n <Button\n onClick={() => {\n if (!props.mockUser) {\n navigate(`${app.urls.accountSettings}#team-creation`);\n }\n }}\n className=\"w-full\"\n variant='ghost'\n >\n <PlusCircle className=\"mr-2 h-4 w-4\"/> {t('Create a team')}\n </Button>\n </div>\n </>}\n </SelectContent>\n </Select>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"team-switcher.js","names":["Suspense","Skeleton","Select","HexclaveAssertionError","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectLabel","Button","Settings","SelectItem","TeamIcon","Typography","SelectSeparator","PlusCircle"],"sources":["../../src/components/team-switcher.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//===========================================\nimport { HexclaveAssertionError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport {\n Button,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Typography,\n cn,\n} from \"@hexclave/ui\";\nimport { PlusCircle, Settings } from \"lucide-react\";\nimport { Suspense, useMemo } from \"react\";\nimport { Team, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { TeamIcon } from \"./team-icon\";\n\ntype MockTeam = {\n id: string,\n displayName: string,\n profileImageUrl?: string | null,\n};\n\ntype TeamSwitcherProps<AllowNull extends boolean = false> = {\n team?: Team,\n teamId?: string,\n teams?: Team[],\n allowNull?: AllowNull,\n nullLabel?: string,\n triggerClassName?: string,\n onChange?: (team: AllowNull extends true ? Team | null : Team) => Promise<void>,\n // Mock data props\n mockUser?: {\n team?: MockTeam,\n },\n mockTeams?: MockTeam[],\n mockProject?: {\n config: {\n clientTeamCreationEnabled: boolean,\n },\n },\n};\n\nexport function TeamSwitcher<AllowNull extends boolean = false>(props: TeamSwitcherProps<AllowNull>) {\n return <Suspense fallback={<Fallback />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback() {\n return <Skeleton className=\"h-9 w-full max-w-64 stack-scope\" />;\n}\n\nfunction Inner<AllowNull extends boolean>(props: TeamSwitcherProps<AllowNull>) {\n const { t } = useTranslation();\n const appFromHook = useStackApp();\n const userFromHook = useUser();\n\n // Use mock data if provided, otherwise use real data\n const app = props.mockUser ? {\n useProject: () => props.mockProject || { config: { clientTeamCreationEnabled: false } },\n useNavigate: () => () => {}, // Mock navigate function\n urls: { accountSettings: '/account-settings' },\n } : appFromHook;\n\n const user = props.mockUser ? {\n selectedTeam: props.mockUser.team,\n useTeams: () => props.mockTeams || [],\n setSelectedTeam: async () => {}, // Mock function\n } : userFromHook;\n\n const navigate = app.useNavigate();\n const project = app.useProject();\n const rawTeams = props.teams ?? user?.useTeams();\n const selectedTeam = props.team || rawTeams?.find(team => team.id === props.teamId);\n const teams = useMemo(() => rawTeams?.sort((a, b) => b.id === selectedTeam?.id ? 1 : -1), [rawTeams, selectedTeam]);\n\n\n return (\n <Select\n value={selectedTeam?.id || (props.allowNull ? 'null-sentinel' : undefined)}\n onValueChange={(value) => {\n runAsynchronouslyWithAlert(async () => {\n let team: MockTeam | null = null;\n if (value !== 'null-sentinel') {\n team = teams?.find(team => team.id === value) || null;\n if (!team) {\n throw new HexclaveAssertionError('Team not found, this should not happen');\n }\n } else {\n team = null;\n }\n\n // Call onChange callback if provided\n if (props.onChange) {\n await props.onChange(team as Team);\n }\n });\n }}\n >\n <SelectTrigger className={cn(\"stack-scope max-w-64\", props.triggerClassName)}>\n <SelectValue placeholder=\"Select team\"/>\n </SelectTrigger>\n <SelectContent className=\"stack-scope\">\n {selectedTeam ? <SelectGroup>\n <SelectLabel>\n <div className=\"flex items-center justify-between\">\n <span>\n {t('Current team')}\n </span>\n <Button\n variant='ghost'\n size='icon'\n className=\"h-6 w-6\"\n onClick={() => {\n if (!props.mockUser) {\n navigate(`${app.urls.accountSettings}#team-${selectedTeam.id}`);\n }\n }}\n >\n <Settings className=\"h-4 w-4\"/>\n </Button>\n </div>\n </SelectLabel>\n <SelectItem value={selectedTeam.id}>\n <div className=\"flex items-center gap-2\">\n <TeamIcon team={selectedTeam as Team} />\n <Typography className=\"max-w-40 truncate\">{selectedTeam.displayName}</Typography>\n </div>\n </SelectItem>\n </SelectGroup> : undefined}\n\n {props.allowNull && <SelectGroup>\n <SelectItem value=\"null-sentinel\">\n <div className=\"flex items-center gap-2\">\n <TeamIcon team='personal' />\n <Typography className=\"max-w-40 truncate\">{props.nullLabel || t('No team')}</Typography>\n </div>\n </SelectItem>\n </SelectGroup>}\n\n {teams?.length ?\n <SelectGroup>\n <SelectLabel>{t('Other teams')}</SelectLabel>\n {teams.filter(team => team.id !== selectedTeam?.id)\n .map(team => (\n <SelectItem value={team.id} key={team.id}>\n <div className=\"flex items-center gap-2\">\n <TeamIcon team={team as Team} />\n <Typography className=\"max-w-64 truncate\">{team.displayName}</Typography>\n </div>\n </SelectItem>\n ))}\n </SelectGroup> : null}\n\n {!teams?.length && !props.allowNull ?\n <SelectGroup>\n <SelectLabel>{t('No teams yet')}</SelectLabel>\n </SelectGroup> : null}\n\n {project.config.clientTeamCreationEnabled && <>\n <SelectSeparator/>\n <div>\n <Button\n onClick={() => {\n if (!props.mockUser) {\n navigate(`${app.urls.accountSettings}#team-creation`);\n }\n }}\n className=\"w-full\"\n variant='ghost'\n >\n <PlusCircle className=\"mr-2 h-4 w-4\"/> {t('Create a team')}\n </Button>\n </div>\n </>}\n </SelectContent>\n </Select>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-in-iframe.js","names":[],"sources":["../../src/components/use-in-iframe.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//===========================================\nimport { useEffect, useState } from \"react\";\n\nexport function useInIframe() {\n const [isIframe, setIsIframe] = useState(false);\n useEffect(() => {\n if (window.self !== window.top) {\n setIsIframe(true);\n }\n }, []);\n\n return isIframe;\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,cAAc;CAC5B,MAAM,CAAC,UAAU,mCAAwB,MAAM;AAC/C,4BAAgB;AACd,MAAI,OAAO,SAAS,OAAO,IACzB,aAAY,KAAK;IAElB,EAAE,CAAC;AAEN,QAAO"}
1
+ {"version":3,"file":"use-in-iframe.js","names":[],"sources":["../../src/components/use-in-iframe.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//===========================================\nimport { useEffect, useState } from \"react\";\n\nexport function useInIframe() {\n const [isIframe, setIsIframe] = useState(false);\n useEffect(() => {\n if (window.self !== window.top) {\n setIsIframe(true);\n }\n }, []);\n\n return isIframe;\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,cAAc;CAC5B,MAAM,CAAC,UAAU,mCAAwB,MAAM;AAC/C,4BAAgB;AACd,MAAI,OAAO,SAAS,OAAO,IACzB,aAAY,KAAK;IAElB,EAAE,CAAC;AAEN,QAAO"}
@@ -4,12 +4,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
  const require_chunk = require('../chunk-BE-pF4vm.js');
5
5
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
6
6
  let _hexclave_ui = require("@hexclave/ui");
7
- let lucide_react = require("lucide-react");
8
7
  let react = require("react");
9
8
  react = require_chunk.__toESM(react);
10
9
  let ___index_js = require("../index.js");
11
10
  let ___lib_translations_js = require("../lib/translations.js");
12
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
+ let lucide_react = require("lucide-react");
13
13
  let __elements_user_avatar_js = require("./elements/user-avatar.js");
14
14
 
15
15
  //#region src/components/user-button.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from \"@hexclave/ui\";\nimport { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from \"lucide-react\";\nimport React, { Suspense } from \"react\";\nimport { CurrentUser, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { UserAvatar } from \"./elements/user-avatar\";\n\nfunction Item(props: { text: string, icon: React.ReactNode, onClick: () => void | Promise<void> }) {\n return (\n <DropdownMenuItem onClick={() => runAsynchronouslyWithAlert(props.onClick)}>\n <div className=\"flex gap-2 items-center\">\n {props.icon}\n <Typography>{props.text}</Typography>\n </div>\n </DropdownMenuItem>\n );\n}\n\ntype UserButtonProps = {\n showUserInfo?: boolean,\n colorModeToggle?: () => void | Promise<void>,\n extraItems?: {\n text: string,\n icon: React.ReactNode,\n onClick: () => void | Promise<void>,\n }[],\n mockUser?: {\n displayName?: string,\n primaryEmail?: string,\n profileImageUrl?: string,\n },\n};\n\nexport function UserButton(props: UserButtonProps) {\n return (\n <Suspense fallback={<Skeleton className=\"h-[34px] w-[34px] rounded-full stack-scope\" />}>\n <UserButtonInner {...props} />\n </Suspense>\n );\n}\n\nfunction UserButtonInner(props: UserButtonProps) {\n const userFromHook = useUser();\n\n // Use mock user if provided, otherwise use real user\n const user = props.mockUser ? {\n displayName: props.mockUser.displayName || 'Mock User',\n primaryEmail: props.mockUser.primaryEmail || 'mock@example.com',\n profileImageUrl: props.mockUser.profileImageUrl,\n signOut: () => {\n console.log('Mock sign out - no action taken in demo mode');\n return Promise.resolve();\n }\n } as CurrentUser : userFromHook;\n\n return <UserButtonInnerInner {...props} user={user} />;\n}\n\n\nfunction UserButtonInnerInner(props: UserButtonProps & { user: CurrentUser | null }) {\n const { t } = useTranslation();\n const user = props.user;\n const app = useStackApp();\n\n const iconProps = { size: 20, className: 'h-4 w-4' };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5\">\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n {user && props.showUserInfo &&\n <div className=\"flex flex-col justify-center text-left min-w-0\">\n <div className=\"max-w-40 truncate text-sm font-medium\">{user.displayName}</div>\n <div className=\"max-w-40 truncate text-xs text-muted-foreground\">{user.primaryEmail}</div>\n </div>\n }\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"stack-scope\">\n <DropdownMenuLabel>\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n <div>\n {user && <Typography className=\"max-w-40 truncate\">{user.displayName}</Typography>}\n {user && <Typography className=\"max-w-40 truncate\" variant=\"secondary\" type='label'>{user.primaryEmail}</Typography>}\n {!user && <Typography>{t('Not signed in')}</Typography>}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {user && <Item\n text={t('Account settings')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock account settings - no navigation in demo mode');\n } else {\n await app.redirectToAccountSettings();\n }\n }}\n icon={<CircleUser {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign in')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign in - no navigation in demo mode');\n } else {\n await app.redirectToSignIn();\n }\n }}\n icon={<LogIn {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign up')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign up - no navigation in demo mode');\n } else {\n await app.redirectToSignUp();\n }\n }}\n icon={<UserPlus {...iconProps}/> }\n />}\n {user && props.extraItems && props.extraItems.map((item, index) => (\n <Item key={index} {...item} />\n ))}\n {props.colorModeToggle && (\n <Item\n text={t('Toggle theme')}\n onClick={props.colorModeToggle}\n icon={<SunMoon {...iconProps} />}\n />\n )}\n {user && <Item\n text={t('Sign out')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign out - no action taken in demo mode');\n } else {\n await user.signOut();\n }\n }}\n icon={<LogOut {...iconProps} />}\n />}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,KAAK,OAAqF;AACjG,QACE,2CAACA;EAAiB,oFAA0C,MAAM,QAAQ;YACxE,4CAAC;GAAI,WAAU;cACZ,MAAM,MACP,2CAACC,qCAAY,MAAM,OAAkB;IACjC;GACW;;AAmBvB,SAAgB,WAAW,OAAwB;AACjD,QACE,2CAACC;EAAS,UAAU,2CAACC,yBAAS,WAAU,+CAA+C;YACrF,2CAAC,mBAAgB,GAAI,QAAS;GACrB;;AAIf,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,yCAAwB;CAG9B,MAAM,OAAO,MAAM,WAAW;EAC5B,aAAa,MAAM,SAAS,eAAe;EAC3C,cAAc,MAAM,SAAS,gBAAgB;EAC7C,iBAAiB,MAAM,SAAS;EAChC,eAAe;AACb,WAAQ,IAAI,+CAA+C;AAC3D,UAAO,QAAQ,SAAS;;EAE3B,GAAkB;AAEnB,QAAO,2CAAC;EAAqB,GAAI;EAAa;GAAQ;;AAIxD,SAAS,qBAAqB,OAAuD;CACnF,MAAM,EAAE,kDAAsB;CAC9B,MAAM,OAAO,MAAM;CACnB,MAAM,oCAAmB;CAEzB,MAAM,YAAY;EAAE,MAAM;EAAI,WAAW;EAAW;AAEpD,QACE,4CAACC,wCACC,2CAACC;EAAoB,WAAU;YAC7B,4CAAC;GAAI,WAAU;cACb,2CAACC,wCAAiB,OAAQ,EACzB,QAAQ,MAAM,gBACb,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eAAyC,KAAK;MAAkB,EAC/E,2CAAC;KAAI,WAAU;eAAmD,KAAK;MAAmB;KACtF;IAEJ;GACc,EACtB,4CAACC;EAAoB,WAAU;;GAC7B,2CAACC,4CACC,4CAAC;IAAI,WAAU;eACb,2CAACF,wCAAiB,OAAQ,EAC1B,4CAAC;KACE,QAAQ,2CAACL;MAAW,WAAU;gBAAqB,KAAK;OAAyB;KACjF,QAAQ,2CAACA;MAAW,WAAU;MAAoB,SAAQ;MAAY,MAAK;gBAAS,KAAK;OAA0B;KACnH,CAAC,QAAQ,2CAACA,qCAAY,EAAE,gBAAgB,GAAc;QACnD;KACF,GACY;GACpB,2CAACQ,uCAAwB;GACxB,QAAQ,2CAAC;IACR,MAAM,EAAE,mBAAmB;IAC3B,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,qDAAqD;SAEjE,OAAM,IAAI,2BAA2B;;IAGzC,MAAM,2CAACC,2BAAW,GAAI,YAAa;KACnC;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,sBAAM,GAAI,YAAa;KAC9B;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,yBAAS,GAAI,YAAY;KAChC;GACD,QAAQ,MAAM,cAAc,MAAM,WAAW,KAAK,MAAM,UACvD,2CAAC,QAAiB,GAAI,QAAX,MAAmB,CAC9B;GACD,MAAM,mBACL,2CAAC;IACC,MAAM,EAAE,eAAe;IACvB,SAAS,MAAM;IACf,MAAM,2CAACC,wBAAQ,GAAI,YAAa;KAChC;GAEH,QAAQ,2CAAC;IACR,MAAM,EAAE,WAAW;IACnB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,+CAA+C;SAE3D,OAAM,KAAK,SAAS;;IAGxB,MAAM,2CAACC,uBAAO,GAAI,YAAa;KAC/B;;GACkB,IACT"}
1
+ {"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from \"@hexclave/ui\";\nimport { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from \"lucide-react\";\nimport React, { Suspense } from \"react\";\nimport { CurrentUser, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { UserAvatar } from \"./elements/user-avatar\";\n\nfunction Item(props: { text: string, icon: React.ReactNode, onClick: () => void | Promise<void> }) {\n return (\n <DropdownMenuItem onClick={() => runAsynchronouslyWithAlert(props.onClick)}>\n <div className=\"flex gap-2 items-center\">\n {props.icon}\n <Typography>{props.text}</Typography>\n </div>\n </DropdownMenuItem>\n );\n}\n\ntype UserButtonProps = {\n showUserInfo?: boolean,\n colorModeToggle?: () => void | Promise<void>,\n extraItems?: {\n text: string,\n icon: React.ReactNode,\n onClick: () => void | Promise<void>,\n }[],\n mockUser?: {\n displayName?: string,\n primaryEmail?: string,\n profileImageUrl?: string,\n },\n};\n\nexport function UserButton(props: UserButtonProps) {\n return (\n <Suspense fallback={<Skeleton className=\"h-[34px] w-[34px] rounded-full stack-scope\" />}>\n <UserButtonInner {...props} />\n </Suspense>\n );\n}\n\nfunction UserButtonInner(props: UserButtonProps) {\n const userFromHook = useUser();\n\n // Use mock user if provided, otherwise use real user\n const user = props.mockUser ? {\n displayName: props.mockUser.displayName || 'Mock User',\n primaryEmail: props.mockUser.primaryEmail || 'mock@example.com',\n profileImageUrl: props.mockUser.profileImageUrl,\n signOut: () => {\n console.log('Mock sign out - no action taken in demo mode');\n return Promise.resolve();\n }\n } as CurrentUser : userFromHook;\n\n return <UserButtonInnerInner {...props} user={user} />;\n}\n\n\nfunction UserButtonInnerInner(props: UserButtonProps & { user: CurrentUser | null }) {\n const { t } = useTranslation();\n const user = props.user;\n const app = useStackApp();\n\n const iconProps = { size: 20, className: 'h-4 w-4' };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5\">\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n {user && props.showUserInfo &&\n <div className=\"flex flex-col justify-center text-left min-w-0\">\n <div className=\"max-w-40 truncate text-sm font-medium\">{user.displayName}</div>\n <div className=\"max-w-40 truncate text-xs text-muted-foreground\">{user.primaryEmail}</div>\n </div>\n }\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"stack-scope\">\n <DropdownMenuLabel>\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n <div>\n {user && <Typography className=\"max-w-40 truncate\">{user.displayName}</Typography>}\n {user && <Typography className=\"max-w-40 truncate\" variant=\"secondary\" type='label'>{user.primaryEmail}</Typography>}\n {!user && <Typography>{t('Not signed in')}</Typography>}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {user && <Item\n text={t('Account settings')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock account settings - no navigation in demo mode');\n } else {\n await app.redirectToAccountSettings();\n }\n }}\n icon={<CircleUser {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign in')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign in - no navigation in demo mode');\n } else {\n await app.redirectToSignIn();\n }\n }}\n icon={<LogIn {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign up')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign up - no navigation in demo mode');\n } else {\n await app.redirectToSignUp();\n }\n }}\n icon={<UserPlus {...iconProps}/> }\n />}\n {user && props.extraItems && props.extraItems.map((item, index) => (\n <Item key={index} {...item} />\n ))}\n {props.colorModeToggle && (\n <Item\n text={t('Toggle theme')}\n onClick={props.colorModeToggle}\n icon={<SunMoon {...iconProps} />}\n />\n )}\n {user && <Item\n text={t('Sign out')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign out - no action taken in demo mode');\n } else {\n await user.signOut();\n }\n }}\n icon={<LogOut {...iconProps} />}\n />}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,KAAK,OAAqF;AACjG,QACE,2CAACA;EAAiB,oFAA0C,MAAM,QAAQ;YACxE,4CAAC;GAAI,WAAU;cACZ,MAAM,MACP,2CAACC,qCAAY,MAAM,OAAkB;IACjC;GACW;;AAmBvB,SAAgB,WAAW,OAAwB;AACjD,QACE,2CAACC;EAAS,UAAU,2CAACC,yBAAS,WAAU,+CAA+C;YACrF,2CAAC,mBAAgB,GAAI,QAAS;GACrB;;AAIf,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,yCAAwB;CAG9B,MAAM,OAAO,MAAM,WAAW;EAC5B,aAAa,MAAM,SAAS,eAAe;EAC3C,cAAc,MAAM,SAAS,gBAAgB;EAC7C,iBAAiB,MAAM,SAAS;EAChC,eAAe;AACb,WAAQ,IAAI,+CAA+C;AAC3D,UAAO,QAAQ,SAAS;;EAE3B,GAAkB;AAEnB,QAAO,2CAAC;EAAqB,GAAI;EAAa;GAAQ;;AAIxD,SAAS,qBAAqB,OAAuD;CACnF,MAAM,EAAE,kDAAsB;CAC9B,MAAM,OAAO,MAAM;CACnB,MAAM,oCAAmB;CAEzB,MAAM,YAAY;EAAE,MAAM;EAAI,WAAW;EAAW;AAEpD,QACE,4CAACC,wCACC,2CAACC;EAAoB,WAAU;YAC7B,4CAAC;GAAI,WAAU;cACb,2CAACC,wCAAiB,OAAQ,EACzB,QAAQ,MAAM,gBACb,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eAAyC,KAAK;MAAkB,EAC/E,2CAAC;KAAI,WAAU;eAAmD,KAAK;MAAmB;KACtF;IAEJ;GACc,EACtB,4CAACC;EAAoB,WAAU;;GAC7B,2CAACC,4CACC,4CAAC;IAAI,WAAU;eACb,2CAACF,wCAAiB,OAAQ,EAC1B,4CAAC;KACE,QAAQ,2CAACL;MAAW,WAAU;gBAAqB,KAAK;OAAyB;KACjF,QAAQ,2CAACA;MAAW,WAAU;MAAoB,SAAQ;MAAY,MAAK;gBAAS,KAAK;OAA0B;KACnH,CAAC,QAAQ,2CAACA,qCAAY,EAAE,gBAAgB,GAAc;QACnD;KACF,GACY;GACpB,2CAACQ,uCAAwB;GACxB,QAAQ,2CAAC;IACR,MAAM,EAAE,mBAAmB;IAC3B,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,qDAAqD;SAEjE,OAAM,IAAI,2BAA2B;;IAGzC,MAAM,2CAACC,2BAAW,GAAI,YAAa;KACnC;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,sBAAM,GAAI,YAAa;KAC9B;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,yBAAS,GAAI,YAAY;KAChC;GACD,QAAQ,MAAM,cAAc,MAAM,WAAW,KAAK,MAAM,UACvD,2CAAC,QAAiB,GAAI,QAAX,MAAmB,CAC9B;GACD,MAAM,mBACL,2CAAC;IACC,MAAM,EAAE,eAAe;IACvB,SAAS,MAAM;IACf,MAAM,2CAACC,wBAAQ,GAAI,YAAa;KAChC;GAEH,QAAQ,2CAAC;IACR,MAAM,EAAE,WAAW;IACnB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,+CAA+C;SAE3D,OAAM,KAAK,SAAS;;IAGxB,MAAM,2CAACC,uBAAO,GAAI,YAAa;KAC/B;;GACkB,IACT"}
@@ -1,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 _hexclave_shared_dist_utils_dates = require("@hexclave/shared/dist/utils/dates");
9
9
  let _________lib_hooks_js = require("../../../lib/hooks.js");
10
10
  let _________lib_translations_js = require("../../../lib/translations.js");
@@ -1 +1 @@
1
- {"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { fromNow } from \"@hexclave/shared/dist/utils/dates\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/stack-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { fromNow } from \"@hexclave/shared/dist/utils/dates\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/hexclave-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { CreateApiKeyDialog, ShowApiKeyDialog } from \"../../../components/api-key-dialogs\";\nimport { ApiKeyTable } from \"../../../components/api-key-table\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ApiKey, ApiKeyCreationOptions } from \"../../../lib/stack-app/api-keys\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\n\nexport function ApiKeysPage(props?: {\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n // Check if we're in any kind of mock mode first\n const isInMockMode = !!(props?.mockApiKeys || props?.mockMode);\n\n const userFromHook = useUser({ or: isInMockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, we don't need a user - just show mock data\n if (isInMockMode && !userFromHook) {\n // This is expected in mock mode, continue with mock data\n }\n\n // Only return null if we're not in mock mode and don't have a user\n if (!isInMockMode && !userFromHook) {\n return null; // This shouldn't happen due to redirect, but just in case\n }\n\n // Use mock data if provided\n const mockApiKeysData = props?.mockApiKeys ? props.mockApiKeys.map(mockKey => ({\n id: mockKey.id,\n description: mockKey.description,\n createdAt: new Date(mockKey.createdAt),\n expiresAt: mockKey.expiresAt ? new Date(mockKey.expiresAt) : undefined,\n manuallyRevokedAt: mockKey.manuallyRevokedAt ? new Date(mockKey.manuallyRevokedAt) : null,\n value: {\n lastFour: mockKey.id.slice(-4).padStart(4, '0'), // Use last 4 chars of ID or pad with zeros\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => {\n const now = new Date();\n const isExpired = mockKey.expiresAt ? new Date(mockKey.expiresAt) < now : false;\n const isRevoked = !!mockKey.manuallyRevokedAt;\n return !isExpired && !isRevoked;\n },\n whyInvalid: () => {\n const now = new Date();\n if (mockKey.manuallyRevokedAt) return 'manually-revoked';\n if (mockKey.expiresAt && new Date(mockKey.expiresAt) < now) return 'expired';\n return null;\n },\n })) : [\n {\n id: 'key-1',\n description: 'Development Key',\n createdAt: new Date(Date.now() - 172800000), // 2 days ago\n expiresAt: undefined,\n manuallyRevokedAt: null,\n value: {\n lastFour: 'ey-1'.slice(-4).padStart(4, '0'),\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n }\n ];\n\n // Determine which API keys to use\n let apiKeys: any[];\n if (isInMockMode) {\n apiKeys = mockApiKeysData;\n } else if (userFromHook) {\n apiKeys = userFromHook.useApiKeys();\n } else {\n apiKeys = [];\n }\n\n const [isNewApiKeyDialogOpen, setIsNewApiKeyDialogOpen] = useState(false);\n const [returnedApiKey, setReturnedApiKey] = useState<ApiKey<\"user\", true> | null>(null);\n\n const CreateDialog = CreateApiKeyDialog<\"user\">;\n const ShowDialog = ShowApiKeyDialog<\"user\">;\n\n const handleCreateApiKey = async (data: ApiKeyCreationOptions<\"user\">) => {\n if (isInMockMode) {\n // Mock API key creation\n const mockApiKey = {\n id: `key-${Date.now()}`,\n description: data.description,\n createdAt: new Date().toISOString(),\n expiresAt: data.expiresAt?.toISOString(),\n value: 'sk_dev_mock_key_' + Math.random().toString(36).substring(2),\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n type: 'user' as const,\n userId: 'mock-user-id',\n };\n return mockApiKey as any;\n }\n\n if (!userFromHook) throw new Error('User not available');\n return await userFromHook.createApiKey(data);\n };\n\n return (\n <PageLayout>\n <Button onClick={() => setIsNewApiKeyDialogOpen(true)}>\n {t(\"Create API Key\")}\n </Button>\n <ApiKeyTable apiKeys={apiKeys} />\n <CreateDialog\n open={isNewApiKeyDialogOpen}\n onOpenChange={setIsNewApiKeyDialogOpen}\n onKeyCreated={setReturnedApiKey}\n createApiKey={handleCreateApiKey}\n mockMode={isInMockMode}\n />\n <ShowDialog\n apiKey={returnedApiKey}\n onClose={() => setReturnedApiKey(null)}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,OASzB;CACD,MAAM,EAAE,wDAAsB;CAG9B,MAAM,eAAe,CAAC,EAAE,OAAO,eAAe,OAAO;CAErD,MAAM,kDAAuB,EAAE,IAAI,eAAe,gBAAgB,YAAY,CAAC;AAG/E,KAAI,gBAAgB,CAAC,cAAc;AAKnC,KAAI,CAAC,gBAAgB,CAAC,aACpB,QAAO;CAIT,MAAM,kBAAkB,OAAO,cAAc,MAAM,YAAY,KAAI,aAAY;EAC7E,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,WAAW,IAAI,KAAK,QAAQ,UAAU;EACtC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG;EAC7D,mBAAmB,QAAQ,oBAAoB,IAAI,KAAK,QAAQ,kBAAkB,GAAG;EACrF,OAAO,EACL,UAAU,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAChD;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;GACb,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG,MAAM;GAC1E,MAAM,YAAY,CAAC,CAAC,QAAQ;AAC5B,UAAO,CAAC,aAAa,CAAC;;EAExB,kBAAkB;GAChB,MAAM,sBAAM,IAAI,MAAM;AACtB,OAAI,QAAQ,kBAAmB,QAAO;AACtC,OAAI,QAAQ,aAAa,IAAI,KAAK,QAAQ,UAAU,GAAG,IAAK,QAAO;AACnE,UAAO;;EAEV,EAAE,GAAG,CACJ;EACE,IAAI;EACJ,aAAa;EACb,2BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU;EAC3C,WAAW;EACX,mBAAmB;EACnB,OAAO,EACL,UAAU,OAAO,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAC5C;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;EACf,kBAAkB;EACnB,CACF;CAGD,IAAI;AACJ,KAAI,aACF,WAAU;UACD,aACT,WAAU,aAAa,YAAY;KAEnC,WAAU,EAAE;CAGd,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CACzE,MAAM,CAAC,gBAAgB,yCAA2D,KAAK;CAEvF,MAAM,eAAeA;CACrB,MAAM,aAAaC;CAEnB,MAAM,qBAAqB,OAAO,SAAwC;AACxE,MAAI,aAmBF,QAjBmB;GACjB,IAAI,OAAO,KAAK,KAAK;GACrB,aAAa,KAAK;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,WAAW,KAAK,WAAW,aAAa;GACxC,OAAO,qBAAqB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE;GACnE,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,eAAe;GACf,kBAAkB;GAClB,MAAM;GACN,QAAQ;GACT;AAIH,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,qBAAqB;AACxD,SAAO,MAAM,aAAa,aAAa,KAAK;;AAG9C,QACE,4CAACC;EACC,2CAACC;GAAO,eAAe,yBAAyB,KAAK;aAClD,EAAE,iBAAiB;IACb;EACT,2CAACC,oDAAqB,UAAW;EACjC,2CAAC;GACC,MAAM;GACN,cAAc;GACd,cAAc;GACd,cAAc;GACd,UAAU;IACV;EACF,2CAAC;GACC,QAAQ;GACR,eAAe,kBAAkB,KAAK;IACtC;KACS"}
1
+ {"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { CreateApiKeyDialog, ShowApiKeyDialog } from \"../../../components/api-key-dialogs\";\nimport { ApiKeyTable } from \"../../../components/api-key-table\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ApiKey, ApiKeyCreationOptions } from \"../../../lib/hexclave-app/api-keys\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\n\nexport function ApiKeysPage(props?: {\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n // Check if we're in any kind of mock mode first\n const isInMockMode = !!(props?.mockApiKeys || props?.mockMode);\n\n const userFromHook = useUser({ or: isInMockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, we don't need a user - just show mock data\n if (isInMockMode && !userFromHook) {\n // This is expected in mock mode, continue with mock data\n }\n\n // Only return null if we're not in mock mode and don't have a user\n if (!isInMockMode && !userFromHook) {\n return null; // This shouldn't happen due to redirect, but just in case\n }\n\n // Use mock data if provided\n const mockApiKeysData = props?.mockApiKeys ? props.mockApiKeys.map(mockKey => ({\n id: mockKey.id,\n description: mockKey.description,\n createdAt: new Date(mockKey.createdAt),\n expiresAt: mockKey.expiresAt ? new Date(mockKey.expiresAt) : undefined,\n manuallyRevokedAt: mockKey.manuallyRevokedAt ? new Date(mockKey.manuallyRevokedAt) : null,\n value: {\n lastFour: mockKey.id.slice(-4).padStart(4, '0'), // Use last 4 chars of ID or pad with zeros\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => {\n const now = new Date();\n const isExpired = mockKey.expiresAt ? new Date(mockKey.expiresAt) < now : false;\n const isRevoked = !!mockKey.manuallyRevokedAt;\n return !isExpired && !isRevoked;\n },\n whyInvalid: () => {\n const now = new Date();\n if (mockKey.manuallyRevokedAt) return 'manually-revoked';\n if (mockKey.expiresAt && new Date(mockKey.expiresAt) < now) return 'expired';\n return null;\n },\n })) : [\n {\n id: 'key-1',\n description: 'Development Key',\n createdAt: new Date(Date.now() - 172800000), // 2 days ago\n expiresAt: undefined,\n manuallyRevokedAt: null,\n value: {\n lastFour: 'ey-1'.slice(-4).padStart(4, '0'),\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n }\n ];\n\n // Determine which API keys to use\n let apiKeys: any[];\n if (isInMockMode) {\n apiKeys = mockApiKeysData;\n } else if (userFromHook) {\n apiKeys = userFromHook.useApiKeys();\n } else {\n apiKeys = [];\n }\n\n const [isNewApiKeyDialogOpen, setIsNewApiKeyDialogOpen] = useState(false);\n const [returnedApiKey, setReturnedApiKey] = useState<ApiKey<\"user\", true> | null>(null);\n\n const CreateDialog = CreateApiKeyDialog<\"user\">;\n const ShowDialog = ShowApiKeyDialog<\"user\">;\n\n const handleCreateApiKey = async (data: ApiKeyCreationOptions<\"user\">) => {\n if (isInMockMode) {\n // Mock API key creation\n const mockApiKey = {\n id: `key-${Date.now()}`,\n description: data.description,\n createdAt: new Date().toISOString(),\n expiresAt: data.expiresAt?.toISOString(),\n value: 'sk_dev_mock_key_' + Math.random().toString(36).substring(2),\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n type: 'user' as const,\n userId: 'mock-user-id',\n };\n return mockApiKey as any;\n }\n\n if (!userFromHook) throw new Error('User not available');\n return await userFromHook.createApiKey(data);\n };\n\n return (\n <PageLayout>\n <Button onClick={() => setIsNewApiKeyDialogOpen(true)}>\n {t(\"Create API Key\")}\n </Button>\n <ApiKeyTable apiKeys={apiKeys} />\n <CreateDialog\n open={isNewApiKeyDialogOpen}\n onOpenChange={setIsNewApiKeyDialogOpen}\n onKeyCreated={setReturnedApiKey}\n createApiKey={handleCreateApiKey}\n mockMode={isInMockMode}\n />\n <ShowDialog\n apiKey={returnedApiKey}\n onClose={() => setReturnedApiKey(null)}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,OASzB;CACD,MAAM,EAAE,wDAAsB;CAG9B,MAAM,eAAe,CAAC,EAAE,OAAO,eAAe,OAAO;CAErD,MAAM,kDAAuB,EAAE,IAAI,eAAe,gBAAgB,YAAY,CAAC;AAG/E,KAAI,gBAAgB,CAAC,cAAc;AAKnC,KAAI,CAAC,gBAAgB,CAAC,aACpB,QAAO;CAIT,MAAM,kBAAkB,OAAO,cAAc,MAAM,YAAY,KAAI,aAAY;EAC7E,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,WAAW,IAAI,KAAK,QAAQ,UAAU;EACtC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG;EAC7D,mBAAmB,QAAQ,oBAAoB,IAAI,KAAK,QAAQ,kBAAkB,GAAG;EACrF,OAAO,EACL,UAAU,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAChD;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;GACb,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG,MAAM;GAC1E,MAAM,YAAY,CAAC,CAAC,QAAQ;AAC5B,UAAO,CAAC,aAAa,CAAC;;EAExB,kBAAkB;GAChB,MAAM,sBAAM,IAAI,MAAM;AACtB,OAAI,QAAQ,kBAAmB,QAAO;AACtC,OAAI,QAAQ,aAAa,IAAI,KAAK,QAAQ,UAAU,GAAG,IAAK,QAAO;AACnE,UAAO;;EAEV,EAAE,GAAG,CACJ;EACE,IAAI;EACJ,aAAa;EACb,2BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU;EAC3C,WAAW;EACX,mBAAmB;EACnB,OAAO,EACL,UAAU,OAAO,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAC5C;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;EACf,kBAAkB;EACnB,CACF;CAGD,IAAI;AACJ,KAAI,aACF,WAAU;UACD,aACT,WAAU,aAAa,YAAY;KAEnC,WAAU,EAAE;CAGd,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CACzE,MAAM,CAAC,gBAAgB,yCAA2D,KAAK;CAEvF,MAAM,eAAeA;CACrB,MAAM,aAAaC;CAEnB,MAAM,qBAAqB,OAAO,SAAwC;AACxE,MAAI,aAmBF,QAjBmB;GACjB,IAAI,OAAO,KAAK,KAAK;GACrB,aAAa,KAAK;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,WAAW,KAAK,WAAW,aAAa;GACxC,OAAO,qBAAqB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE;GACnE,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,eAAe;GACf,kBAAkB;GAClB,MAAM;GACN,QAAQ;GACT;AAIH,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,qBAAqB;AACxD,SAAO,MAAM,aAAa,aAAa,KAAK;;AAG9C,QACE,4CAACC;EACC,2CAACC;GAAO,eAAe,yBAAyB,KAAK;aAClD,EAAE,iBAAiB;IACb;EACT,2CAACC,oDAAqB,UAAW;EACjC,2CAAC;GACC,MAAM;GACN,cAAc;GACd,cAAc;GACd,cAAc;GACd,UAAU;IACV;EACF,2CAAC;GACC,QAAQ;GACR,eAAe,kBAAkB,KAAK;IACtC;KACS"}
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../chunk-BE-pF4vm.js');
3
3
  let _hexclave_ui = require("@hexclave/ui");
4
- let lucide_react = require("lucide-react");
5
4
  let react = require("react");
6
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
+ let lucide_react = require("lucide-react");
7
7
  let ______lib_translations_js = require("../../lib/translations.js");
8
8
 
9
9
  //#region src/components-page/account-settings/editable-text.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { Edit } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../../lib/translations\";\n\n\nexport function EditableText(props: { value: string, onSave?: (value: string) => void | Promise<void> }) {\n const [editing, setEditing] = useState(false);\n const [editingValue, setEditingValue] = useState(props.value);\n const { t } = useTranslation();\n\n return (\n <div className='flex items-center gap-2'>\n {editing ? (\n <>\n <Input\n value={editingValue}\n onChange={(e) => setEditingValue(e.target.value)}\n />\n <Button\n size='sm'\n onClick={async () => {\n await props.onSave?.(editingValue);\n setEditing(false);\n }}\n >\n {t(\"Save\")}\n </Button>\n <Button\n size='sm'\n variant='secondary'\n onClick={() => {\n setEditingValue(props.value);\n setEditing(false);\n }}>\n {t(\"Cancel\")}\n </Button>\n </>\n ) : (\n <>\n <Typography>{props.value}</Typography>\n <Button onClick={() => setEditing(true)} size='icon' variant='ghost'>\n <Edit className=\"w-4 h-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,aAAa,OAA4E;CACvG,MAAM,CAAC,SAAS,kCAAuB,MAAM;CAC7C,MAAM,CAAC,cAAc,uCAA4B,MAAM,MAAM;CAC7D,MAAM,EAAE,qDAAsB;AAE9B,QACE,2CAAC;EAAI,WAAU;YACZ,UACC;GACE,2CAACA;IACC,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;KAChD;GACF,2CAACC;IACC,MAAK;IACL,SAAS,YAAY;AACnB,WAAM,MAAM,SAAS,aAAa;AAClC,gBAAW,MAAM;;cAGlB,EAAE,OAAO;KACH;GACT,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAe;AACb,qBAAgB,MAAM,MAAM;AAC5B,gBAAW,MAAM;;cAElB,EAAE,SAAS;KACL;MACR,GAEH,qFACE,2CAACC,qCAAY,MAAM,QAAmB,EACtC,2CAACD;GAAO,eAAe,WAAW,KAAK;GAAE,MAAK;GAAO,SAAQ;aAC3D,2CAACE,qBAAK,WAAU,YAAY;IACrB,IACR;GAED"}
1
+ {"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { Edit } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../../lib/translations\";\n\n\nexport function EditableText(props: { value: string, onSave?: (value: string) => void | Promise<void> }) {\n const [editing, setEditing] = useState(false);\n const [editingValue, setEditingValue] = useState(props.value);\n const { t } = useTranslation();\n\n return (\n <div className='flex items-center gap-2'>\n {editing ? (\n <>\n <Input\n value={editingValue}\n onChange={(e) => setEditingValue(e.target.value)}\n />\n <Button\n size='sm'\n onClick={async () => {\n await props.onSave?.(editingValue);\n setEditing(false);\n }}\n >\n {t(\"Save\")}\n </Button>\n <Button\n size='sm'\n variant='secondary'\n onClick={() => {\n setEditingValue(props.value);\n setEditing(false);\n }}>\n {t(\"Cancel\")}\n </Button>\n </>\n ) : (\n <>\n <Typography>{props.value}</Typography>\n <Button onClick={() => setEditing(true)} size='icon' variant='ghost'>\n <Edit className=\"w-4 h-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,aAAa,OAA4E;CACvG,MAAM,CAAC,SAAS,kCAAuB,MAAM;CAC7C,MAAM,CAAC,cAAc,uCAA4B,MAAM,MAAM;CAC7D,MAAM,EAAE,qDAAsB;AAE9B,QACE,2CAAC;EAAI,WAAU;YACZ,UACC;GACE,2CAACA;IACC,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;KAChD;GACF,2CAACC;IACC,MAAK;IACL,SAAS,YAAY;AACnB,WAAM,MAAM,SAAS,aAAa;AAClC,gBAAW,MAAM;;cAGlB,EAAE,OAAO;KACH;GACT,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAe;AACb,qBAAgB,MAAM,MAAM;AAC5B,gBAAW,MAAM;;cAElB,EAAE,SAAS;KACL;MACR,GAEH,qFACE,2CAACC,qCAAY,MAAM,QAAmB,EACtC,2CAACD;GAAO,eAAe,WAAW,KAAK;GAAE,MAAK;GAAO,SAAQ;aAC3D,2CAACE,qBAAK,WAAU,YAAY;IACrB,IACR;GAED"}
@@ -1 +1 @@
1
- {"version":3,"file":"email-and-auth-page.js","names":["PageLayout","EmailsSection","PasswordSection","PasskeySection","OtpSection","MfaSection"],"sources":["../../../../src/components-page/account-settings/email-and-auth/email-and-auth-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 { PageLayout } from \"../page-layout\";\nimport { EmailsSection } from \"./emails-section\";\nimport { MfaSection } from \"./mfa-section\";\nimport { OtpSection } from \"./otp-section\";\nimport { PasskeySection } from \"./passkey-section\";\nimport { PasswordSection } from \"./password-section\";\n\nexport function EmailsAndAuthPage(props?: {\n mockMode?: boolean,\n}) {\n return (\n <PageLayout>\n <EmailsSection mockMode={props?.mockMode}/>\n <PasswordSection mockMode={props?.mockMode} />\n <PasskeySection mockMode={props?.mockMode} />\n <OtpSection mockMode={props?.mockMode} />\n <MfaSection mockMode={props?.mockMode} />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAE/B;AACD,QACE,4CAACA;EACC,2CAACC,qCAAc,UAAU,OAAO,WAAW;EAC3C,2CAACC,yCAAgB,UAAU,OAAO,WAAY;EAC9C,2CAACC,uCAAe,UAAU,OAAO,WAAY;EAC7C,2CAACC,+BAAW,UAAU,OAAO,WAAY;EACzC,2CAACC,+BAAW,UAAU,OAAO,WAAY;KAC9B"}
1
+ {"version":3,"file":"email-and-auth-page.js","names":["PageLayout","EmailsSection","PasswordSection","PasskeySection","OtpSection","MfaSection"],"sources":["../../../../src/components-page/account-settings/email-and-auth/email-and-auth-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 { PageLayout } from \"../page-layout\";\nimport { EmailsSection } from \"./emails-section\";\nimport { MfaSection } from \"./mfa-section\";\nimport { OtpSection } from \"./otp-section\";\nimport { PasskeySection } from \"./passkey-section\";\nimport { PasswordSection } from \"./password-section\";\n\nexport function EmailsAndAuthPage(props?: {\n mockMode?: boolean,\n}) {\n return (\n <PageLayout>\n <EmailsSection mockMode={props?.mockMode}/>\n <PasswordSection mockMode={props?.mockMode} />\n <PasskeySection mockMode={props?.mockMode} />\n <OtpSection mockMode={props?.mockMode} />\n <MfaSection mockMode={props?.mockMode} />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAE/B;AACD,QACE,4CAACA;EACC,2CAACC,qCAAc,UAAU,OAAO,WAAW;EAC3C,2CAACC,yCAAgB,UAAU,OAAO,WAAY;EAC9C,2CAACC,uCAAe,UAAU,OAAO,WAAY;EAC7C,2CAACC,+BAAW,UAAU,OAAO,WAAY;EACzC,2CAACC,+BAAW,UAAU,OAAO,WAAY;KAC9B"}
@@ -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 _________lib_hooks_js = require("../../../lib/hooks.js");
11
11
  let _________lib_translations_js = require("../../../lib/translations.js");
12
12
  let _hexclave_shared_dist_known_errors = require("@hexclave/shared/dist/known-errors");