@oussemasahbeni/keycloakify-login-shadcn 250004.0.3 → 250004.0.8

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 (187) hide show
  1. package/keycloak-theme/components/langauges.tsx +1 -1
  2. package/keycloak-theme/components/theme-toggle.tsx +0 -1
  3. package/keycloak-theme/components/ui/alert.tsx +1 -2
  4. package/keycloak-theme/components/ui/button.tsx +1 -2
  5. package/keycloak-theme/components/ui/card.tsx +0 -1
  6. package/keycloak-theme/components/ui/checkbox.tsx +0 -1
  7. package/keycloak-theme/components/ui/dropdown-menu.tsx +14 -4
  8. package/keycloak-theme/components/ui/field.tsx +0 -1
  9. package/keycloak-theme/components/ui/input-otp.tsx +0 -1
  10. package/keycloak-theme/components/ui/input.tsx +0 -1
  11. package/keycloak-theme/components/ui/label.tsx +1 -2
  12. package/keycloak-theme/components/ui/radio-group.tsx +0 -1
  13. package/keycloak-theme/components/ui/select.tsx +12 -4
  14. package/keycloak-theme/components/ui/separator.tsx +0 -1
  15. package/keycloak-theme/components/ui/tooltip.tsx +0 -1
  16. package/keycloak-theme/login/KcContext.ts +23 -23
  17. package/keycloak-theme/login/KcPage.tsx +45 -47
  18. package/keycloak-theme/login/assets/img/auth-logo.svg +100 -100
  19. package/keycloak-theme/login/assets/img/shape.svg +71 -71
  20. package/keycloak-theme/login/components/LogoutOtherSessions.tsx +24 -26
  21. package/keycloak-theme/login/components/PasswordWrapper.tsx +35 -35
  22. package/keycloak-theme/login/components/Template/Template.tsx +279 -227
  23. package/keycloak-theme/login/components/Template/index.ts +1 -1
  24. package/keycloak-theme/login/components/Template/useInitializeTemplate.ts +61 -61
  25. package/keycloak-theme/login/components/UserProfileFormFields/AddRemoveButtonsMultiValuedAttribute.tsx +65 -61
  26. package/keycloak-theme/login/components/UserProfileFormFields/DO_MAKE_USER_CONFIRM_PASSWORD.ts +2 -2
  27. package/keycloak-theme/login/components/UserProfileFormFields/FieldErrors.tsx +33 -29
  28. package/keycloak-theme/login/components/UserProfileFormFields/GroupLabel.tsx +90 -71
  29. package/keycloak-theme/login/components/UserProfileFormFields/InputFieldByType.tsx +66 -59
  30. package/keycloak-theme/login/components/UserProfileFormFields/InputLabel.tsx +0 -1
  31. package/keycloak-theme/login/components/UserProfileFormFields/InputTag.tsx +133 -116
  32. package/keycloak-theme/login/components/UserProfileFormFields/InputTagSelects.tsx +150 -136
  33. package/keycloak-theme/login/components/UserProfileFormFields/SelectTag.tsx +135 -114
  34. package/keycloak-theme/login/components/UserProfileFormFields/TextareaTag.tsx +55 -43
  35. package/keycloak-theme/login/components/UserProfileFormFields/UserProfileFormFields.tsx +133 -127
  36. package/keycloak-theme/login/components/UserProfileFormFields/index.ts +1 -1
  37. package/keycloak-theme/login/i18n.ts +47 -47
  38. package/keycloak-theme/login/mocks/KcPageStory.tsx +6 -2
  39. package/keycloak-theme/login/mocks/getKcContextMock.ts +22 -22
  40. package/keycloak-theme/login/pages/PageIndex.tsx +130 -134
  41. package/keycloak-theme/login/pages/code/Page.stories.tsx +57 -70
  42. package/keycloak-theme/login/pages/code/Page.tsx +89 -89
  43. package/keycloak-theme/login/pages/code/index.ts +3 -3
  44. package/keycloak-theme/login/pages/delete-account-confirm/Page.stories.tsx +37 -46
  45. package/keycloak-theme/login/pages/delete-account-confirm/Page.tsx +60 -63
  46. package/keycloak-theme/login/pages/delete-account-confirm/index.ts +3 -3
  47. package/keycloak-theme/login/pages/delete-credential/Page.stories.tsx +25 -30
  48. package/keycloak-theme/login/pages/delete-credential/Page.tsx +56 -51
  49. package/keycloak-theme/login/pages/delete-credential/index.ts +3 -3
  50. package/keycloak-theme/login/pages/error/Page.stories.tsx +46 -58
  51. package/keycloak-theme/login/pages/error/Page.tsx +43 -42
  52. package/keycloak-theme/login/pages/error/index.ts +3 -3
  53. package/keycloak-theme/login/pages/frontchannel-logout/Page.stories.tsx +25 -32
  54. package/keycloak-theme/login/pages/frontchannel-logout/Page.tsx +82 -84
  55. package/keycloak-theme/login/pages/frontchannel-logout/index.ts +3 -3
  56. package/keycloak-theme/login/pages/idp-review-user-profile/Page.stories.tsx +46 -59
  57. package/keycloak-theme/login/pages/idp-review-user-profile/Page.tsx +49 -52
  58. package/keycloak-theme/login/pages/idp-review-user-profile/index.ts +3 -3
  59. package/keycloak-theme/login/pages/info/Page.stories.tsx +50 -60
  60. package/keycloak-theme/login/pages/info/Page.tsx +94 -92
  61. package/keycloak-theme/login/pages/link-idp-action/Page.stories.tsx +32 -16
  62. package/keycloak-theme/login/pages/link-idp-action/Page.tsx +45 -43
  63. package/keycloak-theme/login/pages/link-idp-action/index.ts +3 -3
  64. package/keycloak-theme/login/pages/login/Form.tsx +242 -242
  65. package/keycloak-theme/login/pages/login/Info.tsx +29 -29
  66. package/keycloak-theme/login/pages/login/Page.stories.tsx +346 -365
  67. package/keycloak-theme/login/pages/login/Page.tsx +43 -44
  68. package/keycloak-theme/login/pages/login/SocialProviders.tsx +93 -107
  69. package/keycloak-theme/login/pages/login/index.ts +3 -3
  70. package/keycloak-theme/login/pages/login/providers/apple.svg +3 -3
  71. package/keycloak-theme/login/pages/login/providers/bitbucket.svg +11 -11
  72. package/keycloak-theme/login/pages/login/providers/discord.svg +4 -4
  73. package/keycloak-theme/login/pages/login/providers/facebook.svg +5 -5
  74. package/keycloak-theme/login/pages/login/providers/github.svg +3 -3
  75. package/keycloak-theme/login/pages/login/providers/gitlab.svg +7 -7
  76. package/keycloak-theme/login/pages/login/providers/google.svg +7 -7
  77. package/keycloak-theme/login/pages/login/providers/instagram.svg +31 -31
  78. package/keycloak-theme/login/pages/login/providers/linkedin.svg +3 -3
  79. package/keycloak-theme/login/pages/login/providers/microsoft.svg +6 -6
  80. package/keycloak-theme/login/pages/login/providers/oidc.svg +5 -5
  81. package/keycloak-theme/login/pages/login/providers/openshift.svg +7 -7
  82. package/keycloak-theme/login/pages/login/providers/paypal.svg +6 -6
  83. package/keycloak-theme/login/pages/login/providers/slack.svg +11 -11
  84. package/keycloak-theme/login/pages/login/providers/stackoverflow.svg +5 -5
  85. package/keycloak-theme/login/pages/login/providers/x.svg +3 -3
  86. package/keycloak-theme/login/pages/login/useProviderLogos.tsx +39 -39
  87. package/keycloak-theme/login/pages/login/useScript.tsx +62 -62
  88. package/keycloak-theme/login/pages/login-config-totp/Page.stories.tsx +45 -60
  89. package/keycloak-theme/login/pages/login-config-totp/Page.tsx +253 -240
  90. package/keycloak-theme/login/pages/login-config-totp/index.ts +3 -3
  91. package/keycloak-theme/login/pages/login-idp-link-confirm/Page.stories.tsx +30 -35
  92. package/keycloak-theme/login/pages/login-idp-link-confirm/Page.tsx +40 -43
  93. package/keycloak-theme/login/pages/login-idp-link-confirm/index.ts +3 -3
  94. package/keycloak-theme/login/pages/login-idp-link-confirm-override/Page.stories.tsx +16 -23
  95. package/keycloak-theme/login/pages/login-idp-link-confirm-override/Page.tsx +44 -47
  96. package/keycloak-theme/login/pages/login-idp-link-confirm-override/index.ts +3 -3
  97. package/keycloak-theme/login/pages/login-idp-link-email/Page.stories.tsx +54 -63
  98. package/keycloak-theme/login/pages/login-idp-link-email/Page.tsx +51 -54
  99. package/keycloak-theme/login/pages/login-idp-link-email/index.ts +3 -3
  100. package/keycloak-theme/login/pages/login-oauth-grant/Page.stories.tsx +39 -45
  101. package/keycloak-theme/login/pages/login-oauth-grant/Page.tsx +136 -126
  102. package/keycloak-theme/login/pages/login-oauth-grant/index.ts +3 -3
  103. package/keycloak-theme/login/pages/login-oauth2-device-verify-user-code/Page.stories.tsx +38 -48
  104. package/keycloak-theme/login/pages/login-oauth2-device-verify-user-code/Page.tsx +56 -58
  105. package/keycloak-theme/login/pages/login-oauth2-device-verify-user-code/index.ts +3 -3
  106. package/keycloak-theme/login/pages/login-otp/Page.stories.tsx +82 -97
  107. package/keycloak-theme/login/pages/login-otp/Page.tsx +117 -108
  108. package/keycloak-theme/login/pages/login-otp/index.ts +3 -3
  109. package/keycloak-theme/login/pages/login-page-expired/Page.stories.tsx +28 -37
  110. package/keycloak-theme/login/pages/login-page-expired/Page.tsx +45 -47
  111. package/keycloak-theme/login/pages/login-page-expired/index.ts +3 -3
  112. package/keycloak-theme/login/pages/login-passkeys-conditional-authenticate/Page.stories.tsx +20 -0
  113. package/keycloak-theme/login/pages/login-passkeys-conditional-authenticate/Page.tsx +290 -233
  114. package/keycloak-theme/login/pages/login-passkeys-conditional-authenticate/index.ts +3 -3
  115. package/keycloak-theme/login/pages/login-passkeys-conditional-authenticate/useScript.tsx +63 -63
  116. package/keycloak-theme/login/pages/login-password/Page.stories.tsx +55 -56
  117. package/keycloak-theme/login/pages/login-password/Page.tsx +148 -149
  118. package/keycloak-theme/login/pages/login-password/index.ts +3 -3
  119. package/keycloak-theme/login/pages/login-password/useScript.tsx +62 -63
  120. package/keycloak-theme/login/pages/login-recovery-authn-code-config/Page.stories.tsx +28 -36
  121. package/keycloak-theme/login/pages/login-recovery-authn-code-config/Page.tsx +178 -181
  122. package/keycloak-theme/login/pages/login-recovery-authn-code-config/index.ts +3 -3
  123. package/keycloak-theme/login/pages/login-recovery-authn-code-config/useScript.tsx +145 -145
  124. package/keycloak-theme/login/pages/login-recovery-authn-code-input/Page.stories.tsx +16 -22
  125. package/keycloak-theme/login/pages/login-recovery-authn-code-input/Page.tsx +69 -70
  126. package/keycloak-theme/login/pages/login-recovery-authn-code-input/index.ts +3 -3
  127. package/keycloak-theme/login/pages/login-reset-otp/Page.stories.tsx +62 -75
  128. package/keycloak-theme/login/pages/login-reset-otp/Page.tsx +85 -86
  129. package/keycloak-theme/login/pages/login-reset-otp/index.ts +3 -3
  130. package/keycloak-theme/login/pages/login-reset-password/Form.tsx +67 -68
  131. package/keycloak-theme/login/pages/login-reset-password/Page.stories.tsx +44 -55
  132. package/keycloak-theme/login/pages/login-reset-password/Page.tsx +27 -27
  133. package/keycloak-theme/login/pages/login-reset-password/index.ts +3 -3
  134. package/keycloak-theme/login/pages/login-update-password/Page.stories.tsx +40 -51
  135. package/keycloak-theme/login/pages/login-update-password/Page.tsx +109 -111
  136. package/keycloak-theme/login/pages/login-update-password/index.ts +3 -3
  137. package/keycloak-theme/login/pages/login-update-profile/Page.stories.tsx +28 -37
  138. package/keycloak-theme/login/pages/login-update-profile/Page.tsx +67 -68
  139. package/keycloak-theme/login/pages/login-update-profile/index.ts +3 -3
  140. package/keycloak-theme/login/pages/login-username/Page.stories.tsx +32 -43
  141. package/keycloak-theme/login/pages/login-username/Page.tsx +246 -246
  142. package/keycloak-theme/login/pages/login-username/index.ts +3 -3
  143. package/keycloak-theme/login/pages/login-username/useScript.tsx +62 -62
  144. package/keycloak-theme/login/pages/login-verify-email/Page.stories.tsx +68 -81
  145. package/keycloak-theme/login/pages/login-verify-email/Page.tsx +37 -38
  146. package/keycloak-theme/login/pages/login-verify-email/index.ts +3 -3
  147. package/keycloak-theme/login/pages/login-x509-info/Page.stories.tsx +29 -38
  148. package/keycloak-theme/login/pages/login-x509-info/Page.tsx +72 -75
  149. package/keycloak-theme/login/pages/login-x509-info/index.ts +3 -3
  150. package/keycloak-theme/login/pages/logout-confirm/Page.stories.tsx +34 -43
  151. package/keycloak-theme/login/pages/logout-confirm/Page.tsx +50 -53
  152. package/keycloak-theme/login/pages/logout-confirm/index.ts +3 -3
  153. package/keycloak-theme/login/pages/register/Form.tsx +107 -106
  154. package/keycloak-theme/login/pages/register/Page.stories.tsx +40 -14
  155. package/keycloak-theme/login/pages/register/Page.tsx +26 -26
  156. package/keycloak-theme/login/pages/register/TermsAcceptance.tsx +55 -56
  157. package/keycloak-theme/login/pages/register/index.ts +3 -3
  158. package/keycloak-theme/login/pages/saml-post-form/Page.stories.tsx +16 -23
  159. package/keycloak-theme/login/pages/saml-post-form/Page.tsx +64 -66
  160. package/keycloak-theme/login/pages/saml-post-form/index.ts +3 -3
  161. package/keycloak-theme/login/pages/select-authenticator/Page.stories.tsx +83 -96
  162. package/keycloak-theme/login/pages/select-authenticator/Page.tsx +97 -100
  163. package/keycloak-theme/login/pages/select-authenticator/index.ts +3 -3
  164. package/keycloak-theme/login/pages/select-organization/Page.stories.tsx +62 -49
  165. package/keycloak-theme/login/pages/select-organization/Page.tsx +123 -126
  166. package/keycloak-theme/login/pages/select-organization/index.ts +3 -3
  167. package/keycloak-theme/login/pages/terms/Page.stories.tsx +15 -0
  168. package/keycloak-theme/login/pages/terms/Page.tsx +49 -51
  169. package/keycloak-theme/login/pages/terms/index.ts +3 -3
  170. package/keycloak-theme/login/pages/update-email/Page.stories.tsx +27 -36
  171. package/keycloak-theme/login/pages/update-email/Page.tsx +61 -62
  172. package/keycloak-theme/login/pages/update-email/index.ts +3 -3
  173. package/keycloak-theme/login/pages/webauthn-authenticate/Page.stories.tsx +112 -127
  174. package/keycloak-theme/login/pages/webauthn-authenticate/Page.tsx +206 -202
  175. package/keycloak-theme/login/pages/webauthn-authenticate/index.ts +3 -3
  176. package/keycloak-theme/login/pages/webauthn-authenticate/useScript.tsx +55 -55
  177. package/keycloak-theme/login/pages/webauthn-error/Page.stories.tsx +52 -67
  178. package/keycloak-theme/login/pages/webauthn-error/Page.tsx +70 -73
  179. package/keycloak-theme/login/pages/webauthn-error/index.ts +3 -3
  180. package/keycloak-theme/login/pages/webauthn-register/Page.stories.tsx +39 -50
  181. package/keycloak-theme/login/pages/webauthn-register/Page.tsx +78 -78
  182. package/keycloak-theme/login/pages/webauthn-register/index.ts +3 -3
  183. package/keycloak-theme/login/pages/webauthn-register/useScript.tsx +62 -62
  184. package/keycloak-theme/login/shared/getColorScheme.ts +45 -45
  185. package/keycloak-theme/login/styleLevelCustomization.tsx +34 -36
  186. package/keycloak-theme/public/site.webmanifest +11 -1
  187. package/package.json +6 -2
