2021-07-20 10:40:06 +01:00
|
|
|
// Copyright (C) 2021 Storj Labs, Inc.
|
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div class="register-area" @keyup.enter="onCreateClick">
|
|
|
|
<div class="register-area__logo-wrapper">
|
2021-08-10 14:14:37 +01:00
|
|
|
<LogoIcon class="logo" @click="onLogoClick" />
|
2021-07-20 10:40:06 +01:00
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
class="register-area__container"
|
|
|
|
:class="{'professional-container': isProfessional}"
|
|
|
|
>
|
|
|
|
<div class="register-area__intro-area">
|
|
|
|
<div class="register-area__intro-area__wrapper">
|
|
|
|
<h1 class="register-area__intro-area__title">Welcome to the decentralized cloud.</h1>
|
|
|
|
<p class="register-area__intro-area__sub-title">Join thousands of developers building on the safer, decentralized cloud, and start uploading data in just a few minutes.</p>
|
|
|
|
</div>
|
|
|
|
<RegisterGlobe
|
|
|
|
class="register-area__intro-area__globe-image"
|
|
|
|
:class="{'professional-globe': isProfessional}"
|
|
|
|
/>
|
|
|
|
<RegisterGlobeSmall class="register-area__intro-area__globe-image-sm" />
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-area">
|
|
|
|
<div
|
|
|
|
class="register-area__input-area__container"
|
|
|
|
:class="{ 'professional-container': isProfessional }"
|
|
|
|
>
|
|
|
|
<div class="register-area__input-area__container__title-area">
|
|
|
|
<div class="register-area__input-area__container__title-container">
|
|
|
|
<h1 class="register-area__input-area__container__title-area__title">Get 150 GB Free</h1>
|
|
|
|
</div>
|
2021-09-29 13:20:20 +01:00
|
|
|
<div class="register-area__input-area__expand" aria-roledescription="satellites-dropdown" @click.stop="toggleDropdown">
|
2021-07-20 10:40:06 +01:00
|
|
|
<span class="register-area__input-area__expand__value">{{ satelliteName }}</span>
|
|
|
|
<BottomArrowIcon />
|
2021-08-10 14:14:37 +01:00
|
|
|
<div v-if="isDropdownShown" v-click-outside="closeDropdown" class="register-area__input-area__expand__dropdown">
|
2021-07-20 10:40:06 +01:00
|
|
|
<div class="register-area__input-area__expand__dropdown__item" @click.stop="closeDropdown">
|
|
|
|
<SelectedCheckIcon />
|
|
|
|
<span class="register-area__input-area__expand__dropdown__item__name">{{ satelliteName }}</span>
|
|
|
|
</div>
|
2021-09-29 13:20:20 +01:00
|
|
|
<a
|
|
|
|
v-for="(sat, index) in partneredSatellites"
|
|
|
|
:key="index"
|
|
|
|
class="register-area__input-area__expand__dropdown__item"
|
|
|
|
:href="`${sat.address}/signup`"
|
|
|
|
>
|
2021-07-20 10:40:06 +01:00
|
|
|
{{ sat.name }}
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-10-20 18:01:51 +01:00
|
|
|
<div class="register-area__input-area__toggle__container">
|
2021-07-20 10:40:06 +01:00
|
|
|
<ul class="register-area__input-area__toggle__wrapper">
|
|
|
|
<li
|
|
|
|
class="register-area__input-area__toggle__personal"
|
|
|
|
:class="{ 'active': !isProfessional }"
|
|
|
|
@click.prevent="toggleAccountType(false)"
|
|
|
|
>
|
|
|
|
Personal
|
|
|
|
</li>
|
|
|
|
<li
|
|
|
|
class="register-area__input-area__toggle__professional"
|
|
|
|
:class="{ 'active': isProfessional }"
|
2021-09-16 13:04:26 +01:00
|
|
|
aria-roledescription="professional-label"
|
2021-07-20 10:40:06 +01:00
|
|
|
@click.prevent="toggleAccountType(true)"
|
|
|
|
>
|
|
|
|
Business
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-wrapper first-input">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Full Name"
|
|
|
|
placeholder="Enter Full Name"
|
|
|
|
:error="fullNameError"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="name"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setFullName"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Email Address"
|
2022-01-05 11:07:03 +00:00
|
|
|
placeholder="user@example.com"
|
2021-07-20 10:40:06 +01:00
|
|
|
:error="emailError"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="email"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setEmail"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div v-if="isProfessional">
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Company Name"
|
|
|
|
placeholder="Acme Corp."
|
|
|
|
:error="companyNameError"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="company-name"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setCompanyName"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Position"
|
|
|
|
placeholder="Position Title"
|
|
|
|
:error="positionError"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="position"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setPosition"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<SelectInput
|
|
|
|
label="Employees"
|
2021-08-10 14:14:37 +01:00
|
|
|
:options-list="employeeCountOptions"
|
|
|
|
@setData="setEmployeeCount"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="register-input">
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Password"
|
|
|
|
placeholder="Enter Password"
|
|
|
|
:error="passwordError"
|
|
|
|
is-password="true"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="password"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setPassword"
|
2021-07-20 10:40:06 +01:00
|
|
|
@showPasswordStrength="showPasswordStrength"
|
|
|
|
@hidePasswordStrength="hidePasswordStrength"
|
|
|
|
/>
|
|
|
|
<PasswordStrength
|
|
|
|
:password-string="password"
|
|
|
|
:is-shown="isPasswordStrengthShown"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-wrapper">
|
|
|
|
<HeaderlessInput
|
|
|
|
label="Retype Password"
|
|
|
|
placeholder="Retype Password"
|
|
|
|
:error="repeatedPasswordError"
|
|
|
|
is-password="true"
|
2021-09-16 13:04:26 +01:00
|
|
|
role-description="retype-password"
|
2021-08-10 14:14:37 +01:00
|
|
|
@setData="setRepeatedPassword"
|
2021-07-20 10:40:06 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2021-06-22 01:09:56 +01:00
|
|
|
<AddCouponCodeInput v-if="couponCodeSignupUIEnabled" />
|
2021-07-20 10:40:06 +01:00
|
|
|
<div v-if="isBetaSatellite" class="register-area__input-area__container__warning">
|
|
|
|
<div class="register-area__input-area__container__warning__header">
|
|
|
|
<label class="container">
|
2021-08-10 14:14:37 +01:00
|
|
|
<input v-model="areBetaTermsAccepted" type="checkbox">
|
|
|
|
<span class="checkmark" :class="{'error': areBetaTermsAcceptedError}" />
|
2021-07-20 10:40:06 +01:00
|
|
|
</label>
|
|
|
|
<h2 class="register-area__input-area__container__warning__header__label">
|
|
|
|
This is a BETA satellite
|
|
|
|
</h2>
|
|
|
|
</div>
|
|
|
|
<p class="register-area__input-area__container__warning__message">
|
|
|
|
This means any data you upload to this satellite can be
|
|
|
|
deleted at any time and your storage/bandwidth limits
|
|
|
|
can fluctuate. To use our production service please
|
|
|
|
create an account on one of our production Satellites.
|
|
|
|
<a href="https://storj.io/signup/" target="_blank" rel="noopener noreferrer">https://storj.io/signup/</a>
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div v-if="isProfessional" class="register-area__input-area__container__checkbox-area">
|
|
|
|
<label class="container">
|
2021-08-10 14:14:37 +01:00
|
|
|
<input id="sales" v-model="haveSalesContact" type="checkbox">
|
|
|
|
<span class="checkmark" />
|
2021-07-20 10:40:06 +01:00
|
|
|
</label>
|
|
|
|
<label class="register-area__input-area__container__checkbox-area__msg-box" for="sales">
|
|
|
|
<p class="register-area__input-area__container__checkbox-area__msg-box__msg">
|
|
|
|
Please have the Sales Team contact me
|
|
|
|
</p>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-area__container__checkbox-area">
|
|
|
|
<label class="container">
|
2021-08-10 14:14:37 +01:00
|
|
|
<input id="terms" v-model="isTermsAccepted" type="checkbox">
|
|
|
|
<span class="checkmark" :class="{'error': isTermsAcceptedError}" />
|
2021-07-20 10:40:06 +01:00
|
|
|
</label>
|
|
|
|
<label class="register-area__input-area__container__checkbox-area__msg-box" for="terms">
|
|
|
|
<p class="register-area__input-area__container__checkbox-area__msg-box__msg">
|
|
|
|
I agree to the
|
|
|
|
<a class="register-area__input-area__container__checkbox-area__msg-box__msg__link" href="https://storj.io/terms-of-service/" target="_blank" rel="noopener">Terms of Service</a>
|
|
|
|
and
|
|
|
|
<a class="register-area__input-area__container__checkbox-area__msg-box__msg__link" href="https://storj.io/privacy-policy/" target="_blank" rel="noopener">Privacy Policy</a>
|
|
|
|
</p>
|
|
|
|
</label>
|
|
|
|
</div>
|
2021-08-10 14:14:37 +01:00
|
|
|
<div v-if="recaptchaEnabled" class="register-area__input-area__container__recaptcha-wrapper">
|
|
|
|
<div v-if="recaptchaError" class="register-area__input-area__container__recaptcha-wrapper__label-container">
|
|
|
|
<ErrorIcon />
|
2021-07-20 10:40:06 +01:00
|
|
|
<p class="register-area__input-area__container__recaptcha-wrapper__label-container__error">reCAPTCHA is required</p>
|
|
|
|
</div>
|
2021-08-26 22:55:26 +01:00
|
|
|
<VueRecaptcha
|
2021-08-10 14:14:37 +01:00
|
|
|
ref="recaptcha"
|
2021-07-20 10:40:06 +01:00
|
|
|
:sitekey="recaptchaSiteKey"
|
2021-08-10 14:14:37 +01:00
|
|
|
load-recaptcha-script="true"
|
2021-08-26 22:55:26 +01:00
|
|
|
size="invisible"
|
2021-07-20 10:40:06 +01:00
|
|
|
@verify="onRecaptchaVerified"
|
|
|
|
@expired="onRecaptchaError"
|
|
|
|
@error="onRecaptchaError"
|
2021-08-10 14:14:37 +01:00
|
|
|
/>
|
2021-07-20 10:40:06 +01:00
|
|
|
</div>
|
|
|
|
<p class="register-area__input-area__container__button" @click.prevent="onCreateClick">Sign Up</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="register-area__input-area__login-container">
|
|
|
|
Already have an account? <router-link :to="loginPath" class="register-area__input-area__login-container__link">Login.</router-link>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
|
|
import { Component, Vue } from 'vue-property-decorator';
|
|
|
|
import VueRecaptcha from 'vue-recaptcha';
|
|
|
|
|
|
|
|
import AddCouponCodeInput from '@/components/common/AddCouponCodeInput.vue';
|
|
|
|
import HeaderlessInput from '@/components/common/HeaderlessInput.vue';
|
|
|
|
import PasswordStrength from '@/components/common/PasswordStrength.vue';
|
|
|
|
import SelectInput from '@/components/common/SelectInput.vue';
|
|
|
|
|
|
|
|
import BottomArrowIcon from '@/../static/images/common/lightBottomArrow.svg';
|
|
|
|
import SelectedCheckIcon from '@/../static/images/common/selectedCheck.svg';
|
2021-08-19 19:25:03 +01:00
|
|
|
import LogoIcon from '@/../static/images/logo.svg';
|
2021-07-20 10:40:06 +01:00
|
|
|
import ErrorIcon from '@/../static/images/register/ErrorInfo.svg';
|
|
|
|
import RegisterGlobe from '@/../static/images/register/RegisterGlobe.svg';
|
|
|
|
import RegisterGlobeSmall from '@/../static/images/register/RegisterGlobeSmall.svg';
|
|
|
|
|
|
|
|
import { AuthHttpApi } from '@/api/auth';
|
|
|
|
import { RouteConfig } from '@/router';
|
|
|
|
import { PartneredSatellite } from '@/types/common';
|
|
|
|
import { User } from '@/types/users';
|
|
|
|
import { MetaUtils } from '@/utils/meta';
|
|
|
|
import { Validator } from '@/utils/validation';
|
|
|
|
|
2021-08-31 14:49:45 +01:00
|
|
|
// @vue/component
|
2021-07-20 10:40:06 +01:00
|
|
|
@Component({
|
|
|
|
components: {
|
|
|
|
HeaderlessInput,
|
|
|
|
BottomArrowIcon,
|
|
|
|
ErrorIcon,
|
|
|
|
SelectedCheckIcon,
|
|
|
|
LogoIcon,
|
|
|
|
PasswordStrength,
|
|
|
|
AddCouponCodeInput,
|
|
|
|
SelectInput,
|
|
|
|
RegisterGlobe,
|
|
|
|
RegisterGlobeSmall,
|
|
|
|
VueRecaptcha,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
export default class RegisterArea extends Vue {
|
|
|
|
private readonly user = new User();
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
// DCS logic
|
2021-08-02 19:17:49 +01:00
|
|
|
private secret = '';
|
2021-07-20 10:40:06 +01:00
|
|
|
|
2021-08-02 19:17:49 +01:00
|
|
|
private isTermsAccepted = false;
|
|
|
|
private password = '';
|
|
|
|
private repeatedPassword = '';
|
2021-07-20 10:40:06 +01:00
|
|
|
|
|
|
|
// Only for beta sats (like US2).
|
2021-08-02 19:17:49 +01:00
|
|
|
private areBetaTermsAccepted = false;
|
|
|
|
private areBetaTermsAcceptedError = false;
|
2021-07-20 10:40:06 +01:00
|
|
|
|
2021-08-02 19:17:49 +01:00
|
|
|
private fullNameError = '';
|
|
|
|
private emailError = '';
|
|
|
|
private passwordError = '';
|
|
|
|
private repeatedPasswordError = '';
|
|
|
|
private companyNameError = '';
|
|
|
|
private employeeCountError = '';
|
|
|
|
private positionError = '';
|
|
|
|
private isTermsAcceptedError = false;
|
|
|
|
private isLoading = false;
|
|
|
|
private isProfessional = false;
|
|
|
|
private haveSalesContact = false;
|
2021-07-20 10:40:06 +01:00
|
|
|
|
2021-08-02 19:17:49 +01:00
|
|
|
private recaptchaError = false;
|
|
|
|
private recaptchaResponseToken = '';
|
2021-07-20 10:40:06 +01:00
|
|
|
|
|
|
|
private readonly auth: AuthHttpApi = new AuthHttpApi();
|
|
|
|
|
|
|
|
private readonly recaptchaEnabled: boolean = MetaUtils.getMetaContent('recaptcha-enabled') === 'true';
|
|
|
|
private readonly recaptchaSiteKey: string = MetaUtils.getMetaContent('recaptcha-site-key');
|
|
|
|
|
2021-08-02 19:17:49 +01:00
|
|
|
public isPasswordStrengthShown = false;
|
2021-07-20 10:40:06 +01:00
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
// DCS logic
|
2021-08-02 19:17:49 +01:00
|
|
|
public isDropdownShown = false;
|
2021-07-20 10:40:06 +01:00
|
|
|
|
|
|
|
// Employee Count dropdown options
|
|
|
|
public employeeCountOptions = ['1-50', '51-1000', '1001+'];
|
|
|
|
public optionsShown = false;
|
|
|
|
|
|
|
|
public readonly loginPath: string = RouteConfig.Login.path;
|
|
|
|
|
2021-08-26 22:55:26 +01:00
|
|
|
public $refs!: {
|
|
|
|
recaptcha: VueRecaptcha;
|
|
|
|
}
|
|
|
|
|
2021-07-20 10:40:06 +01:00
|
|
|
/**
|
|
|
|
* Lifecycle hook after initial render.
|
|
|
|
* Sets up variables from route params.
|
|
|
|
*/
|
|
|
|
public mounted(): void {
|
|
|
|
if (this.$route.query.token) {
|
|
|
|
this.secret = this.$route.query.token.toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.$route.query.partner) {
|
|
|
|
this.user.partner = this.$route.query.partner.toString();
|
|
|
|
}
|
2021-10-26 14:30:19 +01:00
|
|
|
|
|
|
|
if (this.$route.query.promo) {
|
|
|
|
this.user.signupPromoCode = this.$route.query.promo.toString();
|
|
|
|
}
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Toggles satellite selection dropdown visibility (Tardigrade).
|
|
|
|
*/
|
|
|
|
public toggleDropdown(): void {
|
|
|
|
this.isDropdownShown = !this.isDropdownShown;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Closes satellite selection dropdown (Tardigrade).
|
|
|
|
*/
|
|
|
|
public closeDropdown(): void {
|
|
|
|
this.isDropdownShown = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Makes password strength container visible.
|
|
|
|
*/
|
|
|
|
public showPasswordStrength(): void {
|
|
|
|
this.isPasswordStrengthShown = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Hides password strength container.
|
|
|
|
*/
|
|
|
|
public hidePasswordStrength(): void {
|
|
|
|
this.isPasswordStrengthShown = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Validates input fields and proceeds user creation.
|
|
|
|
*/
|
|
|
|
public async onCreateClick(): Promise<void> {
|
2021-08-26 22:55:26 +01:00
|
|
|
if (this.$refs.recaptcha && !this.recaptchaResponseToken) {
|
|
|
|
this.$refs.recaptcha.execute();
|
2021-07-20 10:40:06 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
await this.createUser();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reloads page.
|
|
|
|
*/
|
|
|
|
public onLogoClick(): void {
|
|
|
|
location.reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes location to login route.
|
|
|
|
*/
|
|
|
|
public onLoginClick(): void {
|
|
|
|
this.$router.push(RouteConfig.Login.path);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's email field from value string.
|
|
|
|
*/
|
|
|
|
public setEmail(value: string): void {
|
|
|
|
this.user.email = value.trim();
|
|
|
|
this.emailError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's full name field from value string.
|
|
|
|
*/
|
|
|
|
public setFullName(value: string): void {
|
|
|
|
this.user.fullName = value.trim();
|
|
|
|
this.fullNameError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's password field from value string.
|
|
|
|
*/
|
|
|
|
public setPassword(value: string): void {
|
2022-02-18 12:52:23 +00:00
|
|
|
this.user.password = value;
|
2021-07-20 10:40:06 +01:00
|
|
|
this.password = value;
|
|
|
|
this.passwordError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's repeat password field from value string.
|
|
|
|
*/
|
|
|
|
public setRepeatedPassword(value: string): void {
|
|
|
|
this.repeatedPassword = value;
|
|
|
|
this.repeatedPasswordError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Name of the current satellite.
|
|
|
|
*/
|
|
|
|
public get satelliteName(): string {
|
|
|
|
return this.$store.state.appStateModule.satelliteName;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Information about partnered satellites, including name and signup link.
|
|
|
|
*/
|
|
|
|
public get partneredSatellites(): PartneredSatellite[] {
|
|
|
|
return this.$store.state.appStateModule.partneredSatellites;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicates if satellite is in beta.
|
|
|
|
*/
|
|
|
|
public get isBetaSatellite(): boolean {
|
|
|
|
return this.$store.state.appStateModule.isBetaSatellite;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicates if coupon code ui is enabled
|
|
|
|
*/
|
2021-06-22 01:09:56 +01:00
|
|
|
public get couponCodeSignupUIEnabled(): boolean {
|
|
|
|
return this.$store.state.appStateModule.couponCodeSigunpUIEnabled;
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's company name field from value string.
|
|
|
|
*/
|
|
|
|
public setCompanyName(value: string): void {
|
|
|
|
this.user.companyName = value.trim();
|
|
|
|
this.companyNameError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's company size field from value string.
|
|
|
|
*/
|
|
|
|
public setEmployeeCount(value: string): void {
|
|
|
|
this.user.employeeCount = value;
|
|
|
|
this.employeeCountError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets user's position field from value string.
|
|
|
|
*/
|
|
|
|
public setPosition(value: string): void {
|
|
|
|
this.user.position = value.trim();
|
|
|
|
this.positionError = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* toggle user account type
|
|
|
|
*/
|
|
|
|
public toggleAccountType(value: boolean): void {
|
|
|
|
this.isProfessional = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles reCAPTCHA verification response.
|
|
|
|
*/
|
|
|
|
public onRecaptchaVerified(response: string): void {
|
|
|
|
this.recaptchaResponseToken = response;
|
|
|
|
this.recaptchaError = false;
|
2021-08-26 22:55:26 +01:00
|
|
|
this.createUser();
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles reCAPTCHA error and expiry.
|
|
|
|
*/
|
|
|
|
public onRecaptchaError(): void {
|
|
|
|
this.recaptchaResponseToken = '';
|
2021-08-26 22:55:26 +01:00
|
|
|
this.recaptchaError = true;
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Validates input values to satisfy expected rules.
|
|
|
|
*/
|
|
|
|
private validateFields(): boolean {
|
|
|
|
let isNoErrors = true;
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
if (!this.user.fullName) {
|
|
|
|
this.fullNameError = 'Name can\'t be empty';
|
2021-07-20 10:40:06 +01:00
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
if (!this.isEmailValid()) {
|
2021-07-20 10:40:06 +01:00
|
|
|
this.emailError = 'Invalid Email';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Validator.password(this.password)) {
|
|
|
|
this.passwordError = 'Invalid Password';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.isProfessional) {
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
if (!this.user.companyName) {
|
2021-07-20 10:40:06 +01:00
|
|
|
this.companyNameError = 'No Company Name filled in';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
if (!this.user.position) {
|
2021-07-20 10:40:06 +01:00
|
|
|
this.positionError = 'No Position filled in';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
if (!this.user.employeeCount) {
|
2021-07-20 10:40:06 +01:00
|
|
|
this.employeeCountError = 'No Company Size filled in';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.repeatedPassword !== this.password) {
|
|
|
|
this.repeatedPasswordError = 'Password doesn\'t match';
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this.isTermsAccepted) {
|
|
|
|
this.isTermsAcceptedError = true;
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// only for beta US2 sats.
|
|
|
|
if (this.isBetaSatellite && !this.areBetaTermsAccepted) {
|
|
|
|
this.areBetaTermsAcceptedError = true;
|
|
|
|
isNoErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return isNoErrors;
|
|
|
|
}
|
|
|
|
|
2021-10-20 18:01:51 +01:00
|
|
|
/**
|
|
|
|
* Detect if user uses Brave browser
|
|
|
|
*/
|
|
|
|
public async detectBraveBrowser(): Promise<boolean> {
|
|
|
|
return (navigator['brave'] && await navigator['brave'].isBrave() || false)
|
|
|
|
}
|
|
|
|
|
2022-02-18 12:52:23 +00:00
|
|
|
/**
|
|
|
|
* Validates email string.
|
|
|
|
* We'll have this email validation for new users instead of using regular Validator.email method because of backwards compatibility.
|
|
|
|
* We don't want to block old users who managed to create and verify their accounts with some weird email addresses.
|
|
|
|
*/
|
|
|
|
private isEmailValid(): boolean {
|
|
|
|
// This regular expression fulfills our needs to validate international emails.
|
|
|
|
// It was built according to RFC 5322 and then extended to include international characters.
|
|
|
|
// eslint-disable-next-line no-misleading-character-class
|
|
|
|
const regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF]+\.)+[a-zA-Z\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF]{2,}))$/;
|
|
|
|
return regex.test(this.user.email);
|
|
|
|
}
|
|
|
|
|
2021-07-20 10:40:06 +01:00
|
|
|
/**
|
|
|
|
* Creates user and toggles successful registration area visibility.
|
|
|
|
*/
|
|
|
|
private async createUser(): Promise<void> {
|
2021-08-26 22:55:26 +01:00
|
|
|
if (this.isLoading) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this.validateFields()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.isLoading = true;
|
|
|
|
|
2021-07-20 10:40:06 +01:00
|
|
|
this.user.isProfessional = this.isProfessional;
|
|
|
|
this.user.haveSalesContact = this.haveSalesContact;
|
|
|
|
|
|
|
|
try {
|
2021-11-18 18:55:37 +00:00
|
|
|
await this.auth.register(this.user, this.secret, this.recaptchaResponseToken);
|
2022-02-22 19:53:41 +00:00
|
|
|
|
|
|
|
// Brave browser conversions are tracked via the RegisterSuccess path in the satellite app
|
|
|
|
// signups outside of the brave browser may use a configured URL to track conversions
|
|
|
|
// if the URL is not configured, the RegisterSuccess path will be used for non-Brave browsers
|
|
|
|
const internalRegisterSuccessPath = RouteConfig.RegisterSuccess.path;
|
|
|
|
const configuredRegisterSuccessPath = MetaUtils.getMetaContent('optional-signup-success-url') || internalRegisterSuccessPath;
|
|
|
|
|
2022-03-22 21:34:26 +00:00
|
|
|
const nonBraveSuccessPath = `${configuredRegisterSuccessPath}?email=${encodeURIComponent(this.user.email)}`;
|
|
|
|
const braveSuccessPath = `${internalRegisterSuccessPath}?email=${encodeURIComponent(this.user.email)}`;
|
2022-02-22 19:53:41 +00:00
|
|
|
|
|
|
|
await this.detectBraveBrowser() ? await this.$router.push(braveSuccessPath) : window.location.href = nonBraveSuccessPath;
|
2021-07-20 10:40:06 +01:00
|
|
|
} catch (error) {
|
|
|
|
if (this.$refs.recaptcha) {
|
2021-08-26 22:55:26 +01:00
|
|
|
this.$refs.recaptcha.reset();
|
2021-09-22 18:28:00 +01:00
|
|
|
this.recaptchaResponseToken = '';
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
await this.$notify.error(error.message);
|
|
|
|
}
|
2021-08-26 22:55:26 +01:00
|
|
|
this.isLoading = false;
|
2021-07-20 10:40:06 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
.register-area {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
align-items: center;
|
|
|
|
font-family: 'font_regular', sans-serif;
|
|
|
|
background-color: #f5f6fa;
|
|
|
|
position: fixed;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
bottom: 0;
|
|
|
|
overflow-y: scroll;
|
|
|
|
|
|
|
|
&__logo-wrapper {
|
|
|
|
text-align: center;
|
|
|
|
margin-top: 60px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-wrapper {
|
|
|
|
margin-top: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-wrapper.first-input {
|
|
|
|
margin-top: 10px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
display: flex;
|
|
|
|
background-color: #fff;
|
|
|
|
border-radius: 20px;
|
|
|
|
width: 75%;
|
|
|
|
margin-top: 50px;
|
|
|
|
padding: 70px 90px 30px 90px;
|
|
|
|
max-width: 1200px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
overflow: hidden;
|
|
|
|
margin-bottom: -30px;
|
|
|
|
|
|
|
|
&__wrapper {
|
|
|
|
width: 80%;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-family: 'font_bold', sans-serif;
|
|
|
|
font-size: 48px;
|
|
|
|
font-style: normal;
|
|
|
|
font-weight: 800;
|
|
|
|
line-height: 59px;
|
|
|
|
letter-spacing: 0;
|
|
|
|
text-align: left;
|
|
|
|
margin-bottom: 40px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__sub-title {
|
|
|
|
font-size: 18px;
|
|
|
|
font-style: normal;
|
|
|
|
font-weight: 400;
|
|
|
|
line-height: 30px;
|
|
|
|
letter-spacing: -0.1007407009601593px;
|
|
|
|
text-align: left;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
position: relative;
|
|
|
|
top: 140px;
|
|
|
|
left: 40px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image.professional-globe {
|
|
|
|
top: 110px;
|
|
|
|
left: 40px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image-sm {
|
|
|
|
display: none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-area {
|
|
|
|
padding: 0 0 40px 20px;
|
|
|
|
margin: 0 auto;
|
|
|
|
width: 70%;
|
|
|
|
|
|
|
|
&__expand {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
cursor: pointer;
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
&__value {
|
2021-07-28 15:37:47 +01:00
|
|
|
font-family: 'font_regular', sans-serif;
|
2021-07-20 10:40:06 +01:00
|
|
|
font-weight: 700;
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 21px;
|
|
|
|
color: #afb7c1;
|
|
|
|
margin-right: 10px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__dropdown {
|
|
|
|
position: absolute;
|
|
|
|
top: 35px;
|
|
|
|
right: 0;
|
|
|
|
background-color: #fff;
|
|
|
|
z-index: 1000;
|
|
|
|
border: 1px solid #c5cbdb;
|
|
|
|
box-shadow: 0 8px 34px rgba(161, 173, 185, 0.41);
|
|
|
|
border-radius: 6px;
|
|
|
|
min-width: 250px;
|
|
|
|
|
|
|
|
&__item {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: flex-start;
|
|
|
|
padding: 12px 25px;
|
|
|
|
font-size: 14px;
|
|
|
|
line-height: 20px;
|
|
|
|
color: #7e8b9c;
|
|
|
|
cursor: pointer;
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
|
|
&__name {
|
|
|
|
font-family: 'font_bold', sans-serif;
|
|
|
|
margin-left: 15px;
|
|
|
|
font-size: 14px;
|
|
|
|
line-height: 20px;
|
|
|
|
color: #7e8b9c;
|
|
|
|
}
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background-color: #f2f2f6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__toggle {
|
|
|
|
|
|
|
|
&__wrapper {
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
margin: 20px 0 15px 0;
|
|
|
|
list-style: none;
|
|
|
|
padding: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__personal {
|
|
|
|
border-top-left-radius: 20px;
|
|
|
|
border-bottom-left-radius: 20px;
|
|
|
|
border-right: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__professional {
|
|
|
|
border-top-right-radius: 20px;
|
|
|
|
border-bottom-right-radius: 20px;
|
|
|
|
border-left: none;
|
|
|
|
position: relative;
|
|
|
|
right: 1px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__personal,
|
|
|
|
&__professional {
|
|
|
|
color: #376fff;
|
|
|
|
display: block;
|
|
|
|
width: 100%;
|
|
|
|
text-align: center;
|
|
|
|
padding: 8px;
|
|
|
|
border: 1px solid #376fff;
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__personal.active,
|
|
|
|
&__professional.active {
|
|
|
|
color: #fff;
|
|
|
|
background: #376fff;
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
|
|
|
|
&__title-area {
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-size: 24px;
|
|
|
|
line-height: 49px;
|
|
|
|
letter-spacing: -0.100741px;
|
|
|
|
color: #252525;
|
2021-07-28 15:37:47 +01:00
|
|
|
font-family: 'font_regular', sans-serif;
|
2021-07-20 10:40:06 +01:00
|
|
|
font-weight: 800;
|
|
|
|
white-space: nowrap;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__satellite {
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 21px;
|
|
|
|
color: #848484;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__warning {
|
|
|
|
margin-top: 30px;
|
|
|
|
padding: 15px;
|
|
|
|
width: calc(100% - 32px);
|
|
|
|
background: #fff9f7;
|
|
|
|
border: 1px solid #f84b00;
|
|
|
|
border-radius: 8px;
|
|
|
|
|
|
|
|
&__header {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
&__label {
|
|
|
|
font-style: normal;
|
|
|
|
font-family: 'font_bold', sans-serif;
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 19px;
|
|
|
|
color: #1b2533;
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__message {
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 22px;
|
|
|
|
color: #1b2533;
|
|
|
|
margin: 8px 0 0 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__checkbox-area {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
width: 100%;
|
|
|
|
margin-top: 30px;
|
|
|
|
|
|
|
|
&__msg-box {
|
|
|
|
font-size: 14px;
|
|
|
|
line-height: 20px;
|
|
|
|
color: #354049;
|
|
|
|
|
|
|
|
&__msg {
|
|
|
|
position: relative;
|
|
|
|
top: 2px;
|
|
|
|
|
|
|
|
&__link {
|
|
|
|
margin: 0 4px;
|
|
|
|
font-family: 'font_bold', sans-serif;
|
|
|
|
color: #000;
|
|
|
|
text-decoration: underline !important;
|
|
|
|
|
|
|
|
&:visited {
|
|
|
|
color: inherit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__button {
|
2021-07-28 15:37:47 +01:00
|
|
|
font-family: 'font_regular', sans-serif;
|
2021-07-20 10:40:06 +01:00
|
|
|
font-weight: 700;
|
|
|
|
margin-top: 30px;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
background-color: #376fff;
|
|
|
|
border-radius: 50px;
|
|
|
|
color: #fff;
|
|
|
|
cursor: pointer;
|
|
|
|
width: 100%;
|
|
|
|
min-height: 48px;
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background-color: #0059d0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__recaptcha-wrapper {
|
|
|
|
margin-top: 30px;
|
|
|
|
|
|
|
|
&__label-container {
|
|
|
|
display: flex;
|
|
|
|
justify-content: flex-start;
|
|
|
|
align-items: flex-end;
|
|
|
|
padding-bottom: 8px;
|
|
|
|
flex-direction: row;
|
|
|
|
|
|
|
|
&__error {
|
|
|
|
font-size: 16px;
|
|
|
|
margin-left: 10px;
|
|
|
|
color: #ff5560;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__footer {
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: flex-start;
|
|
|
|
margin-top: 40px;
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
&__copyright {
|
|
|
|
font-size: 12px;
|
|
|
|
line-height: 18px;
|
|
|
|
color: #384b65;
|
|
|
|
padding-bottom: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__link {
|
|
|
|
font-size: 12px;
|
|
|
|
line-height: 18px;
|
|
|
|
margin-left: 30px;
|
|
|
|
color: #376fff;
|
|
|
|
text-decoration: none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__login-container {
|
|
|
|
width: 100%;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: center;
|
|
|
|
margin-top: 50px;
|
|
|
|
padding-bottom: 50px;
|
|
|
|
text-align: center;
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
&__link {
|
|
|
|
font-family: 'font_bold', sans-serif;
|
|
|
|
text-decoration: none;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #376fff;
|
|
|
|
margin-left: 5px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.logo {
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
|
|
|
.register-input {
|
|
|
|
position: relative;
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container {
|
|
|
|
display: block;
|
|
|
|
position: relative;
|
|
|
|
padding-left: 20px;
|
|
|
|
height: 21px;
|
|
|
|
width: 21px;
|
|
|
|
cursor: pointer;
|
|
|
|
font-size: 22px;
|
|
|
|
-webkit-user-select: none;
|
|
|
|
-moz-user-select: none;
|
|
|
|
-ms-user-select: none;
|
|
|
|
user-select: none;
|
|
|
|
outline: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container input {
|
|
|
|
position: absolute;
|
|
|
|
opacity: 0;
|
|
|
|
cursor: pointer;
|
|
|
|
height: 0;
|
|
|
|
width: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.checkmark {
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
height: 21px;
|
|
|
|
width: 21px;
|
|
|
|
border: 2px solid #afb7c1;
|
|
|
|
border-radius: 4px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container:hover input ~ .checkmark {
|
|
|
|
background-color: white;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container input:checked ~ .checkmark {
|
|
|
|
border: 2px solid #afb7c1;
|
|
|
|
background-color: transparent;
|
|
|
|
}
|
|
|
|
|
|
|
|
.checkmark:after {
|
|
|
|
content: '';
|
|
|
|
position: absolute;
|
|
|
|
display: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.checkmark.error {
|
|
|
|
border-color: red;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container .checkmark:after {
|
|
|
|
left: 7px;
|
|
|
|
top: 3px;
|
|
|
|
width: 5px;
|
|
|
|
height: 10px;
|
|
|
|
border: solid #354049;
|
|
|
|
border-width: 0 3px 3px 0;
|
|
|
|
-webkit-transform: rotate(45deg);
|
|
|
|
-ms-transform: rotate(45deg);
|
|
|
|
transform: rotate(45deg);
|
|
|
|
}
|
|
|
|
|
|
|
|
.container input:checked ~ .checkmark:after {
|
|
|
|
display: block;
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 1429px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
|
|
|
|
&__width {
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
top: 110px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 1200px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
|
|
|
|
&__width {
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
top: 110px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image.professional-globe {
|
|
|
|
left: 20px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 1060px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
width: 70%;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
position: relative;
|
|
|
|
left: 0;
|
|
|
|
top: 110px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image.professional-globe {
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 1024px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
position: relative;
|
|
|
|
height: 100vh;
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
display: inline;
|
|
|
|
text-align: center;
|
|
|
|
overflow: visible;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
margin: 0 auto 130px auto;
|
|
|
|
overflow: visible;
|
|
|
|
|
|
|
|
&__wrapper {
|
|
|
|
text-align: center;
|
|
|
|
margin: 0 auto;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
top: 50px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image.professional-globe {
|
|
|
|
left: 0;
|
|
|
|
top: 50px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__title,
|
|
|
|
&__sub-title {
|
|
|
|
text-align: center;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-area {
|
|
|
|
display: block;
|
|
|
|
width: 80%;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 700px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
width: 70%;
|
|
|
|
padding: 80px 40px 40px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
margin: 0 auto;
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-size: 36px;
|
|
|
|
line-height: 40px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__sub-title {
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 23px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image {
|
|
|
|
display: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__globe-image-sm {
|
|
|
|
display: block;
|
|
|
|
position: relative;
|
|
|
|
top: 40px;
|
|
|
|
margin: 0 auto;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-area {
|
|
|
|
width: 100%;
|
|
|
|
padding: 55px 0 0 0;
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
padding: 40px;
|
|
|
|
width: calc(100% - 80px);
|
|
|
|
|
|
|
|
&__checkbox-area {
|
|
|
|
|
|
|
|
&__msg-box {
|
|
|
|
|
|
|
|
&__msg {
|
|
|
|
position: relative;
|
|
|
|
top: 7px;
|
|
|
|
text-align: left;
|
|
|
|
left: 10px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__toggle {
|
|
|
|
|
|
|
|
&__professional {
|
|
|
|
right: 1px;
|
|
|
|
position: relative;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__expand {
|
|
|
|
|
|
|
|
&__dropdown {
|
|
|
|
left: -200px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-26 22:55:26 +01:00
|
|
|
::v-deep .grecaptcha-badge {
|
|
|
|
z-index: 99;
|
|
|
|
}
|
|
|
|
|
2021-07-20 10:40:06 +01:00
|
|
|
@media screen and (max-width: 414px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
width: 90%;
|
|
|
|
padding: 60px 10px 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
margin: 0 auto 30px auto;
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-size: 34px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__logo-wrapper {
|
|
|
|
margin-top: 30px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&__input-area {
|
|
|
|
padding: 30px 0 0 0;
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
padding: 40px 20px;
|
|
|
|
width: calc(100% - 40px);
|
|
|
|
|
|
|
|
&__title-area {
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-size: 20px;
|
|
|
|
line-height: 34px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__login-container {
|
|
|
|
margin-top: 40px;
|
|
|
|
padding-bottom: 40px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 320px) {
|
|
|
|
|
|
|
|
.register-area {
|
|
|
|
|
|
|
|
&__container {
|
|
|
|
|
|
|
|
&__checkbox-area {
|
|
|
|
|
|
|
|
&__msg-box {
|
|
|
|
|
|
|
|
&__msg {
|
|
|
|
top: 6px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__intro-area {
|
|
|
|
|
|
|
|
&__title {
|
|
|
|
font-size: 29px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&__login-container {
|
|
|
|
margin-top: 40px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|