@keycloakify/svelte 0.0.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/account/DefaultPage.svelte +42 -0
  4. package/dist/account/DefaultPage.svelte.d.ts +6 -0
  5. package/dist/account/KcContext/KcContext.d.ts +1 -0
  6. package/dist/account/KcContext/KcContext.js +1 -0
  7. package/dist/account/KcContext/index.d.ts +1 -0
  8. package/dist/account/KcContext/index.js +1 -0
  9. package/dist/account/Template.svelte +143 -0
  10. package/dist/account/Template.svelte.d.ts +6 -0
  11. package/dist/account/Template.useInitialize.d.ts +12 -0
  12. package/dist/account/Template.useInitialize.js +19 -0
  13. package/dist/account/TemplateProps.d.ts +12 -0
  14. package/dist/account/TemplateProps.js +1 -0
  15. package/dist/account/i18n/i18n.d.ts +15 -0
  16. package/dist/account/i18n/i18n.js +1 -0
  17. package/dist/account/i18n/i18nBuilder.d.ts +18 -0
  18. package/dist/account/i18n/i18nBuilder.js +26 -0
  19. package/dist/account/i18n/index.d.ts +1 -0
  20. package/dist/account/i18n/index.js +1 -0
  21. package/dist/account/i18n/useI18n.d.ts +28 -0
  22. package/dist/account/i18n/useI18n.js +65 -0
  23. package/dist/account/index.d.ts +2 -0
  24. package/dist/account/index.js +1 -0
  25. package/dist/account/pages/Account.svelte +182 -0
  26. package/dist/account/pages/Account.svelte.d.ts +6 -0
  27. package/dist/account/pages/Applications.svelte +173 -0
  28. package/dist/account/pages/Applications.svelte.d.ts +6 -0
  29. package/dist/account/pages/FederatedIdentity.svelte +114 -0
  30. package/dist/account/pages/FederatedIdentity.svelte.d.ts +6 -0
  31. package/dist/account/pages/Log.svelte +68 -0
  32. package/dist/account/pages/Log.svelte.d.ts +6 -0
  33. package/dist/account/pages/PageProps.d.ts +10 -0
  34. package/dist/account/pages/PageProps.js +1 -0
  35. package/dist/account/pages/Password.svelte +233 -0
  36. package/dist/account/pages/Password.svelte.d.ts +6 -0
  37. package/dist/account/pages/Sessions.svelte +88 -0
  38. package/dist/account/pages/Sessions.svelte.d.ts +6 -0
  39. package/dist/account/pages/Totp.svelte +287 -0
  40. package/dist/account/pages/Totp.svelte.d.ts +6 -0
  41. package/dist/additional-svelte-typings.d.ts +6 -0
  42. package/dist/bin/197.index.js +13 -0
  43. package/dist/bin/381.index.js +13 -0
  44. package/dist/bin/504.index.js +13 -0
  45. package/dist/bin/87.index.js +13 -0
  46. package/dist/bin/main.js +230 -0
  47. package/dist/bin/package.json +3 -0
  48. package/dist/login/DefaultPage.svelte +135 -0
  49. package/dist/login/DefaultPage.svelte.d.ts +12 -0
  50. package/dist/login/KcContext/KcContext.d.ts +1 -0
  51. package/dist/login/KcContext/KcContext.js +1 -0
  52. package/dist/login/KcContext/index.d.ts +1 -0
  53. package/dist/login/KcContext/index.js +1 -0
  54. package/dist/login/Template.svelte +223 -0
  55. package/dist/login/Template.svelte.d.ts +6 -0
  56. package/dist/login/Template.useInitialize.d.ts +14 -0
  57. package/dist/login/Template.useInitialize.js +55 -0
  58. package/dist/login/TemplateProps.d.ts +20 -0
  59. package/dist/login/TemplateProps.js +1 -0
  60. package/dist/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +57 -0
  61. package/dist/login/components/AddRemoveButtonsMultiValuedAttribute.svelte.d.ts +18 -0
  62. package/dist/login/components/FieldErrors.svelte +31 -0
  63. package/dist/login/components/FieldErrors.svelte.d.ts +12 -0
  64. package/dist/login/components/GroupLabel.svelte +68 -0
  65. package/dist/login/components/GroupLabel.svelte.d.ts +15 -0
  66. package/dist/login/components/InputFieldByType.svelte +58 -0
  67. package/dist/login/components/InputFieldByType.svelte.d.ts +4 -0
  68. package/dist/login/components/InputFieldByTypeProps.d.ts +16 -0
  69. package/dist/login/components/InputFieldByTypeProps.js +1 -0
  70. package/dist/login/components/InputTag.svelte +107 -0
  71. package/dist/login/components/InputTag.svelte.d.ts +7 -0
  72. package/dist/login/components/InputTagSelects.svelte +111 -0
  73. package/dist/login/components/InputTagSelects.svelte.d.ts +4 -0
  74. package/dist/login/components/LogoutOtherSessions.svelte +29 -0
  75. package/dist/login/components/LogoutOtherSessions.svelte.d.ts +10 -0
  76. package/dist/login/components/PasswordWrapper.svelte +43 -0
  77. package/dist/login/components/PasswordWrapper.svelte.d.ts +13 -0
  78. package/dist/login/components/SelectTag.svelte +72 -0
  79. package/dist/login/components/SelectTag.svelte.d.ts +4 -0
  80. package/dist/login/components/TermsAcceptance.svelte +56 -0
  81. package/dist/login/components/TermsAcceptance.svelte.d.ts +13 -0
  82. package/dist/login/components/TextareaTag.svelte +40 -0
  83. package/dist/login/components/TextareaTag.svelte.d.ts +4 -0
  84. package/dist/login/components/UserProfileFormFields.svelte +123 -0
  85. package/dist/login/components/UserProfileFormFields.svelte.d.ts +6 -0
  86. package/dist/login/components/UserProfileFormFieldsProps.d.ts +27 -0
  87. package/dist/login/components/UserProfileFormFieldsProps.js +2 -0
  88. package/dist/login/components/inputLabel.d.ts +3 -0
  89. package/dist/login/components/inputLabel.js +12 -0
  90. package/dist/login/i18n/i18n.d.ts +15 -0
  91. package/dist/login/i18n/i18n.js +1 -0
  92. package/dist/login/i18n/i18nBuilder.d.ts +18 -0
  93. package/dist/login/i18n/i18nBuilder.js +26 -0
  94. package/dist/login/i18n/index.d.ts +1 -0
  95. package/dist/login/i18n/index.js +1 -0
  96. package/dist/login/i18n/useI18n.d.ts +28 -0
  97. package/dist/login/i18n/useI18n.js +65 -0
  98. package/dist/login/index.d.ts +2 -0
  99. package/dist/login/index.js +1 -0
  100. package/dist/login/lib/useUserProfileForm.d.ts +66 -0
  101. package/dist/login/lib/useUserProfileForm.js +63 -0
  102. package/dist/login/pages/Code.svelte +46 -0
  103. package/dist/login/pages/Code.svelte.d.ts +6 -0
  104. package/dist/login/pages/DeleteAccountConfirm.svelte +77 -0
  105. package/dist/login/pages/DeleteAccountConfirm.svelte.d.ts +6 -0
  106. package/dist/login/pages/DeleteCredential.svelte +58 -0
  107. package/dist/login/pages/DeleteCredential.svelte.d.ts +6 -0
  108. package/dist/login/pages/Error.svelte +43 -0
  109. package/dist/login/pages/Error.svelte.d.ts +6 -0
  110. package/dist/login/pages/FrontchannelLogout.svelte +57 -0
  111. package/dist/login/pages/FrontchannelLogout.svelte.d.ts +6 -0
  112. package/dist/login/pages/IdpReviewUserProfile.svelte +80 -0
  113. package/dist/login/pages/IdpReviewUserProfile.svelte.d.ts +11 -0
  114. package/dist/login/pages/Info.svelte +66 -0
  115. package/dist/login/pages/Info.svelte.d.ts +6 -0
  116. package/dist/login/pages/Login.svelte +225 -0
  117. package/dist/login/pages/Login.svelte.d.ts +6 -0
  118. package/dist/login/pages/LoginConfigTotp.svelte +217 -0
  119. package/dist/login/pages/LoginConfigTotp.svelte.d.ts +6 -0
  120. package/dist/login/pages/LoginIdpLinkConfirm.svelte +60 -0
  121. package/dist/login/pages/LoginIdpLinkConfirm.svelte.d.ts +6 -0
  122. package/dist/login/pages/LoginIdpLinkConfirmOverride.svelte +59 -0
  123. package/dist/login/pages/LoginIdpLinkConfirmOverride.svelte.d.ts +6 -0
  124. package/dist/login/pages/LoginIdpLinkEmail.svelte +50 -0
  125. package/dist/login/pages/LoginIdpLinkEmail.svelte.d.ts +6 -0
  126. package/dist/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +85 -0
  127. package/dist/login/pages/LoginOauth2DeviceVerifyUserCode.svelte.d.ts +6 -0
  128. package/dist/login/pages/LoginOauthGrant.svelte +126 -0
  129. package/dist/login/pages/LoginOauthGrant.svelte.d.ts +6 -0
  130. package/dist/login/pages/LoginOtp.svelte +128 -0
  131. package/dist/login/pages/LoginOtp.svelte.d.ts +6 -0
  132. package/dist/login/pages/LoginPageExpired.svelte +50 -0
  133. package/dist/login/pages/LoginPageExpired.svelte.d.ts +6 -0
  134. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.svelte +240 -0
  135. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.svelte.d.ts +6 -0
  136. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +21 -0
  137. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +57 -0
  138. package/dist/login/pages/LoginPassword.svelte +120 -0
  139. package/dist/login/pages/LoginPassword.svelte.d.ts +6 -0
  140. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.svelte +179 -0
  141. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.svelte.d.ts +6 -0
  142. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +10 -0
  143. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +141 -0
  144. package/dist/login/pages/LoginRecoveryAuthnCodeInput.svelte +94 -0
  145. package/dist/login/pages/LoginRecoveryAuthnCodeInput.svelte.d.ts +6 -0
  146. package/dist/login/pages/LoginResetOtp.svelte +86 -0
  147. package/dist/login/pages/LoginResetOtp.svelte.d.ts +6 -0
  148. package/dist/login/pages/LoginResetPassword.svelte +109 -0
  149. package/dist/login/pages/LoginResetPassword.svelte.d.ts +6 -0
  150. package/dist/login/pages/LoginUpdatePassword.svelte +149 -0
  151. package/dist/login/pages/LoginUpdatePassword.svelte.d.ts +6 -0
  152. package/dist/login/pages/LoginUpdateProfile.svelte +98 -0
  153. package/dist/login/pages/LoginUpdateProfile.svelte.d.ts +11 -0
  154. package/dist/login/pages/LoginUsername.svelte +182 -0
  155. package/dist/login/pages/LoginUsername.svelte.d.ts +6 -0
  156. package/dist/login/pages/LoginVerifyEmail.svelte +39 -0
  157. package/dist/login/pages/LoginVerifyEmail.svelte.d.ts +6 -0
  158. package/dist/login/pages/LoginX509Info.svelte +123 -0
  159. package/dist/login/pages/LoginX509Info.svelte.d.ts +6 -0
  160. package/dist/login/pages/LogoutConfirm.svelte +77 -0
  161. package/dist/login/pages/LogoutConfirm.svelte.d.ts +6 -0
  162. package/dist/login/pages/PageProps.d.ts +10 -0
  163. package/dist/login/pages/PageProps.js +1 -0
  164. package/dist/login/pages/Register.svelte +136 -0
  165. package/dist/login/pages/Register.svelte.d.ts +11 -0
  166. package/dist/login/pages/SamlPostForm.svelte +80 -0
  167. package/dist/login/pages/SamlPostForm.svelte.d.ts +6 -0
  168. package/dist/login/pages/SelectAuthenticator.svelte +63 -0
  169. package/dist/login/pages/SelectAuthenticator.svelte.d.ts +6 -0
  170. package/dist/login/pages/Terms.svelte +57 -0
  171. package/dist/login/pages/Terms.svelte.d.ts +6 -0
  172. package/dist/login/pages/UpdateEmail.svelte +104 -0
  173. package/dist/login/pages/UpdateEmail.svelte.d.ts +11 -0
  174. package/dist/login/pages/WebauthnAuthenticate.svelte +182 -0
  175. package/dist/login/pages/WebauthnAuthenticate.svelte.d.ts +6 -0
  176. package/dist/login/pages/WebauthnAuthenticate.useScript.d.ts +22 -0
  177. package/dist/login/pages/WebauthnAuthenticate.useScript.js +49 -0
  178. package/dist/login/pages/WebauthnError.svelte +86 -0
  179. package/dist/login/pages/WebauthnError.svelte.d.ts +6 -0
  180. package/dist/login/pages/WebauthnRegister.svelte +109 -0
  181. package/dist/login/pages/WebauthnRegister.svelte.d.ts +6 -0
  182. package/dist/login/pages/WebauthnRegister.useScript.d.ts +28 -0
  183. package/dist/login/pages/WebauthnRegister.useScript.js +57 -0
  184. package/dist/tools/useConst.d.ts +1 -0
  185. package/dist/tools/useConst.js +4 -0
  186. package/dist/tools/useInsertLinkTags.d.ts +12 -0
  187. package/dist/tools/useInsertLinkTags.js +62 -0
  188. package/dist/tools/useInsertScriptTags.d.ts +29 -0
  189. package/dist/tools/useInsertScriptTags.js +77 -0
  190. package/dist/tools/useReducer.d.ts +2 -0
  191. package/dist/tools/useReducer.js +7 -0
  192. package/dist/tools/useSetClassName.d.ts +4 -0
  193. package/dist/tools/useSetClassName.js +15 -0
  194. package/dist/tools/useState.d.ts +2 -0
  195. package/dist/tools/useState.js +7 -0
  196. package/package.json +468 -0
  197. package/src/account/DefaultPage.svelte +42 -0
  198. package/src/account/KcContext/KcContext.ts +1 -0
  199. package/src/account/KcContext/index.ts +1 -0
  200. package/src/account/Template.svelte +143 -0
  201. package/src/account/Template.useInitialize.ts +32 -0
  202. package/src/account/TemplateProps.ts +15 -0
  203. package/src/account/i18n/i18n.ts +18 -0
  204. package/src/account/i18n/i18nBuilder.ts +101 -0
  205. package/src/account/i18n/index.ts +1 -0
  206. package/src/account/i18n/useI18n.ts +140 -0
  207. package/src/account/index.ts +2 -0
  208. package/src/account/pages/Account.svelte +182 -0
  209. package/src/account/pages/Applications.svelte +173 -0
  210. package/src/account/pages/FederatedIdentity.svelte +114 -0
  211. package/src/account/pages/Log.svelte +68 -0
  212. package/src/account/pages/PageProps.ts +11 -0
  213. package/src/account/pages/Password.svelte +233 -0
  214. package/src/account/pages/Sessions.svelte +88 -0
  215. package/src/account/pages/Totp.svelte +287 -0
  216. package/src/additional-svelte-typings.d.ts +6 -0
  217. package/src/login/DefaultPage.svelte +135 -0
  218. package/src/login/KcContext/KcContext.ts +1 -0
  219. package/src/login/KcContext/index.ts +1 -0
  220. package/src/login/Template.svelte +223 -0
  221. package/src/login/Template.useInitialize.ts +72 -0
  222. package/src/login/TemplateProps.ts +23 -0
  223. package/src/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +57 -0
  224. package/src/login/components/FieldErrors.svelte +31 -0
  225. package/src/login/components/GroupLabel.svelte +68 -0
  226. package/src/login/components/InputFieldByType.svelte +58 -0
  227. package/src/login/components/InputFieldByTypeProps.ts +15 -0
  228. package/src/login/components/InputTag.svelte +107 -0
  229. package/src/login/components/InputTagSelects.svelte +111 -0
  230. package/src/login/components/LogoutOtherSessions.svelte +29 -0
  231. package/src/login/components/PasswordWrapper.svelte +43 -0
  232. package/src/login/components/SelectTag.svelte +72 -0
  233. package/src/login/components/TermsAcceptance.svelte +56 -0
  234. package/src/login/components/TextareaTag.svelte +40 -0
  235. package/src/login/components/UserProfileFormFields.svelte +123 -0
  236. package/src/login/components/UserProfileFormFieldsProps.ts +25 -0
  237. package/src/login/components/inputLabel.ts +19 -0
  238. package/src/login/i18n/i18n.ts +18 -0
  239. package/src/login/i18n/i18nBuilder.ts +101 -0
  240. package/src/login/i18n/index.ts +1 -0
  241. package/src/login/i18n/useI18n.ts +140 -0
  242. package/src/login/index.ts +2 -0
  243. package/src/login/lib/useUserProfileForm.ts +166 -0
  244. package/src/login/pages/Code.svelte +46 -0
  245. package/src/login/pages/DeleteAccountConfirm.svelte +77 -0
  246. package/src/login/pages/DeleteCredential.svelte +58 -0
  247. package/src/login/pages/Error.svelte +43 -0
  248. package/src/login/pages/FrontchannelLogout.svelte +57 -0
  249. package/src/login/pages/IdpReviewUserProfile.svelte +80 -0
  250. package/src/login/pages/Info.svelte +66 -0
  251. package/src/login/pages/Login.svelte +225 -0
  252. package/src/login/pages/LoginConfigTotp.svelte +217 -0
  253. package/src/login/pages/LoginIdpLinkConfirm.svelte +60 -0
  254. package/src/login/pages/LoginIdpLinkConfirmOverride.svelte +59 -0
  255. package/src/login/pages/LoginIdpLinkEmail.svelte +50 -0
  256. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +85 -0
  257. package/src/login/pages/LoginOauthGrant.svelte +126 -0
  258. package/src/login/pages/LoginOtp.svelte +128 -0
  259. package/src/login/pages/LoginPageExpired.svelte +50 -0
  260. package/src/login/pages/LoginPasskeysConditionalAuthenticate.svelte +240 -0
  261. package/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.ts +82 -0
  262. package/src/login/pages/LoginPassword.svelte +120 -0
  263. package/src/login/pages/LoginRecoveryAuthnCodeConfig.svelte +179 -0
  264. package/src/login/pages/LoginRecoveryAuthnCodeConfig.useScript.ts +157 -0
  265. package/src/login/pages/LoginRecoveryAuthnCodeInput.svelte +94 -0
  266. package/src/login/pages/LoginResetOtp.svelte +86 -0
  267. package/src/login/pages/LoginResetPassword.svelte +109 -0
  268. package/src/login/pages/LoginUpdatePassword.svelte +149 -0
  269. package/src/login/pages/LoginUpdateProfile.svelte +98 -0
  270. package/src/login/pages/LoginUsername.svelte +182 -0
  271. package/src/login/pages/LoginVerifyEmail.svelte +39 -0
  272. package/src/login/pages/LoginX509Info.svelte +123 -0
  273. package/src/login/pages/LogoutConfirm.svelte +77 -0
  274. package/src/login/pages/PageProps.ts +11 -0
  275. package/src/login/pages/Register.svelte +136 -0
  276. package/src/login/pages/SamlPostForm.svelte +80 -0
  277. package/src/login/pages/SelectAuthenticator.svelte +63 -0
  278. package/src/login/pages/Terms.svelte +57 -0
  279. package/src/login/pages/UpdateEmail.svelte +104 -0
  280. package/src/login/pages/WebauthnAuthenticate.svelte +182 -0
  281. package/src/login/pages/WebauthnAuthenticate.useScript.ts +74 -0
  282. package/src/login/pages/WebauthnError.svelte +86 -0
  283. package/src/login/pages/WebauthnRegister.svelte +109 -0
  284. package/src/login/pages/WebauthnRegister.useScript.ts +107 -0
@@ -0,0 +1,72 @@
1
+ <script lang="ts">
2
+ import type { InputFieldByTypeProps } from '@keycloakify/svelte/login/components/InputFieldByTypeProps';
3
+ import { inputLabel } from '@keycloakify/svelte/login/components/inputLabel';
4
+ import { assert } from 'keycloakify/tools/assert';
5
+ const { attribute, dispatchFormAction, kcClsx, displayableErrors, i18n, valueOrValues }: InputFieldByTypeProps =
6
+ $props();
7
+
8
+ const isMultiple = attribute.annotations.inputType === 'multiselect';
9
+ const options = (() => {
10
+ walk: {
11
+ const { inputOptionsFromValidation } = attribute.annotations;
12
+
13
+ if (inputOptionsFromValidation === undefined) {
14
+ break walk;
15
+ }
16
+
17
+ assert(typeof inputOptionsFromValidation === 'string');
18
+
19
+ const validator = (attribute.validators as Record<string, { options?: string[] }>)[inputOptionsFromValidation];
20
+
21
+ if (validator === undefined) {
22
+ break walk;
23
+ }
24
+
25
+ if (validator.options === undefined) {
26
+ break walk;
27
+ }
28
+
29
+ return validator.options;
30
+ }
31
+
32
+ return attribute.validators.options?.options ?? [];
33
+ })();
34
+ </script>
35
+
36
+ <select
37
+ id={attribute.name}
38
+ name={attribute.name}
39
+ class={kcClsx('kcInputClass')}
40
+ aria-invalid={displayableErrors.length !== 0}
41
+ disabled={attribute.readOnly}
42
+ multiple={isMultiple}
43
+ size={attribute.annotations.inputTypeSize === undefined
44
+ ? undefined
45
+ : parseInt(`${attribute.annotations.inputTypeSize}`)}
46
+ value={valueOrValues}
47
+ onchange={(event) =>
48
+ dispatchFormAction('formAction', {
49
+ action: 'update',
50
+ name: attribute.name,
51
+ valueOrValues: (() => {
52
+ if (isMultiple) {
53
+ return Array.from(event.currentTarget.selectedOptions).map((option) => option.value);
54
+ }
55
+
56
+ return event.currentTarget.value;
57
+ })(),
58
+ })}
59
+ onblur={() =>
60
+ dispatchFormAction('formAction', {
61
+ action: 'focus lost',
62
+ name: attribute.name,
63
+ fieldIndex: undefined,
64
+ })}
65
+ >
66
+ {#if !isMultiple}<option value=""></option>{/if}
67
+ {#each options as option}
68
+ <option value={option}>
69
+ {@render inputLabel($i18n, attribute, option)()}
70
+ </option>
71
+ {/each}
72
+ </select>
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { kcSanitize } from 'keycloakify/lib/kcSanitize';
3
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import type { KcContext } from '../KcContext';
5
+ import type { I18n } from '../i18n';
6
+ import type { Readable } from 'svelte/store';
7
+
8
+ type TermsAcceptanceProps = {
9
+ i18n: Readable<I18n>;
10
+ kcClsx: KcClsx;
11
+ messagesPerField: Pick<KcContext['messagesPerField'], 'existsError' | 'get'>;
12
+ areTermsAccepted: boolean;
13
+ onAreTermsAcceptedValueChange: (areTermsAccepted: boolean) => void;
14
+ };
15
+ const { i18n, kcClsx, messagesPerField, areTermsAccepted, onAreTermsAcceptedValueChange }: TermsAcceptanceProps =
16
+ $props();
17
+
18
+ const { msg } = $i18n;
19
+ </script>
20
+
21
+ <div class="form-group">
22
+ <div class={kcClsx('kcInputWrapperClass')}>
23
+ {@render msg('termsTitle')()}
24
+ <div id="kc-registration-terms-text">{@render msg('termsText')()}</div>
25
+ </div>
26
+ </div>
27
+ <div class="form-group">
28
+ <div class={kcClsx('kcLabelWrapperClass')}>
29
+ <input
30
+ type="checkbox"
31
+ id="termsAccepted"
32
+ name="termsAccepted"
33
+ class={kcClsx('kcCheckboxInputClass')}
34
+ checked={areTermsAccepted}
35
+ onchange={(e) => onAreTermsAcceptedValueChange(e.currentTarget.checked)}
36
+ aria-invalid={messagesPerField.existsError('termsAccepted')}
37
+ />
38
+ <label
39
+ for="termsAccepted"
40
+ class={kcClsx('kcLabelClass')}
41
+ >
42
+ {@render msg('acceptTerms')()}
43
+ </label>
44
+ </div>
45
+ {#if messagesPerField.existsError('termsAccepted')}
46
+ <div class={kcClsx('kcLabelWrapperClass')}>
47
+ <span
48
+ id="input-error-terms-accepted"
49
+ class={kcClsx('kcInputErrorMessageClass')}
50
+ aria-live="polite"
51
+ >
52
+ {@html kcSanitize(messagesPerField.get('termsAccepted'))}
53
+ </span>
54
+ </div>
55
+ {/if}
56
+ </div>
@@ -0,0 +1,40 @@
1
+ <script lang="ts">
2
+ import { assert } from 'keycloakify/tools/assert';
3
+ import type { InputFieldByTypeProps } from '@keycloakify/svelte/login/components/InputFieldByTypeProps';
4
+
5
+ const { attribute, dispatchFormAction, kcClsx, displayableErrors, valueOrValues }: InputFieldByTypeProps = $props();
6
+
7
+ assert(typeof valueOrValues === 'string');
8
+
9
+ const value = valueOrValues;
10
+ </script>
11
+
12
+ <textarea
13
+ id={attribute.name}
14
+ name={attribute.name}
15
+ class={kcClsx('kcInputClass')}
16
+ aria-invalid={displayableErrors.length !== 0}
17
+ disabled={attribute.readOnly}
18
+ cols={attribute.annotations.inputTypeCols === undefined
19
+ ? undefined
20
+ : parseInt(`${attribute.annotations.inputTypeCols}`)}
21
+ rows={attribute.annotations.inputTypeRows === undefined
22
+ ? undefined
23
+ : parseInt(`${attribute.annotations.inputTypeRows}`)}
24
+ maxlength={attribute.annotations.inputTypeMaxlength === undefined
25
+ ? undefined
26
+ : parseInt(`${attribute.annotations.inputTypeMaxlength}`)}
27
+ {value}
28
+ onchange={(event) =>
29
+ dispatchFormAction('formAction', {
30
+ action: 'update',
31
+ name: attribute.name,
32
+ valueOrValues: event.currentTarget.value,
33
+ })}
34
+ onblur={() =>
35
+ dispatchFormAction('formAction', {
36
+ action: 'focus lost',
37
+ name: attribute.name,
38
+ fieldIndex: undefined,
39
+ })}
40
+ ></textarea>
@@ -0,0 +1,123 @@
1
+ <script lang="ts">
2
+ import FieldErrors from '@keycloakify/svelte/login/components/FieldErrors.svelte';
3
+ import GroupLabel from '@keycloakify/svelte/login/components/GroupLabel.svelte';
4
+ import InputFieldByType from '@keycloakify/svelte/login/components/InputFieldByType.svelte';
5
+ import type { UserProfileFormFieldsProps } from '@keycloakify/svelte/login/components/UserProfileFormFieldsProps';
6
+ import { useUserProfileForm } from '@keycloakify/svelte/login/lib/useUserProfileForm';
7
+ import { onMount } from 'svelte';
8
+ import { derived } from 'svelte/store';
9
+ import type { I18n } from '../i18n';
10
+ import type { KcContext } from '../KcContext';
11
+
12
+ const props: UserProfileFormFieldsProps<KcContext, I18n> = $props();
13
+ const {
14
+ kcContext,
15
+ i18n,
16
+ kcClsx,
17
+ onIsFormSubmittableValueChange,
18
+ doMakeUserConfirmPassword,
19
+ beforeField,
20
+ afterField,
21
+ } = props;
22
+
23
+ const { advancedMsg } = $i18n;
24
+
25
+ const { formState, dispatchFormAction } = useUserProfileForm({
26
+ kcContext,
27
+ i18n: $i18n,
28
+ doMakeUserConfirmPassword,
29
+ });
30
+ onMount(() => {
31
+ const unsubscribe = formState.subscribe(({ isFormSubmittable }) => {
32
+ onIsFormSubmittableValueChange(isFormSubmittable);
33
+ });
34
+ return () => unsubscribe();
35
+ });
36
+
37
+ const groupNameRef = { current: '' };
38
+ const formFieldStates = derived(formState, ($formState) => $formState.formFieldStates);
39
+ const displayableErrors = derived(formFieldStates, ($formFieldStates) =>
40
+ $formFieldStates.map((f) => f.displayableErrors),
41
+ );
42
+ </script>
43
+
44
+ {#each $formFieldStates as formFieldState, i}
45
+ {@const { attribute, valueOrValues } = formFieldState}
46
+ <GroupLabel
47
+ {attribute}
48
+ {groupNameRef}
49
+ {i18n}
50
+ {kcClsx}
51
+ />
52
+ {#if beforeField}
53
+ {@render beforeField({
54
+ attribute,
55
+ dispatchFormAction,
56
+ displayableErrors: $displayableErrors[i],
57
+ valueOrValues,
58
+ kcClsx,
59
+ i18n,
60
+ })}
61
+ {/if}
62
+ <div
63
+ class={kcClsx('kcFormGroupClass')}
64
+ style:display={attribute.name === 'password-confirm' && !doMakeUserConfirmPassword ? 'none' : undefined}
65
+ >
66
+ <div class={kcClsx('kcLabelWrapperClass')}>
67
+ <label
68
+ for={attribute.name}
69
+ class={kcClsx('kcLabelClass')}
70
+ >
71
+ {@render advancedMsg(attribute.displayName ?? '')()}
72
+ </label>
73
+ {#if attribute.required}
74
+ *
75
+ {/if}
76
+ </div>
77
+ <div class={kcClsx('kcInputWrapperClass')}>
78
+ {#if attribute.annotations.inputHelperTextBefore !== undefined}
79
+ <div
80
+ class={kcClsx('kcInputHelperTextBeforeClass')}
81
+ id={`form-help-text-before-${attribute.name}`}
82
+ aria-live="polite"
83
+ >
84
+ {@render advancedMsg(attribute.annotations.inputHelperTextBefore)()}
85
+ </div>
86
+ {/if}
87
+ <InputFieldByType
88
+ {attribute}
89
+ {valueOrValues}
90
+ displayableErrors={$displayableErrors[i]}
91
+ {dispatchFormAction}
92
+ {kcClsx}
93
+ {i18n}
94
+ />
95
+ <FieldErrors
96
+ {attribute}
97
+ bind:displayableErrors={$displayableErrors[i]}
98
+ {kcClsx}
99
+ />
100
+ {#if attribute.annotations.inputHelperTextAfter !== undefined}
101
+ <div
102
+ class={kcClsx('kcInputHelperTextAfterClass')}
103
+ id={`form-help-text-after-${attribute.name}`}
104
+ aria-live="polite"
105
+ >
106
+ {@render advancedMsg(attribute.annotations.inputHelperTextAfter)()}
107
+ </div>
108
+ {/if}
109
+
110
+ {#if afterField}
111
+ {@render afterField({
112
+ attribute,
113
+ dispatchFormAction,
114
+ displayableErrors: $displayableErrors[i],
115
+ valueOrValues,
116
+ kcClsx,
117
+ i18n,
118
+ })}
119
+ {/if}
120
+ <!-- NOTE: Downloading of html5DataAnnotations scripts is done in the useUserProfileForm hook -->
121
+ </div>
122
+ </div>
123
+ {/each}
@@ -0,0 +1,25 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { type FormAction, type FormFieldError } from '@keycloakify/svelte/login/lib/useUserProfileForm';
3
+ import type { Attribute } from 'keycloakify/login/KcContext';
4
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
5
+ import type { EventDispatcher, Snippet } from 'svelte';
6
+ import type { Readable } from 'svelte/store';
7
+
8
+ export type UserProfileFormFieldsProps<KcContext = any, I18n = any> = {
9
+ kcContext: Extract<KcContext, { profile: unknown }>;
10
+ i18n: Readable<I18n>;
11
+ kcClsx: KcClsx;
12
+ onIsFormSubmittableValueChange: (isFormSubmittable: boolean) => void;
13
+ doMakeUserConfirmPassword: boolean;
14
+ beforeField?: Snippet<[BeforeAfterFieldProps<I18n>]> | null;
15
+ afterField?: Snippet<[BeforeAfterFieldProps<I18n>]> | null;
16
+ };
17
+
18
+ type BeforeAfterFieldProps<I18n> = {
19
+ attribute: Attribute;
20
+ dispatchFormAction: EventDispatcher<{ formAction: FormAction }>;
21
+ displayableErrors: FormFieldError[];
22
+ valueOrValues: string | string[];
23
+ kcClsx: KcClsx;
24
+ i18n: Readable<I18n>;
25
+ };
@@ -0,0 +1,19 @@
1
+ import type { Attribute } from 'keycloakify/login/KcContext';
2
+ import { createRawSnippet } from 'svelte';
3
+ import type { I18n } from '../i18n';
4
+
5
+ export const inputLabel = (i18n: I18n, attribute: Attribute, option: string) => {
6
+ const { advancedMsg } = i18n;
7
+
8
+ if (attribute.annotations.inputOptionLabels !== undefined) {
9
+ const { inputOptionLabels } = attribute.annotations;
10
+
11
+ return advancedMsg(inputOptionLabels[option] ?? option);
12
+ }
13
+
14
+ if (attribute.annotations.inputOptionLabelsI18nPrefix !== undefined) {
15
+ return advancedMsg(`${attribute.annotations.inputOptionLabelsI18nPrefix}.${option}`);
16
+ }
17
+
18
+ return createRawSnippet(() => ({ render: () => option }));
19
+ };
@@ -0,0 +1,18 @@
1
+ import type { GenericI18n_noJsx } from 'keycloakify/login/i18n/noJsx/GenericI18n_noJsx';
2
+ import { type MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
3
+ import type { Snippet } from 'svelte';
4
+ /** INTERNAL: DO NOT IMPORT THIS */
5
+ export type GenericI18n_svelte<MessageKey extends string, LanguageTag extends string> = GenericI18n_noJsx<
6
+ MessageKey,
7
+ LanguageTag
8
+ > & {
9
+ /**
10
+ * Same as msgStr but returns a Snippet with the html string rendered as html.
11
+ */
12
+ msg: (key: MessageKey_defaultSet, ...args: (string | undefined)[]) => Snippet;
13
+ /**
14
+ * Same as advancedMsgStr but returns a Snippet with the html string rendered as html.
15
+ */
16
+ advancedMsg: (key: string, ...args: (string | undefined)[]) => Snippet;
17
+ };
18
+ export type I18n = GenericI18n_svelte<MessageKey_defaultSet, string>;
@@ -0,0 +1,101 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type {
3
+ LanguageTag as LanguageTag_defaultSet,
4
+ MessageKey as MessageKey_defaultSet,
5
+ } from 'keycloakify/login/i18n/messages_defaultSet/types';
6
+ import { type ReturnTypeOfCreateUseI18n, createUseI18n } from './useI18n';
7
+
8
+ export type I18nBuilder<
9
+ ThemeName extends string = never,
10
+ MessageKey_themeDefined extends string = never,
11
+ LanguageTag_notInDefaultSet extends string = never,
12
+ ExcludedMethod extends 'withThemeName' | 'withExtraLanguages' | 'withCustomTranslations' = never,
13
+ > = Omit<
14
+ {
15
+ withThemeName: <ThemeName extends string>() => I18nBuilder<
16
+ ThemeName,
17
+ MessageKey_themeDefined,
18
+ LanguageTag_notInDefaultSet,
19
+ ExcludedMethod | 'withThemeName'
20
+ >;
21
+ withExtraLanguages: <LanguageTag_notInDefaultSet extends string>(extraLanguageTranslations: {
22
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
23
+ label: string;
24
+ getMessages: () => Promise<{
25
+ default: Record<MessageKey_defaultSet, string>;
26
+ }>;
27
+ };
28
+ }) => I18nBuilder<
29
+ ThemeName,
30
+ MessageKey_themeDefined,
31
+ LanguageTag_notInDefaultSet,
32
+ ExcludedMethod | 'withExtraLanguages'
33
+ >;
34
+ withCustomTranslations: <MessageKey_themeDefined extends string>(
35
+ messagesByLanguageTag_themeDefined: Partial<{
36
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<
37
+ MessageKey_themeDefined,
38
+ string | Record<ThemeName, string>
39
+ >;
40
+ }>,
41
+ ) => I18nBuilder<
42
+ ThemeName,
43
+ MessageKey_themeDefined,
44
+ LanguageTag_notInDefaultSet,
45
+ ExcludedMethod | 'withCustomTranslations'
46
+ >;
47
+ build: () => ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
48
+ },
49
+ ExcludedMethod
50
+ >;
51
+
52
+ function createI18nBuilder<
53
+ ThemeName extends string = never,
54
+ MessageKey_themeDefined extends string = never,
55
+ LanguageTag_notInDefaultSet extends string = never,
56
+ >(params: {
57
+ extraLanguageTranslations: {
58
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
59
+ label: string;
60
+ getMessages: () => Promise<{
61
+ default: Record<MessageKey_defaultSet, string>;
62
+ }>;
63
+ };
64
+ };
65
+ messagesByLanguageTag_themeDefined: Partial<{
66
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<
67
+ MessageKey_themeDefined,
68
+ string | Record<ThemeName, string>
69
+ >;
70
+ }>;
71
+ }): I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
72
+ const i18nBuilder: I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet> = {
73
+ withThemeName: () =>
74
+ createI18nBuilder({
75
+ extraLanguageTranslations: params.extraLanguageTranslations,
76
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any,
77
+ }),
78
+ withExtraLanguages: (extraLanguageTranslations) =>
79
+ createI18nBuilder({
80
+ extraLanguageTranslations,
81
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any,
82
+ }),
83
+ withCustomTranslations: (messagesByLanguageTag_themeDefined) =>
84
+ createI18nBuilder({
85
+ extraLanguageTranslations: params.extraLanguageTranslations,
86
+ messagesByLanguageTag_themeDefined,
87
+ }),
88
+ build: () =>
89
+ createUseI18n({
90
+ extraLanguageTranslations: params.extraLanguageTranslations,
91
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
92
+ }),
93
+ };
94
+
95
+ return i18nBuilder;
96
+ }
97
+
98
+ export const i18nBuilder = createI18nBuilder({
99
+ extraLanguageTranslations: {},
100
+ messagesByLanguageTag_themeDefined: {},
101
+ });
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1,140 @@
1
+ import { useState } from '@keycloakify/svelte/tools/useState';
2
+ import {
3
+ type LanguageTag as LanguageTag_defaultSet,
4
+ type MessageKey as MessageKey_defaultSet,
5
+ } from 'keycloakify/login/i18n/messages_defaultSet/types';
6
+ import type { GenericI18n_noJsx } from 'keycloakify/login/i18n/noJsx/GenericI18n_noJsx';
7
+ import { createGetI18n, type KcContextLike } from 'keycloakify/login/i18n/noJsx/getI18n';
8
+ import { createRawSnippet, onMount, type Snippet } from 'svelte';
9
+ import type { Readable } from 'svelte/store';
10
+ import { Reflect } from 'tsafe/Reflect';
11
+ import type { GenericI18n_svelte } from './i18n';
12
+
13
+ export type ReturnTypeOfCreateUseI18n<
14
+ MessageKey_themeDefined extends string,
15
+ LanguageTag_notInDefaultSet extends string,
16
+ > = {
17
+ useI18n: (params: { kcContext: KcContextLike }) => {
18
+ i18n: Readable<
19
+ GenericI18n_svelte<
20
+ MessageKey_defaultSet | MessageKey_themeDefined,
21
+ LanguageTag_defaultSet | LanguageTag_notInDefaultSet
22
+ >
23
+ >;
24
+ };
25
+ ofTypeI18n: GenericI18n_svelte<
26
+ MessageKey_defaultSet | MessageKey_themeDefined,
27
+ LanguageTag_defaultSet | LanguageTag_notInDefaultSet
28
+ >;
29
+ };
30
+
31
+ export type { KcContextLike };
32
+
33
+ export function createUseI18n<
34
+ ThemeName extends string = string,
35
+ MessageKey_themeDefined extends string = never,
36
+ LanguageTag_notInDefaultSet extends string = never,
37
+ >(params: {
38
+ extraLanguageTranslations: {
39
+ [languageTag in LanguageTag_notInDefaultSet]: {
40
+ label: string;
41
+ getMessages: () => Promise<{ default: Record<MessageKey_defaultSet, string> }>;
42
+ };
43
+ };
44
+ messagesByLanguageTag_themeDefined: Partial<{
45
+ [languageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: {
46
+ [key in MessageKey_themeDefined]: string | Record<ThemeName, string>;
47
+ };
48
+ }>;
49
+ }): ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
50
+ const { extraLanguageTranslations, messagesByLanguageTag_themeDefined } = params;
51
+
52
+ type LanguageTag = LanguageTag_defaultSet | LanguageTag_notInDefaultSet;
53
+
54
+ type MessageKey = MessageKey_defaultSet | MessageKey_themeDefined;
55
+ type I18n = GenericI18n_svelte<MessageKey, LanguageTag>;
56
+ type Result = { i18n: Readable<I18n> };
57
+
58
+ const { withSvelte } = (() => {
59
+ const cache = new WeakMap<
60
+ GenericI18n_noJsx<MessageKey, LanguageTag>,
61
+ GenericI18n_svelte<MessageKey, LanguageTag>
62
+ >();
63
+
64
+ function renderHtmlString(params: { htmlString: string; msgKey: string }): Snippet {
65
+ const { htmlString, msgKey } = params;
66
+ return createRawSnippet(() => ({
67
+ render: () => `<div data-kc-msg="${msgKey}">${htmlString}</div>`,
68
+ }));
69
+ }
70
+
71
+ function withSvelte(i18n_noJsx: GenericI18n_noJsx<MessageKey, LanguageTag>): I18n {
72
+ use_cache: {
73
+ const i18n = cache.get(i18n_noJsx);
74
+
75
+ if (i18n === undefined) {
76
+ break use_cache;
77
+ }
78
+
79
+ return i18n;
80
+ }
81
+
82
+ const i18n: I18n = {
83
+ ...i18n_noJsx,
84
+ msg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.msgStr(msgKey, ...args), msgKey }),
85
+ advancedMsg: (msgKey, ...args) =>
86
+ renderHtmlString({ htmlString: i18n_noJsx.advancedMsgStr(msgKey, ...args), msgKey }),
87
+ };
88
+
89
+ cache.set(i18n_noJsx, i18n);
90
+
91
+ return i18n;
92
+ }
93
+
94
+ return { withSvelte };
95
+ })();
96
+
97
+ add_style: {
98
+ const attributeName = 'data-kc-i18n';
99
+
100
+ // Check if already exists in head
101
+ if (document.querySelector(`style[${attributeName}]`) !== null) {
102
+ break add_style;
103
+ }
104
+
105
+ const styleElement = document.createElement('style');
106
+ styleElement.attributes.setNamedItem(document.createAttribute(attributeName));
107
+ styleElement.textContent = `[data-kc-msg] { display: inline-block; }`;
108
+ document.head.prepend(styleElement);
109
+ }
110
+
111
+ const { getI18n } = createGetI18n({ extraLanguageTranslations, messagesByLanguageTag_themeDefined });
112
+
113
+ function useI18n(params: { kcContext: KcContextLike }): Result {
114
+ const { kcContext } = params;
115
+
116
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
117
+
118
+ const [i18n_toReturn, setI18n_toReturn] = useState<I18n>(withSvelte(i18n));
119
+
120
+ onMount(() => {
121
+ let isActive = true;
122
+
123
+ prI18n_currentLanguage?.then((i18n) => {
124
+ if (!isActive) {
125
+ return;
126
+ }
127
+
128
+ setI18n_toReturn(withSvelte(i18n));
129
+ });
130
+
131
+ return () => {
132
+ isActive = false;
133
+ };
134
+ });
135
+
136
+ return { i18n: i18n_toReturn };
137
+ }
138
+
139
+ return { useI18n, ofTypeI18n: Reflect<I18n>() };
140
+ }
@@ -0,0 +1,2 @@
1
+ export type { ExtendKcContext } from '@keycloakify/svelte/login/KcContext';
2
+ export { i18nBuilder } from '@keycloakify/svelte/login/i18n/i18nBuilder';