diff --git a/package-lock.json b/package-lock.json index 772508d..b5e3e86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2222,6 +2222,16 @@ "normalize-path": "^2.1.1" } }, + "aos": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", + "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", + "requires": { + "classlist-polyfill": "^1.0.3", + "lodash.debounce": "^4.0.6", + "lodash.throttle": "^4.0.1" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -4050,6 +4060,11 @@ } } }, + "classlist-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", + "integrity": "sha1-k1vC39lFiodrJ5YXUUY4vKqWSi4=" + }, "classnames": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", diff --git a/package.json b/package.json index a308f8e..76fb4f6 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "@vx/scale": "0.0.192", "@vx/shape": "0.0.192", "@vx/tooltip": "0.0.192", + "aos": "^2.3.4", "big.js": "^5.2.2", "blockstack": "^19.2.5", "chroma-js": "^2.1.0", @@ -140,4 +141,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/__tests__/routes.test.jsx b/src/__tests__/routes.test.jsx index d99b9e0..94d7b51 100644 --- a/src/__tests__/routes.test.jsx +++ b/src/__tests__/routes.test.jsx @@ -77,7 +77,7 @@ describe('Routes', () => { )) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() expect(history.entries.map((e) => e.pathname)).toEqual(['/']) expect(queryByText((_, element) => element.tagName.toLowerCase() === 'header')).not.toBeInTheDocument() }) @@ -91,17 +91,17 @@ describe('Routes', () => { ), { route: '/handle-login' }) expect(blockstackUserSession.handlePendingSignIn).toHaveBeenCalled() await wait(() => expect(historyPushSpy).toHaveBeenCalled()) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() expect(history.entries.map((e) => e.pathname)).toEqual(['/handle-login', '/']) }) - it.only('redirects to home page if not logged in', () => { + it('redirects to home page if not logged in', () => { const { history, getByText } = renderWithRouter(( ), { route: '/dashboard' }) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() expect(history.entries.map((e) => e.pathname)).toEqual(['/']) }) }) @@ -113,7 +113,7 @@ describe('Routes', () => { )) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() expect(getByText('Sign in with Blockstack')).toBeInTheDocument() // Login with blockstack @@ -127,7 +127,7 @@ describe('Routes', () => { // Logout fireEvent.click(getByTestId('userNavButton')) fireEvent.click(getByTestId('logoutButton')) - await waitForElement(() => getByText('Insight into your finances, without sacrificing your data')) + await waitForElement(() => getByText('Your Personal Finances Simple & Private')) expect(queryByText((_, element) => element.tagName.toLowerCase() === 'header')).not.toBeInTheDocument() expect(persistor).toBeNull() }) @@ -138,7 +138,7 @@ describe('Routes', () => { )) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() expect(getByText('Sign in with Blockstack')).toBeInTheDocument() // Login with blockstack @@ -153,7 +153,7 @@ describe('Routes', () => { blockstackUserSession.isUserSignedIn.mockReturnValue(false) fireEvent.click(getByTestId('userNavButton')) fireEvent.click(getByTestId('logoutButton')) - await waitForElement(() => getByText('Insight into your finances, without sacrificing your data')) + await waitForElement(() => getByText('Your Personal Finances Simple & Private')) expect(persistor).toBeNull() }) diff --git a/src/common/LoginButton/index.jsx b/src/common/LoginButton/index.jsx index b4f1875..2f48a84 100644 --- a/src/common/LoginButton/index.jsx +++ b/src/common/LoginButton/index.jsx @@ -62,14 +62,7 @@ const LoginButton = () => { )} { user.isAuthenticatedWith === 'guest' && ( -<<<<<<< HEAD -======= - ->>>>>>> initial updates )} { ) expect(getByText('Sign in with Blockstack')).toBeInTheDocument() - expect(getByText('Don\'t sign in yet')).toBeInTheDocument() + expect(getByText('Sign in as guest user')).toBeInTheDocument() }) it('handles login with blockstack', async () => { diff --git a/src/core/Landing/__tests__/index.test.jsx b/src/core/Landing/__tests__/index.test.jsx index 195d161..e86fb6a 100644 --- a/src/core/Landing/__tests__/index.test.jsx +++ b/src/core/Landing/__tests__/index.test.jsx @@ -23,6 +23,6 @@ describe('Landing page', () => { ) - expect(getByText('Insight into your finances, without sacrificing your data')).toBeInTheDocument() + expect(getByText('Your Personal Finances Simple & Private')).toBeInTheDocument() }) }) diff --git a/src/core/Landing/index.jsx b/src/core/Landing/index.jsx index 2d2e007..be37019 100644 --- a/src/core/Landing/index.jsx +++ b/src/core/Landing/index.jsx @@ -1,41 +1,43 @@ -import React from 'react' +import React, { useEffect } from 'react' import PropTypes from 'prop-types' import { makeStyles } from '@material-ui/core/styles' import Grid from '@material-ui/core/Grid' import Typography from '@material-ui/core/Typography' +import Link from '@material-ui/core/Link' import Divider from '@material-ui/core/Divider' -import TableRow from '@material-ui/core/TableRow' -import TableCell from '@material-ui/core/TableCell' import grey from '@material-ui/core/colors/grey' +import AOS from 'aos' +import 'aos/dist/aos.css' +import LandingCard from './LandingCard' import logoImg from '../../common/Logo/logo.png' import womanImg from './woman2.png' -import LandingCard from './LandingCard' -import landingImage from './landing.png' -import level20Image from './2.0.png' -import level21Image from './2.1.png' -import level30Image from './3.0.png' -import level31Image from './3.1.png' -import level32Image from './3.2.png' -import level33Image from './3.3.png' -import level40Image from './4.0.png' -import level41Image from './4.1.png' -import level50Image from './5.0.png' -import level51Image from './5.1.png' - const useStyles = makeStyles((theme) => ({ root: { display: 'flex', padding: '20px', flexGrow: 1 }, + tagLinePreTitle: { + fontSize: '0.8rem', + textTransform: 'uppercase', + color: theme.palette.text.primary + }, + tagLineTitle: { + fontSize: '1.5rem' + }, + tagLineText: { + fontSize: 16, + color: grey[600] + }, // --- Level 1 level1: { justifyContent: 'space-evenly', background: grey[100], padding: theme.spacing(4), display: 'flex', - flexFlow: 'column nowrap' + flexFlow: 'column nowrap', + paddingBottom: theme.spacing(8) }, logoLevel1: { font: 'bold 24px var(--font-garden-grove)', @@ -67,177 +69,33 @@ const useStyles = makeStyles((theme) => ({ }, // --- Level 2 - womanImage: { - margin: 'auto', - width: '80%' - }, - leftLevel2: { - backgroundColor: 'var(--color-gradient2)' - }, - rightLevel2: { - minHeight: 550 - }, - backgroundImageLevel2: { - position: 'absolute', - left: theme.spacing(4), - marginTop: theme.spacing(8), - zIndex: 1 - }, - titleLevel2: { - whiteSpace: 'noWrap', - fontSize: 36, - fontWeight: 'bold', - marginTop: 43, - left: theme.spacing(1) * -1, - paddingLeft: 250, - paddingRight: theme.spacing(2), - color: 'white', - position: 'absolute', - background: 'var(--color-gradient6)' - }, - tagLineLevel2: { - whiteSpace: 'noWrap', - fontSize: 30, - fontWeight: 'bold', - marginTop: 43, - marginRight: theme.spacing(8), - color: 'var(--color-gradient2)' - }, - screenshotLevel2: { - position: 'absolute', - // width: '60%', - right: theme.spacing(8), - left: theme.spacing(8), - marginTop: theme.spacing(6), - padding: 5 - }, - // --- Level 3 - rightLevel3: { + level: { justifyContent: 'space-evenly', - backgroundRepeat: 'no-repeat', - backgroundPosition: '80% center', - backgroundImage: `url(${level32Image})`, - backgroundSize: '286px', - backgroundColor: 'var(--color-gradient1)', - minHeight: 550 - }, - titleLevel3: { - fontSize: 36, - fontWeight: 'bold', - marginTop: theme.spacing(5), - marginLeft: theme.spacing(2) * -1, - paddingLeft: '15%', - background: `url(${level31Image}) no-repeat center top`, - position: 'absolute', - width: '100%', - lineHeight: '53px' - }, - tagLineLevel3: { - fontSize: 30, - fontWeight: 'bold', - marginTop: theme.spacing(3) * -1, - right: theme.spacing(2) * -1, - color: 'white', - width: 500, - position: 'absolute', - background: `var(--color-gradient2) url(${level33Image}) no-repeat 200px center`, - padding: `5px ${theme.spacing(10)}px 5px 200px` - }, - screenshotLevel3: { - position: 'absolute', - width: '60%', - left: theme.spacing(8), - marginTop: theme.spacing(16), - padding: 5 - }, - // --- Level 4 - leftLevel4: { - backgroundColor: 'var(--color-gradient2)' - }, - rightLevel4: { - minHeight: 600 - }, - backgroundImageLevel4: { - position: 'absolute', - left: theme.spacing(1) * -1, - marginTop: theme.spacing(5) - }, - titleLeftLevel4: { - color: 'white', - fontSize: 36, - fontWeight: 'bold', - marginTop: theme.spacing(3), - marginLeft: 100, - paddingLeft: 100, - lineHeight: '91px', - position: 'absolute', - background: `url(${level41Image}) no-repeat left center` - }, - tagLineLevel4: { - whiteSpace: 'noWrap', - fontSize: 30, - fontWeight: 'bold', - marginTop: 43, - marginRight: theme.spacing(8), - color: 'var(--color-gradient2)' - }, - screenshotLevel4: { - position: 'absolute', - width: '60%', - right: theme.spacing(16), - marginTop: theme.spacing(4), - padding: 5 - }, - // --- Level 5 - titleLevel5: { - fontSize: 36, - fontWeight: 'bold', - marginTop: theme.spacing(5), - marginLeft: theme.spacing(2) * -1, - paddingLeft: '15%', - position: 'absolute', - width: '100%', - lineHeight: '53px' + '& div': { + margin: theme.spacing(2), + marginTop: theme.spacing(8), + marginBottom: theme.spacing(8) + } }, - tagLineLevel5: { - fontSize: 30, - fontWeight: 'bold', - marginTop: theme.spacing(3) * -1, - right: theme.spacing(2) * -1, - color: 'white', - width: 500, - position: 'absolute', - background: 'var(--color-gradient2)', - padding: `5px ${theme.spacing(10)}px 5px ${theme.spacing(2)}px` + greyBackground: { + background: grey[100] }, - rightLevel5: { - justifyContent: 'space-evenly', - backgroundRepeat: 'no-repeat', - backgroundPosition: '80% center', - backgroundSize: '286px', - backgroundColor: 'var(--color-gradient1)', - minHeight: 550 - }, - screenshotLevel5: { - position: 'absolute', - width: '65%', - left: 180, - marginTop: theme.spacing(12), - padding: 5 - }, - backgroundImageLevel5: { - position: 'absolute', - right: '15%', - marginTop: 180, - width: 150 + womanImage: { + margin: 'auto', + width: '80%' } })) const Landing = ({ history }) => { const classes = useStyles() + + useEffect(() => { + AOS.init() + }, []) + return ( - + {/* --- Level 1 --- */} @@ -246,92 +104,121 @@ const Landing = ({ history }) => { Your Personal Finances Simple & Private + - Insight into your finances without sacrificing your data - + + {/* --- Level 2 --- */} + - + - - Manage all your Accounts + + Privacy - - Import transactions via CSV + + A new breed of security - - Multiple currencies + + You are protected by state-of-the-art cryptography that keeps all your data private. + Entaxy leverages the Blockstack + framework to bring you a + + Can't be evil + + approach to software services. - - Budgeting + + Learn more about + + Blockstack + + + + + Learn more about + + Can't be evil apps + - {/* --- Level 2 --- - - - - All your accounts + + {/* --- Level 3 --- */} + + + + Account consolidation - - - - - in one place + + All your accounts in one place + + + One of the major problems with understanding your financial picture + is that everything you own is spread across many accounts at many institutions. + Entaxy allows you to consolidate everthing in one place, all without giving away your data. - - - - {/* --- Level 3 --- - - - Your financial data - - - - - - - - owned by you - - - {/* --- Level 4 --- - - - Budget - - - - - in a way that works for you - - - - + + + - {/* --- Level 5 --- - - - Visualize your data - - - - - + + {/* --- Level 4 --- */} + + + + + + + Budgeting + + + Budget in a way that works for you + + + Easy to create budgets that works for you. Entaxy remembers your categorizations, + meaning less budgeting work the more you use the app. + + - - - and learn from it - + + {/* --- Level 5 --- */} + + + + Insights + + + Visualize your data and learn from it + + + Once you see how your money is flowing, from your pay cheque to your loans + and regular expenses, you will be able to quickly identify places where you + can save money. + + + + + - */} ) }