@okta/okta-signin-widget 7.16.0 → 7.16.1

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 (246) hide show
  1. package/README.md +5 -5
  2. package/dist/css/fonts.css +172 -0
  3. package/dist/css/okta-sign-in.next.css +1 -240
  4. package/dist/css/okta-sign-in.next.css.map +1 -1
  5. package/dist/esm/src/config/config.json.js +1 -1
  6. package/dist/js/okta-sign-in.classic.js +1 -1
  7. package/dist/js/okta-sign-in.classic.min.js +1 -1
  8. package/dist/js/okta-sign-in.js +1 -1
  9. package/dist/js/okta-sign-in.min.js +1 -1
  10. package/dist/js/okta-sign-in.next.js +61 -19
  11. package/dist/js/okta-sign-in.next.js.map +1 -1
  12. package/dist/js/okta-sign-in.next.no-polyfill.js +60 -18
  13. package/dist/js/okta-sign-in.next.no-polyfill.js.map +1 -1
  14. package/dist/js/okta-sign-in.no-polyfill.min.js +1 -1
  15. package/dist/js/okta-sign-in.oie.js +1 -1
  16. package/dist/js/okta-sign-in.oie.min.js +1 -1
  17. package/package.json +10 -5
  18. package/src/config/config.json +1 -1
  19. package/src/v3/components/AuthCoin/AuthCoin.tsx +15 -17
  20. package/src/v3/components/AuthContainer/AuthContainer.tsx +11 -17
  21. package/src/v3/components/AuthContent/AuthContent.tsx +21 -16
  22. package/src/v3/components/AuthHeader/AuthHeader.tsx +18 -19
  23. package/src/v3/components/AuthenticatorButton/AuthenticatorButton.tsx +116 -77
  24. package/src/v3/components/AuthenticatorButton/AuthenticatorButtonList.tsx +9 -3
  25. package/src/v3/components/Button/Button.tsx +16 -20
  26. package/src/v3/components/CaptchaContainer/CaptchaContainer.tsx +1 -1
  27. package/src/v3/components/Checkbox/Checkbox.tsx +33 -82
  28. package/src/v3/components/ConsentHeader/ConsentHeader.tsx +23 -23
  29. package/src/v3/components/Divider/Divider.tsx +2 -2
  30. package/src/v3/components/Form/Accordion.tsx +15 -36
  31. package/src/v3/components/Form/ElementContainer.tsx +6 -3
  32. package/src/v3/components/Form/Form.tsx +2 -4
  33. package/src/v3/components/Form/Layout.tsx +1 -1
  34. package/src/v3/components/Form/LayoutContainer.tsx +4 -2
  35. package/src/v3/components/Heading/Heading.tsx +7 -5
  36. package/src/v3/components/Icon/CustomAppIcon.tsx +13 -15
  37. package/src/v3/components/Icon/CustomOTPIcon.tsx +5 -10
  38. package/src/v3/components/Icon/DuoIcon.tsx +5 -10
  39. package/src/v3/components/Icon/EmailIcon.tsx +5 -10
  40. package/src/v3/components/Icon/GoogleOTPIcon.tsx +5 -10
  41. package/src/v3/components/Icon/IDPIcon.tsx +5 -10
  42. package/src/v3/components/Icon/OktaVerifyIcon.tsx +0 -7
  43. package/src/v3/components/Icon/OnPremMFAIcon.tsx +5 -10
  44. package/src/v3/components/Icon/PasswordIcon.tsx +5 -10
  45. package/src/v3/components/Icon/PhoneIcon.tsx +5 -10
  46. package/src/v3/components/Icon/RSAIcon.tsx +6 -11
  47. package/src/v3/components/Icon/SecurityKeyOrBiometricsIcon.tsx +5 -10
  48. package/src/v3/components/Icon/SecurityQuestionIcon.tsx +5 -10
  49. package/src/v3/components/Icon/SmartCardIcon.tsx +5 -10
  50. package/src/v3/components/Icon/SymantecIcon.tsx +5 -10
  51. package/src/v3/components/Icon/YubiKeyIcon.tsx +5 -10
  52. package/src/v3/components/Icon/index.tsx +0 -2
  53. package/src/v3/components/IdentifierContainer/IdentifierContainer.tsx +31 -47
  54. package/src/v3/components/Image/Image.tsx +42 -0
  55. package/src/v3/{src/components/CustomPluginsOdysseyCacheProvider → components/Image}/index.tsx +2 -2
  56. package/src/v3/components/ImageWithText/ImageWithText.tsx +7 -4
  57. package/src/v3/components/Images/AppIcon.tsx +16 -46
  58. package/src/v3/components/Images/DeviceIcon.tsx +16 -32
  59. package/src/v3/components/Images/LocationIcon.tsx +16 -26
  60. package/src/v3/components/Images/PhoneIcon.tsx +34 -29
  61. package/src/v3/components/Images/YubikeyDemoImage.tsx +32 -27
  62. package/src/v3/components/Images/index.tsx +0 -1
  63. package/src/v3/components/InfoBox/InfoBox.tsx +12 -12
  64. package/src/v3/components/InfoSection/InfoSection.tsx +20 -14
  65. package/src/v3/components/InformationalText/InformationalText.tsx +16 -6
  66. package/src/v3/components/InputPassword/InputPassword.tsx +31 -164
  67. package/src/v3/components/InputText/InputText.tsx +27 -103
  68. package/src/v3/components/LaunchAuthenticatorButton/LaunchAuthenticatorButton.tsx +14 -26
  69. package/src/v3/components/Link/Link.tsx +8 -20
  70. package/src/v3/components/List/List.tsx +16 -12
  71. package/src/v3/components/PIVButton/PIVButton.tsx +10 -8
  72. package/src/v3/components/PasswordRequirements/Icon.tsx +17 -23
  73. package/src/v3/components/PasswordRequirements/PasswordMatches.tsx +9 -2
  74. package/src/v3/components/PasswordRequirements/PasswordRequirementListItem.tsx +6 -5
  75. package/src/v3/components/PasswordRequirements/PasswordRequirements.tsx +5 -3
  76. package/src/v3/components/PhoneAuthenticator/PhoneAuthenticator.tsx +53 -137
  77. package/src/v3/components/QRCode/QRCode.tsx +27 -20
  78. package/src/v3/components/Radio/Radio.tsx +31 -93
  79. package/src/v3/components/ReminderPrompt/ReminderPrompt.tsx +9 -12
  80. package/src/v3/components/Select/Select.tsx +45 -92
  81. package/src/v3/components/Spinner/Spinner.tsx +6 -8
  82. package/src/v3/components/StepperButton/StepperButton.tsx +6 -10
  83. package/src/v3/components/StepperLink/StepperLink.tsx +1 -1
  84. package/src/v3/components/StepperRadio/StepperRadio.tsx +22 -43
  85. package/src/v3/components/TextWithActionLink/TextWithActionLink.tsx +1 -1
  86. package/src/v3/components/Title/Title.tsx +5 -9
  87. package/src/v3/components/WebAuthNSubmitButton/WebAuthNSubmitButton.tsx +10 -9
  88. package/src/v3/components/Widget/GlobalStyles.tsx +16 -21
  89. package/src/v3/components/Widget/index.tsx +51 -36
  90. package/src/v3/components/Widget/style.scss +295 -0
  91. package/src/v3/components/WidgetMessageContainer/WidgetMessageContainer.tsx +11 -8
  92. package/src/v3/components/hocs/withFormValidationState.tsx +2 -5
  93. package/src/v3/jest.config.js +1 -0
  94. package/src/v3/jest.setup.js +1 -0
  95. package/src/v3/package.json +11 -7
  96. package/src/v3/screenshots/base/UI_demo/UI_demo_RTL_VRT.png +0 -0
  97. package/src/v3/screenshots/base/UI_demo/UI_demo_VRT.png +0 -0
  98. package/src/v3/src/components/AuthCoin/AuthCoin.tsx +15 -17
  99. package/src/v3/src/components/AuthCoin/__snapshots__/AuthCoin.test.tsx.snap +20 -47
  100. package/src/v3/src/components/AuthContainer/AuthContainer.tsx +11 -17
  101. package/src/v3/src/components/AuthContent/AuthContent.tsx +21 -16
  102. package/src/v3/src/components/AuthHeader/AuthHeader.tsx +18 -19
  103. package/src/v3/src/components/AuthenticatorButton/AuthenticatorButton.tsx +116 -77
  104. package/src/v3/src/components/AuthenticatorButton/AuthenticatorButtonList.tsx +9 -3
  105. package/src/v3/src/components/Button/Button.tsx +16 -20
  106. package/src/v3/src/components/CaptchaContainer/CaptchaContainer.tsx +1 -1
  107. package/src/v3/src/components/Checkbox/Checkbox.tsx +33 -82
  108. package/src/v3/src/components/ConsentHeader/ConsentHeader.tsx +23 -23
  109. package/src/v3/src/components/Divider/Divider.tsx +2 -2
  110. package/src/v3/src/components/Form/Accordion.tsx +15 -36
  111. package/src/v3/src/components/Form/ElementContainer.tsx +6 -3
  112. package/src/v3/src/components/Form/Form.tsx +2 -4
  113. package/src/v3/src/components/Form/Layout.tsx +1 -1
  114. package/src/v3/src/components/Form/LayoutContainer.tsx +4 -2
  115. package/src/v3/src/components/Heading/Heading.tsx +7 -5
  116. package/src/v3/src/components/Icon/CustomAppIcon.tsx +13 -15
  117. package/src/v3/src/components/Icon/CustomOTPIcon.tsx +5 -10
  118. package/src/v3/src/components/Icon/DuoIcon.tsx +5 -10
  119. package/src/v3/src/components/Icon/EmailIcon.tsx +5 -10
  120. package/src/v3/src/components/Icon/GoogleOTPIcon.tsx +5 -10
  121. package/src/v3/src/components/Icon/IDPIcon.tsx +5 -10
  122. package/src/v3/src/components/Icon/OktaVerifyIcon.tsx +0 -7
  123. package/src/v3/src/components/Icon/OnPremMFAIcon.tsx +5 -10
  124. package/src/v3/src/components/Icon/PasswordIcon.tsx +5 -10
  125. package/src/v3/src/components/Icon/PhoneIcon.tsx +5 -10
  126. package/src/v3/src/components/Icon/RSAIcon.tsx +6 -11
  127. package/src/v3/src/components/Icon/SecurityKeyOrBiometricsIcon.tsx +5 -10
  128. package/src/v3/src/components/Icon/SecurityQuestionIcon.tsx +5 -10
  129. package/src/v3/src/components/Icon/SmartCardIcon.tsx +5 -10
  130. package/src/v3/src/components/Icon/SymantecIcon.tsx +5 -10
  131. package/src/v3/src/components/Icon/YubiKeyIcon.tsx +5 -10
  132. package/src/v3/src/components/Icon/index.tsx +0 -2
  133. package/src/v3/src/components/IdentifierContainer/IdentifierContainer.tsx +31 -47
  134. package/src/v3/src/components/Image/Image.tsx +42 -0
  135. package/src/v3/{components/CustomPluginsOdysseyCacheProvider → src/components/Image}/index.tsx +2 -2
  136. package/src/v3/src/components/ImageWithText/ImageWithText.tsx +7 -4
  137. package/src/v3/src/components/Images/AppIcon.tsx +16 -46
  138. package/src/v3/src/components/Images/DeviceIcon.tsx +16 -32
  139. package/src/v3/src/components/Images/LocationIcon.tsx +16 -26
  140. package/src/v3/src/components/Images/PhoneIcon.tsx +34 -29
  141. package/src/v3/src/components/Images/YubikeyDemoImage.tsx +32 -27
  142. package/src/v3/src/components/Images/index.tsx +0 -1
  143. package/src/v3/src/components/InfoBox/InfoBox.tsx +12 -12
  144. package/src/v3/src/components/InfoSection/InfoSection.tsx +20 -14
  145. package/src/v3/src/components/InformationalText/InformationalText.tsx +16 -6
  146. package/src/v3/src/components/InputPassword/InputPassword.tsx +31 -164
  147. package/src/v3/src/components/InputText/InputText.tsx +27 -103
  148. package/src/v3/src/components/LaunchAuthenticatorButton/LaunchAuthenticatorButton.tsx +14 -26
  149. package/src/v3/src/components/Link/Link.tsx +8 -20
  150. package/src/v3/src/components/List/List.tsx +16 -12
  151. package/src/v3/src/components/PIVButton/PIVButton.tsx +10 -8
  152. package/src/v3/src/components/PasswordRequirements/Icon.tsx +17 -23
  153. package/src/v3/src/components/PasswordRequirements/PasswordMatches.tsx +9 -2
  154. package/src/v3/src/components/PasswordRequirements/PasswordRequirementListItem.tsx +6 -5
  155. package/src/v3/src/components/PasswordRequirements/PasswordRequirements.tsx +5 -3
  156. package/src/v3/src/components/PhoneAuthenticator/PhoneAuthenticator.tsx +53 -137
  157. package/src/v3/src/components/QRCode/QRCode.tsx +27 -20
  158. package/src/v3/src/components/Radio/Radio.tsx +31 -93
  159. package/src/v3/src/components/ReminderPrompt/ReminderPrompt.tsx +9 -12
  160. package/src/v3/src/components/ReminderPrompt/__snapshots__/ReminderPrompt.test.tsx.snap +37 -17
  161. package/src/v3/src/components/Select/Select.tsx +45 -92
  162. package/src/v3/src/components/Spinner/Spinner.tsx +6 -8
  163. package/src/v3/src/components/StepperButton/StepperButton.tsx +6 -10
  164. package/src/v3/src/components/StepperLink/StepperLink.tsx +1 -1
  165. package/src/v3/src/components/StepperRadio/StepperRadio.tsx +22 -43
  166. package/src/v3/src/components/TextWithActionLink/TextWithActionLink.tsx +1 -1
  167. package/src/v3/src/components/Title/Title.tsx +5 -9
  168. package/src/v3/src/components/WebAuthNSubmitButton/WebAuthNSubmitButton.tsx +10 -9
  169. package/src/v3/src/components/Widget/GlobalStyles.tsx +16 -21
  170. package/src/v3/src/components/Widget/index.tsx +51 -36
  171. package/src/v3/src/components/Widget/style.scss +295 -0
  172. package/src/v3/src/components/WidgetMessageContainer/WidgetMessageContainer.tsx +11 -8
  173. package/src/v3/src/components/hocs/withFormValidationState.tsx +2 -5
  174. package/src/v3/src/transformer/button/__snapshots__/transformIDPButtons.test.ts.snap +0 -2
  175. package/src/v3/src/transformer/i18n/__snapshots__/transformAuthenticatorButton.test.ts.snap +4 -4
  176. package/src/v3/src/transformer/i18n/transformAuthenticatorButton.test.ts +3 -3
  177. package/src/v3/src/transformer/i18n/transformAuthenticatorButton.ts +18 -2
  178. package/src/v3/src/transformer/layout/development/transformEnumerateComponents.ts +72 -5
  179. package/src/v3/src/transformer/layout/idp/__snapshots__/transformIdpRedirect.test.ts.snap +4 -4
  180. package/src/v3/src/transformer/selectAuthenticator/__snapshots__/transformSelectAuthenticatorVerify.test.ts.snap +0 -3
  181. package/src/v3/src/transformer/selectAuthenticator/__snapshots__/transformSelectOVCustomAppMethodVerify.test.ts.snap +0 -1
  182. package/src/v3/src/transformer/selectAuthenticator/__snapshots__/utils.test.ts.snap +163 -42
  183. package/src/v3/src/transformer/selectAuthenticator/transformSelectAuthenticatorEnroll.ts +7 -1
  184. package/src/v3/src/transformer/selectAuthenticator/transformSelectAuthenticatorVerify.ts +0 -1
  185. package/src/v3/src/transformer/selectAuthenticator/transformSelectOVCustomAppMethodVerify.ts +0 -1
  186. package/src/v3/src/transformer/selectAuthenticator/utils.test.ts +117 -39
  187. package/src/v3/src/transformer/selectAuthenticator/utils.ts +102 -58
  188. package/src/v3/src/transformer/terminal/transformEmailMagicLinkOTPOnlyElements.ts +1 -3
  189. package/src/v3/src/transformer/uischema/transform.test.ts +0 -6
  190. package/src/v3/src/transformer/uischema/transform.ts +0 -2
  191. package/src/v3/src/{components/FieldLevelMessageContainer/index.tsx → types/image.ts} +10 -3
  192. package/src/v3/src/types/index.ts +1 -0
  193. package/src/v3/src/types/schema.ts +2 -1
  194. package/src/v3/src/types/widget.ts +3 -3
  195. package/src/v3/src/util/buildFieldLevelErrorMessages.ts +48 -0
  196. package/src/v3/src/util/formUtils.ts +5 -17
  197. package/src/v3/src/util/htmlContentParserUtils.tsx +3 -1
  198. package/src/v3/src/util/index.ts +2 -0
  199. package/src/v3/src/util/isLtrField.ts +22 -0
  200. package/src/v3/src/util/languageUtils.ts +14 -0
  201. package/src/v3/src/util/leonardo.d.ts +571 -0
  202. package/src/v3/src/util/mergeThemes.test.tsx +20 -7
  203. package/src/v3/src/util/mergeThemes.ts +32 -1
  204. package/src/v3/src/util/stylisPlugins.ts +21 -0
  205. package/src/v3/src/util/theme.test.ts +63 -187
  206. package/src/v3/src/util/theme.ts +274 -247
  207. package/src/v3/svgo.config.js +0 -6
  208. package/src/v3/transformer/i18n/transformAuthenticatorButton.ts +18 -2
  209. package/src/v3/transformer/layout/development/transformEnumerateComponents.ts +72 -5
  210. package/src/v3/transformer/selectAuthenticator/transformSelectAuthenticatorEnroll.ts +7 -1
  211. package/src/v3/transformer/selectAuthenticator/transformSelectAuthenticatorVerify.ts +0 -1
  212. package/src/v3/transformer/selectAuthenticator/transformSelectOVCustomAppMethodVerify.ts +0 -1
  213. package/src/v3/transformer/selectAuthenticator/utils.ts +102 -58
  214. package/src/v3/transformer/terminal/transformEmailMagicLinkOTPOnlyElements.ts +1 -3
  215. package/src/v3/transformer/uischema/transform.ts +0 -2
  216. package/src/v3/tsconfig.base.json +3 -0
  217. package/src/v3/{components/FieldLevelMessageContainer/index.tsx → types/image.ts} +10 -3
  218. package/src/v3/types/index.ts +1 -0
  219. package/src/v3/types/schema.ts +2 -1
  220. package/src/v3/types/widget.ts +3 -3
  221. package/src/v3/util/buildFieldLevelErrorMessages.ts +48 -0
  222. package/src/v3/util/formUtils.ts +5 -17
  223. package/src/v3/util/htmlContentParserUtils.tsx +3 -1
  224. package/src/v3/util/index.ts +2 -0
  225. package/src/v3/util/isLtrField.ts +22 -0
  226. package/src/v3/util/languageUtils.ts +14 -0
  227. package/src/v3/util/leonardo.d.ts +571 -0
  228. package/src/v3/util/mergeThemes.ts +32 -1
  229. package/src/v3/util/stylisPlugins.ts +21 -0
  230. package/src/v3/util/theme.ts +274 -247
  231. package/src/v3/components/CustomPluginsOdysseyCacheProvider/CustomPluginsOdysseyCacheProvider.tsx +0 -66
  232. package/src/v3/components/FieldLevelMessageContainer/FieldLevelMessageContainer.tsx +0 -55
  233. package/src/v3/components/Icon/CheckCircle.tsx +0 -30
  234. package/src/v3/components/Icon/RightArrowIcon.tsx +0 -30
  235. package/src/v3/components/Images/MobileDeviceIcon.tsx +0 -38
  236. package/src/v3/components/Widget/style.css +0 -181
  237. package/src/v3/src/components/CustomPluginsOdysseyCacheProvider/CustomPluginsOdysseyCacheProvider.tsx +0 -66
  238. package/src/v3/src/components/FieldLevelMessageContainer/FieldLevelMessageContainer.tsx +0 -55
  239. package/src/v3/src/components/Icon/CheckCircle.tsx +0 -30
  240. package/src/v3/src/components/Icon/RightArrowIcon.tsx +0 -30
  241. package/src/v3/src/components/Images/MobileDeviceIcon.tsx +0 -38
  242. package/src/v3/src/components/Widget/style.css +0 -181
  243. package/src/v3/src/transformer/uischema/setLtrFields.ts +0 -41
  244. package/src/v3/src/util/designTokens.ts +0 -249
  245. package/src/v3/transformer/uischema/setLtrFields.ts +0 -41
  246. package/src/v3/util/designTokens.ts +0 -249
