@better-auth-ui/solid 1.6.19

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 (270) hide show
  1. package/dist/components/auth/email/email-changed.d.ts +59 -0
  2. package/dist/components/auth/email/email-changed.js +264 -0
  3. package/dist/components/auth/email/email-styles.d.ts +48 -0
  4. package/dist/components/auth/email/email-styles.js +107 -0
  5. package/dist/components/auth/email/email-verification.d.ts +51 -0
  6. package/dist/components/auth/email/email-verification.js +212 -0
  7. package/dist/components/auth/email/index.d.ts +9 -0
  8. package/dist/components/auth/email/magic-link.d.ts +53 -0
  9. package/dist/components/auth/email/magic-link.js +213 -0
  10. package/dist/components/auth/email/new-device.d.ts +77 -0
  11. package/dist/components/auth/email/new-device.js +326 -0
  12. package/dist/components/auth/email/organization-invitation.d.ts +70 -0
  13. package/dist/components/auth/email/organization-invitation.js +260 -0
  14. package/dist/components/auth/email/otp-email.d.ts +49 -0
  15. package/dist/components/auth/email/otp-email.js +191 -0
  16. package/dist/components/auth/email/password-changed.d.ts +56 -0
  17. package/dist/components/auth/email/password-changed.js +236 -0
  18. package/dist/components/auth/email/reset-password.d.ts +51 -0
  19. package/dist/components/auth/email/reset-password.js +212 -0
  20. package/dist/email.d.ts +18 -0
  21. package/dist/email.js +10 -0
  22. package/dist/hooks/auth/use-authenticate.d.ts +3 -0
  23. package/dist/hooks/auth/use-authenticate.js +18 -0
  24. package/dist/hooks/auth/use-sign-out.d.ts +2 -0
  25. package/dist/hooks/auth/use-sign-out.js +17 -0
  26. package/dist/hooks/auth/use-user.d.ts +213 -0
  27. package/dist/hooks/auth/use-user.js +13 -0
  28. package/dist/hooks/use-auth-mutation.d.ts +6 -0
  29. package/dist/hooks/use-auth-mutation.js +11 -0
  30. package/dist/hooks/use-auth-query.d.ts +5 -0
  31. package/dist/hooks/use-auth-query.js +17 -0
  32. package/dist/index.d.ts +48 -0
  33. package/dist/index.js +68 -0
  34. package/dist/lib/auth-client.d.ts +26 -0
  35. package/dist/lib/auth-config.d.ts +12 -0
  36. package/dist/lib/auth-config.js +21 -0
  37. package/dist/lib/auth-plugin.d.ts +16 -0
  38. package/dist/lib/auth-provider.d.ts +12 -0
  39. package/dist/lib/auth-provider.js +36 -0
  40. package/dist/lib/auth-server.d.ts +16 -0
  41. package/dist/lib/auth-utils.d.ts +3 -0
  42. package/dist/lib/auth-utils.js +12 -0
  43. package/dist/lib/fetch-options-provider.d.ts +23 -0
  44. package/dist/lib/fetch-options-provider.js +29 -0
  45. package/dist/lib/mutation-invalidator.d.ts +11 -0
  46. package/dist/lib/mutation-invalidator.js +20 -0
  47. package/dist/lib/provider-icons.d.ts +8 -0
  48. package/dist/lib/provider-icons.js +5 -0
  49. package/dist/mutations/api-key/create-api-key-mutation.d.ts +71 -0
  50. package/dist/mutations/api-key/create-api-key-mutation.js +12 -0
  51. package/dist/mutations/api-key/delete-api-key-mutation.d.ts +23 -0
  52. package/dist/mutations/api-key/delete-api-key-mutation.js +12 -0
  53. package/dist/mutations/auth/request-password-reset-mutation.d.ts +11 -0
  54. package/dist/mutations/auth/request-password-reset-mutation.js +8 -0
  55. package/dist/mutations/auth/reset-password-mutation.d.ts +13 -0
  56. package/dist/mutations/auth/reset-password-mutation.js +8 -0
  57. package/dist/mutations/auth/send-verification-email-mutation.d.ts +11 -0
  58. package/dist/mutations/auth/send-verification-email-mutation.js +8 -0
  59. package/dist/mutations/auth/sign-in-email-mutation.d.ts +15 -0
  60. package/dist/mutations/auth/sign-in-email-mutation.js +8 -0
  61. package/dist/mutations/auth/sign-in-social-mutation.d.ts +53 -0
  62. package/dist/mutations/auth/sign-in-social-mutation.js +8 -0
  63. package/dist/mutations/auth/sign-out-mutation.d.ts +6 -0
  64. package/dist/mutations/auth/sign-out-mutation.js +8 -0
  65. package/dist/mutations/auth/sign-up-email-mutation.d.ts +17 -0
  66. package/dist/mutations/auth/sign-up-email-mutation.js +8 -0
  67. package/dist/mutations/auth-mutation-options.d.ts +10 -0
  68. package/dist/mutations/auth-mutation-options.js +19 -0
  69. package/dist/mutations/create-auth-mutation.d.ts +10 -0
  70. package/dist/mutations/create-auth-mutation.js +20 -0
  71. package/dist/mutations/magic-link/sign-in-magic-link-mutation.d.ts +19 -0
  72. package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +8 -0
  73. package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +19 -0
  74. package/dist/mutations/multi-session/revoke-multi-session-mutation.js +12 -0
  75. package/dist/mutations/multi-session/set-active-session-mutation.d.ts +19 -0
  76. package/dist/mutations/multi-session/set-active-session-mutation.js +13 -0
  77. package/dist/mutations/organization/accept-invitation-mutation.d.ts +18 -0
  78. package/dist/mutations/organization/accept-invitation-mutation.js +12 -0
  79. package/dist/mutations/organization/cancel-invitation-mutation.d.ts +18 -0
  80. package/dist/mutations/organization/cancel-invitation-mutation.js +12 -0
  81. package/dist/mutations/organization/check-slug-mutation.d.ts +18 -0
  82. package/dist/mutations/organization/check-slug-mutation.js +15 -0
  83. package/dist/mutations/organization/create-organization-mutation.d.ts +38 -0
  84. package/dist/mutations/organization/create-organization-mutation.js +12 -0
  85. package/dist/mutations/organization/delete-organization-mutation.d.ts +18 -0
  86. package/dist/mutations/organization/delete-organization-mutation.js +12 -0
  87. package/dist/mutations/organization/index.d.ts +13 -0
  88. package/dist/mutations/organization/index.js +13 -0
  89. package/dist/mutations/organization/invite-member-mutation.d.ts +30 -0
  90. package/dist/mutations/organization/invite-member-mutation.js +12 -0
  91. package/dist/mutations/organization/leave-organization-mutation.d.ts +18 -0
  92. package/dist/mutations/organization/leave-organization-mutation.js +12 -0
  93. package/dist/mutations/organization/metadata.d.ts +13 -0
  94. package/dist/mutations/organization/metadata.js +27 -0
  95. package/dist/mutations/organization/reject-invitation-mutation.d.ts +18 -0
  96. package/dist/mutations/organization/reject-invitation-mutation.js +12 -0
  97. package/dist/mutations/organization/remove-member-mutation.d.ts +22 -0
  98. package/dist/mutations/organization/remove-member-mutation.js +12 -0
  99. package/dist/mutations/organization/set-active-organization-mutation.d.ts +24 -0
  100. package/dist/mutations/organization/set-active-organization-mutation.js +35 -0
  101. package/dist/mutations/organization/update-member-role-mutation.d.ts +26 -0
  102. package/dist/mutations/organization/update-member-role-mutation.js +12 -0
  103. package/dist/mutations/organization/update-organization-mutation.d.ts +42 -0
  104. package/dist/mutations/organization/update-organization-mutation.js +12 -0
  105. package/dist/mutations/organization/utils.d.ts +8 -0
  106. package/dist/mutations/organization/utils.js +17 -0
  107. package/dist/mutations/passkey/add-passkey-mutation.d.ts +73 -0
  108. package/dist/mutations/passkey/add-passkey-mutation.js +12 -0
  109. package/dist/mutations/passkey/delete-passkey-mutation.d.ts +19 -0
  110. package/dist/mutations/passkey/delete-passkey-mutation.js +12 -0
  111. package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +50 -0
  112. package/dist/mutations/passkey/sign-in-passkey-mutation.js +9 -0
  113. package/dist/mutations/settings/change-email-mutation.d.ts +11 -0
  114. package/dist/mutations/settings/change-email-mutation.js +8 -0
  115. package/dist/mutations/settings/change-password-mutation.d.ts +13 -0
  116. package/dist/mutations/settings/change-password-mutation.js +8 -0
  117. package/dist/mutations/settings/delete-user-mutation.d.ts +13 -0
  118. package/dist/mutations/settings/delete-user-mutation.js +8 -0
  119. package/dist/mutations/settings/link-social-mutation.d.ts +35 -0
  120. package/dist/mutations/settings/link-social-mutation.js +8 -0
  121. package/dist/mutations/settings/revoke-session-mutation.d.ts +19 -0
  122. package/dist/mutations/settings/revoke-session-mutation.js +12 -0
  123. package/dist/mutations/settings/unlink-account-mutation.d.ts +23 -0
  124. package/dist/mutations/settings/unlink-account-mutation.js +12 -0
  125. package/dist/mutations/settings/update-user-mutation.d.ts +6 -0
  126. package/dist/mutations/settings/update-user-mutation.js +8 -0
  127. package/dist/mutations/use-session-scoped-mutation.d.ts +17 -0
  128. package/dist/mutations/use-session-scoped-mutation.js +17 -0
  129. package/dist/mutations/username/is-username-available-mutation.d.ts +9 -0
  130. package/dist/mutations/username/is-username-available-mutation.js +8 -0
  131. package/dist/mutations/username/sign-in-username-mutation.d.ts +15 -0
  132. package/dist/mutations/username/sign-in-username-mutation.js +9 -0
  133. package/dist/plugins/captcha-plugin.d.ts +29 -0
  134. package/dist/plugins/captcha-plugin.js +26 -0
  135. package/dist/plugins.d.ts +2 -0
  136. package/dist/plugins.js +2 -0
  137. package/dist/queries/api-key/list-api-keys-query.d.ts +44 -0
  138. package/dist/queries/api-key/list-api-keys-query.js +17 -0
  139. package/dist/queries/auth/session-query.d.ts +22 -0
  140. package/dist/queries/auth/session-query.js +32 -0
  141. package/dist/queries/auth-query-options.d.ts +14 -0
  142. package/dist/queries/auth-query-options.js +17 -0
  143. package/dist/queries/create-user-scoped-query.d.ts +25 -0
  144. package/dist/queries/create-user-scoped-query.js +29 -0
  145. package/dist/queries/multi-session/list-device-sessions-query.d.ts +23 -0
  146. package/dist/queries/multi-session/list-device-sessions-query.js +17 -0
  147. package/dist/queries/organization/active-organization-query.d.ts +37 -0
  148. package/dist/queries/organization/active-organization-query.js +26 -0
  149. package/dist/queries/organization/full-organization-query.d.ts +35 -0
  150. package/dist/queries/organization/full-organization-query.js +25 -0
  151. package/dist/queries/organization/has-permission-query.d.ts +23 -0
  152. package/dist/queries/organization/has-permission-query.js +31 -0
  153. package/dist/queries/organization/index.d.ts +7 -0
  154. package/dist/queries/organization/index.js +7 -0
  155. package/dist/queries/organization/list-invitations-query.d.ts +29 -0
  156. package/dist/queries/organization/list-invitations-query.js +29 -0
  157. package/dist/queries/organization/list-members-query.d.ts +53 -0
  158. package/dist/queries/organization/list-members-query.js +29 -0
  159. package/dist/queries/organization/list-organizations-query.d.ts +23 -0
  160. package/dist/queries/organization/list-organizations-query.js +25 -0
  161. package/dist/queries/organization/list-user-invitations-query.d.ts +29 -0
  162. package/dist/queries/organization/list-user-invitations-query.js +25 -0
  163. package/dist/queries/organization/plugin.d.ts +1 -0
  164. package/dist/queries/organization/plugin.js +8 -0
  165. package/dist/queries/organization/utils.d.ts +16 -0
  166. package/dist/queries/organization/utils.js +18 -0
  167. package/dist/queries/passkey/list-passkeys-query.d.ts +23 -0
  168. package/dist/queries/passkey/list-passkeys-query.js +17 -0
  169. package/dist/queries/settings/account-info-query.d.ts +35 -0
  170. package/dist/queries/settings/account-info-query.js +17 -0
  171. package/dist/queries/settings/list-accounts-query.d.ts +23 -0
  172. package/dist/queries/settings/list-accounts-query.js +17 -0
  173. package/dist/queries/settings/list-sessions-query.d.ts +24 -0
  174. package/dist/queries/settings/list-sessions-query.js +17 -0
  175. package/dist/server/queries/auth/session-query.d.ts +19 -0
  176. package/dist/server/queries/auth/session-query.js +13 -0
  177. package/dist/server.d.ts +7 -0
  178. package/dist/server.js +7 -0
  179. package/package.json +63 -0
  180. package/src/components/auth/email/email-changed.tsx +305 -0
  181. package/src/components/auth/email/email-styles.tsx +139 -0
  182. package/src/components/auth/email/email-verification.tsx +249 -0
  183. package/src/components/auth/email/index.ts +9 -0
  184. package/src/components/auth/email/magic-link.tsx +254 -0
  185. package/src/components/auth/email/new-device.tsx +347 -0
  186. package/src/components/auth/email/organization-invitation.tsx +322 -0
  187. package/src/components/auth/email/otp-email.tsx +239 -0
  188. package/src/components/auth/email/password-changed.tsx +279 -0
  189. package/src/components/auth/email/reset-password.tsx +250 -0
  190. package/src/email.ts +49 -0
  191. package/src/hooks/auth/use-authenticate.ts +30 -0
  192. package/src/hooks/auth/use-sign-out.ts +23 -0
  193. package/src/hooks/auth/use-user.ts +19 -0
  194. package/src/hooks/use-auth-mutation.ts +35 -0
  195. package/src/hooks/use-auth-query.ts +33 -0
  196. package/src/index.ts +48 -0
  197. package/src/lib/auth-client.ts +43 -0
  198. package/src/lib/auth-config.ts +46 -0
  199. package/src/lib/auth-plugin.ts +20 -0
  200. package/src/lib/auth-provider.tsx +60 -0
  201. package/src/lib/auth-server.ts +25 -0
  202. package/src/lib/auth-utils.ts +25 -0
  203. package/src/lib/fetch-options-provider.tsx +77 -0
  204. package/src/lib/mutation-invalidator.tsx +82 -0
  205. package/src/lib/provider-icons.ts +10 -0
  206. package/src/mutations/api-key/create-api-key-mutation.ts +40 -0
  207. package/src/mutations/api-key/delete-api-key-mutation.ts +40 -0
  208. package/src/mutations/auth/request-password-reset-mutation.ts +15 -0
  209. package/src/mutations/auth/reset-password-mutation.ts +16 -0
  210. package/src/mutations/auth/send-verification-email-mutation.ts +15 -0
  211. package/src/mutations/auth/sign-in-email-mutation.ts +17 -0
  212. package/src/mutations/auth/sign-in-social-mutation.ts +16 -0
  213. package/src/mutations/auth/sign-out-mutation.ts +13 -0
  214. package/src/mutations/auth/sign-up-email-mutation.ts +17 -0
  215. package/src/mutations/auth-mutation-options.ts +62 -0
  216. package/src/mutations/create-auth-mutation.ts +44 -0
  217. package/src/mutations/magic-link/sign-in-magic-link-mutation.ts +15 -0
  218. package/src/mutations/multi-session/revoke-multi-session-mutation.ts +40 -0
  219. package/src/mutations/multi-session/set-active-session-mutation.ts +43 -0
  220. package/src/mutations/organization/accept-invitation-mutation.ts +38 -0
  221. package/src/mutations/organization/cancel-invitation-mutation.ts +38 -0
  222. package/src/mutations/organization/check-slug-mutation.ts +36 -0
  223. package/src/mutations/organization/create-organization-mutation.ts +37 -0
  224. package/src/mutations/organization/delete-organization-mutation.ts +37 -0
  225. package/src/mutations/organization/index.ts +13 -0
  226. package/src/mutations/organization/invite-member-mutation.ts +38 -0
  227. package/src/mutations/organization/leave-organization-mutation.ts +37 -0
  228. package/src/mutations/organization/metadata.ts +103 -0
  229. package/src/mutations/organization/reject-invitation-mutation.ts +38 -0
  230. package/src/mutations/organization/remove-member-mutation.ts +38 -0
  231. package/src/mutations/organization/set-active-organization-mutation.ts +110 -0
  232. package/src/mutations/organization/update-member-role-mutation.ts +38 -0
  233. package/src/mutations/organization/update-organization-mutation.ts +37 -0
  234. package/src/mutations/organization/utils.ts +51 -0
  235. package/src/mutations/passkey/add-passkey-mutation.ts +40 -0
  236. package/src/mutations/passkey/delete-passkey-mutation.ts +40 -0
  237. package/src/mutations/passkey/sign-in-passkey-mutation.ts +17 -0
  238. package/src/mutations/settings/change-email-mutation.ts +17 -0
  239. package/src/mutations/settings/change-password-mutation.ts +16 -0
  240. package/src/mutations/settings/delete-user-mutation.ts +16 -0
  241. package/src/mutations/settings/link-social-mutation.ts +16 -0
  242. package/src/mutations/settings/revoke-session-mutation.ts +38 -0
  243. package/src/mutations/settings/unlink-account-mutation.ts +38 -0
  244. package/src/mutations/settings/update-user-mutation.ts +17 -0
  245. package/src/mutations/use-session-scoped-mutation.ts +64 -0
  246. package/src/mutations/username/is-username-available-mutation.ts +15 -0
  247. package/src/mutations/username/sign-in-username-mutation.ts +17 -0
  248. package/src/plugins/captcha-plugin.tsx +64 -0
  249. package/src/plugins.ts +2 -0
  250. package/src/queries/api-key/list-api-keys-query.ts +93 -0
  251. package/src/queries/auth/session-query.ts +81 -0
  252. package/src/queries/auth-query-options.ts +57 -0
  253. package/src/queries/create-user-scoped-query.ts +107 -0
  254. package/src/queries/multi-session/list-device-sessions-query.ts +107 -0
  255. package/src/queries/organization/active-organization-query.ts +127 -0
  256. package/src/queries/organization/full-organization-query.ts +111 -0
  257. package/src/queries/organization/has-permission-query.ts +121 -0
  258. package/src/queries/organization/index.ts +7 -0
  259. package/src/queries/organization/list-invitations-query.ts +124 -0
  260. package/src/queries/organization/list-members-query.ts +124 -0
  261. package/src/queries/organization/list-organizations-query.ts +113 -0
  262. package/src/queries/organization/list-user-invitations-query.ts +114 -0
  263. package/src/queries/organization/plugin.ts +11 -0
  264. package/src/queries/organization/utils.ts +88 -0
  265. package/src/queries/passkey/list-passkeys-query.ts +93 -0
  266. package/src/queries/settings/account-info-query.ts +94 -0
  267. package/src/queries/settings/list-accounts-query.ts +94 -0
  268. package/src/queries/settings/list-sessions-query.ts +96 -0
  269. package/src/server/queries/auth/session-query.ts +56 -0
  270. package/src/server.ts +7 -0
