verison 1.0

This commit is contained in:
liyunze 2023-10-06 22:36:43 +08:00
parent 804cbea614
commit f3071be9e5
14 changed files with 640 additions and 154 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 654 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

View file

@ -2,12 +2,13 @@
interface Props { interface Props {
primaryColor: string; primaryColor: string;
bgColor: string; bgColor: string;
scaleOnHover: boolean;
} }
const { primaryColor, bgColor = "#282828" } = Astro.props; const { primaryColor, bgColor = "#282828", scaleOnHover = false } = Astro.props;
--- ---
<div class="card"> <div class="card z-10" class:list={[{ scale: scaleOnHover }]}>
<slot /> <slot />
</div> </div>
@ -59,4 +60,12 @@ const { primaryColor, bgColor = "#282828" } = Astro.props;
top: 25%; top: 25%;
opacity: 1; opacity: 1;
} }
.card.scale {
transition: transform 0.5s ease;
}
.card.scale:hover {
transform: scale(1.05);
}
</style> </style>

View file

@ -0,0 +1,88 @@
<div
class="w-full h-fit pb-40 flex flex-col justify-center items-center relative
bg-[rgb(32,32,32)] bg-[linear-gradient(180deg,_rgba(32,32,32,1)_0%,_rgba(30,30,30,1)_10%)]"
>
<div class="flex flex-col justify-center items-center">
<div
id="title"
class="animate-gradient text-3xl text-center font-bold mb-3"
>
Get in Touch with me!
</div>
<div class="text-lg text-center mb-10 px-5">
I'm always open to new opportunities and collaborations!
</div>
<a
class="border-2 border-purple-500 text-purple-500 px-5 py-5 hover:bg-purple-500 hover:text-black transition-colors duration-500 ease-in-out rounded-xl"
href="mailto:ryanpython932@gmail.com">Send me an email!</a
>
</div>
<div
class="absolute bottom-10 left-1/2 -translate-x-1/2 text-white flex flex-row"
>
<a href="https://github.com/liyunze-coding" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-gray-200"
>
<img
src="/images/socials/github.svg"
alt="github"
class="aspect-square max-w-full"
width="20"
/>
</div>
</a>
<a href="https://codepen.io/liyunze-coding" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-gray-200 transition-colors duration-150"
>
<img
src="/images/socials/codepen.svg"
alt="codepen"
class="w-5 h-5 aspect-square"
/>
</div>
</a>
<a href="https://youtube.com/@RythonDev" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-red-400 transition-colors duration-150"
>
<img
src="/images/socials/youtube.svg"
alt="youtube"
class="w-5 h-5 aspect-square"
/>
</div>
</a>
<a href="https://twitch.tv/RythonDev" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-purple-400 transition-colors duration-150"
>
<img
src="/images/socials/twitch.svg"
alt="twitch"
class="w-4 h-4 aspect-square"
/>
</div>
</a>
</div>
</div>
<style>
#title {
background: linear-gradient(
90deg,
#03c988 0%,
#4ca1a3 55%,
#a149fa 100%
);
background-size: 300%;
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>

View file

@ -3,11 +3,11 @@ import Card from "./Card.astro";
import Line from "./NetworkLine.astro"; import Line from "./NetworkLine.astro";
--- ---
<div id="Experience" class="h-fit py-10"> <div id="Experience" class="h-fit py-20">
<h1 class="text-5xl text-center">Education</h1> <h1 class="text-5xl text-center">Education</h1>
<div class="flex flex-col items-center pt-10"> <div class="flex flex-col items-center pt-10">
<div class="w-[90%] md:w-[500px]"> <div class="w-[90%] md:w-[500px]">
<Card primaryColor="#fff"> <Card primaryColor="#FFF5E0" bgColor="#303030" scaleOnHover={false}>
<div class="card-content"> <div class="card-content">
<div class="flex flex-col justify-left w-full mb-3"> <div class="flex flex-col justify-left w-full mb-3">
<h2 class="font-bold text-xl"> <h2 class="font-bold text-xl">
@ -24,7 +24,7 @@ import Line from "./NetworkLine.astro";
</div> </div>
</Card> </Card>
<Line height="100px" /> <Line height="100px" />
<Card primaryColor="#fff"> <Card primaryColor="#FFF5E0" bgColor="#303030" scaleOnHover={false}>
<div class="card-content"> <div class="card-content">
<div class="flex flex-col justify-left w-full mb-3"> <div class="flex flex-col justify-left w-full mb-3">
<h2 class="font-bold text-xl">Cambridge IGCSE</h2><h3> <h2 class="font-bold text-xl">Cambridge IGCSE</h2><h3>

