Explore Design changes

This commit is contained in:
Kevin Kandlbinder 2020-12-26 20:41:53 +01:00
parent 85d749d33d
commit df08385cc5
22 changed files with 146 additions and 53 deletions

View file

@ -0,0 +1,12 @@
{
"urlname": "foobar",
"lang": "ignoreme",
"name": "foobar",
"shortDescription": "foobar",
"links": {
"website": "https://foo.bar",
"github": "https://foo.bar"
},
"image": "../images/test.jpg",
"featured": 0
}

View file

@ -6,5 +6,6 @@
"links": { "links": {
"website": "https://schuelerzeitung-elsensee.de" "website": "https://schuelerzeitung-elsensee.de"
}, },
"image": "../images/ELSE.png" "image": "../images/ELSE.png",
"featured": 2
} }

View file

@ -6,5 +6,6 @@
"links": { "links": {
"website": "https://schuelerzeitung-elsensee.de" "website": "https://schuelerzeitung-elsensee.de"
}, },
"image": "../images/ELSE.png" "image": "../images/ELSE.png",
"featured": 2
} }

View file

@ -8,5 +8,6 @@
"website": "https://kevink.dev", "website": "https://kevink.dev",
"github": "https://github.com/Unkn0wnCat/KevinK.dev.js" "github": "https://github.com/Unkn0wnCat/KevinK.dev.js"
}, },
"image": "../images/KevinK.dev.png" "image": "../images/KevinK.dev.png",
"featured": 0
} }

View file

@ -8,5 +8,6 @@
"website": "https://kevink.dev", "website": "https://kevink.dev",
"github": "https://github.com/Unkn0wnCat/KevinK.dev.js" "github": "https://github.com/Unkn0wnCat/KevinK.dev.js"
}, },
"image": "../images/KevinK.dev.png" "image": "../images/KevinK.dev.png",
"featured": 0
} }

View file

@ -7,5 +7,6 @@
"links": { "links": {
"website": "https://kreig.de" "website": "https://kreig.de"
}, },
"image": "../images/KREIG.de.jpg" "image": "../images/KREIG.de.jpg",
"featured": 1
} }

View file

@ -7,5 +7,6 @@
"links": { "links": {
"website": "https://kreig.de" "website": "https://kreig.de"
}, },
"image": "../images/KREIG.de.jpg" "image": "../images/KREIG.de.jpg",
"featured": 1
} }

View file