@@ -1,126 +1,136 @@
1
- import { Button } from "@/components/ui/button";
2
- import { CardDescription } from "@/components/ui/card";
3
- import { useI18n } from '@/login/i18n';
4
- import { useKcContext } from '@/login/KcContext';
5
- import { assert } from 'tsafe/assert';
6
- import { Template } from "../../components/Template";
7
-
8
- export function Page() {
9
- const { kcContext } = useKcContext();
10
- assert(kcContext.pageId === "login-oauth-grant.ftl");
11
-
12
- const { msg, msgStr, advancedMsg, advancedMsgStr } = useI18n();
13
-
14
-
15
- return (
16
- <Template
17
- bodyClassName="oauth"
18
- headerNode={
19
- <div className="flex flex-col items-center space-y-3">
20
- {kcContext.client.attributes.logoUri && (
21
- <img
22
- src={kcContext.client.attributes.logoUri}
23
- alt="Client logo"
24
- className="h-12 w-auto object-contain"
25
- />
26
- )}
27
- <p className="text-lg font-medium text-center">
28
- {kcContext.client.name
29
- ? msg("oauthGrantTitle", advancedMsgStr(kcContext.client.name))
30
- : msg("oauthGrantTitle", kcContext.client.clientId)}
31
- </p>
32
- </div>
33
- }
34
- >
35
- <div className="space-y-6">
36
- <div className="text-base">{msg("oauthGrantRequest")}</div>
37
-
38
- <div className="space-y-4">
39
- <div className="space-y-2">
40
- {kcContext.oauth.clientScopesRequested.map(clientScope => (
41
- <div
42
- key={clientScope.consentScreenText}
43
- className="flex items-start space-x-2"
44
- >
45
- <div className="w-2 h-2 bg-primary rounded-full mt-2 shrink-0" />
46
- <span className="text-sm text-muted-foreground">
47
- {advancedMsg(clientScope.consentScreenText)}
48
- {clientScope.dynamicScopeParameter && (
49
- <>
50
- :{" "}
51
- <span className="font-medium text-foreground">
52
- {clientScope.dynamicScopeParameter}
53
- </span>
54
- </>
55
- )}
56
- </span>
57
- </div>
58
- ))}
59
- </div>
60
-
61
- {(kcContext.client.attributes.policyUri || kcContext.client.attributes.tosUri) && (
62
- <>
63
- <div className="space-y-2">
64
- <CardDescription className="text-xs">
65
- {kcContext.client.name
66
- ? msg(
67
- "oauthGrantInformation",
68
- advancedMsgStr(kcContext.client.name)
69
- )
70
- : msg("oauthGrantInformation", kcContext.client.clientId)}
71
- </CardDescription>
72
- <div className="flex flex-wrap gap-2 text-xs">
73
- {kcContext.client.attributes.tosUri && (
74
- <a
75
- href={kcContext.client.attributes.tosUri}
76
- target="_blank"
77
- rel="noopener noreferrer"
78
- className="text-primary dark:text-white hover:text-primary/80 underline underline-offset-4"
79
- >
80
- {msg("oauthGrantTos")}
81
- </a>
82
- )}
83
- {kcContext.client.attributes.policyUri && (
84
- <a
85
- href={kcContext.client.attributes.policyUri}
86
- target="_blank"
87
- rel="noopener noreferrer"
88
- className="text-primary dark:text-white hover:text-primary/80 underline underline-offset-4"
89
- >
90
- {msg("oauthGrantPolicy")}
91
- </a>
92
- )}
93
- </div>
94
- </div>
95
- </>
96
- )}
97
- </div>
98
-
99
- <div>
100
- <form className="w-full" action={kcContext.url.oauthAction} method="POST">
101
- <input type="hidden" name="code" value={kcContext.oauth.code} />
102
- <div className="flex flex-col sm:flex-row gap-3 w-full">
103
- <Button
104
- type="submit"
105
- name="cancel"
106
- id="kc-cancel"
107
- variant="outline"
108
- className="flex-1"
109
- >
110
- {msgStr("doNo")}
111
- </Button>
112
- <Button
113
- type="submit"
114
- name="accept"
115
- id="kc-login"
116
- className="flex-1"
117
- >
118
- {msgStr("doYes")}
119
- </Button>
120
- </div>
121
- </form>
122
- </div>
123
- </div>
124
- </Template>
125
- );
126
- }
1
+ import { Button } from "@/components/ui/button";
2
+ import { CardDescription } from "@/components/ui/card";
3
+ import { useI18n } from "@/login/i18n";
4
+ import { useKcContext } from "@/login/KcContext";
5
+ import { assert } from "tsafe/assert";
6
+ import { Template } from "../../components/Template";
7
+
8
+ export function Page() {
9
+ const { kcContext } = useKcContext();
10
+ assert(kcContext.pageId === "login-oauth-grant.ftl");
11
+
12
+ const { msg, msgStr, advancedMsg, advancedMsgStr } = useI18n();
13
+
14
+ return (
15
+ <Template
16
+ bodyClassName="oauth"
17
+ headerNode={
18
+ <div className="flex flex-col items-center space-y-3">
19
+ {kcContext.client.attributes.logoUri && (
20
+ <img
21
+ src={kcContext.client.attributes.logoUri}
22
+ alt="Client logo"
23
+ className="h-12 w-auto object-contain"
24
+ />
25
+ )}
26
+ <p className="text-lg font-medium text-center">
27
+ {kcContext.client.name
28
+ ? msg(
29
+ "oauthGrantTitle",
30
+ advancedMsgStr(kcContext.client.name)
31
+ )
32
+ : msg("oauthGrantTitle", kcContext.client.clientId)}
33
+ </p>
34
+ </div>
35
+ }
36
+ >
37
+ <div className="space-y-6">
38
+ <div className="text-base">{msg("oauthGrantRequest")}</div>
39
+
40
+ <div className="space-y-4">
41
+ <div className="space-y-2">
42
+ {kcContext.oauth.clientScopesRequested.map(clientScope => (
43
+ <div
44
+ key={clientScope.consentScreenText}
45
+ className="flex items-start space-x-2"
46
+ >
47
+ <div className="w-2 h-2 bg-primary rounded-full mt-2 shrink-0" />
48
+ <span className="text-sm text-muted-foreground">
49
+ {advancedMsg(clientScope.consentScreenText)}
50
+ {clientScope.dynamicScopeParameter && (
51
+ <>
52
+ :{" "}
53
+ <span className="font-medium text-foreground">
54
+ {clientScope.dynamicScopeParameter}
55
+ </span>
56
+ </>
57
+ )}
58
+ </span>
59
+ </div>
60
+ ))}
61
+ </div>
62
+
63
+ {(kcContext.client.attributes.policyUri ||
64
+ kcContext.client.attributes.tosUri) && (
65
+ <>
66
+ <div className="space-y-2">
67
+ <CardDescription className="text-xs">
68
+ {kcContext.client.name
69
+ ? msg(
70
+ "oauthGrantInformation",
71
+ advancedMsgStr(kcContext.client.name)
72
+ )
73
+ : msg(
74
+ "oauthGrantInformation",
75
+ kcContext.client.clientId
76
+ )}
77
+ </CardDescription>
78
+ <div className="flex flex-wrap gap-2 text-xs">
79
+ {kcContext.client.attributes.tosUri && (
80
+ <a
81
+ href={kcContext.client.attributes.tosUri}
82
+ target="_blank"
83
+ rel="noopener noreferrer"
84
+ className="text-primary dark:text-white hover:text-primary/80 underline underline-offset-4"
85
+ >
86
+ {msg("oauthGrantTos")}
87
+ </a>
88
+ )}
89
+ {kcContext.client.attributes.policyUri && (
90
+ <a
91
+ href={kcContext.client.attributes.policyUri}
92
+ target="_blank"
93
+ rel="noopener noreferrer"
94
+ className="text-primary dark:text-white hover:text-primary/80 underline underline-offset-4"
95
+ >
96
+ {msg("oauthGrantPolicy")}
97
+ </a>
98
+ )}
99
+ </div>
100
+ </div>
101
+ </>
102
+ )}
103
+ </div>
104
+
105
+ <div>
106
+ <form
107
+ className="w-full"
108
+ action={kcContext.url.oauthAction}
109
+ method="POST"
110
+ >
111
+ <input type="hidden" name="code" value={kcContext.oauth.code} />
112
+ <div className="flex flex-col sm:flex-row gap-3 w-full">
113
+ <Button
114
+ type="submit"
115
+ name="cancel"
116
+ id="kc-cancel"
117
+ variant="outline"
118
+ className="flex-1"
119
+ >
120
+ {msgStr("doNo")}
121
+ </Button>
122
+ <Button
123
+ type="submit"
124
+ name="accept"
125
+ id="kc-login"
126
+ className="flex-1"
127
+ >
128
+ {msgStr("doYes")}
129
+ </Button>
130
+ </div>
131
+ </form>
132
+ </div>
133
+ </div>
134
+ </Template>
135
+ );
136
+ }
@@ -1,3 +1,3 @@
1
- import { Page } from "./Page";
2
-
3
- export default Page;
1
+ import { Page } from "./Page";
2
+
3
+ export default Page;
@@ -13,32 +13,26 @@ export default meta;
13
13
 
