From b2650d771d2e4a13c13968170e647af7870e39cd Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Fri, 20 Jan 2023 16:13:03 +0100 Subject: [PATCH] Data structure refactor (#164) --- .github/workflows/check-code-quality.yml | 14 ++ astro.config.ts | 2 +- package-lock.json | 37 ++++ package.json | 6 +- public/cv.pdf | Bin 596373 -> 591585 bytes scripts/generate-cv.cjs | 6 +- src/components/divider.astro | 1 - src/components/icon-button.astro | 32 --- src/components/labelled-value.astro | 13 -- src/components/photo.astro | 28 --- src/components/section-card.astro | 47 ---- src/components/tag.astro | 19 -- src/components/tags-list.astro | 29 --- src/components/timestamp.astro | 17 -- src/data/config.ts | 25 +++ src/data/cv.ts | 11 + src/data/helpers/links.ts | 146 +++++++++++++ src/data/{ => helpers}/skills.ts | 57 ++--- src/data/index.ts | 58 ----- src/data/sections/education-section.data.ts | 30 +++ src/data/sections/education.ts | 30 --- ...perience.ts => experience-section.data.ts} | 46 ++-- ...favorites.ts => favorites-section.data.ts} | 25 ++- src/data/sections/index.ts | 21 ++ .../{main.ts => main-section.data.ts} | 17 +- ...portfolio.ts => portfolio-section.data.ts} | 56 +++-- .../{skills.ts => skills-section.data.ts} | 17 +- ...onials.ts => testimonials-section.data.ts} | 20 +- src/data/socials.ts | 200 ------------------ src/data/transformers/index.ts | 1 + src/data/transformers/transform-data.ts | 14 ++ src/data/transformers/transformers.ts | 92 ++++++++ src/pages/_playground/button.astro | 7 - src/pages/_playground/favorites.astro | 51 ----- src/pages/_playground/icon-button.astro | 10 - src/pages/_playground/icon.astro | 9 - src/pages/_playground/image.astro | 7 - src/pages/_playground/labelled-value.astro | 7 - src/pages/_playground/main-section.astro | 41 ---- src/pages/_playground/projects-timeline.astro | 67 ------ src/pages/_playground/section-card.astro | 7 - src/pages/_playground/sidebar-item.astro | 7 - src/pages/_playground/skill.astro | 14 -- src/pages/_playground/skills-section.astro | 160 -------------- src/pages/_playground/tag.astro | 11 - src/pages/_playground/testimonial.astro | 20 -- .../_playground/testimonials-section.astro | 45 ---- src/pages/_playground/typography.astro | 48 ----- src/pages/_playground/work-timeline.astro | 67 ------ src/pages/index.astro | 83 +++----- src/pages/pdf.astro | 25 ++- src/pdf/components/date-range-tag.astro | 15 +- src/pdf/components/description.astro | 4 +- src/pdf/components/footer.astro | 6 + src/pdf/components/labelled-value.astro | 10 +- src/pdf/components/list-item-heading.astro | 10 +- src/pdf/components/photo.astro | 24 +++ src/pdf/components/tags-list.astro | 11 +- src/pdf/footer.astro | 24 --- src/pdf/sections/education-section.pdf.astro | 19 +- src/pdf/sections/experience-section.pdf.astro | 22 +- src/pdf/sections/main-section.pdf.astro | 15 +- src/pdf/sections/portfolio-section.pdf.astro | 26 +-- src/pdf/sections/skills-section.pdf.astro | 74 +++---- src/sections/education/education-item.astro | 42 ---- .../education/education-section.astro | 30 --- .../experience/experience-section.astro | 30 --- .../experience/work-timeline-item.astro | 54 ----- .../favorites/favorites-section.astro | 87 -------- src/sections/favorites/video-tile.astro | 23 -- .../portfolio/portfolio-section.astro | 29 --- .../portfolio/project-timeline-item.astro | 68 ------ .../skills/levelled-skill-subsection.astro | 15 -- src/sections/skills/skill-subsection.astro | 28 --- src/sections/skills/skills-section.astro | 22 -- .../testimonials/testimonials-section.astro | 25 --- src/types/common.ts | 32 --- src/types/config/i18n-config.types.ts | 9 + src/types/config/pdf-config.types.ts | 3 + src/types/config/seo-config.types.ts | 8 + src/types/data.ts | 48 +++-- src/types/education-section.ts | 15 -- src/types/experience-section.ts | 16 -- src/types/i18n.ts | 8 - src/types/icon.ts | 3 - src/types/main-section.ts | 18 -- src/types/pdf.ts | 3 - src/types/portfolio-section.ts | 17 -- src/types/sections/education-section.types.ts | 13 ++ .../sections/experience-section.types.ts | 14 ++ .../favorites-section.types.ts} | 21 +- src/types/sections/main-section.types.ts | 13 ++ src/types/sections/portfolio-section.types.ts | 16 ++ src/types/sections/skills-section.types.ts | 18 ++ .../sections/testimonials-section.types.ts | 13 ++ src/types/seo.ts | 15 -- src/types/shared.ts | 52 +++++ src/types/skills-section.ts | 17 -- src/types/testimonials-section.ts | 14 -- src/utils/create-link-factory.ts | 15 ++ src/utils/create-skill-factory.ts | 16 ++ src/utils/date-formatter.ts | 6 - src/utils/format-date-range.ts | 10 + src/utils/is-section-key.ts | 15 -- src/utils/remove-last.ts | 6 - src/web/components/description.astro | 29 +++ src/{ => web}/components/divided-list.astro | 0 src/web/components/divider.astro | 1 + .../components/download-button.astro} | 13 +- src/{ => web}/components/icon.astro | 2 +- src/web/components/labelled-value.astro | 22 ++ src/web/components/layout.astro | 41 ++++ src/web/components/link-button.astro | 18 ++ src/web/components/photo.astro | 18 ++ src/web/components/section-card.astro | 43 ++++ src/{ => web}/components/sidebar-item.astro | 18 +- src/{ => web}/components/sidebar.astro | 22 +- src/web/components/tag.astro | 25 +++ src/web/components/tags-list.astro | 12 ++ src/{ => web}/components/theme-toggle.astro | 0 src/web/components/timestamp.astro | 14 ++ src/{ => web}/components/typography.astro | 5 +- src/{ => web}/scripts/initialize-tooltips.ts | 2 +- src/web/sections/education/diploma.astro | 31 +++ .../education/education-section.web.astro | 14 ++ .../experience/experience-section.web.astro | 17 ++ src/web/sections/experience/job.astro | 29 +++ .../sections/favorites/book-tile.astro | 16 +- .../favorites/favorites-section.web.astro | 31 +++ .../favorites/favorites-sub-section.astro | 22 ++ .../sections/favorites/media-tile.astro | 14 +- .../sections/favorites/person-tile.astro | 14 +- src/web/sections/favorites/video-tile.astro | 16 ++ .../sections/main/main-section.web.astro} | 40 ++-- .../portfolio/portfolio-section.web.astro | 17 ++ src/web/sections/portfolio/project.astro | 47 ++++ .../sections/skills/levelled-skill.astro} | 7 +- .../sections/skills/skill-level-tile.astro | 6 +- .../sections/skills/skill-level.astro | 5 +- src/web/sections/skills/skill-set.astro | 32 +++ .../sections/skills/skills-section.web.astro | 15 ++ .../sections/testimonials/testimonial.astro | 22 +- .../testimonials-section.web.astro | 17 ++ src/{ => web}/utils/env.ts | 0 src/{ => web}/utils/hash-state.ts | 3 +- src/{ => web}/utils/throttle.ts | 0 146 files changed, 1501 insertions(+), 2169 deletions(-) delete mode 100644 src/components/divider.astro delete mode 100644 src/components/icon-button.astro delete mode 100644 src/components/labelled-value.astro delete mode 100644 src/components/photo.astro delete mode 100644 src/components/section-card.astro delete mode 100644 src/components/tag.astro delete mode 100644 src/components/tags-list.astro delete mode 100644 src/components/timestamp.astro create mode 100644 src/data/config.ts create mode 100644 src/data/cv.ts create mode 100644 src/data/helpers/links.ts rename src/data/{ => helpers}/skills.ts (66%) delete mode 100644 src/data/index.ts create mode 100644 src/data/sections/education-section.data.ts delete mode 100644 src/data/sections/education.ts rename src/data/sections/{experience.ts => experience-section.data.ts} (62%) rename src/data/sections/{favorites.ts => favorites-section.data.ts} (83%) create mode 100644 src/data/sections/index.ts rename src/data/sections/{main.ts => main-section.data.ts} (75%) rename src/data/sections/{portfolio.ts => portfolio-section.data.ts} (74%) rename src/data/sections/{skills.ts => skills-section.data.ts} (85%) rename src/data/sections/{testimonials.ts => testimonials-section.data.ts} (71%) delete mode 100644 src/data/socials.ts create mode 100644 src/data/transformers/index.ts create mode 100644 src/data/transformers/transform-data.ts create mode 100644 src/data/transformers/transformers.ts delete mode 100644 src/pages/_playground/button.astro delete mode 100644 src/pages/_playground/favorites.astro delete mode 100644 src/pages/_playground/icon-button.astro delete mode 100644 src/pages/_playground/icon.astro delete mode 100644 src/pages/_playground/image.astro delete mode 100644 src/pages/_playground/labelled-value.astro delete mode 100644 src/pages/_playground/main-section.astro delete mode 100644 src/pages/_playground/projects-timeline.astro delete mode 100644 src/pages/_playground/section-card.astro delete mode 100644 src/pages/_playground/sidebar-item.astro delete mode 100644 src/pages/_playground/skill.astro delete mode 100644 src/pages/_playground/skills-section.astro delete mode 100644 src/pages/_playground/tag.astro delete mode 100644 src/pages/_playground/testimonial.astro delete mode 100644 src/pages/_playground/testimonials-section.astro delete mode 100644 src/pages/_playground/typography.astro delete mode 100644 src/pages/_playground/work-timeline.astro create mode 100644 src/pdf/components/footer.astro create mode 100644 src/pdf/components/photo.astro delete mode 100644 src/pdf/footer.astro delete mode 100644 src/sections/education/education-item.astro delete mode 100644 src/sections/education/education-section.astro delete mode 100644 src/sections/experience/experience-section.astro delete mode 100644 src/sections/experience/work-timeline-item.astro delete mode 100644 src/sections/favorites/favorites-section.astro delete mode 100644 src/sections/favorites/video-tile.astro delete mode 100644 src/sections/portfolio/portfolio-section.astro delete mode 100644 src/sections/portfolio/project-timeline-item.astro delete mode 100644 src/sections/skills/levelled-skill-subsection.astro delete mode 100644 src/sections/skills/skill-subsection.astro delete mode 100644 src/sections/skills/skills-section.astro delete mode 100644 src/sections/testimonials/testimonials-section.astro delete mode 100644 src/types/common.ts create mode 100644 src/types/config/i18n-config.types.ts create mode 100644 src/types/config/pdf-config.types.ts create mode 100644 src/types/config/seo-config.types.ts delete mode 100644 src/types/education-section.ts delete mode 100644 src/types/experience-section.ts delete mode 100644 src/types/i18n.ts delete mode 100644 src/types/icon.ts delete mode 100644 src/types/main-section.ts delete mode 100644 src/types/pdf.ts delete mode 100644 src/types/portfolio-section.ts create mode 100644 src/types/sections/education-section.types.ts create mode 100644 src/types/sections/experience-section.types.ts rename src/types/{favorites-section.ts => sections/favorites-section.types.ts} (51%) create mode 100644 src/types/sections/main-section.types.ts create mode 100644 src/types/sections/portfolio-section.types.ts create mode 100644 src/types/sections/skills-section.types.ts create mode 100644 src/types/sections/testimonials-section.types.ts delete mode 100644 src/types/seo.ts create mode 100644 src/types/shared.ts delete mode 100644 src/types/skills-section.ts delete mode 100644 src/types/testimonials-section.ts create mode 100644 src/utils/create-link-factory.ts create mode 100644 src/utils/create-skill-factory.ts delete mode 100644 src/utils/date-formatter.ts create mode 100644 src/utils/format-date-range.ts delete mode 100644 src/utils/is-section-key.ts delete mode 100644 src/utils/remove-last.ts create mode 100644 src/web/components/description.astro rename src/{ => web}/components/divided-list.astro (100%) create mode 100644 src/web/components/divider.astro rename src/{components/button.astro => web/components/download-button.astro} (54%) rename src/{ => web}/components/icon.astro (88%) create mode 100644 src/web/components/labelled-value.astro create mode 100644 src/web/components/layout.astro create mode 100644 src/web/components/link-button.astro create mode 100644 src/web/components/photo.astro create mode 100644 src/web/components/section-card.astro rename src/{ => web}/components/sidebar-item.astro (50%) rename src/{ => web}/components/sidebar.astro (59%) create mode 100644 src/web/components/tag.astro create mode 100644 src/web/components/tags-list.astro rename src/{ => web}/components/theme-toggle.astro (100%) create mode 100644 src/web/components/timestamp.astro rename src/{ => web}/components/typography.astro (90%) rename src/{ => web}/scripts/initialize-tooltips.ts (95%) create mode 100644 src/web/sections/education/diploma.astro create mode 100644 src/web/sections/education/education-section.web.astro create mode 100644 src/web/sections/experience/experience-section.web.astro create mode 100644 src/web/sections/experience/job.astro rename src/{ => web}/sections/favorites/book-tile.astro (51%) create mode 100644 src/web/sections/favorites/favorites-section.web.astro create mode 100644 src/web/sections/favorites/favorites-sub-section.astro rename src/{ => web}/sections/favorites/media-tile.astro (60%) rename src/{ => web}/sections/favorites/person-tile.astro (56%) create mode 100644 src/web/sections/favorites/video-tile.astro rename src/{sections/main/main-section.astro => web/sections/main/main-section.web.astro} (59%) create mode 100644 src/web/sections/portfolio/portfolio-section.web.astro create mode 100644 src/web/sections/portfolio/project.astro rename src/{sections/skills/skill.astro => web/sections/skills/levelled-skill.astro} (83%) rename src/{ => web}/sections/skills/skill-level-tile.astro (76%) rename src/{ => web}/sections/skills/skill-level.astro (64%) create mode 100644 src/web/sections/skills/skill-set.astro create mode 100644 src/web/sections/skills/skills-section.web.astro rename src/{ => web}/sections/testimonials/testimonial.astro (51%) create mode 100644 src/web/sections/testimonials/testimonials-section.web.astro rename src/{ => web}/utils/env.ts (100%) rename src/{ => web}/utils/hash-state.ts (87%) rename src/{ => web}/utils/throttle.ts (100%) diff --git a/.github/workflows/check-code-quality.yml b/.github/workflows/check-code-quality.yml index 5f35be4..74f4dbe 100644 --- a/.github/workflows/check-code-quality.yml +++ b/.github/workflows/check-code-quality.yml @@ -34,3 +34,17 @@ jobs: run: npm ci - name: Run TypeScript types check run: npm run ts:check + + astro: + name: Run Astro check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro check + run: npm run astro:check diff --git a/astro.config.ts b/astro.config.ts index c94120b..f1785cb 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,8 +1,8 @@ import image from '@astrojs/image'; import tailwind from '@astrojs/tailwind'; +import compress from 'astro-compress'; import { defineConfig } from 'astro/config'; import { visualizer } from 'rollup-plugin-visualizer'; -import compress from 'astro-compress'; // https://astro.build/config export default defineConfig({ diff --git a/package-lock.json b/package-lock.json index 3ec2a97..1f2ef54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,9 @@ "astro": "1.9.2", "astro-compress": "1.1.27", "concurrently": "7.6.0", + "date-fns": "2.29.3", "iconify-icon-names": "1.1.0", + "immer": "9.0.18", "locales-ts": "1.0.0", "postcss": "8.4.21", "prettier": "2.8.2", @@ -29,6 +31,7 @@ "puppeteer-report": "3.1.0", "rollup-plugin-visualizer": "5.9.0", "tailwindcss": "3.2.4", + "type-fest": "3.5.2", "typescript": "4.9.4" }, "engines": { @@ -3976,6 +3979,16 @@ "node": ">=14.0.0" } }, + "node_modules/immer": { + "version": "9.0.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.18.tgz", + "integrity": "sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7918,6 +7931,18 @@ "node": "*" } }, + "node_modules/type-fest": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.5.2.tgz", + "integrity": "sha512-Ph7S4EhXzWy0sbljEuZo0tTNoLl+K2tPauGrQpcwUWrOVneLePTuhVzcuzVJJ6RU5DsNwQZka+8YtkXXU4z9cA==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -11971,6 +11996,12 @@ "queue": "6.0.2" } }, + "immer": { + "version": "9.0.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.18.tgz", + "integrity": "sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -14725,6 +14756,12 @@ "safe-buffer": "^5.0.1" } }, + "type-fest": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.5.2.tgz", + "integrity": "sha512-Ph7S4EhXzWy0sbljEuZo0tTNoLl+K2tPauGrQpcwUWrOVneLePTuhVzcuzVJJ6RU5DsNwQZka+8YtkXXU4z9cA==", + "dev": true + }, "typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", diff --git a/package.json b/package.json index 89b886e..50904af 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,10 @@ "dev": "astro dev", "build": "astro build", "preview": "astro preview", - "generate-cv": "node scripts/generate-cv.cjs --with-clause", + "generate-cv": "node scripts/generate-cv.cjs", "prettier:check": "prettier --check --ignore-path .gitignore .", "prettier:write": "prettier --write --ignore-path .gitignore .", + "astro:check": "astro check", "ts:check": "tsc --jsx preserve --skipLibCheck", "check": "concurrently npm:*:check" }, @@ -31,7 +32,9 @@ "astro": "1.9.2", "astro-compress": "1.1.27", "concurrently": "7.6.0", + "date-fns": "2.29.3", "iconify-icon-names": "1.1.0", + "immer": "9.0.18", "locales-ts": "1.0.0", "postcss": "8.4.21", "prettier": "2.8.2", @@ -41,6 +44,7 @@ "puppeteer-report": "3.1.0", "rollup-plugin-visualizer": "5.9.0", "tailwindcss": "3.2.4", + "type-fest": "3.5.2", "typescript": "4.9.4" } } diff --git a/public/cv.pdf b/public/cv.pdf index ac7c0aece636a136c6a0affa4ee8df679d20bd59..f50b9f2f34513279fa48b6de9e1b27a2640d3857 100644 GIT binary patch delta 52114 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 z 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 delta 55608 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 Q(@=+M@Ljob&)n!g05kG5u>b%7 diff --git a/scripts/generate-cv.cjs b/scripts/generate-cv.cjs index 52b4a1d..31332ad 100644 --- a/scripts/generate-cv.cjs +++ b/scripts/generate-cv.cjs @@ -25,10 +25,6 @@ const config = { margin: { top: '10mm', right: '10mm', bottom: '10mm', left: '10mm' }, }; -const hasClause = process.argv.includes('--with-clause'); - -const url = hasClause ? 'http://localhost:3000/pdf?clause' : 'http://localhost:3000/pdf'; - const main = async () => { const child = exec('npm run dev'); @@ -39,7 +35,7 @@ const main = async () => { await page.setViewport({ width: 794, height: 1122, deviceScaleFactor: 2 }); await retry({ - promise: () => page.goto(url, { waitUntil: 'networkidle0' }), + promise: () => page.goto('http://localhost:3000/pdf', { waitUntil: 'networkidle0' }), retries: 5, retryTime: 1000, }); diff --git a/src/components/divider.astro b/src/components/divider.astro deleted file mode 100644 index cefb78b..0000000 --- a/src/components/divider.astro +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/src/components/icon-button.astro b/src/components/icon-button.astro deleted file mode 100644 index 4775de1..0000000 --- a/src/components/icon-button.astro +++ /dev/null @@ -1,32 +0,0 @@ ---- -import type { IconName } from '@/types/icon'; - -import Icon from './icon.astro'; - -type IconButtonSize = 'small' | 'large'; - -export interface Props { - icon: IconName; - target?: astroHTML.JSX.AnchorHTMLAttributes['target']; - href: string; - size: IconButtonSize; - 'aria-label'?: astroHTML.JSX.AnchorHTMLAttributes['aria-label']; -} - -const sizeMap: Record = { - small: 'w-7 h-7', - large: 'w-9 h-9', -}; - -const { icon, href, target, size, ...rest } = Astro.props; - -const classes = /* tw */ { - main: 'flex items-center justify-center rounded text-gray-400 bg-gray-100 dark:bg-gray-600 dark:text-gray-200', - active: 'active:translate-y-px', - focus: 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500', -}; ---- - - - - diff --git a/src/components/labelled-value.astro b/src/components/labelled-value.astro deleted file mode 100644 index c1c5fda..0000000 --- a/src/components/labelled-value.astro +++ /dev/null @@ -1,13 +0,0 @@ ---- -export interface Props { - label: string; - value: string | string[]; -} - -const { label, value } = Astro.props; ---- - -
- {label}: - {value} -
diff --git a/src/components/photo.astro b/src/components/photo.astro deleted file mode 100644 index c471ecc..0000000 --- a/src/components/photo.astro +++ /dev/null @@ -1,28 +0,0 @@ ---- -import { Image } from '@astrojs/image/components'; - -import type { Photo } from '@/types/common'; - -export interface Props { - src: Photo; - alt: string; - class?: string; - loading?: 'eager' | 'lazy'; - width?: number; - height?: number; -} - -const { src, loading, ...props } = Astro.props; - -const className = Astro.props.class ?? ''; - -const isRemoteImage = typeof src === 'string'; ---- - -{ - isRemoteImage ? ( - - ) : ( - - ) -} diff --git a/src/components/section-card.astro b/src/components/section-card.astro deleted file mode 100644 index 698904c..0000000 --- a/src/components/section-card.astro +++ /dev/null @@ -1,47 +0,0 @@ ---- -import type { SectionKey } from '@/types/data'; - -import Typography from './typography.astro'; - -export interface Props { - section: SectionKey; - title?: string; - className?: string; -} - -const { section, title, className } = Astro.props; ---- - -
- { - title && ( - - {title} - - ) - } - -
- - diff --git a/src/components/tag.astro b/src/components/tag.astro deleted file mode 100644 index 66bfbdd..0000000 --- a/src/components/tag.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import type { IconName } from '@/types/icon'; - -import Icon from './icon.astro'; - -export interface Props { - name?: IconName; - color?: string; -} - -const { name, color } = Astro.props; ---- - -
- {name && } - -
diff --git a/src/components/tags-list.astro b/src/components/tags-list.astro deleted file mode 100644 index bccf614..0000000 --- a/src/components/tags-list.astro +++ /dev/null @@ -1,29 +0,0 @@ ---- -import type { Tag } from '@/types/common'; - -import TagComponent from './tag.astro'; - -export interface Props { - tags: Tag[]; -} - -const { tags } = Astro.props; ---- - -
- { - tags.map(({ name: tagName, icon, iconColor, url }) => - url ? ( - - - {tagName} - - - ) : ( - - {tagName} - - ) - ) - } -
diff --git a/src/components/timestamp.astro b/src/components/timestamp.astro deleted file mode 100644 index c67bc1d..0000000 --- a/src/components/timestamp.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -import getDateFormatter from '@/utils/date-formatter'; -import Typography from './typography.astro'; - -export interface Props { - startDate: Date; - endDate: Date | null; - locale: string; - translationForNow: string; -} -const { startDate, endDate, locale, translationForNow } = Astro.props; -const getFormattedDate = getDateFormatter(locale); ---- - - - {getFormattedDate(startDate).concat(' - ', endDate ? getFormattedDate(endDate) : translationForNow)} - diff --git a/src/data/config.ts b/src/data/config.ts new file mode 100644 index 0000000..463b18c --- /dev/null +++ b/src/data/config.ts @@ -0,0 +1,25 @@ +import type { Config } from '@/types/data'; +import enUS from 'date-fns/locale/en-US/index.js'; +import type { ReadonlyDeep } from 'type-fest'; + +const config = { + i18n: { + locale: enUS, + dateFormat: 'MMMM yyyy', + translations: { + now: 'now', + }, + }, + seo: { + title: 'Mark Freeman - Senior React Developer', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sodales ac dui at vestibulum. In condimentum metus id dui tincidunt, in blandit mi vehicula.', + favicon: '/favicon.svg', + }, + pdf: { + footer: + 'I hereby give consent for my personal data included in my application to be processed for the purposes of the recruitment process.', + }, +} as const satisfies ReadonlyDeep; + +export default config; diff --git a/src/data/cv.ts b/src/data/cv.ts new file mode 100644 index 0000000..997a3db --- /dev/null +++ b/src/data/cv.ts @@ -0,0 +1,11 @@ +import type { ReadonlyDeep } from 'type-fest'; +import type { Data } from '@/types/data'; +import transformData from './transformers/transform-data'; +import configData from './config'; +import sectionsData from './sections'; + +const data = { config: configData, sections: sectionsData } as const satisfies ReadonlyDeep; + +export type PreciseData = typeof data; + +export const cv = transformData(data); diff --git a/src/data/helpers/links.ts b/src/data/helpers/links.ts new file mode 100644 index 0000000..2b2380e --- /dev/null +++ b/src/data/helpers/links.ts @@ -0,0 +1,146 @@ +// GENERAL + +import createLinkFactory from '@/utils/create-link-factory'; + +export const facebook = createLinkFactory({ + name: 'Facebook', + icon: 'fa6-brands:facebook-f', +}); + +export const linkedin = createLinkFactory({ + name: 'LinkedIn', + icon: 'fa6-brands:linkedin-in', +}); + +export const twitter = createLinkFactory({ + name: 'Twitter', + icon: 'fa6-brands:twitter', +}); + +export const pinterest = createLinkFactory({ + name: 'Pinterest', + icon: 'fa6-brands:pinterest', +}); + +// CODE + +export const github = createLinkFactory({ + name: 'GitHub', + icon: 'fa6-brands:github', +}); + +export const codepen = createLinkFactory({ + name: 'CodePen', + icon: 'fa6-brands:codepen', +}); + +export const stackblitz = createLinkFactory({ + name: 'StackBlitz', + icon: 'simple-icons:stackblitz', +}); + +export const codesandbox = createLinkFactory({ + name: 'CodeSandbox', + icon: 'simple-icons:codesandbox', +}); + +// BLOG + +export const dev = createLinkFactory({ + name: 'Dev', + icon: 'fa6-brands:dev', +}); + +export const medium = createLinkFactory({ + name: 'Medium', + icon: 'fa6-brands:medium', +}); + +// FORUM / CHAT + +export const reddit = createLinkFactory({ + name: 'Reddit', + icon: 'fa6-brands:reddit', +}); + +export const quora = createLinkFactory({ + name: 'Quora', + icon: 'fa6-brands:quora', +}); + +export const stackoverflow = createLinkFactory({ + name: 'Stack Overflow', + icon: 'fa6-brands:stack-overflow', +}); + +// DESIGN + +export const instagram = createLinkFactory({ + name: 'Instagram', + icon: 'fa6-brands:instagram', +}); +export const behance = createLinkFactory({ + name: 'Behance', + icon: 'fa6-brands:behance', +}); + +export const dribbble = createLinkFactory({ + name: 'Dribbble', + icon: 'fa6-brands:dribbble', +}); + +export const figma = createLinkFactory({ + name: 'Figma', + icon: 'fa6-brands:figma', +}); + +// MUSIC + +export const spotify = createLinkFactory({ + name: 'Spotify', + icon: 'fa6-brands:spotify', +}); + +export const soundcloud = createLinkFactory({ + name: 'SoundCloud', + icon: 'fa6-brands:soundcloud', +}); + +// VIDEO + +export const youtube = createLinkFactory({ + name: 'YouTube', + icon: 'fa6-brands:youtube', +}); + +export const twitch = createLinkFactory({ + name: 'Twitch', + icon: 'fa6-brands:twitch', +}); + +export const vimeo = createLinkFactory({ + name: 'Vimeo', + icon: 'fa6-brands:vimeo', +}); + +// PROJECT TYPE + +export const website = createLinkFactory({ + name: 'Website', + icon: 'fa6-solid:globe', +}); + +export const demo = createLinkFactory({ + name: 'App demo', + icon: 'fa6-solid:desktop', +}); + +export const mockups = createLinkFactory({ + name: 'Mockups', + icon: 'fa6-solid:image', +}); + +export const repository = createLinkFactory({ + name: 'Repository', + icon: 'fa6-solid:code-branch', +}); diff --git a/src/data/skills.ts b/src/data/helpers/skills.ts similarity index 66% rename from src/data/skills.ts rename to src/data/helpers/skills.ts index 3294c72..26c3126 100644 --- a/src/data/skills.ts +++ b/src/data/helpers/skills.ts @@ -1,159 +1,146 @@ -import type { LevelledSkill } from '@/types/skills-section'; +import createSkillFactory from '@/utils/create-skill-factory'; -import type { Tag } from '../types/common'; - -interface SkillFactory { - (data: Partial & { level: LevelledSkill['level'] }): LevelledSkill; - (data?: Partial): Tag; -} - -const createSkill = (defaultData: Omit) => - ((data?: Partial & { level?: LevelledSkill['level'] }): Tag | LevelledSkill => ({ - ...defaultData, - ...data, - })) as SkillFactory; - -export const apolloGraphql = createSkill({ +export const apolloGraphql = createSkillFactory({ name: 'Apollo GraphQL', icon: 'simple-icons:apollographql', iconColor: '#311C87', url: 'https://www.apollographql.com/', }); -export const astro = createSkill({ +export const astro = createSkillFactory({ name: 'Astro', icon: 'simple-icons:astro', iconColor: '#FF5D01', url: 'https://astro.build/', }); -export const chakraUi = createSkill({ +export const chakraUi = createSkillFactory({ name: 'Chakra UI', icon: 'simple-icons:chakraui', iconColor: '#319795', url: 'https://chakra-ui.com/', }); -export const cypress = createSkill({ +export const cypress = createSkillFactory({ name: 'Cypress', icon: 'simple-icons:cypress', iconColor: '#17202C', url: 'https://www.cypress.io/', }); -export const eslint = createSkill({ +export const eslint = createSkillFactory({ name: 'ESLint', icon: 'simple-icons:eslint', iconColor: '#4B32C3', url: 'https://eslint.org/', }); -export const firebase = createSkill({ +export const firebase = createSkillFactory({ name: 'Firebase', icon: 'simple-icons:firebase', iconColor: '#FFCA28', url: 'https://firebase.google.com/', }); -export const jest = createSkill({ +export const jest = createSkillFactory({ name: 'Jest', icon: 'simple-icons:jest', iconColor: '#C21325', url: 'https://jestjs.io/', }); -export const mongoDb = createSkill({ +export const mongoDb = createSkillFactory({ name: 'MongoDB', icon: 'simple-icons:mongodb', iconColor: '#47A248', url: 'https://www.mongodb.com/', }); -export const nestJs = createSkill({ +export const nestJs = createSkillFactory({ name: 'NestJS', icon: 'simple-icons:nestjs', iconColor: '#E0234E', url: 'https://nestjs.com/', }); -export const nextJs = createSkill({ +export const nextJs = createSkillFactory({ name: 'Next.js', icon: 'simple-icons:nextdotjs', iconColor: '#000000', url: 'https://nextjs.org/', }); -export const nx = createSkill({ +export const nx = createSkillFactory({ name: 'Nx', icon: 'simple-icons:nx', iconColor: '#143055', url: 'https://nx.dev/', }); -export const pnpm = createSkill({ +export const pnpm = createSkillFactory({ name: 'pnpm', icon: 'simple-icons:pnpm', iconColor: '#F69220', url: 'https://pnpm.io/', }); -export const postgreSql = createSkill({ +export const postgreSql = createSkillFactory({ name: 'PostgreSQL', icon: 'simple-icons:postgresql', iconColor: '#4169E1', url: 'https://www.postgresql.org/', }); -export const prettier = createSkill({ +export const prettier = createSkillFactory({ name: 'Prettier', icon: 'simple-icons:prettier', iconColor: '#F7B93E', url: 'https://prettier.io/', }); -export const react = createSkill({ +export const react = createSkillFactory({ name: 'React.js', icon: 'simple-icons:react', iconColor: '#61DAFB', url: 'https://reactjs.org/', }); -export const reactQuery = createSkill({ +export const reactQuery = createSkillFactory({ name: 'React Query', icon: 'simple-icons:reactquery', iconColor: '#FF4154', url: 'https://tanstack.com/query', }); -export const sass = createSkill({ +export const sass = createSkillFactory({ name: 'SASS', icon: 'simple-icons:sass', iconColor: '#CC6699', url: 'https://sass-lang.com/', }); -export const supabase = createSkill({ +export const supabase = createSkillFactory({ name: 'Supabase', icon: 'simple-icons:supabase', iconColor: '#3ECF8E', url: 'https://supabase.io/', }); -export const tailwindCss = createSkill({ +export const tailwindCss = createSkillFactory({ name: 'Tailwind CSS', icon: 'simple-icons:tailwindcss', iconColor: '#06B6D4', url: 'https://tailwindcss.com/', }); -export const typescript = createSkill({ +export const typescript = createSkillFactory({ name: 'TypeScript', icon: 'simple-icons:typescript', iconColor: '#3178C6', url: 'https://www.typescriptlang.org/', }); -export const vue = createSkill({ +export const vue = createSkillFactory({ name: 'Vue.js', icon: 'simple-icons:vuedotjs', iconColor: '#4FC08D', diff --git a/src/data/index.ts b/src/data/index.ts deleted file mode 100644 index 2cb21b7..0000000 --- a/src/data/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { EducationSection } from '@/types/education-section'; -import type { ExperienceSection } from '@/types/experience-section'; -import type { FavoritesSection } from '@/types/favorites-section'; -import type { Pdf } from '@/types/pdf'; -import type { I18n } from '@/types/i18n'; -import type { MainSection } from '@/types/main-section'; -import type { PortfolioSection } from '@/types/portfolio-section'; -import type { Seo } from '@/types/seo'; -import type { SkillsSection } from '@/types/skills-section'; -import type { TestimonialsSection } from '@/types/testimonials-section'; - -import educationData from './sections/education'; -import experienceData from './sections/experience'; -import favoritesData from './sections/favorites'; -import mainData from './sections/main'; -import portfolioData from './sections/portfolio'; -import skillsData from './sections/skills'; -import testimonialsData from './sections/testimonials'; - -export interface Data { - i18n: I18n; - seo: Seo; - pdf: Pdf; - main: MainSection; - skills?: SkillsSection; - experience?: ExperienceSection; - portfolio?: PortfolioSection; - education?: EducationSection; - testimonials?: TestimonialsSection; - favorites?: FavoritesSection; -} - -const data: Data = { - i18n: { - locale: 'en-US', - translations: { - now: 'now', - }, - }, - seo: { - title: 'Mark Freeman - Senior React Developer', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sodales ac dui at vestibulum. In condimentum metus id dui tincidunt, in blandit mi vehicula.', - }, - pdf: { - footer: - 'I hereby give consent for my personal data included in my application to be processed for the purposes of the recruitment process.', - }, - main: mainData, - skills: skillsData, - experience: experienceData, - portfolio: portfolioData, - education: educationData, - testimonials: testimonialsData, - favorites: favoritesData, -}; - -export default data; diff --git a/src/data/sections/education-section.data.ts b/src/data/sections/education-section.data.ts new file mode 100644 index 0000000..ca6af21 --- /dev/null +++ b/src/data/sections/education-section.data.ts @@ -0,0 +1,30 @@ +import type { EducationSection } from '@/types/sections/education-section.types'; +import type { ReadonlyDeep } from 'type-fest'; +import { website } from '../helpers/links'; + +const educationSectionData = { + config: { + title: 'Education', + slug: 'education', + icon: 'fa6-solid:graduation-cap', + visible: true, + }, + diplomas: [ + { + title: 'Information Technology', + institution: 'Wrocław University of Science and Technology', + dates: [new Date('2014.10'), new Date('2016.07')], + description: 'Master degree. Specialization in software development.', + links: [website({ url: '#' })], + }, + { + title: 'Information Technology', + institution: 'Wrocław University of Science and Technology', + dates: [new Date('2011.10'), new Date('2014.07')], + description: "Bachelor's degree. Specialization in application development.", + links: [website({ url: '#' })], + }, + ], +} as const satisfies ReadonlyDeep; + +export default educationSectionData; diff --git a/src/data/sections/education.ts b/src/data/sections/education.ts deleted file mode 100644 index 33bceec..0000000 --- a/src/data/sections/education.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { EducationSection } from '@/types/education-section'; - -import { website } from '../socials'; - -const educationData: EducationSection = { - config: { - title: 'Education', - icon: 'fa6-solid:graduation-cap', - }, - educationItems: [ - { - title: 'Information Technology', - institution: 'Wrocław University of Science and Technology', - startDate: new Date('2014.10'), - endDate: new Date('2016.07'), - description: 'Master degree. Specialization in software development.', - socials: [website('#')], - }, - { - title: 'Information Technology', - institution: 'Wrocław University of Science and Technology', - startDate: new Date('2011.10'), - endDate: new Date('2014.07'), - description: "Bachelor's degree. Specialization in application development.", - socials: [website('#')], - }, - ], -}; - -export default educationData; diff --git a/src/data/sections/experience.ts b/src/data/sections/experience-section.data.ts similarity index 62% rename from src/data/sections/experience.ts rename to src/data/sections/experience-section.data.ts index 079fcb2..46d2f39 100644 --- a/src/data/sections/experience.ts +++ b/src/data/sections/experience-section.data.ts @@ -1,5 +1,6 @@ -import type { ExperienceSection } from '@/types/experience-section'; - +import type { ExperienceSection } from '@/types/sections/experience-section.types'; +import type { ReadonlyDeep } from 'type-fest'; +import { facebook, github, instagram, linkedin, twitter, website } from '../helpers/links'; import { chakraUi, eslint, @@ -12,20 +13,20 @@ import { tailwindCss, typescript, vue, -} from '../skills'; -import { facebook, github, instagram, linkedin, twitter, website } from '../socials'; +} from '../helpers/skills'; -const experienceData: ExperienceSection = { +const experienceSectionData = { config: { title: 'Work experience', + slug: 'experience', icon: 'fa6-solid:suitcase', + visible: true, }, jobs: [ { role: 'Senior front-end developer', company: 'Google', - startDate: new Date('2020-02'), - endDate: null, + dates: [new Date('2020-02'), null], description: [ 'In tristique vulputate augue vel egestas.', 'Quisque ac imperdiet tortor, at lacinia ex.', @@ -34,38 +35,45 @@ const experienceData: ExperienceSection = { 'Nunc malesuada leo et est iaculis facilisis.', 'Fusce eu urna ut magna malesuada fringilla.', ], - tags: [react(), nextJs(), typescript(), nx(), firebase()], - socials: [facebook('#'), linkedin('#')], + tagsList: { + title: 'Technologies', + tags: [react(), nextJs(), typescript(), nx(), firebase()], + }, + links: [facebook({ url: '#' }), linkedin({ url: '#' })], }, { role: 'React.js developer', company: 'Facebook', - startDate: new Date('2019-04'), - endDate: new Date('2020-02'), + dates: [new Date('2019-04'), new Date('2020-02')], description: [ 'Aenean eget ultricies felis. Pellentesque dictum massa ut tellus eleifend, sed posuere massa mattis.', 'Ut posuere massa lacus, eleifend molestie tortor auctor vel.', 'Sed sed sollicitudin eros, id ultricies mi. Aliquam sodales elit vel ante tempor, non vehicula nibh facilisis.', 'Cras feugiat ultricies maximus. Aliquam tristique ex odio, ac semper urna accumsan a.', ], - tags: [react(), reactQuery(), chakraUi(), eslint()], - socials: [website('#'), instagram('#')], + tagsList: { + title: 'Technologies', + tags: [react(), reactQuery(), chakraUi(), eslint()], + }, + links: [website({ url: '#' }), instagram({ url: '#' })], }, { role: 'Junior front-end developer', company: 'GitLab', - startDate: new Date('2016-09'), - endDate: new Date('2019-04'), + dates: [new Date('2016-09'), new Date('2019-04')], description: [ 'Nulla volutpat justo ante, rhoncus posuere massa egestas in.', 'Quisque pellentesque, dolor nec sollicitudin iaculis, sem velit consequat ligula, eget tempus ligula leo et est.', 'Maecenas ut elit sit amet nibh maximus condimentum in nec lorem. Pellentesque tincidunt odio vel leo suscipit, in interdum mi gravida.', 'Donec non vulputate augue.', ], - tags: [vue(), tailwindCss(), pnpm()], - socials: [twitter('#'), github('#')], + tagsList: { + title: 'Technologies', + tags: [vue(), tailwindCss(), pnpm()], + }, + links: [twitter({ url: '#' }), github({ url: '#' })], }, ], -}; +} as const satisfies ReadonlyDeep; -export default experienceData; +export default experienceSectionData; diff --git a/src/data/sections/favorites.ts b/src/data/sections/favorites-section.data.ts similarity index 83% rename from src/data/sections/favorites.ts rename to src/data/sections/favorites-section.data.ts index bcb6a6c..503869f 100644 --- a/src/data/sections/favorites.ts +++ b/src/data/sections/favorites-section.data.ts @@ -1,33 +1,36 @@ -import type { FavoritesSection } from '@/types/favorites-section'; +import type { FavoritesSection } from '@/types/sections/favorites-section.types'; +import type { ReadonlyDeep } from 'type-fest'; -const favoritesData: FavoritesSection = { +const favoritesSectionData = { config: { title: 'My favorites', + slug: 'favorites', icon: 'fa6-solid:star', + visible: true, }, books: { title: 'Books I read', data: [ { - cover: import('@/assets/favorites/books/book-1.jpeg'), + image: import('@/assets/favorites/books/book-1.jpeg'), title: 'The Pragmatic Programmer: From Journeyman to Master', author: 'Andy Hunt, Dave Thomas', url: 'https://www.goodreads.com/book/show/4099.The_Pragmatic_Programmer', }, { - cover: 'https://m.media-amazon.com/images/I/61aFldsgAmL._SY344_BO1,204,203,200_QL70_ML2_.jpg', + image: 'https://m.media-amazon.com/images/I/61aFldsgAmL._SY344_BO1,204,203,200_QL70_ML2_.jpg', title: 'Domain-Driven Design: Tackling Complexity in the Heart of Software', author: 'Eric Evans', url: 'https://www.goodreads.com/book/show/179133.Domain_Driven_Design', }, { - cover: import('@/assets/favorites/books/book-3.jpeg'), + image: import('@/assets/favorites/books/book-3.jpeg'), title: 'Clean Code: A Handbook of Agile Software Craftsmanship', author: 'Robert C. Martin', url: 'https://www.goodreads.com/book/show/3735293-clean-code', }, { - cover: import('@/assets/favorites/books/book-4.jpeg'), + image: import('@/assets/favorites/books/book-4.jpeg'), title: 'The Clean Coder: A Code of Conduct for Professional Programmers', author: 'Robert C. Martin', url: 'https://www.goodreads.com/book/show/10284614-the-clean-coder', @@ -73,17 +76,17 @@ const favoritesData: FavoritesSection = { title: 'Videos I watched', data: [ { - thumbnail: import('@/assets/favorites/videos/video-1.jpeg'), + image: import('@/assets/favorites/videos/video-1.jpeg'), title: 'Building Resilient Frontend Architecture • Monica Lent • GOTO 2019', url: 'https://youtu.be/TqfbAXCCVwE', }, { - thumbnail: import('@/assets/favorites/videos/video-2.jpeg'), + image: import('@/assets/favorites/videos/video-2.jpeg'), title: 'Scaling Yourself • Scott Hanselman • GOTO 2012', url: 'https://youtu.be/FS1mnISoG7U', }, { - thumbnail: import('@/assets/favorites/videos/video-3.jpeg'), + image: import('@/assets/favorites/videos/video-3.jpeg'), title: "Why Isn't Functional Programming the Norm? - Richard Feldman", url: 'https://youtu.be/QyJZzq0v7Z4', }, @@ -130,6 +133,6 @@ const favoritesData: FavoritesSection = { }, ], }, -}; +} as const satisfies ReadonlyDeep; -export default favoritesData; +export default favoritesSectionData; diff --git a/src/data/sections/index.ts b/src/data/sections/index.ts new file mode 100644 index 0000000..7b2e539 --- /dev/null +++ b/src/data/sections/index.ts @@ -0,0 +1,21 @@ +import type { Sections } from '@/types/data'; +import type { ReadonlyDeep } from 'type-fest'; +import educationData from './education-section.data'; +import experienceData from './experience-section.data'; +import favoritesData from './favorites-section.data'; +import mainData from './main-section.data'; +import portfolioData from './portfolio-section.data'; +import skillsData from './skills-section.data'; +import testimonialsData from './testimonials-section.data'; + +export const sections = { + main: mainData, + skills: skillsData, + experience: experienceData, + portfolio: portfolioData, + education: educationData, + testimonials: testimonialsData, + favorites: favoritesData, +} as const satisfies ReadonlyDeep; + +export default sections; diff --git a/src/data/sections/main.ts b/src/data/sections/main-section.data.ts similarity index 75% rename from src/data/sections/main.ts rename to src/data/sections/main-section.data.ts index adf2f41..f5097ea 100644 --- a/src/data/sections/main.ts +++ b/src/data/sections/main-section.data.ts @@ -1,11 +1,13 @@ -import type { MainSection } from '@/types/main-section'; +import type { MainSection } from '@/types/sections/main-section.types'; +import type { ReadonlyDeep } from 'type-fest'; +import { facebook, github, linkedin, twitter } from '../helpers/links'; -import { facebook, github, linkedin, twitter } from '../socials'; - -const mainData: MainSection = { +const mainSectionData = { config: { icon: 'fa6-solid:user', title: 'Profile', + slug: 'profile', + visible: true, }, image: import('@/assets/my-image.jpeg'), fullName: 'Mark Freeman', @@ -29,8 +31,9 @@ const mainData: MainSection = { action: { label: 'Download CV', url: '/cv.pdf', + downloadedFileName: 'CV-Mark_Freeman.pdf', }, - socials: [facebook('#'), github('#'), linkedin('#'), twitter('#')], -}; + links: [facebook({ url: '#' }), github({ url: '#' }), linkedin({ url: '#' }), twitter({ url: '#' })], +} as const satisfies ReadonlyDeep; -export default mainData; +export default mainSectionData; diff --git a/src/data/sections/portfolio.ts b/src/data/sections/portfolio-section.data.ts similarity index 74% rename from src/data/sections/portfolio.ts rename to src/data/sections/portfolio-section.data.ts index f098878..ab25217 100644 --- a/src/data/sections/portfolio.ts +++ b/src/data/sections/portfolio-section.data.ts @@ -1,5 +1,6 @@ -import type { PortfolioSection } from '@/types/portfolio-section'; - +import type { PortfolioSection } from '@/types/sections/portfolio-section.types'; +import type { ReadonlyDeep } from 'type-fest'; +import { demo, github, mockups, website } from '../helpers/links'; import { chakraUi, eslint, @@ -15,20 +16,20 @@ import { sass, tailwindCss, typescript, -} from '../skills'; -import { demo, github, mockups, website } from '../socials'; +} from '../helpers/skills'; -const portfolioData: PortfolioSection = { +const portfolioSectionData = { config: { title: 'Projects', + slug: 'projects', icon: 'fa6-solid:rocket', + visible: true, }, projects: [ { name: 'Golden Bulls', image: import('@/assets/portfolio/project-1.jpeg'), - startDate: new Date('2020-03'), - endDate: null, + dates: [new Date('2020-03'), null], details: [ { label: 'Team size', value: '1 person' }, { label: 'My role', value: ['Front-end Developer', 'Designer'] }, @@ -41,14 +42,16 @@ const portfolioData: PortfolioSection = { ], description: 'In tristique vulputate augue vel egestas. Quisque ac imperdiet tortor, at lacinia ex. Duis vel ex hendrerit, commodo odio sed, aliquam enim. Ut arcu nulla, tincidunt eget arcu eget, molestie vulputate nisi. Nunc malesuada leo et est iaculis facilisis.', - tags: [nextJs(), sass(), pnpm(), eslint(), prettier()], - socials: [mockups('#'), demo('#')], + tagsList: { + title: 'Technologies', + tags: [nextJs(), sass(), pnpm(), eslint(), prettier()], + }, + links: [mockups({ url: '#' }), demo({ url: '#' })], }, { name: 'TruQuest', image: import('@/assets/portfolio/project-2.jpeg'), - startDate: new Date('2019-06'), - endDate: new Date('2020-02'), + dates: [new Date('2019-06'), new Date('2020-02')], details: [ { label: 'Team size', value: '7 people' }, { label: 'My role', value: ['Front-end Developer', 'Mobile Developer', 'Designer'] }, @@ -61,14 +64,16 @@ const portfolioData: PortfolioSection = { ], description: 'Ut ultricies tortor at sodales aliquam. Vivamus metus ante, fringilla nec ligula in, suscipit rhoncus mauris. Praesent hendrerit velit odio, at accumsan urna faucibus convallis. Nunc at massa eget ligula volutpat dictum a sit amet libero. Vestibulum iaculis molestie maximus. In hac habitasse platea dictumst.', - tags: [react(), tailwindCss(), nestJs(), postgreSql()], - socials: [mockups('#'), demo('#')], + tagsList: { + title: 'Technologies', + tags: [react(), tailwindCss(), nestJs(), postgreSql()], + }, + links: [mockups({ url: '#' }), demo({ url: '#' })], }, { name: 'Software Chasers', image: import('@/assets/portfolio/project-3.jpeg'), - startDate: new Date('2018-01'), - endDate: new Date('2020-12'), + dates: [new Date('2018-01'), new Date('2020-12')], details: [ { label: 'Team size', value: '3 people' }, { label: 'My role', value: ['Front-end Developer', 'Designer'] }, @@ -81,14 +86,16 @@ const portfolioData: PortfolioSection = { ], description: 'Quisque id consectetur eros. In hac habitasse platea dictumst. Sed eu pulvinar orci. Mauris consequat, est in dignissim varius, neque nisl commodo mauris, id blandit risus justo eu nulla.', - tags: [react(), chakraUi(), typescript(), nx(), pnpm()], - socials: [website('#'), github('#')], + tagsList: { + title: 'Technologies', + tags: [react(), chakraUi(), typescript(), nx(), pnpm()], + }, + links: [website({ url: '#' }), github({ url: '#' })], }, { name: 'Disco Ninjas', image: import('@/assets/portfolio/project-4.jpeg'), - startDate: new Date('2016-05'), - endDate: new Date('2018-07'), + dates: [new Date('2016-05'), new Date('2018-07')], details: [ { label: 'Team size', value: '11 people' }, { label: 'My role', value: 'Front-end Developer' }, @@ -101,10 +108,13 @@ const portfolioData: PortfolioSection = { ], description: 'Praesent eu neque tortor. Vestibulum ac magna nisl. Vivamus massa sem, feugiat in pharetra non, convallis egestas purus. Ut consequat ullamcorper sem, in euismod nibh posuere ut. ', - tags: [typescript(), jest(), firebase()], - socials: [mockups('#'), github('#')], + tagsList: { + title: 'Technologies', + tags: [typescript(), jest(), firebase()], + }, + links: [mockups({ url: '#' }), github({ url: '#' })], }, ], -}; +} as const satisfies ReadonlyDeep; -export default portfolioData; +export default portfolioSectionData; diff --git a/src/data/sections/skills.ts b/src/data/sections/skills-section.data.ts similarity index 85% rename from src/data/sections/skills.ts rename to src/data/sections/skills-section.data.ts index 1fcf4aa..52289b4 100644 --- a/src/data/sections/skills.ts +++ b/src/data/sections/skills-section.data.ts @@ -1,5 +1,5 @@ -import type { SkillsSection } from '@/types/skills-section'; - +import type { SkillsSection } from '@/types/sections/skills-section.types'; +import type { ReadonlyDeep } from 'type-fest'; import { apolloGraphql, astro, @@ -17,17 +17,18 @@ import { supabase, tailwindCss, typescript, -} from '../skills'; +} from '../helpers/skills'; -const skillsData: SkillsSection = { +const skillsSectionData = { config: { title: 'Skills', + slug: 'skills', icon: 'fa6-solid:bars-progress', + visible: true, }, skillSets: [ { title: 'I already know', - pdfTitle: 'Technologies', skills: [ react({ level: 5, @@ -63,12 +64,10 @@ const skillsData: SkillsSection = { }, { title: 'I want to learn', - excludeFromPdf: true, skills: [apolloGraphql(), astro(), supabase(), cypress()], }, { title: 'I speak', - pdfTitle: 'Languages', skills: [ { icon: 'circle-flags:pl', name: 'Polish - native' }, { icon: 'circle-flags:us', name: 'English - C1' }, @@ -76,6 +75,6 @@ const skillsData: SkillsSection = { ], }, ], -}; +} as const satisfies ReadonlyDeep; -export default skillsData; +export default skillsSectionData; diff --git a/src/data/sections/testimonials.ts b/src/data/sections/testimonials-section.data.ts similarity index 71% rename from src/data/sections/testimonials.ts rename to src/data/sections/testimonials-section.data.ts index bedbd5c..a73c6f6 100644 --- a/src/data/sections/testimonials.ts +++ b/src/data/sections/testimonials-section.data.ts @@ -1,11 +1,13 @@ -import type { TestimonialsSection } from '@/types/testimonials-section'; +import type { TestimonialsSection } from '@/types/sections/testimonials-section.types'; +import type { ReadonlyDeep } from 'type-fest'; +import { github, linkedin, website } from '../helpers/links'; -import { github, linkedin, website } from '../socials'; - -const testimonialsData: TestimonialsSection = { +const testimonialsSectionData = { config: { title: 'Testimonials', + slug: 'testimonials', icon: 'fa6-solid:comment', + visible: true, }, testimonials: [ { @@ -14,7 +16,7 @@ const testimonialsData: TestimonialsSection = { relation: 'We work together as front-end developers at Google', content: 'In nec mattis sem. Morbi purus lorem, euismod ac varius at, aliquet vitae augue. Pellentesque ut facilisis felis. In sed dui blandit, aliquet odio eu, elementum leo. In facilisis dapibus tortor ac volutpat. Cras cursus nec odio maximus elementum.', - socials: [github('#'), linkedin('#')], + links: [github({ url: '#' }), linkedin({ url: '#' })], }, { image: import('@/assets/testimonials/testimonial-2.jpeg'), @@ -22,7 +24,7 @@ const testimonialsData: TestimonialsSection = { relation: 'My project manager at GitLab', content: 'Praesent nec congue elit. Vestibulum lobortis congue ipsum, a gravida mi tempus ac. Mauris aliquet purus nibh, vel varius turpis tempus non. Nullam eget ultricies orci. Quisque nulla ante, auctor eget varius ac, imperdiet nec magna.', - socials: [linkedin('#')], + links: [linkedin({ url: '#' })], }, { image: import('@/assets/testimonials/testimonial-3.jpeg'), @@ -30,9 +32,9 @@ const testimonialsData: TestimonialsSection = { relation: 'My customer for sidewing.com website', content: 'Mauris tincidunt at purus vehicula porta. Mauris eget mollis turpis. Sed iaculis rutrum pharetra. Vivamus risus quam, suscipit et semper ut, aliquet ut tellus. Donec quis auctor nunc.', - socials: [github('#'), website('#')], + links: [github({ url: '#' }), website({ url: '#' })], }, ], -}; +} as const satisfies ReadonlyDeep; -export default testimonialsData; +export default testimonialsSectionData; diff --git a/src/data/socials.ts b/src/data/socials.ts deleted file mode 100644 index a0383a5..0000000 --- a/src/data/socials.ts +++ /dev/null @@ -1,200 +0,0 @@ -import type { Social } from '../types/common'; - -type SocialWithoutUrl = Omit; - -// GENERAL - -export const facebook = (url: string, override?: Partial): Social => ({ - name: 'Facebook', - icon: 'fa6-brands:facebook-f', - url, - ...override, -}); - -export const linkedin = (url: string, override?: Partial): Social => ({ - name: 'LinkedIn', - icon: 'fa6-brands:linkedin-in', - url, - ...override, -}); - -export const twitter = (url: string, override?: Partial): Social => ({ - name: 'Twitter', - icon: 'fa6-brands:twitter', - url, - ...override, -}); - -export const pinterest = (url: string, override?: Partial): Social => ({ - name: 'Pinterest', - icon: 'fa6-brands:pinterest', - url, - ...override, -}); - -// CODE - -export const github = (url: string, override?: Partial): Social => ({ - name: 'GitHub', - icon: 'fa6-brands:github', - url, - ...override, -}); - -export const codepen = (url: string, override?: Partial): Social => ({ - name: 'CodePen', - icon: 'fa6-brands:codepen', - url, - ...override, -}); - -export const stackblitz = (url: string, override?: Partial): Social => ({ - name: 'StackBlitz', - icon: 'simple-icons:stackblitz', - url, - ...override, -}); - -export const codesandbox = (url: string, override?: Partial): Social => ({ - name: 'CodeSandbox', - icon: 'simple-icons:codesandbox', - url, - ...override, -}); - -// BLOG - -export const dev = (url: string, override?: Partial): Social => ({ - name: 'Dev', - icon: 'fa6-brands:dev', - url, - ...override, -}); - -export const medium = (url: string, override?: Partial): Social => ({ - name: 'Medium', - icon: 'fa6-brands:medium', - url, - ...override, -}); - -// FORUM / CHAT - -export const reddit = (url: string, override?: Partial): Social => ({ - name: 'Reddit', - icon: 'fa6-brands:reddit', - url, - ...override, -}); - -export const quora = (url: string, override?: Partial): Social => ({ - name: 'Quora', - icon: 'fa6-brands:quora', - url, - ...override, -}); - -export const stackoverflow = (url: string, override?: Partial): Social => ({ - name: 'Stack Overflow', - icon: 'fa6-brands:stack-overflow', - url, - ...override, -}); - -// DESIGN - -export const instagram = (url: string, override?: Partial): Social => ({ - name: 'Instagram', - icon: 'fa6-brands:instagram', - url, - ...override, -}); -export const behance = (url: string, override?: Partial): Social => ({ - name: 'Behance', - icon: 'fa6-brands:behance', - url, - ...override, -}); - -export const dribbble = (url: string, override?: Partial): Social => ({ - name: 'Dribbble', - icon: 'fa6-brands:dribbble', - url, - ...override, -}); - -export const figma = (url: string, override?: Partial): Social => ({ - name: 'Figma', - icon: 'fa6-brands:figma', - url, - ...override, -}); - -// MUSIC - -export const spotify = (url: string, override?: Partial): Social => ({ - name: 'Spotify', - icon: 'fa6-brands:spotify', - url, - ...override, -}); - -export const soundcloud = (url: string, override?: Partial): Social => ({ - name: 'SoundCloud', - icon: 'fa6-brands:soundcloud', - url, - ...override, -}); - -// VIDEO - -export const youtube = (url: string, override?: Partial): Social => ({ - name: 'YouTube', - icon: 'fa6-brands:youtube', - url, - ...override, -}); - -export const twitch = (url: string, override?: Partial): Social => ({ - name: 'Twitch', - icon: 'fa6-brands:twitch', - url, - ...override, -}); - -export const vimeo = (url: string, override?: Partial): Social => ({ - name: 'Vimeo', - icon: 'fa6-brands:vimeo', - url, - ...override, -}); - -// PROJECT TYPE - -export const website = (url: string, override?: Partial): Social => ({ - name: 'Website', - icon: 'fa6-solid:globe', - url, - ...override, -}); - -export const demo = (url: string, override?: Partial): Social => ({ - name: 'App demo', - icon: 'fa6-solid:desktop', - url, - ...override, -}); - -export const mockups = (url: string, override?: Partial): Social => ({ - name: 'Mockups', - icon: 'fa6-solid:image', - url, - ...override, -}); - -export const repository = (url: string, override?: Partial): Social => ({ - name: 'Repository', - icon: 'fa6-solid:code-branch', - url, - ...override, -}); diff --git a/src/data/transformers/index.ts b/src/data/transformers/index.ts new file mode 100644 index 0000000..845cc62 --- /dev/null +++ b/src/data/transformers/index.ts @@ -0,0 +1 @@ +export * from './transformers'; diff --git a/src/data/transformers/transform-data.ts b/src/data/transformers/transform-data.ts new file mode 100644 index 0000000..2b10336 --- /dev/null +++ b/src/data/transformers/transform-data.ts @@ -0,0 +1,14 @@ +import type { Data } from '@/types/data'; +import produce from 'immer'; +import type { PreciseData } from '../cv'; +import type { DataTransformer } from './transformers'; + +const transformData = + (data: PreciseData) => + (...callbacks: DataTransformer[]): Data => + // @ts-ignore -- waiting for https://github.com/sindresorhus/type-fest/pull/540 to be merged + produce(data, (draft) => { + callbacks.forEach((callback) => callback(draft)); + }); + +export default transformData; diff --git a/src/data/transformers/transformers.ts b/src/data/transformers/transformers.ts new file mode 100644 index 0000000..44b7ecf --- /dev/null +++ b/src/data/transformers/transformers.ts @@ -0,0 +1,92 @@ +import type { Data } from '@/types/data'; +import type { Draft } from 'immer'; +import type { PreciseData } from '../cv'; + +export type DraftData = Draft; + +export type DataTransformer = (draft: DraftData) => void; + +type Sections = PreciseData['sections']; + +type SectionKey = keyof Sections; + +type ProjectName = Sections['portfolio']['projects'][number]['name']; + +type JobRole = Sections['experience']['jobs'][number]['role']; + +type JobCompany = Sections['experience']['jobs'][number]['company']; + +type DiplomaTitle = Sections['education']['diplomas'][number]['title']; + +type DiplomaInstitution = Sections['education']['diplomas'][number]['institution']; + +type SkillSets = Sections['skills']['skillSets']; + +type SkillSetTitle = SkillSets[number]['title']; + +type Filter, P> = T extends Readonly<[infer A, ...infer Rest]> + ? [...(A extends P ? [A] : []), ...Filter] + : []; + +type SkillsBySkillSet = Filter< + SkillSets, + { title: SkillSet } +>[number]['skills'][number]['name']; + +export const hideSection = + (section: SectionKey): DataTransformer => + (draft) => { + draft.sections[section].config.visible = false; + }; + +export const hideJob = + (role: JobRole, company?: JobCompany): DataTransformer => + (draft) => { + draft.sections.experience.jobs = draft.sections.experience.jobs.filter( + (job) => job.role !== role && job.company !== company + ); + }; + +export const hideDiploma = + (title: DiplomaTitle, institution?: DiplomaInstitution): DataTransformer => + (draft) => { + draft.sections.education.diplomas = draft.sections.education.diplomas.filter( + (diploma) => diploma.title === title && diploma.institution === institution + ); + }; + +export const hideProject = + (name: ProjectName): DataTransformer => + (draft) => { + draft.sections.portfolio.projects = draft.sections.portfolio.projects.filter((project) => project.name !== name); + }; + +export const hideSkillSet = + (name: SkillSetTitle): DataTransformer => + (draft) => { + draft.sections.skills.skillSets = draft.sections.skills.skillSets.filter((skillSet) => skillSet.title !== name); + }; + +export const renameSkillSet = + (from: SkillSetTitle, to: string): DataTransformer => + (draft) => { + draft.sections.skills.skillSets = draft.sections.skills.skillSets.map((skillSet) => + skillSet.title === from ? { ...skillSet, title: to } : skillSet + ); + }; + +export const hideSkills = + ( + skillSetTitle: SkillSetTitle, + skills: SkillsBySkillSet[] + ): DataTransformer => + (draft) => { + draft.sections.skills.skillSets = draft.sections.skills.skillSets.map((skillSet) => { + if (skillSet.title !== skillSetTitle) return skillSet; + + return { + ...skillSet, + skills: skillSet.skills.filter((skill) => !skills.includes(skill.name as (typeof skills)[number])), + }; + }); + }; diff --git a/src/pages/_playground/button.astro b/src/pages/_playground/button.astro deleted file mode 100644 index 72f6b84..0000000 --- a/src/pages/_playground/button.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import Button from '@/components/button.astro'; ---- - -
- -
diff --git a/src/pages/_playground/favorites.astro b/src/pages/_playground/favorites.astro deleted file mode 100644 index 594808e..0000000 --- a/src/pages/_playground/favorites.astro +++ /dev/null @@ -1,51 +0,0 @@ ---- -import Typography from '@/components/typography.astro'; -import BookTile from '@/sections/favorites/book-tile.astro'; -import MediaTile from '@/sections/favorites/media-tile.astro'; -import PersonTile from '@/sections/favorites/person-tile.astro'; -import VideoTile from '@/sections/favorites/video-tile.astro'; -import type { Book, Media, Person, Video } from '@/types/favorites-section'; - -const book: Book = { - cover: import('@/assets/favorites/books/book-1.jpeg'), - title: 'The Pragmatic Programmer: From Journeyman to Master', - author: 'Andy Hunt, Dave Thomas', - url: 'https://www.goodreads.com/book/show/4099.The_Pragmatic_Programmer', -}; - -const person: Person = { - image: import('@/assets/favorites/people/person-1.jpg'), - name: 'Kent C. Dodds', - url: 'https://kentcdodds.com/', -}; - -const video: Video = { - thumbnail: import('@/assets/favorites/videos/video-1.jpeg'), - title: 'Building Resilient Frontend Architecture - Monica Lent - GOTO 2019', - url: 'https://youtu.be/TqfbAXCCVwE', -}; - -const media: Media = { - image: import('@/assets/favorites/media/media-1.jpeg'), - title: 'Fireship.io', - type: 'YouTube channel', - url: 'https://www.youtube.com/c/Fireship', -}; ---- - -Favourite Book -
- -
-Favourite Person -
- -
-Favourite Video -
- -
-Favourite Media -
- -
diff --git a/src/pages/_playground/icon-button.astro b/src/pages/_playground/icon-button.astro deleted file mode 100644 index 6d5f3e6..0000000 --- a/src/pages/_playground/icon-button.astro +++ /dev/null @@ -1,10 +0,0 @@ ---- -import IconButton from '@/components/icon-button.astro'; ---- - -
- - - - -
diff --git a/src/pages/_playground/icon.astro b/src/pages/_playground/icon.astro deleted file mode 100644 index c54f32b..0000000 --- a/src/pages/_playground/icon.astro +++ /dev/null @@ -1,9 +0,0 @@ ---- -import Icon from '@/components/icon.astro'; ---- - -
- - - -
diff --git a/src/pages/_playground/image.astro b/src/pages/_playground/image.astro deleted file mode 100644 index 893d99a..0000000 --- a/src/pages/_playground/image.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import { Image } from '@astrojs/image/components'; ---- - -
- My image -
diff --git a/src/pages/_playground/labelled-value.astro b/src/pages/_playground/labelled-value.astro deleted file mode 100644 index 56f1abf..0000000 --- a/src/pages/_playground/labelled-value.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import LabelledValue from '@/components/labelled-value.astro'; ---- - -
- -
diff --git a/src/pages/_playground/main-section.astro b/src/pages/_playground/main-section.astro deleted file mode 100644 index 6b63a60..0000000 --- a/src/pages/_playground/main-section.astro +++ /dev/null @@ -1,41 +0,0 @@ ---- -import MainSection from '@/sections/main/main-section.astro'; -import type { MainSection as MainSectionData } from '@/types/main-section'; - -const mainSectionData: MainSectionData = { - config: { - icon: 'fa6-solid:user', - title: 'About me', - }, - image: import('@/assets/my-image.jpeg'), - fullName: 'Mark Freeman', - role: 'Senior React Developer', - details: [ - { label: 'Phone', value: '+48 604 343 212' }, - { label: 'Email', value: 'veeeery.long.email.address@gmail.com' }, - { label: 'From', value: 'Warsaw, Poland' }, - { label: 'Salary range', value: '18 000 - 25 000 PLN' }, - ], - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sodales ac dui at vestibulum. In condimentum metus id dui tincidunt, in blandit mi vehicula. Nulla lacinia, erat sit amet elementum vulputate, lectus mauris volutpat mi, vitae accumsan metus elit ut nunc. Vestibulum lacinia enim eget eros fermentum scelerisque. Proin augue leo, posuere ut imperdiet vitae, fermentum eu ipsum. Sed sed neque sagittis, posuere urna nec, commodo leo. Pellentesque posuere justo vitae massa volutpat maximus.', - tags: [{ name: 'Open for freelance' }, { name: 'Available for mentoring' }, { name: 'Working on side project' }], - action: { - label: 'Download CV', - url: '#', - }, - socials: [ - { name: 'Facebook', icon: 'fa6-brands:facebook-f', url: '#' }, - { name: 'GitHub', icon: 'fa6-brands:github', url: '#' }, - { name: 'LinkedIn', icon: 'fa6-brands:linkedin-in', url: '#' }, - { name: 'Twitter', icon: 'fa6-brands:twitter', url: '#' }, - ], -}; ---- - - -
-
- -
-
- diff --git a/src/pages/_playground/projects-timeline.astro b/src/pages/_playground/projects-timeline.astro deleted file mode 100644 index cf544df..0000000 --- a/src/pages/_playground/projects-timeline.astro +++ /dev/null @@ -1,67 +0,0 @@ ---- -import ProjectTimelineItem from '@/sections/portfolio/project-timeline-item.astro'; -import type { I18n } from '@/types/i18n'; -import type { Project } from '@/types/portfolio-section'; - -const project: Project = { - name: 'Golden Bulls', - image: import('@/assets/portfolio/project-1.jpeg'), - startDate: new Date('2020-03'), - endDate: null, - details: [ - { label: 'Team size', value: '1 person' }, - { label: 'Company', value: 'None' }, - { label: 'My role', value: ['Front-end Developer', 'Designer'] }, - { label: 'Category', value: ['Web app', 'Open source'] }, - ], - description: - 'In tristique vulputate augue vel egestas. Quisque ac imperdiet tortor, at lacinia ex. Duis vel ex hendrerit, commodo odio sed, aliquam enim. Ut arcu nulla, tincidunt eget arcu eget, molestie vulputate nisi. Nunc malesuada leo et est iaculis facilisis.', - tags: [ - { - icon: 'simple-icons:nextdotjs', - iconColor: '#000000', - name: 'Next.js', - url: 'https://nextjs.org/', - }, - { - icon: 'simple-icons:sass', - iconColor: '#CC6699', - name: 'SASS', - url: 'https://sass-lang.com/', - }, - { - icon: 'simple-icons:pnpm', - iconColor: '#F69220', - name: 'pnpm', - url: 'https://pnpm.io/', - }, - { - icon: 'simple-icons:eslint', - iconColor: '#4B32C3', - name: 'ESLint', - url: 'https://eslint.org/', - }, - { - icon: 'simple-icons:prettier', - iconColor: '#F7B93E', - name: 'Prettier', - url: 'https://prettier.io/', - }, - ], - socials: [ - { name: 'Mockups', icon: 'fa6-solid:image', url: '#' }, - { name: 'App demo', icon: 'fa6-solid:desktop', url: '#' }, - ], -}; - -const i18nData: I18n = { - locale: 'en-US', - translations: { - now: 'now', - }, -}; ---- - -
- -
diff --git a/src/pages/_playground/section-card.astro b/src/pages/_playground/section-card.astro deleted file mode 100644 index 33b3150..0000000 --- a/src/pages/_playground/section-card.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import SectionCard from '@/components/section-card.astro'; ---- - -
- SectionCard text -
diff --git a/src/pages/_playground/sidebar-item.astro b/src/pages/_playground/sidebar-item.astro deleted file mode 100644 index 63149b6..0000000 --- a/src/pages/_playground/sidebar-item.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import SidebarItem from '@/components/sidebar-item.astro'; ---- - -
- -
diff --git a/src/pages/_playground/skill.astro b/src/pages/_playground/skill.astro deleted file mode 100644 index eaae15e..0000000 --- a/src/pages/_playground/skill.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Skill from '@/sections/skills/skill.astro'; -import type { LevelledSkill } from '@/types/skills-section'; - -const levelledSkill: LevelledSkill = { - icon: 'simple-icons:react', - iconColor: '#61DAFB', - name: 'React.js', - level: 3, - url: 'https://reactjs.org/', -}; ---- - - diff --git a/src/pages/_playground/skills-section.astro b/src/pages/_playground/skills-section.astro deleted file mode 100644 index ea124eb..0000000 --- a/src/pages/_playground/skills-section.astro +++ /dev/null @@ -1,160 +0,0 @@ ---- -import SkillsSection from '@/sections/skills/skills-section.astro'; -import type { SkillsSection as SkillsSectionData } from '@/types/skills-section'; - -const skills: SkillsSectionData = { - config: { - title: 'Skills', - icon: 'fa6-solid:bars-progress', - }, - skillSets: [ - { - title: 'I already know', - skills: [ - { - icon: 'simple-icons:react', - iconColor: '#61DAFB', - name: 'React.js', - level: 5, - url: 'https://reactjs.org/', - description: - 'Proin ut erat sed massa tempus suscipit. Mauris efficitur nunc sem, nec scelerisque ligula bibendum ut.', - }, - { - icon: 'simple-icons:typescript', - iconColor: '#3178C6', - name: 'TypeScript', - level: 4, - url: 'https://www.typescriptlang.org/', - description: 'Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.', - }, - { - icon: 'simple-icons:sass', - iconColor: '#CC6699', - name: 'SASS', - level: 4, - url: 'https://sass-lang.com/', - description: 'Nulla interdum pellentesque ultricies. Ut id eros commodo, ultrices ligula eu, elementum ante.', - }, - { - icon: 'simple-icons:chakraui', - iconColor: '#319795', - name: 'Chakra UI', - level: 5, - url: 'https://chakra-ui.com/', - }, - { - icon: 'simple-icons:tailwindcss', - iconColor: '#06B6D4', - name: 'Tailwind CSS', - level: 2, - url: 'https://tailwindcss.com/', - }, - { - icon: 'simple-icons:prettier', - iconColor: '#F7B93E', - name: 'Prettier', - level: 5, - url: 'https://prettier.io/', - }, - { - icon: 'simple-icons:eslint', - iconColor: '#4B32C3', - name: 'ESLint', - level: 4, - url: 'https://eslint.org/', - description: - 'Nulla tempor turpis at vehicula pharetra. Vestibulum tellus tortor, commodo et suscipit id, lobortis id nunc.', - }, - { - icon: 'simple-icons:nestjs', - iconColor: '#E0234E', - name: 'NestJS', - level: 2, - url: 'https://nestjs.com/', - description: - 'Praesent feugiat ultricies iaculis. In posuere vehicula odio, sed consequat velit porta viverra.', - }, - { - icon: 'simple-icons:postgresql', - iconColor: '#4169E1', - name: 'PostgreSQL', - level: 2, - url: 'https://www.postgresql.org/', - }, - { - icon: 'simple-icons:mongodb', - iconColor: '#47A248', - name: 'MongoDB', - level: 1, - url: 'https://www.mongodb.com/', - }, - { - icon: 'simple-icons:firebase', - iconColor: '#FFCA28', - name: 'Firebase', - level: 1, - url: 'https://firebase.google.com/', - }, - { - icon: 'simple-icons:pnpm', - iconColor: '#F69220', - name: 'pnpm', - level: 3, - url: 'https://pnpm.io/', - }, - ], - }, - { - title: 'I want to learn', - skills: [ - { - icon: 'simple-icons:apollographql', - iconColor: '#311C87', - name: 'Apollo GraphQL', - }, - { - icon: 'simple-icons:astro', - iconColor: '#FF5D01', - name: 'Astro', - }, - { - icon: 'simple-icons:supabase', - iconColor: '#3ECF8E', - name: 'Supabase', - }, - { - icon: 'simple-icons:cypress', - iconColor: '#17202C', - name: 'Cypress', - }, - ], - }, - { - title: 'I speak', - skills: [ - { - icon: 'circle-flags:pl', - name: 'Polish - native', - }, - { - icon: 'circle-flags:us', - name: 'English - C1', - }, - { - icon: 'circle-flags:es-variant', - name: 'Spanish - B1', - }, - ], - }, - ], -}; ---- - - -
-
- -
-
- diff --git a/src/pages/_playground/tag.astro b/src/pages/_playground/tag.astro deleted file mode 100644 index f0e0d90..0000000 --- a/src/pages/_playground/tag.astro +++ /dev/null @@ -1,11 +0,0 @@ ---- -import Tag from '@/components/tag.astro'; ---- - -
- Tag text -
- -
- Tag text -
diff --git a/src/pages/_playground/testimonial.astro b/src/pages/_playground/testimonial.astro deleted file mode 100644 index d82c23e..0000000 --- a/src/pages/_playground/testimonial.astro +++ /dev/null @@ -1,20 +0,0 @@ ---- -import Testimonial from '@/sections/testimonials/testimonial.astro'; -import type { Testimonial as TestimonialData } from '@/types/testimonials-section'; - -const testimonial: TestimonialData = { - author: 'Howard Stewart', - relation: 'We work together as front-end developers at Google', - content: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nisl vel tincidunt aliquam, nunc nisl aliquet nisl, eget aliquet nunc nisl euismod nisl. Sed euismod, nisl vel tincidunt aliquam, nunc nisl aliquet nisl, eget aliquet nunc nisl euismod nisl.', - image: import('@/assets/testimonials/testimonial-1.jpeg'), - socials: [ - { name: 'GitHub', icon: 'fa6-brands:github', url: '#' }, - { name: 'LinkedIn', icon: 'fa6-brands:linkedin-in', url: '#' }, - ], -}; ---- - -
- -
diff --git a/src/pages/_playground/testimonials-section.astro b/src/pages/_playground/testimonials-section.astro deleted file mode 100644 index 19bdfef..0000000 --- a/src/pages/_playground/testimonials-section.astro +++ /dev/null @@ -1,45 +0,0 @@ ---- -import TestimonialsSection from '@/sections/testimonials/testimonials-section.astro'; -import type { Testimonial } from '@/types/testimonials-section'; - -const testimonials: Testimonial[] = [ - { - image: import('@/assets/testimonials/testimonial-1.jpeg'), - author: 'Howard Stewart', - relation: 'We work together as front-end developers at Google', - content: - 'In nec mattis sem. Morbi purus lorem, euismod ac varius at, aliquet vitae augue. Pellentesque ut facilisis felis. In sed dui blandit, aliquet odio eu, elementum leo. In facilisis dapibus tortor ac volutpat. Cras cursus nec odio maximus elementum.', - socials: [ - { name: 'GitHub', icon: 'fa6-brands:github', url: '#' }, - { name: 'LinkedIn', icon: 'fa6-brands:linkedin-in', url: '#' }, - ], - }, - { - image: import('@/assets/testimonials/testimonial-2.jpeg'), - author: 'Jean Richards', - relation: 'My project manager at GitLab', - content: - 'Praesent nec congue elit. Vestibulum lobortis congue ipsum, a gravida mi tempus ac. Mauris aliquet purus nibh, vel varius turpis tempus non. Nullam eget ultricies orci. Quisque nulla ante, auctor eget varius ac, imperdiet nec magna.', - socials: [{ name: 'LinkedIn', icon: 'fa6-brands:linkedin-in', url: '#' }], - }, - { - image: import('@/assets/testimonials/testimonial-3.jpeg'), - author: 'Jason Fisher', - relation: 'My customer for sidewing.com website', - content: - 'Mauris tincidunt at purus vehicula porta. Mauris eget mollis turpis. Sed iaculis rutrum pharetra. Vivamus risus quam, suscipit et semper ut, aliquet ut tellus. Donec quis auctor nunc.', - socials: [ - { name: 'GitHub', icon: 'fa6-brands:github', url: '#' }, - { name: 'Website', icon: 'fa6-solid:globe', url: '#' }, - ], - }, -]; ---- - - -
-
- -
-
- diff --git a/src/pages/_playground/typography.astro b/src/pages/_playground/typography.astro deleted file mode 100644 index 24978a7..0000000 --- a/src/pages/_playground/typography.astro +++ /dev/null @@ -1,48 +0,0 @@ ---- -import Typography from '@/components/typography.astro'; - -const text = 'A quick brown fox jumps over the lazy dog'; ---- - -
-
-

paragraph (default)

- {text} -
-
-

main-title

- {text} -
-
-

main-subtitle

- {text} -
-
-

section-title

- {text} -
-
-

section-subtitle

- {text} -
-
-

item-title

- {text} -
-
-

item-title-suffix

- {text} -
-
-

item-subtitle

- {text} -
-
-

tile-title

- {text} -
-
-

tile-subtitle

- {text} -
-
diff --git a/src/pages/_playground/work-timeline.astro b/src/pages/_playground/work-timeline.astro deleted file mode 100644 index 73c2e96..0000000 --- a/src/pages/_playground/work-timeline.astro +++ /dev/null @@ -1,67 +0,0 @@ ---- -import WorkTimelineItem from '@/sections/experience/work-timeline-item.astro'; -import type { Job } from '@/types/experience-section'; -import type { I18n } from '@/types/i18n'; - -const job: Job = { - role: 'Senior front-end developer', - company: 'Google', - startDate: new Date('2020-02'), - endDate: null, - description: [ - 'In tristique vulputate augue vel egestas.', - 'Quisque ac imperdiet tortor, at lacinia ex.', - 'Duis vel ex hendrerit, commodo odio sed, aliquam enim.', - 'Ut arcu nulla, tincidunt eget arcu eget, molestie vulputate nisi.', - 'Nunc malesuada leo et est iaculis facilisis.', - 'Fusce eu urna ut magna malesuada fringilla.', - ], - tags: [ - { - icon: 'simple-icons:react', - iconColor: '#61DAFB', - name: 'React.js', - url: 'https://reactjs.org/', - }, - { - icon: 'simple-icons:nextdotjs', - iconColor: '#000000', - name: 'Next.js', - url: 'https://nextjs.org/', - }, - { - icon: 'simple-icons:typescript', - iconColor: '#3178C6', - name: 'TypeScript', - url: 'https://www.typescriptlang.org/', - }, - { - icon: 'simple-icons:nx', - iconColor: '#143055', - name: 'Nx', - url: 'https://nx.dev/', - }, - { - icon: 'simple-icons:firebase', - iconColor: '#FFCA28', - name: 'Firebase', - url: 'https://firebase.google.com/', - }, - ], - socials: [ - { name: 'Facebook', icon: 'fa6-brands:facebook-f', url: '#' }, - { name: 'LinkedIn', icon: 'fa6-brands:linkedin-in', url: '#' }, - ], -}; - -const i18nData: I18n = { - locale: 'en-US', - translations: { - now: 'now', - }, -}; ---- - -
- -
diff --git a/src/pages/index.astro b/src/pages/index.astro index 9f4a53e..ce2707f 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,61 +1,30 @@ --- -import Sidebar from '@/components/sidebar.astro'; -import ThemeToggle from '@/components/theme-toggle.astro'; -import EducationSection from '@/sections/education/education-section.astro'; -import ExperienceSection from '@/sections/experience/experience-section.astro'; -import FavoritesSection from '@/sections/favorites/favorites-section.astro'; -import MainSection from '@/sections/main/main-section.astro'; -import PortfolioSection from '@/sections/portfolio/portfolio-section.astro'; -import SkillsSection from '@/sections/skills/skills-section.astro'; -import TestimonialsSection from '@/sections/testimonials/testimonials-section.astro'; +import Layout from '@/web/components/layout.astro'; +import Sidebar from '@/web/components/sidebar.astro'; +import ThemeToggle from '@/web/components/theme-toggle.astro'; +import MainSection from '@/web/sections/main/main-section.web.astro'; +import SkillsSection from '@/web/sections/skills/skills-section.web.astro'; +import ExperienceSection from '@/web/sections/experience/experience-section.web.astro'; +import PortfolioSection from '@/web/sections/portfolio/portfolio-section.web.astro'; +import EducationSection from '@/web/sections/education/education-section.web.astro'; +import TestimonialsSection from '@/web/sections/testimonials/testimonials-section.web.astro'; +import FavoritesSection from '@/web/sections/favorites/favorites-section.web.astro'; +import { cv } from '@/data/cv'; -import data from '../data'; - -const { seo, i18n } = data; -const seoImage = seo.image ? seo.image : '/favicon.svg'; +const { config, sections } = cv(); --- - - - - - - - {seo.title} - - - - - - - - - -
- - {data.skills && } - {data.experience && } - {data.portfolio && } - {data.education && } - {data.testimonials && } - {data.favorites && } -
- - - - + + +
+ + + + + + + +
+ + +
diff --git a/src/pages/pdf.astro b/src/pages/pdf.astro index 5f3d98d..0d9e112 100644 --- a/src/pages/pdf.astro +++ b/src/pages/pdf.astro @@ -1,29 +1,34 @@ --- -import Footer from '@/pdf/footer.astro'; +import Footer from '@/pdf/components/footer.astro'; import EducationSection from '@/pdf/sections/education-section.pdf.astro'; import ExperienceSection from '@/pdf/sections/experience-section.pdf.astro'; import MainSection from '@/pdf/sections/main-section.pdf.astro'; import PortfolioSection from '@/pdf/sections/portfolio-section.pdf.astro'; import SkillsSection from '@/pdf/sections/skills-section.pdf.astro'; -import data from '../data'; +import { cv } from '@/data/cv'; +import { hideProject, hideSkillSet, renameSkillSet } from '@/data/transformers'; -const { i18n } = data; +const { config, sections } = cv( + hideSkillSet('I want to learn'), + renameSkillSet('I speak', 'Languages'), + hideProject('Disco Ninjas') +); --- - + PDF preview - - {data.skills && } - {data.experience && } - {data.portfolio && } - {data.education && } -