View file

@ -15,33 +15,12 @@
greeting = "evening"; greeting = "evening";
} }
// Intro
let intro1: string = "I like to make cool stuff";
let intro2: string = "as a ";
let introState1: string = "";
let introState2: string = "";
let lineOneFinished: boolean = false;
async function animateIntro(interval: number) {
for (let i = 0; i < intro1.length; i++) {
introState1 += intro1[i];
await sleep(interval);
}
lineOneFinished = true;
for (let j = 0; j < intro2.length; j++) {
introState2 += intro2[j];
await sleep(interval);
}
}
// Roles // Roles
let roles: string[] = [ let roles: string[] = [
"developer", "Developer",
"streamer", "Streamer",
"content creator", "Content creator",
"student", "Student",
]; ];
let roleState: string = ""; let roleState: string = "";
let role: string; let role: string;
@ -105,91 +84,104 @@
// after window finish loading, call animateRoles() // after window finish loading, call animateRoles()
onMount(async () => { onMount(async () => {
await sleep(800); await sleep(800);
await animateIntro(50);
animateRoles(); animateRoles();
}); });
</script> </script>
<div <div
id="intro" id="intro"
class="w-full h-[105vh] class="h-fit
text-white text-white
flex justify-center items-end" flex flex-col"
> >
<div <div class="px-10 pt-10 pb-2 card-content w-full">
id="intro-content" <div class="flex flex-row h-20">
class=" <div class="w-20 mr-1 flex justify-center items-center">
flex flex-row justify-between items-center <img
w-4/5 h-4/5 src="/images/pfp_transparent_square.png"
p-20 mt-24 alt="Ryan"
border-[#404040] border-2 border-solid width="100"
rounded-3xl" class="rounded-full max-w-full bg-[#404040]"
> />
<div class="w-1/2">
<h1 class="text-4xl mt-10">Good {greeting}, I'm</h1>
<h2
id="name"
class="animate-gradient text-5xl text-center py-2 font-bold w-fit"
>
RythonDev
</h2>
<p class="text-2xl mt-5 leading-7">
{introState1}<span
class:animate-pulse={!lineOneFinished}
class:opacity-0={lineOneFinished}>|</span
>
<br />{introState2}
{roleState}<span
class="opacity-0"
class:animate-pulse={lineOneFinished}
class:opacity-1={lineOneFinished}>|</span
>
</p>
<div class="mt-10">
<p class="text-lg leading-6">
A computer science undergraduate student, passionate in
frontend web development and content creation.
</p>
</div> </div>
<div class="mt-10"></div> <div class="flex flex-col justify-center items-start ml-2">
<div class="text-2xl font-bold">RythonDev</div>
<div class="text-xl w-full">
{roleState}<span class="animate-pulse">|</span>
</div>
</div>
</div>
<div class="text-2xl font-bold mt-10">
Good {greeting}, I'm Ryan!
</div>
<p class="mt-3">
I am an undergraduate student, passionate in frontend web
development. I built this website using Astro, Svelte, TailwindCSS
and Typescript!
</p>
<p class="mt-1">I hope you enjoy your stay here!</p>
<div class="flex flex-row justify-center items-center mt-10">
<a href="https://github.com/liyunze-coding" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-gray-200"
>
<img
src="/images/socials/github.svg"
alt="github"
class="aspect-square max-w-full"
width="20"
/>
</div>
</a>
<a href="https://codepen.io/liyunze-coding" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-gray-200 transition-colors duration-150"
>
<img
src="/images/socials/codepen.svg"
alt="codepen"
class="w-5 h-5 aspect-square"
/>
</div>
</a>
<a href="https://youtube.com/@RythonDev" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-red-400 transition-colors duration-150"
>
<img
src="/images/socials/youtube.svg"
alt="youtube"
class="w-5 h-5 aspect-square"
/>
</div>
</a>
<a href="https://twitch.tv/RythonDev" target="_blank">
<div
class="bg-gray-300 rounded-full w-7 h-7 flex justify-center items-center mr-3 hover:bg-purple-400 transition-colors duration-150"
>
<img
src="/images/socials/twitch.svg"
alt="twitch"
class="w-4 h-4 aspect-square"
/>
</div>
</a>
</div> </div>
</div> </div>
</div> </div>
<style> <style>
#intro { .card-content {
background: rgba(30, 32, 34, 1); display: flex;
background: linear-gradient( flex-direction: column;
180deg, gap: 1rem;
rgba(30, 32, 34, 1) 0%, background-image: radial-gradient(
rgba(30, 32, 34, 1) 95%, rgba(255, 255, 255, 0.1) 1px,
rgba(20, 22, 24, 0) 100% transparent 1px
); );
} background-position: 50% 50%;
background-size: 1.1rem 1.1rem;
#intro-content { border-radius: 1.25rem;
background: rgb(29, 32, 35); overflow: hidden;
background: linear-gradient(
90deg,
rgba(29, 32, 35, 1) 0%,
rgba(29, 32, 35, 1) 70%,
rgba(50, 53, 58, 1) 100%
);
}
#name {
background: linear-gradient(
90deg,
#ff7dac 0%,
#33d2ff 55%,
#9845e8 100%
);
background-size: 300%;
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
} }
</style> </style>

245
src/components/NavBar.astro Normal file
View file

@ -0,0 +1,245 @@
<div class="w-full">
<label
class="fixed flex hamburger-menu bg-primary border-2 border-solid border-gray-100 p-2 rounded-lg"
aria-label="Menu"
>
<span class="top-bun"></span>
<input type="checkbox" aria-label="Toggle menu" />
<span class="bottom-bun"></span>
</label>
<aside class="sidebar flex z-20 border-l border-white">
<nav class="flex flex-col capitalize" role="navigation">
<a
class="sidebar-url px-5 py-2 mt-10 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#home">Home</a
>
<a
class="sidebar-url px-5 py-2 mt-2 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#what-i-do">What I Do</a
>
<a
class="sidebar-url px-5 py-2 mt-2 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#projects">Projects</a
>
<a
class="sidebar-url px-5 py-2 mt-2 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#skills">Skills</a
>
<a
class="sidebar-url px-5 py-2 mt-2 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#education">Education</a
>
<a
class="sidebar-url px-5 py-2 mt-2 text-center rounded-md hover:text-gray-600 hover:bg-gray-100 transition-colors duration-500"
href="#contact">Contact</a
>
</nav>
</aside>
<div
id="navbar"
class="fixed z-50 top-0 w-full hidden md:flex justify-center bg-[#202020] border-b border-solid border-white"
>
<div
id="navbar-div"
class="py-4 uppercase w-full flex flex-row justify-center items-center"
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#home">home</a
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#what-i-do">What I Do</a
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#projects">projects</a
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#skills">skills</a
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#education">education</a
>
<a
class="px-3 mx-2 py-1 text-white hover:bg-gray-200 hover:text-black transition-colors duration-500 rounded-md"
href="#contact">contact</a
>
</div>
</div>
</div>
<style>
:root {
--bar-width: 30px;
--bar-height: 4px;
--hamburger-gap: 6px;
--foreground: #141414;
--background: white;
--hamburger-margin: 20px;
--animation-timing: 200ms ease-in-out;
--hamburger-height: calc(
var(--bar-height) * 3 + var(--hamburger-gap) * 2
);
}
.hamburger-menu {
--x-width: calc(var(--hamburger-height) * 1.41421356237);
translate: 0 -200px;
flex-direction: column;
gap: var(--hamburger-gap);
width: max-content;
top: var(--hamburger-margin);
right: var(--hamburger-margin);
z-index: 30;
cursor: pointer;
background: var(--foreground);
rotate: 180deg;
transition: translate var(--animation-timing);
}
.hamburger-menu input:focus-visible {
border: 1px solid var(--background);
box-shadow: 0 0 0 1px var(--foreground);
}
.hamburger-menu input,
.hamburger-menu span {
content: "";
width: var(--bar-width);
height: var(--bar-height);
background-color: white;
border-radius: 9999px;
transform-origin: left center;
transition:
opacity var(--animation-timing),
width var(--animation-timing),
rotate var(--animation-timing),
translate var(--animation-timing),
background-color var(--animation-timing);
}
.hamburger-menu input {
appearance: none;
padding: 0;
margin: 0;
outline: none;
pointer-events: none;
}
.hamburger-menu .top-bun.active {
rotate: 45deg;
width: var(--x-width);
translate: 0 calc(var(--bar-height) / -2);
}
.hamburger-menu .bottom-bun.active {
rotate: -45deg;
width: var(--x-width);
translate: 0 calc(var(--bar-height) / 2);
}
.hamburger-menu input:checked {
opacity: 0;
width: 0;
}
.sidebar {
position: fixed;
top: 0;
right: 0;
transition: translate var(--animation-timing);
translate: 100%;
padding: 0.5rem 1rem;
padding-top: calc(
var(--hamburger-height) + var(--hamburger-margin) + 1rem
);
background-color: var(--foreground);
color: var(--background);
max-width: 10rem;
min-height: 100vh;
}
</style>
<script defer is:inline>
const sidebar = document.querySelectorAll(".sidebar-url");
const hamburger = document.querySelector(".hamburger-menu");
const checkbox = document.querySelector("input");
const topBun = document.querySelector(".top-bun");
const bottomBun = document.querySelector(".bottom-bun");
const openSideBar = () => {
checkbox.checked = true;
document.querySelector(".sidebar").style.translate = "0";
topBun.classList.add("active");
bottomBun.classList.add("active");
};
const closeSideBar = () => {
checkbox.checked = false;
document.querySelector(".sidebar").style.translate = "100%";
topBun.classList.remove("active");
bottomBun.classList.remove("active");
};
// for each sidebar url, if clicked on, uncheck the checkbox
sidebar.forEach((url) => {
url.addEventListener("click", () => {
closeSideBar();
});
});
if (window.innerWidth < 768) {
hamburger.style.translate = "0 0";
}
// window.addEventListener("scroll", () => {
// if (window.scrollY > 50 || window.innerWidth < 768) {
// hamburger.style.translate = "0 0";
// } else {
// hamburger.style.translate = "0 -200px";
// closeSideBar();
// }
// });
// if clicked outside of the hamburger menu, close the sidebar
window.addEventListener("click", (e) => {
if (
e.target !== hamburger &&
e.target !== topBun &&
e.target !== bottomBun &&
e.target !== checkbox &&
e.target !== document.querySelector(".sidebar") &&
e.target !== document.querySelector(".sidebar nav")
) {
closeSideBar();
}
});
// if window is resized, check if it's less than 768px
window.addEventListener("resize", () => {
if (window.innerWidth < 768) {
hamburger.style.translate = "0 0";
} else {
hamburger.style.translate = "0 -200px";
closeSideBar();
}
});
// if checked, translate the sidebar
checkbox.addEventListener("change", () => {
if (checkbox.checked) {
openSideBar();
} else {
closeSideBar();
}
});
</script>