14
14
  type Story = StoryObj<typeof meta>;
15
15
 
16
- export const Default: Story = {
17
- render: () => <KcPageStory />
18
- };
16
+ export const Default: Story = {};
19
17
 
20
18
  export const Arabic: Story = {
21
- render: () => (
22
- <KcPageStory
23
- kcContext={{
24
- locale: {
25
- currentLanguageTag: "ar",
26
- rtl: true
27
- }
28
- }}
29
- />
30
- )
19
+ args: {
20
+ kcContext: {
21
+ locale: {
22
+ currentLanguageTag: "ar",
23
+ rtl: true
24
+ }
25
+ }
26
+ }
31
27
  };
32
28
  export const French: Story = {
33
- render: () => (
34
- <KcPageStory
35
- kcContext={{
36
- locale: {
37
- currentLanguageTag: "fr"
38
- }
39
- }}
40
- />
41
- )
29
+ args: {
30
+ kcContext: {
31
+ locale: {
32
+ currentLanguageTag: "fr"
33
+ }
34
+ }
35
+ }
42
36
  };
43
37
 
44
38
  /**
@@ -48,19 +42,17 @@ export const French: Story = {
48
42
  * - Key Aspect: Ensures the error message is properly shown when the user enters an invalid code.
49
43
  */
