@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,319 +10,346 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { ThemeOptions } from '@mui/material';
14
- import { odysseyTheme } from '@okta/odyssey-react-mui';
15
- import chroma from 'chroma-js';
16
- import { set as _set } from 'lodash';
13
+ // Leonardo doesn't have TS support in stable version alpha.13 so types are defined in leonardo.d.ts
14
+ import {
15
+ BackgroundColor, Color, CssColor, Theme,
16
+ } from '@adobe/leonardo-contrast-colors';
17
+ import * as Tokens from '@okta/odyssey-design-tokens';
18
+ import { createOdysseyMuiTheme, DesignTokensOverride, ThemeOptions } from '@okta/odyssey-react-mui';
17
19
 
18
20
  import { BrandColors } from '../types';
19
- import { DESIGN_TOKENS, DesignTokensType } from './designTokens';
21
+ import { isLtrField } from '.';
20
22
  import { mergeThemes } from './mergeThemes';
21
23
 
22
- export type Palette = Partial<{
23
- main: string;
24
- light: string;
25
- lighter: string;
26
- dark: string;
27
- contrastText: string;
28
- }>;
29
-
30
- export type SpacingArgument = number | string;
31
-
32
24
  const WHITE_HEX = '#ffffff';
33
- const BLACK_HEX = '#1d1d21';
25
+ // Odyssey-defined contrast ratios for their WCAG-friendly palettes
26
+ const ODYSSEY_RATIOS = [1.1, 1.31, 1.61, 2.22, 3.32, 4.52, 4.93, 8.72, 11.73, 14.94];
34
27
 