@@ -0,0 +1,295 @@
1
+ /* TODO: move loginpage styles out of SIW repo OKTA-602545 */
2
+
3
+ @use 'sass:map';
4
+ @import '@okta/odyssey-design-tokens/dist/index.scss';
5
+
6
+ /* loginpage utility styles */
7
+ .clearfix {
8
+ display: block;
9
+ }
10
+ .clearfix:after,
11
+ .clearfix:before {
12
+ display: block;
13
+ block-size: 0;
14
+ clear: both;
15
+ content: ".";
16
+ visibility: hidden;
17
+ }
18
+ .hide {
19
+ display: none;
20
+ }
21
+
22
+ .okta-container {
23
+ margin: 0;
24
+ block-size: inherit;
25
+ }
26
+
27
+ .auth .footer, .okta-container .applogin-banner {
28
+ font-family: map.get($ods-tokens, 'typography', 'family', 'body');
29
+
30
+ &:lang(el) {
31
+ font-family: 'Noto Sans', sans-serif;
32
+ }
33
+
34
+ &:lang(ja) {
35
+ font-family: 'Noto Sans JP', sans-serif;
36
+ }
37
+
38
+ &:lang(ko) {
39
+ font-family: 'Noto Sans KR', sans-serif;
40
+ }
41
+
42
+ &:lang(th) {
43
+ font-family: 'Noto Sans Thai', sans-serif;
44
+ }
45
+
46
+ &:lang(zh-CN) {
47
+ font-family: 'Noto Sans SC', sans-serif;
48
+ }
49
+
50
+ &:lang(zh-TW) {
51
+ font-family: 'Noto Sans TC', sans-serif;
52
+ }
53
+ }
54
+
55
+ /* loginpage footer styles */
56
+ .auth .footer {
57
+ position: fixed;
58
+ inset-block-end: 0;
59
+ background-color: #fff;
60
+ min-inline-size: 300px;
61
+ font-size: map.get($ods-tokens, 'typography', 'size', 'subordinate');
62
+ color: map.get($ods-tokens, 'typography', 'color', 'subordinate');
63
+ inset-inline: 0;
64
+ inset-block-end: 0;
65
+ overflow: hidden;
66
+ margin-block-start: map.get($ods-tokens, spacing, '8');
67
+ background-color: map.get($ods-tokens, 'hue', 'neutral', '50');
68
+ border-block-start: map.get($ods-tokens, 'border', 'width', 'main') solid map.get($ods-tokens, 'border', 'color', 'display');
69
+ p {
70
+ margin-block: map.get($ods-tokens, 'spacing', '3');
71
+ }
72
+ }
73
+ .auth .footer .footer-container {
74
+ padding-inline: map.get($ods-tokens, spacing, '8');
75
+ margin-inline: auto;
76
+ box-sizing: border-box;
77
+ }
78
+ @media only screen and (max-width: 560px) {
79
+ .auth .footer .footer-container {
80
+ inline-size: 400px;
81
+ padding-inline: 20px;
82
+ }
83
+ }
84
+ @media only screen and (max-width: 400px) {
85
+ .auth .footer .footer-container {
86
+ inline-size: 100%;
87
+ }
88
+ }
89
+ .auth .footer a {
90
+ color: #6e6e78;
91
+ }
92
+ .auth .footer a:active,
93
+ .auth .footer a:link,
94
+ .auth .footer a:visited {
95
+ color: #6e6e78;
96
+ }
97
+ .auth .footer a:focus,
98
+ .auth .footer a:hover {
99
+ text-decoration: underline;
100
+ color: #6e6e78;
101
+ }
102
+ .auth .footer .copyright {
103
+ /* stylelint-disable-next-line liberty/use-logical-spec */
104
+ float: left;
105
+ /* TODO: OKTA-586564 replace hardcoded value */
106
+ color: #6e6e78;
107
+ }
108
+ .auth .footer .copyright a {
109
+ /* TODO: OKTA-586564 replace hardcoded value */
110
+ color: #6e6e78;
111
+ }
112
+ .auth .footer .privacy-policy {
113
+ /* stylelint-disable-next-line liberty/use-logical-spec */
114
+ float: right;
115
+ }
116
+
117
+ /* loginpage app banner styles */
118
+ .okta-container .applogin-banner {
119
+ font-size: map.get($ods-tokens, 'typography', 'size', 'body');
120
+ color: map.get($ods-tokens, 'typography', 'color', 'subordinate');
121
+ position: relative;
122
+ min-inline-size: 300px;
123
+ border-block-end: map.get($ods-tokens, 'border', 'width', 'main') solid map.get($ods-tokens, 'border', 'color', 'display');
124
+ }
125
+ .okta-container .applogin-banner .applogin-background {
126
+ background-color: #fff;
127
+ opacity: 0.9;
128
+ position: absolute;
129
+ inset: 0;
130
+ box-shadow: 0 0 2px 1px hsla(0, 0%, 68.6%, 0.3);
131
+ }
132
+ .okta-container .applogin-banner .applogin-container {
133
+ position: relative;
134
+ inline-size: 400px;
135
+ min-inline-size: 300px;
136
+ margin-block: 0;
137
+ margin-inline: auto;
138
+ padding-block: map.get($ods-tokens, spacing, '3') map.get($ods-tokens, spacing, '4');
139
+ padding-inline: 0;
140
+ box-sizing: border-box;
141
+ text-align: center;
142
+ }
143
+ .okta-container .applogin-banner .applogin-container p {
144
+ /* TODO: OKTA-586564 replace hardcoded value */
145
+ color: #6e6e78;
146
+ margin-block: 0;
147
+ }
148
+
149
+ @media only screen and (max-width: 400px) {
150
+ .okta-container .applogin-banner .applogin-container {
151
+ inline-size: 100%;
152
+ }
153
+ }
154
+ @media only screen and (max-height: 750px) {
155
+ .okta-container .applogin-banner .applogin-container {
156
+ padding-block: 10px;
157
+ padding-inline: 0;
158
+ }
159
+ }
160
+ @media only screen and (max-height: 660px) {
161
+ .okta-container .applogin-banner .applogin-container {
162
+ padding-block: 5px;
163
+ padding-inline: 0;
164
+ }
165
+ .okta-container .applogin-banner .applogin-container p {
166
+ display: none;
167
+ }
168
+ }
169
+ .okta-container .applogin-banner .applogin-container h1 {
170
+ margin-block: 0;
171
+ }
172
+ .okta-container .applogin-banner .applogin-app-title {
173
+ display: none;
174
+ }
175
+ .okta-container .applogin-banner .applogin-app-logo {
176
+ display: inline-block;
177
+ vertical-align: middle;
178
+ margin-block-end: map.get($ods-tokens, 'spacing', '2');
179
+ }
180
+ .okta-container .applogin-banner .applogin-app-logo img {
181
+ inline-size: map.get($ods-tokens, 'spacing', '8');
182
+ block-size: map.get($ods-tokens, 'spacing', '8');
183
+ }
184
+
185
+ /* loginpage container styles */
186
+ .auth .content {
187
+ min-block-size: 100%;
188
+ min-inline-size: 300px;
189
+ display: inline-block;
190
+ inline-size: 100%;
191
+ }
192
+ .auth .content:after {
193
+ content: "";
194
+ display: block;
195
+ block-size: 30px;
196
+ }
197
+ .login-bg-image {
198
+ background-repeat: no-repeat;
199
+ background-position: 50%;
200
+ background-size: cover;
201
+ position: fixed;
202
+ inset: 0;
203
+ z-index: -5;
204
+ }
205
+ @media only screen and (max-width: 600px) {
206
+ .login-bg-image {
207
+ background-image: none !important;
208
+ background-color: #fff !important;
209
+ -webkit-filter: unset !important;
210
+ filter: unset !important;
211
+ }
212
+ }
213
+
214
+ /* signin container styles */
215
+ #signin-container {
216
+ margin-block: map.get($ods-tokens, 'spacing', '8');
217
+ }
218
+ @media only screen and (max-width: 600px) {
219
+ #signin-container {
220
+ margin-block: map.get($ods-tokens, 'spacing', '2');
221
+ }
222
+ }
223
+
224
+ /* back to settings button style */
225
+ .back-to-settings {
226
+ margin: unset !important;
227
+ min-block-size: unset !important;
228
+ inline-size: unset !important;
229
+ min-inline-size: unset !important;
230
+ .back-to-settings-link {
231
+ position: unset !important;
232
+ inset-block-start: unset !important;
233
+ a {
234
+ font-family: map.get($ods-tokens, 'typography', 'family', 'button');
235
+ position: absolute;
236
+ padding-block: 10px;
237
+ padding-inline: 14px;
238
+ display: inline-block;
239
+ inset-block-start: map.get($ods-tokens, 'spacing', '8');
240
+ inset-inline-start: map.get($ods-tokens, 'spacing', '8');
241
+ block-size: unset;
242
+ line-height: unset;
243
+ text-decoration: none;
244
+ color: #000;
245
+ background-color: #fff;
246
+ border: solid map.get($ods-tokens, 'border', 'width', 'main') map.get($ods-tokens, 'border', 'color', 'display');
247
+ border-radius: map.get($ods-tokens, 'border', 'radius', 'main');
248
+ opacity: 1;
249
+
250
+ &:hover {
251
+ background-color: map.get($ods-tokens, 'hue', 'blue', '100');
252
+ border: solid map.get($ods-tokens, 'border', 'width', 'main') map.get($ods-tokens, 'border', 'color', 'control');
253
+ }
254
+ &:active {
255
+ background-color: map.get($ods-tokens, 'hue', 'blue', '300');
256
+ border: solid map.get($ods-tokens, 'border', 'width', 'main') map.get($ods-tokens, 'border', 'color', 'primary', 'dark');
257
+ }
258
+ &:focus-visible {
259
+ background-color: map.get($ods-tokens, 'hue', 'blue', '300');
260
+ border: solid map.get($ods-tokens, 'border', 'width', 'main') map.get($ods-tokens, 'border', 'color', 'control');
261
+ outline: map.get($ods-tokens, 'focus', 'outline', 'width', 'main') solid map.get($ods-tokens, 'focus', 'outline', 'color', 'primary');
262
+ outline-offset: 2px;
263
+ }
264
+
265
+ img {
266
+ padding-inline-end: map.get($ods-tokens, 'spacing', '3');
267
+ }
268
+ }
269
+ }
270
+ }
271
+ @media only screen and (max-width: 600px) {
272
+ .back-to-settings .back-to-settings-link a {
273
+ position: relative;
274
+ display: inline-block;
275
+ inset-block-start: unset;
276
+ inset-inline-start: unset;
277
+ margin-inline: map.get($ods-tokens, 'spacing', '3');
278
+ margin-block-start: map.get($ods-tokens, 'spacing', '3');
279
+ margin-block-end: map.get($ods-tokens, 'spacing', '1');
280
+ }
281
+ }
282
+
283
+ /*
284
+ * NOTE: widget styles below, login page styles above. Take care when moving CSS
285
+ * from SIW to loginpage (okta-ui) in OKTA-602545
286
+ *
287
+ * TODO: OKTA-654405
288
+ */
289
+ span.strong {
290
+ font-weight: 600;
291
+ word-break: break-all;
292
+ }
293
+ span.no-translate {
294
+ white-space: nowrap;
295
+ }
@@ -10,8 +10,8 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { List, ListItem } from '@mui/material';
14
- import { Box, Link, Typography } from '@okta/odyssey-react-mui';
13
+ import { Box, List, ListItem } from '@mui/material';
14
+ import { Link, Typography, useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
15
15
  import { HTMLReactParserOptions } from 'html-react-parser';
16
16
  import { FunctionComponent, h } from 'preact';
17
17
  import React from 'preact/compat';
@@ -22,9 +22,10 @@ import { ListStyleType, WidgetMessage, WidgetMessageLink } from '../../types';
22
22
  const WidgetMessageContainer: FunctionComponent<{
23
23
  message?: WidgetMessage,
24
24
  parserOptions?: HTMLReactParserOptions,
25
- linkVariant?: 'monochrome' | 'body1',
25
+ linkVariant?: 'monochrome' | 'default',
26
26
  }> = (props) => {
27
27
  const { message, parserOptions, linkVariant } = props;
28
+ const tokens = useOdysseyDesignTokens();
28
29
 
29
30
  const renderTitle = (title?: string) => (title && (
30
31
  <Typography
@@ -37,10 +38,13 @@ const WidgetMessageContainer: FunctionComponent<{
37
38
 
38
39
  const renderLinks = (links?: WidgetMessageLink[], listStyleType?: ListStyleType) => (links && (
39
40
  <List
40
- className="custom-links"
41
+ data-se="custom-links"
41
42
  disablePadding
42
43
  dense
43
- sx={{ pl: listStyleType ? 4 : 0, listStyle: listStyleType ?? 'none' }}
44
+ sx={{
45
+ pl: listStyleType ? tokens.Spacing4 : tokens.Spacing0,
46
+ listStyle: listStyleType ?? 'none',
47
+ }}
44
48
  >
45
49
  {links.map((link) => (
46
50
  <ListItem
@@ -64,12 +68,11 @@ const WidgetMessageContainer: FunctionComponent<{
64
68
  ));
65
69
 
66
70
  const createListMessages = (widgetMsg: WidgetMessage) => (
67
- <Box marginBlockStart={2}>
71
+ <Box marginBlockStart={tokens.Spacing2}>
68
72
  {
69
73
  widgetMsg.description && (
70
74
  <Typography
71
75
  component="p"
72
- fontSize="inherit"
73
76
  >
74
77
  {widgetMsg.description}
75
78
  </Typography>
@@ -78,7 +81,7 @@ const WidgetMessageContainer: FunctionComponent<{
78
81
  <List
79
82
  dense
80
83
  disablePadding
81
- sx={{ listStyle: widgetMsg.listStyleType ?? 'disc', paddingInlineStart: 4 }}
84
+ sx={{ listStyle: widgetMsg.listStyleType ?? 'disc', paddingInlineStart: tokens.Spacing4 }}
82
85
  >
83
86
  {
84
87
  (widgetMsg.message as WidgetMessage[])?.map((wm: WidgetMessage) => {
@@ -15,7 +15,7 @@ import { useEffect, useState } from 'preact/hooks';
15
15
 
16
16
  import { useFormFieldValidation, useOnChange } from '../../hooks';
17
17
  import { FieldElement, UISchemaElementComponent, WidgetMessage } from '../../types';
18
- import { buildErrorMessageIds, convertIdxMessageToWidgetMessage } from '../../util';
18
+ import { convertIdxMessageToWidgetMessage } from '../../util';
19
19
  import { getDisplayName } from './getDisplayName';
20
20
 
21
21
  export type RendererComponent<T> = {
@@ -46,7 +46,6 @@ export const withFormValidationState: WrappedFunctionComponent<
46
46
  ariaDescribedBy,
47
47
  options: {
48
48
  inputMeta: {
49
- name,
50
49
  // @ts-ignore TODO: OKTA-539834 - messages missing from type
51
50
  messages = {},
52
51
  },
@@ -84,9 +83,7 @@ export const withFormValidationState: WrappedFunctionComponent<
84
83
  onValidateHandler,
85
84
  handleChange,
86
85
  handleBlur,
87
- describedByIds: !fieldErrors
88
- ? ariaDescribedBy
89
- : ` ${buildErrorMessageIds(fieldErrors, name)} ${ariaDescribedBy || ''} `,
86
+ describedByIds: ariaDescribedBy,
90
87
  };
91
88
  // eslint-disable-next-line react/jsx-props-no-spreading
92
89
  return <Component {...combinedProps} />;
@@ -121,7 +121,6 @@ Object {
121
121
  "label": "piv.cac.card",
122
122
  "options": Object {
123
123
  "Icon": "MockSVGIcon",
124
- "classes": " piv-button",
125
124
  "dataSe": "piv-card-button",
126
125
  "iconAlt": "piv.card",
127
126
  "onClick": [Function],
@@ -167,7 +166,6 @@ Object {
167
166
  "label": "piv.cac.card",
168
167
  "options": Object {
169
168
  "Icon": "MockSVGIcon",
170
- "classes": " piv-button",
171
169
  "dataSe": "piv-card-button",
172
170
  "iconAlt": "piv.card",
173
171
  "onClick": [Function],
@@ -31,10 +31,10 @@ Object {
31
31
  },
32
32
  "translations": Array [
33
33
  Object {
34
- "i18nKey": "",
35
- "name": "label",
34
+ "i18nKey": "oie.custom.app.authenticator.title",
35
+ "name": "description",
36
36
  "noTranslate": undefined,
37
- "value": "My custom authenticator app",
37
+ "value": "oie.custom.app.authenticator.title",
38
38
  },
39
39
  ],
40
40
  "type": "AuthenticatorButton",
@@ -145,7 +145,7 @@ Object {
145
145
  "translations": Array [
146
146
  Object {
147
147
  "i18nKey": "oie.okta_verify.push.title",
148
- "name": "label",
148
+ "name": "description",
149
149
  "noTranslate": undefined,
150
150
  "value": "oie.okta_verify.push.title",
151
151
  },
@@ -107,13 +107,13 @@ describe('Authenticator Button transformer tests', () => {
107
107
  expect(((updatedFormBag.uischema.elements[1] as AuthenticatorButtonListElement)
108
108
  .options.buttons[0] as AuthenticatorButtonElement).translations)
109
109
  .toEqual([{
110
- name: 'label', i18nKey: 'oie.okta_verify.push.title', value: 'oie.okta_verify.push.title',
110
+ name: 'description', i18nKey: 'oie.okta_verify.push.title', value: 'oie.okta_verify.push.title',
111
111
  } as TranslationInfo]);
112
112
  });
113
113
 
114
114
  it('should add translations for Custom Authenticator button', () => {
115
115
  transaction.nextStep = {
116
- name: IDX_STEP.SELECT_AUTHENTICATOR_ENROLL,
116
+ name: IDX_STEP.SELECT_AUTHENTICATOR_AUTHENTICATE,
117
117
  relatesTo: { type: '', value: { key: AUTHENTICATOR_KEY.CUSTOM_APP } as IdxAuthenticator },
118
118
  };
119
119
  formBag.uischema.elements = [
@@ -146,7 +146,7 @@ describe('Authenticator Button transformer tests', () => {
146
146
  expect(((updatedFormBag.uischema.elements[1] as AuthenticatorButtonListElement)
147
147
  .options.buttons[0] as AuthenticatorButtonElement).translations)
148
148
  .toEqual([{
149
- name: 'label', i18nKey: '', value: 'My custom authenticator app',
149
+ name: 'description', i18nKey: 'oie.custom.app.authenticator.title', value: 'oie.custom.app.authenticator.title',
150
150
  } as TranslationInfo]);
151
151
  });
152
152
  });
@@ -14,6 +14,7 @@ import {
14
14
  getI18nKey,
15
15
  getI18NParams,
16
16
  } from '../../../../v2/ion/i18nUtils';
17
+ import { AUTHENTICATOR_KEY } from '../../constants';
17
18
  import {
18
19
  AuthenticatorButtonElement,
19
20
  AuthenticatorButtonListElement,
@@ -54,6 +55,11 @@ export const transformAuthenticatorButton: TransformStepFnWithOptions = ({
54
55
  }) => (
55
56
  formbag,
56
57
  ) => {
58
+ const AUTHENTICATORS_TO_TRANSLATE_DESCRIPTION = [
59
+ AUTHENTICATOR_KEY.CUSTOM_APP,
60
+ AUTHENTICATOR_KEY.OV,
61
+ ];
62
+
57
63
  traverseLayout({
58
64
  layout: formbag.uischema,
59
65
  predicate: (element) => element.type === 'AuthenticatorButtonList',
@@ -66,12 +72,22 @@ export const transformAuthenticatorButton: TransformStepFnWithOptions = ({
66
72
  buttonListElement.options.buttons.forEach(
67
73
  (authenticatorButtonElement: AuthenticatorButtonElement) => {
68
74
  const i18nKey = getAuthenticatorButtonKey(stepName, authenticatorButtonElement.options);
75
+ const {
76
+ label,
77
+ options: {
78
+ key,
79
+ description,
80
+ isEnroll,
81
+ },
82
+ } = authenticatorButtonElement;
83
+ const translateDescription = !isEnroll
84
+ && AUTHENTICATORS_TO_TRANSLATE_DESCRIPTION.includes(key);
69
85
  addTranslation({
70
86
  element: authenticatorButtonElement,
71
- name: 'label',
87
+ name: translateDescription ? 'description' : 'label',
72
88
  i18nKey,
73
89
  params,
74
- defaultValue: authenticatorButtonElement.label,
90
+ defaultValue: translateDescription ? description : label,
75
91
  });
76
92
  },
77
93
  );
@@ -10,7 +10,11 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { AppIcon } from 'src/components/Images';
13
+ import {
14
+ AppIcon,
15
+ DeviceIcon,
16
+ LocationIcon,
17
+ } from 'src/components/Images';
14
18
  import { AUTHENTICATOR_KEY } from 'src/constants';
15
19
 
16
20
  import {
@@ -21,6 +25,7 @@ import {
21
25
  DividerElement,
22
26
  FieldElement,
23
27
  HeadingElement,
28
+ IdentifierContainerElement,
24
29
  IdxStepTransformer,
25
30
  ImageWithTextElement,
26
31
  InfoboxElement,
@@ -43,7 +48,7 @@ import {
43
48
  export const transformEnumerateComponents: IdxStepTransformer = ({
44
49
  formBag,
45
50
  }) => {
46
- const { uischema, dataSchema } = formBag;
51
+ const { uischema, dataSchema, data } = formBag;
47
52
 
48
53
  const reminderElement: ReminderElement = {
49
54
  type: 'Reminder',
@@ -183,6 +188,10 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
183
188
  ruleKey: 'excludeUsername',
184
189
  label: 'Cannot contain username',
185
190
  },
191
+ {
192
+ ruleKey: '',
193
+ label: 'Should not match your previous password',
194
+ },
186
195
  ],
187
196
  validationDelayMs: 0,
188
197
  },
@@ -203,6 +212,7 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
203
212
  },
204
213
  };
205
214
  uischema.elements.push(inputPasswordElement);
215
+ data['credentials.passcode'] = 'a';
206
216
  const confirmPassword: FieldElement = {
207
217
  type: 'Field',
208
218
  key: 'confirmPassword',
@@ -217,6 +227,7 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
217
227
  },
218
228
  };
219
229
  uischema.elements.push(confirmPassword);
230
+ data.confirmPassword = 'a';
220
231
 
221
232
  const passwordMatches: PasswordMatchesElement = {
222
233
  type: 'PasswordMatches',
@@ -334,6 +345,29 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
334
345
  Icon: '',
335
346
  },
336
347
  },
348
+ {
349
+ type: 'AuthenticatorButton',
350
+ label: 'Authenticator Button 5 for Enroll',
351
+ options: {
352
+ step: '',
353
+ type: ButtonType.BUTTON,
354
+ key: AUTHENTICATOR_KEY.CUSTOM_APP,
355
+ ctaLabel: 'Set up',
356
+ isEnroll: true,
357
+ },
358
+ },
359
+ {
360
+ type: 'AuthenticatorButton',
361
+ label: 'Authenticator Button 6 for Additional Enroll',
362
+ options: {
363
+ step: '',
364
+ type: ButtonType.BUTTON,
365
+ key: AUTHENTICATOR_KEY.WEBAUTHN,
366
+ ctaLabel: 'Set up another',
367
+ isEnroll: true,
368
+ isAdditionalEnroll: true,
369
+ },
370
+ },
337
371
  ],
338
372
  dataSe: 'authenticator-button-list',
339
373
  },
@@ -345,6 +379,11 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
345
379
  options: {
346
380
  step: '',
347
381
  },
382
+ translations: [{
383
+ name: 'label',
384
+ i18nKey: '',
385
+ value: 'Launch Authenticator button with long name and icon',
386
+ }],
348
387
  };
349
388
  uischema.elements.push(launchAuthenticatorButton);
350
389
 
@@ -425,15 +464,43 @@ export const transformEnumerateComponents: IdxStepTransformer = ({
425
464
  };
426
465
  uischema.elements.push(textWithActionLink);
427
466
 
428
- const imageWithText: ImageWithTextElement = {
467
+ uischema.elements.push(divider);
468
+
469
+ const appImageWithText: ImageWithTextElement = {
429
470
  type: 'ImageWithText',
430
471
  options: {
431
472
  id: 'image.withText',
432
473
  SVGIcon: AppIcon,
433
- textContent: 'Image with text',
474
+ textContent: 'Application',
475
+ },
476
+ };
477
+ uischema.elements.push(appImageWithText);
478
+
479
+ const deviceImageWithText: ImageWithTextElement = {
480
+ type: 'ImageWithText',
481
+ options: {
482
+ id: 'image.withText',
483
+ SVGIcon: DeviceIcon,
484
+ textContent: 'Device',
434
485
  },
435
486
  };
436
- uischema.elements.push(imageWithText);
487
+ uischema.elements.push(deviceImageWithText);
488
+
489
+ const locationImageWithText: ImageWithTextElement = {
490
+ type: 'ImageWithText',
491
+ options: {
492
+ id: 'image.withText',
493
+ SVGIcon: LocationIcon,
494
+ textContent: 'Location',
495
+ },
496
+ };
497
+ uischema.elements.push(locationImageWithText);
498
+
499
+ const identifierElement: IdentifierContainerElement = {
500
+ type: 'IdentifierContainer',
501
+ options: { identifier: 'User' },
502
+ };
503
+ uischema.elements.push(identifierElement);
437
504
 
438
505
  return formBag;
439
506
  };
@@ -22,10 +22,10 @@ Object {
22
22
  },
23
23
  Object {
24
24
  "label": "socialauth.google.label",
25
+ "noTranslate": false,
25
26
  "options": Object {
26
27
  "Icon": "MockSVGIcon",
27
- "classes": "social-auth-button social-auth-google-button",
28
- "dataSe": "piv-card-button",
28
+ "dataSe": "piv-card-button social-auth-google-button",
29
29
  "iconAlt": "",
30
30
  "onClick": [Function],
31
31
  "step": "piv-idp",
@@ -36,10 +36,10 @@ Object {
36
36
  },
37
37
  Object {
38
38
  "label": "socialauth.facebook.label",
39
+ "noTranslate": false,
39
40
  "options": Object {
40
41
  "Icon": "MockSVGIcon",
41
- "classes": "social-auth-button social-auth-facebook-button",
42
- "dataSe": "piv-card-button",
42
+ "dataSe": "piv-card-button social-auth-facebook-button",
43
43
  "iconAlt": "",
44
44
  "onClick": [Function],
45
45
  "step": "piv-idp",
@@ -22,7 +22,6 @@ Object {
22
22
  },
23
23
  Object {
24
24
  "contentType": "subtitle",
25
- "noMargin": true,
26
25
  "options": Object {
27
26
  "content": "oie.password.reset.verification",
28
27
  },
@@ -78,7 +77,6 @@ Object {
78
77
  },
79
78
  Object {
80
79
  "contentType": "subtitle",
81
- "noMargin": true,
82
80
  "options": Object {
83
81
  "content": "oie.password.reset.verification",
84
82
  },
@@ -134,7 +132,6 @@ Object {
134
132
  },
135
133
  Object {
136
134
  "contentType": "subtitle",
137
- "noMargin": true,
138
135
  "options": Object {
139
136
  "content": "oie.select.authenticators.verify.subtitle",
140
137
  },