View file

@ -13,10 +13,10 @@ const { height } = Astro.props;
<style define:vars={{ height }}> <style define:vars={{ height }}>
@keyframes gradientAnimation { @keyframes gradientAnimation {
0% { 0% {
background-position: 0 -100%; background-position: 0 50%;
} }
100% { 100% {
background-position: 0 50%; background-position: 0 -100%;
} }
} }
#line-container { #line-container {

View file

@ -229,17 +229,17 @@
<div class="mt-10 w-full"> <div class="mt-10 w-full">
<div <div
class="flex flex-col md:flex-row justify-between h-fit w-full px-20" class="flex flex-col lg:flex-row justify-between h-fit w-full px-10 lg:px-20"
> >
<div <div
class="image-container w-full md:w-1/2 aspect-video [perspective:200px] relative md:ml-20" class="image-container w-full lg:w-1/2 mb-3 lg:mb-0 aspect-video [perspective:200px] relative lg:mr-5"
> >
<img <img
src="/images/projects/coworking-guide.webp" src="/images/projects/coworking-guide.webp"
alt="coworking guide" alt="coworking guide"
class="absolute max-w-full class="absolute max-w-full
top-1/2 left-1/2 top-1/2 left-1/2
[transform:rotateY(5deg)_rotateX(0deg)_translateZ(-50px)_translateX(-50%)_translateY(-50%)] opacity-40 [transform:rotateY(5deg)_rotateX(0deg)_translateZ(-50px)_translateX(-45%)_translateY(-50%)] opacity-40
border-2 border-solid border-white rounded-xl" border-2 border-solid border-white rounded-xl"
width="600" width="600"
/> />
@ -249,7 +249,7 @@
width="600" width="600"
class="absolute max-w-full class="absolute max-w-full
top-1/2 left-1/2 top-1/2 left-1/2
[transform:rotateY(5deg)_rotateX(0deg)_translateZ(-50px)_translateX(-48%)_translateY(-52%)] opacity-1 [transform:rotateY(5deg)_rotateX(0deg)_translateZ(-50px)_translateX(-43%)_translateY(-52%)] opacity-1
border-2 border-solid border-white rounded-xl" border-2 border-solid border-white rounded-xl"
/> />
<div <div
@ -270,7 +270,7 @@
</div> </div>
</div> </div>
<div <div
class="w-full md:w-1/2 h-[340px] flex flex-col justify-center md:pr-20" class="w-full h-fit lg:w-1/2 lg:h-[340px] flex flex-col justify-center lg:pr-20"
> >
<h2 class="text-3xl font-bold mb-5">Coworking Guide</h2> <h2 class="text-3xl font-bold mb-5">Coworking Guide</h2>
<p class="text-xl"> <p class="text-xl">
@ -281,25 +281,27 @@
</div> </div>
</div> </div>
<div <div
class="flex flex-col-reverse md:flex-row justify-between h-fit w-full px-16" class="flex flex-col-reverse lg:flex-row justify-center h-fit w-full px-10 lg:px-16 mt-10"
> >
<div <div
class="w-full md:w-1/2 h-[340px] flex flex-col justify-center md:pl-20" class="w-full h-fit lg:w-1/2 lg:h-[340px] flex flex-col justify-center lg:px-10"
> >
<h2 class="text-3xl font-bold mb-5">Chat-Task-Tic Widget</h2> <h2 class="text-3xl font-bold mb-5 lg:text-right">
<p class="text-xl"> Chat-Task-Tic Widget
</h2>
<p class="text-xl lg:text-right">
A widget for Coworking and Study Twitch streamers, allows A widget for Coworking and Study Twitch streamers, allows
the streamer and the chatters to add their tasks to the the streamer and the chatters to add their tasks to the
widget, to be displayed on stream! widget, to be displayed on stream!
</p> </p>
</div> </div>
<div <div
class="image-container w-full md:w-1/2 aspect-video [perspective:200px] relative md:ml-20" class="image-container w-full lg:w-1/2 aspect-video [perspective:200px] relative"
> >
<!-- task bot --> <!-- task bot -->
<div <div
class="task-widget absolute flex flex-col opacity-30 class="task-widget absolute flex flex-col opacity-30
w-full h-[99%] w-[90%] h-[99%]
top-1/2 left-1/2 [transform:translateX(-59%)_translateY(-49%)_translateZ(-50px)_rotateY(-3deg)]" top-1/2 left-1/2 [transform:translateX(-59%)_translateY(-49%)_translateZ(-50px)_rotateY(-3deg)]"
> >
<div <div
@ -344,7 +346,7 @@
</div> </div>
<div <div
class="task-widget absolute flex flex-col class="task-widget absolute flex flex-col
w-full h-[99%] w-[90%] h-[99%]
top-1/2 left-1/2 [transform:translateX(-60%)_translateY(-50%)_translateZ(-50px)_rotateY(-3deg)]" top-1/2 left-1/2 [transform:translateX(-60%)_translateY(-50%)_translateZ(-50px)_rotateY(-3deg)]"
> >
<div <div
@ -389,14 +391,14 @@
</div> </div>
<div <div
class="visit-div absolute w-full h-full bg-[rgba(0,0,0,0.5)] opacity-0 class="visit-div absolute w-[90%] h-full bg-[rgba(0,0,0,0.5)] opacity-0
rounded-md rounded-md
[transform:translateX(-50%)_translateY(-50%)] top-1/2 left-1/2 [transform:translateX(-50%)_translateY(-50%)] top-1/2 left-1/2
border-2 border-solid border-white border-2 border-solid border-white
overflow-hidden" overflow-hidden"
> >
<a <a
href="https://github.com/liyunze-coding/multi-task-widget-infinity" href="https://github.com/liyunze-coding/chat-task-tic-overlay-infinity"
target="_blank" target="_blank"
class="absolute [transform:translateX(-50%)_translateY(-50%)] top-1/2 left-1/2 class="absolute [transform:translateX(-50%)_translateY(-50%)] top-1/2 left-1/2
px-5 py-3 bg-blue-500 rounded-xl opacity-1 px-5 py-3 bg-blue-500 rounded-xl opacity-1