@@ -0,0 +1,7 @@
1
+ export type * from './lib/auth-server';
2
+ export * from './queries/api-key/list-api-keys-query';
3
+ export * from './queries/multi-session/list-device-sessions-query';
4
+ export * from './queries/passkey/list-passkeys-query';
5
+ export * from './queries/settings/account-info-query';
6
+ export * from './queries/settings/list-accounts-query';
7
+ export * from './server/queries/auth/session-query';
package/dist/server.js ADDED
@@ -0,0 +1,7 @@
1
+ import { ensureListApiKeys as e, fetchListApiKeys as t, listApiKeysOptions as n, prefetchListApiKeys as r, useListApiKeys as i } from "./queries/api-key/list-api-keys-query.js";
2
+ import { ensureListDeviceSessions as a, fetchListDeviceSessions as o, listDeviceSessionsOptions as s, prefetchListDeviceSessions as c, useListDeviceSessions as l } from "./queries/multi-session/list-device-sessions-query.js";
3
+ import { ensureListPasskeys as u, fetchListPasskeys as d, listPasskeysOptions as f, prefetchListPasskeys as p, useListPasskeys as m } from "./queries/passkey/list-passkeys-query.js";
4
+ import { accountInfoOptions as h, ensureAccountInfo as g, fetchAccountInfo as _, prefetchAccountInfo as v, useAccountInfo as y } from "./queries/settings/account-info-query.js";
5
+ import { ensureListAccounts as b, fetchListAccounts as x, listAccountsOptions as S, prefetchListAccounts as C, useListAccounts as w } from "./queries/settings/list-accounts-query.js";
6
+ import { ensureSession as T, fetchSession as E, prefetchSession as D, sessionOptions as O } from "./server/queries/auth/session-query.js";
7
+ export { h as accountInfoOptions, g as ensureAccountInfo, b as ensureListAccounts, e as ensureListApiKeys, a as ensureListDeviceSessions, u as ensureListPasskeys, T as ensureSession, _ as fetchAccountInfo, x as fetchListAccounts, t as fetchListApiKeys, o as fetchListDeviceSessions, d as fetchListPasskeys, E as fetchSession, S as listAccountsOptions, n as listApiKeysOptions, s as listDeviceSessionsOptions, f as listPasskeysOptions, v as prefetchAccountInfo, C as prefetchListAccounts, r as prefetchListApiKeys, c as prefetchListDeviceSessions, p as prefetchListPasskeys, D as prefetchSession, O as sessionOptions, y as useAccountInfo, w as useListAccounts, i as useListApiKeys, l as useListDeviceSessions, m as useListPasskeys };
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@better-auth-ui/solid",
3
+ "version": "1.6.19",
4
+ "type": "module",
5
+ "scripts": {
6
+ "build": "vite build && vite build --config vite.email.config.ts",
7
+ "dev": "tsc --watch",
8
+ "test": "vitest"
9
+ },
10
+ "files": [
11
+ "src",
12
+ "dist"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./email": {
22
+ "types": "./dist/email.d.ts",
23
+ "import": "./dist/email.js"
24
+ },
25
+ "./server": {
26
+ "types": "./dist/server.d.ts",
27
+ "import": "./dist/server.js"
28
+ },
29
+ "./plugins": {
30
+ "types": "./dist/plugins.d.ts",
31
+ "import": "./dist/plugins.js"
32
+ }
33
+ },
34
+ "devDependencies": {
35
+ "@better-auth/api-key": "^1.6.9",
36
+ "@better-auth/passkey": "^1.6.10",
37
+ "@solidjs-email/main": "^2.0.0",
38
+ "@tanstack/solid-query": "^5.100.9",
39
+ "better-auth": "^1.6.11",
40
+ "solid-js": "^1.9.12",
41
+ "vite-plugin-solid": "^2.11.8",
42
+ "vitest": "^4.1.5",
43
+ "zod": "^4.4.3"
44
+ },
45
+ "peerDependencies": {
46
+ "@better-auth-ui/core": "*",
47
+ "@better-auth/api-key": ">=1.6.9",
48
+ "@better-auth/passkey": ">=1.6.10",
49
+ "@solidjs-email/main": ">=2.0.0",
50
+ "@tanstack/solid-query": ">=5.100.9",
51
+ "better-auth": ">=1.6.11",
52
+ "solid-js": ">=1.9.12",
53
+ "zod": ">=4.4.3"
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://github.com/better-auth-ui/better-auth-ui",
58
+ "directory": "packages/solid"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ }
63
+ }
@@ -0,0 +1,305 @@
1
+ import {
2
+ Body,
3
+ Button,
4
+ Container,
5
+ Head,
6
+ Heading,
7
+ Hr,
8
+ Html,
9
+ Img,
10
+ Preview,
11
+ Section,
12
+ Tailwind,
13
+ Text
14
+ } from "@solidjs-email/main"
15
+ import type { JSX } from "solid-js"
16
+ import { Show } from "solid-js"
17
+ import {
18
+ type EmailClassNames,
19
+ type EmailColors,
20
+ EmailStyles
21
+ } from "./email-styles"
22
+
23
+ function cn(...classes: Array<string | false | null | undefined>) {
24
+ return classes.filter(Boolean).join(" ")
25
+ }
26
+
27
+ const emailChangedEmailLocalization = {
28
+ YOUR_EMAIL_ADDRESS_HAS_BEEN_CHANGED: "Your email address has been changed",
29
+ LOGO: "Logo",
30
+ EMAIL_ADDRESS_CHANGED: "Email address changed",
31
+ EMAIL_ADDRESS_FOR_YOUR_ACCOUNT_CHANGED:
32
+ "The email address for your {appName} account has been changed.",
33
+ PREVIOUS_EMAIL: "Previous email:",
34
+ NEW_EMAIL: "New email:",
35
+ IF_YOU_MADE_THIS_CHANGE:
36
+ "If you made this change, you can safely ignore this email.",
37
+ I_DIDNT_MAKE_THIS_CHANGE: "I didn't make this change",
38
+ EMAIL_SENT_BY: "Email sent by {appName}.",
39
+ IF_YOU_DIDNT_AUTHORIZE_THIS_CHANGE:
40
+ "If you didn't authorize this change, please contact support immediately {supportEmail} to secure your account.",
41
+ POWERED_BY_BETTER_AUTH: "Powered by {betterAuth}"
42
+ }
43
+
44
+ export type EmailChangedEmailLocalization = typeof emailChangedEmailLocalization
45
+
46
+ export interface EmailChangedEmailProps {
47
+ oldEmail?: string
48
+ newEmail?: string
49
+ revertURL?: string
50
+ appName?: string
51
+ supportEmail?: string
52
+ logoURL?: string | { light: string; dark: string }
53
+ classNames?: EmailClassNames
54
+ colors?: EmailColors
55
+ poweredBy?: boolean
56
+ darkMode?: boolean
57
+ head?: JSX.Element
58
+ localization?: Partial<EmailChangedEmailLocalization>
59
+ }
60
+
61
+ function cleanSentence(value: string) {
62
+ return value.replace(/\s{2,}/g, " ").replace(" .", ".")
63
+ }
64
+
65
+ export function EmailChangedEmail(props: EmailChangedEmailProps) {
66
+ const darkMode = () => props.darkMode ?? true
67
+ const localization = () => ({
68
+ ...EmailChangedEmail.localization,
69
+ ...props.localization
70
+ })
71
+ const accountText = () =>
72
+ cleanSentence(
73
+ localization().EMAIL_ADDRESS_FOR_YOUR_ACCOUNT_CHANGED.replace(
74
+ "{appName}",
75
+ props.appName || ""
76
+ )
77
+ )
78
+ const supportText = () =>
79
+ cleanSentence(
80
+ localization().IF_YOU_DIDNT_AUTHORIZE_THIS_CHANGE.replace(
81
+ "{supportEmail}",
82
+ props.supportEmail || ""
83
+ )
84
+ )
85
+
86
+ return (
87
+ <Html>
88
+ <Head>
89
+ <meta content="light dark" name="color-scheme" />
90
+ <meta content="light dark" name="supported-color-schemes" />
91
+ <EmailStyles colors={props.colors} darkMode={darkMode()} />
92
+ {props.head}
93
+ </Head>
94
+
95
+ <Preview>{localization().YOUR_EMAIL_ADDRESS_HAS_BEEN_CHANGED}</Preview>
96
+
97
+ <Tailwind>
98
+ <Body
99
+ class={cn("bg-background", props.classNames?.body)}
100
+ style={{ "font-family": "Arial, Helvetica, sans-serif" }}
101
+ >
102
+ <Container
103
+ class={cn(
104
+ "mx-auto my-auto max-w-xl px-2 py-10",
105
+ props.classNames?.container
106
+ )}
107
+ >
108
+ <Section
109
+ class={cn(
110
+ "rounded-none border border-border bg-card p-8 text-card-foreground",
111
+ props.classNames?.card
112
+ )}
113
+ >
114
+ {props.logoURL &&
115
+ (typeof props.logoURL === "string" ? (
116
+ <Img
117
+ alt={props.appName || localization().LOGO}
118
+ class={cn("mx-auto mb-8", props.classNames?.logo)}
119
+ height={48}
120
+ src={props.logoURL}
121
+ width={48}
122
+ />
123
+ ) : (
124
+ <>
125
+ <Img
126
+ alt={props.appName || localization().LOGO}
127
+ class={cn(
128
+ "logo-light mx-auto mb-8",
129
+ props.classNames?.logo
130
+ )}
131
+ height={48}
132
+ src={props.logoURL.light}
133
+ width={48}
134
+ />
135
+ <Img
136
+ alt={props.appName || localization().LOGO}
137
+ class={cn(
138
+ "logo-dark hidden mx-auto mb-8",
139
+ props.classNames?.logo
140
+ )}
141
+ height={48}
142
+ src={props.logoURL.dark}
143
+ width={48}
144
+ />
145
+ </>
146
+ ))}
147
+
148
+ <Heading
149
+ class={cn(
150
+ "m-0 mb-5 font-semibold text-2xl",
151
+ props.classNames?.title
152
+ )}
153
+ >
154
+ {localization().EMAIL_ADDRESS_CHANGED}
155
+ </Heading>
156
+
157
+ <Text
158
+ class={cn("font-normal text-sm", props.classNames?.content)}
159
+ >
160
+ {accountText()}
161
+ </Text>
162
+
163
+ <Show when={props.oldEmail || props.newEmail}>
164
+ <Section
165
+ class={cn(
166
+ "my-6 border border-border bg-muted p-4",
167
+ props.classNames?.codeBlock
168
+ )}
169
+ >
170
+ <Show when={props.oldEmail}>
171
+ {(oldEmail) => (
172
+ <>
173
+ <Text
174
+ class={cn(
175
+ "m-0 mb-2 text-muted-foreground text-xs",
176
+ props.classNames?.description
177
+ )}
178
+ >
179
+ {localization().PREVIOUS_EMAIL}
180
+ </Text>
181
+ <Text
182
+ class={cn(
183
+ "m-0 mb-4 font-semibold text-sm",
184
+ props.classNames?.content
185
+ )}
186
+ >
187
+ {oldEmail()}
188
+ </Text>
189
+ </>
190
+ )}
191
+ </Show>
192
+
193
+ <Show when={props.newEmail}>
194
+ {(newEmail) => (
195
+ <>
196
+ <Text
197
+ class={cn(
198
+ "m-0 mb-2 text-muted-foreground text-xs",
199
+ props.classNames?.description
200
+ )}
201
+ >
202
+ {localization().NEW_EMAIL}
203
+ </Text>
204
+ <Text
205
+ class={cn(
206
+ "m-0 font-semibold text-primary text-sm",
207
+ props.classNames?.content
208
+ )}
209
+ >
210
+ {newEmail()}
211
+ </Text>
212
+ </>
213
+ )}
214
+ </Show>
215
+ </Section>
216
+ </Show>
217
+
218
+ <Text
219
+ class={cn("font-normal text-sm", props.classNames?.content)}
220
+ >
221
+ {localization().IF_YOU_MADE_THIS_CHANGE}
222
+ </Text>
223
+
224
+ <Show when={props.revertURL}>
225
+ {(revertURL) => (
226
+ <Section class="my-6">
227
+ <Button
228
+ class={cn(
229
+ "inline-block whitespace-nowrap rounded-none bg-primary px-6 py-2.5 font-medium text-primary-foreground text-sm no-underline",
230
+ props.classNames?.button
231
+ )}
232
+ href={revertURL()}
233
+ >
234
+ {localization().I_DIDNT_MAKE_THIS_CHANGE}
235
+ </Button>
236
+ </Section>
237
+ )}
238
+ </Show>
239
+
240
+ <Hr
241
+ class={cn(
242
+ "my-6 w-full border border-border border-solid",
243
+ props.classNames?.separator
244
+ )}
245
+ />
246
+
247
+ <Show when={props.appName}>
248
+ {(appName) => (
249
+ <Text
250
+ class={cn(
251
+ "mb-3 text-muted-foreground text-xs",
252
+ props.classNames?.description
253
+ )}
254
+ >
255
+ {localization().EMAIL_SENT_BY.replace(
256
+ "{appName}",
257
+ appName()
258
+ )}
259
+ </Text>
260
+ )}
261
+ </Show>
262
+
263
+ <Text
264
+ class={cn(
265
+ "mt-3 text-muted-foreground text-xs",
266
+ props.classNames?.description
267
+ )}
268
+ >
269
+ {supportText()}
270
+ </Text>
271
+
272
+ <Show when={props.poweredBy}>
273
+ <Text
274
+ class={cn(
275
+ "mt-4 mb-0 text-center text-[11px] text-muted-foreground",
276
+ props.classNames?.poweredBy
277
+ )}
278
+ >
279
+ {localization().POWERED_BY_BETTER_AUTH.replace(
280
+ "{betterAuth}",
281
+ "better-auth"
282
+ )}
283
+ </Text>
284
+ </Show>
285
+ </Section>
286
+ </Container>
287
+ </Body>
288
+ </Tailwind>
289
+ </Html>
290
+ )
291
+ }
292
+
293
+ EmailChangedEmail.localization = emailChangedEmailLocalization
294
+
295
+ EmailChangedEmail.PreviewProps = {
296
+ oldEmail: "old@example.com",
297
+ newEmail: "new@example.com",
298
+ supportEmail: "support@example.com",
299
+ revertURL: "https://better-auth-ui.com/auth/revert-email?token=example-token",
300
+ appName: "Better Auth",
301
+ poweredBy: true,
302
+ darkMode: true
303
+ } satisfies EmailChangedEmailProps
304
+
305
+ export default EmailChangedEmail
@@ -0,0 +1,139 @@
1
+ export const defaultColors = {
2
+ light: {
3
+ background: "#F5F5F5",
4
+ border: "#E5E5E5",
5
+ card: "#FFFFFF",
6
+ cardForeground: "#0A0A0A",
7
+ foreground: "#262626",
8
+ muted: "#F5F5F5",
9
+ mutedForeground: "#737373",
10
+ primary: "#171717",
11
+ primaryForeground: "#FAFAFA"
12
+ },
13
+ dark: {
14
+ background: "#0A0A0A",
15
+ border: "#2E2E2E",
16
+ card: "#171717",
17
+ cardForeground: "#FAFAFA",
18
+ foreground: "#D4D4D4",
19
+ muted: "#212121",
20
+ mutedForeground: "#A1A1A1",
21
+ primary: "#E5E5E5",
22
+ primaryForeground: "#171717"
23
+ }
24
+ }
25
+
26
+ export type EmailClassNames = {
27
+ body?: string
28
+ container?: string
29
+ card?: string
30
+ logo?: string
31
+ title?: string
32
+ content?: string
33
+ button?: string
34
+ description?: string
35
+ separator?: string
36
+ link?: string
37
+ poweredBy?: string
38
+ codeBlock?: string
39
+ }
40
+
41
+ export type EmailColors = {
42
+ light?: Partial<typeof defaultColors.light>
43
+ dark?: Partial<typeof defaultColors.dark>
44
+ }
45
+
46
+ type EmailStylesProps = {
47
+ colors?: EmailColors
48
+ darkMode?: boolean
49
+ }
50
+
51
+ export function EmailStyles(props: EmailStylesProps) {
52
+ const darkMode = () => props.darkMode ?? true
53
+
54
+ return (
55
+ <style type="text/css">{`
56
+ .font-sans {
57
+ font-family: Arial, Helvetica, sans-serif !important;
58
+ }
59
+ .bg-background {
60
+ background-color: ${props.colors?.light?.background || defaultColors.light.background} !important;
61
+ }
62
+ .bg-card {
63
+ background-color: ${props.colors?.light?.card || defaultColors.light.card} !important;
64
+ }
65
+ .bg-primary {
66
+ background-color: ${props.colors?.light?.primary || defaultColors.light.primary} !important;
67
+ }
68
+ .bg-muted {
69
+ background-color: ${props.colors?.light?.muted || defaultColors.light.muted} !important;
70
+ }
71
+ .border-border {
72
+ border-color: ${props.colors?.light?.border || defaultColors.light.border} !important;
73
+ }
74
+ .text-card-foreground {
75
+ color: ${props.colors?.light?.cardForeground || defaultColors.light.cardForeground} !important;
76
+ }
77
+ .text-muted-foreground {
78
+ color: ${props.colors?.light?.mutedForeground || defaultColors.light.mutedForeground} !important;
79
+ }
80
+ .text-primary {
81
+ color: ${props.colors?.light?.primary || defaultColors.light.primary} !important;
82
+ }
83
+ .text-primary-foreground {
84
+ color: ${props.colors?.light?.primaryForeground || defaultColors.light.primaryForeground} !important;
85
+ }
86
+ .logo-dark {
87
+ display: none !important;
88
+ }
89
+ .logo-light {
90
+ display: block !important;
91
+ }
92
+
93
+ ${
94
+ darkMode()
95
+ ? `@media (prefers-color-scheme: dark) {
96
+ .bg-background {
97
+ background-color: ${props.colors?.dark?.background || defaultColors.dark.background} !important;
98
+ }
99
+ .bg-card {
100
+ background-color: ${props.colors?.dark?.card || defaultColors.dark.card} !important;
101
+ }
102
+ .bg-primary {
103
+ background-color: ${props.colors?.dark?.primary || defaultColors.dark.primary} !important;
104
+ }
105
+ .bg-muted {
106
+ background-color: ${props.colors?.dark?.muted || defaultColors.dark.muted} !important;
107
+ }
108
+ .border-border {
109
+ border-color: ${props.colors?.dark?.border || defaultColors.dark.border} !important;
110
+ }
111
+ .text-card-foreground {
112
+ color: ${props.colors?.dark?.cardForeground || defaultColors.dark.cardForeground} !important;
113
+ }
114
+ .text-muted-foreground {
115
+ color: ${props.colors?.dark?.mutedForeground || defaultColors.dark.mutedForeground} !important;
116
+ }
117
+ .text-primary {
118
+ color: ${props.colors?.dark?.primary || defaultColors.dark.primary} !important;
119
+ }
120
+ .text-primary-foreground {
121
+ color: ${props.colors?.dark?.primaryForeground || defaultColors.dark.primaryForeground} !important;
122
+ }
123
+ .logo-dark {
124
+ display: block !important;
125
+ }
126
+ .logo-light {
127
+ display: none !important;
128
+ }
129
+ * {
130
+ box-shadow: none !important;
131
+ }
132
+ }`
133
+ : ""
134
+ }
135
+ `}</style>
136
+ )
137
+ }
138
+
139
+ export default EmailStyles