1
0
mirror of https://github.com/kremalicious/portfolio.git synced 2024-12-22 09:13:19 +01:00

Make links an array

This commit is contained in:
Matthias Kretschmann 2018-04-20 22:56:18 +02:00
parent db26ecf237
commit a7744ef8d0
Signed by: m
GPG Key ID: 606EEEF3C479A91F
17 changed files with 184 additions and 124 deletions

View File

@ -7,9 +7,10 @@
"oceanprotocol01",
"oceanprotocol02"
],
"links": {
"Link": "https://oceanprotocol.com"
},
"links": [
{ "title": "Link", "url": "https://oceanprotocol.com" },
{ "title": "GitHub", "url": "https://github.com/oceanprotocol/art" }
],
"description": "Conceptualizing, executing and iterating on the creative and visual direction of the Ocean Protocol brand. Leading the UI design & development of all Ocean Protocol web properties. \n\nInitial website in collaboration with [Balance](https://balance.io/). Key visuals in collaboration with [Wojciech Hupert](https://twitter.com/wojciechhupert).",
"techstack": [
"Sketch",
@ -31,10 +32,16 @@
"ipdb01",
"ipdb02"
],
"links": {
"Link": "https://ipdb.io",
"GitHub": "https://github.com/ipdb/website"
},
"links": [
{
"title": "Link",
"url": "https://ipdb.io"
},
{
"title": "GitHub",
"url": "https://github.com/ipdb/website"
}
],
"description": "Laudem antiopam mea eu. Nam in accusam mediocritatem, eos ad paulo putent, pericula appellantur te ius. Magna debet id cum, probo eloquentiam sea ut. Cu eam graeco disputationi, graece theophrastus no his, duo errem expetendis te. Duo ea soleat ignota temporibus, in vim scaevola salutandi. Postea possit est at, ea vitae necessitatibus vix.\n\nKey visuals in collaboration with [Wojciech Hupert](https://twitter.com/wojciechhupert).",
"techstack": [
"Sketch",
@ -52,9 +59,12 @@
"title": "Berlin Innovation Ventures",
"slug": "biv",
"img": "biv",
"links": {
"Link": "http://berlininnovation.vc"
},
"links": [
{
"title": "Link",
"url": "http://berlininnovation.vc"
}
],
"description": "Laudem antiopam mea eu. Nam in accusam mediocritatem, eos ad paulo putent, pericula appellantur te ius. Magna debet id cum, probo eloquentiam sea ut. Cu eam graeco disputationi, graece theophrastus no his, duo errem expetendis te. Duo ea soleat ignota temporibus, in vim scaevola salutandi. Postea possit est at, ea vitae necessitatibus vix.",
"techstack": [
"Sketch",
@ -69,10 +79,16 @@
"title": "9984 >> Summit 2017",
"slug": "9984",
"img": "ninenineeightfour",
"links": {
"Link": "https://2017.9984.io",
"GitHub": "https://github.com/9984/2017.9984.io"
},
"links": [
{
"title": "Link",
"url": "https://2017.9984.io"
},
{
"title": "GitHub",
"url": "https://github.com/9984/2017.9984.io"
}
],
"description": "Laudem antiopam mea eu. Nam in accusam mediocritatem, eos ad paulo putent, pericula appellantur te ius. Magna debet id cum, probo eloquentiam sea ut. Cu eam graeco disputationi, graece theophrastus no his, duo errem expetendis te. Duo ea soleat ignota temporibus, in vim scaevola salutandi. Postea possit est at, ea vitae necessitatibus vix.",
"techstack": [
"Sketch",
@ -95,11 +111,20 @@
"bigchaindb02",
"bigchaindb03"
],
"links": {
"Link": "https://www.bigchaindb.com",
"GitHub": "https://github.com/bigchaindb/site",
"Dribbble": "https://dribbble.com/shots/2522184-BigchainDB-site"
},
"links": [
{
"title": "Link",
"url": "https://www.bigchaindb.com"
},
{
"title": "GitHub",
"url": "https://github.com/bigchaindb/site"
},
{
"title": "Dribbble",
"url": "https://dribbble.com/shots/2522184-BigchainDB-site"
}
],
"description": "Conceptualizing and executing the creative and visual direction of the BigchainDB brand. Leading the UI design & development of all BigchainDB web properties.\n\nKey visuals in collaboration with [Wojciech Hupert](https://twitter.com/wojciechhupert).",
"techstack": [
"Sketch",
@ -123,10 +148,16 @@
"chartmogul01",
"chartmogul02"
],
"links": {
"Link": "https://chartmogul.com/stripe/",
"Dribbble": "https://dribbble.com/kremalicious/projects/311439-ChartMogul"
},
"links": [
{
"title": "Link",
"url": "https://chartmogul.com/"
},
{
"title": "Dribbble",
"url": "https://dribbble.com/kremalicious/projects/311439-ChartMogul"
}
],
"description": "Co-designing and leading the front-end development of various ChartMogul web properties. Creating and implementing a UI design system into the ChartMogul application.",
"techstack": [
"Sketch",
@ -150,9 +181,12 @@
"title": "ShareTheMeal",
"slug": "sharethemeal",
"img": "sharethemeal",
"links": {
"Link": "https://sharethemeal.org/"
},
"links": [
{
"title": "Link",
"url": "https://sharethemeal.org/"
}
],
"description": "Co-designing and leading the front-end development of the ShareTheMeal website.",
"techstack": [
"Sketch",
@ -180,10 +214,16 @@
"ezeep04",
"ezeep05"
],
"links": {
"Info": "https://kremalicious.com/enterprise-software-sucks/",
"Dribbble": "https://dribbble.com/kremalicious/projects/84318-ezeep"
},
"links": [
{
"title": "Info",
"url": "https://kremalicious.com/enterprise-software-sucks/"
},
{
"title": "Dribbble",
"url": "https://dribbble.com/kremalicious/projects/84318-ezeep"
}
],
"techstack": [
"Photoshop",
"Illustrator",
@ -215,9 +255,12 @@
"title": "iPixelPad",
"slug": "ipixelpad",
"img": "ipixelpad",
"links": {
"Download": "https://kremalicious.com/ipixelpad/"
},
"links": [
{
"title": "Download",
"url": "https://kremalicious.com/ipixelpad/"
}
],
"description": "So, what to do when everyone seem to release iPad icons but fail to include some crisp small size icons? Pushing the pixels for yourself of course. So heres my take on the smaller sizes of an Apple iPad icon, called iPixelPad in the sizes 48px, 32px and 16px.",
"techstack": [
"Photoshop"
@ -232,9 +275,12 @@
"outofwhaleoil02"
],
"description": "Tribute wallpaper pack inspired by the Futurama movie _Into The Wild Green Yonder_.",
"links": {
"Download": "https://kremalicious.com/out-of-whale-oil/"
},
"links": [
{
"title": "Download",
"url": "https://kremalicious.com/out-of-whale-oil/"
}
],
"techstack": [
"Photoshop"
]
@ -247,9 +293,16 @@
"unihalle01",
"unihalle02"
],
"links": {
"Link": "http://blogs.urz-uni-halle.de"
},
"links": [
{
"title": "Link",
"url": "http://blogs.urz-uni-halle.de"
},
{
"title": "Dribbble",
"url": "https://dribbble.com/kremalicious/projects/690029-MLU"
}
],
"description": "I worked for over 3 years at the IT services department of [Martin-Luther-Universität Halle-Wittenberg](http://www.uni-halle.de) where I conceptualized & implemented numerous in-house and public facing interfaces for thousands of students and staff.\n\nAdditionally, I conceptualized, designed, created, and maintained the blog network & community for all students & staff.",
"techstack": [
"Photoshop",
@ -268,9 +321,12 @@
"title": "Coffee Cup",
"slug": "coffee-cup-icon",
"img": "coffeecup",
"links": {
"Download": "https://kremalicious.com/coffee-cup-icon/"
},
"links": [
{
"title": "Download",
"url": "https://kremalicious.com/coffee-cup-icon/"
}
],
"description": "Desktop icons showing the fuel of most designers. Released as a goodie on [kremalicious.com](https://kremalicious.com/coffee-cup-icon/).",
"techstack": [
"Photoshop"

View File

@ -17,22 +17,22 @@ module.exports = {
includePaths: [
`${__dirname}/node_modules`,
`${__dirname}/src/styles`
],
},
]
}
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'data',
path: `${__dirname}/data/`,
},
}
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'images',
path: `${__dirname}/src/images`,
},
}
},
{
resolve: 'gatsby-plugin-google-analytics',
@ -41,7 +41,7 @@ module.exports = {
head: false,
anonymize: true,
respectDNT: true,
},
},
],
}
}
]
}

