@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
@@ -11,9 +11,7 @@
11
11
  */
12
12
 
13
13
  import { SelectChangeEvent } from '@mui/material';
14
- import {
15
- Box, FormControl, InputLabel, Select as MuiSelect, Typography,
16
- } from '@okta/odyssey-react-mui';
14
+ import { NativeSelect } from '@okta/odyssey-react-mui';
17
15
  import { IdxOption } from '@okta/okta-auth-js/types/lib/idx/types/idx-js';
18
16
  import { h } from 'preact';
19
17
 
@@ -23,8 +21,7 @@ import {
23
21
  UISchemaElementComponent,
24
22
  UISchemaElementComponentWithValidationProps,
25
23
  } from '../../types';
26
- import { getTranslation } from '../../util';
27
- import FieldLevelMessageContainer from '../FieldLevelMessageContainer';
24
+ import { buildFieldLevelErrorMessages, getTranslation } from '../../util';
28
25
  import { withFormValidationState } from '../hocs';
29
26
 
30
27
  const Select: UISchemaElementComponent<UISchemaElementComponentWithValidationProps> = ({
@@ -32,14 +29,13 @@ const Select: UISchemaElementComponent<UISchemaElementComponentWithValidationPro
32
29
  errors,
33
30
  handleChange,
34
31
  handleBlur,
35
- describedByIds,
36
32
  }) => {
37
33
  const value = useValue(uischema);
38
34
  const { loading } = useWidgetContext();
39
- const { focus, translations = [], showAsterisk } = uischema;
35
+ const { focus, translations = [] } = uischema;
40
36
  const label = getTranslation(translations, 'label');
41
37
  const emptyOptionLabel = getTranslation(translations, 'empty-option-label');
42
- const optionalLabel = getTranslation(translations, 'optionalLabel');
38
+ const { errorMessage, errorMessageList } = buildFieldLevelErrorMessages(errors);
43
39
 
44
40
  const {
45
41
  attributes,
@@ -50,8 +46,8 @@ const Select: UISchemaElementComponent<UISchemaElementComponentWithValidationPro
50
46
  },
51
47
  customOptions,
52
48
  } = uischema.options;
49
+ const { autocomplete } = attributes || {};
53
50
  const focusRef = useAutoFocus<HTMLSelectElement>(focus);
54
- const hasErrors = typeof errors !== 'undefined';
55
51
 
