keycloak-theme-editor 0.1.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 (343) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +147 -0
  3. package/bin/cli.js +1270 -0
  4. package/dist/assets/EditorContent-CB5V7FK7.js +134 -0
  5. package/dist/assets/RedHatDisplay-Bold-4NfIjmgI.woff2 +0 -0
  6. package/dist/assets/RedHatDisplay-BoldItalic-pTGisv8w.woff2 +0 -0
  7. package/dist/assets/RedHatDisplay-Medium-C1BzJLzv.woff2 +0 -0
  8. package/dist/assets/RedHatDisplay-MediumItalic-ZwmBpJRm.woff2 +0 -0
  9. package/dist/assets/RedHatDisplayVF-CYDHf1NI.woff2 +0 -0
  10. package/dist/assets/RedHatDisplayVF-Italic-CRpusWc8.woff2 +0 -0
  11. package/dist/assets/RedHatMono-Italic-CV5TsSDj.woff2 +0 -0
  12. package/dist/assets/RedHatMono-Regular-e08YtVYm.woff2 +0 -0
  13. package/dist/assets/RedHatMonoVF-C4fMH6Vz.woff2 +0 -0
  14. package/dist/assets/RedHatMonoVF-Italic-DGQo2ogW.woff2 +0 -0
  15. package/dist/assets/RedHatText-Italic-BLl-MYdo.woff2 +0 -0
  16. package/dist/assets/RedHatText-Medium-CFPgPIaW.woff2 +0 -0
  17. package/dist/assets/RedHatText-MediumItalic-B14GYUh6.woff2 +0 -0
  18. package/dist/assets/RedHatText-Regular-BDARZx4I.woff2 +0 -0
  19. package/dist/assets/RedHatTextVF-Italic-Dkj_WqbA.woff2 +0 -0
  20. package/dist/assets/RedHatTextVF-wYvZ7prR.woff2 +0 -0
  21. package/dist/assets/StylingPanel-BaNmfAl5.js +10 -0
  22. package/dist/assets/codemirror-CPFVGfiJ.js +12 -0
  23. package/dist/assets/fa-solid-900-DguXoeIz.woff2 +0 -0
  24. package/dist/assets/fflate-BiS96k4e.js +1 -0
  25. package/dist/assets/index-Dm1pQXDh.css +1 -0
  26. package/dist/assets/index-DtQiX03K.js +2 -0
  27. package/dist/assets/mdi-C-ens7Qz.js +1 -0
  28. package/dist/assets/patternfly-BbS2qD2Z.js +1 -0
  29. package/dist/assets/patternfly-ZUQBYYQM.css +1 -0
  30. package/dist/assets/patternfly-addons-C5K6YGth.css +1 -0
  31. package/dist/assets/patternfly.min-DYq-aGv-.css +1 -0
  32. package/dist/assets/pf-v5-pficon-Di6gTOT4.woff2 +0 -0
  33. package/dist/assets/pf-v6-pficon-Dy6oiu9u.woff2 +0 -0
  34. package/dist/assets/react-BwQcSK_q.js +9 -0
  35. package/dist/assets/vendor-DPuiCcTY.js +2 -0
  36. package/dist/assets/zustand-Cd1unGLA.js +1 -0
  37. package/dist/index.html +17 -0
  38. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Black.woff2 +0 -0
  39. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-BlackItalic.woff2 +0 -0
  40. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Bold.woff2 +0 -0
  41. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-BoldItalic.woff2 +0 -0
  42. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Italic.woff2 +0 -0
  43. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Light.woff2 +0 -0
  44. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-LightItalic.woff2 +0 -0
  45. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Medium.woff2 +0 -0
  46. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-MediumItalic.woff2 +0 -0
  47. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplay-Regular.woff2 +0 -0
  48. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplayVF-Italic.woff2 +0 -0
  49. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay/RedHatDisplayVF.woff2 +0 -0
  50. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Black.woff2 +0 -0
  51. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-BlackItalic.woff2 +0 -0
  52. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Bold.woff2 +0 -0
  53. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-BoldItalic.woff2 +0 -0
  54. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Italic.woff2 +0 -0
  55. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Light.woff2 +0 -0
  56. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-LightItalic.woff2 +0 -0
  57. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Medium.woff2 +0 -0
  58. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-MediumItalic.woff2 +0 -0
  59. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplay-Regular.woff2 +0 -0
  60. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplayVF-Italic.woff2 +0 -0
  61. package/dist/keycloak-dev-resources/assets/fonts/RedHatDisplayVF.woff2 +0 -0
  62. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-Bold.woff2 +0 -0
  63. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-BoldItalic.woff2 +0 -0
  64. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-Italic.woff2 +0 -0
  65. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-Light.woff2 +0 -0
  66. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-LightItalic.woff2 +0 -0
  67. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-Medium.woff2 +0 -0
  68. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-MediumItalic.woff2 +0 -0
  69. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMono-Regular.woff2 +0 -0
  70. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMonoVF-Italic.woff2 +0 -0
  71. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono/RedHatMonoVF.woff2 +0 -0
  72. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-Bold.woff2 +0 -0
  73. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-BoldItalic.woff2 +0 -0
  74. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-Italic.woff2 +0 -0
  75. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-Light.woff2 +0 -0
  76. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-LightItalic.woff2 +0 -0
  77. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-Medium.woff2 +0 -0
  78. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-MediumItalic.woff2 +0 -0
  79. package/dist/keycloak-dev-resources/assets/fonts/RedHatMono-Regular.woff2 +0 -0
  80. package/dist/keycloak-dev-resources/assets/fonts/RedHatMonoVF-Italic.woff2 +0 -0
  81. package/dist/keycloak-dev-resources/assets/fonts/RedHatMonoVF.woff2 +0 -0
  82. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-Bold.woff2 +0 -0
  83. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-BoldItalic.woff2 +0 -0
  84. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-Italic.woff2 +0 -0
  85. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-Light.woff2 +0 -0
  86. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-LightItalic.woff2 +0 -0
  87. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-Medium.woff2 +0 -0
  88. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-MediumItalic.woff2 +0 -0
  89. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatText-Regular.woff2 +0 -0
  90. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatTextVF-Italic.woff2 +0 -0
  91. package/dist/keycloak-dev-resources/assets/fonts/RedHatText/RedHatTextVF.woff2 +0 -0
  92. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-Bold.woff2 +0 -0
  93. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-BoldItalic.woff2 +0 -0
  94. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-Italic.woff2 +0 -0
  95. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-Light.woff2 +0 -0
  96. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-LightItalic.woff2 +0 -0
  97. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-Medium.woff2 +0 -0
  98. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-MediumItalic.woff2 +0 -0
  99. package/dist/keycloak-dev-resources/assets/fonts/RedHatText-Regular.woff2 +0 -0
  100. package/dist/keycloak-dev-resources/assets/fonts/RedHatTextVF-Italic.woff2 +0 -0
  101. package/dist/keycloak-dev-resources/assets/fonts/RedHatTextVF.woff2 +0 -0
  102. package/dist/keycloak-dev-resources/assets/fonts/fa-solid-900.woff2 +0 -0
  103. package/dist/keycloak-dev-resources/assets/fonts/webfonts/fa-solid-900.woff2 +0 -0
  104. package/dist/keycloak-dev-resources/img/keycloak-bg-darken.svg +1 -0
  105. package/dist/keycloak-dev-resources/img/keycloak-bg.png +0 -0
  106. package/dist/keycloak-dev-resources/img/keycloak-logo-text.svg +1 -0
  107. package/dist/keycloak-dev-resources/patternfly-addons.css +8430 -0
  108. package/dist/keycloak-dev-resources/patternfly.min.css +2 -0
  109. package/dist/keycloak-dev-resources/themes/base/login/messages/messages_en.properties +5 -0
  110. package/dist/keycloak-dev-resources/themes/base/login/mock-extension-showcase.ftl +13 -0
  111. package/dist/keycloak-dev-resources/themes/base/login/resources/css/preview.css +5 -0
  112. package/dist/keycloak-dev-resources/themes/base/login/resources/css/quick-start.css +16 -0
  113. package/dist/keycloak-dev-resources/themes/base/login/resources/css/styles.css +2 -0
  114. package/dist/keycloak-dev-resources/themes/base/login/theme.properties +143 -0
  115. package/dist/keycloak-dev-resources/themes/horizontal-card/login/footer.ftl +32 -0
  116. package/dist/keycloak-dev-resources/themes/horizontal-card/login/messages/messages_en.properties +6 -0
  117. package/dist/keycloak-dev-resources/themes/horizontal-card/login/resources/css/preview.css +5 -0
  118. package/dist/keycloak-dev-resources/themes/horizontal-card/login/resources/css/quick-start.css +31 -0
  119. package/dist/keycloak-dev-resources/themes/horizontal-card/login/resources/css/styles.css +1149 -0
  120. package/dist/keycloak-dev-resources/themes/horizontal-card/login/template.ftl +234 -0
  121. package/dist/keycloak-dev-resources/themes/horizontal-card/login/theme.properties +142 -0
  122. package/dist/keycloak-dev-resources/themes/modern-gradient/login/footer.ftl +12 -0
  123. package/dist/keycloak-dev-resources/themes/modern-gradient/login/messages/messages_en.properties +6 -0
  124. package/dist/keycloak-dev-resources/themes/modern-gradient/login/resources/css/preview.css +13 -0
  125. package/dist/keycloak-dev-resources/themes/modern-gradient/login/resources/css/quick-start.css +39 -0
  126. package/dist/keycloak-dev-resources/themes/modern-gradient/login/resources/css/styles.css +1371 -0
  127. package/dist/keycloak-dev-resources/themes/modern-gradient/login/template.ftl +296 -0
  128. package/dist/keycloak-dev-resources/themes/modern-gradient/login/theme.properties +142 -0
  129. package/dist/keycloak-dev-resources/themes/themes.json +42 -0
  130. package/dist/keycloak-dev-resources/themes/v2/login/footer.ftl +15 -0
  131. package/dist/keycloak-dev-resources/themes/v2/login/messages/messages_en.properties +5 -0
  132. package/dist/keycloak-dev-resources/themes/v2/login/mock-extension-showcase.ftl +13 -0
  133. package/dist/keycloak-dev-resources/themes/v2/login/resources/css/preview.css +5 -0
  134. package/dist/keycloak-dev-resources/themes/v2/login/resources/css/quick-start.css +16 -0
  135. package/dist/keycloak-dev-resources/themes/v2/login/resources/css/styles.css +426 -0
  136. package/dist/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-bg-darken.svg +1 -0
  137. package/dist/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-bg.png +0 -0
  138. package/dist/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-logo-text.svg +1 -0
  139. package/dist/keycloak-dev-resources/themes/v2/login/template.ftl +287 -0
  140. package/dist/keycloak-dev-resources/themes/v2/login/theme.properties +125 -0
  141. package/dist/keycloak-upstream/base/login/cli_splash.ftl +7 -0
  142. package/dist/keycloak-upstream/base/login/code.ftl +19 -0
  143. package/dist/keycloak-upstream/base/login/delete-account-confirm.ftl +33 -0
  144. package/dist/keycloak-upstream/base/login/delete-credential.ftl +15 -0
  145. package/dist/keycloak-upstream/base/login/error.ftl +16 -0
  146. package/dist/keycloak-upstream/base/login/footer.ftl +3 -0
  147. package/dist/keycloak-upstream/base/login/frontchannel-logout.ftl +30 -0
  148. package/dist/keycloak-upstream/base/login/idp-review-user-profile.ftl +23 -0
  149. package/dist/keycloak-upstream/base/login/info.ftl +24 -0
  150. package/dist/keycloak-upstream/base/login/link-idp-action.ftl +15 -0
  151. package/dist/keycloak-upstream/base/login/login-config-totp.ftl +115 -0
  152. package/dist/keycloak-upstream/base/login/login-idp-link-confirm-override.ftl +12 -0
  153. package/dist/keycloak-upstream/base/login/login-idp-link-confirm.ftl +15 -0
  154. package/dist/keycloak-upstream/base/login/login-idp-link-email.ftl +16 -0
  155. package/dist/keycloak-upstream/base/login/login-oauth-grant.ftl +68 -0
  156. package/dist/keycloak-upstream/base/login/login-oauth2-device-verify-user-code.ftl +31 -0
  157. package/dist/keycloak-upstream/base/login/login-otp.ftl +59 -0
  158. package/dist/keycloak-upstream/base/login/login-page-expired.ftl +11 -0
  159. package/dist/keycloak-upstream/base/login/login-passkeys-conditional-authenticate.ftl +147 -0
  160. package/dist/keycloak-upstream/base/login/login-password.ftl +52 -0
  161. package/dist/keycloak-upstream/base/login/login-recovery-authn-code-config.ftl +186 -0
  162. package/dist/keycloak-upstream/base/login/login-recovery-authn-code-input.ftl +46 -0
  163. package/dist/keycloak-upstream/base/login/login-reset-otp.ftl +33 -0
  164. package/dist/keycloak-upstream/base/login/login-reset-password.ftl +39 -0
  165. package/dist/keycloak-upstream/base/login/login-update-password.ftl +77 -0
  166. package/dist/keycloak-upstream/base/login/login-update-profile.ftl +28 -0
  167. package/dist/keycloak-upstream/base/login/login-username.ftl +92 -0
  168. package/dist/keycloak-upstream/base/login/login-verify-email.ftl +36 -0
  169. package/dist/keycloak-upstream/base/login/login-x509-info.ftl +55 -0
  170. package/dist/keycloak-upstream/base/login/login.ftl +120 -0
  171. package/dist/keycloak-upstream/base/login/logout-confirm.ftl +38 -0
  172. package/dist/keycloak-upstream/base/login/passkeys.ftl +45 -0
  173. package/dist/keycloak-upstream/base/login/password-commons.ftl +12 -0
  174. package/dist/keycloak-upstream/base/login/register-commons.ftl +27 -0
  175. package/dist/keycloak-upstream/base/login/register.ftl +112 -0
  176. package/dist/keycloak-upstream/base/login/saml-post-form.ftl +25 -0
  177. package/dist/keycloak-upstream/base/login/select-authenticator.ftl +36 -0
  178. package/dist/keycloak-upstream/base/login/select-organization.ftl +23 -0
  179. package/dist/keycloak-upstream/base/login/template.ftl +204 -0
  180. package/dist/keycloak-upstream/base/login/terms.ftl +15 -0
  181. package/dist/keycloak-upstream/base/login/theme.properties +1 -0
  182. package/dist/keycloak-upstream/base/login/update-email.ftl +30 -0
  183. package/dist/keycloak-upstream/base/login/user-profile-commons.ftl +210 -0
  184. package/dist/keycloak-upstream/base/login/webauthn-authenticate.ftl +104 -0
  185. package/dist/keycloak-upstream/base/login/webauthn-error.ftl +36 -0
  186. package/dist/keycloak-upstream/base/login/webauthn-register.ftl +66 -0
  187. package/dist/keycloak-upstream/base/messages/messages_en.properties +563 -0
  188. package/dist/keycloak-upstream/base/theme-properties.json +1 -0
  189. package/dist/keycloak-upstream/v2/login/buttons.ftl +24 -0
  190. package/dist/keycloak-upstream/v2/login/code.ftl +96 -0
  191. package/dist/keycloak-upstream/v2/login/delete-account-confirm.ftl +40 -0
  192. package/dist/keycloak-upstream/v2/login/delete-credential.ftl +21 -0
  193. package/dist/keycloak-upstream/v2/login/field.ftl +162 -0
  194. package/dist/keycloak-upstream/v2/login/footer.ftl +3 -0
  195. package/dist/keycloak-upstream/v2/login/link-idp-action.ftl +21 -0
  196. package/dist/keycloak-upstream/v2/login/login-config-totp.ftl +124 -0
  197. package/dist/keycloak-upstream/v2/login/login-oauth-grant.ftl +59 -0
  198. package/dist/keycloak-upstream/v2/login/login-otp.ftl +47 -0
  199. package/dist/keycloak-upstream/v2/login/login-password.ftl +21 -0
  200. package/dist/keycloak-upstream/v2/login/login-recovery-authn-code-config.ftl +180 -0
  201. package/dist/keycloak-upstream/v2/login/login-recovery-authn-code-input.ftl +15 -0
  202. package/dist/keycloak-upstream/v2/login/login-reset-password.ftl +29 -0
  203. package/dist/keycloak-upstream/v2/login/login-update-password.ftl +32 -0
  204. package/dist/keycloak-upstream/v2/login/login-username.ftl +51 -0
  205. package/dist/keycloak-upstream/v2/login/login.ftl +56 -0
  206. package/dist/keycloak-upstream/v2/login/password-commons.ftl +8 -0
  207. package/dist/keycloak-upstream/v2/login/password-validation.ftl +53 -0
  208. package/dist/keycloak-upstream/v2/login/register-commons.ftl +27 -0
  209. package/dist/keycloak-upstream/v2/login/register.ftl +68 -0
  210. package/dist/keycloak-upstream/v2/login/select-authenticator.ftl +41 -0
  211. package/dist/keycloak-upstream/v2/login/social-providers.ftl +95 -0
  212. package/dist/keycloak-upstream/v2/login/template.ftl +266 -0
  213. package/dist/keycloak-upstream/v2/login/terms.ftl +21 -0
  214. package/dist/keycloak-upstream/v2/login/theme.properties +130 -0
  215. package/dist/keycloak-upstream/v2/login/update-email.ftl +29 -0
  216. package/dist/keycloak-upstream/v2/login/user-profile-commons.ftl +237 -0
  217. package/dist/keycloak-upstream/v2/login/webauthn-authenticate.ftl +131 -0
  218. package/dist/keycloak-upstream/v2/login/webauthn-error.ftl +35 -0
  219. package/dist/keycloak-upstream/v2/login/webauthn-register.ftl +63 -0
  220. package/dist/keycloak-upstream/v2/messages/messages_en.properties +563 -0
  221. package/dist/keycloak-upstream/v2/theme-properties.json +109 -0
  222. package/package.json +100 -0
  223. package/public/keycloak-dev-resources/img/keycloak-bg-darken.svg +1 -0
  224. package/public/keycloak-dev-resources/img/keycloak-bg.png +0 -0
  225. package/public/keycloak-dev-resources/img/keycloak-logo-text.svg +1 -0
  226. package/public/keycloak-dev-resources/themes/base/login/messages/messages_en.properties +5 -0
  227. package/public/keycloak-dev-resources/themes/base/login/mock-extension-showcase.ftl +13 -0
  228. package/public/keycloak-dev-resources/themes/base/login/resources/css/preview.css +5 -0
  229. package/public/keycloak-dev-resources/themes/base/login/resources/css/quick-start.css +16 -0
  230. package/public/keycloak-dev-resources/themes/base/login/resources/css/styles.css +2 -0
  231. package/public/keycloak-dev-resources/themes/base/login/theme.properties +143 -0
  232. package/public/keycloak-dev-resources/themes/horizontal-card/login/footer.ftl +32 -0
  233. package/public/keycloak-dev-resources/themes/horizontal-card/login/messages/messages_en.properties +6 -0
  234. package/public/keycloak-dev-resources/themes/horizontal-card/login/resources/css/preview.css +5 -0
  235. package/public/keycloak-dev-resources/themes/horizontal-card/login/resources/css/quick-start.css +31 -0
  236. package/public/keycloak-dev-resources/themes/horizontal-card/login/resources/css/styles.css +1149 -0
  237. package/public/keycloak-dev-resources/themes/horizontal-card/login/template.ftl +234 -0
  238. package/public/keycloak-dev-resources/themes/horizontal-card/login/theme.properties +142 -0
  239. package/public/keycloak-dev-resources/themes/modern-gradient/login/footer.ftl +12 -0
  240. package/public/keycloak-dev-resources/themes/modern-gradient/login/messages/messages_en.properties +6 -0
  241. package/public/keycloak-dev-resources/themes/modern-gradient/login/resources/css/preview.css +13 -0
  242. package/public/keycloak-dev-resources/themes/modern-gradient/login/resources/css/quick-start.css +39 -0
  243. package/public/keycloak-dev-resources/themes/modern-gradient/login/resources/css/styles.css +1371 -0
  244. package/public/keycloak-dev-resources/themes/modern-gradient/login/template.ftl +296 -0
  245. package/public/keycloak-dev-resources/themes/modern-gradient/login/theme.properties +142 -0
  246. package/public/keycloak-dev-resources/themes/themes.json +42 -0
  247. package/public/keycloak-dev-resources/themes/v2/login/footer.ftl +15 -0
  248. package/public/keycloak-dev-resources/themes/v2/login/messages/messages_en.properties +5 -0
  249. package/public/keycloak-dev-resources/themes/v2/login/mock-extension-showcase.ftl +13 -0
  250. package/public/keycloak-dev-resources/themes/v2/login/resources/css/preview.css +5 -0
  251. package/public/keycloak-dev-resources/themes/v2/login/resources/css/quick-start.css +16 -0
  252. package/public/keycloak-dev-resources/themes/v2/login/resources/css/styles.css +426 -0
  253. package/public/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-bg-darken.svg +1 -0
  254. package/public/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-bg.png +0 -0
  255. package/public/keycloak-dev-resources/themes/v2/login/resources/img/keycloak-logo-text.svg +1 -0
  256. package/public/keycloak-dev-resources/themes/v2/login/template.ftl +287 -0
  257. package/public/keycloak-dev-resources/themes/v2/login/theme.properties +125 -0
  258. package/public/keycloak-upstream/base/login/cli_splash.ftl +7 -0
  259. package/public/keycloak-upstream/base/login/code.ftl +19 -0
  260. package/public/keycloak-upstream/base/login/delete-account-confirm.ftl +33 -0
  261. package/public/keycloak-upstream/base/login/delete-credential.ftl +15 -0
  262. package/public/keycloak-upstream/base/login/error.ftl +16 -0
  263. package/public/keycloak-upstream/base/login/footer.ftl +3 -0
  264. package/public/keycloak-upstream/base/login/frontchannel-logout.ftl +30 -0
  265. package/public/keycloak-upstream/base/login/idp-review-user-profile.ftl +23 -0
  266. package/public/keycloak-upstream/base/login/info.ftl +24 -0
  267. package/public/keycloak-upstream/base/login/link-idp-action.ftl +15 -0
  268. package/public/keycloak-upstream/base/login/login-config-totp.ftl +115 -0
  269. package/public/keycloak-upstream/base/login/login-idp-link-confirm-override.ftl +12 -0
  270. package/public/keycloak-upstream/base/login/login-idp-link-confirm.ftl +15 -0
  271. package/public/keycloak-upstream/base/login/login-idp-link-email.ftl +16 -0
  272. package/public/keycloak-upstream/base/login/login-oauth-grant.ftl +68 -0
  273. package/public/keycloak-upstream/base/login/login-oauth2-device-verify-user-code.ftl +31 -0
  274. package/public/keycloak-upstream/base/login/login-otp.ftl +59 -0
  275. package/public/keycloak-upstream/base/login/login-page-expired.ftl +11 -0
  276. package/public/keycloak-upstream/base/login/login-passkeys-conditional-authenticate.ftl +147 -0
  277. package/public/keycloak-upstream/base/login/login-password.ftl +52 -0
  278. package/public/keycloak-upstream/base/login/login-recovery-authn-code-config.ftl +186 -0
  279. package/public/keycloak-upstream/base/login/login-recovery-authn-code-input.ftl +46 -0
  280. package/public/keycloak-upstream/base/login/login-reset-otp.ftl +33 -0
  281. package/public/keycloak-upstream/base/login/login-reset-password.ftl +39 -0
  282. package/public/keycloak-upstream/base/login/login-update-password.ftl +77 -0
  283. package/public/keycloak-upstream/base/login/login-update-profile.ftl +28 -0
  284. package/public/keycloak-upstream/base/login/login-username.ftl +92 -0
  285. package/public/keycloak-upstream/base/login/login-verify-email.ftl +36 -0
  286. package/public/keycloak-upstream/base/login/login-x509-info.ftl +55 -0
  287. package/public/keycloak-upstream/base/login/login.ftl +120 -0
  288. package/public/keycloak-upstream/base/login/logout-confirm.ftl +38 -0
  289. package/public/keycloak-upstream/base/login/passkeys.ftl +45 -0
  290. package/public/keycloak-upstream/base/login/password-commons.ftl +12 -0
  291. package/public/keycloak-upstream/base/login/register-commons.ftl +27 -0
  292. package/public/keycloak-upstream/base/login/register.ftl +112 -0
  293. package/public/keycloak-upstream/base/login/saml-post-form.ftl +25 -0
  294. package/public/keycloak-upstream/base/login/select-authenticator.ftl +36 -0
  295. package/public/keycloak-upstream/base/login/select-organization.ftl +23 -0
  296. package/public/keycloak-upstream/base/login/template.ftl +204 -0
  297. package/public/keycloak-upstream/base/login/terms.ftl +15 -0
  298. package/public/keycloak-upstream/base/login/theme.properties +1 -0
  299. package/public/keycloak-upstream/base/login/update-email.ftl +30 -0
  300. package/public/keycloak-upstream/base/login/user-profile-commons.ftl +210 -0
  301. package/public/keycloak-upstream/base/login/webauthn-authenticate.ftl +104 -0
  302. package/public/keycloak-upstream/base/login/webauthn-error.ftl +36 -0
  303. package/public/keycloak-upstream/base/login/webauthn-register.ftl +66 -0
  304. package/public/keycloak-upstream/base/messages/messages_en.properties +563 -0
  305. package/public/keycloak-upstream/base/theme-properties.json +1 -0
  306. package/public/keycloak-upstream/v2/login/buttons.ftl +24 -0
  307. package/public/keycloak-upstream/v2/login/code.ftl +96 -0
  308. package/public/keycloak-upstream/v2/login/delete-account-confirm.ftl +40 -0
  309. package/public/keycloak-upstream/v2/login/delete-credential.ftl +21 -0
  310. package/public/keycloak-upstream/v2/login/field.ftl +162 -0
  311. package/public/keycloak-upstream/v2/login/footer.ftl +3 -0
  312. package/public/keycloak-upstream/v2/login/link-idp-action.ftl +21 -0
  313. package/public/keycloak-upstream/v2/login/login-config-totp.ftl +124 -0
  314. package/public/keycloak-upstream/v2/login/login-oauth-grant.ftl +59 -0
  315. package/public/keycloak-upstream/v2/login/login-otp.ftl +47 -0
  316. package/public/keycloak-upstream/v2/login/login-password.ftl +21 -0
  317. package/public/keycloak-upstream/v2/login/login-recovery-authn-code-config.ftl +180 -0
  318. package/public/keycloak-upstream/v2/login/login-recovery-authn-code-input.ftl +15 -0
  319. package/public/keycloak-upstream/v2/login/login-reset-password.ftl +29 -0
  320. package/public/keycloak-upstream/v2/login/login-update-password.ftl +32 -0
  321. package/public/keycloak-upstream/v2/login/login-username.ftl +51 -0
  322. package/public/keycloak-upstream/v2/login/login.ftl +56 -0
  323. package/public/keycloak-upstream/v2/login/password-commons.ftl +8 -0
  324. package/public/keycloak-upstream/v2/login/password-validation.ftl +53 -0
  325. package/public/keycloak-upstream/v2/login/register-commons.ftl +27 -0
  326. package/public/keycloak-upstream/v2/login/register.ftl +68 -0
  327. package/public/keycloak-upstream/v2/login/select-authenticator.ftl +41 -0
  328. package/public/keycloak-upstream/v2/login/social-providers.ftl +95 -0
  329. package/public/keycloak-upstream/v2/login/template.ftl +266 -0
  330. package/public/keycloak-upstream/v2/login/terms.ftl +21 -0
  331. package/public/keycloak-upstream/v2/login/theme.properties +130 -0
  332. package/public/keycloak-upstream/v2/login/update-email.ftl +29 -0
  333. package/public/keycloak-upstream/v2/login/user-profile-commons.ftl +237 -0
  334. package/public/keycloak-upstream/v2/login/webauthn-authenticate.ftl +131 -0
  335. package/public/keycloak-upstream/v2/login/webauthn-error.ftl +35 -0
  336. package/public/keycloak-upstream/v2/login/webauthn-register.ftl +63 -0
  337. package/public/keycloak-upstream/v2/messages/messages_en.properties +563 -0
  338. package/public/keycloak-upstream/v2/theme-properties.json +109 -0
  339. package/tools/generate-preview.ts +320 -0
  340. package/tools/kc-context-mocks/index.ts +29 -0
  341. package/tools/kc-context-mocks/kc-page-story.ts +14 -0
  342. package/tools/kc-context-mocks/kc-page.ts +53 -0
  343. package/tools/preview-renderer/preview-renderer.jar +0 -0