50
44
  export const WithErrorMessage: Story = {
51
- render: () => (
52
- <KcPageStory
53
- kcContext={{
54
- url: {
55
- oauth2DeviceVerificationAction: "/mock-oauth2-device-verification"
56
- },
57
- message: {
58
- summary: "The user code you entered is invalid. Please try again.",
59
- type: "error"
60
- }
61
- }}
62
- />
63
- )
45
+ args: {
46
+ kcContext: {
47
+ url: {
48
+ oauth2DeviceVerificationAction: "/mock-oauth2-device-verification"
49
+ },
50
+ message: {
51
+ summary: "The user code you entered is invalid. Please try again.",
52
+ type: "error"
53
+ }
54
+ }
55
+ }
64
56
  };
65
57
 
66
58
  /**
@@ -70,17 +62,15 @@ export const WithErrorMessage: Story = {
70
62
  * - Key Aspect: Ensures the form displays validation errors when the field is left empty.
71
63
  */
72
64
  export const WithEmptyInputField: Story = {
73
- render: () => (
74
- <KcPageStory
75
- kcContext={{
76
- url: {
77
- oauth2DeviceVerificationAction: "/mock-oauth2-device-verification"
78
- },
79
- message: {
80
- summary: "User code cannot be empty. Please enter a valid code.",
81
- type: "error"
82
- }
83
- }}
84
- />
85
- )
65
+ args: {
66
+ kcContext: {
67
+ url: {
68
+ oauth2DeviceVerificationAction: "/mock-oauth2-device-verification"
69
+ },
70
+ message: {
71
+ summary: "User code cannot be empty. Please enter a valid code.",
72
+ type: "error"
73
+ }
74
+ }
75
+ }
86
76
  };
