keycloakify 10.0.0-rc.37 → 10.0.0-rc.39

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 (307) 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/193.index.js +13 -13
  43. package/bin/{430.index.js → 214.index.js} +161 -2
  44. package/bin/3.index.js +165 -149
  45. package/bin/322.index.js +595 -0
  46. package/bin/453.index.js +3 -3
  47. package/bin/526.index.js +42 -632
  48. package/bin/538.index.js +563 -0
  49. package/bin/932.index.js +7 -7
  50. package/bin/{890.index.js → 941.index.js} +2 -159
  51. package/bin/944.index.js +621 -0
  52. package/bin/961.index.js +5 -5
  53. package/bin/97.index.js +3 -3
  54. package/bin/{314.index.js → 98.index.js} +217 -48
  55. package/bin/main.js +20 -8
  56. package/lib/getKcClsx.d.ts +11 -0
  57. package/lib/getKcClsx.js +55 -0
  58. package/lib/getKcClsx.js.map +1 -0
  59. package/login/Fallback.d.ts +2 -2
  60. package/login/Fallback.js.map +1 -1
  61. package/login/KcContext/KcContext.d.ts +6 -6
  62. package/login/KcContext/getKcContextMock.d.ts +9 -9
  63. package/login/KcContext/getKcContextMock.js +3 -3
  64. package/login/KcContext/getKcContextMock.js.map +1 -1
  65. package/login/Template.d.ts +1 -2
  66. package/login/Template.js +10 -9
  67. package/login/Template.js.map +1 -1
  68. package/login/TemplateProps.d.ts +1 -3
  69. package/login/UserProfileFormFields.d.ts +6 -5
  70. package/login/UserProfileFormFields.js +35 -36
  71. package/login/UserProfileFormFields.js.map +1 -1
  72. package/login/i18n/i18n.d.ts +9 -4
  73. package/login/i18n/i18n.js +136 -91
  74. package/login/i18n/i18n.js.map +1 -1
  75. package/login/i18n/index.d.ts +9 -2
  76. package/login/i18n/index.js +5 -1
  77. package/login/i18n/index.js.map +1 -1
  78. package/login/lib/kcClsx.d.ts +9 -0
  79. package/login/lib/{useGetClassName.js → kcClsx.js} +3 -3
  80. package/login/lib/kcClsx.js.map +1 -0
  81. package/login/lib/useUserProfileForm.d.ts +9 -6
  82. package/login/lib/useUserProfileForm.js +7 -5
  83. package/login/lib/useUserProfileForm.js.map +1 -1
  84. package/login/pages/Code.d.ts +1 -2
  85. package/login/pages/Code.js +6 -5
  86. package/login/pages/Code.js.map +1 -1
  87. package/login/pages/DeleteAccountConfirm.d.ts +1 -2
  88. package/login/pages/DeleteAccountConfirm.js +7 -7
  89. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  90. package/login/pages/DeleteCredential.d.ts +1 -2
  91. package/login/pages/DeleteCredential.js +6 -6
  92. package/login/pages/DeleteCredential.js.map +1 -1
  93. package/login/pages/Error.d.ts +1 -2
  94. package/login/pages/Error.js +4 -3
  95. package/login/pages/Error.js.map +1 -1
  96. package/login/pages/FrontchannelLogout.d.ts +1 -2
  97. package/login/pages/FrontchannelLogout.js +4 -3
  98. package/login/pages/FrontchannelLogout.js.map +1 -1
  99. package/login/pages/IdpReviewUserProfile.d.ts +2 -2
  100. package/login/pages/IdpReviewUserProfile.js +6 -6
  101. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  102. package/login/pages/Info.d.ts +1 -2
  103. package/login/pages/Info.js +4 -3
  104. package/login/pages/Info.js.map +1 -1
  105. package/login/pages/Login.d.ts +1 -2
  106. package/login/pages/Login.js +10 -8
  107. package/login/pages/Login.js.map +1 -1
  108. package/login/pages/LoginConfigTotp.d.ts +1 -2
  109. package/login/pages/LoginConfigTotp.js +8 -7
  110. package/login/pages/LoginConfigTotp.js.map +1 -1
  111. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -2
  112. package/login/pages/LoginIdpLinkConfirm.js +6 -6
  113. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  114. package/login/pages/LoginIdpLinkEmail.d.ts +1 -2
  115. package/login/pages/LoginIdpLinkEmail.js +4 -3
  116. package/login/pages/LoginIdpLinkEmail.js.map +1 -1
  117. package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +1 -2
  118. package/login/pages/LoginOauth2DeviceVerifyUserCode.js +6 -6
  119. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
  120. package/login/pages/LoginOauthGrant.d.ts +1 -2
  121. package/login/pages/LoginOauthGrant.js +7 -7
  122. package/login/pages/LoginOauthGrant.js.map +1 -1
  123. package/login/pages/LoginOtp.d.ts +1 -2
  124. package/login/pages/LoginOtp.js +6 -6
  125. package/login/pages/LoginOtp.js.map +1 -1
  126. package/login/pages/LoginPageExpired.d.ts +1 -2
  127. package/login/pages/LoginPageExpired.js +4 -3
  128. package/login/pages/LoginPageExpired.js.map +1 -1
  129. package/login/pages/LoginPassword.d.ts +1 -2
  130. package/login/pages/LoginPassword.js +9 -7
  131. package/login/pages/LoginPassword.js.map +1 -1
  132. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -2
  133. package/login/pages/LoginRecoveryAuthnCodeConfig.js +9 -7
  134. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  135. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -2
  136. package/login/pages/LoginRecoveryAuthnCodeInput.js +6 -6
  137. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  138. package/login/pages/LoginResetOtp.d.ts +1 -2
  139. package/login/pages/LoginResetOtp.js +6 -6
  140. package/login/pages/LoginResetOtp.js.map +1 -1
  141. package/login/pages/LoginResetPassword.d.ts +1 -2
  142. package/login/pages/LoginResetPassword.js +7 -7
  143. package/login/pages/LoginResetPassword.js.map +1 -1
  144. package/login/pages/LoginUpdatePassword.d.ts +1 -2
  145. package/login/pages/LoginUpdatePassword.js +10 -9
  146. package/login/pages/LoginUpdatePassword.js.map +1 -1
  147. package/login/pages/LoginUpdateProfile.d.ts +2 -2
  148. package/login/pages/LoginUpdateProfile.js +7 -12
  149. package/login/pages/LoginUpdateProfile.js.map +1 -1
  150. package/login/pages/LoginUsername.d.ts +1 -2
  151. package/login/pages/LoginUsername.js +8 -7
  152. package/login/pages/LoginUsername.js.map +1 -1
  153. package/login/pages/LoginVerifyEmail.d.ts +1 -2
  154. package/login/pages/LoginVerifyEmail.js +4 -3
  155. package/login/pages/LoginVerifyEmail.js.map +1 -1
  156. package/login/pages/LoginX509Info.d.ts +1 -2
  157. package/login/pages/LoginX509Info.js +6 -6
  158. package/login/pages/LoginX509Info.js.map +1 -1
  159. package/login/pages/LogoutConfirm.d.ts +1 -2
  160. package/login/pages/LogoutConfirm.js +6 -6
  161. package/login/pages/LogoutConfirm.js.map +1 -1
  162. package/login/pages/PageProps.d.ts +2 -4
  163. package/login/pages/Register.d.ts +2 -2
  164. package/login/pages/Register.js +8 -16
  165. package/login/pages/Register.js.map +1 -1
  166. package/login/pages/SamlPostForm.d.ts +1 -2
  167. package/login/pages/SamlPostForm.js +4 -3
  168. package/login/pages/SamlPostForm.js.map +1 -1
  169. package/login/pages/SelectAuthenticator.d.ts +1 -2
  170. package/login/pages/SelectAuthenticator.js +6 -9
  171. package/login/pages/SelectAuthenticator.js.map +1 -1
  172. package/login/pages/Terms.d.ts +1 -2
  173. package/login/pages/Terms.js +6 -6
  174. package/login/pages/Terms.js.map +1 -1
  175. package/login/pages/UpdateEmail.d.ts +2 -2
  176. package/login/pages/UpdateEmail.js +8 -12
  177. package/login/pages/UpdateEmail.js.map +1 -1
  178. package/login/pages/WebauthnAuthenticate.d.ts +1 -2
  179. package/login/pages/WebauthnAuthenticate.js +13 -12
  180. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  181. package/login/pages/WebauthnError.d.ts +1 -2
  182. package/login/pages/WebauthnError.js +7 -7
  183. package/login/pages/WebauthnError.js.map +1 -1
  184. package/login/pages/WebauthnRegister.d.ts +1 -2
  185. package/login/pages/WebauthnRegister.js +9 -8
  186. package/login/pages/WebauthnRegister.js.map +1 -1
  187. package/package.json +27 -22
  188. package/src/account/Fallback.tsx +1 -2
  189. package/src/account/KcContext/KcContext.ts +7 -7
  190. package/src/account/KcContext/getKcContextMock.ts +13 -24
  191. package/src/account/Template.tsx +8 -8
  192. package/src/account/TemplateProps.ts +1 -6
  193. package/src/account/i18n/i18n.tsx +204 -125
  194. package/src/account/i18n/index.ts +10 -2
  195. package/src/account/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  196. package/src/account/pages/Account.tsx +15 -21
  197. package/src/account/pages/Applications.tsx +8 -9
  198. package/src/account/pages/FederatedIdentity.tsx +5 -5
  199. package/src/account/pages/Log.tsx +8 -8
  200. package/src/account/pages/PageProps.ts +2 -4
  201. package/src/account/pages/Password.tsx +13 -16
  202. package/src/account/pages/Sessions.tsx +9 -10
  203. package/src/account/pages/Totp.tsx +19 -28
  204. package/src/bin/add-story.ts +3 -3
  205. package/src/bin/copy-keycloak-resources-to-public.ts +3 -3
  206. package/src/bin/download-keycloak-default-theme.ts +5 -5
  207. package/src/bin/eject-page.ts +3 -3
  208. package/src/bin/initialize-email-theme.ts +5 -5
  209. package/src/bin/keycloakify/buildJars/buildJar.ts +14 -14
  210. package/src/bin/keycloakify/buildJars/buildJars.ts +8 -8
  211. package/src/bin/keycloakify/buildJars/generatePom.ts +9 -9
  212. package/src/bin/keycloakify/generateFtl/generateFtl.ts +12 -12
  213. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +7 -7
  214. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +2 -66
  215. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +9 -9
  216. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +30 -24
  217. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +8 -8
  218. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +9 -9
  219. package/src/bin/keycloakify/keycloakify.ts +11 -11
  220. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +6 -6
  221. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +7 -7
  222. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +10 -10
  223. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +13 -13
  224. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +11 -11
  225. package/src/bin/main.ts +17 -2
  226. package/src/bin/shared/{buildOptions.ts → buildContext.ts} +65 -51
  227. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +12 -12
  228. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +7 -7
  229. package/src/bin/shared/downloadKeycloakStaticResources.ts +7 -7
  230. package/src/bin/shared/generateKcGenTs.ts +61 -0
  231. package/src/bin/shared/getThemeSrcDirPath.ts +3 -3
  232. package/src/bin/start-keycloak/appBuild.ts +11 -11
  233. package/src/bin/start-keycloak/keycloakifyBuild.ts +7 -7
  234. package/src/bin/start-keycloak/start-keycloak.ts +34 -22
  235. package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
  236. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +3 -3
  237. package/src/bin/update-kc-gen.ts +13 -0
  238. package/src/lib/getKcClsx.ts +89 -0
  239. package/src/login/Fallback.tsx +2 -2
  240. package/src/login/KcContext/KcContext.ts +7 -7
  241. package/src/login/KcContext/getKcContextMock.ts +13 -24
  242. package/src/login/Template.tsx +36 -37
  243. package/src/login/TemplateProps.ts +1 -6
  244. package/src/login/UserProfileFormFields.tsx +67 -84
  245. package/src/login/i18n/i18n.tsx +208 -129
  246. package/src/login/i18n/index.ts +10 -2
  247. package/src/login/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  248. package/src/login/lib/useUserProfileForm.tsx +29 -21
  249. package/src/login/pages/Code.tsx +10 -8
  250. package/src/login/pages/DeleteAccountConfirm.tsx +9 -10
  251. package/src/login/pages/DeleteCredential.tsx +11 -10
  252. package/src/login/pages/Error.tsx +5 -5
  253. package/src/login/pages/FrontchannelLogout.tsx +7 -5
  254. package/src/login/pages/IdpReviewUserProfile.tsx +18 -21
  255. package/src/login/pages/Info.tsx +7 -5
  256. package/src/login/pages/Login.tsx +34 -53
  257. package/src/login/pages/LoginConfigTotp.tsx +30 -38
  258. package/src/login/pages/LoginIdpLinkConfirm.tsx +10 -21
  259. package/src/login/pages/LoginIdpLinkEmail.tsx +5 -5
  260. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +19 -24
  261. package/src/login/pages/LoginOauthGrant.tsx +14 -21
  262. package/src/login/pages/LoginOtp.tsx +29 -33
  263. package/src/login/pages/LoginPageExpired.tsx +5 -5
  264. package/src/login/pages/LoginPassword.tsx +23 -33
  265. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +21 -25
  266. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +21 -25
  267. package/src/login/pages/LoginResetOtp.tsx +21 -25
  268. package/src/login/pages/LoginResetPassword.tsx +21 -25
  269. package/src/login/pages/LoginUpdatePassword.tsx +42 -52
  270. package/src/login/pages/LoginUpdateProfile.tsx +29 -30
  271. package/src/login/pages/LoginUsername.tsx +23 -35
  272. package/src/login/pages/LoginVerifyEmail.tsx +7 -5
  273. package/src/login/pages/LoginX509Info.tsx +27 -36
  274. package/src/login/pages/LogoutConfirm.tsx +11 -17
  275. package/src/login/pages/PageProps.ts +2 -4
  276. package/src/login/pages/Register.tsx +27 -46
  277. package/src/login/pages/SamlPostForm.tsx +5 -5
  278. package/src/login/pages/SelectAuthenticator.tsx +24 -26
  279. package/src/login/pages/Terms.tsx +9 -16
  280. package/src/login/pages/UpdateEmail.tsx +29 -33
  281. package/src/login/pages/WebauthnAuthenticate.tsx +26 -32
  282. package/src/login/pages/WebauthnError.tsx +11 -22
  283. package/src/login/pages/WebauthnRegister.tsx +20 -28
  284. package/src/tools/clsx.ts +6 -48
  285. package/src/tools/clsx_withTransform.ts +55 -0
  286. package/src/vite-plugin/vite-plugin.ts +29 -21
  287. package/tools/clsx.d.ts +3 -2
  288. package/tools/clsx.js +5 -41
  289. package/tools/clsx.js.map +1 -1
  290. package/tools/clsx_withTransform.d.ts +5 -0
  291. package/tools/clsx_withTransform.js +43 -0
  292. package/tools/clsx_withTransform.js.map +1 -0
  293. package/vite-plugin/index.js +243 -102
  294. package/vite-plugin/vite-plugin.d.ts +3 -3
  295. package/account/lib/useGetClassName.d.ts +0 -7
  296. package/account/lib/useGetClassName.js.map +0 -1
  297. package/bin/795.index.js +0 -1197
  298. package/lib/isStorybook.d.ts +0 -1
  299. package/lib/isStorybook.js +0 -3
  300. package/lib/isStorybook.js.map +0 -1
  301. package/lib/useGetClassName.d.ts +0 -10
  302. package/lib/useGetClassName.js +0 -14
  303. package/lib/useGetClassName.js.map +0 -1
  304. package/login/lib/useGetClassName.d.ts +0 -7
  305. package/login/lib/useGetClassName.js.map +0 -1
  306. package/src/lib/isStorybook.ts +0 -3
  307. package/src/lib/useGetClassName.ts +0 -27