@ -25,7 +25,7 @@ exports.createPages = async ({ actions, graphql, reporter }) => {
result.data.allProjectsJson.nodes.forEach((node) => { result.data.allProjectsJson.nodes.forEach((node) => {
console.log("Creating Page: ", `/${node.lang}/projects/${node.urlname}`); console.log("Creating Page: ", `/${node.lang}/projects/${node.urlname}`);
createPage({ if(node.lang !== "ignoreme") createPage({
path: `/${node.lang}/projects/${node.urlname}`, path: `/${node.lang}/projects/${node.urlname}`,
component: projectTemplate, component: projectTemplate,
context: { context: {

View file

@ -29,5 +29,7 @@
"donateThanksText": "Ich finde es schön, dass du meine Arbeit schön findest und das zeigst! Sende mir gerne eine E-Mail an <1>{{contactEmail}}</1> wenn du mit mir über irgendwas reden möchtest!", "donateThanksText": "Ich finde es schön, dass du meine Arbeit schön findest und das zeigst! Sende mir gerne eine E-Mail an <1>{{contactEmail}}</1> wenn du mit mir über irgendwas reden möchtest!",
"donateThanks": "Danke für die Spende!", "donateThanks": "Danke für die Spende!",
"donateDescription": "Hey! Es sieht so aus als würdest du über eine Spende nachdenken. Das ist nett! Wenn du ein bestimmtes Projekt unterstützen willst, schreibe deine Wünsche gerne in den Spendenkommentar.", "donateDescription": "Hey! Es sieht so aus als würdest du über eine Spende nachdenken. Das ist nett! Wenn du ein bestimmtes Projekt unterstützen willst, schreibe deine Wünsche gerne in den Spendenkommentar.",
"donate": "Spenden" "donate": "Spenden",
"featuredProjects": "Vorgestellte Projekte",
"seeMore": "Mehr erkunden"
} }

View file

@ -29,5 +29,7 @@
"donate": "Donate", "donate": "Donate",
"donateDescription": "Hey! It looks like you're thinking about donating to me. That's nice of you! If you want your donation to go towards a specific project, feel free to write your wishes into the donation comment.", "donateDescription": "Hey! It looks like you're thinking about donating to me. That's nice of you! If you want your donation to go towards a specific project, feel free to write your wishes into the donation comment.",
"donateThanks": "Thanks for donating!", "donateThanks": "Thanks for donating!",
"donateThanksText": "I really appreciate you appreciating my work and showing it! Feel free to mail me at <1>{{contactEmail}}</1> if you have anything you want to talk about!" "donateThanksText": "I really appreciate you appreciating my work and showing it! Feel free to mail me at <1>{{contactEmail}}</1> if you have anything you want to talk about!",
"featuredProjects": "Featured Projects",
"seeMore": "See more"
} }

View file

@ -8,8 +8,6 @@
} }
@mixin cardGeneric { @mixin cardGeneric {
max-width: 300px;
width: 100%;
border-radius: 5px; border-radius: 5px;
overflow: hidden; overflow: hidden;
box-shadow: -1px 11px 33px -10px rgba(127,127,127,0.3); box-shadow: -1px 11px 33px -10px rgba(127,127,127,0.3);
@ -21,7 +19,7 @@
&:hover, &:active, &:focus { &:hover, &:active, &:focus {
transform: scale(1.05); transform: scale(1.05);
box-shadow: -1px 11px 33px -10px rgba(127,127,127,0.4); box-shadow: -1px 11px 33px -10px rgba(127,127,127,0.2), -1px 11px 33px -10px rgba($accentColor, .75);
} }
} }
@ -32,6 +30,12 @@
background: $accentColor; background: $accentColor;
color: white; color: white;
text-decoration: none; text-decoration: none;
box-shadow: 0 0 33px -10px rgba($accentColor, .5);
transition: box-shadow .25s;
&:hover, &:active, &:hover {
box-shadow: 0 0 33px -10px rgba($accentColor, .9);
}
} }
@mixin button { @mixin button {
@ -40,7 +44,7 @@
} }
@mixin homeBanner { @mixin homeBanner {
background: #10141e; background: lighten($background, 1);
cursor: pointer; cursor: pointer;
display: block; display: block;
text-decoration: none; text-decoration: none;
@ -62,7 +66,7 @@
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
> i { > i, > i::before {
line-height: 50px !important; line-height: 50px !important;
} }
} }

View file

@ -1,6 +1,7 @@
$layoutWidth: 900px; $layoutWidth: 1200px;
$accentColor: #e5502b; $accentColor: #e5502b;
$background: #0d0d0d; $background: #070707;
$textColor: white; $textColor: white;
$layoutPadding: 20px;
$mainFont: 'Anonymous Pro', monospace; $mainFont: 'Anonymous Pro', monospace;

View file

@ -12,7 +12,7 @@ class Layout extends React.Component {
return ( return (
<> <>
<SEO description={this.props.description} lang={this.props.lang} meta={this.props.meta} title={this.props.title} /> <SEO description={this.props.description} lang={this.props.lang} meta={this.props.meta} title={this.props.title} />
<Navigation isHome={this.props.module == "home"} module={this.props.module} /> <Navigation isHome={this.props.transparentTopbar} module={this.props.module} />
<div id="content" role="main"> <div id="content" role="main">
{this.props.children} {this.props.children}
</div> </div>
@ -29,6 +29,7 @@ Layout.defaultProps = {
module: `none`, module: `none`,
meta: [], meta: [],
description: ``, description: ``,
transparentTopbar: false
} }
Layout.propTypes = { Layout.propTypes = {
@ -36,7 +37,8 @@ Layout.propTypes = {
lang: PropTypes.string, lang: PropTypes.string,
meta: PropTypes.arrayOf(PropTypes.object), meta: PropTypes.arrayOf(PropTypes.object),
title: PropTypes.string.isRequired, title: PropTypes.string.isRequired,
module: PropTypes.string.isRequired module: PropTypes.string.isRequired,
transparentTopbar: PropTypes.bool
} }
export default Layout; export default Layout;

View file

@ -20,7 +20,7 @@ body, html, #___gatsby, #gatsby-focus-wrapper {
} }
footer { footer {
background: #000710; background: darken($background, 1);
width: 100%; width: 100%;
color: white; color: white;
padding: 5px; padding: 5px;
@ -45,19 +45,28 @@ footer {
left: 0; left: 0;
display: flex; display: flex;
width: 100%; width: 100%;
background: #000710; background: rgba($background, .95);
backdrop-filter: blur(5px);
z-index: 999; z-index: 999;
transition: background .25s; transition: background .25s;
.topBarInner { .topBarInner {
display: flex; display: flex;
width: 90%; width: 100%;
max-width: 900px; max-width: $layoutWidth;
margin: auto; margin: auto;
> :first-child {
padding-left: $layoutPadding;
}
> :last-child {
padding-right: $layoutPadding;
}
a { a {
display: block; display: block;
padding: 10px 15px; padding: 10px $layoutPadding;
color: white; color: white;
/*text-decoration: underline dotted white;*/ /*text-decoration: underline dotted white;*/
text-decoration: none; text-decoration: none;
@ -76,6 +85,7 @@ footer {
.homeBar.homeBarTransparent { .homeBar.homeBarTransparent {
background: transparent; background: transparent;
backdrop-filter: blur(0);
} }
.flexSpacer { .flexSpacer {

View file

@ -8,6 +8,8 @@
@include cardGeneric; @include cardGeneric;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 300px;
flex-shrink: 0;
.friendImage { .friendImage {
width: 100%; width: 100%;

View file

@ -2,13 +2,14 @@ import * as React from "react"
import Layout from "../layouts/default" import Layout from "../layouts/default"
import styles from "./index.module.scss" import styles from "./index.module.scss"
import projectStyles from "./projects.module.scss"
import { Trans, Link } from "gatsby-plugin-react-i18next" import { Trans, Link } from "gatsby-plugin-react-i18next"
import {graphql} from "gatsby"; import {graphql} from "gatsby";
export const query = graphql` export const query = graphql`
query { query GetMetaAndProjects($language: String) {
site { site {
siteMetadata { siteMetadata {
contactEmail contactEmail
@ -18,6 +19,22 @@ export const query = graphql`
contactGitHub contactGitHub
} }
} }
allProjectsJson(filter: {lang: {eq: $language}, featured: {ne: null}}, sort: {fields: featured, order: ASC}) {
nodes {
lang
urlname
name
image {
childImageSharp {
resize(width: 400, quality: 90) {
src
}
}
}
shortDescription
featured
}
}
} }
`; `;
@ -26,7 +43,7 @@ class IndexPage extends React.Component {
let meta = this.props.data.site.siteMetadata; let meta = this.props.data.site.siteMetadata;
return ( return (
<Layout title="Kevin Kandlbinder" module="home"> <Layout title="Kevin Kandlbinder" module="home" transparentTopbar={true}>
<section className={styles.heroSection}> <section className={styles.heroSection}>
<div className={styles.profile + " profile"}> <div className={styles.profile + " profile"}>
<div data-bg="url(https://cdn.kevink.dev/images/kevin/kevin-kandlbinder-03.jpg)" style={{backgroundImage: "url(https://cdn.kevink.dev/images/kevin/kevin-kandlbinder-03.jpg)"}} className={styles.profileImage + " lazy"}></div> <div data-bg="url(https://cdn.kevink.dev/images/kevin/kevin-kandlbinder-03.jpg)" style={{backgroundImage: "url(https://cdn.kevink.dev/images/kevin/kevin-kandlbinder-03.jpg)"}} className={styles.profileImage + " lazy"}></div>
@ -58,6 +75,31 @@ class IndexPage extends React.Component {
<i className="fas fa-fw fa-chevron-right"></i> <i className="fas fa-fw fa-chevron-right"></i>
</div> </div>
</a> </a>
<section className="featuredSection">
<article>
<h1><Trans>featuredProjects</Trans></h1>
<div className={projectStyles.projectList}>
{this.props.data.allProjectsJson.nodes.map((project) => {
return (
<div className={projectStyles.projectCard}>
{/*<div className="projectCardActivityIndicator activityIndicatorBlue">Live</div>*/}
<div className={projectStyles.projectCardImage} style={{ backgroundImage: "url("+project.image.childImageSharp.resize.src+")" }}>
<div className={projectStyles.projectCardMeta}>
<span className={projectStyles.projectCardTitle}>{project.name}</span>
<span className={projectStyles.projectCardTeaser}>{project.shortDescription}</span>
</div>
</div>
<div className={projectStyles.projectCardCTAContainer}>
<div className={projectStyles.projectCardCTA}><Link to={"/projects/"+project.urlname}><Trans>projectView</Trans></Link></div>
</div>
</div>
);
})}
</div>
<Link to="/projects" className={styles.seeMoreButton}><Trans>seeMore</Trans> <i className="fas fa-fw fa-chevron-right"></i></Link>
</article>
</section>
<Link className={styles.section + " " + styles.donationSection} to="/donate"> <Link className={styles.section + " " + styles.donationSection} to="/donate">
<div> <div>
<span><Trans>donationCatchphrase</Trans></span> <span><Trans>donationCatchphrase</Trans></span>

View file

@ -4,10 +4,10 @@
.heroSection { .heroSection {
width: 100%; width: 100%;
background: #000710; background: #000710;
min-height: 500px; min-height: 600px;
padding-top: 100px; padding-top: 100px;
overflow: hidden; overflow: hidden;
background: radial-gradient(ellipse at top left, #1f0ba659, transparent), radial-gradient(ellipse at bottom right, #4a086829, transparent); background: linear-gradient(to bottom, transparent 80%, $background), radial-gradient(ellipse at top left, #1f0ba659, transparent), radial-gradient(ellipse at bottom right, #4a086829, transparent);
@media(pointer: coarse), (pointer: none) { @media(pointer: coarse), (pointer: none) {
min-height: 700px; min-height: 700px;
@ -136,7 +136,6 @@
.creditSection { .creditSection {
@include homeBanner; @include homeBanner;
background: #060606;
> div { > div {
padding: 15px !important; padding: 15px !important;
@ -149,3 +148,11 @@
} }
} }
} }
.seeMoreButton {
@include button;
width: fit-content;
margin: 0 auto;
margin-top: 40px;
padding: 10px 20px;
}

View file

@ -14,7 +14,7 @@ query GetProjects($language: String) {
name name
image { image {
childImageSharp { childImageSharp {
resize(width: 250) { resize(width: 400, quality: 90) {
src src
} }
} }
@ -41,11 +41,13 @@ export default function ProjectsPage({data}) {
return ( return (
<div className={styles.projectCard}> <div className={styles.projectCard}>
{/*<div className="projectCardActivityIndicator activityIndicatorBlue">Live</div>*/} {/*<div className="projectCardActivityIndicator activityIndicatorBlue">Live</div>*/}
<div className={styles.projectCardImage} style={{ backgroundImage: "url("+project.image.childImageSharp.resize.src+")" }}></div> <div className={styles.projectCardImage} style={{ backgroundImage: "url("+project.image.childImageSharp.resize.src+")" }}>
<div className={styles.projectCardMeta}> <div className={styles.projectCardMeta}>
<span className={styles.projectCardTitle}>{project.name}</span> <span className={styles.projectCardTitle}>{project.name}</span>
<span className={styles.projectCardTeaser}>{project.shortDescription}</span> <span className={styles.projectCardTeaser}>{project.shortDescription}</span>
</div> </div>
</div>
<div className={styles.projectCardCTAContainer}> <div className={styles.projectCardCTAContainer}>
<div className={styles.projectCardCTA}><Link to={"/projects/"+project.urlname}><Trans>projectView</Trans></Link></div> <div className={styles.projectCardCTA}><Link to={"/projects/"+project.urlname}><Trans>projectView</Trans></Link></div>
</div> </div>

View file

@ -11,15 +11,8 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-grow: 1; flex-grow: 1;
width: calc(100% / 4); width: 250px;
flex-shrink: 0;
@media(max-width: 800px) {
width: calc((100% / 2) - 30px);
}
@media(max-width: 500px) {
width: 100%;
}
.projectCardActivityIndicator { .projectCardActivityIndicator {
position: absolute; position: absolute;
@ -45,20 +38,27 @@
} }
.projectCardImage { .projectCardImage {
display: block; width: 100%;
height: 150px; height: 250px;
background-position: center; background-position: center;
background-size: cover; background-size: cover;
text-shadow: 0 0 10px black, 0 0 10px black, 0 0 20px black;
} }
.projectCardMeta { .projectCardMeta {
padding: 10px; padding: 10px;
flex-grow: 1; flex-grow: 1;
display: flex;
flex-direction: column;
padding: 10px;
height: 100%;
background: linear-gradient(to bottom, transparent, black);
} }
.projectCardTitle { .projectCardTitle {
display: block; display: block;
font-size: 1.2em; font-size: 1.5em;
margin-top: auto;
} }
.projectCardCTA { .projectCardCTA {

View file

@ -10,7 +10,7 @@
flex-direction: column; flex-direction: column;
.socialImage { .socialImage {
width: 100%; width: 300px;
height: 300px; height: 300px;
background-position: center; background-position: center;
background-size: cover; background-size: cover;

View file

@ -32,9 +32,9 @@ export default function ProjectTemplate({data}) {
let projectName = project.name; let projectName = project.name;
return ( return (
<Layout description={project.shortDescription} title={t("project")+": "+projectName}> <Layout description={project.shortDescription} title={t("project")+": "+projectName} transparentTopbar={true}>
<section className={styles.projectHeader}> <section className={styles.projectHeader}>
<div> <div style={{paddingTop: 0}}>
<div className={styles.headerBackground} style={{backgroundImage: "url("+project.image.publicURL+")"}}></div> <div className={styles.headerBackground} style={{backgroundImage: "url("+project.image.publicURL+")"}}></div>
<header> <header>
<div className={styles.headerInner}> <div className={styles.headerInner}>

View file

@ -9,7 +9,7 @@
position: absolute; position: absolute;
left: 0; left: 0;
width: 100%; width: 100%;
height: 200px; height: 300px;
background-position: center; background-position: center;
background-size: cover; background-size: cover;
} }
@ -18,14 +18,15 @@
position: absolute; position: absolute;
left: 0; left: 0;
width: 100%; width: 100%;
height: 200px; height: 300px;
background: rgba(0, 0, 0, .5); background:linear-gradient(to bottom, rgba($background, .95), rgba($background, .5) 20%);
.headerInner { .headerInner {
max-width: $layoutWidth; max-width: $layoutWidth;
width: 100%; width: 100%;
margin: 0 auto; margin: 0 auto;
padding: 65px 20px 0; padding: 225px 20px 0;
text-shadow: 0 0 20px black, 0 0 20px black;
* { * {
margin: 0; margin: 0;
@ -41,7 +42,7 @@
.headerPlaceholder { .headerPlaceholder {
width: 100%; width: 100%;
height: 200px; height: 270px;
} }
} }