mirror of
https://github.com/morten-olsen/morten-olsen.github.io.git
synced 2026-02-08 01:46:28 +01:00
298 lines
9.3 KiB
TypeScript
298 lines
9.3 KiB
TypeScript
import styled, { createGlobalStyle } from 'styled-components';
|
|
import { ArticleGrid } from '@/components/article/grid';
|
|
import { Jumbo } from '@/typography';
|
|
import { useMemo } from 'react';
|
|
import { Sheet } from '../../components/sheet';
|
|
import { ThemeProvider, createTheme } from '@/theme';
|
|
import chroma from 'chroma-js';
|
|
import { Helmet } from 'react-helmet-async';
|
|
import { Page } from 'types';
|
|
|
|
const GlobalStyle = createGlobalStyle`
|
|
* { box-sizing: border-box; }
|
|
body, html { height: 100%; margin: 0; }
|
|
body {
|
|
font-size: 17px;
|
|
background-color: ${({ theme }) => theme.colors.background};
|
|
color: ${({ theme }) => theme.colors.foreground};
|
|
}
|
|
/* latin-ext */
|
|
@font-face {
|
|
font-family: 'Archivo Black';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/archivoblack/v17/HTxqL289NzCGg4MzN6KJ7eW6CYKF_i7y.woff2) format('woff2');
|
|
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
|
}
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Archivo Black';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/archivoblack/v17/HTxqL289NzCGg4MzN6KJ7eW6CYyF_g.woff2) format('woff2');
|
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
}
|
|
/* cyrillic-ext */
|
|
@font-face {
|
|
font-family: 'Black Ops One';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/blackopsone/v20/qWcsB6-ypo7xBdr6Xshe96H3aDbbtwkh.woff2) format('woff2');
|
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
|
}
|
|
/* vietnamese */
|
|
@font-face {
|
|
font-family: 'Black Ops One';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/blackopsone/v20/qWcsB6-ypo7xBdr6Xshe96H3aDTbtwkh.woff2) format('woff2');
|
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
|
}
|
|
/* latin-ext */
|
|
@font-face {
|
|
font-family: 'Black Ops One';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/blackopsone/v20/qWcsB6-ypo7xBdr6Xshe96H3aDXbtwkh.woff2) format('woff2');
|
|
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
|
}
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Black Ops One';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/blackopsone/v20/qWcsB6-ypo7xBdr6Xshe96H3aDvbtw.woff2) format('woff2');
|
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
}
|
|
/* cyrillic-ext */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-cSZMZ-Y.woff2) format('woff2');
|
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
|
}
|
|
/* cyrillic */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-eCZMZ-Y.woff2) format('woff2');
|
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
|
}
|
|
/* vietnamese */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-cyZMZ-Y.woff2) format('woff2');
|
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
|
}
|
|
/* latin-ext */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-ciZMZ-Y.woff2) format('woff2');
|
|
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
|
}
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-fCZM.woff2) format('woff2');
|
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
}
|
|
/* cyrillic-ext */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52xwNZVcf6lvg.woff2) format('woff2');
|
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
|
}
|
|
/* cyrillic */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52xwNZXMf6lvg.woff2) format('woff2');
|
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
|
}
|
|
/* vietnamese */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52xwNZV8f6lvg.woff2) format('woff2');
|
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
|
}
|
|
/* latin-ext */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52xwNZVsf6lvg.woff2) format('woff2');
|
|
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
|
}
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Merriweather';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url(https://fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52xwNZWMf6.woff2) format('woff2');
|
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
}
|
|
|
|
`;
|
|
|
|
const Hero = styled.div`
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
`;
|
|
|
|
const Download = styled.a`
|
|
font-size: 30px;
|
|
line-height: 40px;
|
|
display: inline-block;
|
|
background: ${({ theme }) => theme.colors.foreground};
|
|
color: ${({ theme }) => theme.colors.primary};
|
|
padding: 0 15px;
|
|
text-transform: uppercase;
|
|
margin: 10px;
|
|
font-family: 'Black Ops One', sans-serif;
|
|
@media only screen and (max-width: 700px) {
|
|
margin: 5px;
|
|
font-size: 3rem;
|
|
line-height: 3.1rem;
|
|
}
|
|
`;
|
|
|
|
const Title = styled(Jumbo)`
|
|
font-size: 60px;
|
|
line-height: 80px;
|
|
display: inline-block;
|
|
background: ${({ theme }) => theme.colors.primary};
|
|
color: ${({ theme }) => theme.colors.foreground};
|
|
padding: 0 15px;
|
|
text-transform: uppercase;
|
|
margin: 10px;
|
|
font-family: 'Black Ops One', sans-serif;
|
|
@media only screen and (max-width: 700px) {
|
|
margin: 5px;
|
|
font-size: 3rem;
|
|
line-height: 3.1rem;
|
|
}
|
|
`;
|
|
|
|
const Arrow = styled.div`
|
|
position: absolute;
|
|
bottom: 20px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
:after {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: ${({ theme }) => theme.colors.primary};
|
|
border-radius: 50%;
|
|
width: 80px;
|
|
height: 80px;
|
|
content: '↓';
|
|
font-size: 50px;
|
|
@media only screen and (max-width: 700px) {
|
|
width: 40px;
|
|
height: 40px;
|
|
}
|
|
}
|
|
`;
|
|
|
|
const ImageBg = styled.picture`
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
bottom: 0;
|
|
right: 0;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
object-position: center;
|
|
z-index: -1;
|
|
opacity: 0.5;
|
|
img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
object-position: center;
|
|
}
|
|
`;
|
|
|
|
const FrontPage: Page<'frontpage'> = ({ articles, profile }) => {
|
|
const theme = useMemo(
|
|
() =>
|
|
createTheme({
|
|
baseColor: chroma.random().brighten(1).hex(),
|
|
}),
|
|
[],
|
|
);
|
|
|
|
return (
|
|
<ThemeProvider theme={theme}>
|
|
<Helmet>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
<title>Morten Olsen</title>
|
|
</Helmet>
|
|
<GlobalStyle />
|
|
<Sheet color="#c85279">
|
|
<ImageBg>
|
|
<img src={profile.imageUrl} loading="lazy" />
|
|
</ImageBg>
|
|
<Arrow />
|
|
<Hero>
|
|
{"Hi, I'm Morten".split(' ').map((char, index) => (
|
|
<Title key={index}>{char}</Title>
|
|
))}
|
|
</Hero>
|
|
<Hero>
|
|
{'And I make software'.split(' ').map((char, index) => (
|
|
<Title key={index}>{char}</Title>
|
|
))}
|
|
</Hero>
|
|
<Hero>
|
|
<Download href="/resume.pdf" download>
|
|
Download resumé
|
|
</Download>
|
|
</Hero>
|
|
</Sheet>
|
|
<Sheet color="#ef23e2">
|
|
<Hero>
|
|
{'Table of Content'.split(' ').map((char, index) => (
|
|
<Title key={index}>{char}</Title>
|
|
))}
|
|
</Hero>
|
|
<ArticleGrid articles={articles} />
|
|
</Sheet>
|
|
</ThemeProvider>
|
|
);
|
|
};
|
|
|
|
export default FrontPage;
|