View file

@ -1,25 +1,144 @@
--- ---
import Card from "../components/Card.astro"; import Card from "../components/Card.astro";
import Line from "../components/NetworkLine.astro";
--- ---
<div class="w-full h-[200vh]"> <div class="w-full h-fit pt-20">
<h1 class="text-center text-5xl">Skills</h1> <h1 class="text-center text-5xl">Skills</h1>
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<div class="w-1/2 pt-10"> <div class="w-[90%] md:w-[600px] pt-10">
<Card primaryColor="#fff"> <Card primaryColor="#9EDDFF" bgColor="#282828" scaleOnHover={false}>
<div class="card-content"> <div class="card-content">
<div class="flex flex-col justify-left w-full mb-3"> <div class="flex flex-col justify-left w-full">
<h2 class="font-bold text-xl"> <h2 class="font-bold text-2xl">Web Development</h2>
Diploma in Computer Science </div>
</h2><h3>Jan 2022 - Present</h3> <hr class="w-full" />
<p class="text-left lg:text-justify">
I started my web development journey by building
websites and widgets using vanilla HTML, CSS, Javascript
and Express. As I learnt more about the fundamentals of
web development, I delved into frameworks such as
Svelte, React and Astro.
</p>
<div class="w-full flex flex-row flex-wrap justify-center">
<div
class="w-fit bg-orange-500 rounded-full px-3 py-1 mr-1 my-1"
>
HTML
</div>
<div
class="w-fit bg-blue-500 rounded-full px-3 py-1 mr-1 my-1"
>
CSS
</div>
<div
class="w-fit bg-yellow-400 text-black rounded-full px-3 py-1 mr-1 my-1"
>
Javascript
</div>
<div
class="w-fit bg-blue-500 rounded-full px-3 py-1 mr-1 my-1"
>
TypeScript
</div>
<div
class="w-fit bg-yellow-500 text-black rounded-full px-3 py-1 mr-1 my-1"
>
Express
</div>
<div
class="w-fit bg-orange-600 rounded-full px-3 py-1 mr-1 my-1"
>
Svelte
</div>
<div
class="w-fit bg-cyan-500 rounded-full px-3 py-1 mr-1 my-1"
>
React
</div>
<div
class="w-fit bg-white text-black rounded-full px-3 py-1 mr-1 my-1"
>
Astro
</div>
<div
class="w-fit bg-purple-400 text-black rounded-full px-3 py-1 mr-1 my-1"
>
Qwik
</div>
<div
class="w-fit bg-cyan-400 text-black rounded-full px-3 py-1 mr-1 my-1"
>
TailwindCSS
</div>
<div
class="w-fit bg-purple-400 rounded-full px-3 py-1 mr-1 my-1"
>
Vite
</div>
</div>
</div>
</Card>
<Line height="50px" />
<Card primaryColor="#B0D9B1" bgColor="#282828" scaleOnHover={false}>
<div class="card-content">
<div class="flex flex-col justify-left w-full">
<h2 class="font-bold text-2xl">Data Science</h2>
</div>
<hr class="w-full" />
<p class="text-left lg:text-justify">
My first exposure to data science was through learning
Computer Vision. I learn how to use OpenCV in Python to
open a webcam and detect faces. Later on, I took a
Diploma course that is focused in data science, where I
learnt how to do the fundamentals of data science such
as extracting, transforming and loading data, as well as
data visualisation.
</p>
<div class="w-full flex flex-row flex-wrap justify-center">
<div
class="w-fit bg-yellow-400 bg-[linear-gradient(_125deg,_#4b8bbe_0%,_#4b8bbe_50%,_#ffd43b_51%,_#f0c808_100%_)]
text-black rounded-full px-3 py-1 mr-1 my-1"
>
Python
</div>
<div
class="w-fit bg-cyan-400 rounded-full px-3 py-1 mr-1 my-1"
>
R
</div>
<div
class="w-fit bg-green-400 bg-[linear-gradient(_90deg,_#CC0000_0%,_#CC0000_32%,_#00BB00_33%,_#00BB00_65%,_#0000DD_66%,_#0000DD_100%_)]
text-white rounded-full px-3 py-1 mr-1 my-1"
>
OpenCV
</div>
<div
class="w-fit bg-blue-400 rounded-full px-3 py-1 mr-1 my-1"
>
SAS
</div>
<div
class="w-fit bg-purple-500 rounded-full px-3 py-1 mr-1 my-1"
>
Machine Learning
</div>
<div
class="w-fit bg-blue-500 rounded-full px-3 py-1 mr-1 my-1"
>
BeautifulSoup4
</div>
<div
class="w-fit bg-green-500 text-white rounded-full px-3 py-1 mr-1 my-1"
>
Selenium
</div>
<div
class="w-fit bg-blue-500 text-white rounded-full px-3 py-1 mr-1 my-1"
>
Pandas
</div>
</div> </div>
<hr class="w-full mb-3" />
<h3 class="mb-1 font-bold text-lg">Achievements</h3>
<ul class="list-disc list-inside">
<li>3-time Dean's List recipient</li>
<li>President of Computer Programming Club</li>
<li>Vice President of Diploma Union</li>
</ul>
</div> </div>
</Card> </Card>
</div> </div>
@ -37,7 +156,10 @@ import Card from "../components/Card.astro";
); );
background-position: 50% 50%; background-position: 50% 50%;
background-size: 1.1rem 1.1rem; background-size: 1.1rem 1.1rem;
padding: 2rem 2rem; padding-top: 2rem;
padding-left: 2rem;
padding-right: 2rem;
padding-bottom: 0.5rem;
border-radius: 1.25rem; border-radius: 1.25rem;
overflow: hidden; overflow: hidden;
} }

