recipeImplementation.clearLoginAttemptInfo({
userContext,
})
}>
-
{loginAttemptInfo.contactMethod === "EMAIL"
? t("PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL")
: t("PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE")}
@@ -52,9 +51,7 @@ export const MFAOTPFooter = withOverride(
) : (
claim.loading === false &&
(claim.value?.n.length ?? 0) > 1 && (
-
+
{t("PWLESS_MFA_FOOTER_CHOOSER_ANOTHER")}
)
diff --git a/lib/ts/recipe/passwordless/recipe.tsx b/lib/ts/recipe/passwordless/recipe.tsx
index c8036547a..983171615 100644
--- a/lib/ts/recipe/passwordless/recipe.tsx
+++ b/lib/ts/recipe/passwordless/recipe.tsx
@@ -20,7 +20,8 @@
import PasswordlessWebJS from "supertokens-web-js/recipe/passwordless";
import { PostSuperTokensInitCallbacks } from "supertokens-web-js/utils/postSuperTokensInitCallbacks";
-import { OTPIcon } from "../../components/assets/otpIcon";
+import { OTPEmailIcon } from "../../components/assets/otpEmailIcon";
+import { OTPSMSIcon } from "../../components/assets/otpSMSIcon";
import { SSR_ERROR } from "../../constants";
import { isTest } from "../../utils";
import AuthRecipe from "../authRecipe";
@@ -45,14 +46,14 @@ export const otpPhoneFactor = {
name: "SMS based OTP",
description: "Get an OTP code on your phone to complete the authentication request",
path: "/mfa/otp-phone",
- logo: OTPIcon,
+ logo: OTPSMSIcon,
};
export const otpEmailFactor = {
id: "otp-email",
name: "Email based OTP",
description: "Get an OTP code on your email address to complete the authentication request",
path: "/mfa/otp-email",
- logo: OTPIcon,
+ logo: OTPEmailIcon,
};
export const passwordlessFactors = ["otp-phone", "otp-email", "link-phone", "link-email"] as const;
diff --git a/lib/ts/styles/styles.css b/lib/ts/styles/styles.css
index effc1138b..69ccc2bd0 100644
--- a/lib/ts/styles/styles.css
+++ b/lib/ts/styles/styles.css
@@ -276,3 +276,55 @@
[data-supertokens~="backButtonPlaceholder"] {
display: block;
}
+
+[data-supertokens~="delayedRender"] {
+ animation-duration: 0.1s;
+ animation-name: animate-fade;
+ animation-delay: 0.2s;
+ animation-fill-mode: backwards;
+}
+
+@keyframes animate-fade {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+[data-supertokens~="footerLinkGroupVert"] {
+ display: flex;
+ flex-direction: column;
+ margin-top: 10px;
+ gap: 24px;
+}
+
+[data-supertokens~="footerLinkGroupVert"] > div {
+ margin: 0;
+}
+
+[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {
+ font-weight: 400;
+}
+
+[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {
+ font-weight: 500;
+ position: relative;
+ left: -6px; /* half the width of the left arrow */
+}
+
+@media (max-width: 360px) {
+ [data-supertokens~="footerLinkGroupVert"] {
+ flex-direction: column;
+ }
+ [data-supertokens~="footerLinkGroupVert"] > div {
+ margin: 0 auto;
+ }
+}
+
+[data-supertokens~="footerLinkGroupVert"] div:only-child {
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 14px;
+}
diff --git a/package-lock.json b/package-lock.json
index 2809adab6..1b2553f7a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,6 +40,7 @@
"@typescript-eslint/parser": "4.6.0",
"babel-jest": "^29.3.1",
"chokidar-cli": "^3.0.0",
+ "chromatic": "^9.0.0",
"eslint": "^6.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-react": "^7.28.0",
diff --git a/package.json b/package.json
index 6b7dc6478..5eaa622df 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
"@typescript-eslint/parser": "4.6.0",
"babel-jest": "^29.3.1",
"chokidar-cli": "^3.0.0",
+ "chromatic": "^9.0.0",
"eslint": "^6.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-react": "^7.28.0",