feat: stricter lint, check pipelines, docker-containers, pnpm

This commit is contained in:
2026-02-22 17:48:51 +00:00
parent 40ca6ef94a
commit b697ad823a
50 changed files with 4976 additions and 5431 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,6 +1,6 @@
import styles from "../styling/footer.module.scss";
const Footer = () => {
const Footer = (): JSX.Element => {
return (
<footer className={styles.section}>
Copyright &copy; Patryk Kuchta {new Date().getFullYear()}
@@ -8,4 +8,4 @@ const Footer = () => {
);
};
export default Footer;
export default Footer;

View File

@@ -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;

View 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;

View 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;

View 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;

View 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!";
}
};

View File

@@ -0,0 +1 @@
export { default } from "./Intro";

View File

@@ -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;

View File

@@ -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 &quot;+&quot; to expand a section</i>&nbsp;👀
</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}&nbsp;&nbsp;</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";

View 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;

View 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;

View 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 &quot;+&quot; to expand a section</i>&nbsp;👀
</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}&nbsp;&nbsp;</b>
<span style={{ float: "right", fontSize: "0.8em" }}>
{score>=0? score + "%" : "🔮"} <i>{level}</i>
</span>
</div>;
})
}
</Accordion>
</div>
</div>
);
};
export default SkillsSection;

View File

@@ -0,0 +1 @@
export { default } from "./SkillsAndLinks";