@authrim/sveltekit 0.1.0

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 (266) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +531 -0
  3. package/dist/__tests__/client-events.test.d.ts +2 -0
  4. package/dist/__tests__/client-events.test.d.ts.map +1 -0
  5. package/dist/__tests__/client-events.test.js +225 -0
  6. package/dist/__tests__/providers.test.d.ts +2 -0
  7. package/dist/__tests__/providers.test.d.ts.map +1 -0
  8. package/dist/__tests__/providers.test.js +68 -0
  9. package/dist/__tests__/response.test.d.ts +2 -0
  10. package/dist/__tests__/response.test.d.ts.map +1 -0
  11. package/dist/__tests__/response.test.js +99 -0
  12. package/dist/__tests__/stores.test.d.ts +2 -0
  13. package/dist/__tests__/stores.test.d.ts.map +1 -0
  14. package/dist/__tests__/stores.test.js +91 -0
  15. package/dist/client.d.ts +25 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +411 -0
  18. package/dist/components/AuthProvider.svelte +56 -0
  19. package/dist/components/AuthProvider.svelte.d.ts +34 -0
  20. package/dist/components/AuthProvider.svelte.d.ts.map +1 -0
  21. package/dist/components/ProtectedRoute.svelte +71 -0
  22. package/dist/components/ProtectedRoute.svelte.d.ts +38 -0
  23. package/dist/components/ProtectedRoute.svelte.d.ts.map +1 -0
  24. package/dist/components/SignInButton.svelte +93 -0
  25. package/dist/components/SignInButton.svelte.d.ts +43 -0
  26. package/dist/components/SignInButton.svelte.d.ts.map +1 -0
  27. package/dist/components/SignOutButton.svelte +72 -0
  28. package/dist/components/SignOutButton.svelte.d.ts +40 -0
  29. package/dist/components/SignOutButton.svelte.d.ts.map +1 -0
  30. package/dist/components/UserProfile.svelte +71 -0
  31. package/dist/components/UserProfile.svelte.d.ts +51 -0
  32. package/dist/components/UserProfile.svelte.d.ts.map +1 -0
  33. package/dist/components/index.d.ts +6 -0
  34. package/dist/components/index.d.ts.map +1 -0
  35. package/dist/components/index.js +5 -0
  36. package/dist/direct-auth/ciba.d.ts +47 -0
  37. package/dist/direct-auth/ciba.d.ts.map +1 -0
  38. package/dist/direct-auth/ciba.js +77 -0
  39. package/dist/direct-auth/consent.d.ts +85 -0
  40. package/dist/direct-auth/consent.d.ts.map +1 -0
  41. package/dist/direct-auth/consent.js +57 -0
  42. package/dist/direct-auth/device-flow.d.ts +40 -0
  43. package/dist/direct-auth/device-flow.d.ts.map +1 -0
  44. package/dist/direct-auth/device-flow.js +45 -0
  45. package/dist/direct-auth/email-code.d.ts +48 -0
  46. package/dist/direct-auth/email-code.d.ts.map +1 -0
  47. package/dist/direct-auth/email-code.js +265 -0
  48. package/dist/direct-auth/index.d.ts +9 -0
  49. package/dist/direct-auth/index.d.ts.map +1 -0
  50. package/dist/direct-auth/index.js +8 -0
  51. package/dist/direct-auth/login-challenge.d.ts +41 -0
  52. package/dist/direct-auth/login-challenge.d.ts.map +1 -0
  53. package/dist/direct-auth/login-challenge.js +34 -0
  54. package/dist/direct-auth/passkey.d.ts +30 -0
  55. package/dist/direct-auth/passkey.d.ts.map +1 -0
  56. package/dist/direct-auth/passkey.js +392 -0
  57. package/dist/direct-auth/session.d.ts +48 -0
  58. package/dist/direct-auth/session.d.ts.map +1 -0
  59. package/dist/direct-auth/session.js +219 -0
  60. package/dist/direct-auth/social.d.ts +56 -0
  61. package/dist/direct-auth/social.d.ts.map +1 -0
  62. package/dist/direct-auth/social.js +484 -0
  63. package/dist/index.d.ts +17 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +14 -0
  66. package/dist/providers/crypto.d.ts +13 -0
  67. package/dist/providers/crypto.d.ts.map +1 -0
  68. package/dist/providers/crypto.js +27 -0
  69. package/dist/providers/http.d.ts +30 -0
  70. package/dist/providers/http.d.ts.map +1 -0
  71. package/dist/providers/http.js +65 -0
  72. package/dist/providers/index.d.ts +4 -0
  73. package/dist/providers/index.d.ts.map +1 -0
  74. package/dist/providers/index.js +3 -0
  75. package/dist/providers/storage.d.ts +21 -0
  76. package/dist/providers/storage.d.ts.map +1 -0
  77. package/dist/providers/storage.js +83 -0
  78. package/dist/server/handle.d.ts +46 -0
  79. package/dist/server/handle.d.ts.map +1 -0
  80. package/dist/server/handle.js +60 -0
  81. package/dist/server/index.d.ts +4 -0
  82. package/dist/server/index.d.ts.map +1 -0
  83. package/dist/server/index.js +3 -0
  84. package/dist/server/load.d.ts +83 -0
  85. package/dist/server/load.d.ts.map +1 -0
  86. package/dist/server/load.js +86 -0
  87. package/dist/server/session.d.ts +44 -0
  88. package/dist/server/session.d.ts.map +1 -0
  89. package/dist/server/session.js +50 -0
  90. package/dist/stores/auth.d.ts +56 -0
  91. package/dist/stores/auth.d.ts.map +1 -0
  92. package/dist/stores/auth.js +64 -0
  93. package/dist/stores/index.d.ts +2 -0
  94. package/dist/stores/index.d.ts.map +1 -0
  95. package/dist/stores/index.js +1 -0
  96. package/dist/types.d.ts +164 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +4 -0
  99. package/dist/ui/account/LinkAccountButton.svelte +133 -0
  100. package/dist/ui/account/LinkAccountButton.svelte.d.ts +37 -0
  101. package/dist/ui/account/LinkAccountButton.svelte.d.ts.map +1 -0
  102. package/dist/ui/account/LinkedAccountsList.svelte +233 -0
  103. package/dist/ui/account/LinkedAccountsList.svelte.d.ts +32 -0
  104. package/dist/ui/account/LinkedAccountsList.svelte.d.ts.map +1 -0
  105. package/dist/ui/account/UnlinkAccountButton.svelte +179 -0
  106. package/dist/ui/account/UnlinkAccountButton.svelte.d.ts +28 -0
  107. package/dist/ui/account/UnlinkAccountButton.svelte.d.ts.map +1 -0
  108. package/dist/ui/account/index.d.ts +7 -0
  109. package/dist/ui/account/index.d.ts.map +1 -0
  110. package/dist/ui/account/index.js +6 -0
  111. package/dist/ui/context.d.ts +17 -0
  112. package/dist/ui/context.d.ts.map +1 -0
  113. package/dist/ui/context.js +71 -0
  114. package/dist/ui/forms/CIBARequestCard.svelte +315 -0
  115. package/dist/ui/forms/CIBARequestCard.svelte.d.ts +50 -0
  116. package/dist/ui/forms/CIBARequestCard.svelte.d.ts.map +1 -0
  117. package/dist/ui/forms/ClientInfo.svelte +232 -0
  118. package/dist/ui/forms/ClientInfo.svelte.d.ts +35 -0
  119. package/dist/ui/forms/ClientInfo.svelte.d.ts.map +1 -0
  120. package/dist/ui/forms/ConsentScopesList.svelte +109 -0
  121. package/dist/ui/forms/ConsentScopesList.svelte.d.ts +30 -0
  122. package/dist/ui/forms/ConsentScopesList.svelte.d.ts.map +1 -0
  123. package/dist/ui/forms/EmailCodeForm.svelte +224 -0
  124. package/dist/ui/forms/EmailCodeForm.svelte.d.ts +39 -0
  125. package/dist/ui/forms/EmailCodeForm.svelte.d.ts.map +1 -0
  126. package/dist/ui/forms/OrgSelector.svelte +95 -0
  127. package/dist/ui/forms/OrgSelector.svelte.d.ts +37 -0
  128. package/dist/ui/forms/OrgSelector.svelte.d.ts.map +1 -0
  129. package/dist/ui/forms/PasskeyConditionalInput.svelte +173 -0
  130. package/dist/ui/forms/PasskeyConditionalInput.svelte.d.ts +36 -0
  131. package/dist/ui/forms/PasskeyConditionalInput.svelte.d.ts.map +1 -0
  132. package/dist/ui/forms/QRCodeDisplay.svelte +122 -0
  133. package/dist/ui/forms/QRCodeDisplay.svelte.d.ts +27 -0
  134. package/dist/ui/forms/QRCodeDisplay.svelte.d.ts.map +1 -0
  135. package/dist/ui/forms/SocialLoginButtons.svelte +209 -0
  136. package/dist/ui/forms/SocialLoginButtons.svelte.d.ts +33 -0
  137. package/dist/ui/forms/SocialLoginButtons.svelte.d.ts.map +1 -0
  138. package/dist/ui/forms/UserCodeInput.svelte +183 -0
  139. package/dist/ui/forms/UserCodeInput.svelte.d.ts +34 -0
  140. package/dist/ui/forms/UserCodeInput.svelte.d.ts.map +1 -0
  141. package/dist/ui/forms/index.d.ts +13 -0
  142. package/dist/ui/forms/index.d.ts.map +1 -0
  143. package/dist/ui/forms/index.js +12 -0
  144. package/dist/ui/helpers/AuthError.svelte +124 -0
  145. package/dist/ui/helpers/AuthError.svelte.d.ts +26 -0
  146. package/dist/ui/helpers/AuthError.svelte.d.ts.map +1 -0
  147. package/dist/ui/helpers/AuthLoading.svelte +83 -0
  148. package/dist/ui/helpers/AuthLoading.svelte.d.ts +25 -0
  149. package/dist/ui/helpers/AuthLoading.svelte.d.ts.map +1 -0
  150. package/dist/ui/helpers/OTPInput.svelte +214 -0
  151. package/dist/ui/helpers/OTPInput.svelte.d.ts +34 -0
  152. package/dist/ui/helpers/OTPInput.svelte.d.ts.map +1 -0
  153. package/dist/ui/helpers/ResendCodeButton.svelte +140 -0
  154. package/dist/ui/helpers/ResendCodeButton.svelte.d.ts +28 -0
  155. package/dist/ui/helpers/ResendCodeButton.svelte.d.ts.map +1 -0
  156. package/dist/ui/helpers/index.d.ts +8 -0
  157. package/dist/ui/helpers/index.d.ts.map +1 -0
  158. package/dist/ui/helpers/index.js +7 -0
  159. package/dist/ui/index.d.ts +43 -0
  160. package/dist/ui/index.d.ts.map +1 -0
  161. package/dist/ui/index.js +48 -0
  162. package/dist/ui/passkey/PasskeyDeleteButton.svelte +177 -0
  163. package/dist/ui/passkey/PasskeyDeleteButton.svelte.d.ts +26 -0
  164. package/dist/ui/passkey/PasskeyDeleteButton.svelte.d.ts.map +1 -0
  165. package/dist/ui/passkey/PasskeyList.svelte +225 -0
  166. package/dist/ui/passkey/PasskeyList.svelte.d.ts +30 -0
  167. package/dist/ui/passkey/PasskeyList.svelte.d.ts.map +1 -0
  168. package/dist/ui/passkey/PasskeyRegisterButton.svelte +52 -0
  169. package/dist/ui/passkey/PasskeyRegisterButton.svelte.d.ts +38 -0
  170. package/dist/ui/passkey/PasskeyRegisterButton.svelte.d.ts.map +1 -0
  171. package/dist/ui/passkey/index.d.ts +7 -0
  172. package/dist/ui/passkey/index.d.ts.map +1 -0
  173. package/dist/ui/passkey/index.js +6 -0
  174. package/dist/ui/session/SessionExpiryIndicator.svelte +109 -0
  175. package/dist/ui/session/SessionExpiryIndicator.svelte.d.ts +23 -0
  176. package/dist/ui/session/SessionExpiryIndicator.svelte.d.ts.map +1 -0
  177. package/dist/ui/session/SessionList.svelte +231 -0
  178. package/dist/ui/session/SessionList.svelte.d.ts +31 -0
  179. package/dist/ui/session/SessionList.svelte.d.ts.map +1 -0
  180. package/dist/ui/session/SessionRevokeButton.svelte +72 -0
  181. package/dist/ui/session/SessionRevokeButton.svelte.d.ts +26 -0
  182. package/dist/ui/session/SessionRevokeButton.svelte.d.ts.map +1 -0
  183. package/dist/ui/session/index.d.ts +7 -0
  184. package/dist/ui/session/index.d.ts.map +1 -0
  185. package/dist/ui/session/index.js +6 -0
  186. package/dist/ui/shared/Alert.svelte +246 -0
  187. package/dist/ui/shared/Alert.svelte.d.ts +36 -0
  188. package/dist/ui/shared/Alert.svelte.d.ts.map +1 -0
  189. package/dist/ui/shared/Badge.svelte +100 -0
  190. package/dist/ui/shared/Badge.svelte.d.ts +35 -0
  191. package/dist/ui/shared/Badge.svelte.d.ts.map +1 -0
  192. package/dist/ui/shared/Button.svelte +213 -0
  193. package/dist/ui/shared/Button.svelte.d.ts +42 -0
  194. package/dist/ui/shared/Button.svelte.d.ts.map +1 -0
  195. package/dist/ui/shared/Card.svelte +85 -0
  196. package/dist/ui/shared/Card.svelte.d.ts +39 -0
  197. package/dist/ui/shared/Card.svelte.d.ts.map +1 -0
  198. package/dist/ui/shared/CountdownTimer.svelte +150 -0
  199. package/dist/ui/shared/CountdownTimer.svelte.d.ts +30 -0
  200. package/dist/ui/shared/CountdownTimer.svelte.d.ts.map +1 -0
  201. package/dist/ui/shared/Dialog.svelte +240 -0
  202. package/dist/ui/shared/Dialog.svelte.d.ts +39 -0
  203. package/dist/ui/shared/Dialog.svelte.d.ts.map +1 -0
  204. package/dist/ui/shared/Input.svelte +192 -0
  205. package/dist/ui/shared/Input.svelte.d.ts +42 -0
  206. package/dist/ui/shared/Input.svelte.d.ts.map +1 -0
  207. package/dist/ui/shared/LanguageSwitcher.svelte +99 -0
  208. package/dist/ui/shared/LanguageSwitcher.svelte.d.ts +31 -0
  209. package/dist/ui/shared/LanguageSwitcher.svelte.d.ts.map +1 -0
  210. package/dist/ui/shared/Spinner.svelte +75 -0
  211. package/dist/ui/shared/Spinner.svelte.d.ts +24 -0
  212. package/dist/ui/shared/Spinner.svelte.d.ts.map +1 -0
  213. package/dist/ui/shared/index.d.ts +13 -0
  214. package/dist/ui/shared/index.d.ts.map +1 -0
  215. package/dist/ui/shared/index.js +12 -0
  216. package/dist/ui/styles/base.css +168 -0
  217. package/dist/ui/styles/theme.css +279 -0
  218. package/dist/ui/templates/AccountSettingsTemplate.svelte +205 -0
  219. package/dist/ui/templates/AccountSettingsTemplate.svelte.d.ts +49 -0
  220. package/dist/ui/templates/AccountSettingsTemplate.svelte.d.ts.map +1 -0
  221. package/dist/ui/templates/CIBATemplate.svelte +227 -0
  222. package/dist/ui/templates/CIBATemplate.svelte.d.ts +45 -0
  223. package/dist/ui/templates/CIBATemplate.svelte.d.ts.map +1 -0
  224. package/dist/ui/templates/ConsentTemplate.svelte +549 -0
  225. package/dist/ui/templates/ConsentTemplate.svelte.d.ts +76 -0
  226. package/dist/ui/templates/ConsentTemplate.svelte.d.ts.map +1 -0
  227. package/dist/ui/templates/DeviceFlowTemplate.svelte +228 -0
  228. package/dist/ui/templates/DeviceFlowTemplate.svelte.d.ts +47 -0
  229. package/dist/ui/templates/DeviceFlowTemplate.svelte.d.ts.map +1 -0
  230. package/dist/ui/templates/LoginTemplate.svelte +234 -0
  231. package/dist/ui/templates/LoginTemplate.svelte.d.ts +49 -0
  232. package/dist/ui/templates/LoginTemplate.svelte.d.ts.map +1 -0
  233. package/dist/ui/templates/ReauthTemplate.svelte +269 -0
  234. package/dist/ui/templates/ReauthTemplate.svelte.d.ts +54 -0
  235. package/dist/ui/templates/ReauthTemplate.svelte.d.ts.map +1 -0
  236. package/dist/ui/templates/SignUpTemplate.svelte +345 -0
  237. package/dist/ui/templates/SignUpTemplate.svelte.d.ts +53 -0
  238. package/dist/ui/templates/SignUpTemplate.svelte.d.ts.map +1 -0
  239. package/dist/ui/templates/index.d.ts +14 -0
  240. package/dist/ui/templates/index.d.ts.map +1 -0
  241. package/dist/ui/templates/index.js +13 -0
  242. package/dist/ui/types.d.ts +151 -0
  243. package/dist/ui/types.d.ts.map +1 -0
  244. package/dist/ui/types.js +4 -0
  245. package/dist/utils/context.d.ts +12 -0
  246. package/dist/utils/context.d.ts.map +1 -0
  247. package/dist/utils/context.js +26 -0
  248. package/dist/utils/error-mapping.d.ts +29 -0
  249. package/dist/utils/error-mapping.d.ts.map +1 -0
  250. package/dist/utils/error-mapping.js +38 -0
  251. package/dist/utils/index.d.ts +7 -0
  252. package/dist/utils/index.d.ts.map +1 -0
  253. package/dist/utils/index.js +6 -0
  254. package/dist/utils/response.d.ts +21 -0
  255. package/dist/utils/response.d.ts.map +1 -0
  256. package/dist/utils/response.js +84 -0
  257. package/dist/utils/sensitive-data.d.ts +9 -0
  258. package/dist/utils/sensitive-data.d.ts.map +1 -0
  259. package/dist/utils/sensitive-data.js +56 -0
  260. package/dist/utils/ssr.d.ts +38 -0
  261. package/dist/utils/ssr.d.ts.map +1 -0
  262. package/dist/utils/ssr.js +73 -0
  263. package/dist/utils/webauthn-converters.d.ts +9 -0
  264. package/dist/utils/webauthn-converters.d.ts.map +1 -0
  265. package/dist/utils/webauthn-converters.js +75 -0
  266. package/package.json +111 -0
