keycloakify 7.0.0-rc.8 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +6 -0
  2. package/account/Template.js +4 -2
  3. package/account/Template.js.map +1 -1
  4. package/account/TemplateProps.d.ts +2 -1
  5. package/account/kcContext/KcContext.d.ts +6 -4
  6. package/account/kcContext/KcContext.js.map +1 -1
  7. package/account/kcContext/getKcContext.js +4 -1
  8. package/account/kcContext/getKcContext.js.map +1 -1
  9. package/account/kcContext/getKcContextFromWindow.d.ts +1 -1
  10. package/account/kcContext/getKcContextFromWindow.js.map +1 -1
  11. package/account/kcContext/kcContextMocks.js +8 -5
  12. package/account/kcContext/kcContextMocks.js.map +1 -1
  13. package/account/lib/useGetClassName.d.ts +7 -0
  14. package/account/lib/useGetClassName.js +11 -0
  15. package/account/lib/useGetClassName.js.map +1 -0
  16. package/account/pages/Account.d.ts +1 -1
  17. package/account/pages/Account.js +5 -6
  18. package/account/pages/Account.js.map +1 -1
  19. package/account/pages/PageProps.d.ts +1 -3
  20. package/account/pages/PageProps.js +1 -7
  21. package/account/pages/PageProps.js.map +1 -1
  22. package/account/pages/Password.d.ts +1 -1
  23. package/account/pages/Password.js +6 -6
  24. package/account/pages/Password.js.map +1 -1
  25. package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +9 -7
  26. package/bin/keycloakify/keycloakify.js +16 -7
  27. package/bin/keycloakify/keycloakify.js.map +1 -1
  28. package/lib/useGetClassName.d.ts +8 -4
  29. package/lib/useGetClassName.js +10 -6
  30. package/lib/useGetClassName.js.map +1 -1
  31. package/login/Template.js +2 -6
  32. package/login/Template.js.map +1 -1
  33. package/login/TemplateProps.d.ts +2 -3
  34. package/login/TemplateProps.js +1 -22
  35. package/login/TemplateProps.js.map +1 -1
  36. package/login/kcContext/getKcContext.js +3 -0
  37. package/login/kcContext/getKcContext.js.map +1 -1
  38. package/login/lib/useGetClassName.d.ts +7 -0
  39. package/login/lib/useGetClassName.js +88 -0
  40. package/login/lib/useGetClassName.js.map +1 -0
  41. package/login/pages/Error.d.ts +1 -1
  42. package/login/pages/IdpReviewUserProfile.d.ts +1 -1
  43. package/login/pages/IdpReviewUserProfile.js +2 -3
  44. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  45. package/login/pages/Info.d.ts +1 -1
  46. package/login/pages/Login.d.ts +1 -1
  47. package/login/pages/Login.js +2 -3
  48. package/login/pages/Login.js.map +1 -1
  49. package/login/pages/LoginConfigTotp.d.ts +1 -1
  50. package/login/pages/LoginConfigTotp.js +2 -3
  51. package/login/pages/LoginConfigTotp.js.map +1 -1
  52. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -1
  53. package/login/pages/LoginIdpLinkConfirm.js +2 -3
  54. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  55. package/login/pages/LoginIdpLinkEmail.d.ts +1 -1
  56. package/login/pages/LoginOtp.d.ts +1 -1
  57. package/login/pages/LoginOtp.js +2 -3
  58. package/login/pages/LoginOtp.js.map +1 -1
  59. package/login/pages/LoginPageExpired.d.ts +1 -1
  60. package/login/pages/LoginPassword.d.ts +1 -1
  61. package/login/pages/LoginPassword.js +2 -3
  62. package/login/pages/LoginPassword.js.map +1 -1
  63. package/login/pages/LoginResetPassword.d.ts +1 -1
  64. package/login/pages/LoginResetPassword.js +2 -3
  65. package/login/pages/LoginResetPassword.js.map +1 -1
  66. package/login/pages/LoginUpdatePassword.d.ts +1 -1
  67. package/login/pages/LoginUpdatePassword.js +2 -3
  68. package/login/pages/LoginUpdatePassword.js.map +1 -1
  69. package/login/pages/LoginUpdateProfile.d.ts +1 -1
  70. package/login/pages/LoginUpdateProfile.js +2 -3
  71. package/login/pages/LoginUpdateProfile.js.map +1 -1
  72. package/login/pages/LoginUsername.d.ts +1 -1
  73. package/login/pages/LoginUsername.js +2 -3
  74. package/login/pages/LoginUsername.js.map +1 -1
  75. package/login/pages/LoginVerifyEmail.d.ts +1 -1
  76. package/login/pages/LogoutConfirm.d.ts +1 -1
  77. package/login/pages/LogoutConfirm.js +2 -3
  78. package/login/pages/LogoutConfirm.js.map +1 -1
  79. package/login/pages/PageProps.d.ts +2 -4
  80. package/login/pages/PageProps.js +1 -20
  81. package/login/pages/PageProps.js.map +1 -1
  82. package/login/pages/Register.d.ts +1 -1
  83. package/login/pages/Register.js +2 -3
  84. package/login/pages/Register.js.map +1 -1
  85. package/login/pages/RegisterUserProfile.d.ts +1 -1
  86. package/login/pages/RegisterUserProfile.js +2 -3
  87. package/login/pages/RegisterUserProfile.js.map +1 -1
  88. package/login/pages/Terms.d.ts +1 -1
  89. package/login/pages/Terms.js +2 -3
  90. package/login/pages/Terms.js.map +1 -1
  91. package/login/pages/UpdateUserProfile.d.ts +1 -1
  92. package/login/pages/UpdateUserProfile.js +2 -3
  93. package/login/pages/UpdateUserProfile.js.map +1 -1
  94. package/login/pages/WebauthnAuthenticate.d.ts +1 -1
  95. package/login/pages/WebauthnAuthenticate.js +2 -6
  96. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  97. package/login/pages/shared/UserProfileCommons.d.ts +1 -1
  98. package/package.json +9 -1
  99. package/src/account/Template.tsx +5 -2
  100. package/src/account/TemplateProps.ts +3 -1
  101. package/src/account/kcContext/KcContext.ts +6 -4
  102. package/src/account/kcContext/getKcContext.ts +5 -1
  103. package/src/account/kcContext/getKcContextFromWindow.ts +1 -1
  104. package/src/account/kcContext/kcContextMocks.ts +9 -7
  105. package/src/account/lib/useGetClassName.ts +12 -0
  106. package/src/account/pages/Account.tsx +12 -9
  107. package/src/account/pages/PageProps.ts +1 -11
  108. package/src/account/pages/Password.tsx +11 -8
  109. package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +9 -7
  110. package/src/bin/keycloakify/keycloakify.ts +25 -13
  111. package/src/lib/useGetClassName.ts +12 -9
  112. package/src/login/Template.tsx +3 -6
  113. package/src/login/TemplateProps.ts +56 -26
  114. package/src/login/kcContext/getKcContext.ts +4 -0
  115. package/src/login/lib/useGetClassName.ts +100 -0
  116. package/src/login/pages/Error.tsx +1 -1
  117. package/src/login/pages/IdpReviewUserProfile.tsx +3 -3
  118. package/src/login/pages/Info.tsx +1 -1
  119. package/src/login/pages/Login.tsx +3 -3
  120. package/src/login/pages/LoginConfigTotp.tsx +3 -3
  121. package/src/login/pages/LoginIdpLinkConfirm.tsx +3 -3
  122. package/src/login/pages/LoginIdpLinkEmail.tsx +1 -1
  123. package/src/login/pages/LoginOtp.tsx +3 -3
  124. package/src/login/pages/LoginPageExpired.tsx +1 -1
  125. package/src/login/pages/LoginPassword.tsx +3 -3
  126. package/src/login/pages/LoginResetPassword.tsx +3 -3
  127. package/src/login/pages/LoginUpdatePassword.tsx +3 -3
  128. package/src/login/pages/LoginUpdateProfile.tsx +3 -3
  129. package/src/login/pages/LoginUsername.tsx +3 -3
  130. package/src/login/pages/LoginVerifyEmail.tsx +1 -1
  131. package/src/login/pages/LogoutConfirm.tsx +3 -3
  132. package/src/login/pages/PageProps.ts +2 -135
  133. package/src/login/pages/Register.tsx +3 -3
  134. package/src/login/pages/RegisterUserProfile.tsx +3 -3
  135. package/src/login/pages/Terms.tsx +3 -3
  136. package/src/login/pages/UpdateUserProfile.tsx +3 -3
  137. package/src/login/pages/WebauthnAuthenticate.tsx +3 -6
  138. package/src/login/pages/shared/UserProfileCommons.tsx +1 -1
  139. package/src/tools/AndByDiscriminatingKey.ts +5 -1
  140. package/tools/AndByDiscriminatingKey.d.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