56
52
  const getOptions = (): IdxOption[] | undefined => {
57
53
  if (Array.isArray(customOptions) || Array.isArray(options)) {
@@ -67,93 +63,50 @@ const Select: UISchemaElementComponent<UISchemaElementComponentWithValidationPro
67
63
  };
68
64
 
69
65
  return (
70
- <FormControl
71
- disabled={loading}
72
- error={hasErrors}
66
+ <NativeSelect
67
+ autoCompleteType={autocomplete}
68
+ errorMessage={errorMessage}
69
+ errorMessageList={errorMessageList}
70
+ id={name}
71
+ inputRef={focusRef}
72
+ isDisabled={loading}
73
+ isOptional={required === false}
74
+ label={label}
75
+ onChange={(e: SelectChangeEvent<string>) => {
76
+ const selectTarget = (
77
+ e?.target as SelectChangeEvent['target'] & { value: string; name: string; }
78
+ );
79
+ handleChange?.(selectTarget.value);
80
+ }}
81
+ onBlur={(e: SelectChangeEvent<string>) => {
82
+ const selectTarget = (
83
+ e?.target as SelectChangeEvent['target'] & { value: string; name: string; }
84
+ );
85
+ handleBlur?.(selectTarget.value);
86
+ }}
87
+ testId={name}
88
+ value={value as string ?? ''}
73
89
  >
74
- <InputLabel
75
- htmlFor={name}
76
- // To prevent asterisk from shifting far right
77
- sx={{
78
- justifyContent: showAsterisk ? 'flex-start' : undefined,
79
- position: 'static',
80
- }}
81
- >
82
- {label}
83
- {showAsterisk && (
84
- <Box
85
- component="span"
86
- sx={(theme) => ({
87
- marginInlineStart: theme.spacing(1),
88
- marginInlineEnd: theme.spacing(1),
89
- })}
90
- className="no-translate"
91
- aria-hidden
92
- >
93
- *
94
- </Box>
95
- )}
96
- {required === false && (
97
- <Typography
98
- variant="subtitle1"
99
- sx={{ whiteSpace: 'nowrap' }}
90
+ {
91
+ [
92
+ <option
93
+ value=""
94
+ key="empty"
100
95
  >
101
- {optionalLabel}
102
- </Typography>
103
- )}
104
- </InputLabel>
105
- <MuiSelect
106
- native
107
- variant="standard"
108
- onChange={(e: SelectChangeEvent<string>) => {
109
- const selectTarget = (
110
- e?.target as SelectChangeEvent['target'] & { value: string; name: string; }
111
- );
112
- handleChange?.(selectTarget.value);
113
- }}
114
- onBlur={(e: SelectChangeEvent<string>) => {
115
- const selectTarget = (
116
- e?.target as SelectChangeEvent['target'] & { value: string; name: string; }
117
- );
118
- handleBlur?.(selectTarget.value);
119
- }}
120
- inputRef={focusRef}
121
- value={value as string}
122
- inputProps={{
123
- 'data-se': name,
124
- 'aria-describedby': describedByIds,
125
- name,
126
- id: name,
127
- ...attributes,
128
- }}
129
- >
130
- {
131
- [
96
+ {emptyOptionLabel}
97
+ </option>,
98
+ ].concat(
99
+ getOptions()?.map((option: IdxOption) => (
132
100
  <option
133
- value=""
134
- key="empty"
101
+ key={option.value}
102
+ value={option.value as string}
135
103
  >
136
- {emptyOptionLabel}
137
- </option>,
138
- ].concat(
139
- getOptions()?.map((option: IdxOption) => (
140
- <option
141
- key={option.value}
142
- value={option.value as string}
143
- >
144
- {option.label}
145
- </option>
146
- )) || [],
147
- )
148
- }
149
- </MuiSelect>
150
- {hasErrors && (
151
- <FieldLevelMessageContainer
152
- messages={errors}
153
- fieldName={name}
154
- />
155
- )}
156
- </FormControl>
104
+ {option.label}
105
+ </option>
106
+ )) || [],
107
+ )
108
+ }
109
+ </NativeSelect>
157
110
  );
158
111
  };
159
112
 
@@ -10,17 +10,18 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { Box, CircularProgress } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
+ import { CircularProgress } from '@okta/odyssey-react-mui';
14
15
  import { FunctionComponent, h } from 'preact';
15
16
 
16
17
  import { SpinnerElement } from '../../types';
17
18
  import { loc } from '../../util';
18
19
 
