@keycloakify/svelte 0.0.1-rc.6 → 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 (196) hide show
  1. package/README.md +1 -1
  2. package/keycloakify-svelte/account/DefaultPage.svelte +42 -0
  3. package/keycloakify-svelte/account/DefaultPage.svelte.d.ts +6 -0
  4. package/keycloakify-svelte/account/KcContext/KcContext.d.ts +1 -0
  5. package/keycloakify-svelte/account/KcContext/KcContext.js +1 -0
  6. package/keycloakify-svelte/account/KcContext/index.d.ts +1 -0
  7. package/keycloakify-svelte/account/KcContext/index.js +1 -0
  8. package/keycloakify-svelte/account/Template.svelte +143 -0
  9. package/keycloakify-svelte/account/Template.svelte.d.ts +6 -0
  10. package/keycloakify-svelte/account/Template.useInitialize.d.ts +12 -0
  11. package/keycloakify-svelte/account/Template.useInitialize.js +19 -0
  12. package/keycloakify-svelte/account/TemplateProps.d.ts +12 -0
  13. package/keycloakify-svelte/account/TemplateProps.js +1 -0
  14. package/keycloakify-svelte/account/i18n/i18n.d.ts +15 -0
  15. package/keycloakify-svelte/account/i18n/i18n.js +1 -0
  16. package/keycloakify-svelte/account/i18n/i18nBuilder.d.ts +18 -0
  17. package/keycloakify-svelte/account/i18n/i18nBuilder.js +26 -0
  18. package/keycloakify-svelte/account/i18n/index.d.ts +1 -0
  19. package/keycloakify-svelte/account/i18n/index.js +1 -0
  20. package/keycloakify-svelte/account/i18n/useI18n.d.ts +28 -0
  21. package/keycloakify-svelte/account/i18n/useI18n.js +65 -0
  22. package/keycloakify-svelte/account/index.d.ts +2 -0
  23. package/keycloakify-svelte/account/index.js +1 -0
  24. package/keycloakify-svelte/account/pages/Account.svelte +182 -0
  25. package/keycloakify-svelte/account/pages/Account.svelte.d.ts +6 -0
  26. package/keycloakify-svelte/account/pages/Applications.svelte +173 -0
  27. package/keycloakify-svelte/account/pages/Applications.svelte.d.ts +6 -0
  28. package/keycloakify-svelte/account/pages/FederatedIdentity.svelte +114 -0
  29. package/keycloakify-svelte/account/pages/FederatedIdentity.svelte.d.ts +6 -0
  30. package/keycloakify-svelte/account/pages/Log.svelte +68 -0
  31. package/keycloakify-svelte/account/pages/Log.svelte.d.ts +6 -0
  32. package/keycloakify-svelte/account/pages/PageProps.d.ts +10 -0
  33. package/keycloakify-svelte/account/pages/PageProps.js +1 -0
  34. package/keycloakify-svelte/account/pages/Password.svelte +233 -0
  35. package/keycloakify-svelte/account/pages/Password.svelte.d.ts +6 -0
  36. package/keycloakify-svelte/account/pages/Sessions.svelte +88 -0
  37. package/keycloakify-svelte/account/pages/Sessions.svelte.d.ts +6 -0
  38. package/keycloakify-svelte/account/pages/Totp.svelte +287 -0
  39. package/keycloakify-svelte/account/pages/Totp.svelte.d.ts +6 -0
  40. package/keycloakify-svelte/additional-svelte-typings.d.ts +6 -0
  41. package/keycloakify-svelte/bin/200.index.js +399 -0
  42. package/keycloakify-svelte/bin/266.index.js +964 -0
  43. package/keycloakify-svelte/bin/279.index.js +4298 -0
  44. package/keycloakify-svelte/bin/709.index.js +494 -0
  45. package/keycloakify-svelte/bin/818.index.js +1037 -0
  46. package/keycloakify-svelte/bin/index.js +2454 -0
  47. package/keycloakify-svelte/bin/package.json +3 -0
  48. package/keycloakify-svelte/login/DefaultPage.svelte +135 -0
  49. package/keycloakify-svelte/login/DefaultPage.svelte.d.ts +12 -0
  50. package/keycloakify-svelte/login/KcContext/KcContext.d.ts +1 -0
  51. package/keycloakify-svelte/login/KcContext/KcContext.js +1 -0
  52. package/keycloakify-svelte/login/KcContext/index.d.ts +1 -0
  53. package/keycloakify-svelte/login/KcContext/index.js +1 -0
  54. package/keycloakify-svelte/login/Template.svelte +223 -0
  55. package/keycloakify-svelte/login/Template.svelte.d.ts +6 -0
  56. package/keycloakify-svelte/login/Template.useInitialize.d.ts +14 -0
  57. package/keycloakify-svelte/login/Template.useInitialize.js +55 -0
  58. package/keycloakify-svelte/login/TemplateProps.d.ts +20 -0
  59. package/keycloakify-svelte/login/TemplateProps.js +1 -0
  60. package/keycloakify-svelte/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +57 -0
  61. package/keycloakify-svelte/login/components/AddRemoveButtonsMultiValuedAttribute.svelte.d.ts +18 -0
  62. package/keycloakify-svelte/login/components/FieldErrors.svelte +31 -0
  63. package/keycloakify-svelte/login/components/FieldErrors.svelte.d.ts +12 -0
  64. package/keycloakify-svelte/login/components/GroupLabel.svelte +68 -0
  65. package/keycloakify-svelte/login/components/GroupLabel.svelte.d.ts +15 -0
  66. package/keycloakify-svelte/login/components/InputFieldByType.svelte +58 -0
  67. package/keycloakify-svelte/login/components/InputFieldByType.svelte.d.ts +4 -0
  68. package/keycloakify-svelte/login/components/InputFieldByTypeProps.d.ts +16 -0
  69. package/keycloakify-svelte/login/components/InputFieldByTypeProps.js +1 -0
  70. package/keycloakify-svelte/login/components/InputTag.svelte +107 -0
  71. package/keycloakify-svelte/login/components/InputTag.svelte.d.ts +7 -0
  72. package/keycloakify-svelte/login/components/InputTagSelects.svelte +111 -0
  73. package/keycloakify-svelte/login/components/InputTagSelects.svelte.d.ts +4 -0
  74. package/keycloakify-svelte/login/components/LogoutOtherSessions.svelte +29 -0
  75. package/keycloakify-svelte/login/components/LogoutOtherSessions.svelte.d.ts +10 -0
  76. package/keycloakify-svelte/login/components/PasswordWrapper.svelte +43 -0
  77. package/keycloakify-svelte/login/components/PasswordWrapper.svelte.d.ts +13 -0
  78. package/keycloakify-svelte/login/components/SelectTag.svelte +72 -0
  79. package/keycloakify-svelte/login/components/SelectTag.svelte.d.ts +4 -0
  80. package/keycloakify-svelte/login/components/TermsAcceptance.svelte +56 -0
  81. package/keycloakify-svelte/login/components/TermsAcceptance.svelte.d.ts +13 -0
  82. package/keycloakify-svelte/login/components/TextareaTag.svelte +40 -0
  83. package/keycloakify-svelte/login/components/TextareaTag.svelte.d.ts +4 -0
  84. package/keycloakify-svelte/login/components/UserProfileFormFields.svelte +123 -0
  85. package/keycloakify-svelte/login/components/UserProfileFormFields.svelte.d.ts +6 -0
  86. package/keycloakify-svelte/login/components/UserProfileFormFieldsProps.d.ts +27 -0
  87. package/keycloakify-svelte/login/components/UserProfileFormFieldsProps.js +2 -0
  88. package/keycloakify-svelte/login/components/inputLabel.d.ts +3 -0
  89. package/keycloakify-svelte/login/components/inputLabel.js +12 -0
  90. package/keycloakify-svelte/login/i18n/i18n.d.ts +15 -0
  91. package/keycloakify-svelte/login/i18n/i18n.js +1 -0
  92. package/keycloakify-svelte/login/i18n/i18nBuilder.d.ts +18 -0
  93. package/keycloakify-svelte/login/i18n/i18nBuilder.js +26 -0
  94. package/keycloakify-svelte/login/i18n/index.d.ts +1 -0
  95. package/keycloakify-svelte/login/i18n/index.js +1 -0
  96. package/keycloakify-svelte/login/i18n/useI18n.d.ts +28 -0
  97. package/keycloakify-svelte/login/i18n/useI18n.js +65 -0
  98. package/keycloakify-svelte/login/index.d.ts +2 -0
  99. package/keycloakify-svelte/login/index.js +1 -0
  100. package/keycloakify-svelte/login/lib/useUserProfileForm.d.ts +66 -0
  101. package/keycloakify-svelte/login/lib/useUserProfileForm.js +63 -0
  102. package/keycloakify-svelte/login/pages/Code.svelte +46 -0
  103. package/keycloakify-svelte/login/pages/Code.svelte.d.ts +6 -0
  104. package/keycloakify-svelte/login/pages/DeleteAccountConfirm.svelte +77 -0
  105. package/keycloakify-svelte/login/pages/DeleteAccountConfirm.svelte.d.ts +6 -0
  106. package/keycloakify-svelte/login/pages/DeleteCredential.svelte +58 -0
  107. package/keycloakify-svelte/login/pages/DeleteCredential.svelte.d.ts +6 -0
  108. package/keycloakify-svelte/login/pages/Error.svelte +43 -0
  109. package/keycloakify-svelte/login/pages/Error.svelte.d.ts +6 -0
  110. package/keycloakify-svelte/login/pages/FrontchannelLogout.svelte +57 -0
  111. package/keycloakify-svelte/login/pages/FrontchannelLogout.svelte.d.ts +6 -0
  112. package/keycloakify-svelte/login/pages/IdpReviewUserProfile.svelte +80 -0
  113. package/keycloakify-svelte/login/pages/IdpReviewUserProfile.svelte.d.ts +11 -0
  114. package/keycloakify-svelte/login/pages/Info.svelte +66 -0
  115. package/keycloakify-svelte/login/pages/Info.svelte.d.ts +6 -0
  116. package/keycloakify-svelte/login/pages/Login.svelte +225 -0
  117. package/keycloakify-svelte/login/pages/Login.svelte.d.ts +6 -0
  118. package/keycloakify-svelte/login/pages/LoginConfigTotp.svelte +217 -0
  119. package/keycloakify-svelte/login/pages/LoginConfigTotp.svelte.d.ts +6 -0
  120. package/keycloakify-svelte/login/pages/LoginIdpLinkConfirm.svelte +60 -0
  121. package/keycloakify-svelte/login/pages/LoginIdpLinkConfirm.svelte.d.ts +6 -0
  122. package/keycloakify-svelte/login/pages/LoginIdpLinkConfirmOverride.svelte +59 -0
  123. package/keycloakify-svelte/login/pages/LoginIdpLinkConfirmOverride.svelte.d.ts +6 -0
  124. package/keycloakify-svelte/login/pages/LoginIdpLinkEmail.svelte +50 -0
  125. package/keycloakify-svelte/login/pages/LoginIdpLinkEmail.svelte.d.ts +6 -0
  126. package/keycloakify-svelte/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +85 -0
  127. package/keycloakify-svelte/login/pages/LoginOauth2DeviceVerifyUserCode.svelte.d.ts +6 -0
  128. package/keycloakify-svelte/login/pages/LoginOauthGrant.svelte +126 -0
  129. package/keycloakify-svelte/login/pages/LoginOauthGrant.svelte.d.ts +6 -0
  130. package/keycloakify-svelte/login/pages/LoginOtp.svelte +128 -0
  131. package/keycloakify-svelte/login/pages/LoginOtp.svelte.d.ts +6 -0
  132. package/keycloakify-svelte/login/pages/LoginPageExpired.svelte +50 -0
  133. package/keycloakify-svelte/login/pages/LoginPageExpired.svelte.d.ts +6 -0
  134. package/keycloakify-svelte/login/pages/LoginPasskeysConditionalAuthenticate.svelte +240 -0
  135. package/keycloakify-svelte/login/pages/LoginPasskeysConditionalAuthenticate.svelte.d.ts +6 -0
  136. package/keycloakify-svelte/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +21 -0
  137. package/keycloakify-svelte/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +57 -0
  138. package/keycloakify-svelte/login/pages/LoginPassword.svelte +120 -0
  139. package/keycloakify-svelte/login/pages/LoginPassword.svelte.d.ts +6 -0
  140. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeConfig.svelte +179 -0
  141. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeConfig.svelte.d.ts +6 -0
  142. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +10 -0
  143. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +141 -0
  144. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeInput.svelte +94 -0
  145. package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeInput.svelte.d.ts +6 -0
  146. package/keycloakify-svelte/login/pages/LoginResetOtp.svelte +86 -0
  147. package/keycloakify-svelte/login/pages/LoginResetOtp.svelte.d.ts +6 -0
  148. package/keycloakify-svelte/login/pages/LoginResetPassword.svelte +109 -0
  149. package/keycloakify-svelte/login/pages/LoginResetPassword.svelte.d.ts +6 -0
  150. package/keycloakify-svelte/login/pages/LoginUpdatePassword.svelte +149 -0
  151. package/keycloakify-svelte/login/pages/LoginUpdatePassword.svelte.d.ts +6 -0
  152. package/keycloakify-svelte/login/pages/LoginUpdateProfile.svelte +98 -0
  153. package/keycloakify-svelte/login/pages/LoginUpdateProfile.svelte.d.ts +11 -0
  154. package/keycloakify-svelte/login/pages/LoginUsername.svelte +182 -0
  155. package/keycloakify-svelte/login/pages/LoginUsername.svelte.d.ts +6 -0
  156. package/keycloakify-svelte/login/pages/LoginVerifyEmail.svelte +39 -0
  157. package/keycloakify-svelte/login/pages/LoginVerifyEmail.svelte.d.ts +6 -0
  158. package/keycloakify-svelte/login/pages/LoginX509Info.svelte +123 -0
  159. package/keycloakify-svelte/login/pages/LoginX509Info.svelte.d.ts +6 -0
  160. package/keycloakify-svelte/login/pages/LogoutConfirm.svelte +77 -0
  161. package/keycloakify-svelte/login/pages/LogoutConfirm.svelte.d.ts +6 -0
  162. package/keycloakify-svelte/login/pages/PageProps.d.ts +10 -0
  163. package/keycloakify-svelte/login/pages/PageProps.js +1 -0
  164. package/keycloakify-svelte/login/pages/Register.svelte +136 -0
  165. package/keycloakify-svelte/login/pages/Register.svelte.d.ts +11 -0
  166. package/keycloakify-svelte/login/pages/SamlPostForm.svelte +80 -0
  167. package/keycloakify-svelte/login/pages/SamlPostForm.svelte.d.ts +6 -0
  168. package/keycloakify-svelte/login/pages/SelectAuthenticator.svelte +63 -0
  169. package/keycloakify-svelte/login/pages/SelectAuthenticator.svelte.d.ts +6 -0
  170. package/keycloakify-svelte/login/pages/Terms.svelte +57 -0
  171. package/keycloakify-svelte/login/pages/Terms.svelte.d.ts +6 -0
  172. package/keycloakify-svelte/login/pages/UpdateEmail.svelte +104 -0
  173. package/keycloakify-svelte/login/pages/UpdateEmail.svelte.d.ts +11 -0
  174. package/keycloakify-svelte/login/pages/WebauthnAuthenticate.svelte +182 -0
  175. package/keycloakify-svelte/login/pages/WebauthnAuthenticate.svelte.d.ts +6 -0
  176. package/keycloakify-svelte/login/pages/WebauthnAuthenticate.useScript.d.ts +22 -0
  177. package/keycloakify-svelte/login/pages/WebauthnAuthenticate.useScript.js +49 -0
  178. package/keycloakify-svelte/login/pages/WebauthnError.svelte +86 -0
  179. package/keycloakify-svelte/login/pages/WebauthnError.svelte.d.ts +6 -0
  180. package/keycloakify-svelte/login/pages/WebauthnRegister.svelte +109 -0
  181. package/keycloakify-svelte/login/pages/WebauthnRegister.svelte.d.ts +6 -0
  182. package/keycloakify-svelte/login/pages/WebauthnRegister.useScript.d.ts +28 -0
  183. package/keycloakify-svelte/login/pages/WebauthnRegister.useScript.js +57 -0
  184. package/keycloakify-svelte/tools/useConst.d.ts +1 -0
  185. package/keycloakify-svelte/tools/useConst.js +4 -0
  186. package/keycloakify-svelte/tools/useInsertLinkTags.d.ts +12 -0
  187. package/keycloakify-svelte/tools/useInsertLinkTags.js +62 -0
  188. package/keycloakify-svelte/tools/useInsertScriptTags.d.ts +29 -0
  189. package/keycloakify-svelte/tools/useInsertScriptTags.js +77 -0
  190. package/keycloakify-svelte/tools/useReducer.d.ts +2 -0
  191. package/keycloakify-svelte/tools/useReducer.js +7 -0
  192. package/keycloakify-svelte/tools/useSetClassName.d.ts +4 -0
  193. package/keycloakify-svelte/tools/useSetClassName.js +15 -0
  194. package/keycloakify-svelte/tools/useState.d.ts +2 -0
  195. package/keycloakify-svelte/tools/useState.js +7 -0
  196. package/package.json +6 -3
