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,204 @@
1
+ <#import "footer.ftl" as loginFooter>
2
+ <#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false>
3
+ <!DOCTYPE html>
4
+ <html class="${properties.kcHtmlClass!}" lang="${lang}"<#if realm.internationalizationEnabled> dir="${(locale.rtl)?then('rtl','ltr')}"</#if>>
5
+
6
+ <head>
7
+ <meta charset="utf-8">
8
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
9
+
10
+ <#if properties.meta?has_content>
11
+ <#list properties.meta?split(' ') as meta>
12
+ <meta name="${meta?split('==')[0]}" content="${meta?split('==')[1]}"/>
13
+ </#list>
14
+ </#if>
15
+ <title>${msg("loginTitle",(realm.displayName!''))}</title>
16
+ <link rel="icon" href="${url.resourcesPath}/img/favicon.ico" />
17
+ <#if properties.stylesCommon?has_content>
18
+ <#list properties.stylesCommon?split(' ') as style>
19
+ <link href="${url.resourcesCommonPath}/${style}" rel="stylesheet" />
20
+ </#list>
21
+ </#if>
22
+ <#if properties.styles?has_content>
23
+ <#list properties.styles?split(' ') as style>
24
+ <link href="${url.resourcesPath}/${style}" rel="stylesheet" />
25
+ </#list>
26
+ </#if>
27
+ <#if properties.scripts?has_content>
28
+ <#list properties.scripts?split(' ') as script>
29
+ <script src="${url.resourcesPath}/${script}" type="text/javascript"></script>
30
+ </#list>
31
+ </#if>
32
+ <script type="importmap">
33
+ {
34
+ "imports": {
35
+ "rfc4648": "${url.resourcesCommonPath}/vendor/rfc4648/rfc4648.js"
36
+ }
37
+ }
38
+ </script>
39
+ <script src="${url.resourcesPath}/js/menu-button-links.js" type="module"></script>
40
+ <#if scripts??>
41
+ <#list scripts as script>
42
+ <script src="${script}" type="text/javascript"></script>
43
+ </#list>
44
+ </#if>
45
+ <script type="module">
46
+ import { startSessionPolling } from "${url.resourcesPath}/js/authChecker.js";
47
+
48
+ startSessionPolling(
49
+ "${url.ssoLoginInOtherTabsUrl?no_esc}"
50
+ );
51
+ </script>
52
+ <script type="module">
53
+ document.addEventListener("click", (event) => {
54
+ const link = event.target.closest("a[data-once-link]");
55
+
56
+ if (!link) {
57
+ return;
58
+ }
59
+
60
+ if (link.getAttribute("aria-disabled") === "true") {
61
+ event.preventDefault();
62
+ return;
63
+ }
64
+
65
+ const { disabledClass } = link.dataset;
66
+
67
+ if (disabledClass) {
68
+ link.classList.add(...disabledClass.trim().split(/\s+/));
69
+ }
70
+
71
+ link.setAttribute("role", "link");
72
+ link.setAttribute("aria-disabled", "true");
73
+ });
74
+ </script>
75
+ <#if authenticationSession??>
76
+ <script type="module">
77
+ import { checkAuthSession } from "${url.resourcesPath}/js/authChecker.js";
78
+
79
+ checkAuthSession(
80
+ "${authenticationSession.authSessionIdHash}"
81
+ );
82
+ </script>
83
+ </#if>
84
+ </head>
85
+
86
+ <body class="${properties.kcBodyClass!}" data-page-id="login-${pageId}">
87
+ <div class="${properties.kcLoginClass!}">
88
+ <div id="kc-header" class="${properties.kcHeaderClass!}">
89
+ <div id="kc-header-wrapper"
90
+ class="${properties.kcHeaderWrapperClass!}">${kcSanitize(msg("loginTitleHtml",(realm.displayNameHtml!'')))?no_esc}</div>
91
+ </div>
92
+ <div class="${properties.kcFormCardClass!}">
93
+ <header class="${properties.kcFormHeaderClass!}">
94
+ <#if realm.internationalizationEnabled && locale.supported?size gt 1>
95
+ <div class="${properties.kcLocaleMainClass!}" id="kc-locale">
96
+ <div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}">
97
+ <div id="kc-locale-dropdown" class="menu-button-links ${properties.kcLocaleDropDownClass!}">
98
+ <button tabindex="1" id="kc-current-locale-link" aria-label="${msg("languages")}" aria-haspopup="true" aria-expanded="false" aria-controls="language-switch1">${locale.current}</button>
99
+ <ul role="menu" tabindex="-1" aria-labelledby="kc-current-locale-link" aria-activedescendant="" id="language-switch1" class="${properties.kcLocaleListClass!}">
100
+ <#assign i = 1>
101
+ <#list locale.supported as l>
102
+ <li class="${properties.kcLocaleListItemClass!}" role="none">
103
+ <a role="menuitem" id="language-${i}" class="${properties.kcLocaleItemClass!}" href="${l.url}">${l.label}</a>
104
+ </li>
105
+ <#assign i++>
106
+ </#list>
107
+ </ul>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </#if>
112
+ <#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())>
113
+ <#if displayRequiredFields>
114
+ <div class="${properties.kcContentWrapperClass!}">
115
+ <div class="${properties.kcLabelWrapperClass!} subtitle">
116
+ <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
117
+ </div>
118
+ <div class="col-md-10">
119
+ <h1 id="kc-page-title"><#nested "header"></h1>
120
+ </div>
121
+ </div>
122
+ <#else>
123
+ <h1 id="kc-page-title"><#nested "header"></h1>
124
+ </#if>
125
+ <#else>
126
+ <#if displayRequiredFields>
127
+ <div class="${properties.kcContentWrapperClass!}">
128
+ <div class="${properties.kcLabelWrapperClass!} subtitle">
129
+ <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
130
+ </div>
131
+ <div class="col-md-10">
132
+ <#nested "show-username">
133
+ <div id="kc-username" class="${properties.kcFormGroupClass!}">
134
+ <label id="kc-attempted-username">${auth.attemptedUsername}</label>
135
+ <a id="reset-login" href="${url.loginRestartFlowUrl}" aria-label="${msg("restartLoginTooltip")}">
136
+ <div class="kc-login-tooltip">
137
+ <i class="${properties.kcResetFlowIcon!}"></i>
138
+ <span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
139
+ </div>
140
+ </a>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ <#else>
145
+ <#nested "show-username">
146
+ <div id="kc-username" class="${properties.kcFormGroupClass!}">
147
+ <label id="kc-attempted-username">${auth.attemptedUsername}</label>
148
+ <a id="reset-login" href="${url.loginRestartFlowUrl}" aria-label="${msg("restartLoginTooltip")}">
149
+ <div class="kc-login-tooltip">
150
+ <i class="${properties.kcResetFlowIcon!}"></i>
151
+ <span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
152
+ </div>
153
+ </a>
154
+ </div>
155
+ </#if>
156
+ </#if>
157
+ </header>
158
+ <div id="kc-content">
159
+ <div id="kc-content-wrapper">
160
+
161
+ <#-- App-initiated actions should not see warning messages about the need to complete the action -->
162
+ <#-- during login. -->
163
+ <#if displayMessage && message?has_content && (message.type != 'warning' || !isAppInitiatedAction??)>
164
+ <div class="alert-${message.type} ${properties.kcAlertClass!} pf-m-<#if message.type = 'error'>danger<#else>${message.type}</#if>">
165
+ <div class="pf-c-alert__icon">
166
+ <#if message.type = 'success'><span class="${properties.kcFeedbackSuccessIcon!}"></span></#if>
167
+ <#if message.type = 'warning'><span class="${properties.kcFeedbackWarningIcon!}"></span></#if>
168
+ <#if message.type = 'error'><span class="${properties.kcFeedbackErrorIcon!}"></span></#if>
169
+ <#if message.type = 'info'><span class="${properties.kcFeedbackInfoIcon!}"></span></#if>
170
+ </div>
171
+ <span class="${properties.kcAlertTitleClass!}">${kcSanitize(message.summary)?no_esc}</span>
172
+ </div>
173
+ </#if>
174
+
175
+ <#nested "form">
176
+
177
+ <#if auth?has_content && auth.showTryAnotherWayLink()>
178
+ <form id="kc-select-try-another-way-form" action="${url.loginAction}" method="post">
179
+ <div class="${properties.kcFormGroupClass!}">
180
+ <input type="hidden" name="tryAnotherWay" value="on"/>
181
+ <a href="#" id="try-another-way"
182
+ onclick="document.forms['kc-select-try-another-way-form'].requestSubmit();return false;">${msg("doTryAnotherWay")}</a>
183
+ </div>
184
+ </form>
185
+ </#if>
186
+
187
+ <#nested "socialProviders">
188
+
189
+ <#if displayInfo>
190
+ <div id="kc-info" class="${properties.kcSignUpClass!}">
191
+ <div id="kc-info-wrapper" class="${properties.kcInfoAreaWrapperClass!}">
192
+ <#nested "info">
193
+ </div>
194
+ </div>
195
+ </#if>
196
+ </div>
197
+ </div>
198
+
199
+ <@loginFooter.content/>
200
+ </div>
201
+ </div>
202
+ </body>
203
+ </html>
204
+ </#macro>
@@ -0,0 +1,15 @@
1
+ <#import "template.ftl" as layout>
2
+ <@layout.registrationLayout displayMessage=false; section>
3
+ <#if section = "header">
4
+ ${msg("termsTitle")}
5
+ <#elseif section = "form">
6
+ <div id="kc-terms-text">
7
+ ${kcSanitize(msg("termsText"))?no_esc}
8
+ </div>
9
+ <form class="form-actions" action="${url.loginAction}" method="POST">
10
+ <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}" name="accept" id="kc-accept" type="submit" value="${msg("doAccept")}"/>
11
+ <input class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!}" name="cancel" id="kc-decline" type="submit" value="${msg("doDecline")}"/>
12
+ </form>
13
+ <div class="clearfix"></div>
14
+ </#if>
15
+ </@layout.registrationLayout>
@@ -0,0 +1 @@
1
+ # generated fallback for themes without theme.properties
@@ -0,0 +1,30 @@
1
+ <#import "template.ftl" as layout>
2
+ <#import "password-commons.ftl" as passwordCommons>
3
+ <#import "user-profile-commons.ftl" as userProfileCommons>
4
+ <@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section>
5
+ <#if section = "header">
6
+ ${msg("updateEmailTitle")}
7
+ <#elseif section = "form">
8
+ <form id="kc-update-email-form" class="${properties.kcFormClass!}" action="${url.loginAction}" method="post">
9
+ <@userProfileCommons.userProfileFormFields/>
10
+
11
+ <div class="${properties.kcFormGroupClass!}">
12
+ <div id="kc-form-options" class="${properties.kcFormOptionsClass!}">
13
+ <div class="${properties.kcFormOptionsWrapperClass!}">
14
+ </div>
15
+ </div>
16
+
17
+ <@passwordCommons.logoutOtherSessions/>
18
+
19
+ <div id="kc-form-buttons" class="${properties.kcFormButtonsClass!}">
20
+ <#if isAppInitiatedAction??>
21
+ <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doSubmit")}" />
22
+ <button class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!}" type="submit" name="cancel-aia" value="true">${msg("doCancel")}</button>
23
+ <#else>
24
+ <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doSubmit")}" />
25
+ </#if>
26
+ </div>
27
+ </div>
28
+ </form>
29
+ </#if>
30
+ </@layout.registrationLayout>
@@ -0,0 +1,210 @@
1
+ <#macro userProfileFormFields>
2
+ <#assign currentGroup="">
3
+
4
+ <#list profile.attributes as attribute>
5
+
6
+ <#if attribute.name=='locale' && realm.internationalizationEnabled && locale.currentLanguageTag?has_content>
7
+ <input type="hidden" id="${attribute.name}" name="${attribute.name}" value="${locale.currentLanguageTag}"/>
8
+ <#else>
9
+
10
+ <#assign group = (attribute.group)!"">
11
+ <#if group != currentGroup>
12
+ <#assign currentGroup=group>
13
+ <#if currentGroup != "">
14
+ <div class="${properties.kcFormGroupClass!}"
15
+ <#list group.html5DataAnnotations as key, value>
16
+ data-${key}="${value}"
17
+ </#list>
18
+ >
19
+
20
+ <#assign groupDisplayHeader=group.displayHeader!"">
21
+ <#if groupDisplayHeader != "">
22
+ <#assign groupHeaderText=advancedMsg(groupDisplayHeader)!group>
23
+ <#else>
24
+ <#assign groupHeaderText=group.name!"">
25
+ </#if>
26
+ <div class="${properties.kcContentWrapperClass!}">
27
+ <label id="header-${attribute.group.name}" class="${kcFormGroupHeader!}">${groupHeaderText}</label>
28
+ </div>
29
+
30
+ <#assign groupDisplayDescription=group.displayDescription!"">
31
+ <#if groupDisplayDescription != "">
32
+ <#assign groupDescriptionText=advancedMsg(groupDisplayDescription)!"">
33
+ <div class="${properties.kcLabelWrapperClass!}">
34
+ <label id="description-${group.name}" class="${properties.kcLabelClass!}">${groupDescriptionText}</label>
35
+ </div>
36
+ </#if>
37
+ </div>
38
+ </#if>
39
+ </#if>
40
+
41
+ <#nested "beforeField" attribute>
42
+ <div class="${properties.kcFormGroupClass!}">
43
+ <div class="${properties.kcLabelWrapperClass!}">
44
+ <label for="${attribute.name}" class="${properties.kcLabelClass!}">${advancedMsg(attribute.displayName!'')}</label>
45
+ <#if attribute.required>*</#if>
46
+ </div>
47
+ <div class="${properties.kcInputWrapperClass!}">
48
+ <#if attribute.annotations.inputHelperTextBefore??>
49
+ <div class="${properties.kcInputHelperTextBeforeClass!}" id="form-help-text-before-${attribute.name}" aria-live="polite">${kcSanitize(advancedMsg(attribute.annotations.inputHelperTextBefore))?no_esc}</div>
50
+ </#if>
51
+ <@inputFieldByType attribute=attribute/>
52
+ <#if messagesPerField.existsError('${attribute.name}')>
53
+ <span id="input-error-${attribute.name}" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
54
+ ${kcSanitize(messagesPerField.get('${attribute.name}'))?no_esc}
55
+ </span>
56
+ </#if>
57
+ <#if attribute.annotations.inputHelperTextAfter??>
58
+ <div class="${properties.kcInputHelperTextAfterClass!}" id="form-help-text-after-${attribute.name}" aria-live="polite">${kcSanitize(advancedMsg(attribute.annotations.inputHelperTextAfter))?no_esc}</div>
59
+ </#if>
60
+ </div>
61
+ </div>
62
+ <#nested "afterField" attribute>
63
+
64
+ </#if>
65
+ </#list>
66
+
67
+ <#list profile.html5DataAnnotations?keys as key>
68
+ <script type="module" src="${url.resourcesPath}/js/${key}.js"></script>
69
+ </#list>
70
+ </#macro>
71
+
72
+ <#macro inputFieldByType attribute>
73
+ <#switch attribute.annotations.inputType!''>
74
+ <#case 'textarea'>
75
+ <@textareaTag attribute=attribute/>
76
+ <#break>
77
+ <#case 'select'>
78
+ <#case 'multiselect'>
79
+ <@selectTag attribute=attribute/>
80
+ <#break>
81
+ <#case 'select-radiobuttons'>
82
+ <#case 'multiselect-checkboxes'>
83
+ <@inputTagSelects attribute=attribute/>
84
+ <#break>
85
+ <#default>
86
+ <#if attribute.multivalued && attribute.values?has_content>
87
+ <#list attribute.values as value>
88
+ <@inputTag attribute=attribute value=value!''/>
89
+ </#list>
90
+ <#else>
91
+ <@inputTag attribute=attribute value=attribute.value!''/>
92
+ </#if>
93
+ </#switch>
94
+ </#macro>
95
+
96
+ <#macro inputTag attribute value>
97
+ <input type="<@inputTagType attribute=attribute/>" id="${attribute.name}" name="${attribute.name}" value="${(value!'')}" class="${properties.kcInputClass!}"
98
+ aria-invalid="<#if messagesPerField.existsError('${attribute.name}')>true</#if>"
99
+ <#if attribute.readOnly>disabled</#if>
100
+ <#if attribute.autocomplete??>autocomplete="${attribute.autocomplete}"</#if>
101
+ <#if attribute.annotations.inputTypePlaceholder??>placeholder="${advancedMsg(attribute.annotations.inputTypePlaceholder)}"</#if>
102
+ <#if attribute.annotations.inputTypePattern??>pattern="${attribute.annotations.inputTypePattern}"</#if>
103
+ <#if attribute.annotations.inputTypeSize??>size="${attribute.annotations.inputTypeSize}"</#if>
104
+ <#if attribute.annotations.inputTypeMaxlength??>maxlength="${attribute.annotations.inputTypeMaxlength}"</#if>
105
+ <#if attribute.annotations.inputTypeMinlength??>minlength="${attribute.annotations.inputTypeMinlength}"</#if>
106
+ <#if attribute.annotations.inputTypeMax??>max="${attribute.annotations.inputTypeMax}"</#if>
107
+ <#if attribute.annotations.inputTypeMin??>min="${attribute.annotations.inputTypeMin}"</#if>
108
+ <#if attribute.annotations.inputTypeStep??>step="${attribute.annotations.inputTypeStep}"</#if>
109
+ <#list attribute.html5DataAnnotations as key, value>
110
+ data-${key}="${value}"
111
+ </#list>
112
+ />
113
+ </#macro>
114
+
115
+ <#macro inputTagType attribute>
116
+ <#compress>
117
+ <#if attribute.annotations.inputType??>
118
+ <#if attribute.annotations.inputType?starts_with("html5-")>
119
+ ${attribute.annotations.inputType[6..]}
120
+ <#else>
121
+ ${attribute.annotations.inputType}
122
+ </#if>
123
+ <#else>
124
+ text
125
+ </#if>
126
+ </#compress>
127
+ </#macro>
128
+
129
+ <#macro textareaTag attribute>
130
+ <textarea id="${attribute.name}" name="${attribute.name}" class="${properties.kcInputClass!}"
131
+ aria-invalid="<#if messagesPerField.existsError('${attribute.name}')>true</#if>"
132
+ <#if attribute.readOnly>disabled</#if>
133
+ <#if attribute.annotations.inputTypeCols??>cols="${attribute.annotations.inputTypeCols}"</#if>
134
+ <#if attribute.annotations.inputTypeRows??>rows="${attribute.annotations.inputTypeRows}"</#if>
135
+ <#if attribute.annotations.inputTypeMaxlength??>maxlength="${attribute.annotations.inputTypeMaxlength}"</#if>
136
+ >${(attribute.value!'')}</textarea>
137
+ </#macro>
138
+
139
+ <#macro selectTag attribute>
140
+ <select id="${attribute.name}" name="${attribute.name}" class="${properties.kcInputClass!}"
141
+ aria-invalid="<#if messagesPerField.existsError('${attribute.name}')>true</#if>"
142
+ <#if attribute.readOnly>disabled</#if>
143
+ <#if attribute.annotations.inputType=='multiselect'>multiple</#if>
144
+ <#if attribute.annotations.inputTypeSize??>size="${attribute.annotations.inputTypeSize}"</#if>
145
+ >
146
+ <#if attribute.annotations.inputType=='select'>
147
+ <option value=""></option>
148
+ </#if>
149
+
150
+ <#if attribute.annotations.inputOptionsFromValidation?? && attribute.validators[attribute.annotations.inputOptionsFromValidation]?? && attribute.validators[attribute.annotations.inputOptionsFromValidation].options??>
151
+ <#assign options=attribute.validators[attribute.annotations.inputOptionsFromValidation].options>
152
+ <#elseif attribute.validators.options?? && attribute.validators.options.options??>
153
+ <#assign options=attribute.validators.options.options>
154
+ <#else>
155
+ <#assign options=[]>
156
+ </#if>
157
+
158
+ <#list options as option>
159
+ <option value="${option}" <#if attribute.values?seq_contains(option)>selected</#if>><@selectOptionLabelText attribute=attribute option=option/></option>
160
+ </#list>
161
+
162
+ </select>
163
+ </#macro>
164
+
165
+ <#macro inputTagSelects attribute>
166
+ <#if attribute.annotations.inputType=='select-radiobuttons'>
167
+ <#assign inputType='radio'>
168
+ <#assign classDiv=properties.kcInputClassRadio!>
169
+ <#assign classInput=properties.kcInputClassRadioInput!>
170
+ <#assign classLabel=properties.kcInputClassRadioLabel!>
171
+ <#else>
172
+ <#assign inputType='checkbox'>
173
+ <#assign classDiv=properties.kcInputClassCheckbox!>
174
+ <#assign classInput=properties.kcInputClassCheckboxInput!>
175
+ <#assign classLabel=properties.kcInputClassCheckboxLabel!>
176
+ </#if>
177
+
178
+ <#if attribute.annotations.inputOptionsFromValidation?? && attribute.validators[attribute.annotations.inputOptionsFromValidation]?? && attribute.validators[attribute.annotations.inputOptionsFromValidation].options??>
179
+ <#assign options=attribute.validators[attribute.annotations.inputOptionsFromValidation].options>
180
+ <#elseif attribute.validators.options?? && attribute.validators.options.options??>
181
+ <#assign options=attribute.validators.options.options>
182
+ <#else>
183
+ <#assign options=[]>
184
+ </#if>
185
+
186
+ <#list options as option>
187
+ <div class="${classDiv}">
188
+ <input type="${inputType}" id="${attribute.name}-${option}" name="${attribute.name}" value="${option}" class="${classInput}"
189
+ aria-invalid="<#if messagesPerField.existsError('${attribute.name}')>true</#if>"
190
+ <#if attribute.readOnly>disabled</#if>
191
+ <#if attribute.values?seq_contains(option)>checked</#if>
192
+ />
193
+ <label for="${attribute.name}-${option}" class="${classLabel}<#if attribute.readOnly> ${properties.kcInputClassRadioCheckboxLabelDisabled!}</#if>"><@selectOptionLabelText attribute=attribute option=option/></label>
194
+ </div>
195
+ </#list>
196
+ </#macro>
197
+
198
+ <#macro selectOptionLabelText attribute option>
199
+ <#compress>
200
+ <#if attribute.annotations.inputOptionLabels??>
201
+ ${advancedMsg(attribute.annotations.inputOptionLabels[option]!option)}
202
+ <#else>
203
+ <#if attribute.annotations.inputOptionLabelsI18nPrefix??>
204
+ ${msg(attribute.annotations.inputOptionLabelsI18nPrefix + '.' + option)}
205
+ <#else>
206
+ ${option}
207
+ </#if>
208
+ </#if>
209
+ </#compress>
210
+ </#macro>
@@ -0,0 +1,104 @@
1
+ <#import "template.ftl" as layout>
2
+ <@layout.registrationLayout displayInfo=(realm.registrationAllowed && !registrationDisabled??); section>
3
+ <#if section = "title">
4
+ title
5
+ <#elseif section = "header">
6
+ ${msg("webauthn-login-title")}
7
+ <#elseif section = "form">
8
+ <div id="kc-form-webauthn" class="${properties.kcFormClass!}">
9
+ <form id="webauth" action="${url.loginAction}" method="post">
10
+ <input type="hidden" id="clientDataJSON" name="clientDataJSON"/>
11
+ <input type="hidden" id="authenticatorData" name="authenticatorData"/>
12
+ <input type="hidden" id="signature" name="signature"/>
13
+ <input type="hidden" id="credentialId" name="credentialId"/>
14
+ <input type="hidden" id="userHandle" name="userHandle"/>
15
+ <input type="hidden" id="error" name="error"/>
16
+ </form>
17
+
18
+ <div class="${properties.kcFormGroupClass!} no-bottom-margin">
19
+ <#if authenticators??>
20
+ <form id="authn_select" class="${properties.kcFormClass!}">
21
+ <#list authenticators.authenticators as authenticator>
22
+ <input type="hidden" name="authn_use_chk" value="${authenticator.credentialId}"/>
23
+ </#list>
24
+ </form>
25
+
26
+ <#if shouldDisplayAuthenticators?? && shouldDisplayAuthenticators>
27
+ <#if authenticators.authenticators?size gt 1>
28
+ <p class="${properties.kcSelectAuthListItemTitle!}">${msg("webauthn-available-authenticators")}</p>
29
+ </#if>
30
+
31
+ <div class="${properties.kcFormClass!}">
32
+ <#list authenticators.authenticators as authenticator>
33
+ <div id="kc-webauthn-authenticator-item-${authenticator?index}" class="${properties.kcSelectAuthListItemClass!}">
34
+ <div class="${properties.kcSelectAuthListItemIconClass!}">
35
+ <i class="${(properties['${authenticator.transports.iconClass}'])!'${properties.kcWebAuthnDefaultIcon!}'} ${properties.kcSelectAuthListItemIconPropertyClass!}"></i>
36
+ </div>
37
+ <div class="${properties.kcSelectAuthListItemBodyClass!}">
38
+ <div id="kc-webauthn-authenticator-label-${authenticator?index}"
39
+ class="${properties.kcSelectAuthListItemHeadingClass!}">
40
+ ${authenticator.label}
41
+ </div>
42
+
43
+ <#if authenticator.transports?? && authenticator.transports.displayNameProperties?has_content>
44
+ <div id="kc-webauthn-authenticator-transport-${authenticator?index}"
45
+ class="${properties.kcSelectAuthListItemDescriptionClass!}">
46
+ <#list authenticator.transports.displayNameProperties as nameProperty>
47
+ <span>${msg(nameProperty)}</span>
48
+ <#if nameProperty?has_next>
49
+ <span>, </span>
50
+ </#if>
51
+ </#list>
52
+ </div>
53
+ </#if>
54
+
55
+ <div class="${properties.kcSelectAuthListItemDescriptionClass!}">
56
+ <span id="kc-webauthn-authenticator-createdlabel-${authenticator?index}">
57
+ ${msg('webauthn-createdAt-label')}
58
+ </span>
59
+ <span id="kc-webauthn-authenticator-created-${authenticator?index}">
60
+ ${authenticator.createdAt}
61
+ </span>
62
+ </div>
63
+ </div>
64
+ <div class="${properties.kcSelectAuthListItemFillClass!}"></div>
65
+ </div>
66
+ </#list>
67
+ </div>
68
+ </#if>
69
+ </#if>
70
+
71
+ <div id="kc-form-buttons" class="${properties.kcFormButtonsClass!}">
72
+ <input id="authenticateWebAuthnButton" type="button" autofocus="autofocus"
73
+ value="${msg("webauthn-doAuthenticate")}"
74
+ class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}"/>
75
+ </div>
76
+ </div>
77
+ </div>
78
+
79
+ <script type="module">
80
+ <#outputformat "JavaScript">
81
+ import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js";
82
+ const authButton = document.getElementById('authenticateWebAuthnButton');
83
+ authButton.addEventListener("click", function() {
84
+ const input = {
85
+ isUserIdentified : ${isUserIdentified},
86
+ challenge : ${challenge?c},
87
+ userVerification : ${userVerification?c},
88
+ rpId : ${rpId?c},
89
+ createTimeout : ${createTimeout?c},
90
+ errmsg : ${msg("webauthn-unsupported-browser-text")?c}
91
+ };
92
+ authenticateByWebAuthn(input);
93
+ }, { once: true });
94
+ </#outputformat>
95
+ </script>
96
+
97
+ <#elseif section = "info">
98
+ <#if realm.registrationAllowed && !registrationDisabled??>
99
+ <div id="kc-registration">
100
+ <span>${msg("noAccount")} <a tabindex="6" href="${url.registrationUrl}">${msg("doRegister")}</a></span>
101
+ </div>
102
+ </#if>
103
+ </#if>
104
+ </@layout.registrationLayout>
@@ -0,0 +1,36 @@
1
+ <#import "template.ftl" as layout>
2
+ <@layout.registrationLayout displayMessage=true; section>
3
+ <#if section = "header">
4
+ ${kcSanitize(msg("webauthn-error-title"))?no_esc}
5
+ <#elseif section = "form">
6
+
7
+ <script type="text/javascript">
8
+ refreshPage = () => {
9
+ document.getElementById('isSetRetry').value = 'retry';
10
+ document.getElementById('executionValue').value = '${execution}';
11
+ document.getElementById('kc-error-credential-form').requestSubmit();
12
+ }
13
+ </script>
14
+
15
+ <form id="kc-error-credential-form" class="${properties.kcFormClass!}" action="${url.loginAction}"
16
+ method="post">
17
+ <input type="hidden" id="executionValue" name="authenticationExecution"/>
18
+ <input type="hidden" id="isSetRetry" name="isSetRetry"/>
19
+ </form>
20
+
21
+ <input tabindex="4" onclick="refreshPage()" type="button"
22
+ class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}"
23
+ name="try-again" id="kc-try-again" value="${kcSanitize(msg("doTryAgain"))?no_esc}"
24
+ />
25
+
26
+ <#if isAppInitiatedAction??>
27
+ <form action="${url.loginAction}" class="${properties.kcFormClass!}" id="kc-webauthn-settings-form" method="post">
28
+ <button type="submit"
29
+ class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}"
30
+ id="cancelWebAuthnAIA" name="cancel-aia" value="true">${msg("doCancel")}
31
+ </button>
32
+ </form>
33
+ </#if>
34
+
35
+ </#if>
36
+ </@layout.registrationLayout>