diff --git a/app/frontend/src/assets/profile.jpg b/app/frontend/src/assets/profile.jpg new file mode 100644 index 0000000..3c58f88 Binary files /dev/null and b/app/frontend/src/assets/profile.jpg differ diff --git a/app/frontend/src/components/CV/Experience.tsx b/app/frontend/src/components/CV/Experience.tsx index 6e5b89d..0f1318f 100644 --- a/app/frontend/src/components/CV/Experience.tsx +++ b/app/frontend/src/components/CV/Experience.tsx @@ -3,7 +3,7 @@ import { defineMessages, useIntl } from "react-intl"; import { Content } from "../common/Content"; import { Headline, SubHeadline } from "../common/Headline"; -import { Spacer } from "../common/Spacer"; +import PageBreakAvoid from "../common/PageBreakAvoid"; import { Paragraph } from "../common/Text"; const messages = defineMessages({ @@ -25,44 +25,69 @@ const approxCurrentYears = { ), }; -const yourpassSkills = [ +const investbaySkills = [ "DevOps", - "Front-End Development", - "Back-end Operations", - "Software Development", - "Kubernetes", - "TypeScript", - "Go", - "Linux", - "Linux Server", + "Google Cloud Platform (GCP)", + "Amazon Web Services (AWS)", + "Gitlab", + "Terraform", + "Cloud infrastructure", + "Cloud Applications", + "Software Development Life Cycle (SDLC)", "Linux System Administration", - "Back-End Web Development", - "Git", + "Go", + "TypeScript", + "Nix", + "GraphQL", + "gRPC", "PostgreSQL", "Node.js", "React.js", +]; + +const yourpassSkills = [ + "DevOps", + "Software as a Service (SaaS)", + "Cloud Infrastructure", + "Kubernetes", + "Back-end Operations", + "Linux System Administration", "Amazon Web Services (AWS)", - "Amazon EKS", + "Terraform", + "Go (Programming Language)", + "gRPC", + "Front-End Development", + "React.js", + "Node.js", + "TypeScript", + "Nix", + "Software Development Life Cycle (SDLC)", + "Software Development", + "Git", + "PostgreSQL", ]; const yoursystemSkills = [ "DevOps", - "Front-End Development", + "Docker Swarm", + "Linux System Administration", "Back-end Operations", + "Front-End Development", + "Amazon Web Services (AWS)", + "Bash", + "Linux Server", + "Terraform", + "Cloud Infrastructure", + "Cloud Applications", + "Go (Programming Language)", + "TypeScript", + "Node.js", + "Software Development Life Cycle (SDLC)", "Software Development", "Kubernetes", - "TypeScript", - "Linux", - "Linux Server", - "Linux System Administration", "Back-End Web Development", + "GraphQL", "Git", - "Node.js", - "Vue.js", - "PHP", - "Bash", - "Amazon Web Services (AWS)", - "Amazon EKS", ]; const Experience: React.FC = () => { @@ -70,103 +95,109 @@ const Experience: React.FC = () => { return ( <> - INVESTBAY s.r.o. - DevOps Architect - - - {intl.formatMessage( - { - defaultMessage: "February 2024 - Present", - id: "Experience.investbay", - }, - { - // not used atm - count: approxCurrentYears.InvestBay, - } - )} - - - {intl.formatMessage(messages.skills)}:{" "} - {yourpassSkills.join(" · ")} - - + + INVESTBAY s.r.o. + DevOps Architect + + + {intl.formatMessage( + { + defaultMessage: "February 2024 - Present", + id: "Experience.investbay", + }, + { + // not used atm + count: approxCurrentYears.InvestBay, + } + )} + + + {intl.formatMessage(messages.skills)}:{" "} + {investbaySkills.join(" · ")} + + + - YOUR PASS s.r.o. - DevOps Engineer - - - {intl.formatMessage( - { - defaultMessage: "July 2021 - Present ({count} years)", - id: "Experience.yourpass", - }, - { - count: approxCurrentYears.YourPass, - } - )} - - - {intl.formatMessage(messages.skills)}:{" "} - {yourpassSkills.join(" · ")} - - + + YOUR PASS s.r.o. + DevOps Engineer + + + {intl.formatMessage( + { + defaultMessage: "July 2021 - Present ({count} years)", + id: "Experience.yourpass", + }, + { + count: approxCurrentYears.YourPass, + } + )} + + + {intl.formatMessage(messages.skills)}:{" "} + {yourpassSkills.join(" · ")} + + + - + + YOUR SYSTEM s.r.o. + SysOps - YOUR SYSTEM s.r.o. - SysOps + + + {intl.formatMessage( + { + defaultMessage: "January 2022 - Present ({count} years)", + id: "Experience.yoursystem", + }, + { + count: approxCurrentYears.YourSystemSysOps, + } + )} + + + {intl.formatMessage(messages.skills)}:{" "} + {yoursystemSkills.join(" · ")} + + - - - {intl.formatMessage( - { - defaultMessage: "January 2022 - Present ({count} years)", + Lead Developer/Architect + + + + {intl.formatMessage({ + defaultMessage: "February 2016 - December 2021 (5 years)", id: "Experience.yoursystem", - }, - { - count: approxCurrentYears.YourSystemSysOps, - } - )} - - - {intl.formatMessage(messages.skills)}:{" "} - {yoursystemSkills.join(" · ")} - - + })} + + + {intl.formatMessage(messages.skills)}:{" "} + {yoursystemSkills.join(" · ")} + + + - Lead Developer/Architect + + Past experience + Developer - - - {intl.formatMessage({ - defaultMessage: "February 2016 - December 2021 (5 years)", - id: "Experience.yoursystem", - })} - - - {intl.formatMessage(messages.skills)}:{" "} - {yoursystemSkills.join(" · ")} - - - - Past experience - Developer - - - - {intl.formatMessage({ - defaultMessage: "Birth - February 2016", - id: "Experience.past", - })} - - - {intl.formatMessage({ - defaultMessage: - "Working on smaller projects such as chats, forum based websites, web based presentations, most notably a system for handling the driver training center and driving school agenda... Tinkering...", - id: "Experience.pastDescription", - })} - - + + + {intl.formatMessage({ + defaultMessage: "Birth - February 2016", + id: "Experience.past", + })} + + + {intl.formatMessage({ + defaultMessage: + "Working on smaller projects such as chats, forum based websites, web based presentations, most notably a system for handling the driver training center and driving school agenda... Tinkering...", + id: "Experience.pastDescription", + })} + + + ); }; diff --git a/app/frontend/src/components/CV/Skill.tsx b/app/frontend/src/components/CV/Skill.tsx index 80327e7..c6ed3ae 100644 --- a/app/frontend/src/components/CV/Skill.tsx +++ b/app/frontend/src/components/CV/Skill.tsx @@ -2,6 +2,7 @@ import React from "react"; import { Spacer } from "../common/Spacer"; import { Paragraph } from "../common/Text"; +import PageBreakAvoid from "../common/PageBreakAvoid"; type SkillProps = { title: string; @@ -11,13 +12,13 @@ const Skill: React.FC> = (props) => { const { children, title } = props; return ( -
+ {title} {React.Children.map(children, (c) => ( {c} ))} -
+ ); }; diff --git a/app/frontend/src/components/CV/Skills.tsx b/app/frontend/src/components/CV/Skills.tsx index 2a05a04..05d2f9c 100644 --- a/app/frontend/src/components/CV/Skills.tsx +++ b/app/frontend/src/components/CV/Skills.tsx @@ -3,6 +3,7 @@ import { useIntl } from "react-intl"; import { SubHeadline } from "../common/Headline"; import { List, ListItem } from "../common/List"; +import PageBreakAvoid from "../common/PageBreakAvoid"; import { Spacer } from "../common/Spacer"; import { Paragraph } from "../common/Text"; import Skill from "./Skill"; @@ -99,8 +100,10 @@ const Skills: React.FC = () => { {otherSkills.map((s) => ( - {s.title} - {s.description && `: ${s.description}`} + + {s.title} + {s.description && `: ${s.description}`} + ))} diff --git a/app/frontend/src/components/CV/Summary.tsx b/app/frontend/src/components/CV/Summary.tsx index 7176f97..48ed2c2 100644 --- a/app/frontend/src/components/CV/Summary.tsx +++ b/app/frontend/src/components/CV/Summary.tsx @@ -38,8 +38,7 @@ const Summary: React.FC = () => { knowledge of KNX systems. - -- This summary was graciously generated by an AI and then rewritten and - adjusted by a human + -- Summary graciously generated by an AI and curated by human ); diff --git a/app/frontend/src/components/Layout/MainLayout.tsx b/app/frontend/src/components/Layout/MainLayout.tsx index 025d397..2985184 100644 --- a/app/frontend/src/components/Layout/MainLayout.tsx +++ b/app/frontend/src/components/Layout/MainLayout.tsx @@ -23,7 +23,7 @@ const Nav = styled("nav")({ flex: "0 0 280px", width: 280, minHeight: "100%", - padding: "3rem 2rem 2rem", + padding: "2rem 2rem 2rem", [hideNavigationMQ]: { display: "none", diff --git a/app/frontend/src/components/Navigation/MainNavigation.tsx b/app/frontend/src/components/Navigation/MainNavigation.tsx index 5acbb6a..2af78de 100644 --- a/app/frontend/src/components/Navigation/MainNavigation.tsx +++ b/app/frontend/src/components/Navigation/MainNavigation.tsx @@ -1,12 +1,23 @@ +import styled from "@emotion/styled"; import React, { useEffect, useRef } from "react"; import { useIntl } from "react-intl"; +import profile from "../../assets/profile.jpg"; import { CONTACT_EMAIL, CONTACT_PHONE } from "../../config/environment"; import { Contact } from "../common/Contact"; import { List, ListItem } from "../common/List"; import { Spacer } from "../common/Spacer"; import NavigationHeadline from "./NavigationHeadline"; +const ProfileImg = styled("img")({ + borderRadius: "50%", + border: "2px solid white", + display: "block", + margin: "0 auto", + maxWidth: "100%", + width: 150, +}); + const getTopOffset = (input: HTMLElement) => { let el: HTMLElement | Element | null = input; let o = 0; @@ -51,6 +62,13 @@ const MainNavigation: React.FC = () => { scrollPrev = window.scrollY; const top = getTopOffset(d); + console.log({ + "window.innerHeight": window.innerHeight, + height, + top, + down, + }); + if (window.innerHeight > height) { d.style.marginTop = `${Math.max(window.scrollY, 0)}px`; return; @@ -61,16 +79,24 @@ const MainNavigation: React.FC = () => { const wDelta = window.scrollY + window.innerHeight; const diff = wDelta - delta; + console.log({ delta, wDelta, "window.scrollY": window.scrollY, diff }); + if (diff > 0) { const sizeDelta = Math.min(window.innerHeight - height, 0); d.style.marginTop = `${Math.max(top + diff + sizeDelta, 0)}px`; + console.log({ + sizeDelta, + marginTop: Math.max(top + diff + sizeDelta, 0), + }); } } else { const delta = top; const wDelta = window.scrollY; const diff = wDelta - delta; + console.log({ delta, wDelta, "window.scrollY": window.scrollY, diff }); if (diff < 0) { + console.log({ marginTop: Math.max(top + diff, 0) }); d.style.marginTop = `${Math.max(top + diff, 0)}px`; } } @@ -86,6 +112,8 @@ const MainNavigation: React.FC = () => { return (
+ + {intl.formatMessage({ defaultMessage: "Contact", diff --git a/app/frontend/src/components/common/PageBreakAvoid.tsx b/app/frontend/src/components/common/PageBreakAvoid.tsx new file mode 100644 index 0000000..cae063f --- /dev/null +++ b/app/frontend/src/components/common/PageBreakAvoid.tsx @@ -0,0 +1,7 @@ +import styled from "@emotion/styled"; + +const PageBreakAvoid = styled("div")({ + pageBreakInside: "avoid", +}); + +export default PageBreakAvoid; diff --git a/flake.nix b/flake.nix index 6095cd4..d5444f3 100644 --- a/flake.nix +++ b/flake.nix @@ -8,7 +8,8 @@ { formatter = nix.formatter; - packages = nix.lib.forAllSystems (pkgs: + packages = nix.lib.forAllSystems ( + pkgs: let version = "rev-${self.shortRev or self.dirtyShortRev}"; package = builtins.fromJSON (builtins.readFile ./app/frontend/package.json); @@ -42,7 +43,9 @@ "-w" "-X gopkg.c3c.cz/cv/app/server/internal/version.Tag=${version}" "-X gopkg.c3c.cz/cv/app/server/internal/version.Commit=${self.rev or self.dirtyRev}" - "-X gopkg.c3c.cz/cv/app/server/internal/version.commitTime=${builtins.toString (self.lastModified or 0)}" + "-X gopkg.c3c.cz/cv/app/server/internal/version.commitTime=${ + builtins.toString (self.lastModified or 0) + }" ]; vendorHash = "sha256-44xcyVk5KcurQLkVJv1MeAj+Pfcu53664pvVgHdyv3E="; };