View File

@ -13,17 +13,14 @@ exports.createPages = ({ boundActionCreators, graphql }) => {
node {
title
slug
description
img
img_more
links {
Link
GitHub
Info
Dribbble
Download
}
description
techstack
links {
title
url
}
}
previous {
title

View File

@ -3,12 +3,14 @@ import PropTypes from 'prop-types'
import Helmet from 'react-helmet'
const Head = ({ meta }) => {
const { title, tagline, description } = meta
return (
<Helmet
defaultTitle={`${meta.title.toLowerCase()} { ${meta.tagline.toLowerCase()} }`}
titleTemplate={`%s // ${meta.title.toLowerCase()} { ${meta.tagline.toLowerCase()} }`}
defaultTitle={`${title.toLowerCase()} { ${tagline.toLowerCase()} }`}
titleTemplate={`%s // ${title.toLowerCase()} { ${tagline.toLowerCase()} }`}
>
<meta name="description" content={meta.description} />
<meta name="description" content={description} />
<link rel="stylesheet" href="https://use.typekit.net/dtg3zui.css" />
</Helmet>
)

View File

@ -65,19 +65,25 @@ export const Email = props => (
</svg>
)
export const Index = props => <svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<rect width="9" height="5" />
<rect width="9" height="5" y="7" />
<rect width="9" height="5" y="14" />
<rect width="9" height="5" x="11" />
<rect width="9" height="5" x="11" y="7" />
<rect width="9" height="5" x="11" y="14" />
export const Index = props => (
<svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<rect width="9" height="5" />
<rect width="9" height="5" y="7" />
<rect width="9" height="5" y="14" />
<rect width="9" height="5" x="11" />
<rect width="9" height="5" x="11" y="7" />
<rect width="9" height="5" x="11" y="14" />
</svg>
)
export const Info = props => <svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<path d="M10,19 C5.02943725,19 1,14.9705627 1,10 C1,5.02943725 5.02943725,1 10,1 C14.9705627,1 19,5.02943725 19,10 C19,14.9705627 14.9705627,19 10,19 Z M11.2903086,6.10848407 C11.2903086,5.93461182 11.2559923,5.77218098 11.1873585,5.62118666 C11.1187247,5.47019234 11.0272144,5.33979011 10.9128247,5.22997606 C10.7984351,5.12016201 10.6611696,5.03322719 10.5010241,4.969169 C10.3408786,4.9051108 10.1738722,4.87308219 10,4.87308219 C9.81697658,4.87308219 9.64768246,4.90739856 9.49211256,4.97603234 C9.33654266,5.04466612 9.19927715,5.1338887 9.08031193,5.24370275 C8.96134671,5.3535168 8.86983638,5.48391903 8.80577818,5.63491335 C8.74171998,5.78590766 8.70969137,5.94376299 8.70969137,6.10848407 C8.70969137,6.44707739 8.83323032,6.7376227 9.08031193,6.98012873 C9.32739354,7.22263476 9.63395317,7.34388595 10,7.34388595 C10.1738722,7.34388595 10.3408786,7.31185733 10.5010241,7.24779914 C10.6611696,7.18374094 10.7984351,7.09680612 10.9128247,6.98699207 C11.0272144,6.87717802 11.1187247,6.7467758 11.1873585,6.59578148 C11.2559923,6.44478716 11.2903086,6.28235631 11.2903086,6.10848407 Z M8.87441162,15.1269178 L11.1255884,15.1269178 L11.1255884,8.2910274 L8.87441162,8.2910274 L8.87441162,15.1269178 Z" />
</svg>
export const Info = props => (
<svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<path d="M10,19 C5.02943725,19 1,14.9705627 1,10 C1,5.02943725 5.02943725,1 10,1 C14.9705627,1 19,5.02943725 19,10 C19,14.9705627 14.9705627,19 10,19 Z M11.2903086,6.10848407 C11.2903086,5.93461182 11.2559923,5.77218098 11.1873585,5.62118666 C11.1187247,5.47019234 11.0272144,5.33979011 10.9128247,5.22997606 C10.7984351,5.12016201 10.6611696,5.03322719 10.5010241,4.969169 C10.3408786,4.9051108 10.1738722,4.87308219 10,4.87308219 C9.81697658,4.87308219 9.64768246,4.90739856 9.49211256,4.97603234 C9.33654266,5.04466612 9.19927715,5.1338887 9.08031193,5.24370275 C8.96134671,5.3535168 8.86983638,5.48391903 8.80577818,5.63491335 C8.74171998,5.78590766 8.70969137,5.94376299 8.70969137,6.10848407 C8.70969137,6.44707739 8.83323032,6.7376227 9.08031193,6.98012873 C9.32739354,7.22263476 9.63395317,7.34388595 10,7.34388595 C10.1738722,7.34388595 10.3408786,7.31185733 10.5010241,7.24779914 C10.6611696,7.18374094 10.7984351,7.09680612 10.9128247,6.98699207 C11.0272144,6.87717802 11.1187247,6.7467758 11.1873585,6.59578148 C11.2559923,6.44478716 11.2903086,6.28235631 11.2903086,6.10848407 Z M8.87441162,15.1269178 L11.1255884,15.1269178 L11.1255884,8.2910274 L8.87441162,8.2910274 L8.87441162,15.1269178 Z" />
</svg>
)
export const Download = props => <svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<path d="M10,19 C14.9707692,19 19,14.9707692 19,10 C19,5.03061538 14.9707692,1 10,1 C5.02923077,1 1,5.03061538 1,10 C1,14.9707692 5.02923077,19 10,19 Z M6.53846154,10.6923077 C6.80846154,10.4223077 7.24738462,10.4223077 7.51738462,10.6923077 L9.30769231,12.4826154 L9.30769231,5.84615385 C9.30769231,5.464 9.61784615,5.15384615 10,5.15384615 C10.3821538,5.15384615 10.6923077,5.464 10.6923077,5.84615385 L10.6923077,12.4826154 L12.4826154,10.6923077 C12.7526154,10.4223077 13.1915385,10.4223077 13.4615385,10.6923077 C13.7315385,10.9623077 13.7315385,11.4012308 13.4615385,11.6712308 L10.4901538,14.644 C10.2201538,14.9126154 9.78123077,14.9126154 9.51123077,14.644 L6.53846154,11.6712308 C6.26846154,11.4012308 6.26846154,10.9623077 6.53846154,10.6923077 Z" />
</svg>
export const Download = props => (
<svg className="icon" viewBox="0 0 20 20" width="20" height="20" {...props}>
<path d="M10,19 C14.9707692,19 19,14.9707692 19,10 C19,5.03061538 14.9707692,1 10,1 C5.02923077,1 1,5.03061538 1,10 C1,14.9707692 5.02923077,19 10,19 Z M6.53846154,10.6923077 C6.80846154,10.4223077 7.24738462,10.4223077 7.51738462,10.6923077 L9.30769231,12.4826154 L9.30769231,5.84615385 C9.30769231,5.464 9.61784615,5.15384615 10,5.15384615 C10.3821538,5.15384615 10.6923077,5.464 10.6923077,5.84615385 L10.6923077,12.4826154 L12.4826154,10.6923077 C12.7526154,10.4223077 13.1915385,10.4223077 13.4615385,10.6923077 C13.7315385,10.9623077 13.7315385,11.4012308 13.4615385,11.6712308 L10.4901538,14.644 C10.2201538,14.9126154 9.78123077,14.9126154 9.51123077,14.644 L6.53846154,11.6712308 C6.26846154,11.4012308 6.26846154,10.9623077 6.53846154,10.6923077 Z" />
</svg>
)

View File

@ -1,11 +1,6 @@
import React from 'react'
import './ProjectImage.scss'
const ProjectImage = (props) => (
<img
className="project__image"
{...props}
/>
)
const ProjectImage = props => <img className="project__image" {...props} />
export default ProjectImage

View File

@ -16,7 +16,10 @@ const Header = ({ meta, isHomepage }) => {
<Link className="header__name" to={'/'}>
<Logo className="header__logo" />
<h1 className="header__title">{meta.title.toLowerCase()}</h1>
<p className="header__description"><span>{'{ '}</span> {meta.tagline.toLowerCase()} <span>{' }'}</span></p>
<p className="header__description">
<span>{'{ '}</span> {meta.tagline.toLowerCase()}{' '}
<span>{' }'}</span>
</p>
</Link>
<Social meta={meta} minimal={!isHomepage} hide={!isHomepage} />
</Fragment>

View File

@ -50,7 +50,7 @@
@media (min-width: 30rem) {
margin-top: $spacer / 2;
margin-bottom: $spacer * 2;
margin-bottom: $spacer;
}
.header__title,

View File

@ -24,28 +24,28 @@ const LinkIcon = ({ title }) => {
const ProjectLinks = ({ links }) => (
<div className="project__links">
<h3 className="project__meta__title">
Links <span>See the project live on the interwebz.</span>
Links <span>Learn more on the interwebz.</span>
</h3>
<ul>
{Object.keys(links).map(key => {
if (links[key]) {
return (
<li key={key}>
<OutboundLink href={links[key]}>
<LinkIcon title={key} />
{key}
</OutboundLink>
</li>
)
}
{links.map(link => {
const { title, url } = link
return (
<li key={title}>
<OutboundLink href={url}>
<LinkIcon title={title} />
{title}
</OutboundLink>
</li>
)
})}
</ul>
</div>
)
ProjectLinks.propTypes = {
links: PropTypes.object,
links: PropTypes.array,
}
export default ProjectLinks

View File

@ -4,10 +4,15 @@
ul {
padding: 0;
margin-left: -($spacer / 2);
display: flex;
flex-wrap: wrap;
}
li {
display: inline-block;
display: flex;
align-items: center;
justify-content: center;
flex: 0 0 calc(50% - #{$spacer / 2});
margin-left: $spacer / 2;
margin-bottom: $spacer / 2;
}
@ -19,28 +24,30 @@
}
a {
display: inline-block;
display: block;
width: 100%;
color: $brand-cyan;
text-align: center;
border-radius: .25rem;
padding: $spacer / 4 $spacer;
border-top-left-radius: .25rem;
border-top-right-radius: .25rem;
border-bottom: 1px solid $brand-cyan;
padding: $spacer / 4 $spacer / 2;
transition-property: all;
background: rgba(#fff, .15);
.icon {
fill: $brand-cyan;
opacity: .85;
fill: $brand-grey;
}
&:hover,
&:focus {
background: $brand-light;
transform: translate3d(0, -.2rem, 0);
transform: translate3d(0, -.1rem, 0);
box-shadow: 0 6px 10px rgba($brand-main, .1), 0 10px 25px rgba($brand-main, .1);
}
&:active {
transition: none;
background: darken($brand-cyan, 5%);
background: rgba(#fff, .15);
}
}
}

View File

@ -14,11 +14,11 @@
align-items: center;
justify-content: center;
padding: $spacer / 4;
flex: 1 1 calc((100% / 3) - #{$spacer});
margin-bottom: $spacer / 2;
font-size: $font-size-small;
text-align: center;
background: rgba(#fff, .15);
color: $brand-grey-light;
flex: 1 1 calc((100% / 3) - #{$spacer});
margin-left: $spacer / 2;
margin-bottom: $spacer / 2;
}
}

View File

@ -22,7 +22,7 @@ const SocialIcon = ({ title }) => {
}
const Social = ({ meta, minimal, hide }) => {
const social = meta.social
const { social } = meta
const classes = minimal ? 'social social--minimal' : 'social'
return (

View File

@ -35,26 +35,23 @@ const Project = ({ pathContext }) => {
<article className="project">
<Content>
<h1 className="project__title">{title}</h1>
<ReactMarkdown source={description} escapeHtml={false} className="project__description" />
<ReactMarkdown
source={description}
escapeHtml={false}
className="project__description"
/>
<FullWidth>
<ProjectImage
src={images[img]}
alt={title}
/>
<ProjectImage src={images[img]} alt={title} />
</FullWidth>
{!!img_more &&
{!!img_more && (
<FullWidth>
{img_more.map(key => (
<ProjectImage
key={key}
src={images[key]}
alt={title}
/>
<ProjectImage key={key} src={images[key]} alt={title} />
))}
</FullWidth>
}
)}
<footer className="project__meta">
{!!techstack && <ProjectTechstack techstack={techstack} />}

View File

@ -17,7 +17,7 @@
.project__description {
font-size: $font-size-large;
color: $brand-grey;
margin-bottom: $spacer * 4;
margin-bottom: $spacer * 3;
}
.project__meta {

View File

@ -17,10 +17,7 @@ const Projects = ({ data }) => {
className="projects__project"
>
<h1 className="projects__project__title">{node.title}</h1>
<ProjectImage
src={images[node.img]}
alt={node.title}
/>
<ProjectImage src={images[node.img]} alt={node.title} />
</Link>
))}
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB