diff --git a/components/AlienHeader.tsx b/components/AlienHeader.tsx new file mode 100644 index 0000000..675442a --- /dev/null +++ b/components/AlienHeader.tsx @@ -0,0 +1,21 @@ +export default function AlienHeader() { + + return ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ) +} diff --git a/components/alien_styles.css b/components/alien_styles.css new file mode 100644 index 0000000..44fe026 --- /dev/null +++ b/components/alien_styles.css @@ -0,0 +1,251 @@ +.ufo { + font-size: 5rem; + width: 100%; + height: 100%; + cursor: pointer; +} + +.monster { + font-size: 0.7em; + width: 1em; + height: 1.3em; + border-radius: 0.5em 0.5em 0em 0em / 0.6em 0.6em 0em 0em; + box-sizing: content-box; + border: 0.07em solid transparent; + position: relative; + user-select: none; + cursor: grab; +} + +.monster.small { + font-size: 4rem; +} + +.body { + width: 100%; + height: 100%; + background-color: currentColor; + border-radius: inherit; + position: relative; + transform-origin: bottom center; + animation: bouncebody alternate infinite 400ms 40ms ease-in-out; +} + +.eyes, +.eye-lid { + text-align: center; + display: flex; + font-size: 0.65em; + width: 1em; + height: 1em; + position: absolute; + left: 0.05em; + top: 0.3em; + animation: turn infinite 10s ease-in-out; +} + + +.eye { + position: relative; + display: inline-block; + border-radius: 50%; + width: 75%; + height: 75%; + background-color: black; + border-radius: 50%; +} + +.eye-lid { + background-color: white; + border-radius: 0.5em 0.5em 0.5em 0.5em / 0.6em 0.6em 0.4em 0.4em; + box-shadow: 0.03em 0.14em rgba(0, 0, 0, 0.1); + animation: blink forwards turn infinite 10s ease-in-out; +} + +.eye:after { + /*white shadow*/ + --pupil-size: 0.2em; + position: absolute; + top: 0.05em; + left: 0.3em; + width: var(--pupil-size); + height: var(--pupil-size); + background: white; + border-radius: 50%; + content: " "; +} + +.mouth { + font-size: 0.2em; + width: 1em; + height: 0.3em; + background: black; + border-radius: 1.5em 1.5em 0.5em 0.5em; + position: absolute; + bottom: 0.8em; + left: 50%; + transform: translateX(-50%); +} + +.mouth::before { + width: 50%; + height: 30%; + display: block; + content: ' '; + background-color: #ff8800; + border-radius: 50% / 100% 100% 50% 50%; + position: absolute; + top: 50%; + left: 50%; + transform: translateY(-10%) translateX(-50%); +} + +.vampi-mouth { + position: absolute; + background: black; + overflow: hidden; + font-size: 0.3em; + width: 1em; + height: 0.7em; + left: 50%; + bottom: 0.3em; + transform: translateX(-50%); + border-radius: 0.7em 0.7em 1.2em 1.2em; +} + +.vampi-mouth::before { + content: ''; + display: block; + background: #ff8800; + width: 100%; + height: 0.2em; + position: absolute; + bottom: 0; + border-radius: 50% 50% 0 0; +} + +.vampi-tooth::before, +.vampi-tooth::after, +.vampi-tooth { + --teeth-size: 0.25em; + display: block; + width: 0; + height: 0; + font-size: inherit; + border-left: calc(var(--teeth-size) / 2) solid transparent; + border-right: calc(var(--teeth-size) / 2) solid transparent; + border-top: var(--teeth-size) solid #fff; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); +} + +.vampi-tooth:before { + content: ''; + transform: translateX(-150%) translateY(-100%); +} + +.vampi-tooth:after { + content: ''; + transform: translateX(50%) translateY(-100%); +} + +.ear { + position: absolute; + top: -1.2em; + transform-origin: bottom center; + font-size: 0.3em; + width: .8em; + height: 1.5em; + left: 18%; + transform: rotate(-10deg); + animation: antena_e 5s infinite; +} + +.ear+.ear { + left: auto; + right: 18%; + transform: rotate(10deg); + animation: antena_d 5s infinite; +} + +.ear:before { + content: ''; + display: block; + width: .8em; + height: .8em; + position: absolute; + z-index: 2; + left: 0; + border-radius: 50%; + background: currentColor; + box-shadow: inset -.1em -.08em rgba(0, 0, 0, .1); +} + +.ear:after { + content: ''; + display: block; + width: 0.3em; + height: 100%; + position: absolute; + top: .2em; + left: .3em; + background: currentColor; +} + + +@keyframes turn { + + 0% { + left: 0.05em; + } + + 25% { + left: calc((.05em + .65em)/2); + } + + 50% { + left: .65em + } +} + +@keyframes blink { + + 0%, + 2%, + 60%, + 62%, + 100% { + transform: scaleX(1) scaleY(1); + } + + 1%, + 61% { + transform: scaleX(1.3) scaleY(0.1); + } +} + +@keyframes bounce { + to { + transform: translateY(4%); + } +} + +@keyframes bouncebody { + to { + transform: scaleX(1.03) scaleY(0.97); + } +} + +@keyframes antena_d { + 50% { + transform: rotate(20deg); + } +} + +@keyframes antena_e { + 50% { + transform: rotate(-20deg); + } +} diff --git a/pages/_app.tsx b/pages/_app.tsx index c467b83..701854e 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,5 +1,6 @@ import '../styles/global.css' import '../styles/prism.css' +import '../components/alien_styles.css' import type { AppProps } from 'next/app' import type { HomeProps } from './notes' import React from 'react' diff --git a/pages/index.tsx b/pages/index.tsx index 33ed4a6..f38b6ec 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -5,6 +5,7 @@ import { UsefulLinksList } from '../components/UsefulLinks/index' import { SocialLinksList } from '../components/SocialLinks/SocialLinks' import type { GetStaticProps } from 'next' import Image from 'next/image' +import AlienHeader from 'components/AlienHeader' interface LandingProps { jobs: JobsType[] @@ -25,8 +26,8 @@ export default function Landing({ jobs, skills, projects }: LandingProps): React
- + +

Triston Armstrong 🫰

@@ -141,7 +142,7 @@ export function getStaticProps(): ReturnType