@@ -1,58 +1,56 @@
1
- import { Button } from "@/components/ui/button";
2
- import { Field, FieldLabel } from "@/components/ui/field";
3
- import { Input } from "@/components/ui/input";
4
- import { useI18n } from '@/login/i18n';
5
- import { useKcContext } from '@/login/KcContext';
6
- import { useKcClsx } from '@keycloakify/login-ui/useKcClsx';
7
- import { assert } from 'tsafe/assert';
8
- import { Template } from "../../components/Template";
9
-
10
- export function Page() {
11
- const { kcContext } = useKcContext();
12
- assert(kcContext.pageId === "login-oauth2-device-verify-user-code.ftl");
13
-
14
- const { msg, msgStr } = useI18n();
15
-
16
- const { kcClsx } = useKcClsx();
17
-
18
- return (
19
- <Template
20
- headerNode={msg("oauth2DeviceVerificationTitle")}
21
- >
22
- <form
23
- id="kc-user-verify-device-user-code-form"
24
- className="space-y-5"
25
- action={kcContext.url.oauth2DeviceVerificationAction}
26
- method="post"
27
- >
28
- <Field>
29
- <FieldLabel htmlFor="device-user-code">
30
- {msg("verifyOAuth2DeviceUserCode")}
31
- </FieldLabel>
32
- <Input
33
- id="device-user-code"
34
- name="device_user_code"
35
- autoComplete="off"
36
- type="text"
37
- className={kcClsx("kcInputClass")}
38
- autoFocus
39
- />
40
- </Field>
41
-
42
- <div className={kcClsx("kcFormGroupClass")}>
43
- <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
44
- <div className={kcClsx("kcFormOptionsWrapperClass")}></div>
45
- </div>
46
-
47
- <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
48
- <div className={kcClsx("kcFormButtonsWrapperClass")}>
49
- <Button className="w-full" type="submit">
50
- {msgStr("doSubmit")}
51
- </Button>
52
- </div>
53
- </div>
54
- </div>
55
- </form>
56
- </Template>
57
- );
58
- }
1
+ import { Button } from "@/components/ui/button";
2
+ import { Field, FieldLabel } from "@/components/ui/field";
3
+ import { Input } from "@/components/ui/input";
4
+ import { useI18n } from "@/login/i18n";
5
+ import { useKcContext } from "@/login/KcContext";
6
+ import { useKcClsx } from "@keycloakify/login-ui/useKcClsx";
7
+ import { assert } from "tsafe/assert";
8
+ import { Template } from "../../components/Template";
9
+
10
+ export function Page() {
11
+ const { kcContext } = useKcContext();
12
+ assert(kcContext.pageId === "login-oauth2-device-verify-user-code.ftl");
13
+
14
+ const { msg, msgStr } = useI18n();
15
+
16
+ const { kcClsx } = useKcClsx();
17
+
18
+ return (
19
+ <Template headerNode={msg("oauth2DeviceVerificationTitle")}>
20
+ <form
21
+ id="kc-user-verify-device-user-code-form"
22
+ className="space-y-5"
23
+ action={kcContext.url.oauth2DeviceVerificationAction}
24
+ method="post"
25
+ >
26
+ <Field>
27
+ <FieldLabel htmlFor="device-user-code">
28
+ {msg("verifyOAuth2DeviceUserCode")}
29
+ </FieldLabel>
30
+ <Input
31
+ id="device-user-code"
32
+ name="device_user_code"
33
+ autoComplete="off"
34
+ type="text"
35
+ className={kcClsx("kcInputClass")}
36
+ autoFocus
37
+ />
38
+ </Field>
39
+
40
+ <div className={kcClsx("kcFormGroupClass")}>
41
+ <div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
42
+ <div className={kcClsx("kcFormOptionsWrapperClass")}></div>
43
+ </div>
44
+
45
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
46
+ <div className={kcClsx("kcFormButtonsWrapperClass")}>
47
+ <Button className="w-full" type="submit">
48
+ {msgStr("doSubmit")}
49
+ </Button>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </form>
54
+ </Template>
55
+ );
56
+ }
@@ -1,3 +1,3 @@
1
- import { Page } from "./Page";
2
-
3
- export default Page;
1
+ import { Page } from "./Page";
2
+
3
+ export default Page;