Skip to content
Snippets Groups Projects
Commit 535ec942 authored by Planoetscher Daniel (Student Com20)'s avatar Planoetscher Daniel (Student Com20)
Browse files

Merge branch 'landing-page' into frontend-devel

parents 4cb5930a fb499e9a
No related branches found
No related tags found
No related merge requests found
Showing
with 263 additions and 87 deletions
...@@ -6,7 +6,7 @@ import AppWrapper from 'pages/AppWrapper'; ...@@ -6,7 +6,7 @@ import AppWrapper from 'pages/AppWrapper';
import LoginRoute from 'components/helpers/LoginRoute'; import LoginRoute from 'components/helpers/LoginRoute';
import ProtectedRoute from 'components/helpers/ProtectedRoute'; import ProtectedRoute from 'components/helpers/ProtectedRoute';
const Home = lazy(() => import('pages/Home')); const Landing = lazy(() => import('pages/Landing'));
const Login = lazy(() => import('pages/Login')); const Login = lazy(() => import('pages/Login'));
const Register = lazy(() => import('pages/Register')); const Register = lazy(() => import('pages/Register'));
const Introduction = lazy(() => import('pages/Introduction')); const Introduction = lazy(() => import('pages/Introduction'));
...@@ -20,7 +20,7 @@ export default function App() { ...@@ -20,7 +20,7 @@ export default function App() {
<LoginRoute path="/register" component={Register} /> <LoginRoute path="/register" component={Register} />
<Route path="/introduction" component={Introduction} /> <Route path="/introduction" component={Introduction} />
<ProtectedRoute path={['/tasks', '/projects', '/stats', '/teams', '/settings']} component={AppWrapper} /> <ProtectedRoute path={['/tasks', '/projects', '/stats', '/teams', '/settings']} component={AppWrapper} />
<Route path="/" component={Home} /> <Route path="/" component={Landing} />
</Switch> </Switch>
</Suspense> </Suspense>
</Router> </Router>
......
@use 'styles/settings'as s;
@use 'styles/settings' as s; @use 'styles/mixins'as mx;
@use 'styles/mixins' as mx;
.contact-form { .contact-form {
.fields { .fields {
...@@ -11,19 +10,12 @@ ...@@ -11,19 +10,12 @@
&.textarea { &.textarea {
width: 100%; width: 100%;
} }
.input-field {
input, textarea {
background-color: #ffffff20;
color: white;
}
}
} }
.submit-button { .submit-button {
appearance: none; appearance: none;
border: none; border: none;
margin: 0.5rem; margin: 0;
} }
.button-container { .button-container {
...@@ -31,5 +23,4 @@ ...@@ -31,5 +23,4 @@
width: 100%; width: 100%;
justify-content: flex-end; justify-content: flex-end;
} }
} }
\ No newline at end of file
...@@ -2,13 +2,16 @@ ...@@ -2,13 +2,16 @@
import './linear-progress.scss'; import './linear-progress.scss';
interface Props { interface Props {
percent: number percent: number;
color: string;
} }
export default function LinearProgress({ percent }: Props) { export default function LinearProgress({ percent, color }: Props) {
return ( return (
<div className="linear-progress"> <div className="linear-progress">
<div className="progress" style={{width: percent + '%'}}></div> <div
className={'progress' + (color ? 'bg-gradient-horizontal-' + color : '')}
style={{ width: percent + '%' }}></div>
</div> </div>
); );
} }
......
@use 'styles/settings.scss' as s;
@use 'styles/mixins.scss' as mx;
.background-container {
position: absolute;
height: 100%;
width: 100%;
left: 0;
top: 0;
z-index: -1;
overflow: hidden;
.bubble {
width: 400px;
height: 400px;
position: absolute;
filter: blur(200px);
opacity: 0.5;
border-radius: 50%;
z-index: -1;
@include mx.breakpoint(medium) {
width: 500px;
height: 500px;
filter: blur(500px);
}
@include mx.breakpoint(large) {
width: 600px;
height: 600px;
}
&.secondary {
background: s.$secondary;
}
&.primary {
background: s.$primary;
}
}
}
import './background.scss';
export default function DynamicBackground() {
return (
<div />
)
}
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import DynamicBackground from 'components/layout/DynamicBackground';
import './page.scss'; import './page.scss';
interface Props { interface Props {
...@@ -15,7 +13,6 @@ export default function Page({ children, className }: Props) { ...@@ -15,7 +13,6 @@ export default function Page({ children, className }: Props) {
<main className={'page-container ' + (className ?? '')}> <main className={'page-container ' + (className ?? '')}>
{children} {children}
</main> </main>
<DynamicBackground />
</>); </>);
} }
...@@ -13,7 +13,7 @@ body { ...@@ -13,7 +13,7 @@ body {
max-width: 1540px; max-width: 1540px;
min-height: 100vh; min-height: 100vh;
margin: 0 auto; margin: 0 auto;
background: rgba(s.$background-white-rgb, 0.5); background: rgba(s.$background-white-rgb, 0.25);
padding-bottom: 80px; padding-bottom: 80px;
@include mx.breakpoint(xlarge) { @include mx.breakpoint(xlarge) {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
padding: 30px 30px; padding: 30px 30px;
margin: -30px -30px; margin: -30px -42px;
position: relative; position: relative;
.prev-button, .next-button { .prev-button, .next-button {
...@@ -51,14 +51,14 @@ ...@@ -51,14 +51,14 @@
width: calc(50% - 24px); width: calc(50% - 24px);
} }
@include mx.breakpoint(xlarge) { @include mx.breakpoint(large) {
width: calc(33.3% - 24px); width: calc(33.3% - 24px);
} }
} }
@include mx.breakpoint(large) { @include mx.breakpoint(large) {
padding: 30px 90px; padding: 30px 90px;
margin: -30px -90px; margin: -30px -102px;
.prev-button { .prev-button {
left: 70px; left: 70px;
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
svg { svg {
height: auto; height: auto;
width: 50%; width: 60%;
} }
} }
...@@ -37,18 +37,16 @@ ...@@ -37,18 +37,16 @@
height: 100%; height: 100%;
position: absolute; position: absolute;
top: 0; top: 0;
margin-top: 5px;
left: 0; left: 0;
} }
.title { .title {
margin-top: 15px; margin-top: 10px;
line-height: 1.4; line-height: 1.4;
font-size: 16px; font-size: 16px;
text-align: center;
font-weight: s.$weight-bold; font-weight: s.$weight-bold;
@include mx.breakpoint(large) {
font-size: 20px;
}
} }
.info { .info {
......
...@@ -45,14 +45,17 @@ export default function ProjectSlide({ project }: ProjectSlideProps) { ...@@ -45,14 +45,17 @@ export default function ProjectSlide({ project }: ProjectSlideProps) {
} }
</div> </div>
<div className="details"> <div className="details">
<AssigneeList assignees={assignees} max={3} /> {
assignees.length > 0 &&
<AssigneeList assignees={assignees} max={3} />
}
{ {
(time !== undefined && totalTime !== undefined) (time !== undefined && totalTime !== undefined)
? ( ? (
<div className="progress"> <div className="progress">
<LinearProgress percent={time / totalTime * 100} /> <LinearProgress percent={time / totalTime * 100} color={project.color} />
<div className="label">{(time / 60 / 60 / 1000).toFixed(2)}h / <div className="label">{(time / 60 / 60 / 1000).toFixed(2)}h /
<strong>{(totalTime / 60 / 60 / 1000).toFixed(2)}h</strong></div> <strong>{(totalTime / 60 / 60 / 1000).toFixed(2)}h</strong></div>
</div> </div>
) )
: <LoadingScreen /> : <LoadingScreen />
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
color: s.$text; color: s.$text;
font-weight: s.$weight-regular; font-weight: s.$weight-regular;
font-family: s.$body-font; font-family: s.$body-font;
background: s.$background-input; background: s.$background-white;
} }
} }
......
client/src/images/preview/projects.jpg

96.4 KiB

client/src/images/preview/tasks.jpg

97.3 KiB

client/src/images/preview/teams.jpg

67.9 KiB

...@@ -184,6 +184,10 @@ h4 { ...@@ -184,6 +184,10 @@ h4 {
} }
} }
.text-primary {
color: s.$primary;
}
@each $key, @each $key,
$color in s.$themeDarkMap { $color in s.$themeDarkMap {
.bg-dark-#{$key} { .bg-dark-#{$key} {
......
import './landing.scss';
import React from 'react';
import Page from 'components/layout/Page';
import Intro from './partials/Intro';
import Features from './partials/Features';
import AboutApp from './partials/AboutApp';
import Team from './partials/Team';
import Contact from './partials/Contact';
import Logo from 'images/logo.svg';
export default function LandingPage(): JSX.Element {
return (
<Page className="landing-page">
<Intro />
<Features />
<AboutApp />
<Team />
<Contact />
<footer>
<div className="content-container footer-container">
<div className="footer-copyright">
<img src={Logo} className="logo" alt="" width="70" height="24" />
<p>
&copy; <a href="index.html">ryoko</a>, 2021
</p>
<p>
All rights reserved.
</p>
</div>
</div>
</footer>
</Page>
)
}
@use 'styles/mixins.scss'as mx;
@use 'styles/settings.scss'as s;
.landing-page {
width: 100%;
overflow: hidden;
section:not(:first-child) {
margin: 80px auto;
@include mx.breakpoint(large) {
margin: 180px auto;
}
}
.heading-lead {
font-size: 20px;
font-weight: s.$weight-semi-bold;
}
footer {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
}
\ No newline at end of file
@use 'styles/mixins.scss'as mx;
@use 'styles/settings.scss'as s;
.landing-page {
.about-app-section {
@include mx.breakpoint(medium) {
display: flex;
align-items: center;
}
.text-container {
padding-right: 10%;
margin-bottom: 50px;
@include mx.breakpoint(medium) {
flex-grow: 1;
margin-bottom: 0;
}
.lead {
font-size: 18px;
font-weight: s.$weight-semi-bold;
margin-bottom: 5px;
}
}
.preview-container {
background: rgba(s.$background-white-rgb, 0.5);
border-radius: 25px;
padding: 40px;
display: flex;
justify-content: center;
align-items: center;
@include mx.breakpoint(large) {
padding: 60px;
}
}
.project-overview {
display: grid;
grid-gap: 35px;
grid-template-areas:
'small-1 large'
'small-2 large';
@include mx.breakpoint(medium) {
grid-gap: 50px;
}
.small-1 {
grid-area: small-1;
}
.small-2 {
grid-area: small-2;
.project {
animation-delay: 3s;
}
}
.large {
grid-area: large;
.project {
animation-delay: 6s;
height: 100%;
}
}
.project {
animation: move-up 9s ease-in infinite;
@keyframes move-up {
5%,
35% {
transform: translateY(0);
box-shadow: 0px 5px 25px rgba(s.$black, 0.05);
}
10%,
30% {
transform: translateY(-10px);
box-shadow: 0px 5px 30px rgba(s.$black, 0.15);
}
}
}
}
}
}
\ No newline at end of file
import React from 'react'
import './about-app.scss';
import Project from 'components/ui/Project';
import { Status } from 'adapters/common';
export default function AboutApp() {
return (
<section className="about-app-section content-container">
<div className="text-container">
<h2 className="left">Plan your projects like a journey!</h2>
<p className="lead">
Do you want to boost your productivity and agility of your
development?
</p>
<p>
With ryoko you are able to effectively plan your tasks
and manage your projects. It is build with developers in mind and
facilitates effective collaboration.
</p>
</div>
<div className="preview-container">
<div className="project-overview">
<div className="small-1">
<Project demo project={{
id: '55',
name: 'Travel app',
text: 'xxx',
color: 'red',
status: Status.OPEN,
deadline: new Date(),
teams: [],
}} />
</div>
<div className="small-2">
<Project demo project={{
id: '5',
name: 'Shopping List',
text: 'xxx',
color: 'orange',
status: Status.SUSPENDED,
deadline: new Date(),
teams: [],
}} />
</div>
<div className="large">
<Project demo large project={{
id: '93',
name: 'Redesign App',
text: 'xxx',
color: 'blue',
status: Status.CLOSED,
deadline: new Date(),
teams: [],
}} />
</div>
</div>
</div>
</section>
)
}
@use 'styles/mixins.scss'as mx;
@use 'styles/settings.scss'as s;
.landing-page {
.contact-section {
.heading-container {
margin-bottom: 40px;
text-align: center;
@include mx.breakpoint(medium) {
margin-bottom: 60px;
}
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment