feat: stricter lint, check pipelines, docker-containers, pnpm
This commit is contained in:
@@ -4,7 +4,7 @@ import styles from "../styling/achievements.module.scss";
|
||||
import educationData from "@/src/portfolio/data/educationData";
|
||||
import certificateData from "@/src/portfolio/data/certificateData";
|
||||
|
||||
const Achievements = () => {
|
||||
const Achievements = (): JSX.Element => {
|
||||
return (
|
||||
<div className={styles.section} id={"achievements"}>
|
||||
<div>
|
||||
@@ -27,4 +27,4 @@ const Achievements = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default Achievements;
|
||||
export default Achievements;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {Splide, SplideSlide} from "@splidejs/react-splide";
|
||||
import {useEffect, useState} from "react";
|
||||
import { Splide, SplideSlide } from "@splidejs/react-splide";
|
||||
import { useEffect, useState } from "react";
|
||||
import styles from "../styling/experience.module.scss";
|
||||
import WorkExperience from "@/src/portfolio/helpers/WorkExperience";
|
||||
import workExperienceData, {workExperienceParagraph} from "@/src/portfolio/data/workExperienceData";
|
||||
import workExperienceData, { workExperienceParagraph } from "@/src/portfolio/data/workExperienceData";
|
||||
|
||||
const Experience = () => {
|
||||
const calcPagesOnWidth = (width : number) => {
|
||||
const Experience = (): JSX.Element => {
|
||||
const calcPagesOnWidth = (width : number): number => {
|
||||
return Math.floor(width / 800 + 1);
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@ const Experience = () => {
|
||||
useEffect(() => {
|
||||
|
||||
setPages(calcPagesOnWidth(window.innerWidth));
|
||||
const handleResize = () => {
|
||||
const handleResize = (): void => {
|
||||
setPages(calcPagesOnWidth(window.innerWidth));
|
||||
};
|
||||
|
||||
@@ -53,4 +53,4 @@ const Experience = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default Experience;
|
||||
export default Experience;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import styles from "../styling/footer.module.scss";
|
||||
|
||||
const Footer = () => {
|
||||
const Footer = (): JSX.Element => {
|
||||
return (
|
||||
<footer className={styles.section}>
|
||||
Copyright © Patryk Kuchta {new Date().getFullYear()}
|
||||
@@ -8,4 +8,4 @@ const Footer = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default Footer;
|
||||
export default Footer;
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
import styles from "../styling/intro.module.scss";
|
||||
import Image from "next/image";
|
||||
import profilePic from "../../../public/portfolio/profile.png";
|
||||
import logo from "../../../public/portfolio/logo.svg";
|
||||
|
||||
const Intro = () => {
|
||||
|
||||
const greeting = () => {
|
||||
const hour = new Date().getHours();
|
||||
if (hour > 4 && hour < 12) {
|
||||
return "Good Morning!";
|
||||
} else if (hour < 18) {
|
||||
return "Good Afternoon!";
|
||||
} else {
|
||||
return "Good Evening!";
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
return (
|
||||
<section className={styles.section}>
|
||||
<header className={styles.topBar} data-aos={"zoom-in-down"} data-aos-duration={"500"}>
|
||||
<div className={styles.row}>
|
||||
<div className={styles.logoContainer}>
|
||||
<Image src={logo} alt={"Kuchta logo"} fill={true}/>
|
||||
</div>
|
||||
<a href={"#achievements"}>Achievements</a>
|
||||
<a href={"#experience"}>Experience</a>
|
||||
<a href={"#projects"}>Projects</a>
|
||||
<a href={"#skills"}>Skills</a>
|
||||
</div>
|
||||
<div className={styles.left}>
|
||||
<a href={"mailto: patrick@kuchta.uk"}>patrick@kuchta.uk</a>
|
||||
<span>/</span>
|
||||
<a href={"mailto: patryk@kuchta.uk"}>patryk@kuchta.uk</a>
|
||||
</div>
|
||||
</header>
|
||||
<div className={styles.mainContent}>
|
||||
<div className={styles.text} data-aos={"fade-in"} data-aos-duration={"500"}>
|
||||
<div className={styles.larger}>
|
||||
<span className={styles.greeting}>
|
||||
{greeting()}
|
||||
</span>
|
||||
<br/>
|
||||
I am
|
||||
<b> Patryk Kuchta, </b>
|
||||
an aspiring
|
||||
<br/>
|
||||
<b>Artificial Intelligence Scientist</b>.
|
||||
</div>
|
||||
<span data-aos={"fade-in"} data-aos-offset={"200"}><i>and yes, the greeting is synced to your time.</i></span>
|
||||
</div>
|
||||
<div className={styles.profileContainer}>
|
||||
<Image
|
||||
src={profilePic}
|
||||
alt={"Frontal image showing Patryk Kuchta"}
|
||||
fill={true}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Intro;
|
||||
17
src/portfolio/sections/Intro/Intro.tsx
Normal file
17
src/portfolio/sections/Intro/Intro.tsx
Normal file
@@ -0,0 +1,17 @@
|
||||
import styles from "../../styling/intro.module.scss";
|
||||
import TopBar from "./TopBar";
|
||||
import IntroContent from "./IntroContent";
|
||||
import { getGreeting } from "./helpers";
|
||||
|
||||
const Intro = (): JSX.Element => {
|
||||
const greeting = getGreeting();
|
||||
|
||||
return (
|
||||
<section className={styles.section}>
|
||||
<TopBar/>
|
||||
<IntroContent greeting={greeting}/>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Intro;
|
||||
39
src/portfolio/sections/Intro/IntroContent.tsx
Normal file
39
src/portfolio/sections/Intro/IntroContent.tsx
Normal file
@@ -0,0 +1,39 @@
|
||||
import Image from "next/image";
|
||||
import styles from "../../styling/intro.module.scss";
|
||||
import profilePic from "../../../../public/portfolio/profile.png";
|
||||
|
||||
interface IIntroContentProps {
|
||||
greeting: string;
|
||||
}
|
||||
|
||||
const IntroContent = ({ greeting }: IIntroContentProps): JSX.Element => {
|
||||
return (
|
||||
<div className={styles.mainContent}>
|
||||
<div className={styles.text} data-aos={"fade-in"} data-aos-duration={"500"}>
|
||||
<div className={styles.larger}>
|
||||
<span className={styles.greeting}>
|
||||
{greeting}
|
||||
</span>
|
||||
<br/>
|
||||
I am
|
||||
<b> Patryk Kuchta, </b>
|
||||
an aspiring
|
||||
<br/>
|
||||
<b>Artificial Intelligence Scientist</b>.
|
||||
</div>
|
||||
<span data-aos={"fade-in"} data-aos-offset={"200"}>
|
||||
<i>and yes, the greeting is synced to your time.</i>
|
||||
</span>
|
||||
</div>
|
||||
<div className={styles.profileContainer}>
|
||||
<Image
|
||||
src={profilePic}
|
||||
alt={"Frontal image showing Patryk Kuchta"}
|
||||
fill={true}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default IntroContent;
|
||||
26
src/portfolio/sections/Intro/TopBar.tsx
Normal file
26
src/portfolio/sections/Intro/TopBar.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
import Image from "next/image";
|
||||
import styles from "../../styling/intro.module.scss";
|
||||
import logo from "../../../../public/portfolio/logo.svg";
|
||||
|
||||
const TopBar = (): JSX.Element => {
|
||||
return (
|
||||
<header className={styles.topBar} data-aos={"zoom-in-down"} data-aos-duration={"500"}>
|
||||
<div className={styles.row}>
|
||||
<div className={styles.logoContainer}>
|
||||
<Image src={logo} alt={"Kuchta logo"} fill={true}/>
|
||||
</div>
|
||||
<a href={"#achievements"}>Achievements</a>
|
||||
<a href={"#experience"}>Experience</a>
|
||||
<a href={"#projects"}>Projects</a>
|
||||
<a href={"#skills"}>Skills</a>
|
||||
</div>
|
||||
<div className={styles.left}>
|
||||
<a href={"mailto: patrick@kuchta.uk"}>patrick@kuchta.uk</a>
|
||||
<span>/</span>
|
||||
<a href={"mailto: patryk@kuchta.uk"}>patryk@kuchta.uk</a>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
};
|
||||
|
||||
export default TopBar;
|
||||
10
src/portfolio/sections/Intro/helpers.ts
Normal file
10
src/portfolio/sections/Intro/helpers.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
export const getGreeting = (): string => {
|
||||
const hour = new Date().getHours();
|
||||
if (hour > 4 && hour < 12) {
|
||||
return "Good Morning!";
|
||||
} else if (hour < 18) {
|
||||
return "Good Afternoon!";
|
||||
} else {
|
||||
return "Good Evening!";
|
||||
}
|
||||
};
|
||||
1
src/portfolio/sections/Intro/index.ts
Normal file
1
src/portfolio/sections/Intro/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export { default } from "./Intro";
|
||||
@@ -1,16 +1,16 @@
|
||||
import {Splide, SplideSlide} from "@splidejs/react-splide";
|
||||
import { Splide, SplideSlide } from "@splidejs/react-splide";
|
||||
import Project from "@/src/portfolio/helpers/Project";
|
||||
import projectData from "@/src/portfolio/data/projectData";
|
||||
import styles from "../styling/projects.module.scss";
|
||||
|
||||
const Projects = () => {
|
||||
const Projects = (): JSX.Element => {
|
||||
return (
|
||||
<div className={styles.section} id={"projects"}>
|
||||
<Splide
|
||||
options={{
|
||||
rewind: true,
|
||||
type: "slide",
|
||||
perPage: 1,
|
||||
perPage: 1
|
||||
}}
|
||||
>
|
||||
{ projectData.map((entry, key) => {
|
||||
@@ -24,4 +24,4 @@ const Projects = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default Projects;
|
||||
export default Projects;
|
||||
|
||||
@@ -1,107 +1 @@
|
||||
import styles from "../styling/skillsLinks.module.scss";
|
||||
import SkillDisplay from "@/src/portfolio/helpers/SkillDisplay";
|
||||
import Accordion from "@/src/portfolio/helpers/Accordion";
|
||||
import {skillsInCategories} from "@/src/portfolio/data/skillsData";
|
||||
import {modulesTaken} from "@/src/portfolio/data/modulesTaken";
|
||||
|
||||
const SkillsAndLinks = () => {
|
||||
const moreInfoLinks = [
|
||||
{
|
||||
title: "Github",
|
||||
link: "https://github.com/KuchtaVR6/"
|
||||
},
|
||||
{
|
||||
title: "LinkedIn",
|
||||
link: "https://linkedin.com/in/kuchtap"
|
||||
},
|
||||
{
|
||||
title: "Curriculum Vitae",
|
||||
link: "/PatrykKuchta_CV.pdf"
|
||||
}
|
||||
];
|
||||
|
||||
const contactLinks = [
|
||||
{
|
||||
title: "Email",
|
||||
link: "mailto:patryk@kuchta.uk"
|
||||
},
|
||||
{
|
||||
title: "LinkedIn",
|
||||
link: "https://linkedin.com/in/kuchtap"
|
||||
}
|
||||
];
|
||||
|
||||
return (
|
||||
<div className={styles.section} id={"skills"}>
|
||||
<div data-aos = {"fade-left"} className={styles.skills}>
|
||||
<div>
|
||||
<i>Press the "+" to expand a section</i> 👀
|
||||
</div>
|
||||
<div className={styles.innerskills}>
|
||||
{
|
||||
Object.entries(skillsInCategories).map(([category, skills]) => {
|
||||
console.log(skills);
|
||||
return <Accordion title={category} key={category}>
|
||||
{
|
||||
skills.map((skill) => {
|
||||
return <SkillDisplay {...skill} key={skill.name} />;
|
||||
})
|
||||
}
|
||||
</Accordion>;
|
||||
})
|
||||
}
|
||||
|
||||
<Accordion title={"Modules Taken"}>
|
||||
{
|
||||
modulesTaken.map(({name, level, score}) => {
|
||||
return <div id={name.toLowerCase()}
|
||||
className={styles.technology}
|
||||
key={name}>
|
||||
<b>{name} </b>
|
||||
<span style={{float: "right", fontSize: "0.8em"}}>
|
||||
{score>=0? score + "%" : "🔮"} <i>{level}</i>
|
||||
</span>
|
||||
</div>;
|
||||
})
|
||||
}
|
||||
</Accordion>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div data-aos = {"fade-right"} className={styles.otherLinks}>
|
||||
<h2>Find out more about me:</h2>
|
||||
<ul>
|
||||
{
|
||||
moreInfoLinks.map(({title, link}, key) => {
|
||||
return (
|
||||
<li key = {key}>
|
||||
<a href={link}>
|
||||
{title}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
)
|
||||
}
|
||||
</ul>
|
||||
<h2>Contact me through:</h2>
|
||||
<ul>
|
||||
{
|
||||
contactLinks.map(({title, link}, key) => {
|
||||
return (
|
||||
<li key = {key}>
|
||||
<a href={link}>
|
||||
{title}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
)
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default SkillsAndLinks;
|
||||
export { default } from "./SkillsAndLinks/SkillsAndLinks";
|
||||
|
||||
71
src/portfolio/sections/SkillsAndLinks/LinksSection.tsx
Normal file
71
src/portfolio/sections/SkillsAndLinks/LinksSection.tsx
Normal file
@@ -0,0 +1,71 @@
|
||||
import styles from "../../styling/skillsLinks.module.scss";
|
||||
|
||||
interface ILink {
|
||||
title: string;
|
||||
link: string;
|
||||
}
|
||||
|
||||
const moreInfoLinks: ILink[] = [
|
||||
{
|
||||
title: "Github",
|
||||
link: "https://github.com/KuchtaVR6/"
|
||||
},
|
||||
{
|
||||
title: "LinkedIn",
|
||||
link: "https://linkedin.com/in/kuchtap"
|
||||
},
|
||||
{
|
||||
title: "Curriculum Vitae",
|
||||
link: "/PatrykKuchta_CV.pdf"
|
||||
}
|
||||
];
|
||||
|
||||
const contactLinks: ILink[] = [
|
||||
{
|
||||
title: "Email",
|
||||
link: "mailto:patryk@kuchta.uk"
|
||||
},
|
||||
{
|
||||
title: "LinkedIn",
|
||||
link: "https://linkedin.com/in/kuchtap"
|
||||
}
|
||||
];
|
||||
|
||||
const LinksSection = (): JSX.Element => {
|
||||
return (
|
||||
<div data-aos = {"fade-right"} className={styles.otherLinks}>
|
||||
<h2>Find out more about me:</h2>
|
||||
<ul>
|
||||
{
|
||||
moreInfoLinks.map(({ title, link }, key) => {
|
||||
return (
|
||||
<li key = {key}>
|
||||
<a href={link}>
|
||||
{title}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
)
|
||||
}
|
||||
</ul>
|
||||
<h2>Contact me through:</h2>
|
||||
<ul>
|
||||
{
|
||||
contactLinks.map(({ title, link }, key) => {
|
||||
return (
|
||||
<li key = {key}>
|
||||
<a href={link}>
|
||||
{title}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
)
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LinksSection;
|
||||
14
src/portfolio/sections/SkillsAndLinks/SkillsAndLinks.tsx
Normal file
14
src/portfolio/sections/SkillsAndLinks/SkillsAndLinks.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import styles from "../../styling/skillsLinks.module.scss";
|
||||
import SkillsSection from "./SkillsSection";
|
||||
import LinksSection from "./LinksSection";
|
||||
|
||||
const SkillsAndLinks = (): JSX.Element => {
|
||||
return (
|
||||
<div className={styles.section} id={"skills"}>
|
||||
<SkillsSection/>
|
||||
<LinksSection/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default SkillsAndLinks;
|
||||
45
src/portfolio/sections/SkillsAndLinks/SkillsSection.tsx
Normal file
45
src/portfolio/sections/SkillsAndLinks/SkillsSection.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import styles from "../../styling/skillsLinks.module.scss";
|
||||
import SkillDisplay from "@/src/portfolio/helpers/SkillDisplay";
|
||||
import Accordion from "@/src/portfolio/helpers/Accordion";
|
||||
import { skillsInCategories } from "@/src/portfolio/data/skillsData";
|
||||
import { modulesTaken } from "@/src/portfolio/data/modulesTaken";
|
||||
|
||||
const SkillsSection = (): JSX.Element => {
|
||||
return (
|
||||
<div data-aos = {"fade-left"} className={styles.skills}>
|
||||
<div>
|
||||
<i>Press the "+" to expand a section</i> 👀
|
||||
</div>
|
||||
<div className={styles.innerskills}>
|
||||
{
|
||||
Object.entries(skillsInCategories).map(([category, skills]) => {
|
||||
return <Accordion title={category} key={category}>
|
||||
{
|
||||
skills.map((skill) => {
|
||||
return <SkillDisplay {...skill} key={skill.name} />;
|
||||
})
|
||||
}
|
||||
</Accordion>;
|
||||
})
|
||||
}
|
||||
|
||||
<Accordion title={"Modules Taken"}>
|
||||
{
|
||||
modulesTaken.map(({ name, level, score }) => {
|
||||
return <div id={name.toLowerCase()}
|
||||
className={styles.technology}
|
||||
key={name}>
|
||||
<b>{name} </b>
|
||||
<span style={{ float: "right", fontSize: "0.8em" }}>
|
||||
{score>=0? score + "%" : "🔮"} <i>{level}</i>
|
||||
</span>
|
||||
</div>;
|
||||
})
|
||||
}
|
||||
</Accordion>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default SkillsSection;
|
||||
1
src/portfolio/sections/SkillsAndLinks/index.ts
Normal file
1
src/portfolio/sections/SkillsAndLinks/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export { default } from "./SkillsAndLinks";
|
||||
Reference in New Issue
Block a user