@@ -0,0 +1,269 @@
1
+ <!--
2
+ ReauthTemplate
3
+ - 再認証UIの枠を提供する
4
+ - 認証方法選択と実行はSDK側に委譲する
5
+ -->
6
+ <script lang="ts">
7
+ import { createEventDispatcher } from "svelte";
8
+ import type { SocialProvider } from "../../types.js";
9
+ import Card from "../shared/Card.svelte";
10
+ import Button from "../shared/Button.svelte";
11
+ import Alert from "../shared/Alert.svelte";
12
+
13
+ // State
14
+ export let loading = false;
15
+ export let error = "";
16
+ export let challengeId = "";
17
+
18
+ // Available re-auth methods
19
+ export let enablePasskey = true;
20
+ export let enableEmailCode = true;
21
+ export let enablePassword = false;
22
+ export let availableProviders: SocialProvider[] = [];
23
+
24
+ // Labels (i18n)
25
+ export let title = "Re-authentication Required";
26
+ export let subtitle =
27
+ "For security reasons, you need to confirm your identity";
28
+ export let passkeyLabel = "Continue with Passkey";
29
+ export let emailCodeLabel = "Send verification code";
30
+ export let passwordLabel = "Continue with password";
31
+ export let confirmLabel = "Continue";
32
+ export let infoText =
33
+ "This confirmation is required to ensure the security of your account.";
34
+
35
+ let className = "";
36
+ export { className as class };
37
+
38
+ const dispatch = createEventDispatcher<{
39
+ "passkey-reauth": { challengeId: string };
40
+ "email-code-reauth": { challengeId: string };
41
+ "password-reauth": { challengeId: string };
42
+ "social-reauth": { challengeId: string; provider: SocialProvider };
43
+ confirm: { challengeId: string };
44
+ "dismiss-error": void;
45
+ }>();
46
+
47
+ $: hasMethods =
48
+ enablePasskey ||
49
+ enableEmailCode ||
50
+ enablePassword ||
51
+ availableProviders.length > 0;
52
+ </script>
53
+
54
+ <div class="authrim-reauth-template {className}">
55
+ <Card padding="lg" shadow="lg" class="authrim-reauth-template__card">
56
+ <!-- Header -->
57
+ <div class="authrim-reauth-template__header">
58
+ <div class="authrim-reauth-template__icon">
59
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
60
+ <path
61
+ fill-rule="evenodd"
62
+ d="M12.516 2.17a.75.75 0 00-1.032 0 11.209 11.209 0 01-7.877 3.08.75.75 0 00-.722.515A12.74 12.74 0 002.25 9.75c0 5.942 4.064 10.932 9.563 12.348a.749.749 0 00.374 0c5.499-1.416 9.563-6.406 9.563-12.348 0-1.39-.223-2.73-.635-3.985a.75.75 0 00-.722-.516l-.143.001c-2.996 0-5.717-1.17-7.734-3.08zm3.094 8.016a.75.75 0 10-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 00-1.06 1.06l2.25 2.25a.75.75 0 001.14-.094l3.75-5.25z"
63
+ clip-rule="evenodd"
64
+ />
65
+ </svg>
66
+ </div>
67
+ <h1 class="authrim-reauth-template__title">{title}</h1>
68
+ <p class="authrim-reauth-template__subtitle">{subtitle}</p>
69
+ </div>
70
+
71
+ <!-- Error -->
72
+ {#if error}
73
+ <Alert
74
+ variant="error"
75
+ dismissible
76
+ on:dismiss={() => dispatch("dismiss-error")}
77
+ >
78
+ {error}
79
+ </Alert>
80
+ {/if}
81
+
82
+ <!-- Auth methods -->
83
+ <div class="authrim-reauth-template__methods">
84
+ {#if hasMethods}
85
+ {#if enablePasskey}
86
+ <Button
87
+ variant="primary"
88
+ size="lg"
89
+ fullWidth
90
+ {loading}
91
+ on:click={() => dispatch("passkey-reauth", { challengeId })}
92
+ >
93
+ <svg
94
+ viewBox="0 0 20 20"
95
+ fill="currentColor"
96
+ style="width: 20px; height: 20px;"
97
+ aria-hidden="true"
98
+ >
99
+ <path
100
+ fill-rule="evenodd"
101
+ d="M8 7a5 5 0 113.61 4.804l-1.903 1.903A.75.75 0 019.22 14H8v1a.75.75 0 01-.75.75h-1.5V17a.75.75 0 01-.75.75H3.25a.75.75 0 01-.75-.75v-1.104a.75.75 0 01.22-.53l5.442-5.442A5.03 5.03 0 018 7zm5-3a.75.75 0 000 1.5A1.5 1.5 0 0114.5 7 .75.75 0 0016 7a3 3 0 00-3-3z"
102
+ clip-rule="evenodd"
103
+ />
104
+ </svg>
105
+ {passkeyLabel}
106
+ </Button>
107
+ {/if}
108
+
109
+ {#if enableEmailCode}
110
+ <Button
111
+ variant={enablePasskey ? "secondary" : "primary"}
112
+ size="lg"
113
+ fullWidth
114
+ disabled={loading}
115
+ on:click={() => dispatch("email-code-reauth", { challengeId })}
116
+ >
117
+ <svg
118
+ viewBox="0 0 20 20"
119
+ fill="currentColor"
120
+ style="width: 20px; height: 20px;"
121
+ aria-hidden="true"
122
+ >
123
+ <path
124
+ d="M3 4a2 2 0 00-2 2v1.161l8.441 4.221a1.25 1.25 0 001.118 0L19 7.161V6a2 2 0 00-2-2H3z"
125
+ />
126
+ <path
127
+ d="M19 8.839l-7.77 3.885a2.75 2.75 0 01-2.46 0L1 8.839V14a2 2 0 002 2h14a2 2 0 002-2V8.839z"
128
+ />
129
+ </svg>
130
+ {emailCodeLabel}
131
+ </Button>
132
+ {/if}
133
+
134
+ {#if enablePassword}
135
+ <Button
136
+ variant="secondary"
137
+ size="lg"
138
+ fullWidth
139
+ disabled={loading}
140
+ on:click={() => dispatch("password-reauth", { challengeId })}
141
+ >
142
+ {passwordLabel}
143
+ </Button>
144
+ {/if}
145
+
146
+ {#if availableProviders.length > 0}
147
+ <div class="authrim-reauth-template__divider">
148
+ <span>or</span>
149
+ </div>
150
+ {#each availableProviders as provider (provider)}
151
+ <Button
152
+ variant="outline"
153
+ size="lg"
154
+ fullWidth
155
+ disabled={loading}
156
+ on:click={() =>
157
+ dispatch("social-reauth", { challengeId, provider })}
158
+ >
159
+ Continue with {provider.charAt(0).toUpperCase() +
160
+ provider.slice(1)}
161
+ </Button>
162
+ {/each}
163
+ {/if}
164
+ {:else}
165
+ <!-- Simple confirm button (fallback) -->
166
+ <Button
167
+ variant="primary"
168
+ size="lg"
169
+ fullWidth
170
+ {loading}
171
+ disabled={!challengeId}
172
+ on:click={() => dispatch("confirm", { challengeId })}
173
+ >
174
+ {confirmLabel}
175
+ </Button>
176
+ {/if}
177
+ </div>
178
+
179
+ <!-- Info text -->
180
+ <p class="authrim-reauth-template__info">{infoText}</p>
181
+ </Card>
182
+ </div>
183
+
184
+ <style>
185
+ .authrim-reauth-template {
186
+ display: flex;
187
+ justify-content: center;
188
+ align-items: center;
189
+ min-height: 100vh;
190
+ padding: var(--authrim-space-4);
191
+ background: linear-gradient(
192
+ 135deg,
193
+ var(--authrim-color-bg-subtle) 0%,
194
+ var(--authrim-color-bg) 100%
195
+ );
196
+ }
197
+
198
+ :global(.authrim-reauth-template__card) {
199
+ width: 100%;
200
+ max-width: 420px;
201
+ }
202
+
203
+ .authrim-reauth-template__header {
204
+ text-align: center;
205
+ margin-bottom: var(--authrim-space-6);
206
+ }
207
+
208
+ .authrim-reauth-template__icon {
209
+ width: 64px;
210
+ height: 64px;
211
+ margin: 0 auto var(--authrim-space-4);
212
+ padding: var(--authrim-space-4);
213
+ background: var(--authrim-color-bg-subtle);
214
+ border-radius: var(--authrim-radius-full);
215
+ color: var(--authrim-color-primary);
216
+ }
217
+
218
+ .authrim-reauth-template__icon svg {
219
+ width: 100%;
220
+ height: 100%;
221
+ }
222
+
223
+ .authrim-reauth-template__title {
224
+ margin: 0 0 var(--authrim-space-2);
225
+ font-family: var(--authrim-font-sans);
226
+ font-size: var(--authrim-text-2xl);
227
+ font-weight: 700;
228
+ color: var(--authrim-color-text);
229
+ letter-spacing: var(--authrim-tracking-tight);
230
+ }
231
+
232
+ .authrim-reauth-template__subtitle {
233
+ margin: 0;
234
+ font-family: var(--authrim-font-sans);
235
+ font-size: var(--authrim-text-sm);
236
+ color: var(--authrim-color-text-secondary);
237
+ }
238
+
239
+ .authrim-reauth-template__methods {
240
+ display: flex;
241
+ flex-direction: column;
242
+ gap: var(--authrim-space-3);
243
+ }
244
+
245
+ .authrim-reauth-template__divider {
246
+ display: flex;
247
+ align-items: center;
248
+ gap: var(--authrim-space-3);
249
+ color: var(--authrim-color-text-muted);
250
+ font-family: var(--authrim-font-sans);
251
+ font-size: var(--authrim-text-sm);
252
+ }
253
+
254
+ .authrim-reauth-template__divider::before,
255
+ .authrim-reauth-template__divider::after {
256
+ content: "";
257
+ flex: 1;
258
+ height: 1px;
259
+ background: var(--authrim-color-border);
260
+ }
261
+
262
+ .authrim-reauth-template__info {
263
+ margin: var(--authrim-space-5) 0 0;
264
+ text-align: center;
265
+ font-family: var(--authrim-font-sans);
266
+ font-size: var(--authrim-text-xs);
267
+ color: var(--authrim-color-text-muted);
268
+ }
269
+ </style>
@@ -0,0 +1,54 @@
1
+ import type { SocialProvider } from "../../types.js";
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const ReauthTemplate: $$__sveltets_2_IsomorphicComponent<{
16
+ loading?: boolean;
17
+ error?: string;
18
+ challengeId?: string;
19
+ enablePasskey?: boolean;
20
+ enableEmailCode?: boolean;
21
+ enablePassword?: boolean;
22
+ availableProviders?: SocialProvider[];
23
+ title?: string;
24
+ subtitle?: string;
25
+ passkeyLabel?: string;
26
+ emailCodeLabel?: string;
27
+ passwordLabel?: string;
28
+ confirmLabel?: string;
29
+ infoText?: string;
30
+ class?: string;
31
+ }, {
32
+ "passkey-reauth": CustomEvent<{
33
+ challengeId: string;
34
+ }>;
35
+ "email-code-reauth": CustomEvent<{
36
+ challengeId: string;
37
+ }>;
38
+ "password-reauth": CustomEvent<{
39
+ challengeId: string;
40
+ }>;
41
+ "social-reauth": CustomEvent<{
42
+ challengeId: string;
43
+ provider: SocialProvider;
44
+ }>;
45
+ confirm: CustomEvent<{
46
+ challengeId: string;
47
+ }>;
48
+ "dismiss-error": CustomEvent<void>;
49
+ } & {
50
+ [evt: string]: CustomEvent<any>;
51
+ }, {}, {}, string>;
52
+ type ReauthTemplate = InstanceType<typeof ReauthTemplate>;
53
+ export default ReauthTemplate;
54
+ //# sourceMappingURL=ReauthTemplate.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReauthTemplate.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/templates/ReauthTemplate.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0IrD,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,cAAc;;;;;;;yBAjB8mB,cAAc,EAAE;;;;;;;;;;;qBAC7mB,MAAM;;;qBACH,MAAM;;;qBACR,MAAM;;;qBACR,MAAM;kBAAY,cAAc;;;qBACxC,MAAM;;;;;kBAYiE,CAAC;AAClF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,eAAe,cAAc,CAAC"}
@@ -0,0 +1,345 @@
1
+ <!--
2
+ SignUpTemplate Component
3
+
4
+ Reference implementation for sign-up screens.
5
+ Copy and customize for production use.
6
+
7
+ @example
8
+ <SignUpTemplate
9
+ availableProviders={['google', 'github']}
10
+ enablePasskey={true}
11
+ on:passkey-signup={handlePasskeySignup}
12
+ on:social-signup={handleSocialSignup}
13
+ on:email-submit={handleEmailSubmit}
14
+ />
15
+ -->
16
+ <script lang="ts">
17
+ import { createEventDispatcher } from 'svelte';
18
+ import type { SocialProvider } from '../../types.js';
19
+ import Card from '../shared/Card.svelte';
20
+ import Button from '../shared/Button.svelte';
21
+ import Input from '../shared/Input.svelte';
22
+ import AuthError from '../helpers/AuthError.svelte';
23
+ import SocialLoginButtons from '../forms/SocialLoginButtons.svelte';
24
+ import OTPInput from '../helpers/OTPInput.svelte';
25
+ import ResendCodeButton from '../helpers/ResendCodeButton.svelte';
26
+
27
+ export let availableProviders: SocialProvider[] = [];
28
+ export let enablePasskey = true;
29
+ export let enableEmailCode = true;
30
+ export let loading = false;
31
+ export let loadingProvider: SocialProvider | undefined = undefined;
32
+ export let error = '';
33
+ export let title = 'Create account';
34
+ export let subtitle = 'Get started with your free account';
35
+ let className = '';
36
+ export { className as class };
37
+
38
+ const dispatch = createEventDispatcher<{
39
+ 'passkey-signup': { name: string };
40
+ 'social-signup': { provider: SocialProvider };
41
+ 'email-submit': { email: string; name: string };
42
+ 'code-submit': { code: string };
43
+ 'code-resend': void;
44
+ 'dismiss-error': void;
45
+ }>();
46
+
47
+ let step: 'form' | 'code' = 'form';
48
+ let name = '';
49
+ let email = '';
50
+ let code = '';
51
+ let resendTime = 0;
52
+
53
+ function handlePasskeySignup() {
54
+ if (name.trim()) {
55
+ dispatch('passkey-signup', { name: name.trim() });
56
+ }
57
+ }
58
+
59
+ function handleSocialClick(e: CustomEvent<{ provider: SocialProvider }>) {
60
+ dispatch('social-signup', e.detail);
61
+ }
62
+
63
+ function handleEmailSubmit() {
64
+ if (email.trim() && name.trim()) {
65
+ dispatch('email-submit', { email: email.trim(), name: name.trim() });
66
+ }
67
+ }
68
+
69
+ function handleCodeComplete(e: CustomEvent<{ value: string }>) {
70
+ code = e.detail.value;
71
+ dispatch('code-submit', { code });
72
+ }
73
+
74
+ function handleBack() {
75
+ step = 'form';
76
+ code = '';
77
+ }
78
+
79
+ export function setStep(newStep: 'form' | 'code') {
80
+ step = newStep;
81
+ }
82
+
83
+ export function setResendTime(time: number) {
84
+ resendTime = time;
85
+ }
86
+ </script>
87
+
88
+ <div class="authrim-signup-template {className}">
89
+ <Card padding="lg" shadow="lg" class="authrim-signup-template__card">
90
+ {#if step === 'form'}
91
+ <div class="authrim-signup-template__header">
92
+ <h1 class="authrim-signup-template__title">{title}</h1>
93
+ <p class="authrim-signup-template__subtitle">{subtitle}</p>
94
+ </div>
95
+
96
+ {#if error}
97
+ <AuthError message={error} on:dismiss={() => dispatch('dismiss-error')} />
98
+ {/if}
99
+
100
+ <div class="authrim-signup-template__content">
101
+ <form on:submit|preventDefault={enablePasskey ? handlePasskeySignup : handleEmailSubmit} class="authrim-signup-template__form">
102
+ <Input
103
+ label="Name"
104
+ placeholder="Your name"
105
+ bind:value={name}
106
+ disabled={loading}
107
+ required
108
+ fullWidth
109
+ size="lg"
110
+ />
111
+
112
+ {#if enableEmailCode && !enablePasskey}
113
+ <Input
114
+ type="email"
115
+ label="Email"
116
+ placeholder="you@example.com"
117
+ bind:value={email}
118
+ disabled={loading}
119
+ required
120
+ fullWidth
121
+ size="lg"
122
+ />
123
+ {/if}
124
+
125
+ {#if enablePasskey}
126
+ <Button type="submit" fullWidth size="lg" {loading} disabled={!name.trim()}>
127
+ Create account with Passkey
128
+ </Button>
129
+ {:else if enableEmailCode}
130
+ <Button type="submit" fullWidth size="lg" {loading} disabled={!name.trim() || !email.trim()}>
131
+ Continue
132
+ </Button>
133
+ {/if}
134
+ </form>
135
+
136
+ {#if availableProviders.length > 0}
137
+ <div class="authrim-signup-template__divider">
138
+ <span>or sign up with</span>
139
+ </div>
140
+
141
+ <SocialLoginButtons
142
+ providers={availableProviders}
143
+ {loading}
144
+ {loadingProvider}
145
+ on:click={handleSocialClick}
146
+ />
147
+ {/if}
148
+ </div>
149
+
150
+ {:else}
151
+ <button type="button" class="authrim-signup-template__back" on:click={handleBack}>
152
+ <svg viewBox="0 0 20 20" fill="currentColor">
153
+ <path fill-rule="evenodd" d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z" clip-rule="evenodd"/>
154
+ </svg>
155
+ Back
156
+ </button>
157
+
158
+ <div class="authrim-signup-template__header">
159
+ <h1 class="authrim-signup-template__title">Verify your email</h1>
160
+ <p class="authrim-signup-template__subtitle">
161
+ We sent a code to <strong>{email}</strong>
162
+ </p>
163
+ </div>
164
+
165
+ {#if error}
166
+ <AuthError message={error} on:dismiss={() => dispatch('dismiss-error')} />
167
+ {/if}
168
+
169
+ <div class="authrim-signup-template__code">
170
+ <OTPInput
171
+ bind:value={code}
172
+ disabled={loading}
173
+ on:complete={handleCodeComplete}
174
+ />
175
+
176
+ <div class="authrim-signup-template__resend">
177
+ <span>Didn't receive the code?</span>
178
+ <ResendCodeButton
179
+ remainingTime={resendTime}
180
+ {loading}
181
+ on:click={() => dispatch('code-resend')}
182
+ />
183
+ </div>
184
+
185
+ <Button
186
+ fullWidth
187
+ size="lg"
188
+ {loading}
189
+ disabled={code.length < 6}
190
+ on:click={() => dispatch('code-submit', { code })}
191
+ >
192
+ Verify
193
+ </Button>
194
+ </div>
195
+ {/if}
196
+ </Card>
197
+
198
+ {#if step === 'form'}
199
+ <div class="authrim-signup-template__footer">
200
+ <slot name="footer">
201
+ <p>
202
+ Already have an account?
203
+ <a href="/login" class="authrim-signup-template__link">Sign in</a>
204
+ </p>
205
+ </slot>
206
+ </div>
207
+ {/if}
208
+ </div>
209
+
210
+ <style>
211
+ .authrim-signup-template {
212
+ display: flex;
213
+ justify-content: center;
214
+ align-items: center;
215
+ min-height: 100vh;
216
+ padding: var(--authrim-space-4);
217
+ background:
218
+ linear-gradient(135deg, var(--authrim-color-bg-subtle) 0%, var(--authrim-color-bg) 100%);
219
+ }
220
+
221
+ :global(.authrim-signup-template__card) {
222
+ width: 100%;
223
+ max-width: 420px;
224
+ }
225
+
226
+ .authrim-signup-template__header {
227
+ text-align: center;
228
+ margin-bottom: var(--authrim-space-6);
229
+ }
230
+
231
+ .authrim-signup-template__title {
232
+ margin: 0 0 var(--authrim-space-2);
233
+ font-size: var(--authrim-text-2xl);
234
+ font-weight: 700;
235
+ color: var(--authrim-color-text);
236
+ letter-spacing: var(--authrim-tracking-tight);
237
+ }
238
+
239
+ .authrim-signup-template__subtitle {
240
+ margin: 0;
241
+ font-size: var(--authrim-text-sm);
242
+ color: var(--authrim-color-text-secondary);
243
+ line-height: var(--authrim-leading-relaxed);
244
+ }
245
+
246
+ .authrim-signup-template__subtitle strong {
247
+ color: var(--authrim-color-text);
248
+ font-weight: 600;
249
+ }
250
+
251
+ .authrim-signup-template__content {
252
+ display: flex;
253
+ flex-direction: column;
254
+ gap: var(--authrim-space-5);
255
+ }
256
+
257
+ .authrim-signup-template__form {
258
+ display: flex;
259
+ flex-direction: column;
260
+ gap: var(--authrim-space-4);
261
+ }
262
+
263
+ .authrim-signup-template__divider {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: var(--authrim-space-3);
267
+ color: var(--authrim-color-text-muted);
268
+ font-size: var(--authrim-text-sm);
269
+ }
270
+
271
+ .authrim-signup-template__divider::before,
272
+ .authrim-signup-template__divider::after {
273
+ content: '';
274
+ flex: 1;
275
+ height: 1px;
276
+ background: var(--authrim-color-border);
277
+ }
278
+
279
+ .authrim-signup-template__back {
280
+ display: inline-flex;
281
+ align-items: center;
282
+ gap: var(--authrim-space-1);
283
+ padding: var(--authrim-space-1) var(--authrim-space-2);
284
+ margin: 0 0 var(--authrim-space-4) calc(-1 * var(--authrim-space-2));
285
+ font-family: var(--authrim-font-sans);
286
+ font-size: var(--authrim-text-sm);
287
+ font-weight: 500;
288
+ color: var(--authrim-color-text-secondary);
289
+ background: transparent;
290
+ border: none;
291
+ border-radius: var(--authrim-radius-sm);
292
+ cursor: pointer;
293
+ transition:
294
+ color var(--authrim-duration-fast) var(--authrim-ease-default),
295
+ background-color var(--authrim-duration-fast) var(--authrim-ease-default);
296
+ }
297
+
298
+ .authrim-signup-template__back:hover {
299
+ color: var(--authrim-color-text);
300
+ background: var(--authrim-color-bg-subtle);
301
+ }
302
+
303
+ .authrim-signup-template__back svg {
304
+ width: 18px;
305
+ height: 18px;
306
+ }
307
+
308
+ .authrim-signup-template__code {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: var(--authrim-space-5);
312
+ }
313
+
314
+ .authrim-signup-template__resend {
315
+ display: flex;
316
+ align-items: center;
317
+ justify-content: center;
318
+ gap: var(--authrim-space-1);
319
+ flex-wrap: wrap;
320
+ font-size: var(--authrim-text-sm);
321
+ color: var(--authrim-color-text-muted);
322
+ }
323
+
324
+ .authrim-signup-template__footer {
325
+ text-align: center;
326
+ font-size: var(--authrim-text-sm);
327
+ color: var(--authrim-color-text-secondary);
328
+ }
329
+
330
+ .authrim-signup-template__footer p {
331
+ margin: 0;
332
+ }
333
+
334
+ .authrim-signup-template__link {
335
+ color: var(--authrim-color-primary);
336
+ font-weight: 500;
337
+ text-decoration: none;
338
+ transition: color var(--authrim-duration-fast) var(--authrim-ease-default);
339
+ }
340
+
341
+ .authrim-signup-template__link:hover {
342
+ color: var(--authrim-color-primary-hover);
343
+ text-decoration: underline;
344
+ }
345
+ </style>