- import { type PageProps, defaultClasses } from "keycloakify/account/pages/PageProps";
3
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
2
+ import type { PageProps } from "keycloakify/account/pages/PageProps";
3
+ import { useGetClassName } from "keycloakify/account/lib/useGetClassName";
4
4
  import type { KcContext } from "../kcContext";
5
5
  import type { I18n } from "../i18n";
6
6
 
@@ -8,8 +8,11 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
8
8
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
9
9
 
10
10
  const { getClassName } = useGetClassName({
11
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
12
- classes
11
+ doUseDefaultCss,
12
+ "classes": {
13
+ ...classes,
14
+ "kcBodyClass": clsx(classes?.kcBodyClass, "user")
15
+ }
13
16
  });
14
17
 
15
18
  const { url, realm, messagesPerField, stateChecker, account } = kcContext;
@@ -17,7 +20,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
17
20
  const { msg } = i18n;
18
21
 
19
22
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="account" bodyClass="user">
23
+ <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="account">
21
24
  <div className="row">
22
25
  <div className="col-md-10">
23
26
  <h2>{msg("editAccountHtmlTitle")}</h2>
@@ -33,7 +36,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
33
36
  <input type="hidden" id="stateChecker" name="stateChecker" value={stateChecker} />
34
37
 
35
38
  {!realm.registrationEmailAsUsername && (
36
- <div className="form-group ${messagesPerField.printIfExists('username','has-error')}">
39
+ <div className={clsx("form-group", messagesPerField.printIfExists("username", "has-error"))}>
37
40
  <div className="col-sm-2 col-md-2">
38
41
  <label htmlFor="username" className="control-label">
39
42
  {msg("username")}
@@ -48,7 +51,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
48
51
  id="username"
49
52
  name="username"
50
53
  disabled={!realm.editUsernameAllowed}
51
- value="${(account.username!'')}"
54
+ value={account.username ?? ""}
52
55
  />
53
56
  </div>
54
57
  </div>
@@ -63,7 +66,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
63
66
  </div>
64
67
 
65
68
  <div className="col-sm-10 col-md-10">
66
- <input type="text" className="form-control" id="email" name="email" autoFocus value="${(account.email!'')}" />
69
+ <input type="text" className="form-control" id="email" name="email" autoFocus value={account.email ?? ""} />
67
70
  </div>
68
71
  </div>
69
72
 
@@ -89,7 +92,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
89
92
  </div>
90
93
 
91
94
  <div className="col-sm-10 col-md-10">
92
- <input type="text" className="form-control" id="lastName" name="lastName" value={account.lastName || ""} />
95
+ <input type="text" className="form-control" id="lastName" name="lastName" value={account.lastName ?? ""} />
93
96
  </div>
94
97
  </div>
95
98
 
@@ -1,6 +1,6 @@
1
1
  import type { LazyExoticComponent } from "react";
2
2
  import type { I18n } from "keycloakify/account/i18n";
3
- import { type TemplateProps } from "keycloakify/account/TemplateProps";
3
+ import type { TemplateProps, ClassKey } from "keycloakify/account/TemplateProps";
4
4
 
5
5
  export type PageProps<KcContext, I18nExtended extends I18n> = {
6
6
  Template: LazyExoticComponent<(props: TemplateProps<any, any>) => JSX.Element | null>;
@@ -9,13 +9,3 @@ export type PageProps<KcContext, I18nExtended extends I18n> = {
9
9
  doUseDefaultCss: boolean;
10
10
  classes?: Partial<Record<ClassKey, string>>;
11
11
  };
12
-
13
- export type ClassKey = "kcButtonClass" | "kcButtonPrimaryClass" | "kcButtonLargeClass" | "kcButtonDefaultClass";
14
-
15
- export const defaultClasses: Record<ClassKey, string | undefined> = {
16
- /** password.ftl */
17
- "kcButtonClass": "btn",
18
- "kcButtonPrimaryClass": "btn-primary",
19
- "kcButtonLargeClass": "btn-lg",
20
- "kcButtonDefaultClass": "btn-default"
21
- };
@@ -1,6 +1,6 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
- import { type PageProps, defaultClasses } from "keycloakify/account/pages/PageProps";
3
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
2
+ import type { PageProps } from "keycloakify/account/pages/PageProps";
3
+ import { useGetClassName } from "keycloakify/account/lib/useGetClassName";
4
4
  import type { KcContext } from "../kcContext";
5
5
  import type { I18n } from "../i18n";
6
6
 
@@ -8,16 +8,19 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
8
8
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
9
9
 
10
10
  const { getClassName } = useGetClassName({
11
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
12
- classes
11
+ doUseDefaultCss,
12
+ "classes": {
13
+ ...classes,
14
+ "kcBodyClass": clsx(classes?.kcBodyClass, "password")
15
+ }
13
16
  });
14
17
 
15
- const { password } = kcContext;
18
+ const { url, password, account } = kcContext;
16
19
 
17
20
  const { msg } = i18n;
18
21
 
19
22
  return (
20
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="password" bodyClass="password">
23
+ <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="password">
21
24
  <div className="row">
22
25
  <div className="col-md-10">
23
26
  <h2>{msg("changePasswordHtmlTitle")}</h2>
@@ -27,12 +30,12 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
27
30
  </div>
28
31
  </div>
29
32
 
30
- <form action="${url.passwordUrl}" className="form-horizontal" method="post">
33
+ <form action={url.passwordUrl} className="form-horizontal" method="post">
31
34
  <input
32
35
  type="text"
33
36
  id="username"
34
37
  name="username"
35
- value="${(account.username!'')}"
38
+ value={account.username ?? ""}
36
39
  autoComplete="username"
37
40
  readOnly
38
41
  style={{ "display": "none;" }}
@@ -110,14 +110,16 @@
110
110
  }
111
111
  };
112
112
 
113
- out["pageId"] = "${pageId}";
113
+ <#if account??>
114
+ out["url"]["getLogoutUrl"] = function () {
115
+ <#attempt>
116
+ return "${url.getLogoutUrl()}";
117
+ <#recover>
118
+ </#attempt>
119
+ };
120
+ </#if>
114
121
 
115
- out["url"]["getLogoutUrl"] = function () {
116
- <#attempt>
117
- return "${url.getLogoutUrl()}";
118
- <#recover>
119
- </#attempt>
120
- };
122
+ out["pageId"] = "${pageId}";
121
123
 
122
124
  return out;
123
125
 
@@ -1,6 +1,6 @@
1
1
  import { generateKeycloakThemeResources } from "./generateKeycloakThemeResources";
2
2
  import { generateJavaStackFiles } from "./generateJavaStackFiles";
3
- import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path";
3
+ import { join as pathJoin, relative as pathRelative, basename as pathBasename, sep as pathSep } from "path";
4
4
  import * as child_process from "child_process";
5
5
  import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer";
6
6
  import * as fs from "fs";
@@ -42,7 +42,7 @@ export async function main() {
42
42
  "reactAppBuildDirPath": pathJoin(reactProjectDirPath, "build"),
43
43
  buildOptions,
44
44
  //We have to leave it at that otherwise we break our default theme.
45
- //Problem is that we can't guarantee that the the old resources
45
+ //Problem is that we can`t guarantee that the the old resources
46
46
  //will still be available on the newer keycloak version.
47
47
  "keycloakVersion": "11.0.3"
48
48
  });
@@ -121,19 +121,31 @@ export async function main() {
121
121
  "",
122
122
  `To test your theme locally you can spin up a Keycloak ${containerKeycloakVersion} container image with the theme pre loaded by running:`,
123
123
  "",
124
- `👉 $ ./${pathRelative(reactProjectDirPath, pathJoin(keycloakThemeBuildingDirPath, generateStartKeycloakTestingContainer.basename))} 👈`,
124
+ `👉 $ .${pathSep}${pathRelative(
125
+ reactProjectDirPath,
126
+ pathJoin(keycloakThemeBuildingDirPath, generateStartKeycloakTestingContainer.basename)
127
+ )} 👈`,
125
128
  "",
126
- "Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags",
127
- "",
128
- "Once your container is up and running: ",
129
+ `Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags`,
130
+ ``,
131
+ `Once your container is up and running: `,
129
132
  "- Log into the admin console 👉 http://localhost:8080/admin username: admin, password: admin 👈",
130
- '- Create a realm named "myrealm"',
131
- '- Create a client with ID: "myclient", "Root URL": "https://www.keycloak.org/app/" and "Valid redirect URIs": "https://www.keycloak.org/app/*"',
132
- `- Select Login Theme: ${buildOptions.themeName} (don't forget to save at the bottom of the page)`,
133
- `- Go to 👉 https://www.keycloak.org/app/ 👈 Click "Save" then "Sign in". You should see your login page`,
134
- "",
135
- "Video demoing this process: https://youtu.be/N3wlBoH4hKg",
136
- ""
133
+ `- Create a realm: myrealm`,
134
+ `- Enable registration: Realm settings -> Login tab -> User registration: on`,
135
+ `- Enable the Account theme: Realm settings -> Themes tab -> Account theme, select ${buildOptions.themeName} `,
136
+ `- Create a client id myclient`,
137
+ ` Root URL: https://www.keycloak.org/app/`,
138
+ ` Valid redirect URIs: https://www.keycloak.org/app* http://localhost* (localhost is optional)`,
139
+ ` Valid post logout redirect URIs: https://www.keycloak.org/app* http://localhost*`,
140
+ ` Web origins: *`,
141
+ ` Login Theme: ${buildOptions.themeName}`,
142
+ ` Save (button at the bottom of the page)`,
143
+ ``,
144
+ `- Go to 👉 https://www.keycloak.org/app/ 👈 Click "Save" then "Sign in". You should see your login page`,
145
+ `- Got to 👉 http://localhost:8080/realms/myrealm/account 👈 to see your account theme`,
146
+ ``,
147
+ `Video tutorial: https://youtu.be/WMyGZNHQkjU`,
148
+ ``
137
149
  ].join("\n")
138
150
  );
139
151
  }
@@ -1,15 +1,18 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
2
  import { useConstCallback } from "keycloakify/tools/useConstCallback";
3
3
 
4
- export function useGetClassName<ClassKey extends string>(params: {
5
- defaultClasses?: Record<ClassKey, string | undefined>;
6
- classes?: Partial<Record<ClassKey, string>>;
7
- }) {
8
- const { defaultClasses, classes } = params;
4
+ export function createUseClassName<ClassKey extends string>(params: { defaultClasses: Record<ClassKey, string | undefined> }) {
5
+ const { defaultClasses } = params;
9
6
 
10
- const getClassName = useConstCallback((classKey: ClassKey): string => {
11
- return clsx(classKey, defaultClasses?.[classKey], classes?.[classKey]);
12
- });
7
+ function useGetClassName(params: { doUseDefaultCss: boolean; classes: Partial<Record<ClassKey, string>> | undefined }) {
8
+ const { classes } = params;
13
9
 
14
- return { getClassName };
10
+ const getClassName = useConstCallback((classKey: ClassKey): string => {
11
+ return clsx(classKey, defaultClasses[classKey], classes?.[classKey]);
12
+ });
13
+
14
+ return { getClassName };
15
+ }
16
+
17
+ return { useGetClassName };
15
18
  }
@@ -1,8 +1,8 @@
1
1
  import { assert } from "keycloakify/tools/assert";
2
2
  import { clsx } from "keycloakify/tools/clsx";
3
3
  import { usePrepareTemplate } from "keycloakify/lib/usePrepareTemplate";
4
- import { type TemplateProps, defaultTemplateClasses } from "keycloakify/login/TemplateProps";
5
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
4
+ import { type TemplateProps } from "keycloakify/login/TemplateProps";
5
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
6
6
  import type { KcContext } from "./kcContext";
7
7
  import type { I18n } from "./i18n";
8
8
 
@@ -23,10 +23,7 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
23
23
  children
24
24
  } = props;