View file

@ -6,9 +6,20 @@ import Card from "../components/Card.astro";
<div class="h-[1px] w-1/3 bg-[#404040] mb-5"></div> <div class="h-[1px] w-1/3 bg-[#404040] mb-5"></div>
<h1 class="text-center text-5xl mb-10">What I Do</h1> <h1 class="text-center text-5xl mb-10">What I Do</h1>
<div <div
class="grid grid-cols-1 xl:grid-cols-3 place-content-center justify-center w-4/5 gap-12" class="grid grid-cols-1 w-[400px] lg:w-[90%] lg:grid-cols-3 place-content-center justify-center xl:w-4/5 gap-5 xl:gap-12"
> >
<Card primaryColor="#be68ed"> <Card primaryColor="#B0D9B1" bgColor="#282828" scaleOnHover={true}>
<div class="card-content">
<h2 class="font-bold text-xl text-center">Web Development</h2>
<hr class="w-full" />
<p class="text-center">
I like to code things for the web, particularly on the
frontend. I enjoy bringing ideas to life in the browser.
</p>
</div>
</Card>
<Card primaryColor="#40F8FF" bgColor="#282828" scaleOnHover={true}>
<div class="card-content"> <div class="card-content">
<h2 class="font-bold text-xl text-center">Data Science</h2> <h2 class="font-bold text-xl text-center">Data Science</h2>
<hr class="w-full" /> <hr class="w-full" />
@ -19,24 +30,14 @@ import Card from "../components/Card.astro";
</div> </div>
</Card> </Card>
<Card primaryColor="#be68ed"> <Card primaryColor="#9D76C1" bgColor="#282828" scaleOnHover={true}>
<div class="card-content">
<h2 class="font-bold text-xl text-center">Web Development</h2>
<hr class="w-full" />
<p class="text-center">
I like to code things for the web, whether it's to inform or
to entertain.
</p>
</div>
</Card>
<Card primaryColor="#be68ed">
<div class="card-content"> <div class="card-content">
<h2 class="font-bold text-xl text-center">Content Creation</h2> <h2 class="font-bold text-xl text-center">Content Creation</h2>
<hr class="w-full" /> <hr class="w-full" />
<p class="text-center"> <p class="text-center">
I am experienced in streaming on Twitch and marketing I am experienced in streaming on Twitch, experienced in
myself, but I aim to improve my video editing skills. customizing settings in OBS, and aim to improve my video
editing skills.
</p> </p>
</div> </div>
</Card> </Card>
@ -57,5 +58,6 @@ import Card from "../components/Card.astro";
padding: 2rem 2rem; padding: 2rem 2rem;
border-radius: 1.25rem; border-radius: 1.25rem;
overflow: hidden; overflow: hidden;
min-width: 210px;
} }
</style> </style>

