@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
@@ -10,15 +10,8 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { SelectChangeEvent } from '@mui/material';
14
- import {
15
- Box,
16
- InputAdornment,
17
- InputBase,
18
- InputLabel,
19
- Select,
20
- Typography,
21
- } from '@okta/odyssey-react-mui';
13
+ import { Box, SelectChangeEvent } from '@mui/material';
14
+ import { NativeSelect, TextField, useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
22
15
  import { IdxMessage } from '@okta/okta-auth-js';
23
16
  import { h } from 'preact';
24
17
  import {
@@ -36,8 +29,7 @@ import {
36
29
  UISchemaElementComponent,
37
30
  UISchemaElementComponentWithValidationProps,
38
31
  } from '../../types';
39
- import { getDefaultCountryCode, getTranslation } from '../../util';
40
- import FieldLevelMessageContainer from '../FieldLevelMessageContainer';
32
+ import { buildFieldLevelErrorMessages, getDefaultCountryCode, getTranslation } from '../../util';
41
33
  import { withFormValidationState } from '../hocs';
42
34
 
43
35
  const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithValidationProps> = ({
@@ -45,7 +37,6 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
45
37
  setTouched,
46
38
  errors,
47
39
  handleBlur,
48
- describedByIds,
49
40
  }) => {
50
41
  const {
51
42
  data,
@@ -57,8 +48,6 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
57
48
  const {
58
49
  translations = [],
59
50
  focus,
60
- ariaDescribedBy,
61
- showAsterisk,
62
51
  options: {
63
52
  inputMeta: {
64
53
  name: fieldName,
@@ -69,10 +58,10 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
69
58
  attributes,
70
59
  },
71
60
  } = uischema;
61
+ const { autocomplete, inputmode } = attributes || {};
72
62
  const mainLabel = getTranslation(translations, 'label');
73
63
  const extensionLabel = getTranslation(translations, 'extension');
74
64
  const countryLabel = getTranslation(translations, 'country');
75
- const optionalLabel = getTranslation(translations, 'optionalLabel');
76
65
 
77
66
  const { features: { disableAutocomplete } = {} } = widgetProps;
78
67
  const countries = CountryUtil.getCountries() as Record<string, string>;
@@ -86,7 +75,8 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
86
75
  const showExtension = methodType === 'voice';
87
76
  const onChangeHandler = useOnChange(uischema);
88
77
  const focusRef = useAutoFocus<HTMLSelectElement>(focus);
89
- const phoneHasErrors = typeof errors !== 'undefined';
78
+ const { errorMessage, errorMessageList } = buildFieldLevelErrorMessages(errors);
79
+ const tokens = useOdysseyDesignTokens();
90
80
 
91
81
  const formatPhone = (
92
82
  phoneNumber: string,
@@ -101,17 +91,19 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
101
91
 
102
92
  const validate = useCallback((dataBag: FormBag['data']) => {
103
93
  const fullPhoneNumber = dataBag[fieldName];
104
- const errorMessage: IdxMessage = {
94
+ const blankFieldErrorMessage: IdxMessage = {
105
95
  class: 'ERROR',
106
96
  message: '',
107
97
  i18n: { key: 'model.validation.field.blank' },
108
98
  };
109
99
  const isValid = !!fullPhoneNumber && !!phone;
110
- return isValid ? undefined : [errorMessage];
100
+ return isValid ? undefined : [blankFieldErrorMessage];
111
101
  }, [phone, fieldName]);
112
102
 
113
103
  useEffect(() => {
114
- dataSchemaRef.current![fieldName].validate = validate;
104
+ if (dataSchemaRef.current) {
105
+ dataSchemaRef.current[fieldName].validate = validate;
106
+ }
115
107
  }, [dataSchemaRef, fieldName, messages.value, validate]);
116
108
 
117
109
  useEffect(() => {
@@ -129,28 +121,17 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
129
121
  const renderExtension = () => (
130
122
  showExtension && (
131
123
  <Box width={0.25}>
132
- <InputLabel
133
- htmlFor="phoneExtension"
134
- // label should remain in rtl format if rtl language is set
135
- dir={languageDirection}
136
- >
137
- {extensionLabel}
138
- </InputLabel>
139
- <InputBase
140
- value={extension}
141
- type="text"
142
- name="extension"
124
+ <TextField
125
+ autoCompleteType={disableAutocomplete ? 'off' : 'tel-extension'}
143
126
  id="phoneExtension"
144
- dir="ltr"
145
- disabled={loading}
127
+ isDisabled={loading}
128
+ label={extensionLabel ?? ''}
129
+ name="extension"
146
130
  onChange={(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
147
131
  setExtension(e.currentTarget.value);
148
132
  }}
149
- inputProps={{
150
- 'data-se': 'extension',
151
- autocomplete: disableAutocomplete ? 'off' : 'tel-extension',
152
- 'aria-describedby': ariaDescribedBy,
153
- }}
133
+ testId="extension"
134
+ value={extension}
154
135
  />
155
136
  </Box>
156
137
  )
@@ -158,53 +139,20 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
158
139
 
159
140
  const renderCountrySelect = () => (
160
141
  <Box marginBlockEnd={4}>
161
- <InputLabel
162
- id="countryLabel"
163
- htmlFor="country"
164
- // To prevent asterisk from shifting far right
165
- sx={{ justifyContent: showAsterisk ? 'flex-start' : undefined }}
166
- >
167
- {countryLabel}
168
- {showAsterisk && (
169
- <Box
170
- component="span"
171
- sx={(theme) => ({
172
- marginInlineStart: theme.spacing(1),
173
- marginInlineEnd: theme.spacing(1),
174
- })}
175
- className="no-translate"
176
- aria-hidden
177
- >
178
- *
179
- </Box>
180
- )}
181
- {required === false && (
182
- <Typography
183
- variant="subtitle1"
184
- sx={{ whiteSpace: 'nowrap' }}
185
- >
186
- {optionalLabel}
187
- </Typography>
188
- )}
189
- </InputLabel>
190
- <Select
142
+ <NativeSelect
143
+ autoCompleteType={disableAutocomplete ? 'off' : 'tel-country-code'}
191
144
  id="country"
192
- labelId="countryLabel"
193
- disabled={loading}
194
- variant="standard"
195
- native
145
+ inputRef={focusRef}
146
+ isDisabled={loading}
147
+ isOptional={required === false}
148
+ label={countryLabel}
196
149
  onChange={(e: SelectChangeEvent<string>) => {
197
150
  const selectTarget = (
198
151
  e?.target as SelectChangeEvent['target'] & { value: string; name: string; }
199
152
  );
200
153
  setPhoneCode(`+${CountryUtil.getCallingCodeForCountry(selectTarget.value)}`);
201
154
  }}
202
- inputRef={focusRef}
203
- inputProps={{
204
- 'data-se': 'country',
205
- autocomplete: disableAutocomplete ? 'off' : 'tel-country-code',
206
- 'aria-describedby': ariaDescribedBy,
207
- }}
155
+ testId="country"
208
156
  >
209
157
  {
210
158
  Object.entries(countries).map(([code, name]) => (
@@ -217,7 +165,7 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
217
165
  </option>
218
166
  ))
219
167
  }
220
- </Select>
168
+ </NativeSelect>
221
169
  </Box>
222
170
  );
223
171
 
@@ -227,78 +175,46 @@ const PhoneAuthenticator: UISchemaElementComponent<UISchemaElementComponentWithV
227
175
  <Box
228
176
  display="flex"
229
177
  justifyContent="space-between"
230
- dir="ltr"
178
+ flexWrap="wrap"
179
+ flexDirection={languageDirection === 'rtl' ? 'row-reverse' : 'row'}
231
180
  >
232
- <Box width={showExtension ? 0.7 : 1}>
233
- <InputLabel
234
- htmlFor={fieldName}
235
- // To prevent asterisk from shifting far right
236
- sx={{ justifyContent: showAsterisk ? 'flex-start' : undefined }}
237
- // label should remain in rtl format if rtl language is set
238
- dir={languageDirection}
239
- >
240
- {mainLabel}
241
- {showAsterisk && (
242
- <Box
243
- component="span"
244
- sx={(theme) => ({
245
- marginInlineStart: theme.spacing(1),
246
- marginInlineEnd: theme.spacing(1),
247
- })}
248
- className="no-translate"
249
- aria-hidden
250
- >
251
- *
252
- </Box>
253
- )}
254
- {required === false && (
255
- <Typography variant="subtitle1">{optionalLabel}</Typography>
256
- )}
257
- </InputLabel>
258
- <InputBase
259
- type="tel"
260
- name={fieldName}
181
+ <Box
182
+ width={showExtension ? 0.7 : 1}
183
+ sx={{
184
+ marginRight: showExtension ? tokens.Spacing2 : tokens.Spacing0,
185
+ }}
186
+ >
187
+ <TextField
188
+ autoCompleteType={autocomplete}
189
+ errorMessage={errorMessage}
190
+ errorMessageList={errorMessageList}
261
191
  id={fieldName}
262
- error={phoneHasErrors}
263
- disabled={loading}
264
- dir="ltr"
192
+ inputMode={inputmode}
193
+ isDisabled={loading}
194
+ isFullWidth
195
+ isOptional={required === false}
196
+ label={mainLabel ?? ''}
197
+ name={fieldName}
198
+ onBlur={(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
199
+ const formattedPhone = formatPhone(e?.currentTarget?.value, phoneCode, extension);
200
+ handleBlur?.(formattedPhone);
201
+ }}
265
202
  onChange={(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
266
203
  // Set new phone value without phone code
267
204
  setPhone(e.currentTarget.value);
268
205
  setPhoneChanged(true);
269
206
  }}
270
- onBlur={(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
271
- const formattedPhone = formatPhone(e?.currentTarget?.value, phoneCode, extension);
272
- handleBlur?.(formattedPhone);
273
- }}
274
207
  startAdornment={(
275
- <InputAdornment
208
+ <Box
276
209
  component="span"
277
- position="start"
278
- className="no-translate"
279
- sx={(theme) => ({
280
- // physical properties OK because parent InputBase component
281
- // is always set to "ltr"
282
- marginRight: theme.spacing(2),
283
- marginLeft: 0,
284
- })}
210
+ translate="no"
285
211
  >
286
212
  {phoneCode}
287
- </InputAdornment>
213
+ </Box>
288
214
  )}
289
- fullWidth
290
- inputProps={{
291
- 'data-se': fieldName,
292
- 'aria-describedby': describedByIds,
293
- ...attributes,
294
- }}
215
+ testId={fieldName}
216
+ type="tel"
295
217
  />
296
- {phoneHasErrors && (
297
- <FieldLevelMessageContainer
298
- messages={errors}
299
- fieldName={fieldName}
300
- />
301
- )}
302
218
  </Box>
303
219
  {renderExtension()}
304
220
  </Box>
@@ -10,12 +10,13 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import * as Tokens from '@okta/odyssey-design-tokens';
14
- import { Box } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
+ import { useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
15
15
  import { h } from 'preact';
16
16
 
17
17
  import { QRCodeElement, UISchemaElementComponent } from '../../types';
18
18
  import { getTranslation } from '../../util';
19
+ import Image from '../Image';
19
20
 
20
21
  const QRCode: UISchemaElementComponent<{
21
22
  uischema: QRCodeElement
@@ -24,33 +25,39 @@ const QRCode: UISchemaElementComponent<{
24
25
  }) => {
25
26
  const { translations = [], options: { data } } = uischema;
26
27
  const label = getTranslation(translations, 'label');
28
+ const tokens = useOdysseyDesignTokens();
29
+
27
30
  return (
28
31
  <Box
29
- className="qrContainer"
30
- sx={(theme) => ({
31
- marginBlockStart: theme.spacing(4),
32
- marginBlockEnd: theme.spacing(4),
33
- marginInlineStart: theme.spacing(0),
34
- marginInlineEnd: theme.spacing(0),
32
+ data-se="qrContainer"
33
+ sx={{
34
+ marginBlockStart: tokens.Spacing5,
35
+ marginBlockEnd: tokens.Spacing5,
36
+ marginInlineStart: tokens.Spacing1,
37
+ marginInlineEnd: tokens.Spacing1,
35
38
  display: 'flex',
36
39
  flexDirection: 'column',
37
40
  alignItems: 'center',
38
- })}
41
+ }}
39
42
  >
40
43
  <Box
41
- as="img"
42
- className="qrImg"
43
44
  sx={{
44
- width: '224px',
45
- height: '224px',
46
- borderWidth: Tokens.BorderWidthBase,
47
- borderStyle: Tokens.BorderStyleBase,
48
- borderColor: Tokens.ColorBorderDisplay,
49
- borderRadius: Tokens.BorderRadiusBase,
45
+ display: 'flex',
46
+ overflow: 'hidden',
47
+ borderWidth: tokens.BorderWidthMain,
48
+ borderStyle: tokens.BorderStyleMain,
49
+ borderColor: tokens.BorderColorDisplay,
50
+ borderRadius: tokens.BorderRadiusMain,
50
51
  }}
51
- src={data}
52
- alt={label}
53
- />
52
+ >
53
+ <Image
54
+ src={data}
55
+ alt={label ?? ''}
56
+ width="224px"
57
+ height="224px"
58
+ testId="qrImg"
59
+ />
60
+ </Box>
54
61
  </Box>
55
62
  );
56
63
  };
@@ -10,15 +10,7 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {
14
- Box,
15
- FormControl,
16
- FormControlLabel,
17
- FormLabel,
18
- Radio as RadioMui,
19
- RadioGroup,
20
- Typography,
21
- } from '@okta/odyssey-react-mui';
13
+ import { Radio as OdyRadio, RadioGroup } from '@okta/odyssey-react-mui';
22
14
  import { IdxOption } from '@okta/okta-auth-js/types/lib/idx/types/idx-js';
23
15
  import { h } from 'preact';
24
16
 
@@ -29,8 +21,7 @@ import {
29
21
  UISchemaElementComponent,
30
22
  UISchemaElementComponentWithValidationProps,
31
23
  } from '../../types';
32
- import { getTranslation } from '../../util';
33
- import FieldLevelMessageContainer from '../FieldLevelMessageContainer';
24
+ import { buildFieldLevelErrorMessages, getTranslation } from '../../util';
34
25
  import { withFormValidationState } from '../hocs';
35
26
 
36
27
  const Radio: UISchemaElementComponent<UISchemaElementComponentWithValidationProps> = ({
@@ -38,7 +29,6 @@ const Radio: UISchemaElementComponent<UISchemaElementComponentWithValidationProp
38
29
  errors,
39
30
  handleChange,
40
31
  handleBlur,
41
- describedByIds,
42
32
  }) => {
43
33
  const value = useValue(uischema);
44
34
  const { loading } = useWidgetContext();
@@ -53,94 +43,42 @@ const Radio: UISchemaElementComponent<UISchemaElementComponentWithValidationProp
53
43
  customOptions,
54
44
  },
55
45
  focus,
56
- showAsterisk,
57
46
  } = uischema;
58
47
  const label = getTranslation(translations, 'label');
59
- const labelId = `${name}-label`;
60
48
  const optionalLabel = getTranslation(translations, 'optionalLabel');
61
49
  const focusRef = useAutoFocus<HTMLInputElement>(focus);
62
- const hasErrors = typeof errors !== 'undefined';
50
+ const { errorMessage, errorMessageList } = buildFieldLevelErrorMessages(errors);
63
51
 
64
52
  return (
65
- <FormControl
66
- component="fieldset"
67
- error={hasErrors}
53
+ <RadioGroup
54
+ errorMessage={errorMessage}
55
+ errorMessageList={errorMessageList}
56
+ hint={!required ? optionalLabel : undefined}
57
+ id={name}
58
+ label={label ?? ''}
59
+ name={name}
60
+ onChange={(e: ChangeEvent<HTMLInputElement>) => {
61
+ handleChange?.(e.currentTarget.value);
62
+ }}
63
+ testId={name}
64
+ value={value as string ?? ''}
68
65
  >
69
- {label && (
70
- <FormLabel
71
- id={labelId}
72
- // To prevent asterisk from shifting far right
73
- sx={{ display: 'flex', justifyContent: showAsterisk ? 'flex-start' : 'space-between' }}
74
- >
75
- {label}
76
- {showAsterisk && (
77
- <Box
78
- component="span"
79
- sx={(theme) => ({
80
- marginInlineStart: theme.spacing(1),
81
- marginInlineEnd: theme.spacing(1),
82
- })}
83
- className="no-translate"
84
- aria-hidden
85
- >
86
- *
87
- </Box>
88
- )}
89
- {required === false && (
90
- <Typography
91
- variant="subtitle1"
92
- sx={{ whiteSpace: 'nowrap' }}
93
- >
94
- {optionalLabel}
95
- </Typography>
96
- )}
97
- </FormLabel>
98
- )}
99
- <RadioGroup
100
- name={name}
101
- id={name}
102
- data-se={name}
103
- // eslint-disable-next-line react/jsx-props-no-spreading
104
- {...(label && { 'aria-labelledby': labelId })}
105
- aria-describedby={describedByIds}
106
- value={value as string ?? ''}
107
- onChange={(e: ChangeEvent<HTMLInputElement>) => {
108
- handleChange?.(e.currentTarget.value);
109
- }}
110
- >
111
- {
112
- (customOptions ?? options)?.map((item: IdxOption, index: number) => (
113
- <FormControlLabel
114
- control={(
115
- <RadioMui
116
- sx={(theme) => ({
117
- marginInlineEnd: theme.spacing(2),
118
- })}
119
- />
120
- )}
121
- key={item.value}
122
- value={item.value}
123
- label={item.label}
124
- disabled={loading}
125
- onBlur={(e: ChangeEvent<HTMLInputElement>) => {
126
- handleBlur?.(e?.currentTarget?.value);
127
- }}
128
- sx={{
129
- gap: 0,
130
- }}
131
- // eslint-disable-next-line react/jsx-props-no-spreading
132
- {...(index === 0 && { inputRef: focusRef })}
133
- />
134
- ))
135
- }
136
- </RadioGroup>
137
- {hasErrors && (
138
- <FieldLevelMessageContainer
139
- messages={errors}
140
- fieldName={name}
141
- />
142
- )}
143
- </FormControl>
66
+ {
67
+ (customOptions ?? options ?? []).map((item: IdxOption, index: number) => (
68
+ <OdyRadio
69
+ isDisabled={loading}
70
+ key={item.value}
71
+ label={item.label}
72
+ onBlur={(e: ChangeEvent<HTMLInputElement>) => {
73
+ handleBlur?.(e?.currentTarget?.value);
74
+ }}
75
+ value={typeof item.value === 'string' ? item.value : ''}
76
+ // eslint-disable-next-line react/jsx-props-no-spreading
77
+ {...(index === 0 && { inputFocusRef: focusRef })}
78
+ />
79
+ ))
80
+ }
81
+ </RadioGroup>
144
82
  );
145
83
  };
146
84
 
@@ -10,7 +10,8 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { Alert, Box, Link } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
+ import { Callout, Link, useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
14
15
  import { HTMLReactParserOptions } from 'html-react-parser';
15
16
  import { h } from 'preact';
16
17
  import { useEffect, useRef, useState } from 'preact/hooks';
@@ -41,6 +42,7 @@ const ReminderPrompt: UISchemaElementComponent<{
41
42
  } = uischema.options;
42
43
  const onSubmitHandler = useOnSubmit();
43
44
  const parsedContent = useHtmlContentParser(content, uischema.parserOptions);
45
+ const tokens = useOdysseyDesignTokens();
44
46
 
45
47
  const [show, setShow] = useState<boolean>(false);
46
48
  const timerRef = useRef<number | undefined>();
@@ -125,25 +127,20 @@ const ReminderPrompt: UISchemaElementComponent<{
125
127
  );
126
128
  }
127
129
  return (
128
- <Box marginBlockEnd={2}>{parsedContent}</Box>
130
+ <Box marginBlockEnd={tokens.Spacing2}>{parsedContent}</Box>
129
131
  );
130
132
  };
131
133
 
132
134
  return show ? (
133
- <Box marginBlockEnd={4}>
134
- <Alert
135
+ <Box marginBlockEnd={tokens.Spacing4}>
136
+ <Callout
135
137
  severity="warning"
136
- variant="infobox"
137
- sx={{
138
- // TODO: OKTA-534606 - switch to ODS component which has this fix
139
- '& .MuiAlert-message': {
140
- overflow: 'visible',
141
- },
142
- }}
138
+ // visually-hidden severity text is not translated
139
+ translate="no"
143
140
  >
144
141
  {renderAlertContent()}
145
142
  {renderActionLink()}
146
- </Alert>
143
+ </Callout>
147
144
  </Box>
148
145
  ) : null;
149
146
  };
@@ -8,7 +8,7 @@ exports[`ReminderPrompt should show prompt with working link after default timeo
8
8
  class="MuiBox-root emotion-0"
9
9
  >
10
10
  <div
11
- class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-infoboxWarning MuiAlert-infobox emotion-1"
11
+ class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-calloutWarning MuiAlert-callout emotion-1"
12
12
  role="alert"
13
13
  >
14
14
  <div
@@ -29,17 +29,27 @@ exports[`ReminderPrompt should show prompt with working link after default timeo
29
29
  <div
30
30
  class="MuiAlert-message emotion-4"
31
31
  >
32
- <div
32
+ <span
33
33
  class="MuiBox-root emotion-5"
34
+ translate="no"
34
35
  >
35
- Didnt receive the email?
36
- </div>
37
- <a
38
- class="MuiTypography-root MuiTypography-monochrome MuiLink-root MuiLink-underlineAlways emotion-6"
39
- href="javascript:void(0);"
36
+ warning
37
+ </span>
38
+ <div
39
+ class="MuiBox-root emotion-6"
40
40
  >
41
- Send again?
42
- </a>
41
+ <div
42
+ class="MuiBox-root emotion-7"
43
+ >
44
+ Didnt receive the email?
45
+ </div>
46
+ <a
47
+ class="MuiTypography-root MuiTypography-monochrome MuiLink-root MuiLink-underlineAlways emotion-8"
48
+ href="javascript:void(0);"
49
+ >
50
+ Send again?
51
+ </a>
52
+ </div>
43
53
  </div>
44
54
  </div>
45
55
  </div>
@@ -52,7 +62,7 @@ exports[`ReminderPrompt should show prompt with working link after default timeo
52
62
  class="MuiBox-root emotion-0"
53
63
  >
54
64
  <div
55
- class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-infoboxWarning MuiAlert-infobox emotion-1"
65
+ class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-calloutWarning MuiAlert-callout emotion-1"
56
66
  role="alert"
57
67
  >
58
68
  <div
@@ -73,16 +83,26 @@ exports[`ReminderPrompt should show prompt with working link after default timeo
73
83
  <div
74
84
  class="MuiAlert-message emotion-4"
75
85
  >
76
- <div
86
+ <span
77
87
  class="MuiBox-root emotion-5"
88
+ translate="no"
78
89
  >
79
- Didn't receive the email? Click
80
- <a
81
- class="MuiTypography-root MuiTypography-monochrome MuiLink-root MuiLink-underlineAlways send-again emotion-6"
82
- href="#"
90
+ warning
91
+ </span>
92
+ <div
93
+ class="MuiBox-root emotion-6"
94
+ >
95
+ <div
96
+ class="MuiBox-root emotion-6"
83
97
  >
84
- send again
85
- </a>
98
+ Didn't receive the email? Click
99
+ <a
100
+ class="MuiTypography-root MuiTypography-monochrome MuiLink-root MuiLink-underlineAlways send-again emotion-8"
101
+ href="#"
102
+ >
103
+ send again
104
+ </a>
105
+ </div>
86
106
  </div>
87
107
  </div>
88
108
  </div>