19
- type SpinnerProps = { dataSe?: string; color?: string; };
20
+ type SpinnerProps = { dataSe?: string; };
20
21
  const Spinner: FunctionComponent<SpinnerProps | SpinnerElement> = (
21
22
  props,
22
23
  ) => {
23
- const { dataSe = undefined, color = undefined } = 'type' in props
24
+ const { dataSe = undefined } = 'type' in props
24
25
  ? {}
25
26
  : props as SpinnerProps;
26
27
  return (
@@ -31,13 +32,10 @@ const Spinner: FunctionComponent<SpinnerProps | SpinnerElement> = (
31
32
  alignItems="center"
32
33
  >
33
34
  <CircularProgress
34
- id={dataSe}
35
- data-se={dataSe}
35
+ testId={dataSe}
36
36
  // Using loc here because this component is not only used by transformers
37
37
  // but also directly in widget component
38
- aria-label={loc('processing.alt.text', 'login')}
39
- aria-valuetext={loc('processing.alt.text', 'login')}
40
- sx={{ color }}
38
+ ariaLabel={loc('processing.alt.text', 'login')}
41
39
  />
42
40
  </Box>
43
41
  );
@@ -50,16 +50,12 @@ const StepperButton: UISchemaElementComponent<{
50
50
  onClick={handleClick}
51
51
  variant={variant ?? 'primary'}
52
52
  type={type ?? 'button'}
53
- fullWidth
54
- ref={focusRef}
55
- sx={{
56
- whiteSpace: 'normal',
57
- }}
58
- startIcon={loading && <Spinner color="white" />}
59
- aria-describedby={ariaDescribedBy}
60
- >
61
- {label}
62
- </Button>
53
+ isFullWidth
54
+ buttonRef={focusRef}
55
+ startIcon={loading && <Spinner />}
56
+ ariaDescribedBy={ariaDescribedBy}
57
+ label={label}
58
+ />
63
59
  );
64
60
  };
65
61
 
@@ -10,7 +10,7 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { Link as LinkMui } from '@okta/odyssey-react-mui';
13
+ import { Link as LinkMui } from '@mui/material';
14
14
  import { h } from 'preact';
15
15
 
16
16
  import { useStepperContext, useWidgetContext } from '../../contexts';
@@ -10,13 +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
- FormControl,
15
- FormControlLabel,
16
- FormLabel,
17
- Radio,
18
- RadioGroup,
19
- } from '@okta/odyssey-react-mui';
13
+ import { Radio, RadioGroup } from '@okta/odyssey-react-mui';
20
14
  import { IdxOption } from '@okta/okta-auth-js/types/lib/idx/types/idx-js';
21
15
  import { h } from 'preact';
22
16
  import { useState } from 'preact/hooks';