View file

@ -108,6 +108,10 @@ const { title } = Astro.props;
font-style: normal; font-style: normal;
} }
html {
scroll-behavior: smooth;
}
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;

View file

@ -1,4 +1,5 @@
--- ---
import NavBar from "../components/NavBar.astro";
import Layout from "../layouts/Layout.astro"; import Layout from "../layouts/Layout.astro";
import NetworkLine from "../components/NetworkLine.astro"; import NetworkLine from "../components/NetworkLine.astro";
import WhatIDo from "../components/WhatIDo.astro"; import WhatIDo from "../components/WhatIDo.astro";
@ -6,13 +7,34 @@ import Intro from "../components/Intro.svelte";
import Projects from "../components/Projects.svelte"; import Projects from "../components/Projects.svelte";
import Education from "../components/Education.astro"; import Education from "../components/Education.astro";
import Skills from "../components/Skills.astro"; import Skills from "../components/Skills.astro";
import Contact from "../components/Contact.astro";
import Card from "../components/Card.astro";
--- ---
<Layout title="Ryan's Portfolio"> <Layout title="Ryan's Portfolio">
<NavBar />
<div id="home" class="pt-20 flex justify-center items-center">
<div class="w-[90%] lg:w-1/2">
<Card bgColor="#252525" primaryColor="#BEADFA" scaleOnHover={false}>
<Intro client:load /> <Intro client:load />
</Card>
</div>
</div>
<div id="what-i-do">
<NetworkLine height="100px" /> <NetworkLine height="100px" />
<WhatIDo /> <WhatIDo />
</div>
<div id="projects">
<Projects client:idle /> <Projects client:idle />
<Education /> </div>
<div id="skills">
<Skills /> <Skills />
</div>
<div id="education">
<Education />
</div>
<div id="contact">
<Contact />
</div>
</Layout> </Layout>