diff --git a/.github/workflows/azure-static-web-apps.yml b/.github/workflows/azure-static-web-apps.yml
deleted file mode 100644
index 638b522..0000000
--- a/.github/workflows/azure-static-web-apps.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: Azure Static Web Apps CI/CD
-
-on:
- push:
- branches:
- - main
- pull_request:
- types:
- - opened
- - synchronize
- - reopened
- - closed
- branches:
- - main
-
-jobs:
- build_and_deploy:
- if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
- runs-on: ubuntu-latest
- permissions:
- contents: read
- pull-requests: write
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Build and deploy
- uses: Azure/static-web-apps-deploy@v1
- with:
- azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- action: upload
- app_location: /
- api_location: ""
- output_location: dist
- app_build_command: npm run build
-
- close_pull_request:
- if: github.event_name == 'pull_request' && github.event.action == 'closed'
- runs-on: ubuntu-latest
- steps:
- - name: Close preview environment
- uses: Azure/static-web-apps-deploy@v1
- with:
- azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
- action: close
diff --git a/CNAME b/CNAME
deleted file mode 100644
index 4f7f044..0000000
--- a/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-cv.i-dmytro.org
diff --git a/README.md b/README.md
index 0e417c0..3679991 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,68 @@
-# Dmytro Pishchenkov Portfolio
+# Dmytro Pishchenkov | Portfolio
-Modern portfolio landing page for Platform Engineering, Cloud Operations, and DevSecOps work.
+Welcome to the source code for my personal landing page! I use this space as my digital business card to showcase my work across Platform Engineering, Cloud Operations, and DevSecOps.
-## Stack
+## What's Baked In
-- Vite
-- React
-- Chakra UI
-- i18next / react-i18next
-- Lucide React icons
+I wanted the site to be fast, accessible, and easy to navigate. Here is what it currently features:
-## Current Direction
+* **Trilingual Support:** English, Ukrainian, and Polish (handled via `react-i18next`).
+* **Theming:** Language-specific visual themes, plus the mandatory Light/Dark mode toggle.
+* **The Goods:** Easy access to my downloadable CV, live project demos, and repository links.
+* **The Highlights:** A breakdown of my core work, emphasizing Kubernetes automation, IaC (Terraform), Go/Python/Bash scripting, and observability.
-The portfolio is being refactored from an older static HTML/CSS/JavaScript site into a React application. The new positioning focuses on:
+### Featured Projects
-- Kubernetes and cloud platform engineering
-- Infrastructure as Code with Terraform
-- Cloud security and DevSecOps
-- Automation with Go, Python, and Bash
-- Observability and enterprise cloud operations
+If you are poking around to see what I build, the portfolio specifically highlights:
-## Languages And Themes
+* **Splunk Operator:** PostgreSQL Platform Controllers
+* **Serverless Cloud-Native Web Application**
+* **Secure Communication Infrastructure**
-The site supports three languages:
+## Under the Hood (The Stack)
-- English
-- Ukrainian
-- Polish
+While I spend most of my day wrestling with Kubernetes and cloud infrastructure, I built this frontend using:
-Language selection is handled by `i18next`. The visual palette changes with the selected language:
+* **Vite** (for that sweet, lightning-fast build time)
+* **React**
+* **Chakra UI** (for clean, accessible component styling)
-- English: blue, red, and white
-- Ukrainian: blue and yellow
-- Polish: red and white
+## Spin It Up Locally
-## Development
+Want to run it on your machine? It's pretty straightforward.
-Install dependencies:
+**1. Install dependencies:**
```bash
npm install
+
```
-Start the dev server:
+**2. Start the dev server:**
```bash
npm run dev
+
```
-Build for production:
+**3. Build for production:**
```bash
npm run build
+
```
-Preview the production build:
+**4. Preview the production build:**
```bash
npm run preview
-```
-
-## Deployment
-
-The selected hosting target is Azure Static Web Apps.
-
-Recommended Azure settings:
-- App location: `/`
-- API location: empty
-- Output location: `dist`
-- Build command: `npm run build`
-
-The repository includes:
-
-- `.github/workflows/azure-static-web-apps.yml` for GitHub Actions deployment
-- `public/staticwebapp.config.json` for SPA fallback and basic security headers
-
-Create a GitHub secret named `AZURE_STATIC_WEB_APPS_API_TOKEN` with the deployment token from Azure Static Web Apps. If Azure generates a different secret name, either rename the secret or update the workflow.
-
-## Project Content
-
-The current project cards are placeholders for:
-
-- Secure OPSEC Communication Protocol
-- Serverless Multi-language Web Application
-- Multi-Cloud IaC & Automated Deployment
+```
-Final live demo and repository links will be added after the first refactor pass is reviewed.
+## How It Ships (Deployment)
-## Notes
+This site is deployed and hosted using **Azure Static Web Apps**.
-The previous static assets and helper scripts are still present during the transition so the old implementation can be referenced if needed. They can be removed once the React version is accepted.
+* **CI/CD Pipeline:** Fully automated via GitHub Actions (you can check out the workflow at `.github/workflows/azure-static-web-apps-ashy-bay-06902e503.yml`).
+* **Workflow Target:** Pushes to the `master` branch trigger deployments from the `/` app location, outputting to the `dist` directory (API location is currently empty).
+* **Routing:** SPA routing fallback and custom headers are managed cleanly via `public/staticwebapp.config.json`.
\ No newline at end of file
diff --git a/assets/CSS/normalize.css b/assets/CSS/normalize.css
deleted file mode 100644
index 014f64e..0000000
--- a/assets/CSS/normalize.css
+++ /dev/null
@@ -1,227 +0,0 @@
-a, abbr, acronym, address, applet, article, aside, audio, b, big, blockquote, body, canvas, caption, center, cite, code, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, html, i, iframe, img, ins, kbd, label, legend, li, mark, menu, nav, object, ol, output, p, pre, q, ruby, s, samp, section, small, span, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, time, tr, tt, u, ul, var, video {
- margin: 0;
- padding: 0;
- border: 0;
- font-size: 100%;
- font: inherit;
- vertical-align: baseline;
- }
-
- article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
- display: block;
- }
-
- body {
- line-height: 1;
- }
-
- ol, ul {
- list-style: none;
- }
-
- blockquote, q {
- quotes: none;
- }
-
- blockquote:after, blockquote:before, q:after, q:before {
- content: '';
- content: none;
- }
-
- table {
- border-collapse: collapse;
- border-spacing: 0;
- }
-
- input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration, input[type=search]::-webkit-search-results-button, input[type=search]::-webkit-search-results-decoration {
- -webkit-appearance: none;
- }
-
- input[type=search] {
-
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- }
-
- textarea {
- overflow: auto;
- vertical-align: top;
- resize: vertical;
- }
-
- audio, canvas, video {
- display: inline-block;
- max-width: 100%;
- }
-
- audio:not([controls]) {
- display: none;
- height: 0;
- }
-
- [hidden] {
- display: none;
- }
-
- html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
- }
-
- a:focus {
- outline: thin dotted;
- }
-
- a:active, a:hover {
- outline: 0;
- }
-
- img {
- border: 0;
- -ms-interpolation-mode: bicubic;
- }
-
- figure {
- margin: 0;
- }
-
- form {
- margin: 0;
- }
-
- fieldset {
- border: 1px solid silver;
- margin: 0 2px;
- padding: .35em .625em .75em;
- }
-
- legend {
- border: 0;
- padding: 0;
- white-space: normal;
- }
-
- button, input, select, textarea {
- font-size: 100%;
- margin: 0;
- vertical-align: baseline;
- }
-
- button, input {
- line-height: normal;
- }
-
- button, select {
- text-transform: none;
- }
-
- button, html input[type=button], input[type=reset], input[type=submit] {
- cursor: pointer;
- }
-
- button[disabled], html input[disabled] {
- cursor: default;
- }
-
- input[type=checkbox], input[type=radio] {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0;
- }
-
- input[type=search] {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- }
-
- input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration {
- -webkit-appearance: none;
- }
-
-
- textarea {
- overflow: auto;
- vertical-align: top;
- }
-
- table {
- border-collapse: collapse;
- border-spacing: 0;
- }
-
- button, html, input, select, textarea {
- color: #222;
- }
-
- ::selection {
- background: #000;
- text-shadow: none;
- }
-
- img {
- vertical-align: middle;
- }
-
- fieldset {
- border: 0;
- margin: 0;
- padding: 0;
- }
-
- textarea {
- resize: vertical;
- }
-
- .chromeframe {
- margin: .2em 0;
- background: #ccc;
- color: #000;
- padding: .2em 0;
- }
-
- .clearfix:after {
- visibility: hidden;
- display: block;
- font-size: 0;
- content: '';
- clear: both;
- height: 0;
- }
-
- * {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- }
-
- html {
- scroll-behavior: smooth;
- }
-
- .visuallyHidden:not(:focus):not(:active) {
- position: absolute;
- width: 1px;
- height: 1px;
- margin: -1px;
- border: 0;
- padding: 0;
- white-space: nowrap;
- -webkit-clip-path: inset(100%);
- clip-path: inset(100%);
- clip: rect(0 0 0);
- overflow: hidden;
- }
-
- .srOnly {
- position: absolute;
- width: 1px;
- height: 1px;
- margin: -1px;
- border: 0;
- padding: 0;
- white-space: nowrap;
- -webkit-clip-path: inset(100%);
- clip-path: inset(100%);
- clip: rect(0 0 0 0);
- overflow: hidden;
- }
\ No newline at end of file
diff --git a/assets/CSS/styles.css b/assets/CSS/styles.css
deleted file mode 100644
index 80d5341..0000000
--- a/assets/CSS/styles.css
+++ /dev/null
@@ -1,935 +0,0 @@
-:root {
- --mainColor: #0057b7;
- --secondaryColor: #ffd700;
- --gradient: linear-gradient(
- to bottom,
- var(--mainColor) 0%,
- var(--secondaryColor) 100%
- );
-}
-
-body {
- font-family: "Poppins", sans-serif;
- font-size: 125%;
- background: aliceblue;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- color: #333;
- position: relative;
-}
-
-a {
- text-decoration: none;
- color: white;
-}
-
-section {
- padding: 80px 0;
-}
-
-.outerWrapper {
- width: calc(100% - 90px);
- margin-left: 90px;
- overflow: hidden;
-}
-
-.innerWrapper {
- padding: 0 33px;
- max-width: 1140px;
- margin: 0 auto;
-}
-
-.sectionContainer {
- background-color: hsla(60, 8%, 74%, 0.164);
- -webkit-box-shadow: 12px 12px 12px 0pxv var(--mainColor),
- 24px 24px 24px 0px var(--secondaryColor);
- box-shadow: 12px 12px 12px 0px var(--mainColor),
- 24px 24px 24px 0px var(--secondaryColor);
- border-radius: 50px;
- padding: 48px;
-}
-
-.sectionHead {
- margin-bottom: 50px;
-}
-
-.sectionHead span {
- padding-bottom: 20px;
- display: block;
- font-size: 1rem;
- text-transform: uppercase;
- position: relative;
- padding-left: 80px;
- letter-spacing: 1px;
-}
-
-.sectionHead span::before {
- content: "";
- position: absolute;
- left: 0;
- top: 4px;
- width: 50px;
- height: 1px;
- background: #333;
-}
-
-.sectionHead h2 {
- font-weight: 500;
- letter-spacing: 2px;
- font-size: 1.6rem;
- background: linear-gradient(180deg, var(--mainColor), var(--secondaryColor));
- color: transparent;
- background-clip: text;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
-}
-
-.techStack {
- color: var(--mainColor);
-}
-
-.menuButton {
- cursor: pointer;
- position: fixed;
- height: 30px;
- width: 35px;
- padding: 10px;
- top: 35px;
- right: 25px;
- z-index: 20;
- display: none;
-}
-
-.menuButton:focus {
- border: 2px solid var(--mainColor);
-}
-
-.menuButton .linesContainer {
- position: relative;
-}
-
-.menuButton .linesContainer span,
-.menuButton .linesContainer span:before,
-.menuButton .linesContainer span:after {
- border-radius: 5px;
- width: 25px;
- height: 2px;
- background-color: black;
- position: absolute;
- display: block;
- content: "";
-}
-
-.menuButton .linesContainer span {
- top: 3px;
- left: -6px;
-}
-
-.menuButton .linesContainer span:before {
- top: -10px;
-}
-
-.menuButton .linesContainer span:after {
- bottom: -10px;
-}
-
-.sideMenu {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between;
- width: 105px;
- height: 100vh;
- background: linear-gradient(
- to bottom,
- var(--mainColor) 0%,
- var(--secondaryColor) 100%
- );
- position: fixed;
- color: white;
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- z-index: 10;
-}
-
-.sideMenu p {
- text-align: center;
- padding: 30px 15px;
- font-size: 3rem;
- letter-spacing: 1px;
- font-weight: 300;
- background-color: var(--mainColor);
-}
-
-.sideMenu nav {
- padding: 26px;
-}
-
-.sideMenu nav a {
- padding: 13px 17px;
- display: inline-block;
- margin-bottom: 10px;
- font-size: 1.3rem;
- -webkit-transition-duration: 0.25s;
- transition-duration: 0.25s;
- border-radius: 6px;
- width: 100%;
- position: relative;
-}
-
-.sideMenu nav a span {
- font-size: 0.75rem;
- font-weight: 300;
- letter-spacing: 2px;
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- position: absolute;
- left: 55px;
- top: 18px;
- -webkit-transition-delay: 0.1s;
- transition-delay: 0.1s;
-}
-
-.sideMenu nav a:hover,
-.sideMenu nav a:focus {
- background-color: var();
- -webkit-box-shadow: 0 14px 28px rgba(0, 0, 0, 0.2);
- box-shadow: 0 14px 28px rgba(0, 0, 0, 0.2);
-}
-
-.myName {
- background: linear-gradient(180deg, var(--mainColor), var(--secondaryColor));
- color: transparent;
- background-clip: text;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
-}
-
-.sideMenu .scrollDown {
- height: 50px;
- position: relative;
- left: 35px;
-}
-
-.sideMenu .scrollDown .lni-arrow-down {
- line-height: 1.2;
- font-size: 2rem;
-}
-
-.sideMenu .scrollDown .scrollDownText {
- font-size: 0.75rem;
- position: absolute;
- top: 10px;
- left: 30px;
- font-weight: 300;
-}
-
-.hoverMenu {
- width: 220px;
-}
-
-.menuShow {
- display: block;
-}
-
-.menuHide {
- display: none;
-}
-
-.sideMenuHide {
- left: -300px;
-}
-
-.sideMenuShow {
- left: 0;
-}
-
-header {
- height: 100vh;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- width: 100%;
-}
-
-header .heroImageContainer {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- padding: 0 15px;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: 100%;
- position: relative;
-}
-
-header .heroImageContainer img {
- border-radius: 50%;
- margin: 0 auto;
- width: 350px;
- height: 350px;
- -webkit-box-shadow: 12px 12px 12px 0pxv var(--mainColor),
- 24px 24px 24px 0px var(--secondaryColor);
- box-shadow: 12px 12px 12px 0px var(--mainColor),
- 24px 24px 24px 0px var(--secondaryColor);
-}
-
-header .heroDescription {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- padding: 0 15px;
- width: 100%;
-}
-
-header .heroDescription .greeting {
- letter-spacing: 1px;
- font-size: 1rem;
- line-height: 1.2;
-}
-
-header .heroDescription h1 {
- font-size: 2.5rem;
- font-weight: bold;
- letter-spacing: 2px;
- margin: 24px 0;
-}
-
-header .heroDescription .smallBio {
- letter-spacing: 1px;
- color: #5f6f81;
- font-size: 1rem;
- min-width: 250px;
- line-height: 1.4;
-}
-
-header .heroDescription .smallBio span {
- color: var(--mainColor);
- font-size: 1.1rem;
-}
-
-header .heroDescription .socialsResume {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- margin-top: 30px;
-}
-
-header .heroDescription .socialsResume .resumeLink {
- background: linear-gradient(
- to bottom,
- var(--mainColor) 0%,
- var(--secondaryColor) 100%
- );
- padding: 15px 35px;
- border-radius: 40px;
- letter-spacing: 2px;
- font-size: 0.9rem;
- font-weight: 300;
- display: inline-block;
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
-}
-
-header .heroDescription .socialsResume .resumeLink:hover {
- -webkit-box-shadow: 0 14px 28px rgba(0, 0, 0, 0.2);
- box-shadow: 0 14px 28px rgba(0, 0, 0, 0.2);
-}
-
-header .heroDescription .socialsResume .resumeLink:focus {
- border-color: #80bdff;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.socialsList {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- margin-left: 50px;
-}
-
-.socialsList li {
- margin: 0 10px;
-}
-
-.socialsList li a {
- padding: 9px 10px;
- background-color: var(--secondaryColor);
- border-radius: 6px;
- color: var(--mainColor);
- border: 1px solid #eee;
- -webkit-box-shadow: 3px 3px 3px 0px var(--mainColor),
- 6px 6px 6px 0px var(--secondaryColor);
- box-shadow: 3px 3px 3px 0px var(--mainColor),
- 6px 6px 6px 0px var(--secondaryColor);
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- display: inline-block;
-}
-
-.socialsList li a:hover {
- -webkit-box-shadow: -3px -3px 3px 0px var(--mainColor),
- -6px -6px 6px 0px var(--secondaryColor);
- box-shadow: -3px -3px 3px 0px var(--mainColor),
- -6px -6px 6px 0px var(--secondaryColor);
-}
-
-.socialsList li a:focus {
- border-color: var(--mainColor);
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.aboutContainer p {
- line-height: 1.5;
- text-align: justify;
-}
-
-.aboutContainer p span {
- color: var(--mainColor);
-}
-
-.skillsContainer {
- text-align: center;
- font-size: 0.7rem;
-}
-
-.skillsGrid {
- display: -ms-grid;
- display: grid;
- -ms-grid-columns: (minmax(80px, 1fr)) [auto-fill];
- grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
- grid-column-gap: 50px;
- grid-row-gap: 50px;
-}
-
-.skillsGrid li {
- background-color: white;
- padding: 10px;
- border-radius: 15px;
- width: 80px;
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- -webkit-box-shadow: 0px 4px 8px rgba(134, 151, 168, 0.1);
- box-shadow: 0px 4px 8px rgba(134, 151, 168, 0.1);
- border: 1px solid #eee;
-}
-
-.skillsGrid li p {
- margin-top: 10px;
-}
-
-.skillsGrid li img {
- width: 35px;
- height: 35px;
-}
-
-.workBox {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- padding: 30px;
- margin-top: 40px;
- border-radius: 15px;
- -webkit-box-shadow: 0px 14px 28px rgba(134, 151, 168, 0.08);
- box-shadow: 0px 14px 28px rgba(134, 151, 168, 0.08);
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- border: 1px solid var(--mainColor);
-}
-
-.workBox:last-child {
- border-radius: 15px 15px 45px 45px;
-}
-
-.workBox:first-child {
- margin-top: 0;
-}
-
-.workBox .workImageContainer {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 350px;
- flex: 0 0 350px;
- border-radius: 10px;
- height: auto;
-}
-
-.workBox .workImageContainer img {
- width: 100%;
- border-radius: 10px;
- border: 1px solid #ddd;
-}
-
-.workBox .workDescribeContainer {
- -webkit-box-flex: 0;
- -ms-flex: 0 1 calc(100% - 350px);
- flex: 0 1 calc(100% - 350px);
- margin-left: 25px;
-}
-
-.workBox .workDescribeContainer h3 {
- letter-spacing: 1px;
- text-align: center;
- margin-bottom: 10px;
-}
-
-.workBox .workDescribeContainer ul {
- list-style: disc inside;
- font-size: 0.9rem;
- line-height: 1.3;
- letter-spacing: 1px;
- margin-top: 20px;
-}
-
-.workBox .workDescribeContainer ul li:not(:first-child) {
- margin-top: 10px;
-}
-
-.workBox .workDescribeContainer p {
- font-size: 0.9rem;
- margin-top: 20px;
-}
-
-.workBox .workDescribeContainer h4 {
- font-size: 1rem;
- margin-top: 7px;
- letter-spacing: 1px;
- line-height: 1.2;
-}
-
-.workBox .workDescribeContainer h4 span {
- color: var(--mainColor);
- display: inline-block;
- padding: 0 5px;
-}
-
-.workBox .workDescribeContainer .workLinks {
- margin-top: 50px;
-}
-
-.workBox .workDescribeContainer .workLinks a {
- font-size: 1.1rem;
- margin-right: 20px;
- color: var(--mainColor);
- display: inline-block;
- text-decoration: underline;
-}
-
-.workBox .workDescribeContainer .workLinks a:focus {
- border: 2px solid var(--mainColor);
-}
-
-.contactContainer h3 {
- letter-spacing: 1px;
- margin-bottom: 24px;
- text-align: center;
-}
-
-.contactContainer .contactForm {
- margin-top: 48px;
-}
-
-.contactTypes {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- text-align: center;
-}
-
-.contactTypes .flexContainer {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
-}
-
-.contactTypes .flexContainer:first-child {
- padding: 0 15px 0 0;
-}
-
-.contactTypes .flexContainer:last-child {
- padding: 0 0 0 15px;
-}
-
-.contactTypes .flexContainer .typeBox {
- -webkit-box-shadow: 0px 4px 8px rgba(134, 151, 168, 0.1);
- box-shadow: 0px 4px 8px rgba(134, 151, 168, 0.1);
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- border: 1px solid #eee;
- padding: 24px;
- border-radius: 15px;
-}
-
-.contactTypes .flexContainer .typeBox i {
- display: inline-block;
- padding: 18px;
- background: #f7f7f7;
- border-radius: 7px;
- font-size: 1.7rem;
- margin-bottom: 25px;
-}
-
-.contactTypes .flexContainer .typeBox .lni-calendar {
- color: var(--mainColor);
- background-color: var(--secondaryColor);
- box-shadow: 6px 6px 6px 0px var(--mainColor),
- 12px 12px 12px 0px var(--secondaryColor);
-}
-
-.contactTypes .flexContainer .typeBox .lni-envelope {
- color: var(--mainColor);
- background-color: var(--secondaryColor);
- box-shadow: 6px 6px 6px 0px var(--mainColor),
- 12px 12px 12px 0px var(--secondaryColor);
-}
-
-.contactTypes .flexContainer .typeBox a {
- display: block;
- margin-bottom: 15px;
- color: #333;
- text-decoration: underline;
- font-size: 1rem;
-}
-
-.contactTypes .flexContainer .typeBox a:focus {
- border: 2px solid var(--mainColor);
-}
-
-.contactTypes .flexContainer .typeBox p {
- font-size: 0.8rem;
- color: #5f6f81;
-}
-
-.contactFormContainer {
- margin-top: 48px;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
-}
-
-.contactFormContainer form {
- display: -ms-grid;
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- row-gap: 20px;
- -webkit-column-gap: 25px;
- column-gap: 25px;
- margin-bottom: 35px;
-}
-
-.contactFormContainer form input,
-.contactFormContainer form textarea {
- border: 1px solid var(--mainColor);
- background-color: azure;
- border-radius: 15px;
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
- padding: 11px 20px;
- font-size: 1rem;
- font-family: "Poppins", sans-serif;
- letter-spacing: 1px;
- width: 100%;
-}
-
-.contactFormContainer form input:focus,
-.contactFormContainer form textarea:focus {
- border-color: #80bdff;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.contactFormContainer form textarea {
- resize: none;
-}
-
-.contactFormContainer form ::-webkit-input-placeholder {
- font-size: 0.9rem;
- letter-spacing: 1px;
- color: #6c757d;
- opacity: 1;
- font-family: "Poppins", sans-serif;
-}
-
-.contactFormContainer form :-ms-input-placeholder {
- font-size: 0.9rem;
- letter-spacing: 1px;
- color: #6c757d;
- opacity: 1;
- font-family: "Poppins", sans-serif;
-}
-
-.contactFormContainer form ::-ms-input-placeholder {
- font-size: 0.9rem;
- letter-spacing: 1px;
- color: #6c757d;
- opacity: 1;
- font-family: "Poppins", sans-serif;
-}
-
-.contactFormContainer form ::placeholder {
- font-size: 0.9rem;
- letter-spacing: 1px;
- color: #6c757d;
- opacity: 1;
- font-family: "Poppins", sans-serif;
-}
-
-.contactFormContainer form .subjectInput,
-.contactFormContainer form .messageInput {
- -ms-grid-column: 1;
- -ms-grid-column-span: 2;
- grid-column: 1 /3;
- background-color: azure;
- border-radius: 15px;
-}
-
-.contactFormContainer button {
- padding: 14px 40px;
- font-size: 0.9rem;
- border: none;
- background: var(--gradient);
- color: white;
- letter-spacing: 1px;
- border-radius: 40px;
- width: 140px;
- margin: 0 auto;
- -webkit-transition: all 0.3s ease-in;
- transition: all 0.3s ease-in;
-}
-
-.contactFormContainer button:focus {
- border-color: #80bdff;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.contactFormContainer button:hover {
- -webkit-box-shadow: 0px 10px 40px 0px rgba(0, 0, 0, 0.2);
- box-shadow: 0px 10px 40px 0px rgba(0, 0, 0, 0.2);
-}
-
-footer {
- padding: 20px;
- background-color: azure;
-}
-
-footer p {
- width: 200px;
- margin: 0 auto;
- color: #333;
- font-size: 1rem;
- text-align: center;
-}
-
-/**********************/
-/* MAX WIDTH 1040PX */
-/**********************/
-@media (max-width: 1040px) {
- .contactFormContainer form {
- grid-template-columns: repeat(1, 1fr);
- }
- .contactFormContainer form .subjectInput,
- .contactFormContainer form .messageInput {
- -ms-grid-column: 1;
- -ms-grid-column-span: 1;
- grid-column: 1 /2;
- }
-}
-
-/**********************/
-/* MIN WIDTH 991PX */
-/**********************/
-@media (min-width: 991px) {
- .navItemName {
- display: none;
- }
- .sideMenu:hover {
- width: 220px;
- }
- .sideMenu:hover .navItemName {
- display: block;
- }
-}
-
-/**********************/
-/* MAX WIDTH 900PX */
-/**********************/
-@media (max-width: 990px) {
- .outerWrapper {
- width: 100%;
- margin-left: 0;
- }
- .sideMenu {
- width: 220px;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .sideMenu nav {
- margin-top: 40px;
- }
- .menuButton {
- display: block;
- }
- header {
- display: block;
- padding: 80px 0;
- height: auto;
- }
- header .heroDescription {
- text-align: center;
- margin-top: 50px;
- }
- header .heroDescription .socialsResume {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- }
- .socialsList {
- margin-left: 10px;
- }
-}
-
-/**********************/
-/* MIN WIDTH 768PX */
-/**********************/
-@media (min-width: 768px) {
- .skillsGrid li:hover {
- -webkit-box-shadow: 0 10px 28px rgba(0, 0, 0, 0.2);
- box-shadow: 0 10px 28px rgba(0, 0, 0, 0.2);
- }
- .workBox:hover {
- -webkit-box-shadow: 5px 14px 28px rgba(134, 151, 168, 0.2);
- box-shadow: 5px 14px 28px rgba(134, 151, 168, 0.2);
- }
- .contactTypes .flexContainer .typeBox:hover {
- -webkit-box-shadow: 0px 14px 28px rgba(134, 151, 168, 0.08);
- box-shadow: 0px 14px 28px rgba(134, 151, 168, 0.08);
- }
-}
-
-/**********************/
-/* MAX WIDTH 767PX */
-/**********************/
-@media (max-width: 767px) {
- .innerWrapper {
- padding: 0 15px;
- }
- header .heroImageContainer img {
- width: 250px;
- height: 250px;
- }
- .sectionContainer {
- background-color: transparent;
- padding: 0;
- }
- .aboutContainer {
- line-height: 1.3;
- font-size: 1rem;
- }
- .workBox {
- display: block;
- padding: 0;
- }
- .workBox .workImageContainer {
- max-width: 500px;
- margin: 0 auto;
- }
- .workBox .workDescribeContainer {
- margin-left: 0;
- margin-top: 20px;
- padding: 20px;
- }
- .workBox .workDescribeContainer .workLinks {
- margin-top: 25px;
- }
- .skillsGrid {
- row-gap: 15px;
- -webkit-column-gap: 15px;
- column-gap: 15px;
- }
- .contactTypes {
- display: block;
- }
- .contactTypes .flexContainer {
- max-width: 100%;
- }
- .contactTypes .flexContainer:first-child {
- padding: 0;
- }
- .contactTypes .flexContainer:last-child {
- padding: 0;
- }
- .contactTypes .flexContainer .typeBox:first-child {
- margin-bottom: 15px;
- }
-}
-
-/**********************/
-/* MAX WIDTH 400PX */
-/**********************/
-@media (max-width: 400px) {
- header {
- padding: 40px 0;
- }
- header .heroDescription .socialsResume {
- display: block;
- }
- header .heroImageContainer img {
- -webkit-box-shadow: 8px 8px 8px 0pxv var(--mainColor),
- 16px 16px 16px 0px var(--secondaryColor);
- box-shadow: 8px 8px 8px 0px var(--mainColor),
- 16px 16px 16px 0px var(--secondaryColor);
- }
- .socialsList {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- margin-left: 0;
- margin-top: 30px;
- }
- .contactFormContainer form input,
- .contactFormContainer form textarea {
- max-width: 380px;
- }
- .aboutContainer {
- padding: 1rem;
- }
-
- .contactFormContainer button {
- margin-bottom: 1rem;
- }
- header .heroDescription h1 {
- font-size: 2rem;
- }
-}
diff --git a/assets/JS/autoLangSelect.js b/assets/JS/autoLangSelect.js
deleted file mode 100644
index 0d67415..0000000
--- a/assets/JS/autoLangSelect.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// to minimize code, data is imported from js file
-
-import { language } from "./output.js";
-
-// Object for addeventlistener on all buttons changing language.
-const countries = {
- "#eng": "england",
- "#pl": "poland",
- "#ukr": "ukraine",
-};
-
-const ukr = Object.entries(language.ukr);
-const pl = Object.entries(language.pl);
-var key, value, selector;
-
-if (location.hash.substring(1) === "eng") {
-} else if (location.hash.substring(1) === "ukr") {
- for ([key, value] of ukr) {
- selector = "." + key;
- document.querySelector(selector).textContent = value;
- }
-} else if (location.hash.substring(1) === "pl") {
- for ([key, value] of pl) {
- selector = "." + key;
- document.querySelector(selector).textContent = value;
- document.querySelector("#resume").href = "./assets/curriculum_pl.pdf";
- }
-}
-
-document.getElementById("england").addEventListener("click", () => {
- window.location.hash = "#eng";
- window.location.reload(true);
-});
-
-for (const [key, value] of Object.entries(countries)) {
- const currentCountry = document.getElementsByClassName(value);
- for (var country of currentCountry) {
- country.addEventListener("click", () => {
- window.location.hash = key;
- location.reload(true);
- });
- }
-}
diff --git a/assets/JS/index.js b/assets/JS/index.js
deleted file mode 100644
index 4902155..0000000
--- a/assets/JS/index.js
+++ /dev/null
@@ -1,67 +0,0 @@
-const index = {};
-
-index.menu = document.querySelector("#sideMenu");
-index.navItem = document.querySelectorAll(".navItem");
-index.home = document.querySelector("#home");
-index.about = document.querySelector("#about");
-index.skills = document.querySelector("#skills");
-index.works = document.querySelector("#works");
-index.contact = document.querySelector("#contact");
-index.menuButton = document.querySelector("#menuButton");
-index.scrollDown = document.querySelector("#scrollDown");
-index.isOpen = false;
-
-// Scroll function
-index.scroll = function (target) {
- document
- .querySelectorAll("html,body")
- .animate({ scrollTop: document.querySelector(target).offset().top }, 500);
-};
-
-// Menu button function
-index.showHideMenu = () => {
- index.menu.classList.toggle("sideMenuHide");
- index.menu.classList.toggle("sideMenuShow");
- index.isOpen = !index.isOpen;
-};
-
-// Mobile class changes on initial load
-if (window.innerWidth <= 990) {
- index.menu.classList.add("sideMenuHide");
- index.menu.classList.remove("sideMenuShow");
- index.scrollDown.style.display = "none";
-}
-
-if (window.innerWidth > 990) {
- index.menu.classList.remove("sideMenuHide");
- index.menu.classList.add("sideMenuShow");
- index.scrollDown.style.display = "";
- index.isOpen = false;
-} else {
- index.menu.classList.remove("sideMenuShow");
- index.menu.classList.add("sideMenuHide");
- index.isOpen = false;
- index.scrollDown.style.display = "none";
-}
-
-// Menu button click event
-index.menuButton.addEventListener("click", index.showHideMenu);
-
-// Hide menu when clicking a link
-for (let i = 0; i < index.navItem.length; i++) {
- index.navItem[i].addEventListener("click", () => {
- if (index.isOpen) {
- // Hide menu when clicking a link
- index.showHideMenu();
- }
- });
-}
-
-// Document ready function
-function ready(fn) {
- if (document.readyState != "loading") {
- fn();
- } else {
- document.addEventListener("DOMContentLoaded", fn);
- }
-}
diff --git a/assets/JS/output.js b/assets/JS/output.js
deleted file mode 100644
index dcd7205..0000000
--- a/assets/JS/output.js
+++ /dev/null
@@ -1,264 +0,0 @@
-const language = {
- origin: {
- translate0:
- "Dmytro Pishchenkov - A Full-Stack Developer and Microsoft Support Engineer",
- translate1: "Dp",
- translate2: "HI THERE! I'M",
- translate3: "A Full-Stack Developer and Microsoft Support Engineer ",
- translate4:
- " I have been continuously learning and exploring various skills and professions throughout my life. Previously, I practiced law; however, I made a conscious decision to change my career path in pursuit of the freedom that self-development and growth in the IT field offer. Recently, I successfully obtained certifications in Microsoft Azure Fundamentals, Coursera Advanced React, Coursera Python, and Using Databases with Python, among others. For me, the world of IT represents an exhilarating journey of acquiring fresh knowledge and honing skills. I am sincerely enthusiastic about collaborating with other accomplished IT specialists, as it presents an incredible opportunity to learn even more. Thank you for considering my background, and I am eager to contribute to any IT-related endeavors in a positive and proactive manner. ",
- translate5: "HTML",
- translate6: "CSS",
- translate7: "SASS",
- translate8: "Javascript",
- translate9: "Django",
- translate10: "React",
- translate11: "Bootstrap",
- translate12: "Git",
- translate13: "Python",
- translate14: "VS Code",
- translate15: "Tailwind",
- translate16: "React-Bootstrap",
- translate17: "SQLite",
- translate18: "MySQL",
- translate19: "Email Me",
- translate20: "Schedule a Meeting",
- translate21: "© Dmytro Pishchenkov 2023",
- translate22: "DMYTRO PISHCHENKOV",
- translate23: "ABOUT ME",
- translate24: "SKILLS",
- translate25: "PROJECTS",
- translate26: "CONTACT",
- translate27: "HairDay Beauty salon",
- translate28: " Yastvo vegetarian cafe in Yalta, Ukraine ",
- translate29: "Get in Touch",
- translate30: "Contact Form",
- translate31: "Technologies Used: ",
- translate32: " Technologies Used:",
- translate33: " Built in three languages (Ukrainian, Spanish, English) ",
- translate34: " Translation was made using Python BeautifulSoup library ",
- translate35: " Translations are saved in separete JS file",
- translate36: " The project was made for a real small business",
- translate37:
- "It is written in Python Django framework, using HTML and CSS, deployed using Docker and Fly.Dev ",
- translate38:
- " Site has been made in three languages: Ukrainian, English, Polish, including database, payment services and adding dishes to menu directly from the website has been implemented ",
- translate40: " HOME ",
- translate41: " ABOUT ME",
- translate42: " SKILLS ",
- translate43: " WORKS ",
- translate44: " CONTACT ",
- translate45: " UKRAINIAN ",
- translate46: " ENGLISH ",
- translate47: " POLISH ",
- translate49: " SOME INFO ",
- translate50: " CHECK OUT MY ",
- translate51: " TAKE A LOOK AT MY ",
- translate52: " HTML, CSS, JS, Python, Tailwind",
- translate53: " Python, Django, HTML, CSS, SQLite",
- translate54: " SAY HELLO! ",
- translate55: " Willa Dorota, sanatorium in Busko-Zdroy, Poland ",
- translate56: " Technologies used: ",
- translate57:
- " Python, Django, React, MySQL, Django REST API, HTML, CSS, React i18n. ",
- translate58: " The website was made for sanatorium in Busko-Zdroy, Poland ",
- translate59:
- " Front-End - React, Back-End-Python Django, Django REST API used to fetch data from server, MySQL database. Site was deployed on Pythonanywhere service. ",
- translate60:
- " Web site is in three languages: Ukrainian, English, Polish, React i18n for Front-End internationalization, Django model-translation for Back-End translation GoogleMap API, emailJS, React-Bootstrap for UI. ",
- translate61:
- "Application to prepare for AZ-900 Microsoft certification Exam",
- translate62: "Technologies used:",
- translate63:
- "A Web App to help to prepare for AZ-900 Microsoft Azure certification Exam",
- translate64:
- "Application was made using React, questions are stored in JSON file, user interface created with Chakra UI library.",
- translate65:
- "Three difficulty modes (easy,normal, hard), timer, pause, if user tries to leave exam before its end, exam terminates. Dark-light mode, exam progress, after exam, user can check for correct answers and see previous test results. App deployed using Microsoft Azure App service.",
- translate67: "AZ-900 Certified",
- translate68: "Azure AD",
- translate69: "Azure cervices",
- translate70: "Support Engineer",
- translate71: "Microsoft Security",
- translate72: "Chakra UI",
- translate73: "Microsoft Azure App",
- translate74: "React, Chakra UI, Microsoft Azure App, JSON",
- },
- ukr: {
- translate0:
- "Дмитро Піщенков - Full-Stack розробник та інженер підтримки Microsoft",
- translate1: "Dp",
- translate2: "ПРИВІТ! Я",
- translate3: "Full-Stack розробник та інженер підтримки Microsoft",
- translate4:
- "Протягом усього життя я постійно вивчаю нові навички та професії. Раніше я займався юриспруденцією, проте я свідомо вирішив змінити свою кар'єру на користь свободи саморозвитку та зростання в сфері ІТ. Недавно мені вдалося успішно пройти сертифікацію з основ Microsoft Azure, отримати сертифікати від Coursera Advanced React, Coursera Python та з використання баз даних з Python. Для мене світ ІТ представляє захоплюючий шлях набуття нових знань та вдосконалення навичок. Я щиро прагну співпрацювати з іншими досвідченими ІТ-спеціалістами, адже це надає неймовірну можливість навчатися ще більше. Дякую за увагу до мого досвіду, і я з нетерпінням готовий сприяти будь-яким ІТ-проектам з позитивним та активним підходом.",
- translate5: "HTML",
- translate6: "CSS",
- translate7: "SASS",
- translate8: "Javascript",
- translate9: "Django",
- translate10: "React",
- translate11: "Bootstrap",
- translate12: "Git",
- translate13: "Python",
- translate14: "VS Code",
- translate15: "Tailwind",
- translate16: "React-Bootstrap",
- translate17: "SQLite",
- translate18: "MySQL",
- translate19: "Напишіть мені листа",
- translate20: "Заплануйте зустріч",
- translate21: "© Дмитро Піщенков 2023",
- translate22: "ДМИТРО ПІЩЕНКОВ",
- translate23: "ПРО МЕНЕ",
- translate24: "НАВИЧКАМИ",
- translate25: "ПРОЕКТИ",
- translate26: "КОНТАКТИ",
- translate27: "Салон краси HairDay",
- translate28: "Вегетаріанське кафе Яство в Ялті, Україна",
- translate29: "Зв'яжіться зі мною",
- translate30: "Форма зв'язку",
- translate31: "Використані технології:",
- translate32: "Використані технології:",
- translate33:
- "Сайт розроблений на трьох мовах (українська, іспанська, англійська)",
- translate34:
- "Переклад був зроблений за допомогою бібліотеки Python BeautifulSoup",
- translate35: "Переклади зберігаються у окремому файлі JS",
- translate36: "Проект створений для реального малого бізнесу",
- translate37:
- "Зроблений на фреймворку Python Django, з використанням HTML та CSS, розміщений на сервісі Fly.Dev, з застосуванням Docker",
- translate38:
- "Сайт створений на трьох мовах: українська, англійська, польська, включаючи базу даних, платіжні сервіси та можливість додавання страв до меню безпосередньо з веб-сайту",
- translate40: "ГОЛОВНА",
- translate41: "ПРО МЕНЕ",
- translate42: "НАВИЧКИ",
- translate43: "РОБОТИ",
- translate44: "КОНТАКТИ",
- translate45: "УКРАЇНСЬКА",
- translate46: "АНГЛІЙСЬКА",
- translate47: "ПОЛЬСЬКА",
- translate49: "ДОДАТКОВА ІНФОРМАЦІЯ",
- translate50: "ОЗНАЙОМТЕСЬ З МОЇМИ",
- translate51: "ПЕРЕГЛЯНЬТЕ МОЇ",
- translate52: "HTML, CSS, JS, Python, Tailwind",
- translate53: "Python, Django, HTML, CSS, SQLite",
- translate54: "НАПИШІТЬ МЕНІ! ",
- translate55: "Санаторій Вілла Дорота в Буську-Здруї, Польща",
- translate56: "Використані технології:",
- translate57:
- "Python, Django, React, MySQL, Django REST API, HTML, CSS, React i18n",
- translate58: "Сайт створений для санаторію в Буську-Здруї, Польща",
- translate59:
- "Front-End - React, Back-End - Python Django, Django REST API для отримання даних з сервера, база даних MySQL. Сайт розгорнуто на сервісі Pythonanywhere.",
- translate60:
- "Сайт доступний у трьох мовах: українська, англійська, польська, використовуються React i18n для інтернаціоналізації Front-End та Django model-translation для перекладу Back-End, GoogleMap API, emailJS, React-Bootstrap для користувацького інтерфейсу.",
- translate61:
- "Додаток для підготовки до сертифікаційного іспиту AZ-900 Microsoft",
- translate62: "Використані технології:",
- translate63:
- "Веб-додаток для допомоги в підготовці до сертифікаційного іспиту Microsoft Azure AZ-900",
- translate64:
- "Додаток був створений з використанням React, питання зберігаються у JSON файлі, інтерфейс користувача створений з використанням бібліотеки Chakra UI.",
- translate65:
- "Три рівні складності (легкий, середній, складний), таймер, пауза, якщо користувач намагається покинути іспит до його завершення, іспит припиняється. Темний та світлий режим, прогрес іспиту, після іспиту користувач може перевірити правильні відповіді та побачити результати попередніх тестів. Додаток розгорнуто з використанням служби Microsoft Azure App.",
- translate67: "AZ-900 Certified",
- translate68: "Azure AD",
- translate69: "Azure cervices",
- translate70: "Support Engineer",
- translate71: "Microsoft Security",
- translate72: "Chakra UI",
- translate73: "Microsoft Azure App",
- translate74: "React, Chakra UI, Microsoft Azure App, JSON",
- },
- pl: {
- translate0:
- "Dmytro Pishchenkov - Full-Stack Developer i inżynier wsparcia Microsoft",
- translate1: "Dp",
- translate2: "CZEŚĆ! JESTEM",
- translate3: "Full-Stack Developer i inżynier wsparcia Microsoft",
- translate4:
- "Przez całe życie uczę się i eksploruję różne umiejętności i zawody. Wcześniej praktykowałem prawo, jednak świadomie podjąłem decyzję o zmianie ścieżki kariery na rzecz wolności rozwoju i wzrostu w dziedzinie IT. Ostatnio uzyskałem certyfikaty w zakresie podstaw Microsoft Azure, zaawansowanego React w Coursera, Python w Coursera oraz korzystania z baz danych z Pythonem. Dla mnie świat IT to pasjonująca podróż do zdobywania nowej wiedzy i doskonalenia umiejętności. Z wielkim entuzjazmem współpracuję z innymi doświadczonymi specjalistami IT, ponieważ daje mi to niezwykłą możliwość nauki jeszcze więcej. Dziękuję za uwzględnienie mojego doświadczenia, i z niecierpliwością czekam na możliwość wsparcia wszelkich projektów związanych z IT w pozytywny i aktywny sposób.",
- translate5: "HTML",
- translate6: "CSS",
- translate7: "SASS",
- translate8: "Javascript",
- translate9: "Django",
- translate10: "React",
- translate11: "Bootstrap",
- translate12: "Git",
- translate13: "Python",
- translate14: "VS Code",
- translate15: "Tailwind",
- translate16: "React-Bootstrap",
- translate17: "SQLite",
- translate18: "MySQL",
- translate19: "Napisz do mnie",
- translate20: "Umów spotkanie",
- translate21: "© Dmytro Pishchenkov 2023",
- translate22: "DMYTRO PISHCHENKOV",
- translate23: "O MNIE",
- translate24: "UMIEJĘTNOŚCI",
- translate25: "PROJEKTY",
- translate26: "KONTAKT",
- translate27: "Salon urody HairDay",
- translate28: "Wegańska kawiarnia Yastvo w Jałcie, Ukraina",
- translate29: "Skontaktuj się ze mną",
- translate30: "Formularz kontaktowy",
- translate31: "Wykorzystane technologie:",
- translate32: "Wykorzystane technologie:",
- translate33:
- "Strona została stworzona w trzech językach (ukraiński, hiszpański, angielski)",
- translate34:
- "Tłumaczenie wykonano za pomocą biblioteki Python BeautifulSoup",
- translate35: "Tłumaczenia są zapisywane w oddzielnym pliku JS",
- translate36: "Projekt został wykonany dla rzeczywistego małego biznesu",
- translate37:
- "Jest napisane w frameworku Python Django, przy użyciu HTML i CSS, wdrożone za pomocą Docker i Fly.Dev.",
- translate38:
- "Strona została stworzona w trzech językach: ukraiński, angielski, polski, w tym baza danych, usługi płatności i dodawanie dań do menu bezpośrednio ze strony",
- translate40: "STRONA GŁÓWNA",
- translate41: "O MNIE",
- translate42: "UMIEJĘTNOŚCI",
- translate43: "PROJEKTY",
- translate44: "KONTAKT",
- translate45: "UKRAIŃSKI",
- translate46: "ANGIELSKI",
- translate47: "POLSKI",
- translate49: "DODATKOWE INFORMACJE",
- translate50: "SPRAWDŹ MOJE",
- translate51: "ZOBACZ MOJE",
- translate52: "HTML, CSS, JS, Python, Tailwind",
- translate53: "Python, Django, HTML, CSS, SQLite",
- translate54: "NAPISZ DO MNIE! ",
- translate55: "Willa Dorota, sanatorium w Busku-Zdroju, Polska",
- translate56: "Wykorzystane technologie:",
- translate57:
- "Python, Django, React, MySQL, Django REST API, HTML, CSS, React i18n",
- translate58:
- "Strona została stworzona dla sanatorium w Busku-Zdroju, Polska",
- translate59:
- "Front-End - React, Back-End - Python Django, Django REST API do pobierania danych z serwera, baza danych MySQL. Strona została wdrożona na usłudze Pythonanywhere.",
- translate60:
- "Strona jest dostępna w trzech językach: ukraiński, angielski, polski, wykorzystuje React i18n do internacjonalizacji Front-End i Django model-translation do tłumaczenia Back-End, GoogleMap API, emailJS, React-Bootstrap dla interfejsu użytkownika.",
- translate61:
- "Aplikacja do przygotowania do egzaminu certyfikacyjnego AZ-900 Microsoft",
- translate62: "Wykorzystane technologie:",
- translate63:
- "Aplikacja internetowa, która pomaga w przygotowaniu do egzaminu certyfikacyjnego Microsoft Azure AZ-900",
- translate64:
- "Aplikacja została stworzona z wykorzystaniem React, pytania są przechowywane w pliku JSON, interfejs użytkownika został stworzony przy użyciu biblioteki Chakra UI.",
- translate65:
- "Trzy poziomy trudności (łatwy, normalny, trudny), timer, pauza, jeśli użytkownik próbuje opuścić egzamin przed jego zakończeniem, egzamin zostaje zakończony. Tryb ciemny-jasny, postęp egzaminu, po egzaminie użytkownik może sprawdzić poprawne odpowiedzi i zobaczyć wyniki poprzednich testów. Aplikację wdrożono przy użyciu usługi Microsoft Azure App.",
- translate67: "AZ-900 Certified",
- translate68: "Azure AD",
- translate69: "Azure cervices",
- translate70: "Support Engineer",
- translate71: "Microsoft Security",
- translate72: "Chakra UI",
- translate73: "Microsoft Azure App",
- translate74: "React, Chakra UI, Microsoft Azure App, JSON",
- },
-};
-
-export { language };
diff --git a/assets/curriculum_pl.pdf b/assets/curriculum_pl.pdf
deleted file mode 100644
index 6acc82b..0000000
Binary files a/assets/curriculum_pl.pdf and /dev/null differ
diff --git a/assets/images/AZ-900-1-300x300.webp b/assets/images/AZ-900-1-300x300.webp
deleted file mode 100644
index 4443b1e..0000000
Binary files a/assets/images/AZ-900-1-300x300.webp and /dev/null differ
diff --git a/assets/images/App-Service-Certificates.svg b/assets/images/App-Service-Certificates.svg
deleted file mode 100644
index 4759383..0000000
--- a/assets/images/App-Service-Certificates.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/App-Services.svg b/assets/images/App-Services.svg
deleted file mode 100644
index 54051fc..0000000
--- a/assets/images/App-Services.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Azure-Active-Directory.svg b/assets/images/Azure-Active-Directory.svg
deleted file mode 100644
index 338035d..0000000
--- a/assets/images/Azure-Active-Directory.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Azure-Database-MySQL-Server.svg b/assets/images/Azure-Database-MySQL-Server.svg
deleted file mode 100644
index d1504cc..0000000
--- a/assets/images/Azure-Database-MySQL-Server.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Bootstrap_logo.svg b/assets/images/Bootstrap_logo.svg
deleted file mode 100644
index 8f07cfe..0000000
--- a/assets/images/Bootstrap_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Dormed.png b/assets/images/Dormed.png
deleted file mode 100644
index ec57e26..0000000
Binary files a/assets/images/Dormed.png and /dev/null differ
diff --git a/assets/images/ExamTestPrep.png b/assets/images/ExamTestPrep.png
deleted file mode 100644
index eb8aa87..0000000
Binary files a/assets/images/ExamTestPrep.png and /dev/null differ
diff --git a/assets/images/HairDaySalon.png b/assets/images/HairDaySalon.png
deleted file mode 100644
index c276ceb..0000000
Binary files a/assets/images/HairDaySalon.png and /dev/null differ
diff --git a/assets/images/Help-and-Support.svg b/assets/images/Help-and-Support.svg
deleted file mode 100644
index 93d291f..0000000
--- a/assets/images/Help-and-Support.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Network-Security-Groups.svg b/assets/images/Network-Security-Groups.svg
deleted file mode 100644
index 93a64c3..0000000
--- a/assets/images/Network-Security-Groups.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/Python-logo.svg b/assets/images/Python-logo.svg
deleted file mode 100644
index 2aeefc9..0000000
--- a/assets/images/Python-logo.svg
+++ /dev/null
@@ -1,265 +0,0 @@
-
-
-
-
diff --git a/assets/images/React-Bootstrap.png b/assets/images/React-Bootstrap.png
deleted file mode 100644
index 694be23..0000000
Binary files a/assets/images/React-Bootstrap.png and /dev/null differ
diff --git a/assets/images/Tailwind_CSS_Logo.svg b/assets/images/Tailwind_CSS_Logo.svg
deleted file mode 100644
index 4e2d1a1..0000000
--- a/assets/images/Tailwind_CSS_Logo.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/assets/images/Yastvo.png b/assets/images/Yastvo.png
deleted file mode 100644
index 3616ad7..0000000
Binary files a/assets/images/Yastvo.png and /dev/null differ
diff --git a/assets/images/api.svg b/assets/images/api.svg
deleted file mode 100644
index 44dfc84..0000000
--- a/assets/images/api.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
diff --git a/assets/images/azure.png b/assets/images/azure.png
deleted file mode 100644
index 7c75031..0000000
Binary files a/assets/images/azure.png and /dev/null differ
diff --git a/assets/images/azure.svg b/assets/images/azure.svg
deleted file mode 100644
index 9288c79..0000000
--- a/assets/images/azure.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/chakraui-custom.svg b/assets/images/chakraui-custom.svg
deleted file mode 100644
index 9393ae0..0000000
--- a/assets/images/chakraui-custom.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
\ No newline at end of file
diff --git a/assets/images/css.svg b/assets/images/css.svg
deleted file mode 100644
index aed602e..0000000
--- a/assets/images/css.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/assets/images/django.svg b/assets/images/django.svg
deleted file mode 100644
index 69a4642..0000000
--- a/assets/images/django.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/favicon/android-chrome-192x192.png b/assets/images/favicon/android-chrome-192x192.png
deleted file mode 100644
index 7fc25fb..0000000
Binary files a/assets/images/favicon/android-chrome-192x192.png and /dev/null differ
diff --git a/assets/images/favicon/android-chrome-512x512.png b/assets/images/favicon/android-chrome-512x512.png
deleted file mode 100644
index 054d27b..0000000
Binary files a/assets/images/favicon/android-chrome-512x512.png and /dev/null differ
diff --git a/assets/images/favicon/apple-touch-icon.png b/assets/images/favicon/apple-touch-icon.png
deleted file mode 100644
index a2cdd1b..0000000
Binary files a/assets/images/favicon/apple-touch-icon.png and /dev/null differ
diff --git a/assets/images/favicon/browserconfig.xml b/assets/images/favicon/browserconfig.xml
deleted file mode 100644
index ceeaf2e..0000000
--- a/assets/images/favicon/browserconfig.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
- #ffc40d
-
-
-
diff --git a/assets/images/favicon/favicon-16x16.png b/assets/images/favicon/favicon-16x16.png
deleted file mode 100644
index cbb1062..0000000
Binary files a/assets/images/favicon/favicon-16x16.png and /dev/null differ
diff --git a/assets/images/favicon/favicon-32x32.png b/assets/images/favicon/favicon-32x32.png
deleted file mode 100644
index 42f9ce3..0000000
Binary files a/assets/images/favicon/favicon-32x32.png and /dev/null differ
diff --git a/assets/images/favicon/favicon.ico b/assets/images/favicon/favicon.ico
deleted file mode 100644
index c4d1d8a..0000000
Binary files a/assets/images/favicon/favicon.ico and /dev/null differ
diff --git a/assets/images/favicon/mstile-150x150.png b/assets/images/favicon/mstile-150x150.png
deleted file mode 100644
index c0e3cc3..0000000
Binary files a/assets/images/favicon/mstile-150x150.png and /dev/null differ
diff --git a/assets/images/favicon/safari-pinned-tab.svg b/assets/images/favicon/safari-pinned-tab.svg
deleted file mode 100644
index 789b870..0000000
--- a/assets/images/favicon/safari-pinned-tab.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
diff --git a/assets/images/favicon/site.webmanifest b/assets/images/favicon/site.webmanifest
deleted file mode 100644
index fbf84da..0000000
--- a/assets/images/favicon/site.webmanifest
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "",
- "short_name": "",
- "icons": [
- {
- "src": "/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ],
- "theme_color": "#ffffff",
- "background_color": "#ffffff",
- "display": "standalone"
-}
diff --git a/assets/images/git.svg b/assets/images/git.svg
deleted file mode 100644
index 6ad3bf5..0000000
--- a/assets/images/git.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/html.svg b/assets/images/html.svg
deleted file mode 100644
index 494b6b0..0000000
--- a/assets/images/html.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/assets/images/javascript.svg b/assets/images/javascript.svg
deleted file mode 100644
index 6ef8fcb..0000000
--- a/assets/images/javascript.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/logo-mysql-170x115.png b/assets/images/logo-mysql-170x115.png
deleted file mode 100644
index 73b55bd..0000000
Binary files a/assets/images/logo-mysql-170x115.png and /dev/null differ
diff --git a/assets/images/network.svg b/assets/images/network.svg
deleted file mode 100644
index 558dc86..0000000
--- a/assets/images/network.svg
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
diff --git a/assets/images/react.svg b/assets/images/react.svg
deleted file mode 100644
index 3a27f7c..0000000
--- a/assets/images/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/sass.svg b/assets/images/sass.svg
deleted file mode 100644
index 87f96db..0000000
--- a/assets/images/sass.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/sqlite-icon.svg b/assets/images/sqlite-icon.svg
deleted file mode 100644
index e5e0d01..0000000
--- a/assets/images/sqlite-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/vscode.svg b/assets/images/vscode.svg
deleted file mode 100644
index 67aee17..0000000
--- a/assets/images/vscode.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/autotranslator.py b/autotranslator.py
deleted file mode 100644
index 02b4d77..0000000
--- a/autotranslator.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# This file extracts text to be translated from HTML file using BeautifulSoap library, creates JSON with original text and translated text, and modifies original HTML file, preparing it for translation, if you don`t want to let Google to autotranslate your site for some reasons.
-
-from bs4 import BeautifulSoup
-import json
-import pandas as pd
-import re
-import openpyxl
-import xlrd
-
-
-
-sourceFile = "index.html"
-with open(sourceFile) as fp:
- soup = BeautifulSoup(fp, 'html.parser')
-
-
-counter =0
-origin = {} #original text from HTML
-translated = {} #translated text from HTML
-outputText = [] #cleared text for further translation
-outputKeys = [] #keys for text to create new dict with translation
-
-# list of tags where text to be translated may present, you may correct it according those used in your project.
-tagList = ["title", "p", "h1", "h2", "h3", "h4", "h5", "h6", "header", "form", "li", "span"]
-
-
-
-# loops all tags in tagList, checks, if there is text inside the tag, and creates dictionary for Json file.
-def argument_insert(argument):
- for argument in soup.find_all(argument):
- global counter # access to global variable to use counter inside function
- value = argument.string #text inside tags
- if value is not None: #checks, if there is text inside tag
- value = re.sub("\n +"," ", value) #cleaning data from spaces and end-of-line symbols
- if value != "\n":
- key = "translate"+str(counter)
- origin.update({key: value})
- outputText.append(value)
- outputKeys.append(key)
- argument['class'] = argument.get('class',[]) +["translate"+str(counter)] #applying new class as a mark for translation
- counter +=1
- return counter #counter is used for end-to-end numbering, so global variable is used
-
-
-# create output Excel file for translation
-def convert_to_pandas_dataframe(outputText, outputXlsFile):
- df=pd.DataFrame(outputText, columns=['qwe123asd']) #to avoid column header translation to any language by Google, header should be named in abracadabra way :-)
- df.to_excel(outputXlsFile, sheet_name="TranslationData", engine='openpyxl')
-
-
-# read input file, convert translation to list and create new dict with translated data, which corresponds to origin dict
-def convert_xlx_to_list(translatedFile):
- df = pd.read_excel(translatedFile)
- translatedList = df.qwe123asd.values.tolist()
- key = 0
- keys=""
- for value in translatedList:
- keys = "translate"+str(key)
- translated.update({keys:value})
- key +=1
- return translated
-
-# output HTML file
-def output_to_HTML(outputHTML,soup):
- output = open (outputHTML, 'w')
- newSoup = soup.prettify() #prettify output HTML file
- output.write(newSoup)
-
-#write data to Json file
-def write_json_to_file(json_obj, outputJsonFile):
- output = open (outputJsonFile, 'w')
- output.write(json_obj)
-
-#call of argument_insert function
-for argument in tagList:
- argument_insert(argument)
-
-
-outputHTML = input("Input file name for modified HTML file (default is output.html): ")
-if len(outputHTML)<1:
- outputHTML = "output.html"
-output_to_HTML(outputHTML, soup)
-
-
-#Google Translate doesn`t support .txt files, only .doc, .pdf, .xlsx and some other types, so output file is Excel.
-outputXlsFile = input("Input file name for the file to be translated (Excel, default is output.xlsx): ")
-if len(outputXlsFile)<1:
- outputXlsFile = "output.xlsx"
-convert_to_pandas_dataframe(outputText, outputXlsFile)
-
-
-translatedFile = input("Input file name to load translation from (Excel, default is output.xlsx):" )
-if len(translatedFile)<1:
- translatedFile = "output.xlsx"
-convert_xlx_to_list(translatedFile)
-
-
-outputJsonFile = input("Input file name for JSON file (default is output.json): ")
-if len(outputJsonFile)<1:
- outputJsonFile = "output.json"
-
-
-outputJson = {"origin": origin, "ukr":translated}
-jsonObject = json.dumps(outputJson,ensure_ascii=False, indent=4)
-write_json_to_file(jsonObject, outputJsonFile)
\ No newline at end of file