35
- /**
36
- * Determine whether to use BLACK (#1d1d21) or WHITE (#ffffff) based on a color.
37
- * If WHITE vs color has a contrast ratio <4.5:1 this will return BLACK.
38
- * Contrast ratios are symmetrical using the WCAG 2.x algorithm
39
- *
40
- * @param color color to compare against black/white
41
- */
42
- const getInverseTextColor = (color: string): string => (
43
- chroma.contrast(color, WHITE_HEX) >= 4.5 ? WHITE_HEX : BLACK_HEX
44
- );
45
-
46
- /**
47
- * Sets the design token to theme path iff the value is not undefined, i.e.,
48
- * null, false, 0, etc. will be set. Only undefined will be ignored. Paths and
49
- * values are not checked for type safety.
50
- *
51
- * @param obj {Theme} the theme object
52
- * @param path {string} target path
53
- * @param val the value to set, if defined.
54
- */
55
- // eslint-disable-next-line @typescript-eslint/ban-types
56
- function set<T extends object, V>(obj: T, path: string | string[], val: V) {
57
- return val === undefined ? null : _set(obj, path, val);
28
+ interface OdysseyPalette {
29
+ CustomHue50: string,
30
+ CustomHue100: string,
31
+ CustomHue200: string,
32
+ CustomHue300: string,
33
+ CustomHue400: string,
34
+ CustomHue500: string,
35
+ CustomHue600: string,
36
+ CustomHue700: string,
37
+ CustomHue800: string,
38
+ CustomHue900: string
58
39
  }
59
40
 
60
41
  /**
61
- * Generates a palette based on the "main" (f.k.a. "base") value. Main value
62
- * corresponds to 500 in the hue-based color scale.
42
+ * Generates a palette using @adobe/leonardo-contrast-colors based on the "main"
43
+ * (f.k.a. "base") value. Leonardo generates 10 different hues that adhere to Odyssey's
44
+ * contrast ratios
63
45
  *
64
46
  * Example:
65
- * PalettePrimaryMain -> HueBlue50
66
- * PalettePrimaryLighter -> HueBlue300
67
- * PalettePrimaryLight -> HueBlue500
68
- * PalettePrimaryDark -> HueBlue700
47
+ * PalettePrimaryMain -> CustomHue500
48
+ * PalettePrimaryLighter -> CustomHue50
49
+ * PalettePrimaryLight -> CustomHue300
50
+ * PalettePrimaryDark -> CustomHue700
51
+ * PalettePrimaryDarker -> CustomHue900
69
52
  *
70
- * @param main Main color (Hue 500)
53
+ * @param main Main color used to generate a palette
71
54
  */
72
- export const generatePalette = (main: string): Palette => {
55
+ export const generatePalette = (main: string): OdysseyPalette | null => {
73
56
  try {
74
- const lightness = chroma(main).get('hsl.l');
75
- return lightness > 0.24
76
- ? {
77
- main,
78
- lighter: chroma(main)
79
- .set('hsl.h', '+9')
80
- .set('hsl.s', '+0.18')
81
- .set('hsl.l', 0.97)
82
- .hex(),
83
- light: chroma(main)
84
- .set('hsl.h', '+11')
85
- .set('hsl.s', '-0.18')
86
- .set('hsl.l', lightness < 0.59 ? '+0.31' : 0.9) // clamp lightness
87
- .hex(),
88
- dark: chroma(main)
89
- .set('hsl.h', '+3')
90
- .set('hsl.s', '+0.18')
91
- .set('hsl.l', '-0.24')
92
- .hex(),
93
- contrastText: getInverseTextColor(main),
94
- } : {
95
- main,
96
- lighter: chroma(main)
97
- .set('hsl.h', '+9')
98
- .set('hsl.s', '+0.18')
99
- .set('hsl.l', 0.97)
100
- .hex(),
101
- light: chroma(main)
102
- .set('hsl.l', '+0.62')
103
- .hex(),
104
- dark: chroma(main)
105
- .set('hsl.l', '+0.31')
106
- .hex(),
107
- contrastText: getInverseTextColor(main),
108
- };
57
+ const primaryColor = new Color({
58
+ name: 'Custom Hue',
59
+ // Leonardo will throw "Invalid Color Key" error if string is not of type CssColor
60
+ colorKeys: [main as CssColor],
61
+ ratios: ODYSSEY_RATIOS,
62
+ });
63
+ // SIW always has a white background color
64
+ const backgroundColor = new BackgroundColor({
65
+ name: 'Background Color',
66
+ colorKeys: [WHITE_HEX],
67
+ ratios: [],
68
+ });
69
+ const leonardoTheme = new Theme({
70
+ colors: [primaryColor],
71
+ backgroundColor,
72
+ lightness: 100,
73
+ }).contrastColorPairs;
74
+
75
+ // Remap Leonardo theme to use Odyssey color stops from 50-900
76
+ const theme = {
77
+ CustomHue50: leonardoTheme.CustomHue100,
78
+ CustomHue100: leonardoTheme.CustomHue200,
79
+ CustomHue200: leonardoTheme.CustomHue300,
80
+ CustomHue300: leonardoTheme.CustomHue400,
81
+ CustomHue400: leonardoTheme.CustomHue500,
82
+ CustomHue500: leonardoTheme.CustomHue600,
83
+ CustomHue600: leonardoTheme.CustomHue700,
84
+ CustomHue700: leonardoTheme.CustomHue800,
85
+ CustomHue800: leonardoTheme.CustomHue900,
86
+ CustomHue900: leonardoTheme.CustomHue1000,
87
+ };
88
+ return theme;
109
89
  } catch (err) {
110
90
  console.warn(err);
111
- return {};
91
+ return null;
112
92
  }
113
93
  };
114
94
 
115
- export const createTheme = (
95
+ export const createThemeAndTokens = (
116
96
  brandColors?: BrandColors,
117
- customTokens?: Partial<DesignTokensType>,
118
- ): ThemeOptions => {
119
- const defaultTokens = DESIGN_TOKENS;
120
- const mergedTokens: DesignTokensType = { ...defaultTokens, ...customTokens };
121
- const theme = odysseyTheme;
97
+ customTokens?: Partial<DesignTokensOverride>,
98
+ ): { themeOverride: ThemeOptions, tokensOverride: DesignTokensOverride } => {
99
+ const tokensOverride = { ...customTokens };
122
100
 
123
- theme.palette.text.primary = BLACK_HEX;
124
101
  if (brandColors?.primaryColor) {
125
102
  const p = generatePalette(brandColors.primaryColor);
126
- set(theme, 'palette.primary.lighter', p.lighter);
127
- set(theme, 'palette.primary.light', p.light);
128
- set(theme, 'palette.primary.main', p.main);
129
- set(theme, 'palette.primary.dark', p.dark);
130
- set(theme, 'palette.primary.contrastText', p.contrastText);
103
+ tokensOverride.PalettePrimaryLighter ??= p?.CustomHue50;
104
+ tokensOverride.PalettePrimaryHighlight ??= p?.CustomHue100;
105
+ tokensOverride.PalettePrimaryLight ??= p?.CustomHue300;
106
+ tokensOverride.PalettePrimaryMain ??= p?.CustomHue500;
107
+ tokensOverride.FocusOutlineColorPrimary ??= p?.CustomHue500;
108
+ tokensOverride.BorderColorPrimaryControl ??= p?.CustomHue500;
109
+ tokensOverride.TypographyColorAction ??= p?.CustomHue600;
110
+ tokensOverride.PalettePrimaryText ??= p?.CustomHue600;
111
+ tokensOverride.BorderColorPrimaryDark ??= p?.CustomHue700;
112
+ tokensOverride.PalettePrimaryDark ??= p?.CustomHue700;
113
+ tokensOverride.PalettePrimaryDarker ??= p?.CustomHue800;
114
+ tokensOverride.PalettePrimaryHeading ??= p?.CustomHue900;
131
115
  }
132
- if (customTokens) {
133
- if (customTokens.PalettePrimaryMain) {
134
- const p = generatePalette(customTokens.PalettePrimaryMain);
135
- set(theme, 'palette.primary.lighter', customTokens.PalettePrimaryLighter ?? p.lighter);
136
- set(theme, 'palette.primary.light', customTokens.PalettePrimaryLight ?? p.light);
137
- set(theme, 'palette.primary.main', customTokens.PalettePrimaryMain ?? p.main);
138
- set(theme, 'palette.primary.dark', customTokens.PalettePrimaryDark ?? p.dark);
139
- set(theme, 'palette.primary.contrastText', p.contrastText);
140
- }
141
- if (customTokens.PaletteDangerMain) {
142
- const p = generatePalette(customTokens.PaletteDangerMain);
143
- set(theme, 'palette.error.lighter', customTokens.PaletteDangerLighter ?? p.lighter);
144
- set(theme, 'palette.error.light', customTokens.PaletteDangerLight ?? p.light);
145
- set(theme, 'palette.error.main', customTokens.PaletteDangerMain ?? p.main);
146
- set(theme, 'palette.error.dark', customTokens.PaletteDangerDark ?? p.dark);
147
- set(theme, 'palette.error.contrastText', p.contrastText);
148
- }
149
- if (customTokens.PaletteWarningMain) {
150
- const p = generatePalette(customTokens.PaletteWarningMain);
151
- set(theme, 'palette.warning.lighter', customTokens.PaletteWarningLighter ?? p.lighter);
152
- set(theme, 'palette.warning.light', customTokens.PaletteWarningLight ?? p.light);
153
- set(theme, 'palette.warning.main', customTokens.PaletteWarningMain ?? p.main);
154
- set(theme, 'palette.warning.dark', customTokens.PaletteWarningDark ?? p.dark);
155
- set(theme, 'palette.warning.contrastText', p.contrastText);
156
- }
157
- if (customTokens.PaletteSuccessMain) {
158
- const p = generatePalette(customTokens.PaletteSuccessMain);
159
- set(theme, 'palette.success.lighter', customTokens.PaletteSuccessLighter ?? p.lighter);
160
- set(theme, 'palette.success.light', customTokens.PaletteSuccessLight ?? p.light);
161
- set(theme, 'palette.success.main', customTokens.PaletteSuccessMain ?? p.main);
162
- set(theme, 'palette.success.dark', customTokens.PaletteSuccessDark ?? p.dark);
163
- set(theme, 'palette.success.contrastText', p.contrastText);
164
- }
165
- set(theme, 'mixins.borderRadius', mergedTokens.BorderRadiusMain);
166
- set(theme, 'mixins.borderStyle', mergedTokens.BorderStyleMain);
167
- set(theme, 'mixins.borderWidth', mergedTokens.BorderWidthMain);
168
- set(theme, 'palette.text.disabled', mergedTokens.TypographyColorDisabled);
169
- set(theme, 'palette.text.primary', mergedTokens.TypographyColorBody);
170
- set(theme, 'shadows[1]', mergedTokens.ShadowScale0);
171
- set(theme, 'shadows[2]', mergedTokens.ShadowScale1);
172
- set(theme, 'typography.body1.fontFamily', mergedTokens.TypographyFamilyBody);
173
- set(theme, 'typography.body1.fontSize', mergedTokens.TypographySizeBody);
174
- set(theme, 'typography.body1.fontStyle', mergedTokens.TypographyStyleNormal);
175
- set(theme, 'typography.body1.lineHeight', mergedTokens.TypographyLineHeightBody);
176
- set(theme, 'typography.button.fontFamily', mergedTokens.TypographyFamilyButton);
177
- set(theme, 'typography.caption.color', mergedTokens.TypographyColorSubordinate);
178
- set(theme, 'typography.caption.fontFamily', mergedTokens.TypographyFamilyBody);
179
- set(theme, 'typography.caption.fontSize', mergedTokens.TypographySizeSubordinate);
180
- set(theme, 'typography.fontFamily', mergedTokens.TypographyFamilyBody);
181
- set(theme, 'typography.fontWeightBold', mergedTokens.TypographyWeightBodyBold);
182
- set(theme, 'typography.fontWeightRegular', mergedTokens.TypographyWeightBody);
183
- set(theme, 'typography.h1.color', mergedTokens.TypographyColorHeading);
184
- set(theme, 'typography.h1.fontFamily', mergedTokens.TypographyFamilyHeading);
185
- set(theme, 'typography.h1.fontSize', mergedTokens.TypographySizeHeading1);
186
- set(theme, 'typography.h1.fontWeight', mergedTokens.TypographyWeightHeading);
187
- set(theme, 'typography.h1.lineHeight', mergedTokens.TypographyLineHeightHeading1);
188
- set(theme, 'typography.h2.color', mergedTokens.TypographyColorHeading);
189
- set(theme, 'typography.h2.fontFamily', mergedTokens.TypographyFamilyHeading);
190
- set(theme, 'typography.h2.fontSize', mergedTokens.TypographySizeHeading2);
191
- set(theme, 'typography.h2.fontWeight', mergedTokens.TypographyWeightHeading);
192
- set(theme, 'typography.h2.lineHeight', mergedTokens.TypographyLineHeightHeading2);
193
- set(theme, 'typography.h3.color', mergedTokens.TypographyColorHeading);
194
- set(theme, 'typography.h3.fontFamily', mergedTokens.TypographyFamilyHeading);
195
- set(theme, 'typography.h3.fontSize', mergedTokens.TypographySizeHeading3);
196
- set(theme, 'typography.h3.fontWeight', mergedTokens.TypographyWeightHeading);
197
- set(theme, 'typography.h3.lineHeight', mergedTokens.TypographyLineHeightHeading3);
198
- set(theme, 'typography.h4.color', mergedTokens.TypographyColorHeading);
199
- set(theme, 'typography.h4.fontFamily', mergedTokens.TypographyFamilyHeading);
200
- set(theme, 'typography.h4.fontSize', mergedTokens.TypographySizeHeading4);
201
- set(theme, 'typography.h4.fontWeight', mergedTokens.TypographyWeightHeading);
202
- set(theme, 'typography.h4.lineHeight', mergedTokens.TypographyLineHeightHeading4);
203
- set(theme, 'typography.h5.color', mergedTokens.TypographyColorHeading);
204
- set(theme, 'typography.h5.fontFamily', mergedTokens.TypographyFamilyHeading);
205
- set(theme, 'typography.h5.fontSize', mergedTokens.TypographySizeHeading5);
206
- set(theme, 'typography.h5.fontWeight', mergedTokens.TypographyWeightHeading);
207
- set(theme, 'typography.h5.lineHeight', mergedTokens.TypographyLineHeightHeading5);
208
- set(theme, 'typography.h6.color', mergedTokens.TypographyColorHeading);
209
- set(theme, 'typography.h6.fontFamily', mergedTokens.TypographyFamilyHeading);
210
- set(theme, 'typography.h6.fontSize', mergedTokens.TypographySizeHeading6);
211
- set(theme, 'typography.h6.fontWeight', mergedTokens.TypographyWeightHeading);
212
- set(theme, 'typography.h6.lineHeight', mergedTokens.TypographyLineHeightHeading6);
213
- set(theme, 'typography.overline.lineHeight', mergedTokens.TypographyLineHeightOverline);
214
- set(theme, 'typography.subtitle1.fontFamily', mergedTokens.TypographyFamilyBody);
215
- set(theme, 'typography.subtitle2.fontFamily', mergedTokens.TypographyFamilyBody);
216
116
 
217
- theme.spacing = (...args: Array<SpacingArgument>): string => {
218
- if (args.length === 0) {
219
- return mergedTokens.Spacing2;
220
- }
221
- const spaces: string[] = [
222
- mergedTokens.Spacing0,
223
- mergedTokens.Spacing1,
224
- mergedTokens.Spacing2,
225
- mergedTokens.Spacing3,
226
- mergedTokens.Spacing4,
227
- mergedTokens.Spacing5,
228
- mergedTokens.Spacing6,
229
- mergedTokens.Spacing7,
230
- mergedTokens.Spacing8,
231
- mergedTokens.Spacing9,
232
- ];
233
- return args
234
- .slice(0, 4) // limit to 4 args
235
- .map((n) => ( typeof n === 'number' ? spaces[n] : n )) // lookup
236
- .join(' '); // concat into space-separated string
237
- };
238
- }
239
- return mergeThemes(theme, {
240
- ...odysseyTheme,
117
+ const mergedTokens = { ...Tokens, ...tokensOverride };
118
+
119
+ // Odyssey 1.x does not export their theme, but we can recreate it
120
+ const baseOdysseyTheme = createOdysseyMuiTheme({
121
+ odysseyTokens: mergedTokens,
122
+ });
123
+
124
+ // Merge default Odyssey 1.x theme with component overrides
125
+ const themeOverride = mergeThemes(baseOdysseyTheme, {
241
126
  components: {
242
- MuiAlert: {
127
+ MuiAccordion: {
243
128
  styleOverrides: {
244
129
  root: {
245
- gap: 0,
130
+ border: 0,
246
131
  },
247
- icon: ({ theme: t }) => ({
248
- paddingInlineEnd: t.spacing(4),
249
- flexShrink: 0,
250
- }),
251
132
  },
252
133
  },
253
- MuiInputBase: {
134
+ MuiAccordionDetails: {
254
135
  styleOverrides: {
255
136
  root: {
256
- width: '100%',
137
+ paddingInline: mergedTokens.Spacing0,
138
+ paddingBlock: mergedTokens.Spacing0,
139
+ paddingBlockStart: mergedTokens.Spacing4,
257
140
  },
258
- input: {
259
- '::-ms-reveal': {
141
+ },
142
+ },
143
+ MuiAccordionSummary: {
144
+ styleOverrides: {
145
+ root: {
146
+ display: 'inline-flex',
147
+ minHeight: 0,
148
+ paddingInline: mergedTokens.Spacing0,
149
+ paddingBlock: mergedTokens.Spacing0,
150
+ backgroundColor: 'transparent',
151
+ '&:hover': {
152
+ backgroundColor: 'transparent',
153
+ },
154
+ '&:focus': {
155
+ backgroundColor: 'transparent',
156
+ },
157
+ '& .MuiAccordionSummary-content': {
158
+ margin: mergedTokens.Spacing0,
159
+ '& .MuiTypography-root': {
160
+ textDecoration: 'underline',
161
+ fontWeight: mergedTokens.TypographyWeightBody,
162
+ color: mergedTokens.TypographyColorAction,
163
+ '&:hover': {
164
+ color: mergedTokens.BorderColorPrimaryDark,
165
+ },
166
+ },
167
+ },
168
+ '& .MuiAccordionSummary-expandIconWrapper': {
260
169
  display: 'none',
261
170
  },
262
171
  },
263
172
  },
264
173
  },
265
- MuiInputLabel: {
174
+ MuiAlert: {
266
175
  styleOverrides: {
267
176
  root: {
268
- wordBreak: 'break-word',
269
- whiteSpace: 'normal',
177
+ gap: mergedTokens.Spacing0,
178
+ },
179
+ icon: {
180
+ paddingInlineEnd: mergedTokens.Spacing5,
181
+ flexShrink: 0,
270
182
  },
271
183
  },
272
184
  },
273
- // ruleset with :focus-visible pseudo-selector break entire ruleset in
274
- // ie11 because its not supported. re-define the :hover rule separately
275
- // again so the ruleset is applied in ie11
276
185
  MuiButton: {
277
186
  styleOverrides: {
278
- root: ({ ownerState, theme: t }) => ({
187
+ root: ({ ownerState }) => ({
188
+ display: 'flex',
189
+ justifyContent: 'center',
190
+ alignItems: 'center',
191
+ whiteSpace: 'normal',
192
+ // Odyssey CircularProgress does not allow color change but SIW needs a white spinner
193
+ // when rendering it as the startIcon for primary buttons
279
194
  ...(ownerState.variant === 'primary' && {
280
- '&:hover': {
281
- backgroundColor: t.palette.primary.dark,
195
+ '&:disabled': {
196
+ color: mergedTokens.PalettePrimaryLight,
197
+ backgroundColor: mergedTokens.PalettePrimaryHighlight,
198
+ '& .MuiCircularProgress-root': {
199
+ color: mergedTokens.PalettePrimaryLight,
200
+ },
282
201
  },
283
202
  }),
284
- ...(ownerState.variant === 'secondary' && {
285
- '&:hover': {
286
- backgroundColor: t.palette.primary.lighter,
287
- borderColor: t.palette.primary.light,
288
- color: t.palette.primary.main,
203
+ // Fix for IE11 - don't shrink icon if the button text is multiline
204
+ ...(ownerState.startIcon && {
205
+ '& .MuiButton-startIcon': {
206
+ flexShrink: 0,
289
207
  },
290
208
  }),
291
- ...(ownerState.variant === 'floating' && {
292
- '&:hover': {
293
- backgroundColor: 'rgba(29, 29, 33, 0.1)',
294
- borderColor: 'transparent',
209
+ }),
210
+ },
211
+ },
212
+ MuiCheckbox: {
213
+ styleOverrides: {
214
+ root: {
215
+ // Odyssey uses gap for spacing between Checkbox and label which is not IE11-friendly
216
+ marginInlineEnd: mergedTokens.Spacing2,
217
+ },
218
+ },
219
+ },
220
+ MuiChip: {
221
+ styleOverrides: {
222
+ root: {
223
+ lineHeight: 'normal',
224
+ },
225
+ },
226
+ },
227
+ MuiFormControlLabel: {
228
+ styleOverrides: {
229
+ root: {
230
+ // Odyssey uses gap for spacing between Checkbox and label which is not IE11-friendly
231
+ gap: mergedTokens.Spacing0,
232
+ },
233
+ label: {
234
+ // Fixes text overflow in IE11
235
+ width: '100%',
236
+ // Forces Odyssey Checkbox hint text to be grey even during error state
237
+ '& .MuiFormHelperText-root.Mui-error': {
238
+ color: mergedTokens.TypographyColorSubordinate,
239
+ },
240
+ },
241
+ },
242
+ },
243
+ MuiFormHelperText: {
244
+ styleOverrides: {
245
+ root: {
246
+ display: 'block',
247
+ },
248
+ },
249
+ },
250
+ MuiInputBase: {
251
+ styleOverrides: {
252
+ root: ({ ownerState }) => ({
253
+ width: '100%',
254
+ // Odyssey sets flex: "1" but that results in the following IE11 flexbug
255
+ // https://github.com/philipwalton/flexbugs?tab=readme-ov-file#flexbug-7
256
+ flex: 'auto',
257
+ ...(ownerState.name && isLtrField(ownerState.name) && {
258
+ direction: 'ltr',
259
+ }),
260
+ }),
261
+ input: {
262
+ '::-ms-reveal': {
263
+ display: 'none',
264
+ },
265
+ },
266
+ adornedEnd: ({ ownerState }) => ({
267
+ // Odyssey does not support a focus indicator around toggle icon button
268
+ '& .MuiIconButton-root:focus-visible': {
269
+ borderRadius: mergedTokens.BorderRadiusMain,
270
+ outlineColor: mergedTokens.FocusOutlineColorPrimary,
271
+ outlineStyle: mergedTokens.FocusOutlineStyle,
272
+ outlineWidth: mergedTokens.FocusOutlineWidthTight,
273
+ },
274
+ // Explicitly switch to physical properties for password toggle icon since
275
+ // IE11 stylis plugin cannot handle nested logical properties
276
+ ...(ownerState.name && isLtrField(ownerState.name) && {
277
+ '& .MuiInputAdornment-root': {
278
+ marginRight: mergedTokens.Spacing2,
279
+ },
280
+ }),
281
+ }),
282
+ adornedStart: ({ ownerState }) => ({
283
+ // Explicitly switch to physical properties for telephone code
284
+ ...(ownerState.type === 'tel' && {
285
+ '& .MuiInputAdornment-root': {
286
+ marginInlineStart: mergedTokens.Spacing0,
287
+ marginLeft: mergedTokens.Spacing2,
295
288
  },
296
289
  }),
297
290
  }),
298
291
  },
299
292
  },
300
- // ruleset with :focus-visible pseudo-selector break entire ruleset in
301
- // ie11 because its not supported. re-define the :hover rule separately
302
- // again so the ruleset is applied in ie11
303
- MuiIconButton: {
293
+ MuiInputLabel: {
294
+ styleOverrides: {
295
+ root: ({ ownerState }) => ({
296
+ wordBreak: 'break-word',
297
+ whiteSpace: 'normal',
298
+ ...(ownerState.formControl && {
299
+ // Odyssey sets position: "initial" which is not supported in IE11
300
+ // "initial" uses browser default which is "static"
301
+ position: 'static',
302
+ }),
303
+ }),
304
+ },
305
+ },
306
+ MuiLink: {
307
+ styleOverrides: {
308
+ button: {
309
+ verticalAlign: 'baseline',
310
+ },
311
+ },
312
+ },
313
+ MuiNativeSelect: {
314
+ styleOverrides: {
315
+ select: {
316
+ paddingRight: `${mergedTokens.Spacing7} !important`,
317
+ },
318
+ },
319
+ },
320
+ MuiRadio: {
304
321
  styleOverrides: {
305
322
  root: {
306
- '&:hover': {
307
- backgroundColor: 'rgba(29, 29, 33, 0.1)',
308
- borderColor: 'transparent',
323
+ // Odyssey uses gap for spacing between Checkbox/Radio and label
324
+ marginInlineEnd: mergedTokens.Spacing2,
325
+ '&.Mui-checked': {
326
+ // Odyssey position: absolute breaks radio checked circle alignment
327
+ '&::before': {
328
+ position: 'relative',
329
+ backgroundColor: mergedTokens.PalettePrimaryMain,
330
+ },
309
331
  },
310
332
  },
311
333
  },
312
334
  },
313
-
314
- MuiLink: {
335
+ MuiScopedCssBaseline: {
315
336
  styleOverrides: {
316
- root: ({ ownerState, theme: t }) => ({
317
- color: t.palette.primary.main,
318
- textDecoration: ownerState?.component === 'a' ? 'underline' : 'inherit',
319
-
320
- '&:hover': {
321
- color: t.palette.primary.dark,
337
+ root: {
338
+ figure: {},
339
+ },
340
+ },
341
+ },
342
+ MuiTypography: {
343
+ styleOverrides: {
344
+ root: {
345
+ '&[data-se="o-form-head"]': {
346
+ outline: 'none',
322
347
  },
323
- }),
348
+ },
324
349
  },
325
350
  },
326
351
  },
327
352
  });
353
+
354
+ return { themeOverride, tokensOverride };
328
355
  };
@@ -14,7 +14,6 @@ const addClassNamesByAttr = require('./svgo-plugins/addClassNamesByAttr');
14
14
 
15
15
  const PRIMARY = '#00297A';
16
16
  const SECONDARY = '#A7B5EC';
17
- const BACKGROUND = '#F5F5F6';
18
17
 
19
18
  module.exports = {
20
19
  multipass: true,
@@ -73,11 +72,6 @@ module.exports = {
73
72
  .test(el.attributes && el.attributes.fill),
74
73
  classNames: ['siwFillSecondary'],
75
74
  },
76
- {
77
- test: (el) => new RegExp(BACKGROUND, 'i')
78
- .test(el.attributes && el.attributes.fill),
79
- classNames: ['siwFillBg'],
80
- },
81
75
  ],
82
76
  },
83
77
  },
@@ -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
  );