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,15 +1,14 @@
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 DeleteCredential(props: PageProps<Extract<KcContext, { pageId: "delete-credential.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function DeleteCredential(props: PageProps<Extract<KcContext, { pageId: "delete-credential.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
9
8
 
10
- const { msgStr, msg } = i18n;
9
+ const { msgStr, msg } = useI18n({ kcContext });
11
10
 
12
- const { getClassName } = useGetClassName({
11
+ const { kcClsx } = getKcClsx({
13
12
  doUseDefaultCss,
14
13
  classes
15
14
  });
@@ -18,21 +17,23 @@ export default function DeleteCredential(props: PageProps<Extract<KcContext, { p
18
17
 
19
18
  return (
20
19
  <Template
21
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
20
+ kcContext={kcContext}
21
+ doUseDefaultCss={doUseDefaultCss}
22
+ classes={classes}
22
23
  displayMessage={false}
23
24
  headerNode={msg("deleteCredentialTitle", credentialLabel)}
24
25
  >
25
26
  <div id="kc-delete-text">{msg("deleteCredentialMessage", credentialLabel)}</div>
26
27
  <form className="form-actions" action={url.loginAction} method="POST">
27
28
  <input
28
- className={clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass"))}
29
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass")}
29
30
  name="accept"
30
31
  id="kc-accept"
31
32
  type="submit"
32
33
  value={msgStr("doConfirmDelete")}
33
34
  />
34
35
  <input
35
- className={clsx(getClassName("kcButtonClass"), getClassName("kcButtonDefaultClass"), getClassName("kcButtonLargeClass"))}
36
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
36
37
  name="cancel-aia"
37
38
  value={msgStr("doCancel")}
38
39
  id="kc-decline"
@@ -1,16 +1,16 @@
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 Error(props: PageProps<Extract<KcContext, { pageId: "error.ftl" }>, I18n>) {
6
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
5
+ export default function Error(props: PageProps<Extract<KcContext, { pageId: "error.ftl" }>>) {
6
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
7
7
 
8
8
  const { message, client, skipLink } = kcContext;
9
9
 
10
- const { msg } = i18n;
10
+ const { msg } = useI18n({ kcContext });
11
11
 
12
12
  return (
13
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} displayMessage={false} headerNode={msg("errorTitle")}>
13
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} displayMessage={false} headerNode={msg("errorTitle")}>
14
14
  <div id="kc-error-message">
15
15
  <p className="instruction">{message.summary}</p>
16
16
  {!skipLink && client !== undefined && client.baseUrl !== undefined && (
@@ -1,14 +1,14 @@
1
1
  import { useEffect } 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 FrontchannelLogout(props: PageProps<Extract<KcContext, { pageId: "frontchannel-logout.ftl" }>, I18n>) {
7
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function FrontchannelLogout(props: PageProps<Extract<KcContext, { pageId: "frontchannel-logout.ftl" }>>) {
7
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
8
8
 
9
9
  const { logout } = kcContext;
10
10
 
11
- const { msg, msgStr } = i18n;
11
+ const { msg, msgStr } = useI18n({ kcContext });
12
12
 
13
13
  useEffect(() => {
14
14
  if (logout.logoutRedirectUri) {
@@ -18,7 +18,9 @@ export default function FrontchannelLogout(props: PageProps<Extract<KcContext, {
18
18
 
19
19
  return (
20
20
  <Template
21
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
21
+ kcContext={kcContext}
22
+ doUseDefaultCss={doUseDefaultCss}
23
+ classes={classes}
22
24
  documentTitle={msgStr("frontchannel-logout.title")}
23
25
  headerNode={msg("frontchannel-logout.title")}
24
26
  >
@@ -1,25 +1,25 @@
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 { PageProps } from "keycloakify/login/pages/PageProps";
6
5
  import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
7
6
  import type { KcContext } from "../KcContext";
8
- import type { I18n } from "../i18n";
7
+ import { useI18n } from "../i18n";
9
8
 
10
- type IdpReviewUserProfileProps = PageProps<Extract<KcContext, { pageId: "idp-review-user-profile.ftl" }>, I18n> & {
9
+ type IdpReviewUserProfileProps = PageProps<Extract<KcContext, { pageId: "idp-review-user-profile.ftl" }>> & {
11
10
  UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
11
+ doMakeUserConfirmPassword: boolean;
12
12
  };
13
13
 
14
14
  export default function IdpReviewUserProfile(props: IdpReviewUserProfileProps) {
15
- const { kcContext, i18n, doUseDefaultCss, Template, classes, UserProfileFormFields } = props;
15
+ const { kcContext, doUseDefaultCss, Template, classes, UserProfileFormFields, doMakeUserConfirmPassword } = props;
16
16
 
17
- const { getClassName } = useGetClassName({
17
+ const { kcClsx } = getKcClsx({
18
18
  doUseDefaultCss,
19
19
  classes
20
20
  });
21
21
 
22
- const { msg, msgStr } = i18n;
22
+ const { msg, msgStr } = useI18n({ kcContext });
23
23
 
24
24
  const { url, messagesPerField } = kcContext;
25
25
 
@@ -27,30 +27,27 @@ export default function IdpReviewUserProfile(props: IdpReviewUserProfileProps) {
27
27
 
28
28
  return (
29
29
  <Template
30
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
30
+ kcContext={kcContext}
31
+ doUseDefaultCss={doUseDefaultCss}
32
+ classes={classes}
31
33
  displayMessage={messagesPerField.exists("global")}
32
34
  displayRequiredFields
33
35
  headerNode={msg("loginIdpReviewProfileTitle")}
34
36
  >
35
- <form id="kc-idp-review-profile-form" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
37
+ <form id="kc-idp-review-profile-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
36
38
  <UserProfileFormFields
37
39
  kcContext={kcContext}
38
40
  onIsFormSubmittableValueChange={setIsFomSubmittable}
39
- i18n={i18n}
40
- getClassName={getClassName}
41
+ kcClsx={kcClsx}
42
+ doMakeUserConfirmPassword={doMakeUserConfirmPassword}
41
43
  />
42
- <div className={getClassName("kcFormGroupClass")}>
43
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
44
- <div className={getClassName("kcFormOptionsWrapperClass")} />
44
+ <div className={kcClsx("kcFormGroupClass")}>
45
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
46
+ <div className={kcClsx("kcFormOptionsWrapperClass")} />
45
47
  </div>
46
- <div id="kc-form-buttons" className={getClassName("kcFormButtonsClass")}>
48
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
47
49
  <input
48
- className={clsx(
49
- getClassName("kcButtonClass"),
50
- getClassName("kcButtonPrimaryClass"),
51
- getClassName("kcButtonBlockClass"),
52
- getClassName("kcButtonLargeClass")
53
- )}
50
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
54
51
  type="submit"
55
52
  value={msgStr("doSubmit")}
56
53
  disabled={!isFomSubmittable}
@@ -1,12 +1,12 @@
1
1
  import { assert } from "keycloakify/tools/assert";
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 Info(props: PageProps<Extract<KcContext, { pageId: "info.ftl" }>, I18n>) {
7
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function Info(props: PageProps<Extract<KcContext, { pageId: "info.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
  assert(
12
12
  kcContext.message !== undefined,
@@ -17,7 +17,9 @@ export default function Info(props: PageProps<Extract<KcContext, { pageId: "info
17
17
 
18
18
  return (
19
19
  <Template
20
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
20
+ kcContext={kcContext}
21
+ doUseDefaultCss={doUseDefaultCss}
22
+ classes={classes}
21
23
  displayMessage={false}
22
24
  headerNode={messageHeader !== undefined ? <>{messageHeader}</> : <>{message.summary}</>}
23
25
  >
@@ -2,27 +2,30 @@ import { useState, useEffect, useReducer } from "react";
2
2
  import { assert } from "tsafe/assert";
3
3
  import { clsx } from "keycloakify/tools/clsx";
4
4
  import type { PageProps } from "keycloakify/login/pages/PageProps";
5
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
5
+ import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx";
6
6
  import type { KcContext } from "../KcContext";
7
- import type { I18n } from "../i18n";
7
+ import { useI18n, type I18n } from "../i18n";
8
8
 
9
- export default function Login(props: PageProps<Extract<KcContext, { pageId: "login.ftl" }>, I18n>) {
10
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
9
+ export default function Login(props: PageProps<Extract<KcContext, { pageId: "login.ftl" }>>) {
10
+ const { kcContext, doUseDefaultCss, Template, classes } = props;
11
11
 
12
- const { getClassName } = useGetClassName({
12
+ const { kcClsx } = getKcClsx({
13
13
  doUseDefaultCss,
14
14
  classes
15
15
  });
16
16
 
17
17
  const { social, realm, url, usernameHidden, login, auth, registrationDisabled, messagesPerField } = kcContext;
18
18
 
19
+ const i18n = useI18n({ kcContext });
19
20
  const { msg, msgStr } = i18n;
20
21
 
21
22
  const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
22
23
 
23
24
  return (
24
25
  <Template
25
- {...{ kcContext, i18n, doUseDefaultCss, classes }}
26
+ kcContext={kcContext}
27
+ doUseDefaultCss={doUseDefaultCss}
28
+ classes={classes}
26
29
  displayMessage={!messagesPerField.existsError("username", "password")}
27
30
  headerNode={msg("loginAccountTitle")}
28
31
  displayInfo={realm.password && realm.registrationAllowed && !registrationDisabled}
@@ -41,32 +44,23 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
41
44
  socialProvidersNode={
42
45
  <>
43
46
  {realm.password && social.providers?.length && (
44
- <div id="kc-social-providers" className={getClassName("kcFormSocialAccountSectionClass")}>
47
+ <div id="kc-social-providers" className={kcClsx("kcFormSocialAccountSectionClass")}>
45
48
  <hr />
46
49
  <h2>{msg("identity-provider-login-label")}</h2>
47
- <ul
48
- className={clsx(
49
- getClassName("kcFormSocialAccountListClass"),
50
- social.providers.length > 3 && getClassName("kcFormSocialAccountListGridClass")
51
- )}
52
- >
50
+ <ul className={kcClsx("kcFormSocialAccountListClass", social.providers.length > 3 && "kcFormSocialAccountListGridClass")}>
53
51
  {social.providers.map((...[p, , providers]) => (
54
52
  <li key={p.alias}>
55
53
  <a
56
54
  id={`social-${p.alias}`}
57
- className={clsx(
58
- getClassName("kcFormSocialAccountListButtonClass"),
59
- providers.length > 3 && getClassName("kcFormSocialAccountGridItem")
55
+ className={kcClsx(
56
+ "kcFormSocialAccountListButtonClass",
57
+ providers.length > 3 && "kcFormSocialAccountGridItem"
60
58
  )}
61
59
  type="button"
62
60
  href={p.loginUrl}
63
61
  >
64
- {p.iconClasses && (
65
- <i className={clsx(getClassName("kcCommonLogoIdP"), p.iconClasses)} aria-hidden="true"></i>
66
- )}
67
- <span
68
- className={clsx(getClassName("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}
69
- >
62
+ {p.iconClasses && <i className={clsx(kcClsx("kcCommonLogoIdP"), p.iconClasses)} aria-hidden="true"></i>}
63
+ <span className={clsx(kcClsx("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}>
70
64
  {p.displayName}
71
65
  </span>
72
66
  </a>
@@ -91,8 +85,8 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
91
85
  method="post"
92
86
  >
93
87
  {!usernameHidden && (
94
- <div className={getClassName("kcFormGroupClass")}>
95
- <label htmlFor="username" className={getClassName("kcLabelClass")}>
88
+ <div className={kcClsx("kcFormGroupClass")}>
89
+ <label htmlFor="username" className={kcClsx("kcLabelClass")}>
96
90
  {!realm.loginWithEmailAllowed
97
91
  ? msg("username")
98
92
  : !realm.registrationEmailAsUsername
@@ -102,7 +96,7 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
102
96
  <input
103
97
  tabIndex={2}
104
98
  id="username"
105
- className={getClassName("kcInputClass")}
99
+ className={kcClsx("kcInputClass")}
106
100
  name="username"
107
101
  defaultValue={login.username ?? ""}
108
102
  type="text"
@@ -111,22 +105,22 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
111
105
  aria-invalid={messagesPerField.existsError("username", "password")}
112
106
  />
113
107
  {messagesPerField.existsError("username", "password") && (
114
- <span id="input-error" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
108
+ <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
115
109
  {messagesPerField.getFirstError("username", "password")}
116
110
  </span>
117
111
  )}
118
112
  </div>
119
113
  )}
120
114
 
121
- <div className={getClassName("kcFormGroupClass")}>
122
- <label htmlFor="password" className={getClassName("kcLabelClass")}>
115
+ <div className={kcClsx("kcFormGroupClass")}>
116
+ <label htmlFor="password" className={kcClsx("kcLabelClass")}>
123
117
  {msg("password")}
124
118
  </label>
125
- <PasswordWrapper getClassName={getClassName} i18n={i18n} passwordInputId="password">
119
+ <PasswordWrapper kcClsx={kcClsx} i18n={i18n} passwordInputId="password">
126
120
  <input
127
121
  tabIndex={3}
128
122
  id="password"
129
- className={getClassName("kcInputClass")}
123
+ className={kcClsx("kcInputClass")}
130
124
  name="password"
131
125
  type="password"
132
126
  autoComplete="current-password"
@@ -134,13 +128,13 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
134
128
  />
135
129
  </PasswordWrapper>
136
130
  {usernameHidden && messagesPerField.existsError("username", "password") && (
137
- <span id="input-error" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
131
+ <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
138
132
  {messagesPerField.getFirstError("username", "password")}
139
133
  </span>
140
134
  )}
141
135
  </div>
142
136
 
143
- <div className={clsx(getClassName("kcFormGroupClass"), getClassName("kcFormSettingClass"))}>
137
+ <div className={kcClsx("kcFormGroupClass", "kcFormSettingClass")}>
144
138
  <div id="kc-form-options">
145
139
  {realm.rememberMe && !usernameHidden && (
146
140
  <div className="checkbox">
@@ -157,7 +151,7 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
157
151
  </div>
158
152
  )}
159
153
  </div>
160
- <div className={getClassName("kcFormOptionsWrapperClass")}>
154
+ <div className={kcClsx("kcFormOptionsWrapperClass")}>
161
155
  {realm.resetPasswordAllowed && (
162
156
  <span>
163
157
  <a tabIndex={6} href={url.loginResetCredentialsUrl}>
@@ -168,17 +162,12 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
168
162
  </div>
169
163
  </div>
170
164
 
171
- <div id="kc-form-buttons" className={getClassName("kcFormGroupClass")}>
165
+ <div id="kc-form-buttons" className={kcClsx("kcFormGroupClass")}>
172
166
  <input type="hidden" id="id-hidden-input" name="credentialId" value={auth.selectedCredential} />
173
167
  <input
174
168
  tabIndex={7}
175
169
  disabled={isLoginButtonDisabled}
176
- className={clsx(
177
- getClassName("kcButtonClass"),
178
- getClassName("kcButtonPrimaryClass"),
179
- getClassName("kcButtonBlockClass"),
180
- getClassName("kcButtonLargeClass")
181
- )}
170
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
182
171
  name="login"
183
172
  id="kc-login"
184
173
  type="submit"
@@ -193,13 +182,8 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
193
182
  );
194
183
  }
195
184
 
196
- function PasswordWrapper(props: {
197
- getClassName: ReturnType<typeof useGetClassName>["getClassName"];
198
- i18n: I18n;
199
- passwordInputId: string;
200
- children: JSX.Element;
201
- }) {
202
- const { getClassName, i18n, passwordInputId, children } = props;
185
+ function PasswordWrapper(props: { kcClsx: KcClsx; i18n: I18n; passwordInputId: string; children: JSX.Element }) {
186
+ const { kcClsx, i18n, passwordInputId, children } = props;
203
187
 
204
188
  const { msgStr } = i18n;
205
189
 
@@ -214,19 +198,16 @@ function PasswordWrapper(props: {
214
198
  }, [isPasswordRevealed]);
215
199
 
216
200
  return (
217
- <div className={getClassName("kcInputGroup")}>
201
+ <div className={kcClsx("kcInputGroup")}>
218
202
  {children}
219
203
  <button
220
204
  type="button"
221
- className={getClassName("kcFormPasswordVisibilityButtonClass")}
205
+ className={kcClsx("kcFormPasswordVisibilityButtonClass")}
222
206
  aria-label={msgStr(isPasswordRevealed ? "hidePassword" : "showPassword")}
223
207
  aria-controls={passwordInputId}
224
208
  onClick={toggleIsPasswordRevealed}
225
209
  >
226
- <i
227
- className={getClassName(isPasswordRevealed ? "kcFormPasswordVisibilityIconHide" : "kcFormPasswordVisibilityIconShow")}
228
- aria-hidden
229
- />
210
+ <i className={kcClsx(isPasswordRevealed ? "kcFormPasswordVisibilityIconHide" : "kcFormPasswordVisibilityIconShow")} aria-hidden />
230
211
  </button>
231
212
  </div>
232
213
  );
@@ -1,23 +1,24 @@
1
- import { clsx } from "keycloakify/tools/clsx";
2
- import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
1
+ import { getKcClsx, KcClsx } 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, type I18n } from "../i18n";
6
5
 
7
- export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pageId: "login-config-totp.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pageId: "login-config-totp.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, isAppInitiatedAction, totp, mode, messagesPerField } = kcContext;
16
15
 
16
+ const i18n = useI18n({ kcContext });
17
+
17
18
  const { msg, msgStr, advancedMsg } = i18n;
18
19
 
19
20
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("loginTotpTitle")}>
21
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("loginTotpTitle")}>
21
22
  <>
22
23
  <ol id="kc-totp-settings">
23
24
  <li>
@@ -87,26 +88,26 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
87
88
  </li>
88
89
  </ol>
89
90
 
90
- <form action={url.loginAction} className={getClassName("kcFormClass")} id="kc-totp-settings-form" method="post">
91
- <div className={getClassName("kcFormGroupClass")}>
92
- <div className={getClassName("kcInputWrapperClass")}>
93
- <label htmlFor="totp" className={getClassName("kcLabelClass")}>
91
+ <form action={url.loginAction} className={kcClsx("kcFormClass")} id="kc-totp-settings-form" method="post">
92
+ <div className={kcClsx("kcFormGroupClass")}>
93
+ <div className={kcClsx("kcInputWrapperClass")}>
94
+ <label htmlFor="totp" className={kcClsx("kcLabelClass")}>
94
95
  {msg("authenticatorCode")}
95
96
  </label>{" "}
96
97
  <span className="required">*</span>
97
98
  </div>
98
- <div className={getClassName("kcInputWrapperClass")}>
99
+ <div className={kcClsx("kcInputWrapperClass")}>
99
100
  <input
100
101
  type="text"
101
102
  id="totp"
102
103
  name="totp"
103
104
  autoComplete="off"
104
- className={getClassName("kcInputClass")}
105
+ className={kcClsx("kcInputClass")}
105
106
  aria-invalid={messagesPerField.existsError("totp")}
106
107
  />
107
108
 
108
109
  {messagesPerField.existsError("totp") && (
109
- <span id="input-error-otp-code" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
110
+ <span id="input-error-otp-code" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
110
111
  {messagesPerField.get("totp")}
111
112
  </span>
112
113
  )}
@@ -115,54 +116,45 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
115
116
  {mode && <input type="hidden" id="mode" value={mode} />}
116
117
  </div>
117
118
 
118
- <div className={getClassName("kcFormGroupClass")}>
119
- <div className={getClassName("kcInputWrapperClass")}>
120
- <label htmlFor="userLabel" className={getClassName("kcLabelClass")}>
119
+ <div className={kcClsx("kcFormGroupClass")}>
120
+ <div className={kcClsx("kcInputWrapperClass")}>
121
+ <label htmlFor="userLabel" className={kcClsx("kcLabelClass")}>
121
122
  {msg("loginTotpDeviceName")}
122
123
  </label>{" "}
123
124
  {totp.otpCredentials.length >= 1 && <span className="required">*</span>}
124
125
  </div>
125
- <div className={getClassName("kcInputWrapperClass")}>
126
+ <div className={kcClsx("kcInputWrapperClass")}>
126
127
  <input
127
128
  type="text"
128
129
  id="userLabel"
129
130
  name="userLabel"
130
131
  autoComplete="off"
131
- className={getClassName("kcInputClass")}
132
+ className={kcClsx("kcInputClass")}
132
133
  aria-invalid={messagesPerField.existsError("userLabel")}
133
134
  />
134
135
  {messagesPerField.existsError("userLabel") && (
135
- <span id="input-error-otp-label" className={getClassName("kcInputErrorMessageClass")} aria-live="polite">
136
+ <span id="input-error-otp-label" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
136
137
  {messagesPerField.get("userLabel")}
137
138
  </span>
138
139
  )}
139
140
  </div>
140
141
  </div>
141
142
 
142
- <div className={getClassName("kcFormGroupClass")}>
143
- <LogoutOtherSessions {...{ getClassName, i18n }} />
143
+ <div className={kcClsx("kcFormGroupClass")}>
144
+ <LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
144
145
  </div>
145
146
 
146
147
  {isAppInitiatedAction ? (
147
148
  <>
148
149
  <input
149
150
  type="submit"
150
- className={clsx(
151
- getClassName("kcButtonClass"),
152
- getClassName("kcButtonPrimaryClass"),
153
- getClassName("kcButtonLargeClass")
154
- )}
151
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass")}
155
152
  id="saveTOTPBtn"
156
153
  value={msgStr("doSubmit")}
157
154
  />
158
155
  <button
159
156
  type="submit"
160
- className={clsx(
161
- getClassName("kcButtonClass"),
162
- getClassName("kcButtonDefaultClass"),
163
- getClassName("kcButtonLargeClass"),
164
- getClassName("kcButtonLargeClass")
165
- )}
157
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass", "kcButtonLargeClass")}
166
158
  id="cancelTOTPBtn"
167
159
  name="cancel-aia"
168
160
  value="true"
@@ -173,7 +165,7 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
173
165
  ) : (
174
166
  <input
175
167
  type="submit"
176
- className={clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass"))}
168
+ className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass")}
177
169
  id="saveTOTPBtn"
178
170
  value={msgStr("doSubmit")}
179
171
  />
@@ -184,14 +176,14 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
184
176
  );
185
177
  }
186
178
 
187
- function LogoutOtherSessions(props: { getClassName: ReturnType<typeof useGetClassName>["getClassName"]; i18n: I18n }) {
188
- const { getClassName, i18n } = props;
179
+ function LogoutOtherSessions(props: { kcClsx: KcClsx; i18n: I18n }) {
180
+ const { kcClsx, i18n } = props;
189
181
 
190
182
  const { msg } = i18n;
191
183
 
192
184
  return (
193
- <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
194
- <div className={getClassName("kcFormOptionsWrapperClass")}>
185
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
186
+ <div className={kcClsx("kcFormOptionsWrapperClass")}>
195
187
  <div className="checkbox">
196
188
  <label>
197
189
  <input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" defaultChecked={true} />
@@ -1,33 +1,27 @@
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 LoginIdpLinkConfirm(props: PageProps<Extract<KcContext, { pageId: "login-idp-link-confirm.ftl" }>, I18n>) {
8
- const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
6
+ export default function LoginIdpLinkConfirm(props: PageProps<Extract<KcContext, { pageId: "login-idp-link-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, idpAlias } = kcContext;
16
15
 
17
- const { msg } = i18n;
16
+ const { msg } = useI18n({ kcContext });
18
17
 
19
18
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("confirmLinkIdpTitle")}>
19
+ <Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} headerNode={msg("confirmLinkIdpTitle")}>
21
20
  <form id="kc-register-form" action={url.loginAction} method="post">
22
- <div className={getClassName("kcFormGroupClass")}>
21
+ <div className={kcClsx("kcFormGroupClass")}>
23
22
  <button
24
23
  type="submit"
25
- className={clsx(
26
- getClassName("kcButtonClass"),
27
- getClassName("kcButtonDefaultClass"),
28
- getClassName("kcButtonBlockClass"),
29
- getClassName("kcButtonLargeClass")
30
- )}
24
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonBlockClass", "kcButtonLargeClass")}
31
25
  name="submitAction"
32
26
  id="updateProfile"
33
27
  value="updateProfile"
@@ -36,12 +30,7 @@ export default function LoginIdpLinkConfirm(props: PageProps<Extract<KcContext,
36
30
  </button>
37
31
  <button
38
32
  type="submit"
39
- className={clsx(
40
- getClassName("kcButtonClass"),
41
- getClassName("kcButtonDefaultClass"),
42
- getClassName("kcButtonBlockClass"),
43
- getClassName("kcButtonLargeClass")
44
- )}
33
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonBlockClass", "kcButtonLargeClass")}
45
34
  name="submitAction"
46
35
  id="linkAccount"
47
36
  value="linkAccount"