@genesislcap/foundation-login 10.3.1 → 11.3.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 (213) hide show
  1. package/README.md +28 -72
  2. package/dist/dts/main/config.d.ts +13 -0
  3. package/dist/dts/main/config.d.ts.map +1 -1
  4. package/dist/dts/main/main.definition.d.ts +1 -1
  5. package/dist/dts/main/main.styles.d.ts +4 -1
  6. package/dist/dts/main/main.styles.d.ts.map +1 -1
  7. package/dist/dts/main/main.template.d.ts +1 -1
  8. package/dist/dts/main/main.template.d.ts.map +1 -1
  9. package/dist/dts/routes/base.d.ts +5 -4
  10. package/dist/dts/routes/base.d.ts.map +1 -1
  11. package/dist/dts/routes/config.d.ts +1 -1
  12. package/dist/dts/routes/config.d.ts.map +1 -1
  13. package/dist/dts/routes/forgot-password/forgot-password.d.ts.map +1 -1
  14. package/dist/dts/routes/login-form/login-form.d.ts +7 -3
  15. package/dist/dts/routes/login-form/login-form.d.ts.map +1 -1
  16. package/dist/dts/routes/login-form/login-form.template.d.ts.map +1 -1
  17. package/dist/dts/routes/not-found/not-found.d.ts.map +1 -1
  18. package/dist/dts/routes/protected/protected.d.ts.map +1 -1
  19. package/dist/dts/routes/request-account/request-account.d.ts.map +1 -1
  20. package/dist/dts/routes/reset-password/reset-password.d.ts.map +1 -1
  21. package/dist/dts/routes/verify/verify.d.ts.map +1 -1
  22. package/dist/dts/styles/index.d.ts +0 -1
  23. package/dist/dts/styles/index.d.ts.map +1 -1
  24. package/dist/dts/styles/styles.d.ts.map +1 -1
  25. package/dist/dts/utils/logger.d.ts.map +1 -1
  26. package/dist/esm/components/components.js +0 -1
  27. package/dist/esm/components/index.js +0 -1
  28. package/dist/esm/index.js +0 -1
  29. package/dist/esm/layouts/default.js +0 -1
  30. package/dist/esm/layouts/index.js +0 -1
  31. package/dist/esm/main/config.js +4 -2
  32. package/dist/esm/main/define.js +0 -1
  33. package/dist/esm/main/index.js +0 -1
  34. package/dist/esm/main/main.definition.js +2 -3
  35. package/dist/esm/main/main.js +0 -1
  36. package/dist/esm/main/main.styles.js +5 -3
  37. package/dist/esm/main/main.template.js +0 -1
  38. package/dist/esm/routes/base.js +10 -8
  39. package/dist/esm/routes/config.js +5 -6
  40. package/dist/esm/routes/forgot-password/forgot-password.js +4 -5
  41. package/dist/esm/routes/forgot-password/forgot-password.template.js +0 -1
  42. package/dist/esm/routes/index.js +0 -1
  43. package/dist/esm/routes/login-form/login-form.js +38 -24
  44. package/dist/esm/routes/login-form/login-form.styles.js +0 -1
  45. package/dist/esm/routes/login-form/login-form.template.js +6 -7
  46. package/dist/esm/routes/not-found/not-found.js +1 -2
  47. package/dist/esm/routes/protected/protected.js +2 -3
  48. package/dist/esm/routes/protected/protected.template.js +0 -1
  49. package/dist/esm/routes/request-account/request-account.js +2 -3
  50. package/dist/esm/routes/request-account/request-account.template.js +1 -2
  51. package/dist/esm/routes/reset-password/reset-password.js +2 -3
  52. package/dist/esm/routes/reset-password/reset-password.template.js +0 -1
  53. package/dist/esm/routes/types.js +0 -1
  54. package/dist/esm/routes/verify/verify.js +2 -3
  55. package/dist/esm/routes/verify/verify.template.js +0 -1
  56. package/dist/esm/styles/index.js +0 -2
  57. package/dist/esm/styles/styles.js +2 -11
  58. package/dist/esm/utils/index.js +0 -1
  59. package/dist/esm/utils/logger.js +0 -1
  60. package/dist/foundation-login.api.json +30 -3
  61. package/dist/foundation-login.d.ts +23 -6
  62. package/package.json +27 -11
  63. package/playwright.config.ts +50 -0
  64. package/test/README.md +3 -0
  65. package/dist/1.0.0.remoteEntry.js +0 -1
  66. package/dist/15.15.7a2c23dfae8db4e093ae.js +0 -1347
  67. package/dist/15.707b18d09d78e18958de7e35549b69f2.js.map +0 -1
  68. package/dist/170.02ecd6ffb7bb9c9531e72b7099ba0dce.js.map +0 -1
  69. package/dist/170.170.6ccfc6db6319d932ea16.js +0 -726
  70. package/dist/176.176.bfbfc60ffad852c406c4.js +0 -2
  71. package/dist/176.7ce7d4e386b9ebd99f2a121d6364c1ad.js.map +0 -1
  72. package/dist/185.185.6c3ef3df3fe6f4879dab.js +0 -2
  73. package/dist/185.d623d7c2df70c9d665343444e7c1fa6c.js.map +0 -1
  74. package/dist/338.338.e399ff6c11eb8175de4c.js +0 -2
  75. package/dist/338.4f68feefeaca1bf1dbc7ba12af2e84aa.js.map +0 -1
  76. package/dist/397.397.1de89f70cc9876b09be8.js +0 -3
  77. package/dist/397.397.1de89f70cc9876b09be8.js.LICENSE.txt +0 -1
  78. package/dist/397.984e24423ff2adb107881e130126575a.js.map +0 -1
  79. package/dist/419.419.25c54d30d5ef03de4733.js +0 -2140
  80. package/dist/419.500ae8ac8e1ffc781af411dd2ad588cd.js.map +0 -1
  81. package/dist/453.3c9a25d2af3ccf8232fdd1dfc5244b3d.js.map +0 -1
  82. package/dist/453.453.14247e88aa4df78dca2c.js +0 -2
  83. package/dist/726.4c7419d8edb8ba5e67699f4820c8c461.js.map +0 -1
  84. package/dist/726.726.e09fed9a1e3b529acd46.js +0 -3
  85. package/dist/726.726.e09fed9a1e3b529acd46.js.LICENSE.txt +0 -4
  86. package/dist/741.741.d84fc7e9236cae1acc99.js +0 -3
  87. package/dist/741.741.d84fc7e9236cae1acc99.js.LICENSE.txt +0 -4
  88. package/dist/741.a3dfed45252169e53ee396a8b76cea67.js.map +0 -1
  89. package/dist/b634d7e1f2324faf1230.svg +0 -10
  90. package/dist/c0bd2c45d93ce443d624.jpg +0 -0
  91. package/dist/dashboard.json +0 -1
  92. package/dist/dts/index.federated.d.ts +0 -1
  93. package/dist/dts/index.federated.d.ts.map +0 -1
  94. package/dist/dts/styles/typography.d.ts +0 -4
  95. package/dist/dts/styles/typography.d.ts.map +0 -1
  96. package/dist/esm/components/components.js.map +0 -1
  97. package/dist/esm/components/index.js.map +0 -1
  98. package/dist/esm/index.federated.js +0 -2
  99. package/dist/esm/index.federated.js.map +0 -1
  100. package/dist/esm/index.js.map +0 -1
  101. package/dist/esm/layouts/default.js.map +0 -1
  102. package/dist/esm/layouts/index.js.map +0 -1
  103. package/dist/esm/main/config.js.map +0 -1
  104. package/dist/esm/main/define.js.map +0 -1
  105. package/dist/esm/main/index.js.map +0 -1
  106. package/dist/esm/main/main.definition.js.map +0 -1
  107. package/dist/esm/main/main.js.map +0 -1
  108. package/dist/esm/main/main.styles.js.map +0 -1
  109. package/dist/esm/main/main.template.js.map +0 -1
  110. package/dist/esm/routes/base.js.map +0 -1
  111. package/dist/esm/routes/config.js.map +0 -1
  112. package/dist/esm/routes/forgot-password/forgot-password.js.map +0 -1
  113. package/dist/esm/routes/forgot-password/forgot-password.template.js.map +0 -1
  114. package/dist/esm/routes/index.js.map +0 -1
  115. package/dist/esm/routes/login-form/login-form.js.map +0 -1
  116. package/dist/esm/routes/login-form/login-form.styles.js.map +0 -1
  117. package/dist/esm/routes/login-form/login-form.template.js.map +0 -1
  118. package/dist/esm/routes/not-found/not-found.js.map +0 -1
  119. package/dist/esm/routes/protected/protected.js.map +0 -1
  120. package/dist/esm/routes/protected/protected.template.js.map +0 -1
  121. package/dist/esm/routes/request-account/request-account.js.map +0 -1
  122. package/dist/esm/routes/request-account/request-account.template.js.map +0 -1
  123. package/dist/esm/routes/reset-password/reset-password.js.map +0 -1
  124. package/dist/esm/routes/reset-password/reset-password.template.js.map +0 -1
  125. package/dist/esm/routes/types.js.map +0 -1
  126. package/dist/esm/routes/verify/verify.js.map +0 -1
  127. package/dist/esm/routes/verify/verify.template.js.map +0 -1
  128. package/dist/esm/styles/index.js.map +0 -1
  129. package/dist/esm/styles/styles.js.map +0 -1
  130. package/dist/esm/styles/typography.js +0 -27
  131. package/dist/esm/styles/typography.js.map +0 -1
  132. package/dist/esm/utils/index.js.map +0 -1
  133. package/dist/esm/utils/logger.js.map +0 -1
  134. package/dist/favicon.ico +0 -0
  135. package/dist/foundationLogin.dd27ce925c9e142951f9e650fb3f9b7e.js.map +0 -1
  136. package/dist/index.ejs +0 -23
  137. package/dist/index.html +0 -10
  138. package/dist/info.ejs +0 -13
  139. package/dist/info.html +0 -22
  140. package/dist/main.49b5ccad79942a173c5044389ff4b88b.js.map +0 -1
  141. package/dist/main.cf8907a8eac5d741ac98.js +0 -2
  142. package/dist/npm.analytics.343.1691cbc7d8a5badd3734.js +0 -2
  143. package/dist/npm.analytics.ce2eefcbb0dbd8ec610f4a90f48aa689.js.map +0 -1
  144. package/dist/npm.consola.713.661cb6ae3806c228029d.js +0 -2
  145. package/dist/npm.consola.96aceeeb14c801e429604b872dd754d7.js.map +0 -1
  146. package/dist/npm.dialog-polyfill.47.34b0c0d52e6712cf91bb.js +0 -2
  147. package/dist/npm.dialog-polyfill.9d605973cbc29184d8b9b4736433dddc.js.map +0 -1
  148. package/dist/npm.finos.690.d012d887fab1a50fd3fd.js +0 -2
  149. package/dist/npm.finos.bb7f5996c8be19fd2a1c0bb82b2512ef.js.map +0 -1
  150. package/dist/npm.fortawesome.104.f45009da0a55a389999c.js +0 -2
  151. package/dist/npm.fortawesome.e10775e8f8583851351996b12aec3dfb.js.map +0 -1
  152. package/dist/npm.microsoft.127.7781d48b93413319f199.js +0 -6406
  153. package/dist/npm.microsoft.127.7781d48b93413319f199.js.LICENSE.txt +0 -14
  154. package/dist/npm.microsoft.b0947aa2f980f173ee68c35127bf2481.js.map +0 -1
  155. package/dist/npm.popperjs.47700ec72e909558c6ebe29941887dcf.js.map +0 -1
  156. package/dist/npm.popperjs.591.6ab52bc8e177edef695a.js +0 -2
  157. package/dist/npm.rxjs.271.210fdd198235c86ce4cd.js +0 -2
  158. package/dist/npm.rxjs.36e7291df63583daef7bbafd0a3ab9dc.js.map +0 -1
  159. package/dist/remoteEntry.js +0 -2
  160. package/dist/serve.json +0 -3
  161. package/dist/tsdoc-metadata.json +0 -11
  162. package/docs/.gitattributes +0 -2
  163. package/docs/api/foundation-login.configure.md +0 -62
  164. package/docs/api/foundation-login.defaultapihost.md +0 -12
  165. package/docs/api/foundation-login.defaultloginconfig.md +0 -13
  166. package/docs/api/foundation-login.defaultorganisation.md +0 -12
  167. package/docs/api/foundation-login.defaultpassword.md +0 -12
  168. package/docs/api/foundation-login.defaultsocketext.md +0 -12
  169. package/docs/api/foundation-login.defaulttemplateoptions.md +0 -16
  170. package/docs/api/foundation-login.defaultuser.md +0 -12
  171. package/docs/api/foundation-login.define.md +0 -38
  172. package/docs/api/foundation-login.definition.md +0 -19
  173. package/docs/api/foundation-login.fieldconfig.md +0 -16
  174. package/docs/api/foundation-login.fieldconfigmap.md +0 -19
  175. package/docs/api/foundation-login.hostenv.md +0 -12
  176. package/docs/api/foundation-login.hosturl.md +0 -12
  177. package/docs/api/foundation-login.idp.id.md +0 -11
  178. package/docs/api/foundation-login.idp.md +0 -20
  179. package/docs/api/foundation-login.idp.type.md +0 -11
  180. package/docs/api/foundation-login.idpresponse.id.md +0 -11
  181. package/docs/api/foundation-login.idpresponse.md +0 -20
  182. package/docs/api/foundation-login.idpresponse.type.md +0 -11
  183. package/docs/api/foundation-login.ismfroute.md +0 -24
  184. package/docs/api/foundation-login.login.md +0 -108
  185. package/docs/api/foundation-login.loginconfig.autoauth.md +0 -18
  186. package/docs/api/foundation-login.loginconfig.autoconnect.md +0 -13
  187. package/docs/api/foundation-login.loginconfig.background.md +0 -30
  188. package/docs/api/foundation-login.loginconfig.defaultredirecturl.md +0 -18
  189. package/docs/api/foundation-login.loginconfig.fields.md +0 -18
  190. package/docs/api/foundation-login.loginconfig.logo.md +0 -28
  191. package/docs/api/foundation-login.loginconfig.md +0 -30
  192. package/docs/api/foundation-login.loginconfig.omitredirecturls.md +0 -21
  193. package/docs/api/foundation-login.loginconfig.omitroutes.md +0 -25
  194. package/docs/api/foundation-login.loginconfig.showconnectionindicator.md +0 -13
  195. package/docs/api/foundation-login.loginconfig.sso.md +0 -18
  196. package/docs/api/foundation-login.loginconfig.versioninformation.md +0 -25
  197. package/docs/api/foundation-login.loginhosted.md +0 -23
  198. package/docs/api/foundation-login.loginhosted.registercommoncomponents.md +0 -18
  199. package/docs/api/foundation-login.md +0 -59
  200. package/docs/api/foundation-login.routes.md +0 -20
  201. package/docs/api/foundation-login.settings.md +0 -20
  202. package/docs/api/foundation-login.ssoconfig.md +0 -15
  203. package/docs/api/foundation-login.styles.md +0 -12
  204. package/docs/api/foundation-login.template.md +0 -12
  205. package/docs/api/foundation-login.templatecomponents.md +0 -25
  206. package/docs/api/foundation-login.templateoptions.md +0 -19
  207. package/docs/api/index.md +0 -12
  208. package/docs/api-report.md +0 -380
  209. package/docs/img/foundation-login_change-password.png +0 -0
  210. package/docs/img/foundation-login_forgotten-password.png +0 -0
  211. package/docs/img/foundation-login_login-sso.png +0 -0
  212. package/docs/img/foundation-login_login-standard.png +0 -0
  213. package/docs/img/foundation-login_request-account.png +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack://@genesislcap/foundation-login/./src/main/config.ts","webpack://@genesislcap/foundation-login/./src/utils/logger.ts","webpack://@genesislcap/foundation-login/./src/components/components.ts","webpack://@genesislcap/foundation-login/./src/routes/base.ts","webpack://@genesislcap/foundation-login/./src/layouts/default.ts","webpack://@genesislcap/foundation-login/./src/styles/typography.ts","webpack://@genesislcap/foundation-login/./src/styles/styles.ts","webpack://@genesislcap/foundation-login/./src/routes/login-form/login-form.styles.ts","webpack://@genesislcap/foundation-login/./src/routes/login-form/login-form.template.ts","webpack://@genesislcap/foundation-login/./src/routes/login-form/login-form.ts","webpack://@genesislcap/foundation-login/./src/routes/forgot-password/forgot-password.template.ts","webpack://@genesislcap/foundation-login/./src/routes/forgot-password/forgot-password.ts","webpack://@genesislcap/foundation-login/./src/routes/not-found/not-found.ts","webpack://@genesislcap/foundation-login/./src/routes/request-account/request-account.template.ts","webpack://@genesislcap/foundation-login/./src/routes/request-account/request-account.ts","webpack://@genesislcap/foundation-login/./src/routes/verify/verify.template.ts","webpack://@genesislcap/foundation-login/./src/routes/verify/verify.ts","webpack://@genesislcap/foundation-login/./src/routes/protected/protected.template.ts","webpack://@genesislcap/foundation-login/./src/routes/protected/protected.ts","webpack://@genesislcap/foundation-login/./src/routes/reset-password/reset-password.template.ts","webpack://@genesislcap/foundation-login/./src/routes/reset-password/reset-password.ts","webpack://@genesislcap/foundation-login/./src/routes/config.ts","webpack://@genesislcap/foundation-login/./src/main/main.template.ts","webpack://@genesislcap/foundation-login/./src/main/main.styles.ts","webpack://@genesislcap/foundation-login/./src/main/main.definition.ts","webpack://@genesislcap/foundation-login/./src/main/main.ts","webpack://@genesislcap/foundation-login/./src/main/define.ts"],"names":["defaultOrganisation","defaultUser","defaultPassword","defaultApiHost","defaultSocketExt","hostEnv","location","host","hostUrl","protocol","Routes","login","verify","protected","isMFRoute","pathname","route","split","charAt","defaultLoginConfig","autoConnect","autoAuth","logo","css","background","omitRoutes","fields","organisation","username","label","value","email","password","showConnectionIndicator","defaultRedirectUrl","omitRedirectUrls","sso","identityProvidersPath","LoginConfig","DI","configure","container","config","register","Registration","logger","createLogger","ResourceType","loadZeroDesignSystem","type","REMOTE","e","LOCAL","debug","FoundationRouter","defaultOnBackMS","ConfigHostElement","FASTElement","connectedCallback","this","has","get","super","Container","observable","BaseRoute","password2","showPasswords","message","hasErrors","isSubmitting","onBack","onNavigate","routeName","params","Route","Router","session","getSessionStorageItem","onSubmit","clearError","ensureConnection","connect","isConnected","setError","orgUsername","trim","queueOnBack","delay","setTimeout","autofill","credentialData","credentialManager","getCredentials","name","valueParts","id","proposedOrganisation","length","err","error","Promise","resolve","storeCredentials","sendMessage","successFeedback","successCallback","result","send","ERROR","map","TEXT","toString","Auth","Connect","Session","MessageBuilder","CredentialManager","configurableTextField","autofocus","autocomplete","className","labelOverride","testIdOverride","required","fieldName","valueKey","Array","isArray","html","when","x","sync","organisationField","usernameField","emailField","passwordField","password2FieldMeta","new","confirmation","password2Field","BackgroundElement","$fastController","addStyles","customElement","template","styles","LogoElement","backButton","binding","submitButton","dataTestId","disabled","showPasswordsCheckbox","MessageElement","classNames","nonError","nonErrorChanged","attr","mode","attribute","SecondaryRapidColorHEX","SubmittingIndicator","defaultLayout","FASTElementLayout","mixinSegoeUI","style","weight","mixinCardTitle","commonHostStyles","commonLoginStyles","neutralLayer1","commonLoginRouteStyles","LoginFormStyles","regularLogin","ssoToggled","submitDisabled","includes","versionInformation","ssoLogin","selectedIDP","idps","repeat","onClickSSO","httpModeEnabledText","httpMode","connectionIndicator","connectionIndicatorWrapper","LoginFormTemplate","onHostSubmit","submitConnectDisabled","connectActionText","onLoginSubmit","selectedIDPName","LoginForm","fetchIDPs","endpoint","ipdsEndpoint","startsWith","replace","fetch","then","res","ok","Error","statusText","json","IDPS","toggleHttpMode","convertHostUrl","toggled","auth","isLoggedIn","preventSilentAccess","logout","enter","DOM","toggleConnection","attemptLoginWhenConnected","disconnect","isConnectedSubject","subscribe","cm","refreshCredentials","createRefreshCredentials","validateRefreshCredentials","ssoCredentials","createSSOCredentials","validateSSOCredentials","removeSSOToken","attemptBasicLogin","basicCredentials","createBasicCredentials","validateBasicCredentials","ssoToggledChanged","idp","ID","TYPE","catch","ssoLoginUrl","createLoginURL","inIFrame","inSymphonyDesktop","openPopup","assign","window","open","find","URL","credentials","authToken","url","returnUrl","AuthError","hasPasswordExpiredError","expired","getMessageError","isWorking","volatile","ForgotPasswordTemplate","ForgotPassword","messageBuilder","createForgotPasswordMessage","NotFound","RequestAccountTemplate","termsAgreed","RequestAccount","VerifyTemplate","code","Verify","ProtectedTemplate","onLogout","Protected","success","ResetPasswordTemplate","headingText","passwordResetToken","ResetPassword","hasPasswordExpired","phase","queryParams","onForgotPasswordWorkflow","onChangePasswordWorkflow","createForgotPasswordTokenMessage","createChangePasswordMessage","MainRouterConfig","RouterConfiguration","constructor","analytics","loginConfig","title","routes","path","element","settings","public","push","fallback","redirect","contributors","navigate","trackEvent","FoundationAnalyticsEventType","reAuthFromSession","cancel","captureReturnUrl","router","construct","Type","FoundationAnalytics","optional","options","providerTag","tagFor","provider","routerTag","ref","mixinRobotoFont","defaultTemplateOptions","anchor","button","card","checkbox","listboxOption","select","textField","definition","standaloneDefinition","Login","ready","registerDIDependencies","registerCommonComponents","checkForSSOToken","ssoToken","URLSearchParams","search","opener","sessionStorage","setItem","reload","close","setSessionStorageItem","registerZeroDesignSystem","ZeroDesignSystem","DefaultRouteRecognizer","ConnectConfig","defaultConnectConfig","heartbeatInterval","inject","LoginHosted","defineFactory"],"mappings":"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","file":"170.170.xxxxxxxxxxxxxxxxxxxx.js","sourcesContent":["import { css, ElementStyles } from '@microsoft/fast-element';\nimport { Container, DI, Registration } from '@microsoft/fast-foundation';\nimport defaultLogoSrc from '../assets/genesis-logo-light.svg';\nimport defaultBackgroundSrc from '../assets/bg.jpg';\n\n/**\n * Declare env vars for Webpack replacement via DefinePlugin.\n */\n// eslint-disable-next-line\ndeclare var DEFAULT_ORGANISATION: string;\n/**\n * @public\n */\nexport const defaultOrganisation = DEFAULT_ORGANISATION;\n\n// eslint-disable-next-line\ndeclare var DEFAULT_USER: string;\n/**\n * @public\n */\nexport const defaultUser = DEFAULT_USER;\n\n// eslint-disable-next-line\ndeclare var DEFAULT_PASSWORD: string;\n/**\n * @public\n */\nexport const defaultPassword = DEFAULT_PASSWORD;\n\n// eslint-disable-next-line\ndeclare var API_HOST: string;\n/**\n * @public\n */\nexport const defaultApiHost = API_HOST;\n\n// eslint-disable-next-line\ndeclare var SOCKET_EXT: string;\n/**\n * @public\n */\nexport const defaultSocketExt = SOCKET_EXT;\n\n/**\n * @public\n */\nexport const hostEnv = location.host;\n\nconst wsProtocol = 'https:' === location.protocol ? 'wss:' : 'ws:';\nconst socketExt = SOCKET_EXT || 'gwf';\n/**\n * @public\n */\nexport const hostUrl = API_HOST || `${wsProtocol}//${hostEnv}/${socketExt}/`;\n\n/**\n * @public\n */\nexport const Routes = {\n login: 'login',\n 'request-account': 'request-account',\n 'reset-password': 'reset-password',\n 'forgot-password': 'forgot-password',\n verify: 'verify',\n protected: 'protected',\n 'not-found': 'not-found',\n} as const;\n\n/**\n * @public\n */\nexport type Routes = (typeof Routes)[keyof typeof Routes];\n\n/**\n * A utility to check if a pathname is a route of this micro frontend.\n *\n * @param pathname - A pathname string to check, typically location.pathname, which is used when a value is omitted.\n *\n * @public\n * @privateRemarks\n * I've just put this util in for now given there's some app level direction code in place which needs review.\n */\nexport function isMFRoute(pathname: string = location.pathname): boolean {\n const valueParts = pathname.split('/');\n const routeIdx = pathname.charAt(0) === '/' ? 1 : 0;\n const route = valueParts[routeIdx];\n return !!Routes[route];\n}\n\n/**\n * @public\n * Could be expanded to allow field ViewTemplates.\n */\nexport type FieldConfig = {\n label: string;\n /**\n * @privateRemarks\n * Added for now to apply defaults, but I'm not convinced we should do this. Could be made reactive after upgrade.\n */\n value?: any;\n};\n\n/**\n * @public\n * @privateRemarks\n * Using null to exclude the organisation field rather than boolean, as it affords cleaner value lookups in the templates.\n */\nexport type FieldConfigMap = {\n organisation: FieldConfig | null;\n username: FieldConfig;\n email: FieldConfig;\n password: FieldConfig;\n};\n\n/**\n * @public\n */\nexport type SSOConfig = {\n /**\n * Optionally toggle the SSO journey on/off by default.\n */\n toggled?: boolean;\n /**\n * The identity providers path under the current host.\n *\n * @example\n * ```ts\n * identityProvidersPath: 'sso/list'\n * ```\n */\n identityProvidersPath: string;\n};\n\n/**\n * LoginConfig DI interface.\n *\n * @public\n */\nexport interface LoginConfig {\n /**\n * Connect automatically or require user to click a connect button.\n */\n autoConnect: boolean;\n /**\n * Login automatically or require user to click a login button after a connection is established.\n *\n * @remarks\n * Needs to manually be enabled in the NavigationContributor (see [2] in the example in the {@link Login} class).\n */\n autoAuth: boolean;\n /**\n * Logo styles.\n *\n * @remarks\n * Providing `null` will hide the logo. Use content: url(...); to set source.\n *\n * @example Setting a custom logo\n * ```ts\n * logo: css`\n * content: url(${customLogoImport});\n * `,\n * ```\n */\n logo: ElementStyles | null;\n /**\n * Background styles.\n *\n * @remarks\n * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/background} for more information.\n *\n * @example Setting a custom background image\n * ```ts\n * background: css`\n * :host {\n * background-image: url(${customBGImport});\n * }\n * `,\n * ```\n */\n background: ElementStyles;\n /**\n * Omit any of the internal routes except 'login' and 'not-found'.\n *\n * @remarks\n * Routes specified here will not be configured nor will any internal cross-links to them be displayed.\n *\n * @example\n * ```ts\n * omitRoutes: ['request-account'],\n * ```\n */\n omitRoutes: Exclude<Routes, 'login' | 'not-found'>[];\n /**\n * Map of configuration for each of the primary form fields.\n *\n * @remarks\n * Use to drive inclusion / exclusion, tailor labels etc.\n */\n fields: FieldConfigMap;\n /**\n * Show or hide the connection status indicator.\n */\n showConnectionIndicator: boolean;\n /**\n * The default URL to route the user to after a successful login.\n *\n * @remarks\n * Session.returnUrl set via Session.captureReturnUrl() trumps this value.\n */\n defaultRedirectUrl: string;\n /**\n * Omit certain return urls which the session service may have captured.\n *\n * @example\n * ```ts\n * omitRedirectUrls: ['/not-found'],\n * ```\n */\n omitRedirectUrls: string[];\n /**\n * SSO configuration.\n *\n * @remarks\n * Providing `null` excludes the SSO journey option completely.\n */\n sso: SSOConfig | null;\n /**\n * Display arbitrary version information.\n *\n * @remarks\n * Applications may choose to set this to display their Application release version on the login form.\n *\n * @example\n * ```ts\n * versionInformation: 'Version 3.0.0',\n * ```\n */\n versionInformation?: string;\n}\n\n/**\n * Default LoginConfig DI implementation.\n * @public\n */\nexport const defaultLoginConfig: LoginConfig = {\n autoConnect: false,\n autoAuth: false,\n logo: css`\n content: url(${defaultLogoSrc});\n `,\n background: css`\n :host {\n background-image: url(${defaultBackgroundSrc});\n }\n `,\n omitRoutes: [],\n fields: {\n organisation: null,\n username: {\n label: 'Username',\n value: defaultUser,\n },\n email: {\n label: 'Email Address',\n },\n password: {\n label: 'Password',\n value: defaultPassword,\n },\n },\n showConnectionIndicator: false,\n defaultRedirectUrl: '/protected',\n omitRedirectUrls: ['/not-found', '/not-permitted'],\n sso: {\n identityProvidersPath: 'sso/list',\n },\n};\n\n/**\n * LoginConfig DI key.\n *\n * @internal\n * @privateRemarks\n * Marked as internal to stop api-extractor becoming confused cross-linking tokens with the same name.\n */\nexport const LoginConfig = DI.createInterface<LoginConfig>();\n\n/**\n * Configure the login micro frontend settings.\n *\n * @remarks\n * This is primarily for general settings, rather than re-defining the element, static templating / style changes.\n *\n * @param container - DI container.\n * @param config - A partial LoginConfig.\n *\n * @example Configuring login on lazy load\n * ```ts\n * name: 'login',\n * path: 'login',\n * title: 'Login',\n * element: async () => {\n * const { configure, define, defaultLoginConfig } = await import('@genesislcap/foundation-login');\n * configure(this.container, {\n * autoConnect: true,\n * omitRoutes: ['request-account'],\n * fields: {\n * ...defaultLoginConfig.fields,\n * organisation: {\n * label: 'CompID',\n * },\n * },\n * defaultRedirectUrl: 'dashboard',\n * logo: loginLogo,\n * background: loginBG,\n * });\n * // You can import and return `Login` directly here or re-define it completely via `define`.\n * return define({\n * name: `nexus-login`,\n * });\n * },\n * layout: loginLayout,\n * settings: { public: true },\n * childRouters: true,\n * ```\n *\n * @public\n * @privateRemarks\n * We can tailor the spreading logic after we put it to use. Keeping it simple for now.\n */\nexport function configure(container: Container, config: Partial<LoginConfig>) {\n container.register(\n Registration.instance<LoginConfig>(LoginConfig, {\n ...defaultLoginConfig,\n ...config,\n })\n );\n}\n","import { createLogger } from '@genesislcap/foundation-utils';\nexport const logger = createLogger('foundation-login');\n","import { FoundationRouter } from '@genesislcap/foundation-ui';\nimport { logger } from '../utils';\n\nenum ResourceType {\n LOCAL = 'LOCAL',\n REMOTE = 'REMOTE',\n}\n\n/**\n * TODO: Think about sharing import functions across micro frontends.\n */\nfunction loadZeroFallback() {\n return import(\n /* webpackMode: \"lazy\" */\n '@genesislcap/foundation-zero'\n );\n}\n\n/**\n * Granular\n */\nasync function loadZeroDesignSystem() {\n let type = ResourceType.REMOTE;\n try {\n // @ts-ignore\n return await import('foundationZero/ZeroDesignSystem');\n } catch (e) {\n type = ResourceType.LOCAL;\n return await loadZeroFallback();\n } finally {\n logger.debug(`Using '${type}' version of foundationZero/ZeroDesignSystem`);\n }\n}\n\nexport type LoadRemotesOptions = {};\n\nexport async function loadRemotes(options: LoadRemotesOptions) {\n const { registerZeroDesignSystem } = await loadZeroDesignSystem();\n return {\n ZeroDesignSystem: registerZeroDesignSystem(),\n };\n}\n\n/**\n * Ensure tree shaking doesn't remove these\n * Perhaps we keep these MFs style free, ie. they need to get wrapped to have style applied. Keeping it simple for now.\n */\nFoundationRouter;\n","import {\n Auth,\n Connect,\n CredentialData,\n CredentialManager,\n Message,\n MessageBuilder,\n Session,\n} from '@genesislcap/foundation-comms';\nimport { sync } from '@genesislcap/foundation-utils';\nimport { SecondaryRapidColorHEX } from '@genesislcap/foundation-zero';\nimport {\n attr,\n Binding,\n css,\n customElement,\n FASTElement,\n html,\n observable,\n when,\n} from '@microsoft/fast-element';\nimport { Container } from '@microsoft/fast-foundation';\nimport { Route, Router } from '@microsoft/fast-router';\nimport { classNames } from '@microsoft/fast-web-utilities';\nimport { defaultLoginConfig, FieldConfigMap, hostUrl, LoginConfig, Routes } from '../main/config';\nimport { logger } from '../utils';\n\n/**\n * @internal\n */\nexport const defaultOnBackMS = 3_000;\n\n/**\n * @internal\n */\nexport type ConfigHost = {\n config: LoginConfig;\n};\n\n/**\n * @internal\n * @privateRemarks\n * For services / constructor injection, using @optional(LoginConfig) config = defaultLoginConfig; works as expected.\n * However, for elements, the @optional decorator isn't viable. This base element provides an alternative approach.\n */\nexport class ConfigHostElement extends FASTElement implements ConfigHost {\n @Container container!: Container;\n @observable config: LoginConfig;\n\n connectedCallback() {\n this.config = this.container.has(LoginConfig, true)\n ? this.container.get(LoginConfig)\n : defaultLoginConfig;\n super.connectedCallback();\n }\n}\n\n/**\n * @internal\n */\nexport class BaseRoute extends ConfigHostElement {\n @Auth auth!: Auth;\n @Connect connect!: Connect;\n @Session session!: Session;\n @MessageBuilder messageBuilder!: MessageBuilder;\n @CredentialManager credentialManager!: CredentialManager;\n\n @observable host: string = '';\n @observable organisation: string = '';\n @observable username: string = '';\n @observable email: string = '';\n @observable password: string = '';\n @observable password2: string = ''; // < New, confirm etc.\n\n @observable showPasswords: boolean = false;\n @observable message: string = '';\n @observable hasErrors: boolean = false;\n @observable isSubmitting: boolean = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.host = this.session.getSessionStorageItem('hostUrl') ?? hostUrl;\n /**\n * Fill with default values from config / env vars if needed.\n * For now using CredentialManager based auto-filling.\n * TODO: Review use cases.\n */\n // this.organisation = this.config.fields.organisation?.value;\n // this.username = this.config.fields.username?.value;\n // this.email = this.config.fields.email?.value;\n // this.password = this.config.fields.password?.value;\n }\n\n async onSubmit() {\n this.isSubmitting = true;\n this.clearError();\n await this.ensureConnection();\n }\n\n async ensureConnection() {\n if (this.connect.isConnected) {\n return true;\n }\n return this.connect.connect(this.host);\n }\n\n setError(message: string) {\n this.message = message;\n this.hasErrors = true;\n }\n\n clearError() {\n this.message = '';\n this.hasErrors = false;\n }\n\n get orgUsername(): string {\n return this.config.fields.organisation\n ? `${this.username.trim()}:${this.organisation.trim()}`\n : this.username.trim();\n }\n\n onBack = () => this.onNavigate('login');\n\n onNavigate = (routeName: Routes, params?: {}) =>\n Route.name.push(Router.find(this), routeName, params);\n\n queueOnBack(delay = defaultOnBackMS) {\n setTimeout(() => {\n this.onBack();\n }, delay);\n }\n\n async autofill(): Promise<boolean> {\n let credentialData: CredentialData;\n try {\n credentialData = await this.credentialManager.getCredentials();\n if (credentialData) {\n this.username = credentialData.name ?? '';\n this.password = credentialData.password ?? '';\n if (this.config.fields.organisation) {\n const combinedCompIdUsername = credentialData.id ?? '';\n const valueParts = combinedCompIdUsername.split(':');\n const orgIdx = valueParts.length === 2 ? 1 : 0;\n const proposedOrganisation = valueParts[orgIdx];\n if (proposedOrganisation !== this.username) {\n this.organisation = proposedOrganisation;\n }\n }\n }\n } catch (err) {\n logger.error(\n 'An error occurred attempting to get and autofill from stored credentials.',\n err\n );\n }\n return Promise.resolve(!!credentialData);\n }\n\n storeCredentials(password: string = this.password) {\n this.credentialManager.storeCredentials({\n id: this.orgUsername,\n name: this.username,\n password,\n });\n }\n\n async sendMessage<T = any>(\n message: Message<T>,\n successFeedback: string = '',\n successCallback?: (result: any) => void\n ) {\n await this.ensureConnection();\n this.clearError();\n const result = await this.connect.send(message);\n if (result.ERROR) {\n this.setError(result.ERROR.map((error) => error.TEXT).toString());\n return;\n }\n this.message = successFeedback;\n successCallback && successCallback(result);\n this.queueOnBack();\n }\n}\n\n/**\n * @internal\n * @privateRemarks\n * Potential optimisation ahead of workflow / statemachine based smart forms integration, but needs tagFor.\n * Feels a bit at odds with the declarative nature we're aiming for, but will await review.\n */\nexport const configurableTextField = <T extends ConfigHost>(\n name: keyof FieldConfigMap | [name: keyof FieldConfigMap, valueKey: string],\n type: string,\n autofocus: boolean = false,\n autocomplete: string = '',\n className: string = '',\n labelOverride: string = '',\n testIdOverride: string = '',\n required: boolean = true\n) => {\n // Just pass the FieldConfig instead of name?\n const [fieldName, valueKey] = Array.isArray(name) ? name : [name, name];\n return html<T>`\n ${when(\n (x) => x.config.fields[fieldName],\n html<T>`\n <zero-text-field\n type=\"${type}\"\n name=\"${fieldName}\"\n id=\"${fieldName}\"\n :value=\"${sync((x) => x[valueKey])}\"\n ?autofocus=\"${() => autofocus}\"\n ?required=\"${() => required}\"\n ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n data-test-id=\"${testIdOverride ?? fieldName}\"\n class=\"${className}\"\n >\n <span class=\"form-title\">\n ${(x) => labelOverride ?? x.config.fields[fieldName]!.label}\n </span>\n </zero-text-field>\n `\n )}\n `;\n};\n\n/**\n * @internal\n */\nexport const organisationField = <T extends BaseRoute>() => html<T>`\n ${when(\n (x) => x.config.fields.organisation,\n html<T>`\n <zero-text-field\n type=\"text\"\n name=\"organisation\"\n id=\"organisation\"\n autocomplete=\"organisation\"\n data-test-id=\"organisation\"\n :value=\"${sync((x) => x.organisation)}\"\n autofocus\n class=\"${(x) => (!x.config.logo ? 'no-top-margin' : '')}\"\n required\n >\n <span class=\"form-title\">\n ${(x) => x.config.fields.organisation!.label ?? 'Organisation'}\n </span>\n </zero-text-field>\n `\n )}\n`;\n\n/**\n * @internal\n */\nexport const usernameField = <T extends BaseRoute>() => html<T>`\n <zero-text-field\n type=\"text\"\n name=\"username\"\n id=\"username\"\n autocomplete=\"username email\"\n data-test-id=\"username\"\n :value=\"${sync((x) => x.username)}\"\n ?autofocus=\"${(x) => !x.config.fields.organisation}\"\n class=\"${(x) => (!x.config.logo && !x.config.fields.organisation ? 'no-top-margin' : '')}\"\n required\n >\n <span class=\"form-title\">${(x) => x.config.fields.username.label ?? 'Username'}</span>\n </zero-text-field>\n`;\n\n/**\n * @internal\n */\nexport const emailField = <T extends BaseRoute>() => html<T>`\n ${when(\n (x) => x.config.fields.email,\n html<T>`\n <zero-text-field\n type=\"email\"\n name=\"email\"\n id=\"email\"\n autocomplete=\"email\"\n data-test-id=\"email\"\n :value=\"${sync((x) => x.email)}\"\n required\n >\n <span class=\"form-title\">${(x) => x.config.fields.email.label ?? 'Email'}</span>\n </zero-text-field>\n `\n )}\n`;\n\n/**\n * @internal\n */\nexport const passwordField = <T extends BaseRoute>(label?: string) => html<T>`\n <zero-text-field\n type=\"${(x) => (x.showPasswords ? 'text' : 'password')}\"\n name=\"password\"\n id=\"password\"\n autocomplete=\"current-password\"\n data-test-id=\"password\"\n :value=\"${sync((x) => x.password)}\"\n required\n >\n <span class=\"form-title\">${(x) => label ?? x.config.fields.password.label ?? 'Password'}</span>\n </zero-text-field>\n`;\n\nconst password2FieldMeta = {\n new: ['new-password', 'New Password'],\n confirmation: ['password-confirmation', 'Confirm Password'],\n};\n\n/**\n * @internal\n */\nexport const password2Field = <T extends BaseRoute>(type: 'new' | 'confirmation') => {\n const [name, label] = password2FieldMeta[type];\n return html<T>`\n <zero-text-field\n type=\"${(x) => (x.showPasswords ? 'text' : 'password')}\"\n name=\"${name}\"\n id=\"${name}\"\n autocomplete=\"${name}\"\n data-test-id=\"${name}\"\n :value=\"${sync((x) => x.password2)}\"\n required\n >\n <span class=\"form-title\">${label}</span>\n </zero-text-field>\n `;\n};\n\n/**\n * @internal\n * @privateRemarks\n * Temp optimisation. How we handle images like this needs a broader review.\n */\n@customElement({\n name: 'login-background',\n template: html<BackgroundElement>`\n <template class=\"background\" part=\"background\" data-test-id=\"background\">\n <slot></slot>\n </template>\n `,\n styles: css`\n :host {\n background-color: var(--foundation-login-background-color, transparent);\n background-position: left top;\n background-repeat: no-repeat;\n background-attachment: fixed;\n background-size: cover;\n background-origin: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n overflow: auto;\n }\n ::slotted(div.container) {\n margin: auto;\n }\n `,\n})\nexport class BackgroundElement extends ConfigHostElement {\n connectedCallback() {\n super.connectedCallback();\n this.$fastController.addStyles(this.config.background);\n }\n}\n\n/**\n * @internal\n */\n@customElement({\n name: 'login-logo',\n template: html<LogoElement>`\n ${when(\n (x) => x.config.logo,\n html<LogoElement>`\n <img class=\"logo\" style=\"${(x) => x.config.logo.styles}\" part=\"logo\" data-test-id=\"logo\" />\n `\n )}\n `,\n styles: css`\n .logo {\n display: initial;\n margin-bottom: calc(var(--design-unit) * 5px);\n transition: opacity 5s ease-in-out;\n width: auto;\n height: auto;\n }\n `,\n})\nexport class LogoElement extends ConfigHostElement {}\n\n/**\n * @internal\n */\nexport const backButton = <T extends ConfigHost>(binding: Binding) => html<T>`\n <zero-button\n appearance=\"neutral-grey\"\n type=\"button\"\n class=\"action-btn\"\n @click=${binding}\n data-test-id=\"back\"\n >\n Back\n </zero-button>\n`;\n\n/**\n * @internal\n */\nexport const submitButton = <T extends ConfigHost>(\n label: string,\n dataTestId: string = 'submit',\n disabled: boolean = false\n) => html<T>`\n <zero-button\n appearance=\"primary-gradient\"\n type=\"submit\"\n class=\"action-btn\"\n data-test-id=\"${dataTestId}\"\n ?disabled=\"${() => disabled}\"\n >\n ${label}\n </zero-button>\n`;\n\n/**\n * @internal\n */\nexport const showPasswordsCheckbox = <T extends BaseRoute>() => html<T>`\n <zero-checkbox\n ?checked=\"${sync((x) => x.showPasswords, 'boolean')}\"\n name=\"show-passwords\"\n data-test-id=\"show-passwords\"\n >\n Show Passwords\n </zero-checkbox>\n`;\n\n/**\n * @internal\n * @privateRemarks\n * Temp optimisation. How we handle images like this needs a broader review.\n */\n@customElement({\n name: 'login-message',\n template: html<MessageElement>`\n ${when(\n (x) => x.message,\n html<MessageElement>`\n <span class=\"${(x) => x.classNames}\" part=\"message\" data-test-id=\"message\">\n ${(x) => x.message}\n </span>\n `\n )}\n `,\n styles: css`\n :host {\n text-align: center;\n }\n .message {\n color: ${SecondaryRapidColorHEX.orange};\n margin-top: calc(var(--design-unit) * 3px);\n white-space: pre-line;\n }\n .message.non-error {\n color: ${SecondaryRapidColorHEX.teal};\n }\n `,\n})\nexport class MessageElement extends FASTElement {\n @observable classNames: string = '';\n @attr message: string = '';\n @attr({ mode: 'boolean', attribute: 'non-error' }) nonError: boolean = false;\n nonErrorChanged() {\n this.classNames = classNames('message', ['non-error', this.nonError]);\n }\n}\n\n/**\n * @internal\n */\n@customElement({\n name: 'submitting-indicator',\n template: html<SubmittingIndicator>`\n ${when(\n (x) => x.isSubmitting,\n html<SubmittingIndicator>`\n <zero-progress-ring\n part=\"submitting-indicator\"\n data-test-id=\"submitting-indicator\"\n ></zero-progress-ring>\n `\n )}\n `,\n styles: css`\n :host {\n display: flex;\n justify-content: center;\n }\n zero-progress-ring {\n align-self: center;\n }\n `,\n})\nexport class SubmittingIndicator extends FASTElement {\n @attr({ mode: 'boolean', attribute: 'is-submitting' }) isSubmitting: boolean = false;\n}\n","import { css, html } from '@microsoft/fast-element';\nimport { FASTElementLayout } from '@microsoft/fast-router';\n\nexport const defaultLayout = new FASTElementLayout(\n html`\n <div class=\"container\">\n <div class=\"content\">\n <slot></slot>\n </div>\n </div>\n `,\n css`\n :host {\n }\n\n .container {\n width: 100%;\n height: 100%;\n display: block;\n position: relative;\n }\n\n .content {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n `\n);\n","const mixinSegoeUI = (style = 'normal', weight = 'normal') => `\n font-family: \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif; \n font-style: ${style};\n font-weight: ${weight};\n`;\n\nexport const stylesFontFaces = `\n @font-face {\n font-family: Segoe UI;\n font-weight: 300;\n src: local(\"Segoe UI Semilight\"), local(\"Segoe UI\");\n }\n\n * {\n ${mixinSegoeUI()}\n }\n`;\n\nexport const mixinCardTitle = mixinSegoeUI('normal', 'bold');\n\nexport const stylesHeaders = `\n h1, h2, h3, h4, h5, h6 {\n margin: 0;\n }\n\n h1 {\n margin-bottom: 16px;\n }\n`;\n","import { css } from '@microsoft/fast-element';\nimport { neutralLayer1 } from '@microsoft/fast-components';\nimport { mixinCardTitle } from './typography';\n\nexport const mixinScreen = (display: string = 'block') => `\n contain: content;\n display: ${display};\n height: 100%;\n width: 100%;\n overflow-y: auto;\n`;\n\nexport const commonHostStyles = css`\n :host {\n contain: content;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n\n --design-unit: 3.5;\n }\n`;\n\nexport const commonLoginStyles = css`\n .container {\n min-width: 330px;\n width: 15%;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n animate: all 3s ease-in 0s;\n }\n\n .no-top-margin {\n margin-top: 0;\n }\n\n .no-top-margin::part(label) {\n margin-top: 0;\n }\n\n .card-pd {\n --zero-card-fill-color: #202126;\n padding: calc(var(--design-unit) * 5px);\n }\n\n .card-mg {\n margin: calc(var(--design-unit) * 2px);\n }\n\n .column-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .logo {\n display: initial;\n margin-bottom: calc(var(--design-unit) * 5px);\n transition: opacity 5s ease-in-out;\n }\n\n .heading {\n ${mixinCardTitle};\n\n background-color: ${neutralLayer1};\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n font-size: 20px;\n margin: -4px -16px 0 -16px;\n padding: 8px 16px;\n }\n\n .heading2 {\n font-family: Roboto-Medium, sans-serif;\n font-weight: 500;\n font-style: normal;\n font-size: 16px;\n text-align: center;\n opacity: 80%;\n margin-bottom: 10px;\n }\n\n .heading3 {\n text-align: center;\n font-family: Roboto-Medium, sans-serif;\n font-weight: 500;\n font-style: normal;\n font-size: 12px;\n opacity: 50%;\n margin-bottom: calc(var(--design-unit) * 5px);\n }\n\n form {\n display: flex;\n flex-direction: column;\n }\n\n .action-btn {\n margin-top: calc(var(--design-unit) * 5px);\n }\n\n .form-buttons {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n }\n\n .form-title {\n font-family: Roboto-Medium, sans-serif;\n font-style: normal;\n color: var(--neutral-stroke-rest);\n }\n\n zero-text-field {\n margin: 8px 0 12px;\n }\n\n zero-text-field::part(label) {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n zero-text-field,\n zero-select {\n margin-bottom: calc(var(--design-unit) * 3px);\n }\n\n zero-button::part(info1),\n zero-button::part(info2) {\n display: none;\n }\n\n zero-checkbox {\n margin-top: calc(var(--design-unit) * 3px);\n }\n\n zero-checkbox::part(label) {\n color: var(--neutral-stroke-rest);\n }\n`;\n\nexport const commonLoginRouteStyles = css`\n ${commonHostStyles}\n ${commonLoginStyles}\n`;\n","import { css } from '@microsoft/fast-element';\nimport { commonLoginRouteStyles } from '../../styles';\n\nexport const LoginFormStyles = css`\n ${commonLoginRouteStyles}\n .link-url {\n width: fit-content;\n cursor: pointer;\n font-weight: 500;\n font-size: 12px;\n color: var(--accent-foreground-rest);\n opacity: 80%;\n padding: 1px 0;\n line-height: calc(var(--design-unit) * 6px);\n text-decoration: none;\n }\n\n .link-url:hover {\n color: var(--accent-foreground-hover);\n opacity: 100%;\n border-bottom: 1px solid;\n margin-bottom: -1px;\n }\n\n .action-btn {\n margin: calc(var(--design-unit) * 5px) 0;\n }\n\n .sso {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: stretch;\n }\n\n .sso .form-title {\n font-size: var(--type-ramp-base-font-size);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n .links {\n display: flex;\n justify-content: space-between;\n align-content: center;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .password-links {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-self: flex-start;\n }\n\n .account-links {\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-self: flex-start;\n }\n\n .case-warning {\n color: #379ec0;\n font-size: 0.83em;\n margin-block-start: 1em;\n margin-block-end: 1em;\n }\n\n .version {\n width: fit-content;\n font-weight: 500;\n font-size: 10px;\n color: var(--accent-foreground-rest);\n opacity: 80%;\n padding: 1px 0;\n line-height: calc(var(--design-unit) * 6px);\n }\n`;\n","import { html, repeat, when } from '@microsoft/fast-element';\nimport { sync } from '@genesislcap/foundation-utils';\nimport {\n organisationField,\n passwordField,\n showPasswordsCheckbox,\n usernameField,\n submitButton,\n} from '../base';\nimport type { LoginForm } from './login-form';\nimport { IDP } from '../types';\n\nconst regularLogin = html<LoginForm>`\n ${when(\n (login) => !login.ssoToggled,\n html<LoginForm>`\n ${organisationField()} ${usernameField()} ${passwordField()}\n <span class=\"case-warning\">*Fields are case-sensitive</span>\n ${showPasswordsCheckbox()}\n <div class=\"form-buttons\">\n ${(x) => submitButton('Login', 'submit-login', x.submitDisabled)}\n <div class=\"links\">\n <div class=\"password-links\">\n ${when(\n (x) => !x.config.omitRoutes.includes('forgot-password'),\n html<LoginForm>`\n <a\n class=\"link-url\"\n @click=${(x) => x.onNavigate(`forgot-password`)}\n data-test-id=\"forgot-password\"\n >\n Forgot Password?\n </a>\n `\n )}\n ${when(\n (x) => !x.config.omitRoutes.includes('reset-password'),\n html<LoginForm>`\n <a\n class=\"link-url\"\n @click=${(x) => x.onNavigate(`reset-password`)}\n data-test-id=\"reset-password\"\n >\n Change Password\n </a>\n `\n )}\n </div>\n <div class=\"account-links\">\n ${when(\n (x) => !x.config.omitRoutes.includes('request-account'),\n html<LoginForm>`\n <a\n class=\"link-url\"\n @click=${(x) => x.onNavigate(`request-account`)}\n data-test-id=\"request-account\"\n >\n Request Account\n </a>\n `\n )}\n </div>\n </div>\n </div>\n ${when(\n (x) => x.config.versionInformation,\n html<LoginForm>`\n <div>\n <span class=\"version\" data-test-id=\"version\">\n ${(x) => x.config.versionInformation}\n </span>\n </div>\n `\n )}\n `\n )}\n`;\n\nconst ssoLogin = html<LoginForm>`\n ${when(\n (login) => login.ssoToggled,\n html<LoginForm>`\n <div class=\"sso\">\n <span class=\"form-title\">Providers</span>\n <zero-select\n name=\"sso\"\n data-test-id=\"sso\"\n :value=${sync((x) => x.selectedIDP)}\n ?disabled=${(x) => !x.idps.length}\n >\n ${repeat(\n (x) => x.idps,\n html<IDP>`\n <zero-option value=\"${({ id }) => id}\">${({ id }) => id}</zero-option>\n `\n )}\n </zero-select>\n <zero-button\n type=\"button\"\n class=\"action-btn\"\n appearance=\"primary-gradient\"\n @click=\"${(x) => x.onClickSSO()}\"\n data-test-id=\"sso-login\"\n ?disabled=${(x) => !x.selectedIDP}\n >\n SSO Login\n </zero-button>\n </div>\n `\n )}\n`;\n\nconst httpModeEnabledText = html`\n <pre data-test-id=\"connect-http-mode\">Http Polling Mode Enabled.</pre>\n`;\n\nconst httpMode = html<LoginForm>`\n ${(x) => (x.connect.httpMode() ? httpModeEnabledText : null)}\n`;\n\nconst connectionIndicator = html<LoginForm>`\n <zero-connection-indicator show-label=\"true\" />\n`;\n\nconst connectionIndicatorWrapper = html<LoginForm>`\n ${(x) => (x.connect.httpMode() ? null : connectionIndicator)}\n`;\n\nexport const LoginFormTemplate = html<LoginForm>`\n <login-background>\n <div class=\"container\">\n ${when(\n (x) => !x.config.autoConnect,\n html<LoginForm>`\n <zero-card class=\"card-pd card-mg\">\n <form\n id=\"connect-form\"\n method=\"post\"\n autocomplete=\"on\"\n @submit=${(x) => x.onHostSubmit()}\n ?disabled=${(x) => x.submitConnectDisabled}\n data-test-id=\"connect-form\"\n >\n <zero-text-field\n class=\"no-top-margin\"\n type=\"text\"\n name=\"host\"\n :value=${sync((x) => x.host)}\n ?disabled=${(x) => x.connect.isConnected}\n data-test-id=\"connect-host\"\n required\n >\n <span class=\"form-title\">Host</span>\n </zero-text-field>\n\n ${httpMode}\n\n <div class=\"form-buttons\">\n ${(x) =>\n submitButton(x.connectActionText, 'submit-connect', x.submitConnectDisabled)}\n </div>\n </form>\n </zero-card>\n `\n )}\n\n <zero-card class=\"card-pd\">\n <div class=\"column-content\">\n <login-logo></login-logo>\n <div class=\"heading2\">Login</div>\n </div>\n <form\n id=\"login-form\"\n method=\"post\"\n autocomplete=\"on\"\n @submit=${(x) => x.onLoginSubmit()}\n ?disabled=${(x) => x.submitDisabled}\n data-test-id=\"login-form\"\n >\n ${regularLogin} ${ssoLogin}\n ${when(\n (x) => x.config.sso,\n html<LoginForm>`\n <zero-checkbox\n ?checked=\"${sync((x) => x.ssoToggled, 'boolean')}\"\n name=\"sso-toggle\"\n data-test-id=\"sso-toggle\"\n >\n ${(x) => (x.ssoToggled ? 'SSO Enabled' + x.selectedIDPName : 'Enable SSO?')}\n </zero-checkbox>\n `\n )}\n <login-message\n message=\"${(x) => x.message}\"\n non-error=\"${(x) => !x.hasErrors}\"\n ></login-message>\n ${when(\n (x) => x.config.showConnectionIndicator,\n html<LoginForm>`\n ${connectionIndicatorWrapper}\n `\n )}\n </form>\n </zero-card>\n </div>\n </login-background>\n`;\n","import { AuthError, AuthInfo, Connect } from '@genesislcap/foundation-comms';\nimport { inIFrame, inSymphonyDesktop, openPopup } from '@genesislcap/foundation-utils';\nimport { customElement, DOM, observable, volatile } from '@microsoft/fast-element';\nimport { Route } from '@microsoft/fast-router';\nimport { logger } from '../../utils';\nimport { LoginFormStyles as styles } from './login-form.styles';\nimport { LoginFormTemplate as template } from './login-form.template';\nimport { BaseRoute } from '../base';\nimport { IDP, IDPResponse } from '../types';\n\n@customElement({\n name: 'foundation-login-form',\n template,\n styles,\n})\nexport class LoginForm extends BaseRoute {\n @observable idps: IDP[] = [];\n @observable selectedIDP: string = '';\n @observable ssoToggled: boolean = false;\n\n async connectedCallback() {\n super.connectedCallback();\n this.ssoToggled = this.config.sso?.toggled ?? false;\n\n if (this.connect.isConnected && this.auth.isLoggedIn) {\n await this.credentialManager.preventSilentAccess();\n await this.auth.logout();\n }\n\n this.convertHostUrl();\n await this.autofill();\n }\n\n async enter() {\n DOM.queueUpdate(async () => {\n try {\n if (!this.connect.isConnected && this.config.autoConnect) {\n await this.toggleConnection();\n }\n if (!this.auth.isLoggedIn && this.config.autoAuth) {\n this.attemptLoginWhenConnected();\n }\n } catch (e) {\n logger.debug(e);\n }\n });\n }\n\n async toggleConnection(): Promise<boolean | undefined> {\n if (this.connect.isConnected) {\n this.connect.disconnect();\n logger.debug(`Disconnected from ${this.host}`);\n return;\n }\n return this.connect.connect(this.host);\n }\n\n private attemptLoginWhenConnected(): void {\n this.connect.isConnectedSubject.subscribe((isConnected) => {\n if (isConnected) {\n /**\n * Login preference flow taken from @genesislcap/foundation-login.\n * We should sit down with Jose and team to cross check this. Reference code is bit hard to follow in places.\n */\n const cm = this.credentialManager;\n const refreshCredentials = cm.createRefreshCredentials();\n if (cm.validateRefreshCredentials(refreshCredentials)) {\n logger.debug(`Attempting to login with refresh credentials.`);\n this.login(refreshCredentials);\n return;\n }\n\n if (this.ssoToggled) {\n const ssoCredentials = cm.createSSOCredentials();\n if (cm.validateSSOCredentials(ssoCredentials)) {\n logger.debug(`Attempting to login with SSO.`);\n this.login(ssoCredentials);\n this.credentialManager.removeSSOToken(); // < sso tokens can only be used once, remove after login attempt\n return;\n }\n }\n\n this.attemptBasicLogin();\n }\n });\n }\n\n private attemptBasicLogin() {\n const basicCredentials = this.credentialManager.createBasicCredentials({\n username: this.orgUsername,\n password: this.password,\n });\n if (!this.credentialManager.validateBasicCredentials(basicCredentials)) {\n logger.debug(`Basic credentials appear invalid, aborting login attempt.`);\n return;\n }\n\n logger.debug(`Attempting to login with basic credentials.`);\n this.login(basicCredentials);\n }\n\n ssoToggledChanged() {\n this.clearError();\n if (this.ssoToggled) {\n this.fetchIDPs()\n .then((idps: IDPResponse[]) => {\n logger.debug('fetched IDPs', idps);\n this.idps = idps.map((idp) => ({\n id: idp.ID,\n type: idp.TYPE,\n }));\n this.selectedIDP = this?.idps?.[0]?.id;\n })\n .catch(() => this.setError('Failed to fetch identity providers.'));\n }\n }\n\n @volatile\n get selectedIDPName() {\n return this.selectedIDP ? ` - ${this.selectedIDP}` : '';\n }\n\n private fetchIDPs = async (): Promise<IDPResponse[]> => {\n const fixEndpoint = (endpoint: string) =>\n endpoint.startsWith('ws:')\n ? endpoint.replace('ws:', 'http:')\n : endpoint.startsWith('wss:')\n ? endpoint.replace('wss:', 'https:')\n : endpoint;\n\n const host = fixEndpoint(this.host);\n const ipdsEndpoint = `${host}${this.config.sso?.identityProvidersPath ?? 'sso/list'}`;\n return fetch(ipdsEndpoint)\n .then((res) => {\n if (res.ok) return res;\n throw new Error(res.statusText);\n })\n .then((res) => res.json())\n .then((json) => json.IDPS);\n };\n\n toggleHttpMode = (e: CustomEvent): void => {\n if (!this.connect) return;\n // TODO: ability to swap between Connect and HttpConnect on the fly\n this.convertHostUrl();\n };\n\n onClickSSO() {\n const ssoLoginUrl = this.createLoginURL();\n\n if (inIFrame()) {\n if (inSymphonyDesktop()) {\n // symphony/electron opens new window in the default browser instead\n // popup within electron, so we have to navigate manually\n openPopup('', 'symphony').location.assign(ssoLoginUrl);\n } else {\n openPopup(ssoLoginUrl, 'Login');\n }\n } else {\n window.open(ssoLoginUrl, '_self');\n }\n }\n\n private createLoginURL() {\n const selectedIDP = this.idps.find((idp) => idp.id === this.selectedIDP);\n const appHost = new URL(this.host).host;\n const ssoLoginRoute = `/gwf/${selectedIDP.type}/login`;\n const ssoLoginUrl = `https://${appHost}${ssoLoginRoute}?idp=${selectedIDP.id}`;\n return ssoLoginUrl;\n }\n\n private convertHostUrl() {\n if (this.connect?.httpMode() && this.host?.startsWith('ws')) {\n this.host = this.host.replace('ws', 'http');\n } else if (!this.connect?.httpMode() && this.host?.startsWith('http')) {\n this.host = this.host.replace('http', 'ws');\n }\n }\n\n async onHostSubmit() {\n logger.debug('host submission');\n await this.toggleConnection();\n }\n\n async onLoginSubmit() {\n logger.debug('login submission');\n await super.onSubmit();\n DOM.queueUpdate(() => {\n this.attemptBasicLogin();\n });\n }\n\n async login(credentials: AuthInfo) {\n try {\n const { authToken } = await this.auth.login(credentials);\n if (!authToken) {\n throw new Error('Unable to login. Try again later.');\n }\n this.storeCredentials();\n let url = this.config.defaultRedirectUrl;\n if (\n this.session.returnUrl &&\n !this.config.omitRedirectUrls.includes(this.session.returnUrl)\n ) {\n url = this.session.returnUrl;\n }\n Route.path.push(url);\n } catch (err) {\n if (err instanceof AuthError) {\n if (err.hasPasswordExpiredError()) {\n this.storeCredentials();\n this.onNavigate('reset-password', { expired: true });\n return;\n }\n if (this.config.fields.organisation && !this.organisation.length) {\n this.setError(err.message + 'Please fill in Comp Id.');\n return;\n }\n this.setError(err.message + err.getMessageError());\n return;\n }\n this.setError(err.message);\n }\n }\n\n @volatile\n get connectActionText() {\n return this.connect.isConnected ? 'Disconnect' : 'Connect';\n }\n\n get submitConnectDisabled() {\n return !this.host;\n }\n\n get submitDisabled() {\n return !this.connect.httpMode() && (this.connect.isWorking || !this.connect.isConnected);\n }\n}\n","import { html } from '@microsoft/fast-element';\nimport { backButton, organisationField, submitButton, usernameField } from '../base';\nimport type { ForgotPassword } from './forgot-password';\n\nexport const ForgotPasswordTemplate = html<ForgotPassword>`\n <login-background>\n <div class=\"container\">\n <zero-card class=\"card-pd\">\n <div class=\"column-content\">\n <login-logo></login-logo>\n <div class=\"heading2\">Forgotten Password</div>\n <div class=\"heading3\">Enter your account username</div>\n </div>\n <form @submit=${(x) => x.onSubmit()}>\n ${organisationField()} ${usernameField()}\n <div class=\"form-buttons\">\n ${submitButton('Send Recovery Link')} ${backButton((x) => x.onBack())}\n </div>\n <submitting-indicator is-submitting=\"${(x) => x.isSubmitting}\"></submitting-indicator>\n <login-message\n message=\"${(x) => x.message}\"\n non-error=\"${(x) => !x.hasErrors}\"\n ></login-message>\n </form>\n </zero-card>\n </div>\n </login-background>\n`;\n","import { customElement } from '@microsoft/fast-element';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\nimport { ForgotPasswordTemplate as template } from './forgot-password.template';\nimport { logger } from '../../utils';\nimport { hostEnv } from '../../main/config';\n\n@customElement({\n name: 'foundation-login-forgot-password',\n template,\n styles: commonLoginRouteStyles,\n})\nexport class ForgotPassword extends BaseRoute {\n async connectedCallback() {\n super.connectedCallback();\n await this.autofill();\n }\n\n async onSubmit() {\n logger.debug('forgot password submission');\n await super.onSubmit();\n /**\n * Example url from email: https://public-foundation.genesislab.global/reset-password?password=nc_cbGrlgCkZeJHAF043oqEidnk\n */\n const returnUrl = `${location.protocol}//${hostEnv}/reset-password`;\n const message = this.messageBuilder.createForgotPasswordMessage(this.orgUsername, returnUrl);\n await this.sendMessage(message, 'Please check your inbox for reset instructions.');\n }\n}\n","import { customElement, html } from '@microsoft/fast-element';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\n\n@customElement({\n name: 'foundation-login-not-found',\n template: html`\n <h1 data-test-id=\"not-found\">Not found! 404</h1>\n `,\n styles: commonLoginRouteStyles,\n})\nexport class NotFound extends BaseRoute {}\n","import { html } from '@microsoft/fast-element';\nimport { sync } from '@genesislcap/foundation-utils';\nimport {\n backButton,\n emailField,\n organisationField,\n password2Field,\n passwordField,\n usernameField,\n} from '../base';\nimport type { RequestAccount } from './request-account';\n\nexport const RequestAccountTemplate = html<RequestAccount>`\n <login-background>\n <div class=\"container\">\n <zero-card class=\"card-pd\">\n <div class=\"column-content\">\n <login-logo></login-logo>\n <div class=\"heading2\">Request Account</div>\n </div>\n <form @submit=${(x) => x.onSubmit()}>\n ${organisationField()} ${usernameField()} ${emailField()} ${passwordField()}\n ${password2Field('confirmation')}\n <zero-checkbox\n name=\"terms\"\n :value=${sync((x) => x.termsAgreed, 'boolean')}\n data-test-id=\"terms\"\n >\n I agree to the\n <stong>Terms</stong>\n and\n <stong>Conditions</stong>\n </zero-checkbox>\n <div class=\"form-buttons\">\n <submit-button\n is-submitting=\"${(x) => x.isSubmitting}\"\n label=\"Request Account\"\n ></submit-button>\n ${backButton((x) => x.onBack())}\n </div>\n <login-message message=\"${(x) => x.message}\"></login-message>\n </form>\n </zero-card>\n </div>\n </login-background>\n`;\n","import { customElement, observable } from '@microsoft/fast-element';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\nimport { RequestAccountTemplate as template } from './request-account.template';\nimport { logger } from '../../utils';\n\n@customElement({\n name: 'foundation-login-request-account',\n template,\n styles: commonLoginRouteStyles,\n})\nexport class RequestAccount extends BaseRoute {\n @observable termsAgreed = false;\n\n async onSubmit() {\n logger.debug('request account submission');\n await super.onSubmit();\n }\n}\n","import { sync } from '@genesislcap/foundation-utils';\nimport { html } from '@microsoft/fast-element';\nimport { backButton } from '../base';\nimport type { Verify } from './verify';\n\nexport const VerifyTemplate = html<Verify>`\n <login-background>\n <div class=\"container\">\n <zero-card class=\"card-pd\">\n <div class=\"column-content\">\n <login-logo></login-logo>\n <div class=\"heading2\">Verify that it's you</div>\n <div class=\"heading3\">\n We've sent a code to the email address attached to this account.\n </div>\n </div>\n <form @submit=${(x) => x.onSubmit()}>\n <zero-text-field\n type=\"text\"\n name=\"code\"\n autocomplete=\"one-time-code\"\n :value=${sync((x) => x.code)}\n autofocus\n data-test-id=\"code\"\n >\n <span class=\"form-title\">Verification Code</span>\n </zero-text-field>\n <div class=\"form-buttons\">\n <submit-button\n is-submitting=\"${(x) => x.isSubmitting}\"\n label=\"Verify and Login\"\n ></submit-button>\n ${backButton((x) => x.onBack())}\n </div>\n <login-message message=\"${(x) => x.message}\"></login-message>\n </form>\n </zero-card>\n </div>\n </login-background>\n`;\n","import { customElement, observable } from '@microsoft/fast-element';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\nimport { VerifyTemplate as template } from './verify.template';\nimport { logger } from '../../utils';\n\n@customElement({\n name: 'foundation-login-verify',\n template,\n styles: commonLoginRouteStyles,\n})\nexport class Verify extends BaseRoute {\n @observable code: string = '';\n\n async onSubmit() {\n logger.debug('2FA verify submission');\n await super.onSubmit();\n }\n}\n","import { html } from '@microsoft/fast-element';\nimport type { Protected } from './protected';\n\nexport const ProtectedTemplate = html<Protected>`\n <div class=\"container\">\n <zero-button\n type=\"button\"\n appearance=\"primary-gradient\"\n @click=${(x) => x.onLogout()}\n data-test-id=\"logout\"\n >\n Logout\n </zero-button>\n </div>\n`;\n","import { customElement } from '@microsoft/fast-element';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\nimport { ProtectedTemplate as template } from './protected.template';\n\n@customElement({\n name: 'foundation-login-protected',\n template,\n styles: commonLoginRouteStyles,\n})\nexport class Protected extends BaseRoute {\n async onLogout() {\n const result = await this.auth.logout();\n if (!result.success) {\n return;\n }\n await this.credentialManager.preventSilentAccess();\n this.onNavigate('login');\n }\n}\n","import { html, when } from '@microsoft/fast-element';\nimport {\n backButton,\n organisationField,\n password2Field,\n passwordField,\n showPasswordsCheckbox,\n submitButton,\n usernameField,\n} from '../base';\nimport type { ResetPassword } from './reset-password';\n\nexport const ResetPasswordTemplate = html<ResetPassword>`\n <login-background>\n <div class=\"container\">\n <zero-card class=\"card-pd\">\n <div class=\"column-content\">\n <login-logo></login-logo>\n <div class=\"heading2\" data-test-id=\"heading\">${(x) => x.headingText}</div>\n <div class=\"heading3\">Enter the username registered to your account</div>\n </div>\n <form @submit=${(x) => x.onSubmit()} autocomplete=\"on\">\n ${organisationField()} ${usernameField()}\n ${when(\n (x) => !x.passwordResetToken,\n html<ResetPassword>`\n ${passwordField('Old Password')}\n `\n )}\n ${password2Field('new')} ${showPasswordsCheckbox()}\n <div class=\"form-buttons\">\n ${submitButton('Change Password')} ${backButton((x) => x.onBack())}\n </div>\n <submitting-indicator is-submitting=\"${(x) => x.isSubmitting}\"></submitting-indicator>\n <login-message\n message=\"${(x) => x.message}\"\n non-error=\"${(x) => !x.hasErrors}\"\n ></login-message>\n </form>\n </zero-card>\n </div>\n </login-background>\n`;\n","import { customElement, observable, volatile } from '@microsoft/fast-element';\nimport type { NavigationPhase } from '@microsoft/fast-router';\nimport { BaseRoute } from '../base';\nimport { commonLoginRouteStyles } from '../../styles';\nimport { ResetPasswordTemplate as template } from './reset-password.template';\nimport type { Settings } from '../types';\nimport { logger } from '../../utils';\n\n@customElement({\n name: 'foundation-login-reset-password',\n template,\n styles: commonLoginRouteStyles,\n})\nexport class ResetPassword extends BaseRoute {\n @observable hasPasswordExpired: boolean = false;\n @observable passwordResetToken: string = '';\n\n async connectedCallback() {\n super.connectedCallback();\n await this.autofill();\n }\n\n async enter(phase: NavigationPhase<Settings>) {\n this.hasPasswordExpired = !!phase.route.queryParams.expired;\n this.passwordResetToken = phase.route.queryParams.password;\n }\n\n async onSubmit() {\n await super.onSubmit();\n this.passwordResetToken\n ? await this.onForgotPasswordWorkflow()\n : await this.onChangePasswordWorkflow();\n this.isSubmitting = false;\n }\n\n async onForgotPasswordWorkflow() {\n logger.debug('forgot password submission');\n const message = this.messageBuilder.createForgotPasswordTokenMessage(\n this.orgUsername,\n this.passwordResetToken,\n this.password2\n );\n await this.sendMessage(message, 'Password reset success.', () => {\n this.storeCredentials(this.password2);\n });\n }\n\n async onChangePasswordWorkflow() {\n logger.debug('change password submission');\n const message = this.messageBuilder.createChangePasswordMessage(\n this.orgUsername,\n this.password,\n this.password2\n );\n await this.sendMessage(message, 'Password change success.', () => {\n this.storeCredentials(this.password2);\n });\n }\n\n @volatile\n get headingText() {\n return this.hasPasswordExpired ? 'You are required to change your password' : 'Change Password';\n }\n}\n","import { Constructable } from '@microsoft/fast-element';\nimport { Container, optional } from '@microsoft/fast-foundation';\nimport { MappableRouteDefinition, RouterConfiguration, Route } from '@microsoft/fast-router';\nimport {\n Auth,\n Session,\n FoundationAnalytics,\n FoundationAnalyticsEventType,\n FoundationAnalyticsEvent,\n} from '@genesislcap/foundation-comms';\nimport { defaultLayout } from '../layouts';\nimport { LoginForm } from './login-form/login-form';\nimport { ForgotPassword } from './forgot-password/forgot-password';\nimport { NotFound } from './not-found/not-found';\nimport { RequestAccount } from './request-account/request-account';\nimport { Verify } from './verify/verify';\nimport { Protected } from './protected/protected';\nimport { ResetPassword } from './reset-password/reset-password';\nimport { defaultLoginConfig, LoginConfig } from '../main';\nimport type { Settings } from './types';\n\n/**\n * Base implementation of a routing used with the Login class\n *\n * @remarks\n *\n * Could be used when using the Login class as a standalone authentication method\n * with your app\n *\n * @internal\n */\nexport class MainRouterConfig extends RouterConfiguration<Settings> {\n constructor(\n @Auth private auth: Auth,\n @Container private container: Container,\n @FoundationAnalytics private analytics: FoundationAnalytics,\n @Session private session: Session,\n @optional(LoginConfig) private loginConfig = defaultLoginConfig\n ) {\n super();\n }\n\n public configure() {\n this.title = 'Login';\n this.defaultLayout = defaultLayout;\n /**\n * TODO: Cascade the template options to child routes in a subsequent PR\n * element: async () => {\n * const { define, templateOptions, template, styles } = await import(\n * /!* webpackChunkName: \"login-form\" *!/\n * './login-form'\n * );\n * return define(this.compose(templateOptions, template, styles, 'login-form'));\n * },\n */\n const routes: MappableRouteDefinition<Settings>[] = [\n {\n path: '',\n name: 'login',\n element: LoginForm,\n title: 'Login',\n settings: { public: true },\n },\n {\n path: 'not-found',\n element: NotFound,\n title: 'Not Found',\n name: 'not-found',\n settings: { public: true },\n },\n ];\n const { omitRoutes } = this.loginConfig;\n if (!omitRoutes.includes('request-account')) {\n routes.push({\n path: 'request-account',\n name: 'request-account',\n element: RequestAccount,\n title: 'Request Account',\n settings: { public: true },\n });\n }\n\n if (!omitRoutes.includes('reset-password')) {\n routes.push({\n path: 'reset-password',\n name: 'reset-password',\n element: ResetPassword,\n title: 'Reset Password',\n settings: { public: true },\n });\n }\n\n if (!omitRoutes.includes('forgot-password')) {\n routes.push({\n path: 'forgot-password',\n name: 'forgot-password',\n element: ForgotPassword,\n title: 'Forgot Password',\n settings: { public: true },\n });\n }\n\n if (!omitRoutes.includes('verify')) {\n routes.push({\n path: 'verify',\n element: Verify,\n title: 'Verify',\n name: 'verify',\n settings: { public: true },\n });\n }\n\n if (!omitRoutes.includes('protected')) {\n routes.push({\n path: 'protected',\n element: Protected,\n title: 'Protected',\n name: 'protected',\n settings: { public: false },\n });\n }\n\n this.routes.map(...routes);\n\n const session = this.session;\n const auth = this.auth;\n const analytics = this.analytics;\n\n /**\n * Example of a FallbackRouteDefinition\n */\n this.routes.fallback(() =>\n auth.isLoggedIn ? { redirect: 'not-found' } : { redirect: 'login' }\n );\n\n /**\n * Example of a NavigationContributor\n */\n this.contributors.push({\n navigate: async (phase) => {\n const settings = phase.route.settings;\n\n /**\n * TODO: Centralise\n * Suspect this should be done via createEventSink, but it's not fully clear how-to do that as no docs\n */\n analytics.trackEvent(FoundationAnalyticsEventType.routeChanged, <\n FoundationAnalyticsEvent.RouteChanged\n >{\n path: phase.route.endpoint.path,\n });\n\n /**\n * If public route don't block\n */\n if (settings && settings.public) {\n return;\n }\n\n /**\n * If logged in don't block\n */\n if (auth.isLoggedIn) {\n return;\n }\n\n /**\n * If allowAutoAuth and session is valid try to connect+auto-login\n */\n if (this.loginConfig.autoAuth && (await auth.reAuthFromSession())) {\n return;\n }\n\n /**\n * Otherwise route them to login\n */\n phase.cancel(() => {\n session.captureReturnUrl();\n Route.name.replace(phase.router, 'login');\n });\n },\n });\n }\n\n public construct<T>(Type: Constructable<T>): T {\n return this.container.get(Type) as T;\n }\n}\n","import { tagFor } from '@genesislcap/foundation-ui';\nimport { html, ref } from '@microsoft/fast-element';\nimport type { TemplateOptions } from './main.definition';\nimport type { Login } from './main';\n\n/**\n * @public\n */\nexport const template = (options: TemplateOptions) => {\n const providerTag = tagFor(options.provider);\n const routerTag = tagFor(options.router);\n return html<Login>`\n <${providerTag} data-test-id=\"login-provider\" ${ref('provider')}>\n <${routerTag} :config=${(x) => x.config} data-test-id=\"login-router\"></${routerTag}>\n </${providerTag}>\n `;\n};\n","import { mixinRobotoFont } from '@genesislcap/foundation-zero';\nimport { css } from '@microsoft/fast-element';\nimport type { TemplateOptions } from './main.definition';\nimport { tagFor } from '@genesislcap/foundation-ui';\n\n/**\n * @public\n * @privateRemarks\n * Options cam be used to target unknown component tags in the css, such as:\n * const buttonTag = tagFor(options.button);\n * ...\n * ${buttonTag} {\n * width: 200px;\n * }\n */\nexport const styles = (options: TemplateOptions) => {\n const providerTag = tagFor(options.provider); // < technically if this is `template` we wouldn't need it, as that's covered by :host\n const routerTag = tagFor(options.router);\n return css`\n ${mixinRobotoFont()}\n :host {\n contain: content;\n }\n\n :host,\n ${providerTag}, ${routerTag} {\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n :host:not(:defined) {\n visibility: hidden;\n }\n `;\n};\n","import { TemplateElementDependency } from '@genesislcap/foundation-ui';\nimport { PartialFASTElementDefinition, SyntheticViewTemplate } from '@microsoft/fast-element';\nimport { template } from './main.template';\nimport { styles } from './main.styles';\n\n/**\n * @beta\n * @privateRemarks\n * The CLI can be used to monitor what is in use and needs a mapping.\n */\nexport type TemplateComponents = {\n anchor: TemplateElementDependency;\n button: TemplateElementDependency;\n card: TemplateElementDependency;\n checkbox: TemplateElementDependency;\n listboxOption: TemplateElementDependency;\n provider: TemplateElementDependency;\n router: TemplateElementDependency;\n select: TemplateElementDependency;\n textField: TemplateElementDependency;\n};\n\n/**\n * @beta\n */\nexport type TemplateOptions = TemplateComponents & {\n somePartial?: string | SyntheticViewTemplate;\n};\n\n/**\n * The default template options this MF has been created with.\n * @beta\n * @privateRemarks\n * This will likely evolve into the shell style PWA + FDC3 manifest setup, but that needs more work to evolve into MVP.\n * Hosts should be able to figure out everything they will need to do to fully customise a MF. Currently, they\n * import these `defaultTemplateOptions` and the host dev overrides. Each TemplateComponents key must be a mandatory\n * override, given in hosted mode the MFs won't be registering fallbacks as this would be wasteful, bloat etc.\n * I've added the components list to the package.json > config block for now, but I'm not using it here.\n */\nexport const defaultTemplateOptions: TemplateOptions = {\n anchor: 'zero-anchor',\n button: 'zero-button',\n card: 'zero-card',\n checkbox: 'zero-checkbox',\n listboxOption: 'zero-option',\n provider: 'template',\n router: 'foundation-router',\n select: 'zero-select',\n textField: 'zero-text-field',\n};\n\n/**\n * @beta\n * @remarks\n * This is the main definition of this micro frontend which is exposed for user reconfiguration.\n */\nexport const definition: PartialFASTElementDefinition = {\n name: 'foundation-login',\n template: template(defaultTemplateOptions),\n styles: styles(defaultTemplateOptions),\n};\n\n/**\n * @internal\n * @privateRemarks\n * This is used during development of this micro frontend.\n */\nexport const standaloneDefinition: PartialFASTElementDefinition = {\n name: 'foundation-login',\n template: template({\n ...defaultTemplateOptions,\n provider: 'zero-design-system-provider',\n }),\n styles: styles({\n ...defaultTemplateOptions,\n provider: 'zero-design-system-provider',\n }),\n};\n","import { ConnectConfig, defaultConnectConfig, Session } from '@genesislcap/foundation-comms';\nimport { customElement, FASTElement, observable } from '@microsoft/fast-element';\nimport { Container, inject, Registration } from '@microsoft/fast-foundation';\nimport { DefaultRouteRecognizer } from '@microsoft/fast-router';\nimport * as Components from '../components';\nimport { MainRouterConfig } from '../routes';\nimport { definition, standaloneDefinition } from './main.definition';\n\n/**\n * Defines the login class which handles account authentication from the front-end\n *\n * @remarks\n *\n * Add the Login class as a router element, and it will handle the account authentication for you.\n * Requires use of `@genesislcap/foundation-comms` for the {@link @genesislcap/foundation-comms#Auth | Auth} and\n * {@link @genesislcap/foundation#Session | Session} classes.\n *\n * There are a lot of configuration options available, and different authentication types (such as login via SSO). Use\n * the modules exported `configure` and `define` functions for more power.\n *\n * @example\n * The following is an example of using it in your app, setting it up in the router configuration. This isn't a complete\n * routes confutation, but it contains all required configuration in regard to adding Login functionality.\n * ```ts\n * // Import required dependencies from the foundation-login package\n * import { Login } from '@genesislcap/foundation-login';\n * // Import required dependencies from the foundation-comms package\n * // You could also import analytics events and set them up in the NavigationContributor\n * import { Auth, Session } from '@genesislcap/foundation-comms';\n *\n * type RouterSettings = {\n * public?: boolean;\n * autoAuth?: boolean;\n * }\n *\n * // Define your router config\n * export class MainRouterConfig extends RouterConfiguration<RouterSettings> {\n * // Ensure you inject in required dependencies\n * constructor(\n * @Auth private auth: Auth,\n * @Session private session: Session\n * ) {\n * super();\n * }\n *\n * // Add Login as a route\n * public configure() {\n * ...\n * this.routes.map(\n * { path: '', redirect: 'login' },\n * {\n * path: 'login',\n * element: Login,\n * title: 'Login',\n * name: 'login',\n * layout: loginLayout,\n * settings: { public: true },\n * childRouters: true,\n * },\n * ... // Other routes config here\n * );\n *\n * const session = this.session;\n * const auth = this.auth;\n *\n * // Example of a FallbackRouteDefinition\n * this.routes.fallback(() =>\n * auth.isLoggedIn ? { redirect: 'not-found' } : { redirect: 'login' }\n * );\n *\n * // Example of a NavigationContributor\n * this.contributors.push({\n * navigate: async (phase) => {\n * const settings = phase.route.settings;\n *\n * // Could add in processes such as analytics here\n *\n * // If public route don't block\n * if (settings && settings.public) {\n * return;\n * }\n *\n * // If logged in don't block\n * if (auth.isLoggedIn) {\n * return;\n * }\n *\n * // If autoAuth and session is valid try to connect+auto-login\n * if (settings && settings.autoAuth && (await auth.reAuthFromSession())) {\n * return;\n * }\n *\n * // Otherwise route them to login\n * phase.cancel(() => {\n * session.captureReturnUrl();\n * Route.name.replace(phase.router, 'login');\n * });\n * },\n * });\n * }\n *\n * ... // Other configuration/methods\n *\n * }\n * ```\n *\n * @public\n */\n@customElement(standaloneDefinition)\nexport class Login extends FASTElement {\n /**\n * Configuration for the routes and their associated settings.\n * The client would override this in their app with their own settings to set\n * their routes up as desired\n * @internal\n */\n @inject(MainRouterConfig) config!: MainRouterConfig;\n\n /**\n * The DI container used to register required components in {@link Login.registerDIDependencies}\n * @internal\n */\n @Container container!: Container;\n\n /**\n * Session controller used to manage the user's session\n * @internal\n */\n @Session session!: Session;\n\n /**\n * Marked true when remote components are loaded, currently unused.\n * @internal\n */\n @observable ready: boolean = false;\n\n /**\n * DS provider / root level template.\n * @internal\n */\n @observable provider!: FASTElement;\n\n /**\n * @internal\n */\n async connectedCallback() {\n this.registerDIDependencies();\n super.connectedCallback();\n await this.registerCommonComponents();\n this.checkForSSOToken();\n }\n\n /**\n * Used to forward the user onto a logged-in session during an SSO journey\n *\n * @remarks\n *\n * Called when loading the login page via the connectedCallback() method.\n * During normal flows there will be no SSO tokens set and hence this function\n * will quit execution.\n * During an SSO journey the SSO provider will set the SSO token as a URLSearchParams\n * parameter and redirect back to us. In this case we will take this and forward the\n * user on, with their logged in session.\n *\n * There are two paths the user can take here - if they are in a popup\n * (window.opener exists) then we need to set the session and get the parent window\n * (the one which the user wants their session on) to refresh, and close the popup.\n *\n * Or if they are not in a popup then we simply set the ssoToken in the session.\n * When this component is loaded with the ssoToken then it will redirect the\n * user to their app (the `defaultRedirectUrl`).\n *\n * @internal\n */\n checkForSSOToken() {\n const queryParams = new URLSearchParams(window.location.search);\n const ssoToken = queryParams.get('SSO_TOKEN');\n if (ssoToken) {\n if (window.opener) {\n window.opener.sessionStorage.setItem('ssoToken', ssoToken);\n window.opener.location.reload();\n window.close();\n } else {\n this.session.setSessionStorageItem('ssoToken', ssoToken);\n }\n }\n }\n\n /**\n * Called from the connectedCallback\n * @internal\n */\n async registerCommonComponents() {\n /**\n * Send event to indicate some async work is happening. Will be picked up by overlay micro frontend.\n */\n await Components.loadRemotes({});\n /**\n * Simulate loading delay, TODO: Remove\n *\n * await new Promise(resolve => setTimeout(resolve, 3000));\n */\n this.ready = true;\n }\n\n /**\n * @internal\n */\n protected registerDIDependencies() {\n this.container.register(\n Registration.transient(DefaultRouteRecognizer, DefaultRouteRecognizer),\n /**\n * Register custom configs for core services. Note this can also be done via provideDesignSystem().register(...)\n * if preferred. Here for example mainly as this will mostly occur at an app level.\n */\n Registration.instance<ConnectConfig>(ConnectConfig, {\n ...defaultConnectConfig,\n connect: {\n ...defaultConnectConfig.connect,\n heartbeatInterval: 12_000,\n },\n })\n );\n }\n}\n\n/**\n * @beta\n * @privateRemarks\n * A hosted version of the MF that doesn't set up a design system or components. This is what apps would use to truly\n * customise the MF for their needs via define.ts.\n */\n@customElement({\n ...definition,\n name: `${definition.name}-hosted`,\n})\nexport class LoginHosted extends Login {\n async registerCommonComponents() {\n this.ready = true;\n }\n}\n","import { defineFactory } from '@genesislcap/foundation-ui';\nimport { Login } from './main';\nimport { definition } from './main.definition';\n\n/**\n * Re-define the login micro frontend.\n *\n * @example\n * ```ts\n * import { define, styles, template, defaultTemplateOptions } from '@genesislcap/foundation-login';\n * const customTemplateOptions = {\n * ...defaultTemplateOptions,\n * ...customOptions,\n * }\n * export const AppLogin = define({\n * name: `nexus-login`,\n * template: template(customTemplateOptions),\n * styles: css`\n * ${styles(customTemplateOptions)}\n * some-element {\n * background-color: #ff00b4;\n * }\n * `,\n * });\n * ```\n *\n * @beta\n * @privateRemarks\n * TODO: Use LoginHosted instead of Login when elements manifest stuff lands, which will drive tagFor etc.\n */\nexport const define = defineFactory(Login, definition);\n"],"sourceRoot":""}