@@ -38,7 +32,6 @@ const StepperRadio: UISchemaElementComponent<{
38
32
  const {
39
33
  label = '',
40
34
  focus,
41
- ariaDescribedBy,
42
35
  options: {
43
36
  name,
44
37
  customOptions,
@@ -52,7 +45,6 @@ const StepperRadio: UISchemaElementComponent<{
52
45
  return defaultValue(widgetContext, stepIndex);
53
46
  });
54
47
  const focusRef = useAutoFocus<HTMLInputElement>(focus);
55
- const labelId = `${name}-label`;
56
48
 
57
49
  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
58
50
  const stepIdx = customOptions.findIndex((opt) => opt.value === e.currentTarget.value);
@@ -71,40 +63,27 @@ const StepperRadio: UISchemaElementComponent<{
71
63
  };
72
64
 
73
65
  return (
74
- <FormControl component="fieldset">
75
- {label && (<FormLabel id={labelId}>{label}</FormLabel>)}
76
- <RadioGroup
77
- name={name}
78
- value={value as string}
79
- onChange={handleChange}
80
- // eslint-disable-next-line react/jsx-props-no-spreading
81
- {...(label && { 'aria-labelledby': labelId })}
82
- aria-describedby={ariaDescribedBy}
83
- >
84
- {
85
- customOptions?.map((item: IdxOption, index) => (
86
- <FormControlLabel
87
- control={(
88
- <Radio
89
- sx={(theme) => ({
90
- marginInlineEnd: theme.spacing(2),
91
- })}
92
- />
93
- )}
94
- key={item.value}
95
- value={item.value}
96
- label={item.label}
97
- disabled={loading}
98
- sx={{
99
- gap: 0,
100
- }}
101
- // eslint-disable-next-line react/jsx-props-no-spreading
102
- {...(index === 0 && { inputRef: focusRef } )}
103
- />
104
- ))
105
- }
106
- </RadioGroup>
107
- </FormControl>
66
+ <RadioGroup
67
+ id={name}
68
+ label={label}
69
+ name={name}
70
+ onChange={handleChange}
71
+ testId={name}
72
+ value={value as string ?? ''}
73
+ >
74
+ {
75
+ customOptions?.map((item: IdxOption, index: number) => (
76
+ <Radio
77
+ isDisabled={loading}
78
+ key={item.value}
79
+ label={item.label}
80
+ value={typeof item.value === 'string' ? item.value : ''}
81
+ // eslint-disable-next-line react/jsx-props-no-spreading
82
+ {...(index === 0 && { inputFocusRef: focusRef })}
83
+ />
84
+ ))
85
+ }
86
+ </RadioGroup>
108
87
  );
109
88
  };
110
89
 
@@ -10,7 +10,7 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { Box } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
14
  import { h } from 'preact';
15
15
 
16
16
  import { useWidgetContext } from '../../contexts';
@@ -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 { Box, Typography } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
+ import { Typography } from '@okta/odyssey-react-mui';
14
15
  import { h } from 'preact';
15
16
  import { useEffect, useRef } from 'preact/hooks';
16
17
 
@@ -20,7 +21,7 @@ import { TitleElement, UISchemaElementComponent } from '../../types';
20
21
  const Title: UISchemaElementComponent<{
21
22
  uischema: TitleElement
22
23
  }> = (
23
- { uischema: { id, options } },
24
+ { uischema: { options } },
24
25
  ) => {
25
26
  const titleRef = useRef<HTMLTitleElement>(null);
26
27
  const { widgetProps } = useWidgetContext();
@@ -39,15 +40,10 @@ const Title: UISchemaElementComponent<{
39
40
  justifyContent="flex-start"
40
41
  >
41
42
  <Typography
42
- id={id}
43
43
  component="h2"
44
44
  variant="h4"
45
- data-se="o-form-head"
46
- ref={titleRef}
47
- tabIndex={-1}
48
- sx={{
49
- outline: 'none',
50
- }}
45
+ testId="o-form-head"
46
+ typographyRef={titleRef}
51
47
  >
52
48
  {options.content}
53
49
  </Typography>
@@ -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 { Box, Button } from '@okta/odyssey-react-mui';
13
+ import { Box } from '@mui/material';
14
+ import { Button, useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
14
15
  import { IdxActionParams } from '@okta/okta-auth-js';
15
16
  import { h } from 'preact';
16
17
  import { useEffect, useState } from 'preact/hooks';
@@ -34,6 +35,7 @@ const WebAuthNSubmit: UISchemaElementComponent<{
34
35
  const btnLabel = getTranslation(translations, 'label');
35
36
  const btnRetryLabel = getTranslation(translations, 'retry-label');
36
37
 
38
+ const tokens = useOdysseyDesignTokens();
37
39
  const { setMessage, loading } = useWidgetContext();
38
40
  const onSubmitHandler = useOnSubmit();
39
41
  const [waiting, setWaiting] = useState<boolean>(false);
@@ -84,20 +86,19 @@ const WebAuthNSubmit: UISchemaElementComponent<{
84
86
 
85
87
  return (
86
88
  <Box
87
- marginBlockEnd={4}
89
+ marginBlockEnd={tokens.Spacing4}
88
90
  display={showLoading ? 'flex' : undefined}
89
91
  justifyContent={showLoading ? 'center' : undefined}
90
92
  >
91
93
  <Button
92
- disabled={showLoading}
93
- data-se="button"
94
+ isDisabled={showLoading}
95
+ testId="button"
94
96
  onClick={handleClick}
95
97
  variant="primary"
96
- aria-describedby={ariaDescribedBy}
97
- fullWidth
98
- >
99
- {label}
100
- </Button>
98
+ ariaDescribedBy={ariaDescribedBy}
99
+ isFullWidth
100
+ label={label}
101
+ />
101
102
  </Box>
102
103
  );
103
104
  };
@@ -13,42 +13,37 @@
13
13
  import {
14
14
  GlobalStyles as MuiGlobalStyles,
15
15
  GlobalStylesProps,
16
- Theme,
17
16
  } from '@mui/material';
17
+ import { DesignTokens, useOdysseyDesignTokens } from '@okta/odyssey-react-mui';
18
18
  import { FunctionComponent, h } from 'preact';
19
19
 
20
20
  // TODO we could scope these to just widget container
21
- const svgStyles = (theme: Theme): GlobalStylesProps['styles'] => ({
21
+ const svgStyles = (tokens: DesignTokens): GlobalStylesProps['styles'] => ({
22
22
  '.siwFillPrimary': {
23
- fill: theme.palette.primary.main,
23
+ fill: tokens.PalettePrimaryMain,
24
24
  },
25
25
  '.siwFillPrimaryDark': {
26
- fill: theme.palette.primary.dark,
26
+ fill: tokens.PalettePrimaryDark,
27
27
  },
28
28
  '.siwFillSecondary': {
29
- fill: theme.palette.primary.light,
30
- },
31
- '.siwFillBg': {
32
- fill: theme.palette.grey[50],
33
- },
34
- '.siwIconFillPrimary': {
35
- fill: theme.palette.primary.main,
36
- },
37
- '.siwIconStrokePrimary': {
38
- stroke: theme.palette.primary.main,
29
+ fill: tokens.PalettePrimaryLight,
39
30
  },
40
31
  '.siwIconFillPrimaryDark': {
41
- fill: theme.palette.primary.dark,
32
+ fill: tokens.PalettePrimaryDark,
42
33
  },
43
34
  '.siwIconFillSecondary': {
44
- fill: theme.palette.primary.light,
35
+ fill: tokens.PalettePrimaryLight,
45
36
  },
46
37
  });
47
38
 
48
- const GlobalStyles: FunctionComponent = () => (
49
- <MuiGlobalStyles
50
- styles={(theme) => svgStyles(theme)}
51
- />
52
- );
39
+ const GlobalStyles: FunctionComponent = () => {
40
+ const tokens = useOdysseyDesignTokens();
41
+
42
+ return (
43
+ <MuiGlobalStyles
44
+ styles={svgStyles(tokens)}
45
+ />
46
+ );
47
+ };
53
48
 
54
49
  export default GlobalStyles;
@@ -10,12 +10,11 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- // NOTE: Do not remove this import of style.css!
13
+ // NOTE: Do not remove this import of style.scss!
14
14
  // We need to emit a CSS file, even if it's empty, to prevent a 404 on the Okta-hosted login page.
15
- import './style.css';
15
+ import './style.scss';
16
16
 
17
- import { ScopedCssBaseline } from '@mui/material';
18
- import { MuiThemeProvider } from '@okta/odyssey-react-mui';
17
+ import { OdysseyProvider, TranslationOverrides } from '@okta/odyssey-react-mui';
19
18
  import {
20
19
  AuthApiError,
21
20
  AuthenticatorKey,
@@ -63,6 +62,7 @@ import {
63
62
  extractPageTitle,
64
63
  getLanguageCode,
65
64
  getLanguageDirection,
65
+ getOdysseyTranslationOverrides,
66
66
  isAndroidOrIOS,
67
67
  isAuthClientSet,
68
68
  isConfigRegisterFlow,
@@ -73,12 +73,12 @@ import {
73
73
  triggerEmailVerifyCallback,
74
74
  } from '../../util';
75
75
  import { getEventContext } from '../../util/getEventContext';
76
- import { createTheme } from '../../util/theme';
76
+ import { stylisPlugins } from '../../util/stylisPlugins';
77
+ import { createThemeAndTokens } from '../../util/theme';
77
78
  import AuthContainer from '../AuthContainer/AuthContainer';
78
79
  import AuthContent from '../AuthContent/AuthContent';
79
80
  import AuthHeader from '../AuthHeader/AuthHeader';
80
81
  import ConsentHeader from '../ConsentHeader';
81
- import CustomPluginsOdysseyCacheProvider from '../CustomPluginsOdysseyCacheProvider';
82
82
  import Form from '../Form';
83
83
  import Spinner from '../Spinner';
84
84
  import GlobalStyles from './GlobalStyles';
@@ -132,12 +132,21 @@ export const Widget: FunctionComponent<WidgetProps> = (widgetProps) => {
132
132
  const languageCode = getLanguageCode(widgetProps);
133
133
  const languageDirection = getLanguageDirection(languageCode);
134
134
  const { stateHandle, unsetStateHandle } = useStateHandle(widgetProps);
135
-
136
- // merge themes
137
- const theme = useMemo(() => mergeThemes(
138
- createTheme(brandColors, customTheme?.tokens ?? {}),
139
- { direction: languageDirection },
140
- ), [brandColors, customTheme, languageDirection]);
135
+ const [odyTranslationOverrides, setOdyTranslationOverrides] = useState<
136
+ TranslationOverrides<string> | undefined>();
137
+ // Odyssey language codes use '_' instead of '-' (e.g. zh-CN -> zh_CN)
138
+ const odyLanguageCode: string = languageCode.replace('-', '_');
139
+
140
+ const { theme, tokens } = useMemo(() => {
141
+ const { themeOverride, tokensOverride } = createThemeAndTokens(
142
+ brandColors,
143
+ customTheme?.tokens ?? {},
144
+ );
145
+ return {
146
+ theme: mergeThemes(themeOverride, { direction: languageDirection }),
147
+ tokens: tokensOverride,
148
+ };
149
+ }, [brandColors, customTheme, languageDirection]);
141
150
 
142
151
  // on unmount, remove the language
143
152
  useEffect(() => () => {
@@ -150,6 +159,9 @@ export const Widget: FunctionComponent<WidgetProps> = (widgetProps) => {
150
159
  const initLanguage = useCallback(async () => {
151
160
  if (!Bundles.isLoaded(languageCode)) {
152
161
  await loadLanguage(widgetProps);
162
+ setOdyTranslationOverrides({
163
+ [odyLanguageCode]: getOdysseyTranslationOverrides(),
164
+ });
153
165
  }
154
166
  // eslint-disable-next-line react-hooks/exhaustive-deps
155
167
  }, []);
@@ -493,30 +505,33 @@ export const Widget: FunctionComponent<WidgetProps> = (widgetProps) => {
493
505
  languageDirection,
494
506
  }}
495
507
  >
496
- <CustomPluginsOdysseyCacheProvider nonce={cspNonce}>
497
- <MuiThemeProvider theme={theme}>
498
- <GlobalStyles />
499
- {/* the style is to allow the widget to inherit the parent's bg color */}
500
- <ScopedCssBaseline sx={{ backgroundColor: 'inherit' }}>
501
- <AuthContainer hide={hide}>
502
- <AuthHeader
503
- logo={logo}
504
- logoText={logoText}
505
- brandName={brandName}
506
- authCoinProps={buildAuthCoinProps(idxTransaction)}
507
- />
508
- <AuthContent>
509
- {isConsentStep(idxTransaction) && <ConsentHeader />}
510
- {
511
- uischema.elements.length > 0
512
- ? <Form uischema={uischema as UISchemaLayout} />
513
- : <Spinner />
514
- }
515
- </AuthContent>
516
- </AuthContainer>
517
- </ScopedCssBaseline>
518
- </MuiThemeProvider>
519
- </CustomPluginsOdysseyCacheProvider>
508
+ <OdysseyProvider
509
+ themeOverride={theme}
510
+ designTokensOverride={tokens}
511
+ languageCode={odyLanguageCode}
512
+ translationOverrides={odyTranslationOverrides}
513
+ nonce={cspNonce}
514
+ stylisPlugins={stylisPlugins}
515
+ >
516
+ <GlobalStyles />
517
+ {/* the style is to allow the widget to inherit the parent's bg color */}
518
+ <AuthContainer hide={hide}>
519
+ <AuthHeader
520
+ logo={logo}
521
+ logoText={logoText}
522
+ brandName={brandName}
523
+ authCoinProps={buildAuthCoinProps(idxTransaction)}
524
+ />
525
+ <AuthContent>
526
+ {isConsentStep(idxTransaction) && <ConsentHeader />}
527
+ {
528
+ uischema.elements.length > 0
529
+ ? <Form uischema={uischema as UISchemaLayout} />
530
+ : <Spinner />
531
+ }
532
+ </AuthContent>
533
+ </AuthContainer>
534
+ </OdysseyProvider>
520
535
  </WidgetContextProvider>
521
536
  );
522
537
  };