@@ -1,27 +1,29 @@
1
1
  import { useState } from "react";
2
2
  import { clsx } from "keycloakify/tools/clsx";
3
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
3
+ import { getKcClsx } from "keycloakify/login/lib/kcClsx";
4
4
  import type { PageProps } from "keycloakify/login/pages/PageProps";
5
5
  import type { KcContext } from "../KcContext";
6
- import type { I18n } from "../i18n";
6
+ import { useI18n } from "../i18n";
7
7
 
8
- export default function LoginUsername(props: PageProps<Extract<KcContext, { pageId: "login-username.ftl" }>, I18n>) {
9
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
8
+ export default function LoginUsername(props: PageProps<Extract<KcContext, { pageId: "login-username.ftl" }>>) {
9
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
10
10
 
11
- const { getClassName } = useGetClassName({
11
+ const { kcClsx } = getKcClsx({
12
12
  doUseDefaultCss,
13
13
  classes
14
14
  });
15
15
 
16
16
  const { social, realm, url, usernameHidden, login, registrationDisabled, messagesPerField } = kcContext;
17
17
 
18
- const { msg, msgStr } = i18n;
18
+ const { msg, msgStr } = useI18n({ kcContext });
19
19
 
20
20
  const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
21
21
 
22
22
  return (
23
23
  <Template
24
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
24
+ kcContext={kcContext}
25
+ doUseDefaultCss={doUseDefaultCss}
26
+ classes={classes}
25
27
  displayMessage={!messagesPerField.existsError("username")}
26
28
  displayInfo={realm.password && realm.registrationAllowed && !registrationDisabled}
27
29
  infoNode={
@@ -38,32 +40,23 @@ export default function LoginUsername(props: PageProps<Extract<KcContext, { page
38
40
  socialProvidersNode={
39
41
  <>
40
42
  {realm.password && social.providers?.length && (
41
- <div id="kc-social-providers" className={getClassName("kcFormSocialAccountSectionClass")}>
43
+ <div id="kc-social-providers" className={kcClsx("kcFormSocialAccountSectionClass")}>
42
44
  <hr />
43
45
  <h2>{msg("identity-provider-login-label")}</h2>
44
- <ul
45
- className={clsx(
46
- getClassName("kcFormSocialAccountListClass"),
47
- social.providers.length > 3 && getClassName("kcFormSocialAccountListGridClass")
48
- )}
49
- >
46
+ <ul className={kcClsx("kcFormSocialAccountListClass", social.providers.length > 3 && "kcFormSocialAccountListGridClass")}>
50
47
  {social.providers.map((...[p, , providers]) => (
51
48
  <li key={p.alias}>
52
49
  <a
53
50
  id={`social-${p.alias}`}
54
- className={clsx(
55
- getClassName("kcFormSocialAccountListButtonClass"),
56
- providers.length > 3 && getClassName("kcFormSocialAccountGridItem")
51
+ className={kcClsx(
52
+ "kcFormSocialAccountListButtonClass",
53
+ providers.length > 3 && "kcFormSocialAccountGridItem"
57
54
  )}
58
55
  type="button"
59
56
  href={p.loginUrl}
60
57
  >
61
- {p.iconClasses && (
62
- <i className={clsx(getClassName("kcCommonLogoIdP"), p.iconClasses)} aria-hidden="true"></i>
63
- )}
64
- <span
65
- className={clsx(getClassName("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}
66
- >
58
+ {p.iconClasses && <i className={clsx(kcClsx("kcCommonLogoIdP"), p.iconClasses)} aria-hidden="true"></i>}
59
+ <span className={clsx(kcClsx("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}>
67
60
  {p.displayName}
68
61
  </span>
69
62
  </a>
@@ -88,8 +81,8 @@ export default function LoginUsername(props: PageProps<Extract<KcContext, { page
88
81
  method="post"
89
82
  >
90
83
  {!usernameHidden && (
91
- <div className={getClassName("kcFormGroupClass")}>
92
- <label htmlFor="username" className={getClassName("kcLabelClass")}>
84
+ <div className={kcClsx("kcFormGroupClass")}>
85
+ <label htmlFor="username" className={kcClsx("kcLabelClass")}>
93
86
  {!realm.loginWithEmailAllowed
94
87
  ? msg("username")
95
88
  : !realm.registrationEmailAsUsername
@@ -99,7 +92,7 @@ export default function LoginUsername(props: PageProps<Extract<KcContext, { page
99
92
  <input
100
93
  tabIndex={2}
101
94
  id="username"
102
- className={getClassName("kcInputClass")}
95
+ className={kcClsx("kcInputClass")}
103
96
  name="username"
104
97
  defaultValue={login.username ?? ""}
105
98
  type="text"
@@ -108,14 +101,14 @@ export default function LoginUsername(props: PageProps<Extract<KcContext, { page
108
101
  aria-invalid={messagesPerField.existsError("username")}
109
102
  />
110
103
  {messagesPerField.existsError("username") && (
111
- <span id="input-error" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
104
+ <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
112
105
  {messagesPerField.getFirstError("username")}
113
106
  </span>
114
107
  )}
115
108
  </div>
116
109
  )}
117
110
 
118
- <div className={clsx(getClassName("kcFormGroupClass"), getClassName("kcFormSettingClass"))}>
111
+ <div className={kcClsx("kcFormGroupClass", "kcFormSettingClass")}>
119
112
  <div id="kc-form-options">
120
113
  {realm.rememberMe && !usernameHidden && (
121
114
  <div className="checkbox">
@@ -134,16 +127,11 @@ export default function LoginUsername(props: PageProps<Extract<KcContext, { page
134
127
  </div>
135
128
  </div>
136
129
 
137
- <div id="kc-form-buttons" className={getClassName("kcFormGroupClass")}>
130
+ <div id="kc-form-buttons" className={kcClsx("kcFormGroupClass")}>
138
131
  <input
139
132
  tabIndex={4}
140
133
  disabled={isLoginButtonDisabled}
141
- className={clsx(
142
- getClassName("kcButtonClass"),
143
- getClassName("kcButtonPrimaryClass"),
144
- getClassName("kcButtonBlockClass"),
145
- getClassName("kcButtonLargeClass")
146
- )}
134
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
147
135
  name="login"
148
136
  id="kc-login"
149
137
  type="submit"
@@ -1,17 +1,19 @@
1
1
  import type { PageProps } from "keycloakify/login/pages/PageProps";
2
2
  import type { KcContext } from "../KcContext";
3
- import type { I18n } from "../i18n";
3
+ import { useI18n } from "../i18n";
4
4
 
5
- export default function LoginVerifyEmail(props: PageProps<Extract<KcContext, { pageId: "login-verify-email.ftl" }>, I18n>) {
6
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
5
+ export default function LoginVerifyEmail(props: PageProps<Extract<KcContext, { pageId: "login-verify-email.ftl" }>>) {
6
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
7
7
 
8
- const { msg } = i18n;
8
+ const { msg } = useI18n({ kcContext });
9
9
 
10
10
  const { url, user } = kcContext;
11
11
 
12
12
  return (
13
13
  <Template
14
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
14
+ kcContext={kcContext}
15
+ doUseDefaultCss={doUseDefaultCss}
16
+ classes={classes}
15
17
  displayInfo
16
18
  headerNode={msg("emailVerifyTitle")}
17
19
  infoNode={
@@ -1,72 +1,67 @@
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 LoginX509Info(props: PageProps<Extract<KcContext, { pageId: "login-x509-info.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LoginX509Info(props: PageProps<Extract<KcContext, { pageId: "login-x509-info.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, x509 } = kcContext;
16
15
 
17
- const { msg, msgStr } = i18n;
16
+ const { msg, msgStr } = useI18n({ kcContext });
18
17
 
19
18
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("doLogIn")}>
21
- <form id="kc-x509-login-info" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
22
- <div className={getClassName("kcFormGroupClass")}>
23
- <div className={getClassName("kcLabelWrapperClass")}>
24
- <label htmlFor="certificate_subjectDN" className={getClassName("kcLabelClass")}>
19
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("doLogIn")}>
20
+ <form id="kc-x509-login-info" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
21
+ <div className={kcClsx("kcFormGroupClass")}>
22
+ <div className={kcClsx("kcLabelWrapperClass")}>
23
+ <label htmlFor="certificate_subjectDN" className={kcClsx("kcLabelClass")}>
25
24
  {msg("clientCertificate")}
26
25
  </label>
27
26
  </div>
28
27
  {x509.formData.subjectDN ? (
29
- <div className={getClassName("kcLabelWrapperClass")}>
30
- <label id="certificate_subjectDN" className={getClassName("kcLabelClass")}>
28
+ <div className={kcClsx("kcLabelWrapperClass")}>
29
+ <label id="certificate_subjectDN" className={kcClsx("kcLabelClass")}>
31
30
  {x509.formData.subjectDN}
32
31
  </label>
33
32
  </div>
34
33
  ) : (
35
- <div className={getClassName("kcLabelWrapperClass")}>
36
- <label id="certificate_subjectDN" className={getClassName("kcLabelClass")}>
34
+ <div className={kcClsx("kcLabelWrapperClass")}>
35
+ <label id="certificate_subjectDN" className={kcClsx("kcLabelClass")}>
37
36
  {msg("noCertificate")}
38
37
  </label>
39
38
  </div>
40
39
  )}
41
40
  </div>
42
- <div className={getClassName("kcFormGroupClass")}>
41
+ <div className={kcClsx("kcFormGroupClass")}>
43
42
  {x509.formData.isUserEnabled && (
44
43
  <>
45
- <div className={getClassName("kcLabelWrapperClass")}>
46
- <label htmlFor="username" className={getClassName("kcLabelClass")}>
44
+ <div className={kcClsx("kcLabelWrapperClass")}>
45
+ <label htmlFor="username" className={kcClsx("kcLabelClass")}>
47
46
  {msg("doX509Login")}
48
47
  </label>
49
48
  </div>
50
- <div className={getClassName("kcLabelWrapperClass")}>
51
- <label id="username" className={getClassName("kcLabelClass")}>
49
+ <div className={kcClsx("kcLabelWrapperClass")}>
50
+ <label id="username" className={kcClsx("kcLabelClass")}>
52
51
  {x509.formData.username}
53
52
  </label>
54
53
  </div>
55
54
  </>
56
55
  )}
57
56
  </div>
58
- <div className={getClassName("kcFormGroupClass")}>
59
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
60
- <div className={getClassName("kcFormOptionsWrapperClass")} />
57
+ <div className={kcClsx("kcFormGroupClass")}>
58
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
59
+ <div className={kcClsx("kcFormOptionsWrapperClass")} />
61
60
  </div>
62
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
63
- <div className={getClassName("kcFormButtonsWrapperClass")}>
61
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
62
+ <div className={kcClsx("kcFormButtonsWrapperClass")}>
64
63
  <input
65
- className={clsx(
66
- getClassName("kcButtonClass"),
67
- getClassName("kcButtonPrimaryClass"),
68
- getClassName("kcButtonLargeClass")
69
- )}
64
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass")}
70
65
  name="login"
71
66
  id="kc-login"
72
67
  type="submit"
@@ -74,11 +69,7 @@ export default function LoginX509Info(props: PageProps<Extract<KcContext, { page
74
69
  />
75
70
  {x509.formData.isUserEnabled && (
76
71
  <input
77
- className={clsx(
78
- getClassName("kcButtonClass"),
79
- getClassName("kcButtonDefaultClass"),
80
- getClassName("kcButtonLargeClass")
81
- )}
72
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
82
73
  name="cancel"
83
74
  id="kc-cancel"
84
75
  type="submit"
@@ -1,40 +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 LogoutConfirm(props: PageProps<Extract<KcContext, { pageId: "logout-confirm.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { pageId: "logout-confirm.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, client, logoutConfirm } = kcContext;
16
15
 
17
- const { msg, msgStr } = i18n;
16
+ const { msg, msgStr } = useI18n({ kcContext });
18
17
 
19
18
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("logoutConfirmTitle")}>
19
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("logoutConfirmTitle")}>
21
20
  <div id="kc-logout-confirm" className="content-area">
22
21
  <p className="instruction">{msg("logoutConfirmHeader")}</p>
23
22
  <form className="form-actions" action={url.logoutConfirmAction} method="POST">
24
23
  <input type="hidden" name="session_code" value={logoutConfirm.code} />
25
- <div className={getClassName("kcFormGroupClass")}>
24
+ <div className={kcClsx("kcFormGroupClass")}>
26
25
  <div id="kc-form-options">
27
- <div className={getClassName("kcFormOptionsWrapperClass")}></div>
26
+ <div className={kcClsx("kcFormOptionsWrapperClass")}></div>
28
27
  </div>
29
- <div id="kc-form-buttons" className={getClassName("kcFormGroupClass")}>
28
+ <div id="kc-form-buttons" className={kcClsx("kcFormGroupClass")}>
30
29
  <input
31
30
  tabIndex={4}
32
- className={clsx(
33
- getClassName("kcButtonClass"),
34
- getClassName("kcButtonPrimaryClass"),
35
- getClassName("kcButtonBlockClass"),
36
- getClassName("kcButtonLargeClass")
37
- )}
31
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
38
32
  name="confirmLogout"
39
33
  id="kc-logout"
40
34
  type="submit"
@@ -1,12 +1,10 @@
1
- import type { I18n } from "keycloakify/login/i18n";
2
1
  import { type TemplateProps, type ClassKey } from "keycloakify/login/TemplateProps";
3
2
  import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
4
3
  import type { KcContext } from "keycloakify/account/KcContext";
5
4
 
6
- export type PageProps<NarowedKcContext = KcContext, I18nExtended extends I18n = I18n> = {
7
- Template: LazyOrNot<(props: TemplateProps<any, any>) => JSX.Element | null>;
5
+ export type PageProps<NarowedKcContext = KcContext> = {
6
+ Template: LazyOrNot<(props: TemplateProps<any>) => JSX.Element | null>;
8
7
  kcContext: NarowedKcContext;
9
- i18n: I18nExtended;
10
8
  doUseDefaultCss: boolean;
11
9
  classes?: Partial<Record<ClassKey, string>>;
12
10
  };
@@ -1,77 +1,62 @@
1
1
  import { useState } from "react";
2
- import { clsx } from "keycloakify/tools/clsx";
3
2
  import { Markdown } from "keycloakify/tools/Markdown";
4
3
  import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
5
4
  import { useTermsMarkdown } from "keycloakify/login/lib/useDownloadTerms";
6
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
5
+ import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx";
7
6
  import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
8
7
  import type { PageProps } from "keycloakify/login/pages/PageProps";
9
8
  import type { KcContext } from "../KcContext";
10
- import type { I18n } from "../i18n";
9
+ import { useI18n, type I18n } from "../i18n";
11
10
 
12
- type RegisterProps = PageProps<Extract<KcContext, { pageId: "register.ftl" }>, I18n> & {
11
+ type RegisterProps = PageProps<Extract<KcContext, { pageId: "register.ftl" }>> & {
13
12
  UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
13
+ doMakeUserConfirmPassword: boolean;
14
14
  };
15
15
 
16
16
  export default function Register(props: RegisterProps) {
17
- const { kcContext, i18n, doUseDefaultCss, Template, classes, UserProfileFormFields } = props;
17
+ const { kcContext, doUseDefaultCss, Template, classes, UserProfileFormFields, doMakeUserConfirmPassword } = props;
18
18
 
19
- const { getClassName } = useGetClassName({
19
+ const { kcClsx } = getKcClsx({
20
20
  doUseDefaultCss,
21
21
  classes
22
22
  });
23
23
 
24
24
  const { url, messagesPerField, recaptchaRequired, recaptchaSiteKey, termsAcceptanceRequired } = kcContext;
25
25
 
26
+ const i18n = useI18n({ kcContext });
26
27
  const { msg, msgStr } = i18n;
27
28
 
28
29
  const [isFormSubmittable, setIsFormSubmittable] = useState(false);
29
30
 
30
31
  return (
31
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("registerTitle")} displayRequiredFields>
32
- <form id="kc-register-form" className={getClassName("kcFormClass")} action={url.registrationAction} method="post">
32
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("registerTitle")} displayRequiredFields>
33
+ <form id="kc-register-form" className={kcClsx("kcFormClass")} action={url.registrationAction} method="post">
33
34
  <UserProfileFormFields
34
- {...{
35
- kcContext,
36
- i18n,
37
- getClassName,
38
- messagesPerField
39
- }}
35
+ kcContext={kcContext}
36
+ kcClsx={kcClsx}
40
37
  onIsFormSubmittableValueChange={setIsFormSubmittable}
38
+ doMakeUserConfirmPassword={doMakeUserConfirmPassword}
41
39
  />
42
- {termsAcceptanceRequired && (
43
- <TermsAcceptance
44
- {...{
45
- i18n,
46
- getClassName,
47
- messagesPerField
48
- }}
49
- />
50
- )}
40
+ {termsAcceptanceRequired && <TermsAcceptance i18n={i18n} kcClsx={kcClsx} messagesPerField={messagesPerField} />}
51
41
  {recaptchaRequired && (
52
42
  <div className="form-group">
53
- <div className={getClassName("kcInputWrapperClass")}>
43
+ <div className={kcClsx("kcInputWrapperClass")}>
54
44
  <div className="g-recaptcha" data-size="compact" data-sitekey={recaptchaSiteKey}></div>
55
45
  </div>
56
46
  </div>
57
47
  )}
58
- <div className={getClassName("kcFormGroupClass")}>
59
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
60
- <div className={getClassName("kcFormOptionsWrapperClass")}>
48
+ <div className={kcClsx("kcFormGroupClass")}>
49
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
50
+ <div className={kcClsx("kcFormOptionsWrapperClass")}>
61
51
  <span>
62
52
  <a href={url.loginUrl}>{msg("backToLogin")}</a>
63
53
  </span>
64
54
  </div>
65
55
  </div>
66
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
56
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
67
57
  <input
68
58
  disabled={!isFormSubmittable}
69
- className={clsx(
70
- getClassName("kcButtonClass"),
71
- getClassName("kcButtonPrimaryClass"),
72
- getClassName("kcButtonBlockClass"),
73
- getClassName("kcButtonLargeClass")
74
- )}
59
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
75
60
  type="submit"
76
61
  value={msgStr("doRegister")}
77
62
  />
@@ -82,12 +67,8 @@ export default function Register(props: RegisterProps) {
82
67
  );
83
68
  }
84
69
 
85
- function TermsAcceptance(props: {
86
- i18n: I18n;
87
- getClassName: ReturnType<typeof useGetClassName>["getClassName"];
88
- messagesPerField: Pick<KcContext["messagesPerField"], "existsError" | "get">;
89
- }) {
90
- const { i18n, getClassName, messagesPerField } = props;
70
+ function TermsAcceptance(props: { i18n: I18n; kcClsx: KcClsx; messagesPerField: Pick<KcContext["messagesPerField"], "existsError" | "get"> }) {
71
+ const { i18n, kcClsx, messagesPerField } = props;
91
72
 
92
73
  const { msg } = i18n;
93
74
 
@@ -101,7 +82,7 @@ function TermsAcceptance(props: {
101
82
  return (
102
83
  <>
103
84
  <div className="form-group">
104
- <div className={getClassName("kcInputWrapperClass")}>
85
+ <div className={kcClsx("kcInputWrapperClass")}>
105
86
  {msg("termsTitle")}
106
87
  <div id="kc-registration-terms-text">
107
88
  <Markdown>{termsMarkdown}</Markdown>
@@ -109,21 +90,21 @@ function TermsAcceptance(props: {
109
90
  </div>
110
91
  </div>
111
92
  <div className="form-group">
112
- <div className={getClassName("kcLabelWrapperClass")}>
93
+ <div className={kcClsx("kcLabelWrapperClass")}>
113
94
  <input
114
95
  type="checkbox"
115
96
  id="termsAccepted"
116
97
  name="termsAccepted"
117
- className={getClassName("kcCheckboxInputClass")}
98
+ className={kcClsx("kcCheckboxInputClass")}
118
99
  aria-invalid={messagesPerField.existsError("termsAccepted")}
119
100
  />
120
- <label htmlFor="termsAccepted" className={getClassName("kcLabelClass")}>
101
+ <label htmlFor="termsAccepted" className={kcClsx("kcLabelClass")}>
121
102
  {msg("acceptTerms")}
122
103
  </label>
123
104
  </div>
124
105
  {messagesPerField.existsError("termsAccepted") && (
125
- <div className={getClassName("kcLabelWrapperClass")}>
126
- <span id="input-error-terms-accepted" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
106
+ <div className={kcClsx("kcLabelWrapperClass")}>
107
+ <span id="input-error-terms-accepted" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
127
108
  {messagesPerField.get("termsAccepted")}
128
109
  </span>
129
110
  </div>
@@ -1,12 +1,12 @@
1
1
  import { useEffect, useState } from "react";
2
2
  import type { PageProps } from "keycloakify/login/pages/PageProps";
3
3
  import type { KcContext } from "../KcContext";
4
- import type { I18n } from "../i18n";
4
+ import { useI18n } from "../i18n";
5
5
 
6
- export default function SamlPostForm(props: PageProps<Extract<KcContext, { pageId: "saml-post-form.ftl" }>, I18n>) {
7
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function SamlPostForm(props: PageProps<Extract<KcContext, { pageId: "saml-post-form.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
8
8
 
9
- const { msgStr, msg } = i18n;
9
+ const { msgStr, msg } = useI18n({ kcContext });
10
10
 
11
11
  const { samlPost } = kcContext;
12
12
 
@@ -26,7 +26,7 @@ export default function SamlPostForm(props: PageProps<Extract<KcContext, { pageI
26
26
  htmlFormElement.submit();
27
27
  }, [htmlFormElement]);
28
28
  return (
29
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("saml.post-form.title")}>
29
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("saml.post-form.title")}>
30
30
  <p>{msg("saml.post-form.message")}</p>
31
31
  <form name="saml-post-binding" method="post" action={samlPost.url} ref={setHtmlFormElement}>
32
32
  {samlPost.SAMLRequest && <input type="hidden" name="SAMLRequest" value={samlPost.SAMLRequest} />}
@@ -1,45 +1,43 @@
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 SelectAuthenticator(props: PageProps<Extract<KcContext, { pageId: "select-authenticator.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function SelectAuthenticator(props: PageProps<Extract<KcContext, { pageId: "select-authenticator.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
9
8
  const { url, auth } = kcContext;
10
9
 
11
- const { getClassName } = useGetClassName({ doUseDefaultCss, classes });
12
- const { msg } = i18n;
10
+ const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
11
+ const { msg } = useI18n({ kcContext });
13
12
 
14
13
  return (
15
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} displayInfo={false} headerNode={msg("loginChooseAuthenticator")}>
16
- <form id="kc-select-credential-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
17
- <div className={getClassName("kcSelectAuthListClass")}>
14
+ <Template
15
+ kcContext={kcContext}
16
+ doUseDefaultCss={doUseDefaultCss}
17
+ classes={classes}
18
+ displayInfo={false}
19
+ headerNode={msg("loginChooseAuthenticator")}
20
+ >
21
+ <form id="kc-select-credential-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
22
+ <div className={kcClsx("kcSelectAuthListClass")}>
18
23
  {auth.authenticationSelections.map((authenticationSelection, i) => (
19
24
  <button
20
25
  key={i}
21
- className={getClassName("kcSelectAuthListItemClass")}
26
+ className={kcClsx("kcSelectAuthListItemClass")}
22
27
  type="submit"
23
28
  name="authenticationExecution"
24
29
  value={authenticationSelection.authExecId}
25
30
  >
26
- <div className={getClassName("kcSelectAuthListItemIconClass")}>
27
- <i
28
- className={clsx(
29
- // @ts-expect-error: iconCssClass is a string and not a class key
30
- // however getClassName gracefully handles this case at runtime
31
- getClassName(authenticationSelection.iconCssClass),
32
- getClassName("kcSelectAuthListItemIconPropertyClass")
33
- )}
34
- />
31
+ <div className={kcClsx("kcSelectAuthListItemIconClass")}>
32
+ <i className={kcClsx(authenticationSelection.iconCssClass, "kcSelectAuthListItemIconPropertyClass")} />
35
33
  </div>
36
- <div className={getClassName("kcSelectAuthListItemBodyClass")}>
37
- <div className={getClassName("kcSelectAuthListItemHeadingClass")}>{msg(authenticationSelection.displayName)}</div>
38
- <div className={getClassName("kcSelectAuthListItemDescriptionClass")}>{msg(authenticationSelection.helpText)}</div>
34
+ <div className={kcClsx("kcSelectAuthListItemBodyClass")}>
35
+ <div className={kcClsx("kcSelectAuthListItemHeadingClass")}>{msg(authenticationSelection.displayName)}</div>
36
+ <div className={kcClsx("kcSelectAuthListItemDescriptionClass")}>{msg(authenticationSelection.helpText)}</div>
39
37
  </div>
40
- <div className={getClassName("kcSelectAuthListItemFillClass")} />
41
- <div className={getClassName("kcSelectAuthListItemArrowClass")}>
42
- <i className={getClassName("kcSelectAuthListItemArrowIconClass")} />
38
+ <div className={kcClsx("kcSelectAuthListItemFillClass")} />
39
+ <div className={kcClsx("kcSelectAuthListItemArrowClass")}>
40
+ <i className={kcClsx("kcSelectAuthListItemArrowIconClass")} />
43
41
  </div>
44
42
  </button>
45
43
  ))}