@@ -0,0 +1,40 @@
1
+ <script lang="ts">
2
+ import { assert } from 'keycloakify/tools/assert';
3
+ import type { InputFieldByTypeProps } from './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,4 @@
1
+ import type { InputFieldByTypeProps } from './InputFieldByTypeProps';
2
+ declare const TextareaTag: import("svelte").Component<InputFieldByTypeProps, {}, "">;
3
+ type TextareaTag = ReturnType<typeof TextareaTag>;
4
+ export default TextareaTag;
@@ -0,0 +1,123 @@
1
+ <script lang="ts">
2
+ import FieldErrors from './FieldErrors.svelte';
3
+ import GroupLabel from './GroupLabel.svelte';
4
+ import InputFieldByType from './InputFieldByType.svelte';
5
+ import type { UserProfileFormFieldsProps } from './UserProfileFormFieldsProps';
6
+ import { useUserProfileForm } from '../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,6 @@
1
+ import type { UserProfileFormFieldsProps } from './UserProfileFormFieldsProps';
2
+ import type { I18n } from '../i18n';
3
+ import type { KcContext } from '../KcContext';
4
+ declare const UserProfileFormFields: import("svelte").Component<UserProfileFormFieldsProps<KcContext, I18n>, {}, "">;
5
+ type UserProfileFormFields = ReturnType<typeof UserProfileFormFields>;
6
+ export default UserProfileFormFields;
@@ -0,0 +1,27 @@
1
+ import { type FormAction, type FormFieldError } from '../lib/useUserProfileForm';
2
+ import type { Attribute } from 'keycloakify/login/KcContext';
3
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import type { EventDispatcher, Snippet } from 'svelte';
5
+ import type { Readable } from 'svelte/store';
6
+ export type UserProfileFormFieldsProps<KcContext = any, I18n = any> = {
7
+ kcContext: Extract<KcContext, {
8
+ profile: unknown;
9
+ }>;
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
+ type BeforeAfterFieldProps<I18n> = {
18
+ attribute: Attribute;
19
+ dispatchFormAction: EventDispatcher<{
20
+ formAction: FormAction;
21
+ }>;
22
+ displayableErrors: FormFieldError[];
23
+ valueOrValues: string | string[];
24
+ kcClsx: KcClsx;
25
+ i18n: Readable<I18n>;
26
+ };
27
+ export {};
@@ -0,0 +1,2 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import {} from '../lib/useUserProfileForm';
@@ -0,0 +1,3 @@
1
+ import type { Attribute } from 'keycloakify/login/KcContext';
2
+ import type { I18n } from '../i18n';
3
+ export declare const inputLabel: (i18n: I18n, attribute: Attribute, option: string) => import("svelte").Snippet<[]>;
@@ -0,0 +1,12 @@
1
+ import { createRawSnippet } from 'svelte';
2
+ export const inputLabel = (i18n, attribute, option) => {
3
+ const { advancedMsg } = i18n;
4
+ if (attribute.annotations.inputOptionLabels !== undefined) {
5
+ const { inputOptionLabels } = attribute.annotations;
6
+ return advancedMsg(inputOptionLabels[option] ?? option);
7
+ }
8
+ if (attribute.annotations.inputOptionLabelsI18nPrefix !== undefined) {
9
+ return advancedMsg(`${attribute.annotations.inputOptionLabelsI18nPrefix}.${option}`);
10
+ }
11
+ return createRawSnippet(() => ({ render: () => option }));
12
+ };
@@ -0,0 +1,15 @@
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<MessageKey, LanguageTag> & {
6
+ /**
7
+ * Same as msgStr but returns a Snippet with the html string rendered as html.
8
+ */
9
+ msg: (key: MessageKey_defaultSet, ...args: (string | undefined)[]) => Snippet;
10
+ /**
11
+ * Same as advancedMsgStr but returns a Snippet with the html string rendered as html.
12
+ */
13
+ advancedMsg: (key: string, ...args: (string | undefined)[]) => Snippet;
14
+ };
15
+ export type I18n = GenericI18n_svelte<MessageKey_defaultSet, string>;
@@ -0,0 +1 @@
1
+ import {} from 'keycloakify/login/i18n/messages_defaultSet/types';
@@ -0,0 +1,18 @@
1
+ import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
2
+ import { type ReturnTypeOfCreateUseI18n } from './useI18n';
3
+ export type I18nBuilder<ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never, ExcludedMethod extends 'withThemeName' | 'withExtraLanguages' | 'withCustomTranslations' = never> = Omit<{
4
+ withThemeName: <ThemeName extends string>() => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withThemeName'>;
5
+ withExtraLanguages: <LanguageTag_notInDefaultSet extends string>(extraLanguageTranslations: {
6
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
7
+ label: string;
8
+ getMessages: () => Promise<{
9
+ default: Record<MessageKey_defaultSet, string>;
10
+ }>;
11
+ };
12
+ }) => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withExtraLanguages'>;
13
+ withCustomTranslations: <MessageKey_themeDefined extends string>(messagesByLanguageTag_themeDefined: Partial<{
14
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<MessageKey_themeDefined, string | Record<ThemeName, string>>;
15
+ }>) => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withCustomTranslations'>;
16
+ build: () => ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
17
+ }, ExcludedMethod>;
18
+ export declare const i18nBuilder: I18nBuilder<never, never, never, never>;
@@ -0,0 +1,26 @@
1
+ import { createUseI18n } from './useI18n';
2
+ function createI18nBuilder(params) {
3
+ const i18nBuilder = {
4
+ withThemeName: () => createI18nBuilder({
5
+ extraLanguageTranslations: params.extraLanguageTranslations,
6
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
7
+ }),
8
+ withExtraLanguages: (extraLanguageTranslations) => createI18nBuilder({
9
+ extraLanguageTranslations,
10
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
11
+ }),
12
+ withCustomTranslations: (messagesByLanguageTag_themeDefined) => createI18nBuilder({
13
+ extraLanguageTranslations: params.extraLanguageTranslations,
14
+ messagesByLanguageTag_themeDefined,
15
+ }),
16
+ build: () => createUseI18n({
17
+ extraLanguageTranslations: params.extraLanguageTranslations,
18
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
19
+ }),
20
+ };
21
+ return i18nBuilder;
22
+ }
23
+ export const i18nBuilder = createI18nBuilder({
24
+ extraLanguageTranslations: {},
25
+ messagesByLanguageTag_themeDefined: {},
26
+ });
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1,28 @@
1
+ import { type LanguageTag as LanguageTag_defaultSet, type MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
2
+ import { type KcContextLike } from 'keycloakify/login/i18n/noJsx/getI18n';
3
+ import type { Readable } from 'svelte/store';
4
+ import type { GenericI18n_svelte } from './i18n';
5
+ export type ReturnTypeOfCreateUseI18n<MessageKey_themeDefined extends string, LanguageTag_notInDefaultSet extends string> = {
6
+ useI18n: (params: {
7
+ kcContext: KcContextLike;
8
+ }) => {
9
+ i18n: Readable<GenericI18n_svelte<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>>;
10
+ };
11
+ ofTypeI18n: GenericI18n_svelte<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>;
12
+ };
13
+ export type { KcContextLike };
14
+ export declare function createUseI18n<ThemeName extends string = string, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never>(params: {
15
+ extraLanguageTranslations: {
16
+ [languageTag in LanguageTag_notInDefaultSet]: {
17
+ label: string;
18
+ getMessages: () => Promise<{
19
+ default: Record<MessageKey_defaultSet, string>;
20
+ }>;
21
+ };
22
+ };
23
+ messagesByLanguageTag_themeDefined: Partial<{
24
+ [languageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: {
25
+ [key in MessageKey_themeDefined]: string | Record<ThemeName, string>;
26
+ };
27
+ }>;
28
+ }): ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
@@ -0,0 +1,65 @@
1
+ import { useState } from '../../tools/useState';
2
+ import {} from 'keycloakify/login/i18n/messages_defaultSet/types';
3
+ import { createGetI18n } from 'keycloakify/login/i18n/noJsx/getI18n';
4
+ import { createRawSnippet, onMount } from 'svelte';
5
+ import { Reflect } from 'tsafe/Reflect';
6
+ export function createUseI18n(params) {
7
+ const { extraLanguageTranslations, messagesByLanguageTag_themeDefined } = params;
8
+ const { withSvelte } = (() => {
9
+ const cache = new WeakMap();
10
+ function renderHtmlString(params) {
11
+ const { htmlString, msgKey } = params;
12
+ return createRawSnippet(() => ({
13
+ render: () => `<div data-kc-msg="${msgKey}">${htmlString}</div>`,
14
+ }));
15
+ }
16
+ function withSvelte(i18n_noJsx) {
17
+ use_cache: {
18
+ const i18n = cache.get(i18n_noJsx);
19
+ if (i18n === undefined) {
20
+ break use_cache;
21
+ }
22
+ return i18n;
23
+ }
24
+ const i18n = {
25
+ ...i18n_noJsx,
26
+ msg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.msgStr(msgKey, ...args), msgKey }),
27
+ advancedMsg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.advancedMsgStr(msgKey, ...args), msgKey }),
28
+ };
29
+ cache.set(i18n_noJsx, i18n);
30
+ return i18n;
31
+ }
32
+ return { withSvelte };
33
+ })();
34
+ add_style: {
35
+ const attributeName = 'data-kc-i18n';
36
+ // Check if already exists in head
37
+ if (document.querySelector(`style[${attributeName}]`) !== null) {
38
+ break add_style;
39
+ }
40
+ const styleElement = document.createElement('style');
41
+ styleElement.attributes.setNamedItem(document.createAttribute(attributeName));
42
+ styleElement.textContent = `[data-kc-msg] { display: inline-block; }`;
43
+ document.head.prepend(styleElement);
44
+ }
45
+ const { getI18n } = createGetI18n({ extraLanguageTranslations, messagesByLanguageTag_themeDefined });
46
+ function useI18n(params) {
47
+ const { kcContext } = params;
48
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
49
+ const [i18n_toReturn, setI18n_toReturn] = useState(withSvelte(i18n));
50
+ onMount(() => {
51
+ let isActive = true;
52
+ prI18n_currentLanguage?.then((i18n) => {
53
+ if (!isActive) {
54
+ return;
55
+ }
56
+ setI18n_toReturn(withSvelte(i18n));
57
+ });
58
+ return () => {
59
+ isActive = false;
60
+ };
61
+ });
62
+ return { i18n: i18n_toReturn };
63
+ }
64
+ return { useI18n, ofTypeI18n: Reflect() };
65
+ }
@@ -0,0 +1,2 @@
1
+ export type { ExtendKcContext } from './KcContext';
2
+ export { i18nBuilder } from './i18n/i18nBuilder';
@@ -0,0 +1 @@
1
+ export { i18nBuilder } from './i18n/i18nBuilder';
@@ -0,0 +1,66 @@
1
+ import type { Attribute, PasswordPolicies, Validators } from 'keycloakify/login/KcContext';
2
+ import * as reactlessApi from 'keycloakify/login/lib/getUserProfileApi';
3
+ import { type EventDispatcher, type Snippet } from 'svelte';
4
+ import { type Readable } from 'svelte/store';
5
+ import type { I18n } from '../i18n';
6
+ export { getButtonToDisplayForMultivaluedAttributeField } from 'keycloakify/login/lib/getUserProfileApi';
7
+ export type FormFieldError = {
8
+ errorMessage: Snippet;
9
+ errorMessageStr: string;
10
+ source: FormFieldError.Source;
11
+ fieldIndex: number | undefined;
12
+ };
13
+ export declare namespace FormFieldError {
14
+ type Source = Source.Validator | Source.PasswordPolicy | Source.Server | Source.Other;
15
+ namespace Source {
16
+ type Validator = {
17
+ type: 'validator';
18
+ name: keyof Validators;
19
+ };
20
+ type PasswordPolicy = {
21
+ type: 'passwordPolicy';
22
+ name: keyof PasswordPolicies;
23
+ };
24
+ type Server = {
25
+ type: 'server';
26
+ };
27
+ type Other = {
28
+ type: 'other';
29
+ rule: 'passwordConfirmMatchesPassword' | 'requiredField';
30
+ };
31
+ }
32
+ }
33
+ export type FormFieldState = {
34
+ attribute: Attribute;
35
+ displayableErrors: FormFieldError[];
36
+ valueOrValues: string | string[];
37
+ };
38
+ export type FormState = {
39
+ isFormSubmittable: boolean;
40
+ formFieldStates: FormFieldState[];
41
+ };
42
+ export type FormAction = {
43
+ action: 'update';
44
+ name: string;
45
+ valueOrValues: string | string[];
46
+ /** Default false */
47
+ displayErrorsImmediately?: boolean;
48
+ } | {
49
+ action: 'focus lost';
50
+ name: string;
51
+ fieldIndex: number | undefined;
52
+ };
53
+ export type KcContextLike = reactlessApi.KcContextLike;
54
+ export type I18nLike = Pick<I18n, 'advancedMsg' | 'advancedMsgStr'>;
55
+ export type ParamsOfUseUserProfileForm = {
56
+ kcContext: KcContextLike;
57
+ doMakeUserConfirmPassword: boolean;
58
+ i18n: I18nLike;
59
+ };
60
+ export type ReturnTypeOfUseUserProfileForm = {
61
+ formState: Readable<FormState>;
62
+ dispatchFormAction: EventDispatcher<{
63
+ formAction: FormAction;
64
+ }>;
65
+ };
66
+ export declare function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTypeOfUseUserProfileForm;
@@ -0,0 +1,63 @@
1
+ /* eslint-disable @typescript-eslint/no-namespace */
2
+ import { useState } from '../../tools/useState';
3
+ import * as reactlessApi from 'keycloakify/login/lib/getUserProfileApi';
4
+ import { onMount } from 'svelte';
5
+ import { derived } from 'svelte/store';
6
+ import { assert } from 'tsafe/assert';
7
+ export { getButtonToDisplayForMultivaluedAttributeField } from 'keycloakify/login/lib/getUserProfileApi';
8
+ {
9
+ assert();
10
+ }
11
+ {
12
+ assert();
13
+ }
14
+ {
15
+ assert();
16
+ }
17
+ {
18
+ assert();
19
+ }
20
+ {
21
+ assert();
22
+ }
23
+ {
24
+ assert();
25
+ }
26
+ export function useUserProfileForm(params) {
27
+ const { doMakeUserConfirmPassword, i18n, kcContext } = params;
28
+ const api = reactlessApi.getUserProfileApi({
29
+ kcContext,
30
+ doMakeUserConfirmPassword,
31
+ });
32
+ const [formState_reactless, setFormState_reactless] = useState(api.getFormState());
33
+ onMount(() => {
34
+ const { unsubscribe } = api.subscribeToFormState(() => {
35
+ setFormState_reactless(api.getFormState());
36
+ });
37
+ return () => unsubscribe();
38
+ });
39
+ const { advancedMsg, advancedMsgStr } = i18n;
40
+ const formState = derived(formState_reactless, ($formState) => ({
41
+ isFormSubmittable: $formState.isFormSubmittable,
42
+ formFieldStates: $formState.formFieldStates.map((formFieldState_reactless) => ({
43
+ attribute: formFieldState_reactless.attribute,
44
+ valueOrValues: formFieldState_reactless.valueOrValues,
45
+ displayableErrors: formFieldState_reactless.displayableErrors.map((formFieldError_reactless) => ({
46
+ errorMessage: advancedMsg(...formFieldError_reactless.advancedMsgArgs),
47
+ errorMessageStr: advancedMsgStr(...formFieldError_reactless.advancedMsgArgs),
48
+ source: formFieldError_reactless.source,
49
+ fieldIndex: formFieldError_reactless.fieldIndex,
50
+ })),
51
+ })),
52
+ }));
53
+ return {
54
+ formState,
55
+ dispatchFormAction: ((_, { ...args }) => {
56
+ if (args) {
57
+ api.dispatchFormAction(args);
58
+ return true;
59
+ }
60
+ return false;
61
+ }),
62
+ };
63
+ }
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ import type { PageProps } from './PageProps';
3
+ import { kcSanitize } from 'keycloakify/lib/kcSanitize';
4
+ import { getKcClsx } from 'keycloakify/login/lib/kcClsx';
5
+ import type { KcContext } from '../KcContext';
6
+ import type { I18n } from '../i18n';
7
+
8
+ const props: PageProps<Extract<KcContext, { pageId: 'code.ftl' }>, I18n> = $props();
9
+ const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
10
+
11
+ const { kcClsx } = getKcClsx({
12
+ doUseDefaultCss,
13
+ classes,
14
+ });
15
+
16
+ const { code } = kcContext;
17
+
18
+ const { msg } = $i18n;
19
+ </script>
20
+
21
+ <Template
22
+ {kcContext}
23
+ {i18n}
24
+ {doUseDefaultCss}
25
+ {classes}
26
+ >
27
+ {#snippet headerNode()}
28
+ {#if code.success}
29
+ {@render msg('codeSuccessTitle')()}
30
+ {:else}
31
+ {@render msg('codeErrorTitle', code.error)()}
32
+ {/if}
33
+ {/snippet}
34
+ <div id="kc-code">
35
+ {#if code.success}
36
+ <p>{@render msg('copyCodeInstruction')()}</p>
37
+ <input
38
+ id="code"
39
+ class={kcClsx('kcTextareaClass')}
40
+ value={code.code}
41
+ />
42
+ {:else if code.error}
43
+ <p id="error">{@html kcSanitize(code.error)}</p>
44
+ {/if}
45
+ </div>
46
+ </Template>
@@ -0,0 +1,6 @@
1
+ import type { PageProps } from './PageProps';
2
+ import type { KcContext } from '../KcContext';
3
+ import type { I18n } from '../i18n';
4
+ declare const Code: import("svelte").Component<PageProps<KcContext.Code, I18n>, {}, "">;
5
+ type Code = ReturnType<typeof Code>;
6
+ export default Code;
@@ -0,0 +1,77 @@
1
+ <script lang="ts">
2
+ import type { PageProps } from './PageProps';
3
+ import { getKcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import type { KcContext } from '../KcContext';
5
+ import type { I18n } from '../i18n';
6
+
7
+ const {
8
+ kcContext,
9
+ i18n,
10
+ doUseDefaultCss,
11
+ Template,
12
+ classes,
13
+ }: PageProps<Extract<KcContext, { pageId: 'delete-account-confirm.ftl' }>, I18n> = $props();
14
+
15
+ const { kcClsx } = getKcClsx({
16
+ doUseDefaultCss,
17
+ classes,
18
+ });
19
+
20
+ const { url, triggered_from_aia } = kcContext;
21
+
22
+ const { msg, msgStr } = $i18n;
23
+ </script>
24
+
25
+ <Template
26
+ {kcContext}
27
+ {i18n}
28
+ {doUseDefaultCss}
29
+ {classes}
30
+ >
31
+ {#snippet headerNode()}
32
+ {@render msg('deleteAccountConfirm')()}
33
+ {/snippet}
34
+
35
+ <form
36
+ action={url.loginAction}
37
+ class="form-vertical"
38
+ method="post"
39
+ >
40
+ <div
41
+ class="alert alert-warning"
42
+ style:margin-top={'0'}
43
+ style:margin-bottom={'30px'}
44
+ >
45
+ <span class="pficon pficon-warning-triangle-o"></span>
46
+ {@render msg('irreversibleAction')()}
47
+ </div>
48
+ <p>{@render msg('deletingImplies')()}</p>
49
+ <ul
50
+ style:color={'#72767b'}
51
+ style:list-style={'disc'}
52
+ style:list-style-position={'inside'}
53
+ >
54
+ <li>{@render msg('loggingOutImmediately')()}</li>
55
+ <li>{@render msg('errasingData')()}</li>
56
+ </ul>
57
+ <p class="delete-account-text">{@render msg('finalDeletionConfirmation')()}</p>
58
+ <div id="kc-form-buttons">
59
+ <input
60
+ class={kcClsx('kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass')}
61
+ type="submit"
62
+ value={msgStr('doConfirmDelete')}
63
+ />
64
+ {#if triggered_from_aia}
65
+ <button
66
+ class={kcClsx('kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass')}
67
+ style:margin-left={'calc(100% - 220px)'}
68
+ type="submit"
69
+ name="cancel-aia"
70
+ value="true"
71
+ >
72
+ {msgStr('doCancel')}
73
+ </button>
74
+ {/if}
75
+ </div>
76
+ </form>
77
+ </Template>