25
25
 
26
- const { getClassName } = useGetClassName({
27
- "defaultClasses": !doUseDefaultCss ? undefined : defaultTemplateClasses,
28
- classes
29
- });
26
+ const { getClassName } = useGetClassName({ doUseDefaultCss, classes });
30
27
 
31
28
  const { msg, changeLocale, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
32
29
 
@@ -6,7 +6,7 @@ export type TemplateProps<KcContext extends KcContext.Common, I18nExtended exten
6
6
  kcContext: KcContext;
7
7
  i18n: I18nExtended;
8
8
  doUseDefaultCss: boolean;
9
- classes?: Partial<Record<TemplateClassKey, string>>;
9
+ classes?: Partial<Record<ClassKey, string>>;
10
10
 
11
11
  displayInfo?: boolean;
12
12
  displayMessage?: boolean;
@@ -20,7 +20,7 @@ export type TemplateProps<KcContext extends KcContext.Common, I18nExtended exten
20
20
  children: ReactNode;
21
21
  };
22
22
 
23
- export type TemplateClassKey =
23
+ export type ClassKey =
24
24
  | "kcHtmlClass"
25
25
  | "kcLoginClass"
26
26
  | "kcHeaderClass"
@@ -40,27 +40,57 @@ export type TemplateClassKey =
40
40
  | "kcFormSocialAccountContentClass"