@@ -0,0 +1,96 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "field.ftl" as field>
3
+ <@layout.registrationLayout; section>
4
+ <#if section = "header">
5
+ <#if code.success>
6
+ ${msg("codeSuccessTitle")}
7
+ <#else>
8
+ ${msg("codeErrorTitle", code.error)}
9
+ </#if>
10
+ <#elseif section = "form">
11
+ <div id="kc-code">
12
+ <#if code.success>
13
+ <p>${msg("copyCodeInstruction")}</p>
14
+ <@field.clipboard name="code" label="" ariaLabel=msg("codeSuccess") value=code.code />
15
+ <script type="module">
16
+ (() => {
17
+ const copyButton = document.getElementById('kc-code-copy-button');
18
+ const toggleButton = document.getElementById('kc-code-toggle');
19
+ const input = document.getElementById('kc-code');
20
+ const expandableContent = document.getElementById('kc-code-content');
21
+ const clipboardContainer = document.getElementById('kc-code-clipboard');
22
+
23
+ // Validate elements
24
+ if (!copyButton || !toggleButton || !input || !expandableContent || !clipboardContainer) {
25
+ console.error("Missing required DOM elements for code interactions.");
26
+ return;
27
+ }
28
+
29
+ // Validate Clipboard API
30
+ if (!navigator.clipboard) {
31
+ console.error("Clipboard API not supported in this browser.");
32
+ copyButton.style.display = 'none';
33
+ return;
34
+ }
35
+
36
+ // Handle copy functionality
37
+ copyButton.addEventListener('click', async() => {
38
+ const originalIcon = copyButton.innerHTML;
39
+
40
+ // Get value from expandable content
41
+ let value = expandableContent.querySelector('code')?.textContent;
42
+
43
+ try {
44
+ await navigator.clipboard.writeText(value);
45
+ updateCopyButton(true, copyButton, originalIcon);
46
+ } catch (err) {
47
+ console.error('Copy failed: ', err);
48
+ updateCopyButton(false, copyButton, originalIcon);
49
+ }
50
+ });
51
+
52
+ // Handle toggle functionality
53
+ toggleButton.addEventListener('click', () => {
54
+ const newExpanded = !(toggleButton.getAttribute('aria-expanded') === 'true');
55
+
56
+ toggleButton.setAttribute('aria-expanded', newExpanded.toString());
57
+ expandableContent.hidden = !newExpanded;
58
+
59
+ // Update icon
60
+ const icon = toggleButton.querySelector('#kc-code-toggle-icon');
61
+ if (icon) {
62
+ icon.className = newExpanded ? toggleButton.dataset.iconExpandedClass : toggleButton.dataset.iconCollapsedClass;
63
+ }
64
+
65
+ // Update clipboard container class
66
+ if (newExpanded) {
67
+ clipboardContainer.classList.add(toggleButton.dataset.classExpanded);
68
+ } else {
69
+ clipboardContainer.classList.remove(toggleButton.dataset.classExpanded);
70
+ }
71
+ });
72
+ })();
73
+
74
+ // Update copy button to show success or failure state
75
+ function updateCopyButton(success, button, originalIcon) {
76
+ button.setAttribute('aria-label', success ? button.dataset.successLabel : button.dataset.failureLabel);
77
+ const icon = button.querySelector('#kc-code-copy-icon');
78
+ if (icon) {
79
+ icon.className = success ? button.dataset.iconSuccess : button.dataset.iconFailure;
80
+ }
81
+ button.disabled = true;
82
+
83
+ // Reset button after 2 seconds
84
+ setTimeout(() => {
85
+ button.innerHTML = originalIcon;
86
+ button.setAttribute('aria-label', '${msg("code-copy-label")}');
87
+ button.disabled = false;
88
+ }, 2000);
89
+ }
90
+ </script>
91
+ <#else>
92
+ <p id="error">${code.error}</p>
93
+ </#if>
94
+ </div>
95
+ </#if>
96
+ </@layout.registrationLayout>
@@ -0,0 +1,40 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "buttons.ftl" as buttons>
3
+
4
+ <@layout.registrationLayout; section>
5
+ <!-- template: delete-account-confirm.ftl -->
6
+
7
+ <#if section = "header">
8
+ ${msg("deleteAccountConfirm")}
9
+
10
+ <#elseif section = "form">
11
+
12
+ <form action="${url.loginAction}" class="${properties.kcFormClass!}" id="kc-deleteaccount-form" method="post">
13
+
14
+ <div class="${properties.kcAlertClass!} pf-m-warning">
15
+ <div class="${properties.kcAlertIconClass!}">
16
+ <i class="${properties.kcFeedbackWarningIcon!}" aria-hidden="true"></i>
17
+ </div>
18
+ <span class="${properties.kcAlertTitleClass!}">
19
+ ${msg("irreversibleAction")}
20
+ </span>
21
+ </div>
22
+
23
+ <p>${msg("deletingImplies")}</p>
24
+ <ul class="pf-v5-c-list" role="list">
25
+ <li>${msg("loggingOutImmediately")}</li>
26
+ <li>${msg("errasingData")}</li>
27
+ </ul>
28
+
29
+ <p class="delete-account-text">${msg("finalDeletionConfirmation")}</p>
30
+
31
+ <@buttons.actionGroup>
32
+ <@buttons.button id="kc-submit" label="doConfirmDelete" class=["kcButtonPrimaryClass"]/>
33
+ <#if triggered_from_aia>
34
+ <@buttons.button id="kc-cancel" name="cancel-aia" label="doCancel" class=["kcButtonSecondaryClass"]/>
35
+ </#if>
36
+ </@buttons.actionGroup>
37
+ </form>
38
+ </#if>
39
+
40
+ </@layout.registrationLayout>
@@ -0,0 +1,21 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "buttons.ftl" as buttons>
3
+
4
+ <@layout.registrationLayout displayMessage=false; section>
5
+ <!-- template: delete-credential.ftl -->
6
+
7
+ <#if section = "header">
8
+ ${msg("deleteCredentialTitle", credentialLabel)}
9
+ <#elseif section = "form">
10
+ <div id="kc-delete-text" class="${properties.kcContentWrapperClass!}">
11
+ ${msg("deleteCredentialMessage", credentialLabel)}
12
+ </div>
13
+
14
+ <form class="${properties.kcFormClass!}" action="${url.loginAction}" method="POST">
15
+ <@buttons.actionGroup>
16
+ <@buttons.button name="accept" id="kc-accept" label="doConfirmDelete" class=["kcButtonPrimaryClass"]/>
17
+ <@buttons.button name="cancel-aia" id="kc-decline" label="doDecline" class=["kcButtonSecondaryClass"]/>
18
+ </@buttons.actionGroup>
19
+ </form>
20
+ </#if>
21
+ </@layout.registrationLayout>
@@ -0,0 +1,162 @@
1
+ <#macro group name label error="" required=false>
2
+
3
+ <div class="${properties.kcFormGroupClass}">
4
+ <div class="${properties.kcFormGroupLabelClass}">
5
+ <label for="${name}" class="${properties.kcFormLabelClass}">
6
+ <span class="${properties.kcFormLabelTextClass}">
7
+ ${label}
8
+ </span>
9
+ <#if required>
10
+ <span class="${properties.kcInputRequiredClass}" aria-hidden="true">&#42;</span>
11
+ </#if>
12
+ </label>
13
+ </div>
14
+
15
+ <#nested>
16
+
17
+ <div id="input-error-container-${name}">
18
+ <#if error?has_content>
19
+ <div class="${properties.kcFormHelperTextClass}" aria-live="polite">
20
+ <div class="${properties.kcInputHelperTextClass}">
21
+ <div class="${properties.kcInputHelperTextItemClass} ${properties.kcError}" id="input-error-${name}">
22
+ <span class="${properties.kcInputErrorMessageClass}">
23
+ ${error}
24
+ </span>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </#if>
29
+ </div>
30
+ </div>
31
+
32
+ </#macro>
33
+
34
+ <#macro errorIcon error="">
35
+ <#if error?has_content>
36
+ <span class="${properties.kcFormControlUtilClass}">
37
+ <span class="${properties.kcInputErrorIconStatusClass}">
38
+ <i class="${properties.kcInputErrorIconClass}" aria-hidden="true"></i>
39
+ </span>
40
+ </span>
41
+ </#if>
42
+ </#macro>
43
+
44
+ <#macro input name label value="" required=false autocomplete="off" fieldName=name error=messagesPerField.get(fieldName) autofocus=false>
45
+ <@group name=name label=label error=error required=required>
46
+ <span class="${properties.kcInputClass} <#if error?has_content>${properties.kcError}</#if>">
47
+ <input id="${name}" name="${name}" value="${value}" type="text" autocomplete="${autocomplete}" <#if autofocus>autofocus</#if>
48
+ <#if autocomplete == "one-time-code">inputmode="numeric"</#if>
49
+ aria-invalid="<#if error?has_content>true</#if>"/>
50
+ <@errorIcon error=error/>
51
+ </span>
52
+ </@group>
53
+ </#macro>
54
+
55
+ <#macro password name label value="" required=false forgotPassword=false fieldName=name error=messagesPerField.get(fieldName) autocomplete="off" autofocus=false>
56
+ <@group name=name label=label error=error required=required>
57
+ <div class="${properties.kcInputGroup}">
58
+ <div class="${properties.kcInputGroupItemClass} ${properties.kcFill}">
59
+ <span class="${properties.kcInputClass} <#if error?has_content>${properties.kcError}</#if>">
60
+ <input id="${name}" name="${name}" value="${value}" type="password" autocomplete="${autocomplete}" <#if autofocus>autofocus</#if>
61
+ aria-invalid="<#if error?has_content>true</#if>"/>
62
+ <@errorIcon error=error/>
63
+ </span>
64
+ </div>
65
+ <div class="${properties.kcInputGroupItemClass}">
66
+ <button class="${properties.kcFormPasswordVisibilityButtonClass}" type="button" aria-label="${msg('showPassword')}"
67
+ aria-controls="${name}" data-password-toggle
68
+ data-icon-show="${properties.kcFormPasswordVisibilityIconShow}" data-icon-hide="${properties.kcFormPasswordVisibilityIconHide}"
69
+ data-label-show="${msg('showPassword')}" data-label-hide="${msg('hidePassword')}" id="${name}-show-password">
70
+ <i class="${properties.kcFormPasswordVisibilityIconShow}" aria-hidden="true"></i>
71
+ </button>
72
+ </div>
73
+ </div>
74
+ <div class="${properties.kcFormHelperTextClass}" aria-live="polite">
75
+ <div class="${properties.kcInputHelperTextClass}">
76
+ <#-- Additional helper items -->
77
+ <#nested>
78
+ <#if forgotPassword>
79
+ <div class="${properties.kcInputHelperTextItemClass}">
80
+ <span class="${properties.kcInputHelperTextItemTextClass}">
81
+ <a href="${url.loginResetCredentialsUrl}">${msg("doForgotPassword")}</a>
82
+ </span>
83
+ </div>
84
+ </#if>
85
+ </div>
86
+ </div>
87
+
88
+ </@group>
89
+ </#macro>
90
+
91
+ <#macro clipboard name label ariaLabel=label value="" readonly=true>
92
+ <@group name=name label=label>
93
+ <div class="${properties.kcCodeClipboardCopyClass}" id="kc-${name}-clipboard">
94
+ <div class="${properties.kcCodeClipboardCopyGroupClass}">
95
+ <div class="${properties.kcInputGroup}">
96
+ <div class="${properties.kcInputGroupItemClass}">
97
+ <button
98
+ class="${properties.kcFormPasswordVisibilityButtonClass}"
99
+ type="button"
100
+ aria-label="${msg("code-clipboard-label")}"
101
+ aria-expanded="false"
102
+ aria-controls="kc-${name}-content"
103
+ data-icon-expanded-class="${properties.kcAngleDownIconClass}"
104
+ data-icon-collapsed-class="${properties.kcAngleRightIconClass}"
105
+ data-expanded-class="${properties.kcExpandedClass}"
106
+ id="kc-${name}-toggle"
107
+ >
108
+ <i id="kc-${name}-toggle-icon" class="${properties.kcAngleRightIconClass}" aria-hidden="true"></i>
109
+ </button>
110
+ </div>
111
+ <div class="${properties.kcInputGroupItemClass} ${properties.kcFill}">
112
+ <span class="${properties.kcInputClass} <#if readonly>${properties.kcFormReadOnlyClass}</#if>">
113
+ <input
114
+ id="${name}"
115
+ name="${name}"
116
+ value="${value}"
117
+ type="text"
118
+ <#if readonly>readonly</#if>
119
+ aria-label="${ariaLabel}"
120
+ />
121
+ </span>
122
+ </div>
123
+ <div class="${properties.kcInputGroupItemClass}">
124
+ <button
125
+ class="${properties.kcFormPasswordVisibilityButtonClass}"
126
+ type="button"
127
+ aria-label="${msg("code-copy-label")}"
128
+ data-icon-success="${properties.kcCheckIconClass}"
129
+ data-icon-failure="${properties.kcInputErrorIconClass}"
130
+ data-success-label="${msg("code-copy-success")}"
131
+ data-failure-label="${msg("code-copy-failure")}"
132
+ id="kc-${name}-copy-button"
133
+ >
134
+ <i id="kc-${name}-copy-icon" class="${properties.kcCopyIconClass}" aria-hidden="true"></i>
135
+ </button>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ <div class="${properties.kcCodeClipboardCopyContentClass}" id="kc-${name}-content" hidden>
140
+ <pre><code aria-label="${ariaLabel}">${value}</code></pre>
141
+ </div>
142
+ </div>
143
+ </@group>
144
+ </#macro>
145
+
146
+ <#macro checkbox name label value=false required=false>
147
+ <div class="${properties.kcCheckboxClass}">
148
+ <label for="${name}" class="${properties.kcCheckboxClass}">
149
+ <input
150
+ class="${properties.kcCheckboxInputClass}"
151
+ type="checkbox"
152
+ id="${name}"
153
+ name="${name}"
154
+ <#if value>checked</#if>
155
+ />
156
+ <span class="${properties.kcCheckboxLabelClass}">${label}</span>
157
+ <#if required>
158
+ <span class="${properties.kcCheckboxLabelRequiredClass}" aria-hidden="true">&#42;</span>
159
+ </#if>
160
+ </label>
161
+ </div>
162
+ </#macro>
@@ -0,0 +1,3 @@
1
+ <#macro content>
2
+ <#-- The footer at the bottom of the "login-box". You can override this file in your custom theme to declare a custom login footer element -->
3
+ </#macro>
@@ -0,0 +1,21 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "buttons.ftl" as buttons>
3
+
4
+ <@layout.registrationLayout displayMessage=false; section>
5
+ <!-- template: link-idp-action.ftl -->
6
+
7
+ <#if section = "header">
8
+ ${msg("linkIdpActionTitle", idpDisplayName)}
9
+ <#elseif section = "form">
10
+ <div id="kc-link-text" class="${properties.kcContentWrapperClass!}">
11
+ ${msg("linkIdpActionMessage", idpDisplayName)}
12
+ </div>
13
+
14
+ <form class="${properties.kcFormClass!}" action="${url.loginAction}" method="POST">
15
+ <@buttons.actionGroup>
16
+ <@buttons.button name="continue" id="kc-continue" label="doContinue" class=["kcButtonPrimaryClass"]/>
17
+ <@buttons.button name="cancel-aia" id="kc-cancel" label="doCancel" class=["kcButtonSecondaryClass"]/>
18
+ </@buttons.actionGroup>
19
+ </form>
20
+ </#if>
21
+ </@layout.registrationLayout>
@@ -0,0 +1,124 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "field.ftl" as field>
3
+ <#import "password-commons.ftl" as passwordCommons>
4
+ <@layout.registrationLayout displayRequiredFields=false displayMessage=!messagesPerField.existsError('totp','userLabel'); section>
5
+ <!-- template: login-config-totp.ftl -->
6
+
7
+ <#if section = "header">
8
+ ${msg("loginTotpTitle")}
9
+ <#elseif section = "form">
10
+ <ol id="kc-totp-settings" class="pf-v5-c-list pf-v5-u-mb-md">
11
+ <li>
12
+ <p>${msg("loginTotpStep1")}</p>
13
+
14
+ <ul id="kc-totp-supported-apps">
15
+ <#list totp.supportedApplications as app>
16
+ <li>${msg(app)}</li>
17
+ </#list>
18
+ </ul>
19
+ </li>
20
+
21
+ <#if mode?? && mode = "manual">
22
+ <li>
23
+ <p>${msg("loginTotpManualStep2")}</p>
24
+ <p><span id="kc-totp-secret-key">${totp.totpSecretEncoded}</span></p>
25
+ <p><a href="${totp.qrUrl}" id="mode-barcode">${msg("loginTotpScanBarcode")}</a></p>
26
+ </li>
27
+ <li>
28
+ <p>${msg("loginTotpManualStep3")}</p>
29
+ <p>
30
+ <ul>
31
+ <li id="kc-totp-type">${msg("loginTotpType")}: ${msg("loginTotp." + totp.policy.type)}</li>
32
+ <li id="kc-totp-algorithm">${msg("loginTotpAlgorithm")}: ${totp.policy.getAlgorithmKey()}</li>
33
+ <li id="kc-totp-digits">${msg("loginTotpDigits")}: ${totp.policy.digits}</li>
34
+ <#if totp.policy.type = "totp">
35
+ <li id="kc-totp-period">${msg("loginTotpInterval")}: ${totp.policy.period}</li>
36
+ <#elseif totp.policy.type = "hotp">
37
+ <li id="kc-totp-counter">${msg("loginTotpCounter")}: ${totp.policy.initialCounter}</li>
38
+ </#if>
39
+ </ul>
40
+ </p>
41
+ </li>
42
+ <#else>
43
+ <li>
44
+ <p>${msg("loginTotpStep2")}</p>
45
+ <img id="kc-totp-secret-qr-code" src="data:image/png;base64, ${totp.totpSecretQrCode}" alt="Figure: Barcode"><br/>
46
+ <p><a href="${totp.manualUrl}" id="mode-manual">${msg("loginTotpUnableToScan")}</a></p>
47
+ </li>
48
+ </#if>
49
+ <li>
50
+ <p>${msg("loginTotpStep3")}</p>
51
+ <p>${msg("loginTotpStep3DeviceName")}</p>
52
+ </li>
53
+ </ol>
54
+
55
+ <form action="${url.loginAction}" class="${properties.kcFormClass!}" id="kc-totp-settings-form" method="post" novalidate="novalidate">
56
+ <div class="${properties.kcFormGroupClass!}">
57
+ <div class="${properties.kcLabelClass!}">
58
+ <label class="pf-v5-c-form__label" for="form-vertical-name">
59
+ <span class="pf-v5-c-form__label-text">${msg("authenticatorCode")}</span>&nbsp;<span class="pf-v5-c-form__label-required" aria-hidden="true">&#42;</span>
60
+ </label>
61
+ </div>
62
+ <div class="${properties.kcInputClass!} <#if messagesPerField.existsError('totp')>pf-m-error</#if>">
63
+ <input type="text" required id="totp" name="totp" autocomplete="one-time-code"
64
+ aria-invalid="<#if messagesPerField.existsError('totp')>true</#if>"
65
+ inputmode="numeric"
66
+ />
67
+
68
+ <@field.errorIcon error=messagesPerField.get('totp')/>
69
+ </div>
70
+ <#if messagesPerField.existsError('totp')>
71
+ <span id="input-error-otp-code" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
72
+ ${messagesPerField.get('totp')}
73
+ </span>
74
+ </#if>
75
+ <input type="hidden" id="totpSecret" name="totpSecret" value="${totp.totpSecret}" />
76
+ <#if mode??><input type="hidden" id="mode" name="mode" value="${mode}"/></#if>
77
+ </div>
78
+ <div class="${properties.kcFormGroupClass!}">
79
+ <div class="${properties.kcLabelClass!}">
80
+ <label class="pf-v5-c-form__label" for="form-vertical-name">
81
+ <span class="pf-v5-c-form__label-text">${msg("loginTotpDeviceName")}</span><#if totp.otpCredentials?size gte 1>&nbsp;<span class="pf-v5-c-form__label-required" aria-hidden="true">&#42;</span></#if>
82
+ </label>
83
+ </div>
84
+
85
+ <div class="${properties.kcInputClass!} <#if messagesPerField.existsError('userLabel')>pf-m-error</#if>">
86
+ <input type="text" id="userLabel" name="userLabel" autocomplete="off"
87
+ aria-invalid="<#if messagesPerField.existsError('userLabel')>true</#if>"
88
+ />
89
+
90
+ <@field.errorIcon error=messagesPerField.get('userLabel')/>
91
+ </div>
92
+ <#if messagesPerField.existsError('userLabel')>
93
+ <span id="input-error-otp-label" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
94
+ ${messagesPerField.get('userLabel')}
95
+ </span>
96
+ </#if>
97
+ </div>
98
+
99
+ <div class="${properties.kcFormGroupClass!}">
100
+ <@passwordCommons.logoutOtherSessions/>
101
+ </div>
102
+
103
+ <div class="pf-v5-c-form__group pf-m-action">
104
+ <div class="pf-v5-c-form__actions">
105
+ <#if isAppInitiatedAction??>
106
+ <input type="submit"
107
+ class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}"
108
+ id="saveTOTPBtn" value="${msg("doSubmit")}"
109
+ />
110
+ <button type="submit"
111
+ class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!} ${properties.kcButtonLargeClass!}"
112
+ id="cancelTOTPBtn" name="cancel-aia" value="true">${msg("doCancel")}
113
+ </button>
114
+ <#else>
115
+ <input type="submit"
116
+ class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}"
117
+ id="saveTOTPBtn" value="${msg("doSubmit")}"
118
+ />
119
+ </#if>
120
+ </div>
121
+ </div>
122
+ </form>
123
+ </#if>
124
+ </@layout.registrationLayout>
@@ -0,0 +1,59 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "buttons.ftl" as buttons>
3
+ <@layout.registrationLayout bodyClass="oauth"; section>
4
+ <#if section = "header">
5
+ <#if client.attributes.logoUri??>
6
+ <img src="${client.attributes.logoUri}"/>
7
+ </#if>
8
+ <p>
9
+ <#if client.name?has_content>
10
+ ${msg("oauthGrantTitle",advancedMsg(client.name))}
11
+ <#else>
12
+ ${msg("oauthGrantTitle",client.clientId)}
13
+ </#if>
14
+ </p>
15
+ <#elseif section = "form">
16
+ <div id="kc-oauth" class="content-area">
17
+ <h3>${msg("oauthGrantRequest")}</h3>
18
+ <ul class="${properties.kcListClass!}">
19
+ <#if oauth.clientScopesRequested??>
20
+ <#list oauth.clientScopesRequested as clientScope>
21
+ <li>
22
+ <span><#if !clientScope.dynamicScopeParameter??>
23
+ ${advancedMsg(clientScope.consentScreenText)}
24
+ <#else>
25
+ ${advancedMsg(clientScope.consentScreenText)}: <b>${clientScope.dynamicScopeParameter}</b>
26
+ </#if>
27
+ </span>
28
+ </li>
29
+ </#list>
30
+ </#if>
31
+ </ul>
32
+ <#if client.attributes.policyUri?? || client.attributes.tosUri??>
33
+ <h3>
34
+ <#if client.name?has_content>
35
+ ${msg("oauthGrantInformation",advancedMsg(client.name))}
36
+ <#else>
37
+ ${msg("oauthGrantInformation",client.clientId)}
38
+ </#if>
39
+ <#if client.attributes.tosUri??>
40
+ ${msg("oauthGrantReview")}
41
+ <a href="${client.attributes.tosUri}" target="_blank">${msg("oauthGrantTos")}</a>
42
+ </#if>
43
+ <#if client.attributes.policyUri??>
44
+ ${msg("oauthGrantReview")}
45
+ <a href="${client.attributes.policyUri}" target="_blank">${msg("oauthGrantPolicy")}</a>
46
+ </#if>
47
+ </h3>
48
+ </#if>
49
+
50
+ <form class="${properties.kcFormClass} ${properties.kcMarginTopClass!}" action="${url.oauthAction}" method="POST">
51
+ <input type="hidden" name="code" value="${oauth.code}">
52
+ <@buttons.actionGroup>
53
+ <@buttons.button id="kc-login" name="accept" label="doYes"/>
54
+ <@buttons.button id="kc-cancel" name="cancel" label="doNo" class=["kcButtonSecondaryClass"]/>
55
+ </@buttons.actionGroup>
56
+ </form>
57
+ </div>
58
+ </#if>
59
+ </@layout.registrationLayout>
@@ -0,0 +1,47 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "field.ftl" as field>
3
+ <#import "buttons.ftl" as buttons>
4
+ <@layout.registrationLayout displayMessage=!messagesPerField.existsError('totp'); section>
5
+ <!-- template: login-otp.ftl -->
6
+
7
+ <#if section="header">
8
+ ${msg("doLogIn")}
9
+ <#elseif section="form">
10
+ <form id="kc-otp-login-form" class="${properties.kcFormClass!}" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
11
+ <input id="selectedCredentialId" type="hidden" name="selectedCredentialId" value="${otpLogin.selectedCredentialId!''}">
12
+ <#if otpLogin.userOtpCredentials?size gt 1>
13
+ <div class="${properties.kcFormGroupClass!}">
14
+ <div class="${properties.kcInputWrapperClass!}">
15
+ <#list otpLogin.userOtpCredentials as otpCredential>
16
+ <div id="kc-otp-credential-${otpCredential?index}" class="${properties.kcLoginOTPListClass!}"
17
+ onclick="toggleOTP(${otpCredential?index}, '${otpCredential.id}')">
18
+ <span class="${properties.kcLoginOTPListItemHeaderClass!}">
19
+ <span class="${properties.kcLoginOTPListItemIconBodyClass!}">
20
+ <i class="${properties.kcLoginOTPListItemIconClass!}" aria-hidden="true"></i>
21
+ </span>
22
+ <span class="${properties.kcLoginOTPListItemTitleClass!}">${otpCredential.userLabel}</span>
23
+ </span>
24
+ </div>
25
+ </#list>
26
+ </div>
27
+ </div>
28
+ </#if>
29
+
30
+ <@field.input name="otp" label=msg("loginOtpOneTime") autocomplete="one-time-code" fieldName="totp" autofocus=true />
31
+
32
+ <@buttons.loginButton />
33
+ </form>
34
+ <script>
35
+ <#outputformat "JavaScript">
36
+ function toggleOTP(index, value) {
37
+ // select the clicked OTP credential
38
+ document.getElementById("selectedCredentialId").value = value;
39
+ // remove selected class from all OTP credentials
40
+ Array.from(document.getElementsByClassName(${properties.kcLoginOTPListSelectedClass!?c})).map(i => i.classList.remove(${properties.kcLoginOTPListSelectedClass!?c}));
41
+ // add selected class to the clicked OTP credential
42
+ document.getElementById("kc-otp-credential-" + index).classList.add(${properties.kcLoginOTPListSelectedClass!?c});
43
+ }
44
+ </#outputformat>
45
+ </script>
46
+ </#if>
47
+ </@layout.registrationLayout>
@@ -0,0 +1,21 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "field.ftl" as field>
3
+ <#import "buttons.ftl" as buttons>
4
+ <#import "passkeys.ftl" as passkeys>
5
+ <@layout.registrationLayout displayMessage=!messagesPerField.existsError('password'); section>
6
+ <!-- template: login-password.ftl -->
7
+ <#if section = "header">
8
+ ${msg("doLogIn")}
9
+ <#elseif section = "form">
10
+ <div id="kc-form">
11
+ <div id="kc-form-wrapper">
12
+ <form id="kc-form-login" class="${properties.kcFormClass!}" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
13
+ <@field.password name="password" label=msg("password") forgotPassword=realm.resetPasswordAllowed autofocus=true autocomplete="current-password" />
14
+ <@buttons.loginButton />
15
+ </form>
16
+ </div>
17
+ </div>
18
+ <@passkeys.conditionalUIData />
19
+ </#if>
20
+
21
+ </@layout.registrationLayout>