| @@ -0,0 +1,11 @@ | |||
| <svg xmlns="http://www.w3.org/2000/svg" width="301.408" height="77.587" viewBox="0 0 301.408 77.587"> | |||
| <g id="Group_304" data-name="Group 304" transform="translate(-48.863 -25.337)"> | |||
| <path id="Path_291" data-name="Path 291" d="M1760.163,46.053C1681.265,38.564,1599.1,35.5,1553.7,81.309s119.183,42.6,75.535-16.783-130.787,0-130.787,0" transform="translate(-1449.307 -10.375)" fill="none" stroke="#707070" stroke-width="1" stroke-dasharray="9 5"/> | |||
| <g id="Group_34" data-name="Group 34" transform="translate(-1386.263 122.15)"> | |||
| <path id="Path_292" data-name="Path 292" d="M1705.353-77.281l-5.371,16.673,36.4-4.267Z" transform="translate(0 -9.541)" fill="#f8c657"/> | |||
| <path id="Path_293" data-name="Path 293" d="M1741.614-74.36,1710.382-86.8l2.67-10.016Z" transform="translate(-5.081)" fill="#f8c657"/> | |||
| <path id="Path_294" data-name="Path 294" d="M1736.726-64.794l-31.232-12.437-5.118.971Z" transform="translate(-0.192 -9.566)" fill="#ddb04e"/> | |||
| <path id="Path_295" data-name="Path 295" d="M1704.835-73.973l-.745,2.278-3.682-3.67Z" transform="translate(-0.208 -10.477)" fill="#efbe53"/> | |||
| </g> | |||
| </g> | |||
| </svg> | |||
| @@ -3,6 +3,7 @@ import { IonApp, IonRouterOutlet } from '@ionic/react'; | |||
| import { IonReactRouter } from '@ionic/react-router'; | |||
| import WelcomePage from './pages/onboarding/Welcome'; | |||
| import LoginPage from './pages/login/Login'; | |||
| import SignupPage from './pages/signup/Signup'; | |||
| /* Core CSS required for Ionic components to work properly */ | |||
| import '@ionic/react/css/core.css'; | |||
| @@ -34,6 +35,9 @@ const App: React.FC = () => ( | |||
| <Route exact path="/login"> | |||
| <LoginPage /> | |||
| </Route> | |||
| <Route exact path="/signup"> | |||
| <SignupPage /> | |||
| </Route> | |||
| <Route exact path="/"> | |||
| <Redirect to="/welcome" /> | |||
| </Route> | |||
| @@ -3,6 +3,7 @@ import { personOutline, lockOpenOutline } from 'ionicons/icons'; | |||
| import { Component } from 'react'; | |||
| import InputWidget from '../../components/input/InputWidget'; | |||
| import styles from './Login.module.scss'; | |||
| import { BrowserRouter as Router, Route, Link } from "react-router-dom" | |||
| type Props = { }; | |||
| @@ -22,10 +23,10 @@ class LoginPage extends Component<Props, OwnState> { | |||
| <section className={styles.upfold}> | |||
| <div className={styles.container}> | |||
| <figure> | |||
| <img src="assets/images/welcome/upfold.svg" alt="upfold image"/> | |||
| <img src='assets/images/welcome/upfold.svg' alt='upfold image'/> | |||
| </figure> | |||
| <h2> Welcome Back! </h2> | |||
| <p> Enter your email-id & password </p> | |||
| <p> Please enter your email-id & password </p> | |||
| </div> | |||
| </section> | |||
| @@ -40,11 +41,11 @@ class LoginPage extends Component<Props, OwnState> { | |||
| <div className={ styles.actionLink }> <a> Forgot Password? </a> </div> | |||
| <div className={styles.actionButtonsHolder}> | |||
| <IonButton className={styles.actionButton} expand="block"> Login </IonButton> | |||
| <IonButton className={styles.actionButton} expand='block'> Login </IonButton> | |||
| </div> | |||
| </section> | |||
| <div className={ styles.navigationLink }> Don't have an account? <a> Sign up </a> </div> | |||
| <div className={ styles.navigationLink }> Don't have an account? <Link to='/signup'> <span> Signup </span> </Link> </div> | |||
| </IonContent> | |||
| </IonPage> | |||
| }; | |||
| @@ -17,7 +17,6 @@ class WelcomePage extends Component<Props, OwnState> { | |||
| render() { | |||
| return <IonPage> | |||
| <IonContent fullscreen> | |||
| <section className={styles.upfold}> | |||
| <figure> | |||
| <img src="assets/images/welcome/upfold.svg" alt="upfold image"/> | |||
| @@ -0,0 +1,128 @@ | |||
| .upfold { | |||
| background-color: var(--charcoal); | |||
| height: auto; | |||
| transform: translateY(-50vh); | |||
| width: 100%; | |||
| border-bottom-right-radius: 30px; | |||
| border-bottom-left-radius: 30px; | |||
| position: relative; | |||
| z-index: 1; | |||
| box-shadow: 0px 0px 10px 5px var(--black-rock); | |||
| animation: riseDown 1s forwards; | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: center; | |||
| .container { | |||
| padding: 30px 5%; | |||
| text-align: center; | |||
| } | |||
| h2 { | |||
| font-size: 26px; | |||
| color: white; | |||
| } | |||
| p { | |||
| font-size: 14px; | |||
| color: var(--grey-rock); | |||
| } | |||
| figure { | |||
| position: absolute; | |||
| left: 0; | |||
| top: 0; | |||
| z-index: 0; | |||
| display: block; | |||
| width: 100%; | |||
| height: 100%; | |||
| margin: 10px 0; | |||
| animation: fadeIn 1s forwards; | |||
| opacity: 0; | |||
| transform: translateY(10vh); | |||
| } | |||
| img { | |||
| margin: 5px auto 0; | |||
| width: 70%; | |||
| display: block; | |||
| } | |||
| @keyframes riseDown { | |||
| from { | |||
| transform: translateY(-50vh); | |||
| } | |||
| to { | |||
| transform: translateY(0vh); | |||
| } | |||
| } | |||
| } | |||
| .inputForm { | |||
| width: 80%; | |||
| margin: 40px auto 0; | |||
| opacity: 0; | |||
| transform: translateY(10vh); | |||
| position: relative; | |||
| animation: fadeIn 1s forwards; | |||
| .input { | |||
| margin: 20px 0; | |||
| } | |||
| .actionLink { | |||
| text-align: right; | |||
| margin: 20px 0; | |||
| span { | |||
| font-size: 14px; | |||
| color: var(--rock); | |||
| text-decoration: none; | |||
| } | |||
| } | |||
| .actionButtonsHolder { | |||
| width: 60%; | |||
| margin: 20px auto; | |||
| .actionButton { | |||
| height: 50px; | |||
| text-transform: none; | |||
| font-size: 16px; | |||
| --border-radius: 30px; | |||
| --border-color: var(--shamrock); | |||
| font-weight: 500; | |||
| &:nth-child(1) { | |||
| --background: var(--shamrock); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .navigationLink { | |||
| position: absolute; | |||
| left: 0; | |||
| width: 100%; | |||
| bottom: 10px; | |||
| text-align: center; | |||
| font-size: 14px; | |||
| color: var(--rock); | |||
| span { | |||
| color: var(--shamrock); | |||
| text-decoration: none; | |||
| } | |||
| } | |||
| @keyframes fadeIn { | |||
| from { | |||
| opacity: 0; | |||
| transform: translateY(10vh); | |||
| } | |||
| to { | |||
| opacity: 1; | |||
| transform: translateY(0vh); | |||
| } | |||
| } | |||
| @@ -0,0 +1,51 @@ | |||
| import { IonContent, IonPage, IonButton } from '@ionic/react'; | |||
| import { personOutline, lockOpenOutline } from 'ionicons/icons'; | |||
| import { Component } from 'react'; | |||
| import InputWidget from '../../components/input/InputWidget'; | |||
| import styles from './Signup.module.scss'; | |||
| type Props = { }; | |||
| type OwnState = { }; | |||
| class SignupPage extends Component<Props, OwnState> { | |||
| constructor( | |||
| props: Props | |||
| ) { | |||
| super(props); | |||
| this.state = {}; | |||
| } | |||
| render() { | |||
| return <IonPage> | |||
| <IonContent fullscreen> | |||
| <section className={styles.upfold}> | |||
| <div className={styles.container}> | |||
| <figure> | |||
| <img src="assets/images/signup/rocket.svg" alt="rocket image"/> | |||
| </figure> | |||
| <h2> Let's Create </h2> | |||
| <p> Please provide few details below. </p> | |||
| </div> | |||
| </section> | |||
| <section className={styles.inputForm}> | |||
| <div className={styles.input}> | |||
| <InputWidget type={'TEXT'} icon={personOutline} placeholder={'Email'} /> | |||
| </div> | |||
| <div className={styles.input}> | |||
| <InputWidget type={'PASSWORD'} icon={lockOpenOutline} placeholder={'Password'} /> | |||
| </div> | |||
| <div className={styles.actionButtonsHolder}> | |||
| <IonButton className={styles.actionButton} expand="block"> Login </IonButton> | |||
| </div> | |||
| </section> | |||
| <div className={ styles.navigationLink }> Already have an account? <a> Login </a> </div> | |||
| </IonContent> | |||
| </IonPage> | |||
| }; | |||
| }; | |||
| export default SignupPage; | |||