keycloakify 10.0.0-rc.37 → 10.0.0-rc.38

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 (268) hide show
  1. package/account/Fallback.d.ts +1 -2
  2. package/account/Fallback.js.map +1 -1
  3. package/account/KcContext/KcContext.d.ts +6 -6
  4. package/account/KcContext/getKcContextMock.d.ts +9 -9
  5. package/account/KcContext/getKcContextMock.js +3 -3
  6. package/account/KcContext/getKcContextMock.js.map +1 -1
  7. package/account/Template.d.ts +1 -2
  8. package/account/Template.js +7 -6
  9. package/account/Template.js.map +1 -1
  10. package/account/TemplateProps.d.ts +1 -3
  11. package/account/i18n/i18n.d.ts +9 -4
  12. package/account/i18n/i18n.js +132 -87
  13. package/account/i18n/i18n.js.map +1 -1
  14. package/account/i18n/index.d.ts +9 -2
  15. package/account/i18n/index.js +5 -1
  16. package/account/i18n/index.js.map +1 -1
  17. package/account/lib/kcClsx.d.ts +9 -0
  18. package/account/lib/{useGetClassName.js → kcClsx.js} +3 -3
  19. package/account/lib/kcClsx.js.map +1 -0
  20. package/account/pages/Account.d.ts +1 -2
  21. package/account/pages/Account.js +9 -7
  22. package/account/pages/Account.js.map +1 -1
  23. package/account/pages/Applications.d.ts +1 -2
  24. package/account/pages/Applications.js +7 -7
  25. package/account/pages/Applications.js.map +1 -1
  26. package/account/pages/FederatedIdentity.d.ts +1 -2
  27. package/account/pages/FederatedIdentity.js +4 -3
  28. package/account/pages/FederatedIdentity.js.map +1 -1
  29. package/account/pages/Log.d.ts +1 -2
  30. package/account/pages/Log.js +6 -5
  31. package/account/pages/Log.js.map +1 -1
  32. package/account/pages/PageProps.d.ts +2 -4
  33. package/account/pages/Password.d.ts +1 -2
  34. package/account/pages/Password.js +10 -9
  35. package/account/pages/Password.js.map +1 -1
  36. package/account/pages/Sessions.d.ts +1 -2
  37. package/account/pages/Sessions.js +6 -6
  38. package/account/pages/Sessions.js.map +1 -1
  39. package/account/pages/Totp.d.ts +1 -2
  40. package/account/pages/Totp.js +6 -5
  41. package/account/pages/Totp.js.map +1 -1
  42. package/bin/{314.index.js → 21.index.js} +162 -4
  43. package/bin/{430.index.js → 214.index.js} +161 -2
  44. package/bin/3.index.js +81 -65
  45. package/bin/526.index.js +3 -2
  46. package/bin/538.index.js +552 -0
  47. package/bin/795.index.js +3 -2
  48. package/bin/{890.index.js → 941.index.js} +2 -159
  49. package/bin/main.js +19 -7
  50. package/lib/getKcClsx.d.ts +11 -0
  51. package/lib/getKcClsx.js +44 -0
  52. package/lib/getKcClsx.js.map +1 -0
  53. package/login/Fallback.d.ts +1 -2
  54. package/login/Fallback.js.map +1 -1
  55. package/login/KcContext/KcContext.d.ts +6 -6
  56. package/login/KcContext/getKcContextMock.d.ts +9 -9
  57. package/login/KcContext/getKcContextMock.js +3 -3
  58. package/login/KcContext/getKcContextMock.js.map +1 -1
  59. package/login/Template.d.ts +1 -2
  60. package/login/Template.js +10 -9
  61. package/login/Template.js.map +1 -1
  62. package/login/TemplateProps.d.ts +1 -3
  63. package/login/UserProfileFormFields.d.ts +5 -5
  64. package/login/UserProfileFormFields.js +35 -34
  65. package/login/UserProfileFormFields.js.map +1 -1
  66. package/login/i18n/i18n.d.ts +9 -4
  67. package/login/i18n/i18n.js +136 -91
  68. package/login/i18n/i18n.js.map +1 -1
  69. package/login/i18n/index.d.ts +9 -2
  70. package/login/i18n/index.js +5 -1
  71. package/login/i18n/index.js.map +1 -1
  72. package/login/lib/kcClsx.d.ts +9 -0
  73. package/login/lib/{useGetClassName.js → kcClsx.js} +3 -3
  74. package/login/lib/kcClsx.js.map +1 -0
  75. package/login/lib/useUserProfileForm.d.ts +9 -6
  76. package/login/lib/useUserProfileForm.js +7 -5
  77. package/login/lib/useUserProfileForm.js.map +1 -1
  78. package/login/pages/Code.d.ts +1 -2
  79. package/login/pages/Code.js +6 -5
  80. package/login/pages/Code.js.map +1 -1
  81. package/login/pages/DeleteAccountConfirm.d.ts +1 -2
  82. package/login/pages/DeleteAccountConfirm.js +7 -7
  83. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  84. package/login/pages/DeleteCredential.d.ts +1 -2
  85. package/login/pages/DeleteCredential.js +6 -6
  86. package/login/pages/DeleteCredential.js.map +1 -1
  87. package/login/pages/Error.d.ts +1 -2
  88. package/login/pages/Error.js +4 -3
  89. package/login/pages/Error.js.map +1 -1
  90. package/login/pages/FrontchannelLogout.d.ts +1 -2
  91. package/login/pages/FrontchannelLogout.js +4 -3
  92. package/login/pages/FrontchannelLogout.js.map +1 -1
  93. package/login/pages/IdpReviewUserProfile.d.ts +1 -2
  94. package/login/pages/IdpReviewUserProfile.js +6 -6
  95. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  96. package/login/pages/Info.d.ts +1 -2
  97. package/login/pages/Info.js +4 -3
  98. package/login/pages/Info.js.map +1 -1
  99. package/login/pages/Login.d.ts +1 -2
  100. package/login/pages/Login.js +10 -8
  101. package/login/pages/Login.js.map +1 -1
  102. package/login/pages/LoginConfigTotp.d.ts +1 -2
  103. package/login/pages/LoginConfigTotp.js +8 -7
  104. package/login/pages/LoginConfigTotp.js.map +1 -1
  105. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -2
  106. package/login/pages/LoginIdpLinkConfirm.js +6 -6
  107. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  108. package/login/pages/LoginIdpLinkEmail.d.ts +1 -2
  109. package/login/pages/LoginIdpLinkEmail.js +4 -3
  110. package/login/pages/LoginIdpLinkEmail.js.map +1 -1
  111. package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +1 -2
  112. package/login/pages/LoginOauth2DeviceVerifyUserCode.js +6 -6
  113. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
  114. package/login/pages/LoginOauthGrant.d.ts +1 -2
  115. package/login/pages/LoginOauthGrant.js +7 -7
  116. package/login/pages/LoginOauthGrant.js.map +1 -1
  117. package/login/pages/LoginOtp.d.ts +1 -2
  118. package/login/pages/LoginOtp.js +6 -6
  119. package/login/pages/LoginOtp.js.map +1 -1
  120. package/login/pages/LoginPageExpired.d.ts +1 -2
  121. package/login/pages/LoginPageExpired.js +4 -3
  122. package/login/pages/LoginPageExpired.js.map +1 -1
  123. package/login/pages/LoginPassword.d.ts +1 -2
  124. package/login/pages/LoginPassword.js +9 -7
  125. package/login/pages/LoginPassword.js.map +1 -1
  126. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -2
  127. package/login/pages/LoginRecoveryAuthnCodeConfig.js +9 -7
  128. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  129. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -2
  130. package/login/pages/LoginRecoveryAuthnCodeInput.js +6 -6
  131. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  132. package/login/pages/LoginResetOtp.d.ts +1 -2
  133. package/login/pages/LoginResetOtp.js +6 -6
  134. package/login/pages/LoginResetOtp.js.map +1 -1
  135. package/login/pages/LoginResetPassword.d.ts +1 -2
  136. package/login/pages/LoginResetPassword.js +7 -7
  137. package/login/pages/LoginResetPassword.js.map +1 -1
  138. package/login/pages/LoginUpdatePassword.d.ts +1 -2
  139. package/login/pages/LoginUpdatePassword.js +10 -9
  140. package/login/pages/LoginUpdatePassword.js.map +1 -1
  141. package/login/pages/LoginUpdateProfile.d.ts +1 -2
  142. package/login/pages/LoginUpdateProfile.js +7 -12
  143. package/login/pages/LoginUpdateProfile.js.map +1 -1
  144. package/login/pages/LoginUsername.d.ts +1 -2
  145. package/login/pages/LoginUsername.js +8 -7
  146. package/login/pages/LoginUsername.js.map +1 -1
  147. package/login/pages/LoginVerifyEmail.d.ts +1 -2
  148. package/login/pages/LoginVerifyEmail.js +4 -3
  149. package/login/pages/LoginVerifyEmail.js.map +1 -1
  150. package/login/pages/LoginX509Info.d.ts +1 -2
  151. package/login/pages/LoginX509Info.js +6 -6
  152. package/login/pages/LoginX509Info.js.map +1 -1
  153. package/login/pages/LogoutConfirm.d.ts +1 -2
  154. package/login/pages/LogoutConfirm.js +6 -6
  155. package/login/pages/LogoutConfirm.js.map +1 -1
  156. package/login/pages/PageProps.d.ts +2 -4
  157. package/login/pages/Register.d.ts +1 -2
  158. package/login/pages/Register.js +8 -16
  159. package/login/pages/Register.js.map +1 -1
  160. package/login/pages/SamlPostForm.d.ts +1 -2
  161. package/login/pages/SamlPostForm.js +4 -3
  162. package/login/pages/SamlPostForm.js.map +1 -1
  163. package/login/pages/SelectAuthenticator.d.ts +1 -2
  164. package/login/pages/SelectAuthenticator.js +6 -9
  165. package/login/pages/SelectAuthenticator.js.map +1 -1
  166. package/login/pages/Terms.d.ts +1 -2
  167. package/login/pages/Terms.js +6 -6
  168. package/login/pages/Terms.js.map +1 -1
  169. package/login/pages/UpdateEmail.d.ts +1 -2
  170. package/login/pages/UpdateEmail.js +8 -12
  171. package/login/pages/UpdateEmail.js.map +1 -1
  172. package/login/pages/WebauthnAuthenticate.d.ts +1 -2
  173. package/login/pages/WebauthnAuthenticate.js +13 -12
  174. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  175. package/login/pages/WebauthnError.d.ts +1 -2
  176. package/login/pages/WebauthnError.js +7 -7
  177. package/login/pages/WebauthnError.js.map +1 -1
  178. package/login/pages/WebauthnRegister.d.ts +1 -2
  179. package/login/pages/WebauthnRegister.js +9 -8
  180. package/login/pages/WebauthnRegister.js.map +1 -1
  181. package/package.json +24 -16
  182. package/src/account/Fallback.tsx +1 -2
  183. package/src/account/KcContext/KcContext.ts +7 -7
  184. package/src/account/KcContext/getKcContextMock.ts +13 -24
  185. package/src/account/Template.tsx +8 -8
  186. package/src/account/TemplateProps.ts +1 -6
  187. package/src/account/i18n/i18n.tsx +204 -125
  188. package/src/account/i18n/index.ts +10 -2
  189. package/src/account/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  190. package/src/account/pages/Account.tsx +15 -21
  191. package/src/account/pages/Applications.tsx +8 -9
  192. package/src/account/pages/FederatedIdentity.tsx +5 -5
  193. package/src/account/pages/Log.tsx +8 -8
  194. package/src/account/pages/PageProps.ts +2 -4
  195. package/src/account/pages/Password.tsx +13 -16
  196. package/src/account/pages/Sessions.tsx +9 -10
  197. package/src/account/pages/Totp.tsx +19 -28
  198. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +2 -66
  199. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +7 -1
  200. package/src/bin/main.ts +15 -0
  201. package/src/bin/shared/buildOptions.ts +5 -2
  202. package/src/bin/shared/generateKcGenTs.ts +61 -0
  203. package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
  204. package/src/bin/update-kc-gen.ts +13 -0
  205. package/src/lib/getKcClsx.ts +75 -0
  206. package/src/login/Fallback.tsx +1 -2
  207. package/src/login/KcContext/KcContext.ts +7 -7
  208. package/src/login/KcContext/getKcContextMock.ts +13 -24
  209. package/src/login/Template.tsx +36 -37
  210. package/src/login/TemplateProps.ts +1 -6
  211. package/src/login/UserProfileFormFields.tsx +66 -81
  212. package/src/login/i18n/i18n.tsx +208 -129
  213. package/src/login/i18n/index.ts +10 -2
  214. package/src/login/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  215. package/src/login/lib/useUserProfileForm.tsx +29 -21
  216. package/src/login/pages/Code.tsx +10 -8
  217. package/src/login/pages/DeleteAccountConfirm.tsx +9 -10
  218. package/src/login/pages/DeleteCredential.tsx +11 -10
  219. package/src/login/pages/Error.tsx +5 -5
  220. package/src/login/pages/FrontchannelLogout.tsx +7 -5
  221. package/src/login/pages/IdpReviewUserProfile.tsx +16 -25
  222. package/src/login/pages/Info.tsx +7 -5
  223. package/src/login/pages/Login.tsx +34 -53
  224. package/src/login/pages/LoginConfigTotp.tsx +30 -38
  225. package/src/login/pages/LoginIdpLinkConfirm.tsx +10 -21
  226. package/src/login/pages/LoginIdpLinkEmail.tsx +5 -5
  227. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +19 -24
  228. package/src/login/pages/LoginOauthGrant.tsx +14 -21
  229. package/src/login/pages/LoginOtp.tsx +29 -33
  230. package/src/login/pages/LoginPageExpired.tsx +5 -5
  231. package/src/login/pages/LoginPassword.tsx +23 -33
  232. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +21 -25
  233. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +21 -25
  234. package/src/login/pages/LoginResetOtp.tsx +21 -25
  235. package/src/login/pages/LoginResetPassword.tsx +21 -25
  236. package/src/login/pages/LoginUpdatePassword.tsx +42 -52
  237. package/src/login/pages/LoginUpdateProfile.tsx +26 -33
  238. package/src/login/pages/LoginUsername.tsx +23 -35
  239. package/src/login/pages/LoginVerifyEmail.tsx +7 -5
  240. package/src/login/pages/LoginX509Info.tsx +27 -36
  241. package/src/login/pages/LogoutConfirm.tsx +11 -17
  242. package/src/login/pages/PageProps.ts +2 -4
  243. package/src/login/pages/Register.tsx +24 -49
  244. package/src/login/pages/SamlPostForm.tsx +5 -5
  245. package/src/login/pages/SelectAuthenticator.tsx +24 -26
  246. package/src/login/pages/Terms.tsx +9 -16
  247. package/src/login/pages/UpdateEmail.tsx +26 -36
  248. package/src/login/pages/WebauthnAuthenticate.tsx +26 -32
  249. package/src/login/pages/WebauthnError.tsx +11 -22
  250. package/src/login/pages/WebauthnRegister.tsx +20 -28
  251. package/src/tools/clsx.ts +6 -48
  252. package/src/tools/clsx_withTransform.ts +55 -0
  253. package/src/vite-plugin/vite-plugin.ts +14 -6
  254. package/tools/clsx.d.ts +3 -2
  255. package/tools/clsx.js +5 -41
  256. package/tools/clsx.js.map +1 -1
  257. package/tools/clsx_withTransform.d.ts +5 -0
  258. package/tools/clsx_withTransform.js +43 -0
  259. package/tools/clsx_withTransform.js.map +1 -0
  260. package/vite-plugin/index.js +167 -37
  261. package/account/lib/useGetClassName.d.ts +0 -7
  262. package/account/lib/useGetClassName.js.map +0 -1
  263. package/lib/useGetClassName.d.ts +0 -10
  264. package/lib/useGetClassName.js +0 -14
  265. package/lib/useGetClassName.js.map +0 -1
  266. package/login/lib/useGetClassName.d.ts +0 -7
  267. package/login/lib/useGetClassName.js.map +0 -1
  268. package/src/lib/useGetClassName.ts +0 -27