41
41
  | "kcFormSocialAccountClass"
42
42
  | "kcSignUpClass"
43
- | "kcInfoAreaWrapperClass";
44
-
45
- export const defaultTemplateClasses: Record<TemplateClassKey, string | undefined> = {
46
- "kcHtmlClass": "login-pf",
47
- "kcLoginClass": "login-pf-page",
48
- "kcContentWrapperClass": "row",
49
- "kcHeaderClass": "login-pf-page-header",
50
- "kcHeaderWrapperClass": undefined,
51
- "kcFormCardClass": "card-pf",
52
- "kcFormCardAccountClass": "login-pf-accounts",
53
- "kcFormSocialAccountClass": "login-pf-social-section",
54
- "kcFormSocialAccountContentClass": "col-xs-12 col-sm-6",
55
- "kcFormHeaderClass": "login-pf-header",
56
- "kcLocaleWrapperClass": undefined,
57
- "kcFeedbackErrorIcon": "pficon pficon-error-circle-o",
58
- "kcFeedbackWarningIcon": "pficon pficon-warning-triangle-o",
59
- "kcFeedbackSuccessIcon": "pficon pficon-ok",
60
- "kcFeedbackInfoIcon": "pficon pficon-info",
61
- "kcResetFlowIcon": "pficon pficon-arrow fa-2x",
62
- "kcFormGroupClass": "form-group",
63
- "kcLabelWrapperClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
64
- "kcSignUpClass": "login-pf-signup",
65
- "kcInfoAreaWrapperClass": undefined
66
- };
43
+ | "kcInfoAreaWrapperClass"
44
+ | "kcLogoClass"
45
+ | "kcContainerClass"
46
+ | "kcContentClass"
47
+ | "kcFeedbackAreaClass"
48
+ | "kcLocaleClass"
49
+ | "kcAlertIconClasserror"
50
+ | "kcFormAreaClass"
51
+ | "kcFormSocialAccountListClass"
52
+ | "kcFormSocialAccountDoubleListClass"
53
+ | "kcFormSocialAccountListLinkClass"
54
+ | "kcWebAuthnKeyIcon"
55
+ | "kcWebAuthnDefaultIcon"
56
+ | "kcFormClass"
57
+ | "kcFormGroupErrorClass"
58
+ | "kcLabelClass"
59
+ | "kcInputClass"
60
+ | "kcInputErrorMessageClass"
61
+ | "kcInputWrapperClass"
62
+ | "kcFormOptionsClass"
63
+ | "kcFormButtonsClass"
64
+ | "kcFormSettingClass"
65
+ | "kcTextareaClass"
66
+ | "kcInfoAreaClass"
67
+ | "kcFormGroupHeader"
68
+ | "kcButtonClass"
69
+ | "kcButtonPrimaryClass"
70
+ | "kcButtonDefaultClass"
71
+ | "kcButtonLargeClass"
72
+ | "kcButtonBlockClass"
73
+ | "kcInputLargeClass"
74
+ | "kcSrOnlyClass"
75
+ | "kcSelectAuthListClass"
76
+ | "kcSelectAuthListItemClass"
77
+ | "kcSelectAuthListItemFillClass"
78
+ | "kcSelectAuthListItemInfoClass"
79
+ | "kcSelectAuthListItemLeftClass"
80
+ | "kcSelectAuthListItemBodyClass"
81
+ | "kcSelectAuthListItemDescriptionClass"
82
+ | "kcSelectAuthListItemHeadingClass"
83
+ | "kcSelectAuthListItemHelpTextClass"
84
+ | "kcSelectAuthListItemIconPropertyClass"
85
+ | "kcSelectAuthListItemIconClass"
86
+ | "kcSelectAuthListItemTitle"
87
+ | "kcAuthenticatorDefaultClass"
88
+ | "kcAuthenticatorPasswordClass"
89
+ | "kcAuthenticatorOTPClass"
90
+ | "kcAuthenticatorWebAuthnClass"
91
+ | "kcAuthenticatorWebAuthnPasswordlessClass"
92
+ | "kcSelectOTPListClass"
93
+ | "kcSelectOTPListItemClass"
94
+ | "kcAuthenticatorOtpCircleClass"
95
+ | "kcSelectOTPItemHeadingClass"
96
+ | "kcFormOptionsWrapperClass";
@@ -121,6 +121,10 @@ export function getKcContext<KcContextExtension extends { pageId: string } = nev
121
121
  return { "kcContext": undefined };
