diff --git a/app/client/cypress/e2e/Regression/ClientSide/Github/EnableGithub_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Github/EnableGithub_spec.ts index 2a8411175f..179370d344 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Github/EnableGithub_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Github/EnableGithub_spec.ts @@ -64,7 +64,7 @@ describe( homePage.Signout(); // validating sso with github is enabled assertHelper.AssertContains( - "Continue with Github", + "Github", "be.visible", adminSettingsLocators.loginWithGithub, ); @@ -110,7 +110,7 @@ describe( homePage.Signout(); // validating sso with github is disabled assertHelper.AssertContains( - "Continue with Github", + "Github", "not.exist", adminSettingsLocators.loginWithGithub, ); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Google/EnableGoogle_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Google/EnableGoogle_spec.js index 9e83687f5d..ee1676df68 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Google/EnableGoogle_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Google/EnableGoogle_spec.js @@ -61,10 +61,7 @@ describe( cy.get(homePage.signOutIcon).click(); cy.wait(500); // validating sso with google is enabled - cy.get(adminSettings.loginWithGoogle).should( - "have.text", - "Continue with Google", - ); + cy.get(adminSettings.loginWithGoogle).should("have.text", "Google"); }); it("3. Go to admin settings and disable Google", function () { diff --git a/app/client/package.json b/app/client/package.json index 185ff7a7bd..6ede552bcf 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -111,7 +111,7 @@ "d3-geo": "^3.1.0", "dayjs": "^1.10.6", "deep-diff": "^1.0.2", - "design-system": "npm:@appsmithorg/design-system@2.1.36", + "design-system": "npm:@appsmithorg/design-system@2.1.37", "design-system-old": "npm:@appsmithorg/design-system-old@1.1.16", "downloadjs": "^1.4.7", "echarts": "^5.4.2", diff --git a/app/client/src/ce/constants/messages.ts b/app/client/src/ce/constants/messages.ts index 16b15c884b..da1d45825d 100644 --- a/app/client/src/ce/constants/messages.ts +++ b/app/client/src/ce/constants/messages.ts @@ -57,8 +57,7 @@ export const FORM_VALIDATION_INVALID_PASSWORD = FORM_VALIDATION_PASSWORD_RULE; export const LOGIN_PAGE_EMAIL_INPUT_LABEL = () => `Email`; export const LOGIN_PAGE_PASSWORD_INPUT_LABEL = () => `Password`; -export const LOGIN_PAGE_EMAIL_INPUT_PLACEHOLDER = () => - `Enter your email address`; +export const LOGIN_PAGE_EMAIL_INPUT_PLACEHOLDER = () => `Enter your email`; export const LOGIN_PAGE_PASSWORD_INPUT_PLACEHOLDER = () => `Enter your password`; export const LOGIN_PAGE_INVALID_CREDS_ERROR = () => @@ -66,25 +65,28 @@ export const LOGIN_PAGE_INVALID_CREDS_ERROR = () => export const LOGIN_PAGE_INVALID_CREDS_FORGOT_PASSWORD_LINK = () => `Reset password`; export const NEW_TO_APPSMITH = () => `Don't have an account?`; -export const LOGIN_PAGE_TITLE = () => `Sign in`; +export const LOGIN_PAGE_TITLE = () => `Sign in to your account`; export const LOGIN_PAGE_SUBTITLE = () => `Sign in to your account`; export const LOGIN_PAGE_LOGIN_BUTTON_TEXT = () => `Sign in`; export const LOGIN_PAGE_FORGOT_PASSWORD_TEXT = () => `Forgot password`; export const LOGIN_PAGE_REMEMBER_ME_LABEL = () => `Remember`; export const LOGIN_PAGE_SIGN_UP_LINK_TEXT = () => `Sign up`; -export const SIGNUP_PAGE_TITLE = () => `Create your free account`; +export const SIGNUP_PAGE_TITLE = () => `Create your account`; export const SIGNUP_PAGE_SUBTITLE = () => `Use your workspace email`; export const SIGNUP_PAGE_EMAIL_INPUT_LABEL = () => `Email`; -export const SIGNUP_PAGE_EMAIL_INPUT_PLACEHOLDER = () => `Email`; +export const SIGNUP_PAGE_EMAIL_INPUT_PLACEHOLDER = () => `Enter your email`; export const SIGNUP_PAGE_NAME_INPUT_PLACEHOLDER = () => `Name`; export const SIGNUP_PAGE_NAME_INPUT_LABEL = () => `Name`; export const SIGNUP_PAGE_PASSWORD_INPUT_LABEL = () => `Password`; -export const SIGNUP_PAGE_PASSWORD_INPUT_PLACEHOLDER = () => `Password`; +export const SIGNUP_PAGE_PASSWORD_INPUT_PLACEHOLDER = () => + `Enter your password`; export const SIGNUP_PAGE_LOGIN_LINK_TEXT = () => `Sign in`; export const SIGNUP_PAGE_NAME_INPUT_SUBTEXT = () => `How should we call you?`; export const SIGNUP_PAGE_SUBMIT_BUTTON_TEXT = () => `Sign up`; export const ALREADY_HAVE_AN_ACCOUNT = () => `Already have an account?`; +export const LOOKING_TO_SELF_HOST = () => "Looking to self-host Appsmith?"; +export const VISIT_OUR_DOCS = () => "Visit our docs"; export const SIGNUP_PAGE_SUCCESS = () => `Awesome! You have successfully registered.`; @@ -110,11 +112,14 @@ export const RESET_PASSWORD_INVALID_TOKEN = () => export const RESET_PASSWORD_FORGOT_PASSWORD_LINK = () => `Forgot password`; export const FORGOT_PASSWORD_PAGE_EMAIL_INPUT_LABEL = () => `Email`; -export const FORGOT_PASSWORD_PAGE_EMAIL_INPUT_PLACEHOLDER = () => `Email`; +export const FORGOT_PASSWORD_PAGE_EMAIL_INPUT_PLACEHOLDER = () => + `Enter your email`; export const FORGOT_PASSWORD_PAGE_TITLE = () => `Reset password`; +export const FORGOT_PASSWORD_PAGE_SUB_TITLE = () => + `Enter the email address associated with your account`; export const FORGOT_PASSWORD_PAGE_SUBTITLE = () => `We will send a reset link to the email below`; -export const FORGOT_PASSWORD_PAGE_SUBMIT_BUTTON_TEXT = () => `Reset`; +export const FORGOT_PASSWORD_PAGE_SUBMIT_BUTTON_TEXT = () => `Send reset link`; export const FORGOT_PASSWORD_SUCCESS_TEXT = (email: string) => `A password reset link has been sent to your email address ${email} registered with Appsmith.`; @@ -122,12 +127,12 @@ export const VERIFICATION_PENDING_TITLE = () => `Check your inbox`; export const VERIFICATION_PENDING_BODY = () => `To finish your account setup click on the verification link we have sent in an email to `; -export const VERIFICATION_PENDING_NOT_YOU = () => `(not you?)`; +export const VERIFICATION_PENDING_NOT_YOU = () => `Not you?`; export const VERIFICATION_PENDING_NO_EMAIL = () => `No email in your inbox or spam folder?`; -export const VERIFICATION_PENDING_RESEND_LINK = () => `Resend the link`; +export const VERIFICATION_PENDING_RESEND_LINK = () => `Resend link`; export const VERIFY_ERROR_ALREADY_VERIFIED_TITLE = () => `Email already verified`; diff --git a/app/client/src/ce/pages/Applications/index.tsx b/app/client/src/ce/pages/Applications/index.tsx index f56d574e27..4c60950206 100644 --- a/app/client/src/ce/pages/Applications/index.tsx +++ b/app/client/src/ce/pages/Applications/index.tsx @@ -126,6 +126,8 @@ import AnalyticsUtil from "utils/AnalyticsUtil"; import { useIsMobileDevice } from "utils/hooks/useDeviceDetect"; import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; import CreateNewAppFromTemplatesWrapper from "./CreateNewAppFromTemplateModal/CreateNewAppFromTemplatesWrapper"; +import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { ASSETS_CDN_URL } from "constants/ThirdPartyConstants"; export const { cloudHosting } = getAppsmithConfigs(); @@ -644,7 +646,7 @@ export function ApplicationsSection(props: any) {
{createMessage(NO_WORKSPACE_HEADING)} diff --git a/app/client/src/ce/utils/analyticsUtilTypes.ts b/app/client/src/ce/utils/analyticsUtilTypes.ts index 8c08d61df7..e1668546d0 100644 --- a/app/client/src/ce/utils/analyticsUtilTypes.ts +++ b/app/client/src/ce/utils/analyticsUtilTypes.ts @@ -352,7 +352,8 @@ export type EventName = | "MULTI_FILE_PICKER_EXCEEDS_LIMIT" | "TEMPLATE_ADD_PAGE_FROM_TEMPLATE_FLOW" | HOMEPAGE_CREATE_APP_FROM_TEMPLATE_EVENTS - | "EDITOR_MODE_CHANGE"; + | "EDITOR_MODE_CHANGE" + | "VISIT_SELF_HOST_DOCS"; type HOMEPAGE_CREATE_APP_FROM_TEMPLATE_EVENTS = | "TEMPLATE_DROPDOWN_CLICK" diff --git a/app/client/src/components/editorComponents/Form.tsx b/app/client/src/components/editorComponents/Form.tsx index 8684e81ae2..ae1167b7c4 100644 --- a/app/client/src/components/editorComponents/Form.tsx +++ b/app/client/src/components/editorComponents/Form.tsx @@ -2,7 +2,12 @@ import { Form } from "redux-form"; import styled from "styled-components"; const StyledForm = styled(Form)` - width: 100%; + display: flex; + flex-direction: column; + gap: 12px; + .bp3-form-group { + margin: 0; + } `; export default StyledForm; diff --git a/app/client/src/constants/ThirdPartyConstants.tsx b/app/client/src/constants/ThirdPartyConstants.tsx index f98268edb0..63b923f2fb 100644 --- a/app/client/src/constants/ThirdPartyConstants.tsx +++ b/app/client/src/constants/ThirdPartyConstants.tsx @@ -7,6 +7,8 @@ export const GITHUB_RELEASE_URL = "https://github.com/appsmithorg/appsmith/releases/tag"; export const GET_RELEASE_NOTES_URL = (tagName: string) => `${GITHUB_RELEASE_URL}/${tagName}`; +export const SELF_HOSTING_DOC = + "https://docs.appsmith.com/getting-started/setup"; export const GOOGLE_MAPS_SETUP_DOC = "https://docs.appsmith.com/getting-started/setup/instance-configuration/google-maps"; export const GOOGLE_SIGNUP_SETUP_DOC = diff --git a/app/client/src/pages/UserAuth/Container.tsx b/app/client/src/pages/UserAuth/Container.tsx index 6b2173dd35..a0ec243652 100644 --- a/app/client/src/pages/UserAuth/Container.tsx +++ b/app/client/src/pages/UserAuth/Container.tsx @@ -1,9 +1,12 @@ import React from "react"; import { useSelector } from "react-redux"; -import FooterLinks from "./FooterLinks"; import { getTenantConfig } from "@appsmith/selectors/tenantSelectors"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import LeftSideContent from "./LeftSideContent"; +import { getAppsmithConfigs } from "@appsmith/configs"; +import { useIsMobileDevice } from "utils/hooks/useDeviceDetect"; +import styled from "styled-components"; interface ContainerProps { title: string; @@ -14,38 +17,67 @@ interface ContainerProps { testId?: string; } +const ContainerWrapper = styled.div` + a { + span { + font-weight: 500; + } + } +`; + +const BoxWrapper = styled.div<{ isMobileView: boolean }>` + box-shadow: 0px 1px 20px 0px rgba(76, 86, 100, 0.11); + border-radius: var(--ads-v2-border-radius); + background: var(--ads-v2-color-bg); + display: flex; + flex-direction: column; + gap: var(--ads-v2-spaces-5); + padding: 32px 24px; + + ${({ isMobileView }) => + isMobileView ? "border: 1px solid var(--ads-v2-color-border);" : ""} +`; + function Container(props: ContainerProps) { const { children, footer, subtitle, testId, title } = props; const tenantConfig = useSelector(getTenantConfig); + const { cloudHosting } = getAppsmithConfigs(); + const isMobileDevice = useIsMobileDevice(); return ( -
-
- -
-

- {title} -

- {subtitle && ( -

- {subtitle} -

- )} + {cloudHosting && !isMobileDevice && } + + {!isMobileDevice && ( + + )} +
+
+

+ {title} +

+ {subtitle && ( +

+ {subtitle} +

+ )} +
+ {children} + {footer}
- {children} -
- -
- {footer} - -
-
+ + ); } diff --git a/app/client/src/pages/UserAuth/FooterLinks.tsx b/app/client/src/pages/UserAuth/FooterLinks.tsx index df183aa340..6abf468ed7 100644 --- a/app/client/src/pages/UserAuth/FooterLinks.tsx +++ b/app/client/src/pages/UserAuth/FooterLinks.tsx @@ -1,16 +1,35 @@ import React from "react"; import { Link } from "design-system"; +import styled from "styled-components"; + +const FooterWrapper = styled.div` + width: 85%; + margin: 0 auto; + text-align: center; + a { + display: inline; + span { + display: inline; + svg { + display: inline; + } + } + } +`; function FooterLinks() { return ( -
+ + By using Appsmith, you are agreeing to our   - Privacy policy + privacy policy +   and   - Terms and conditions + terms of service -
+ . + ); } diff --git a/app/client/src/pages/UserAuth/ForgotPassword.tsx b/app/client/src/pages/UserAuth/ForgotPassword.tsx index 04a5fbffad..fbe5705aa0 100644 --- a/app/client/src/pages/UserAuth/ForgotPassword.tsx +++ b/app/client/src/pages/UserAuth/ForgotPassword.tsx @@ -14,14 +14,14 @@ import { FORM_VALIDATION_EMPTY_EMAIL, FORM_VALIDATION_INVALID_EMAIL, FORGOT_PASSWORD_SUCCESS_TEXT, - FORGOT_PASSWORD_PAGE_LOGIN_LINK, createMessage, + FORGOT_PASSWORD_PAGE_SUB_TITLE, } from "@appsmith/constants/messages"; import { AUTH_LOGIN_URL } from "constants/routes"; import { FORGOT_PASSWORD_FORM_NAME } from "@appsmith/constants/forms"; import FormTextField from "components/utils/ReduxFormTextField"; import { FormGroup } from "design-system-old"; -import { Button, Link, Callout } from "design-system"; +import { Button, Link, Callout, Icon } from "design-system"; import { isEmail, isEmptyString } from "utils/formhelpers"; import type { ForgotPasswordFormValues } from "./helpers"; import { forgotPasswordSubmitHandler } from "./helpers"; @@ -58,18 +58,25 @@ export const ForgotPassword = (props: ForgotPasswordProps) => { } }, [props.emailValue]); + const footerSection = ( +
+ +  Back to  + + Sign in + +
+ ); + return ( - {createMessage(FORGOT_PASSWORD_PAGE_LOGIN_LINK)} - - } + footer={footerSection} + subtitle={createMessage(FORGOT_PASSWORD_PAGE_SUB_TITLE)} title={createMessage(FORGOT_PASSWORD_PAGE_TITLE)} > diff --git a/app/client/src/pages/UserAuth/LeftSideContent.tsx b/app/client/src/pages/UserAuth/LeftSideContent.tsx new file mode 100644 index 0000000000..16f46262f2 --- /dev/null +++ b/app/client/src/pages/UserAuth/LeftSideContent.tsx @@ -0,0 +1,119 @@ +import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import React from "react"; +import styled from "styled-components"; +import { ASSETS_CDN_URL } from "constants/ThirdPartyConstants"; +import { Avatar } from "design-system"; + +const Wrapper = styled.div` + width: 432px; + + .left-description { + padding-bottom: 24px; + border-bottom: 1px solid var(--ads-v2-color-border); + display: flex; + flex-direction: column; + gap: var(--ads-spaces-4); + } + + .left-description-container { + width: 100%; + margin: 0 auto; + font-size: 16px; + font-style: italic; + color: var(--ads-v2-color-gray-800); + } + + .left-description-author { + display: flex; + align-items: center; + gap: var(--ads-spaces-3); + } + + .left-description-author > div { + font-weight: 500; + font-size: 12px; + } + + .dot { + font-weight: 800; + } + + .client-logo-container { + padding-top: 24px; + } + + .client-heading { + font-size: 12px; + font-weight: normal; + line-height: 1.33; + text-align: center; + margin-bottom: 24px; + } + + .client-logo-container img { + height: 30px; + } + + .client-logo-container .client-logo-section { + display: flex; + justify-content: space-around; + margin-bottom: 24px; + gap: var(--ads-spaces-3); + flex-wrap: wrap; + } +`; + +function LeftSideContent() { + return ( + +
+
+ "We’d been looking for a tool like Appsmith for years. With + Appsmith we were able to build a UI on top of 12 different Snowflake + control tables. Appsmith was easy for our developers to learn, and + it’s easy to implement." +
+
+ +
Thomas Zwick
+
·
+
Director, Omron
+
+
+ +
+
+ Used by more than 10,000 organisations across the globe +
+
+ GSK logo + Omron logo + Dropbox logo + AWS logo + Twilio logo +
+
+
+ ); +} + +export default LeftSideContent; diff --git a/app/client/src/pages/UserAuth/Login.tsx b/app/client/src/pages/UserAuth/Login.tsx index 45db178e44..712bda3d41 100644 --- a/app/client/src/pages/UserAuth/Login.tsx +++ b/app/client/src/pages/UserAuth/Login.tsx @@ -24,7 +24,6 @@ import { LOGIN_PAGE_INVALID_CREDS_FORGOT_PASSWORD_LINK, NEW_TO_APPSMITH, createMessage, - LOGIN_PAGE_SUBTITLE, } from "@appsmith/constants/messages"; import { FormGroup } from "design-system-old"; import { Button, Link, Callout } from "design-system"; @@ -33,7 +32,11 @@ import ThirdPartyAuth from "pages/UserAuth/ThirdPartyAuth"; import { isEmail, isEmptyString } from "utils/formhelpers"; import type { LoginFormValues } from "pages/UserAuth/helpers"; -import { SpacedSubmitForm, FormActions } from "pages/UserAuth/StyledComponents"; +import { + SpacedSubmitForm, + FormActions, + EmailFormWrapper, +} from "pages/UserAuth/StyledComponents"; import AnalyticsUtil from "utils/AnalyticsUtil"; import { LOGIN_SUBMIT_PATH } from "@appsmith/constants/ApiConstants"; import PerformanceTracker, { @@ -125,10 +128,10 @@ export function Login(props: LoginFormProps) { } const footerSection = isFormLoginEnabled && ( -
- {createMessage(NEW_TO_APPSMITH)} +
+ {createMessage(NEW_TO_APPSMITH)}  + {htmlPageTitle} @@ -171,7 +170,7 @@ export function Login(props: LoginFormProps) { )} {isFormLoginEnabled && ( - <> + {createMessage(LOGIN_PAGE_FORGOT_PASSWORD_TEXT)} - + )} ); diff --git a/app/client/src/pages/UserAuth/ResetPassword.tsx b/app/client/src/pages/UserAuth/ResetPassword.tsx index f6720a153f..5d6c88d7b6 100644 --- a/app/client/src/pages/UserAuth/ResetPassword.tsx +++ b/app/client/src/pages/UserAuth/ResetPassword.tsx @@ -9,7 +9,7 @@ import { RESET_PASSWORD_FORM_NAME } from "@appsmith/constants/forms"; import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants"; import { getIsTokenValid, getIsValidatingToken } from "selectors/authSelectors"; import FormTextField from "components/utils/ReduxFormTextField"; -import { Button, Callout, Link } from "design-system"; +import { Button, Callout, Icon, Link } from "design-system"; import Spinner from "components/editorComponents/Spinner"; import StyledForm from "components/editorComponents/Form"; import { isEmptyString, isStrongPassword } from "utils/formhelpers"; @@ -20,7 +20,6 @@ import { AUTH_LOGIN_URL, FORGOT_PASSWORD_URL } from "constants/routes"; import { RESET_PASSWORD_PAGE_PASSWORD_INPUT_LABEL, RESET_PASSWORD_PAGE_PASSWORD_INPUT_PLACEHOLDER, - RESET_PASSWORD_LOGIN_LINK_TEXT, RESET_PASSWORD_SUBMIT_BUTTON_TEXT, RESET_PASSWORD_PAGE_TITLE, FORM_VALIDATION_INVALID_PASSWORD, @@ -153,18 +152,25 @@ export function ResetPassword(props: ResetPasswordProps) { if (!isTokenValid && validatingToken) { return ; } + + const footerSection = ( +
+ +   Back to   + + Sign in + +
+ ); + return ( - {createMessage(RESET_PASSWORD_LOGIN_LINK_TEXT)} - - } + footer={footerSection} title={createMessage(RESET_PASSWORD_PAGE_TITLE)} > {(showSuccessMessage || showFailureMessage) && ( diff --git a/app/client/src/pages/UserAuth/SignUp.tsx b/app/client/src/pages/UserAuth/SignUp.tsx index b3f23c982d..327deafb07 100644 --- a/app/client/src/pages/UserAuth/SignUp.tsx +++ b/app/client/src/pages/UserAuth/SignUp.tsx @@ -5,7 +5,11 @@ import { AUTH_LOGIN_URL } from "constants/routes"; import { SIGNUP_FORM_NAME } from "@appsmith/constants/forms"; import type { RouteComponentProps } from "react-router-dom"; import { useHistory, useLocation, withRouter } from "react-router-dom"; -import { SpacedSubmitForm, FormActions } from "pages/UserAuth/StyledComponents"; +import { + SpacedSubmitForm, + FormActions, + OrWithLines, +} from "pages/UserAuth/StyledComponents"; import { SIGNUP_PAGE_TITLE, SIGNUP_PAGE_EMAIL_INPUT_LABEL, @@ -19,8 +23,9 @@ import { SIGNUP_PAGE_SUBMIT_BUTTON_TEXT, ALREADY_HAVE_AN_ACCOUNT, createMessage, - SIGNUP_PAGE_SUBTITLE, GOOGLE_RECAPTCHA_KEY_ERROR, + LOOKING_TO_SELF_HOST, + VISIT_OUR_DOCS, } from "@appsmith/constants/messages"; import FormTextField from "components/utils/ReduxFormTextField"; import ThirdPartyAuth from "pages/UserAuth/ThirdPartyAuth"; @@ -54,13 +59,14 @@ import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag"; import { getHTMLPageTitle } from "@appsmith/utils/BusinessFeatures/brandingPageHelpers"; import log from "loglevel"; +import { SELF_HOSTING_DOC } from "constants/ThirdPartyConstants"; declare global { interface Window { grecaptcha: any; } } -const { googleRecaptchaSiteKey } = getAppsmithConfigs(); +const { cloudHosting, googleRecaptchaSiteKey } = getAppsmithConfigs(); const validate = (values: SignupFormValues) => { const errors: SignupFormValues = {}; @@ -171,25 +177,40 @@ export function SignUp(props: SignUpFormProps) { }; const footerSection = ( -
- {createMessage(ALREADY_HAVE_AN_ACCOUNT)} - - {createMessage(SIGNUP_PAGE_LOGIN_LINK_TEXT)} - -
+ <> +
+ {createMessage(ALREADY_HAVE_AN_ACCOUNT)}  + + {createMessage(SIGNUP_PAGE_LOGIN_LINK_TEXT)} + +
+ {cloudHosting && ( + <> + or +
+ {createMessage(LOOKING_TO_SELF_HOST)} + AnalyticsUtil.logEvent("VISIT_SELF_HOST_DOCS")} + target="_self" + to={`${SELF_HOSTING_DOC}?utm_source=cloudSignup`} + > + {createMessage(VISIT_OUR_DOCS)} + +
+ + )} + ); return ( - + {htmlPageTitle} diff --git a/app/client/src/pages/UserAuth/StyledComponents.tsx b/app/client/src/pages/UserAuth/StyledComponents.tsx index 03ba9183a8..2df33f86ee 100644 --- a/app/client/src/pages/UserAuth/StyledComponents.tsx +++ b/app/client/src/pages/UserAuth/StyledComponents.tsx @@ -98,6 +98,9 @@ export const AuthCardBody = styled.div` export const SpacedForm = styled(Form)``; export const SpacedSubmitForm = styled.form` + display: flex; + flex-direction: column; + gap: 12px; && .bp3-label { color: var(--ads-v2-color-fg); margin-bottom: var(--ads-v2-spaces-2); @@ -108,6 +111,15 @@ export const SpacedSubmitForm = styled.form` &:only-child { margin-right: 0; } + .bp3-form-group { + margin: 0; + } +`; + +export const EmailFormWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 12px; `; export const FormActions = styled.div` @@ -117,7 +129,6 @@ export const FormActions = styled.div` } justify-content: space-between; align-items: baseline; - margin-top: ${(props) => props.theme.spaces[5]}px; & > label { margin-right: ${(props) => props.theme.spaces[11]}px; } @@ -158,3 +169,29 @@ export const StyledFormGroup = styled(FormGroup)` margin-bottom: var(--ads-v2-spaces-2); } `; + +export const OrWithLines = styled.div` + overflow: hidden; + text-align: center; + + &::before, + &::after { + background-color: var(--ads-v2-color-border); + content: ""; + display: inline-block; + height: 1px; + position: relative; + vertical-align: middle; + width: 50%; + } + + &::before { + right: 0.5em; + margin-left: -50%; + } + + &::after { + left: 0.5em; + margin-right: -50%; + } +`; diff --git a/app/client/src/pages/UserAuth/ThirdPartyAuth.tsx b/app/client/src/pages/UserAuth/ThirdPartyAuth.tsx index 0a1e1cb99a..9f9e9bc705 100644 --- a/app/client/src/pages/UserAuth/ThirdPartyAuth.tsx +++ b/app/client/src/pages/UserAuth/ThirdPartyAuth.tsx @@ -12,12 +12,24 @@ import { Button } from "design-system"; const ThirdPartyAuthWrapper = styled.div` display: flex; - flex-direction: column; gap: var(--ads-v2-spaces-3); + width: 100%; + flex-wrap: wrap; +`; + +const StyledButton = styled(Button)` + flex: 1 0 171px; `; type SignInType = "SIGNIN" | "SIGNUP"; +const startIcon: { + [key: string]: string; +} = { + Google: "google-colored", + Github: "github-fill", +}; + function SocialLoginButton(props: { logo: string; name: string; @@ -33,7 +45,7 @@ function SocialLoginButton(props: { url += `?redirectUrl=${encodeURIComponent(redirectUrl)}`; } return ( - + ); } diff --git a/app/client/src/pages/UserAuth/VerificationError.tsx b/app/client/src/pages/UserAuth/VerificationError.tsx index 5aec1cd82d..37ac93e508 100644 --- a/app/client/src/pages/UserAuth/VerificationError.tsx +++ b/app/client/src/pages/UserAuth/VerificationError.tsx @@ -1,11 +1,10 @@ import React, { useEffect } from "react"; import Container from "./Container"; -import { Button, Callout, Link, Text } from "design-system"; +import { Button, Callout, Icon, Link, Text } from "design-system"; import { AUTH_LOGIN_URL } from "constants/routes"; import { createMessage, DEFAULT_ERROR_MESSAGE, - FORGOT_PASSWORD_PAGE_LOGIN_LINK, PAGE_CLIENT_ERROR_DESCRIPTION, VERIFY_ERROR_ALREADY_VERIFIED_TITLE, VERIFY_ERROR_EXPIRED_TITLE, @@ -97,14 +96,16 @@ const VerificationError = ( return ( +
+ +   Back to   - {createMessage(FORGOT_PASSWORD_PAGE_LOGIN_LINK)} + Sign in
} diff --git a/app/client/src/pages/UserAuth/VerificationPending.tsx b/app/client/src/pages/UserAuth/VerificationPending.tsx index d7d3bbcbb0..99440aae94 100644 --- a/app/client/src/pages/UserAuth/VerificationPending.tsx +++ b/app/client/src/pages/UserAuth/VerificationPending.tsx @@ -2,7 +2,6 @@ import React from "react"; import Container from "./Container"; import { createMessage, - VERIFICATION_PENDING_BODY, VERIFICATION_PENDING_NO_EMAIL, VERIFICATION_PENDING_NOT_YOU, VERIFICATION_PENDING_RESEND_LINK, @@ -33,16 +32,21 @@ const VerificationPending = (props: RouteComponentProps<{ email: string }>) => { return ( + + {createMessage(VERIFICATION_PENDING_NOT_YOU)} + +
+ } testId="verification-pending" title={createMessage(VERIFICATION_PENDING_TITLE)} > - {createMessage(VERIFICATION_PENDING_BODY)} {email} + Click the verification link sent to {email} to finish + setting up your account. - - {createMessage(VERIFICATION_PENDING_NOT_YOU)} - diff --git a/app/client/src/pages/UserAuth/index.tsx b/app/client/src/pages/UserAuth/index.tsx index a4e0f91184..ecc74a6e9d 100644 --- a/app/client/src/pages/UserAuth/index.tsx +++ b/app/client/src/pages/UserAuth/index.tsx @@ -14,6 +14,11 @@ import { ThemeProvider } from "styled-components"; import VerificationPending from "./VerificationPending"; import VerifyUser from "./VerifyUser"; import VerificationError from "./VerificationError"; +import FooterLinks from "./FooterLinks"; +import { useIsMobileDevice } from "utils/hooks/useDeviceDetect"; +import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { getTenantConfig } from "@appsmith/selectors/tenantSelectors"; +import { getAppsmithConfigs } from "@appsmith/configs"; const SentryRoute = Sentry.withSentryRouting(Route); @@ -23,11 +28,24 @@ export function UserAuth() { const lightTheme = useSelector((state: AppState) => getThemeDetails(state, ThemeMode.LIGHT), ); + const isMobileDevice = useIsMobileDevice(); + const tenantConfig = useSelector(getTenantConfig); + const { cloudHosting } = getAppsmithConfigs(); return ( {/* TODO: (Albin) - chnages this to ads-v2 variable once branding is sorted out. */} -
+
+ {isMobileDevice && ( + + )} @@ -54,6 +72,7 @@ export function UserAuth() { /> + {cloudHosting && }
); diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 9470c40a88..d396269dd1 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -13257,7 +13257,7 @@ __metadata: d3-geo: ^3.1.0 dayjs: ^1.10.6 deep-diff: ^1.0.2 - design-system: "npm:@appsmithorg/design-system@2.1.36" + design-system: "npm:@appsmithorg/design-system@2.1.37" design-system-old: "npm:@appsmithorg/design-system-old@1.1.16" diff: ^5.0.0 dotenv: ^8.1.0 @@ -17288,9 +17288,9 @@ __metadata: languageName: node linkType: hard -"design-system@npm:@appsmithorg/design-system@2.1.36": - version: 2.1.36 - resolution: "@appsmithorg/design-system@npm:2.1.36" +"design-system@npm:@appsmithorg/design-system@2.1.37": + version: 2.1.37 + resolution: "@appsmithorg/design-system@npm:2.1.37" dependencies: "@radix-ui/react-dialog": ^1.0.2 "@radix-ui/react-dropdown-menu": ^2.0.4 @@ -17320,7 +17320,7 @@ __metadata: react-dom: ^17.0.2 react-router-dom: ^5.0.0 styled-components: ^5.3.6 - checksum: 410db12c576560c6195d5b9ed776f1172c00985966b39d75fbfff119694f2227c94521e5e6d1c3068dd2d49fbac37975c2bc05b1284a09ef434ac7bd551bf84c + checksum: 012936cc603bf5c21bcd6486c35935bc22171f2243dd988cb93f92ed559fcd3245561ceda2f791845dce559de942c2acce8cde1fc8c3d30d45c24d4768aedf72 languageName: node linkType: hard