@@ -1,35 +1,36 @@
1
- import { clsx } from "keycloakify/tools/clsx";
2
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
1
+ import { getKcClsx } from "keycloakify/login/lib/kcClsx";
3
2
  import type { PageProps } from "keycloakify/login/pages/PageProps";
4
3
  import type { KcContext } from "../KcContext";
5
- import type { I18n } from "../i18n";
4
+ import { useI18n } from "../i18n";
6
5
 
7
- export default function LoginRecoveryAuthnCodeInput(props: PageProps<Extract<KcContext, { pageId: "login-recovery-authn-code-input.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LoginRecoveryAuthnCodeInput(props: PageProps<Extract<KcContext, { pageId: "login-recovery-authn-code-input.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
9
8
 
10
- const { getClassName } = useGetClassName({
9
+ const { kcClsx } = getKcClsx({
11
10
  doUseDefaultCss,
12
11
  classes
13
12
  });
14
13
 
15
14
  const { url, messagesPerField, recoveryAuthnCodesInputBean } = kcContext;
16
15
 
17
- const { msg, msgStr } = i18n;
16
+ const { msg, msgStr } = useI18n({ kcContext });
18
17
 
19
18
  return (
20
19
  <Template
21
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
20
+ kcContext={kcContext}
21
+ doUseDefaultCss={doUseDefaultCss}
22
+ classes={classes}
22
23
  headerNode={msg("auth-recovery-code-header")}
23
24
  displayMessage={!messagesPerField.existsError("recoveryCodeInput")}
24
25
  >
25
- <form id="kc-recovery-code-login-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
26
- <div className={getClassName("kcFormGroupClass")}>
27
- <div className={getClassName("kcLabelWrapperClass")}>
28
- <label htmlFor="recoveryCodeInput" className={getClassName("kcLabelClass")}>
26
+ <form id="kc-recovery-code-login-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
27
+ <div className={kcClsx("kcFormGroupClass")}>
28
+ <div className={kcClsx("kcLabelWrapperClass")}>
29
+ <label htmlFor="recoveryCodeInput" className={kcClsx("kcLabelClass")}>
29
30
  {msg("auth-recovery-code-prompt", `${recoveryAuthnCodesInputBean.codeNumber}`)}
30
31
  </label>
31
32
  </div>
32
- <div className={getClassName("kcInputWrapperClass")}>
33
+ <div className={kcClsx("kcInputWrapperClass")}>
33
34
  <input
34
35
  tabIndex={1}
35
36
  id="recoveryCodeInput"
@@ -37,29 +38,24 @@ export default function LoginRecoveryAuthnCodeInput(props: PageProps<Extract<KcC
37
38
  aria-invalid={messagesPerField.existsError("recoveryCodeInput")}
38
39
  autoComplete="off"
39
40
  type="text"
40
- className={getClassName("kcInputClass")}
41
+ className={kcClsx("kcInputClass")}
41
42
  autoFocus
42
43
  />
43
44
  {messagesPerField.existsError("recoveryCodeInput") && (
44
- <span id="input-error" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
45
+ <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
45
46
  {messagesPerField.get("recoveryCodeInput")}
46
47
  </span>
47
48
  )}
48
49
  </div>
49
50
  </div>
50
51
 
51
- <div className={getClassName("kcFormGroupClass")}>
52
- <div id="kc-form-options" className={getClassName("kcFormOptionsWrapperClass")}>
53
- <div className={getClassName("kcFormOptionsWrapperClass")} />
52
+ <div className={kcClsx("kcFormGroupClass")}>
53
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsWrapperClass")}>
54
+ <div className={kcClsx("kcFormOptionsWrapperClass")} />
54
55
  </div>
55
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
56
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
56
57
  <input
57
- className={clsx(
58
- getClassName("kcButtonClass"),
59
- getClassName("kcButtonPrimaryClass"),
60
- getClassName("kcButtonBlockClass"),
61
- getClassName("kcButtonLargeClass")
62
- )}
58
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
63
59
  name="login"
64
60
  id="kc-login"
65
61
  type="submit"
@@ -1,62 +1,58 @@
1
1
  import { Fragment } from "react";
2
- import { clsx } from "keycloakify/tools/clsx";
3
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
2
+ import { getKcClsx } from "keycloakify/login/lib/kcClsx";
4
3
  import type { PageProps } from "keycloakify/login/pages/PageProps";
5
4
  import type { KcContext } from "../KcContext";
6
- import type { I18n } from "../i18n";
5
+ import { useI18n } from "../i18n";
7
6
 
8
- export default function LoginResetOtp(props: PageProps<Extract<KcContext, { pageId: "login-reset-otp.ftl" }>, I18n>) {
9
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
7
+ export default function LoginResetOtp(props: PageProps<Extract<KcContext, { pageId: "login-reset-otp.ftl" }>>) {
8
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
10
9
 
11
- const { getClassName } = useGetClassName({
10
+ const { kcClsx } = getKcClsx({
12
11
  doUseDefaultCss,
13
12
  classes
14
13
  });
15
14
 
16
15
  const { url, messagesPerField, configuredOtpCredentials } = kcContext;
17
16
 
18
- const { msg, msgStr } = i18n;
17
+ const { msg, msgStr } = useI18n({ kcContext });
19
18
 
20
19
  return (
21
20
  <Template
22
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
21
+ kcContext={kcContext}
22
+ doUseDefaultCss={doUseDefaultCss}
23
+ classes={classes}
23
24
  displayMessage={!messagesPerField.existsError("totp")}
24
25
  headerNode={msg("doLogIn")}
25
26
  >
26
- <form id="kc-otp-reset-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
27
- <div className={getClassName("kcInputWrapperClass")}>
28
- <div className={getClassName("kcInfoAreaWrapperClass")}>
27
+ <form id="kc-otp-reset-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
28
+ <div className={kcClsx("kcInputWrapperClass")}>
29
+ <div className={kcClsx("kcInfoAreaWrapperClass")}>
29
30
  <p id="kc-otp-reset-form-description">{msg("otp-reset-description")}</p>
30
31
  {configuredOtpCredentials.userOtpCredentials.map((otpCredential, index) => (
31
32
  <Fragment key={otpCredential.id}>
32
33
  <input
33
34
  id={`kc-otp-credential-${index}`}
34
- className={getClassName("kcLoginOTPListInputClass")}
35
+ className={kcClsx("kcLoginOTPListInputClass")}
35
36
  type="radio"
36
37
  name="selectedCredentialId"
37
38
  value={otpCredential.id}
38
39
  defaultChecked={otpCredential.id === configuredOtpCredentials.selectedCredentialId}
39
40
  />
40
- <label htmlFor={`kc-otp-credential-${index}`} className={getClassName("kcLoginOTPListClass")} tabIndex={index}>
41
- <span className={getClassName("kcLoginOTPListItemHeaderClass")}>
42
- <span className={getClassName("kcLoginOTPListItemIconBodyClass")}>
43
- <i className={getClassName("kcLoginOTPListItemIconClass")} aria-hidden="true"></i>
41
+ <label htmlFor={`kc-otp-credential-${index}`} className={kcClsx("kcLoginOTPListClass")} tabIndex={index}>
42
+ <span className={kcClsx("kcLoginOTPListItemHeaderClass")}>
43
+ <span className={kcClsx("kcLoginOTPListItemIconBodyClass")}>
44
+ <i className={kcClsx("kcLoginOTPListItemIconClass")} aria-hidden="true"></i>
44
45
  </span>
45
- <span className={getClassName("kcLoginOTPListItemTitleClass")}>{otpCredential.userLabel}</span>
46
+ <span className={kcClsx("kcLoginOTPListItemTitleClass")}>{otpCredential.userLabel}</span>
46
47
  </span>
47
48
  </label>
48
49
  </Fragment>
49
50
  ))}
50
- <div className={getClassName("kcFormGroupClass")}>
51
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
51
+ <div className={kcClsx("kcFormGroupClass")}>
52
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
52
53
  <input
53
54
  id="kc-otp-reset-form-submit"
54
- className={clsx(
55
- getClassName("kcButtonClass"),
56
- getClassName("kcButtonPrimaryClass"),
57
- getClassName("kcButtonBlockClass"),
58
- getClassName("kcButtonLargeClass")
59
- )}
55
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
60
56
  type="submit"
61
57
  value={msgStr("doSubmit")}
62
58
  />
@@ -1,33 +1,34 @@
1
- import { clsx } from "keycloakify/tools/clsx";
2
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
1
+ import { getKcClsx } from "keycloakify/login/lib/kcClsx";
3
2
  import type { PageProps } from "keycloakify/login/pages/PageProps";
4
3
  import type { KcContext } from "../KcContext";
5
- import type { I18n } from "../i18n";
4
+ import { useI18n } from "../i18n";
6
5
 
7
- export default function LoginResetPassword(props: PageProps<Extract<KcContext, { pageId: "login-reset-password.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LoginResetPassword(props: PageProps<Extract<KcContext, { pageId: "login-reset-password.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
9
8
 
10
- const { getClassName } = useGetClassName({
9
+ const { kcClsx } = getKcClsx({
11
10
  doUseDefaultCss,
12
11
  classes
13
12
  });
14
13
 
15
14
  const { url, realm, auth, messagesPerField } = kcContext;
16
15
 
17
- const { msg, msgStr } = i18n;
16
+ const { msg, msgStr } = useI18n({ kcContext });
18
17
 
19
18
  return (
20
19
  <Template
21
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
20
+ kcContext={kcContext}
21
+ doUseDefaultCss={doUseDefaultCss}
22
+ classes={classes}
22
23
  displayInfo
23
24
  displayMessage={!messagesPerField.existsError("username")}
24
25
  infoNode={realm.duplicateEmailsAllowed ? msg("emailInstructionUsername") : msg("emailInstruction")}
25
26
  headerNode={msg("emailForgotTitle")}
26
27
  >
27
- <form id="kc-reset-password-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
28
- <div className={getClassName("kcFormGroupClass")}>
29
- <div className={getClassName("kcLabelWrapperClass")}>
30
- <label htmlFor="username" className={getClassName("kcLabelClass")}>
28
+ <form id="kc-reset-password-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
29
+ <div className={kcClsx("kcFormGroupClass")}>
30
+ <div className={kcClsx("kcLabelWrapperClass")}>
31
+ <label htmlFor="username" className={kcClsx("kcLabelClass")}>
31
32
  {!realm.loginWithEmailAllowed
32
33
  ? msg("username")
33
34
  : !realm.registrationEmailAsUsername
@@ -35,40 +36,35 @@ export default function LoginResetPassword(props: PageProps<Extract<KcContext, {
35
36
  : msg("email")}
36
37
  </label>
37
38
  </div>
38
- <div className={getClassName("kcInputWrapperClass")}>
39
+ <div className={kcClsx("kcInputWrapperClass")}>
39
40
  <input
40
41
  type="text"
41
42
  id="username"
42
43
  name="username"
43
- className={getClassName("kcInputClass")}
44
+ className={kcClsx("kcInputClass")}
44
45
  autoFocus
45
46
  defaultValue={auth.attemptedUsername ?? ""}
46
47
  aria-invalid={messagesPerField.existsError("username")}
47
48
  />
48
49
  {messagesPerField.existsError("username") && (
49
- <span id="input-error-username" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
50
+ <span id="input-error-username" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
50
51
  {messagesPerField.get("username")}
51
52
  </span>
52
53
  )}
53
54
  </div>
54
55
  </div>
55
- <div className={clsx(getClassName("kcFormGroupClass"), getClassName("kcFormSettingClass"))}>
56
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
57
- <div className={getClassName("kcFormOptionsWrapperClass")}>
56
+ <div className={kcClsx("kcFormGroupClass", "kcFormSettingClass")}>
57
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
58
+ <div className={kcClsx("kcFormOptionsWrapperClass")}>
58
59
  <span>
59
60
  <a href={url.loginUrl}>{msg("backToLogin")}</a>
60
61
  </span>
61
62
  </div>
62
63
  </div>
63
64
 
64
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
65
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
65
66
  <input
66
- className={clsx(
67
- getClassName("kcButtonClass"),
68
- getClassName("kcButtonPrimaryClass"),
69
- getClassName("kcButtonBlockClass"),
70
- getClassName("kcButtonLargeClass")
71
- )}
67
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
72
68
  type="submit"
73
69
  value={msgStr("doSubmit")}
74
70
  />
@@ -1,42 +1,44 @@
1
1
  import { useEffect, useReducer } from "react";
2
- import { clsx } from "keycloakify/tools/clsx";
3
2
  import { assert } from "tsafe/assert";
4
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
3
+ import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx";
5
4
  import type { PageProps } from "keycloakify/login/pages/PageProps";
6
5
  import type { KcContext } from "../KcContext";
7
- import type { I18n } from "../i18n";
6
+ import { useI18n, type I18n } from "../i18n";
8
7
 
9
- export default function LoginUpdatePassword(props: PageProps<Extract<KcContext, { pageId: "login-update-password.ftl" }>, I18n>) {
10
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
8
+ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext, { pageId: "login-update-password.ftl" }>>) {
9
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
11
10
 
12
- const { getClassName } = useGetClassName({
11
+ const { kcClsx } = getKcClsx({
13
12
  doUseDefaultCss,
14
13
  classes
15
14
  });
16
15
 
16
+ const i18n = useI18n({ kcContext });
17
17
  const { msg, msgStr } = i18n;
18
18
 
19
19
  const { url, messagesPerField, isAppInitiatedAction } = kcContext;
20
20
 
21
21
  return (
22
22
  <Template
23
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
23
+ kcContext={kcContext}
24
+ doUseDefaultCss={doUseDefaultCss}
25
+ classes={classes}
24
26
  displayMessage={!messagesPerField.existsError("password", "password-confirm")}
25
27
  headerNode={msg("updatePasswordTitle")}
26
28
  >
27
- <form id="kc-passwd-update-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
28
- <div className={getClassName("kcFormGroupClass")}>
29
- <div className={getClassName("kcLabelWrapperClass")}>
30
- <label htmlFor="password-new" className={getClassName("kcLabelClass")}>
29
+ <form id="kc-passwd-update-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
30
+ <div className={kcClsx("kcFormGroupClass")}>
31
+ <div className={kcClsx("kcLabelWrapperClass")}>
32
+ <label htmlFor="password-new" className={kcClsx("kcLabelClass")}>
31
33
  {msg("passwordNew")}
32
34
  </label>
33
- <div className={getClassName("kcInputWrapperClass")}>
34
- <PasswordWrapper {...{ getClassName, i18n }} passwordInputId="password-new">
35
+ <div className={kcClsx("kcInputWrapperClass")}>
36
+ <PasswordWrapper kcClsx={kcClsx} i18n={i18n} passwordInputId="password-new">
35
37
  <input
36
38
  type="password"
37
39
  id="password-new"
38
40
  name="password-new"
39
- className={getClassName("kcInputClass")}
41
+ className={kcClsx("kcInputClass")}
40
42
  autoFocus
41
43
  autoComplete="new-password"
42
44
  aria-invalid={messagesPerField.existsError("password", "password-confirm")}
@@ -44,7 +46,7 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
44
46
  </PasswordWrapper>
45
47
 
46
48
  {messagesPerField.existsError("password") && (
47
- <span id="input-error-password" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
49
+ <span id="input-error-password" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
48
50
  {messagesPerField.get("password")}
49
51
  </span>
50
52
  )}
@@ -52,19 +54,19 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
52
54
  </div>
53
55
  </div>
54
56
 
55
- <div className={getClassName("kcFormGroupClass")}>
56
- <div className={getClassName("kcLabelWrapperClass")}>
57
- <label htmlFor="password-confirm" className={getClassName("kcLabelClass")}>
57
+ <div className={kcClsx("kcFormGroupClass")}>
58
+ <div className={kcClsx("kcLabelWrapperClass")}>
59
+ <label htmlFor="password-confirm" className={kcClsx("kcLabelClass")}>
58
60
  {msg("passwordConfirm")}
59
61
  </label>
60
62
  </div>
61
- <div className={getClassName("kcInputWrapperClass")}>
62
- <PasswordWrapper {...{ getClassName, i18n }} passwordInputId="password-confirm">
63
+ <div className={kcClsx("kcInputWrapperClass")}>
64
+ <PasswordWrapper kcClsx={kcClsx} i18n={i18n} passwordInputId="password-confirm">
63
65
  <input
64
66
  type="password"
65
67
  id="password-confirm"
66
68
  name="password-confirm"
67
- className={getClassName("kcInputClass")}
69
+ className={kcClsx("kcInputClass")}
68
70
  autoFocus
69
71
  autoComplete="new-password"
70
72
  aria-invalid={messagesPerField.existsError("password", "password-confirm")}
@@ -72,33 +74,29 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
72
74
  </PasswordWrapper>
73
75
 
74
76
  {messagesPerField.existsError("password-confirm") && (
75
- <span id="input-error-password-confirm" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
77
+ <span id="input-error-password-confirm" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
76
78
  {messagesPerField.get("password-confirm")}
77
79
  </span>
78
80
  )}
79
81
  </div>
80
82
 
81
- <div className={getClassName("kcFormGroupClass")}>
82
- <LogoutOtherSessions {...{ getClassName, i18n }} />
83
+ <div className={kcClsx("kcFormGroupClass")}>
84
+ <LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
83
85
 
84
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
86
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
85
87
  <input
86
- className={clsx(
87
- getClassName("kcButtonClass"),
88
- getClassName("kcButtonPrimaryClass"),
89
- isAppInitiatedAction && getClassName("kcButtonBlockClass"),
90
- getClassName("kcButtonLargeClass")
88
+ className={kcClsx(
89
+ "kcButtonClass",
90
+ "kcButtonPrimaryClass",
91
+ isAppInitiatedAction && "kcButtonBlockClass",
92
+ "kcButtonLargeClass"
91
93
  )}
92
94
  type="submit"
93
95
  value={msgStr("doSubmit")}
94
96
  />
95
97
  {isAppInitiatedAction && (
96
98
  <button
97
- className={clsx(
98
- getClassName("kcButtonClass"),
99
- getClassName("kcButtonDefaultClass"),
100
- getClassName("kcButtonLargeClass")
101
- )}
99
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
102
100
  type="submit"
103
101
  name="cancel-aia"
104
102
  value="true"
@@ -114,14 +112,14 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
114
112
  );
115
113
  }
116
114
 
117
- function LogoutOtherSessions(props: { getClassName: ReturnType<typeof useGetClassName>["getClassName"]; i18n: I18n }) {
118
- const { getClassName, i18n } = props;
115
+ function LogoutOtherSessions(props: { kcClsx: KcClsx; i18n: I18n }) {
116
+ const { kcClsx, i18n } = props;
119
117
 
120
118
  const { msg } = i18n;
121
119
 
122
120
  return (
123
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
124
- <div className={getClassName("kcFormOptionsWrapperClass")}>
121
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
122
+ <div className={kcClsx("kcFormOptionsWrapperClass")}>
125
123
  <div className="checkbox">
126
124
  <label>
127
125
  <input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" defaultChecked={true} />
@@ -133,13 +131,8 @@ function LogoutOtherSessions(props: { getClassName: ReturnType<typeof useGetClas
133
131
  );
134
132
  }
135
133
 
136
- function PasswordWrapper(props: {
137
- getClassName: ReturnType<typeof useGetClassName>["getClassName"];
138
- i18n: I18n;
139
- passwordInputId: string;
140
- children: JSX.Element;
141
- }) {
142
- const { getClassName, i18n, passwordInputId, children } = props;
134
+ function PasswordWrapper(props: { kcClsx: KcClsx; i18n: I18n; passwordInputId: string; children: JSX.Element }) {
135
+ const { kcClsx, i18n, passwordInputId, children } = props;
143
136
 
144
137
  const { msgStr } = i18n;
145
138
 
@@ -154,19 +147,16 @@ function PasswordWrapper(props: {
154
147
  }, [isPasswordRevealed]);
155
148
 
156
149
  return (
157
- <div className={getClassName("kcInputGroup")}>
150
+ <div className={kcClsx("kcInputGroup")}>
158
151
  {children}
159
152
  <button
160
153
  type="button"
161
- className={getClassName("kcFormPasswordVisibilityButtonClass")}
154
+ className={kcClsx("kcFormPasswordVisibilityButtonClass")}
162
155
  aria-label={msgStr(isPasswordRevealed ? "hidePassword" : "showPassword")}
163
156
  aria-controls={passwordInputId}
164
157
  onClick={toggleIsPasswordRevealed}
165
158
  >
166
- <i
167
- className={getClassName(isPasswordRevealed ? "kcFormPasswordVisibilityIconHide" : "kcFormPasswordVisibilityIconShow")}
168
- aria-hidden
169
- />
159
+ <i className={kcClsx(isPasswordRevealed ? "kcFormPasswordVisibilityIconHide" : "kcFormPasswordVisibilityIconShow")} aria-hidden />
170
160
  </button>
171
161
  </div>
172
162
  );
@@ -1,65 +1,58 @@
1
1
  import { useState } from "react";
2
- import { clsx } from "keycloakify/tools/clsx";
3
2
  import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
4
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
3
+ import { getKcClsx } from "keycloakify/login/lib/kcClsx";
5
4
  import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
6
5
  import type { PageProps } from "keycloakify/login/pages/PageProps";
7
6
  import type { KcContext } from "../KcContext";
8
- import type { I18n } from "../i18n";
7
+ import { useI18n } from "../i18n";
9
8
 
10
- type LoginUpdateProfileProps = PageProps<Extract<KcContext, { pageId: "login-update-profile.ftl" }>, I18n> & {
9
+ type LoginUpdateProfileProps = PageProps<Extract<KcContext, { pageId: "login-update-profile.ftl" }>> & {
11
10
  UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
12
11
  };
13
12
 
14
13
  export default function LoginUpdateProfile(props: LoginUpdateProfileProps) {
15
- const { kcContext, i18n, doUseDefaultCss, Template, classes, UserProfileFormFields } = props;
14
+ const { kcContext, doUseDefaultCss, Template, classes, UserProfileFormFields } = props;
16
15
 
17
- const { getClassName } = useGetClassName({
16
+ const { kcClsx } = getKcClsx({
18
17
  doUseDefaultCss,
19
18
  classes
20
19
  });
21
20
 
22
- const { url, messagesPerField, isAppInitiatedAction } = kcContext;
21
+ const { url, isAppInitiatedAction } = kcContext;
23
22
 
24
- const { msg, msgStr } = i18n;
23
+ const { msg, msgStr } = useI18n({ kcContext });
25
24
 
26
25
  const [isFormSubmittable, setIsFormSubmittable] = useState(false);
27
26
 
28
27
  return (
29
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} displayRequiredFields headerNode={msg("loginProfileTitle")}>
30
- <form id="kc-update-profile-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
31
- <UserProfileFormFields
32
- {...{
33
- kcContext,
34
- i18n,
35
- getClassName,
36
- messagesPerField
37
- }}
38
- onIsFormSubmittableValueChange={setIsFormSubmittable}
39
- />
40
- <div className={getClassName("kcFormGroupClass")}>
41
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
42
- <div className={getClassName("kcFormOptionsWrapperClass")} />
28
+ <Template
29
+ kcContext={kcContext}
30
+ doUseDefaultCss={doUseDefaultCss}
31
+ classes={classes}
32
+ displayRequiredFields
33
+ headerNode={msg("loginProfileTitle")}
34
+ >
35
+ <form id="kc-update-profile-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
36
+ <UserProfileFormFields kcContext={kcContext} kcClsx={kcClsx} onIsFormSubmittableValueChange={setIsFormSubmittable} />
37
+ <div className={kcClsx("kcFormGroupClass")}>
38
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
39
+ <div className={kcClsx("kcFormOptionsWrapperClass")} />
43
40
  </div>
44
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
41
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
45
42
  <input
46
43
  disabled={!isFormSubmittable}
47
- className={clsx(
48
- getClassName("kcButtonClass"),
49
- getClassName("kcButtonPrimaryClass"),
50
- !isAppInitiatedAction && getClassName("kcButtonBlockClass"),
51
- getClassName("kcButtonLargeClass")
44
+ className={kcClsx(
45
+ "kcButtonClass",
46
+ "kcButtonPrimaryClass",
47
+ !isAppInitiatedAction && "kcButtonBlockClass",
48
+ "kcButtonLargeClass"
52
49
  )}
53
50
  type="submit"
54
51
  value={msgStr("doSubmit")}
55
52
  />
56
53
  {isAppInitiatedAction && (
57
54
  <button
58
- className={clsx(
59
- getClassName("kcButtonClass"),
60
- getClassName("kcButtonDefaultClass"),
61
- getClassName("kcButtonLargeClass")
62
- )}
55
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
63
56
  type="submit"
64
57
  name="cancel-aia"
65
58
  value="true"