122
122
  }
123
123
 
124
+ if (!("login" in realKcContext)) {
125
+ return { "kcContext": undefined };
126
+ }
127
+
124
128
  {
125
129
  const { url } = realKcContext;
126
130
 
@@ -0,0 +1,100 @@
1
+ import { createUseClassName } from "keycloakify/lib/useGetClassName";
2
+ import type { ClassKey } from "keycloakify/login/TemplateProps";
3
+
4
+ export const { useGetClassName } = createUseClassName<ClassKey>({
5
+ "defaultClasses": {
6
+ "kcHtmlClass": "login-pf",
7
+ "kcLoginClass": "login-pf-page",
8
+ "kcContentWrapperClass": "row",
9
+ "kcHeaderClass": "login-pf-page-header",
10
+ "kcHeaderWrapperClass": undefined,
11
+ "kcFormCardClass": "card-pf",
12
+ "kcFormCardAccountClass": "login-pf-accounts",
13
+ "kcFormSocialAccountClass": "login-pf-social-section",
14
+ "kcFormSocialAccountContentClass": "col-xs-12 col-sm-6",
15
+ "kcFormHeaderClass": "login-pf-header",
16
+ "kcLocaleWrapperClass": undefined,
17
+ "kcFeedbackErrorIcon": "pficon pficon-error-circle-o",
18
+ "kcFeedbackWarningIcon": "pficon pficon-warning-triangle-o",
19
+ "kcFeedbackSuccessIcon": "pficon pficon-ok",
20
+ "kcFeedbackInfoIcon": "pficon pficon-info",
21
+ "kcResetFlowIcon": "pficon pficon-arrow fa-2x",
22
+ "kcFormGroupClass": "form-group",
23
+ "kcLabelWrapperClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
24
+ "kcSignUpClass": "login-pf-signup",
25
+ "kcInfoAreaWrapperClass": undefined,
26
+
27
+ "kcLogoClass": "login-pf-brand",
28
+ "kcContainerClass": "container-fluid",
29
+ "kcContentClass": "col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3",
30
+ "kcFeedbackAreaClass": "col-md-12",
31
+ "kcLocaleClass": "col-xs-12 col-sm-1",
32
+ "kcAlertIconClasserror": "pficon pficon-error-circle-o",
33
+
34
+ "kcFormAreaClass": "col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2",
35
+ "kcFormSocialAccountListClass": "login-pf-social list-unstyled login-pf-social-all",
36
+ "kcFormSocialAccountDoubleListClass": "login-pf-social-double-col",
37
+ "kcFormSocialAccountListLinkClass": "login-pf-social-link",
38
+ "kcWebAuthnKeyIcon": "pficon pficon-key",
39
+ "kcWebAuthnDefaultIcon": "pficon pficon-key",
40
+
41
+ "kcFormClass": "form-horizontal",
42
+ "kcFormGroupErrorClass": "has-error",
43
+ "kcLabelClass": "control-label",
44
+ "kcInputClass": "form-control",
45
+ "kcInputErrorMessageClass": "pf-c-form__helper-text pf-m-error required kc-feedback-text",
46
+ "kcInputWrapperClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
47
+ "kcFormOptionsClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
48
+ "kcFormButtonsClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
49
+ "kcFormSettingClass": "login-pf-settings",
50
+ "kcTextareaClass": "form-control",
51
+
52
+ "kcInfoAreaClass": "col-xs-12 col-sm-4 col-md-4 col-lg-5 details",
53
+
54
+ // user-profile grouping
55
+ "kcFormGroupHeader": "pf-c-form__group",
56
+
57
+ // css classes for form buttons main class used for all buttons
58
+ "kcButtonClass": "btn",
59
+ // classes defining priority of the button - primary or default (there is typically only one priority button for the form)
60
+ "kcButtonPrimaryClass": "btn-primary",
61
+ "kcButtonDefaultClass": "btn-default",
62
+ // classes defining size of the button
63
+ "kcButtonLargeClass": "btn-lg",
64
+ "kcButtonBlockClass": "btn-block",
65
+
66
+ // css classes for input
67
+ "kcInputLargeClass": "input-lg",
68
+
69
+ // css classes for form accessability
70
+ "kcSrOnlyClass": "sr-only",
71
+
72
+ // css classes for select-authenticator form
73
+ "kcSelectAuthListClass": "list-group list-view-pf",
74
+ "kcSelectAuthListItemClass": "list-group-item list-view-pf-stacked",
75
+ "kcSelectAuthListItemFillClass": "pf-l-split__item pf-m-fill",
76
+ "kcSelectAuthListItemIconPropertyClass": "fa-2x select-auth-box-icon-properties",
77
+ "kcSelectAuthListItemIconClass": "pf-l-split__item select-auth-box-icon",
78
+ "kcSelectAuthListItemTitle": "select-auth-box-paragraph",
79
+ "kcSelectAuthListItemInfoClass": "list-view-pf-main-info",
80
+ "kcSelectAuthListItemLeftClass": "list-view-pf-left",
81
+ "kcSelectAuthListItemBodyClass": "list-view-pf-body",
82
+ "kcSelectAuthListItemDescriptionClass": "list-view-pf-description",
83
+ "kcSelectAuthListItemHeadingClass": "list-group-item-heading",
84
+ "kcSelectAuthListItemHelpTextClass": "list-group-item-text",
85
+
86
+ // css classes for the authenticators
87
+ "kcAuthenticatorDefaultClass": "fa list-view-pf-icon-lg",
88
+ "kcAuthenticatorPasswordClass": "fa fa-unlock list-view-pf-icon-lg",
89
+ "kcAuthenticatorOTPClass": "fa fa-mobile list-view-pf-icon-lg",
90
+ "kcAuthenticatorWebAuthnClass": "fa fa-key list-view-pf-icon-lg",
91
+ "kcAuthenticatorWebAuthnPasswordlessClass": "fa fa-key list-view-pf-icon-lg",
92
+
93
+ //css classes for the OTP Login Form
94
+ "kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select",
95
+ "kcSelectOTPListItemClass": "card-pf-body card-pf-top-element",
96
+ "kcAuthenticatorOtpCircleClass": "fa fa-mobile card-pf-icon-circle",
97
+ "kcSelectOTPItemHeadingClass": "card-pf-title text-center",
98
+ "kcFormOptionsWrapperClass": undefined
99
+ }
100
+ });
@@ -1,4 +1,4 @@
1
- import { type PageProps } from "keycloakify/login/pages/PageProps";
1
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
2
2
  import type { KcContext } from "../kcContext";
3
3
  import type { I18n } from "../i18n";
4
4
 
@@ -1,8 +1,8 @@
1
1
  import { useState } from "react";
2
2
  import { clsx } from "keycloakify/tools/clsx";
3
3
  import { UserProfileFormFields } from "keycloakify/login/pages/shared/UserProfileCommons";
4
- import { type PageProps, defaultClasses } from "keycloakify/login/pages/PageProps";
5
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
4
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
5
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
6
6
  import type { KcContext } from "../kcContext";
7
7
  import type { I18n } from "../i18n";
8
8
 
@@ -10,7 +10,7 @@ export default function IdpReviewUserProfile(props: PageProps<Extract<KcContext,
10
10
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
11
11
 
12
12
  const { getClassName } = useGetClassName({
13
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
13
+ doUseDefaultCss,
14
14
  classes
15
15
  });
16
16
 
@@ -1,5 +1,5 @@
1
1
  import { assert } from "keycloakify/tools/assert";
2
- import { type PageProps } from "keycloakify/login/pages/PageProps";
2
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
3
3
  import type { KcContext } from "../kcContext";
4
4
  import type { I18n } from "../i18n";
5
5
 
@@ -1,8 +1,8 @@
1
1
  import { useState, type FormEventHandler } from "react";
2
2
  import { clsx } from "keycloakify/tools/clsx";
3
3
  import { useConstCallback } from "keycloakify/tools/useConstCallback";
4
- import { type PageProps, defaultClasses } from "keycloakify/login/pages/PageProps";
5
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
4
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
5
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
6
6
  import type { KcContext } from "../kcContext";
7
7
  import type { I18n } from "../i18n";
8
8
 
@@ -10,7 +10,7 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
10
10
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
11
11
 
12
12
  const { getClassName } = useGetClassName({
13
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
13
+ doUseDefaultCss,
14
14
  classes
15
15
  });
16
16
 
@@ -1,6 +1,6 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
- import { type PageProps, defaultClasses } from "keycloakify/login/pages/PageProps";
3
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
2
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
3
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
4
4
  import type { KcContext } from "../kcContext";
5
5
  import type { I18n } from "../i18n";
6
6
 
@@ -8,7 +8,7 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
8
8
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
9
9
 
10
10
  const { getClassName } = useGetClassName({
11
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
11
+ doUseDefaultCss,
12
12
  classes
13
13
  });
14
14
 
@@ -1,6 +1,6 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
- import { type PageProps, defaultClasses } from "keycloakify/login/pages/PageProps";
3
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
2
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
3
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
4
4
  import type { KcContext } from "../kcContext";
5
5
  import type { I18n } from "../i18n";
6
6
 
@@ -8,7 +8,7 @@ export default function LoginIdpLinkConfirm(props: PageProps<Extract<KcContext,
8
8
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
9
9
 
10
10
  const { getClassName } = useGetClassName({
11
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
11
+ doUseDefaultCss,
12
12
  classes
13
13
  });
14
14
 
@@ -1,5 +1,5 @@
1
1
  import type { KcContext } from "keycloakify/login/kcContext";
2
- import { type PageProps } from "keycloakify/login/pages/PageProps";
2
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
3
3
  import type { I18n } from "keycloakify/login/i18n";
4
4
 
5
5
  export default function LoginIdpLinkEmail(props: PageProps<Extract<KcContext, { pageId: "login-idp-link-email.ftl" }>, I18n>) {
@@ -2,8 +2,8 @@ import { useEffect } from "react";
2
2
  import { headInsert } from "keycloakify/tools/headInsert";
3
3
  import { pathJoin } from "keycloakify/bin/tools/pathJoin";
4
4
  import { clsx } from "keycloakify/tools/clsx";
5
- import { type PageProps, defaultClasses } from "keycloakify/login/pages/PageProps";
6
- import { useGetClassName } from "keycloakify/lib/useGetClassName";
5
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
6
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
7
7
  import type { KcContext } from "../kcContext";
8
8
  import type { I18n } from "../i18n";
9
9
 
@@ -11,7 +11,7 @@ export default function LoginOtp(props: PageProps<Extract<KcContext, { pageId: "
11
11
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
12
12
 
13
13
  const { getClassName } = useGetClassName({
14
- "defaultClasses": !doUseDefaultCss ? undefined : defaultClasses,
14
+ doUseDefaultCss,
15
15
  classes
16
16
  });
17
17
 
@@ -1,4 +1,4 @@
1
- import { type PageProps } from "keycloakify/login/pages/PageProps";
1
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
2
2
  import type { KcContext } from "../kcContext";
3
3
  import type { I18n } from "../i18n";
4
4