├── .browserslistrc ├── .editorconfig ├── .github └── workflows │ └── workflow.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json └── tasks.json ├── Dockerfile ├── README.md ├── angular.json ├── infrastructure └── main.tf ├── karma.conf.js ├── nginx.conf ├── package-lock.json ├── package.json ├── src ├── app │ ├── app.component.css │ ├── app.component.html │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── models │ │ ├── Activity.ts │ │ ├── Certificate.ts │ │ ├── Education.ts │ │ ├── Link.ts │ │ ├── Location.ts │ │ ├── Project.ts │ │ ├── ProjectLink.ts │ │ ├── Responsibility.ts │ │ ├── Technology.ts │ │ └── WorkExperience.ts │ ├── routing │ │ ├── certificate │ │ │ ├── certificate.component.css │ │ │ ├── certificate.component.html │ │ │ ├── certificate.component.spec.ts │ │ │ └── certificate.component.ts │ │ ├── contact │ │ │ ├── contact.component.css │ │ │ ├── contact.component.html │ │ │ ├── contact.component.spec.ts │ │ │ └── contact.component.ts │ │ ├── history │ │ │ ├── history.component.css │ │ │ ├── history.component.html │ │ │ ├── history.component.spec.ts │ │ │ └── history.component.ts │ │ ├── index │ │ │ ├── index.component.css │ │ │ ├── index.component.html │ │ │ ├── index.component.spec.ts │ │ │ └── index.component.ts │ │ ├── project │ │ │ ├── project.component.css │ │ │ ├── project.component.html │ │ │ ├── project.component.spec.ts │ │ │ └── project.component.ts │ │ └── routing.module.ts │ ├── services │ │ ├── certificates │ │ │ ├── certificates.service.spec.ts │ │ │ └── certificates.service.ts │ │ ├── educations │ │ │ ├── educations.service.spec.ts │ │ │ └── educations.service.ts │ │ ├── projects │ │ │ ├── projects.service.spec.ts │ │ │ └── projects.service.ts │ │ ├── services.module.ts │ │ └── work-experience │ │ │ ├── work-eperiences.service.spec.ts │ │ │ └── work-experiences.service.ts │ └── shared │ │ ├── about-me │ │ ├── about-me.component.css │ │ ├── about-me.component.html │ │ ├── about-me.component.spec.ts │ │ └── about-me.component.ts │ │ ├── experience-summary │ │ ├── experience-summary.component.css │ │ ├── experience-summary.component.html │ │ ├── experience-summary.component.spec.ts │ │ └── experience-summary.component.ts │ │ ├── footer │ │ ├── footer.component.css │ │ ├── footer.component.html │ │ ├── footer.component.spec.ts │ │ └── footer.component.ts │ │ ├── navigation │ │ ├── navigation.component.css │ │ ├── navigation.component.html │ │ ├── navigation.component.spec.ts │ │ └── navigation.component.ts │ │ └── shared.module.ts ├── assets │ ├── .gitkeep │ ├── TomasOndrejkaCV.pdf │ ├── css │ │ ├── plugins │ │ │ ├── bootstrap.min.css │ │ │ ├── fancybox.min.css │ │ │ ├── font-awesome.css │ │ │ ├── fontawesome.css │ │ │ └── swiper.min.css │ │ ├── style.css │ │ └── webfonts │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ ├── img │ │ ├── BackGround.jpg │ │ ├── apiCV │ │ │ ├── EducationPage.png │ │ │ ├── IndexPage.png │ │ │ └── ProjectsPage.png │ │ ├── erotoApp │ │ │ ├── Buy Stock.jpg │ │ │ ├── Deposit.jpg │ │ │ ├── Main Menu.jpg │ │ │ ├── Main Screen 2.jpg │ │ │ ├── Main Screen.jpg │ │ │ ├── Notifications.jpg │ │ │ ├── Signin.jpg │ │ │ ├── Signup.jpg │ │ │ ├── Stock Details.jpg │ │ │ └── Watchlist.jpg │ │ ├── eyeExercises │ │ │ ├── AnalgyphExercise.png │ │ │ ├── FirstLevelFootball.png │ │ │ ├── LastLevelJumpingColumn.png │ │ │ ├── LevelOneMaze.png │ │ │ ├── LevelTwoMaze.png │ │ │ └── SecondLevelFootbll.png │ │ ├── face-2.png │ │ ├── favicon │ │ │ ├── about.txt │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ └── site.webmanifest │ │ ├── hospitalManagementSystem │ │ │ ├── ActivityDiagram.png │ │ │ ├── ClassDiagram.jpg │ │ │ ├── DatabaseDomains.png │ │ │ ├── DatabaseFunction.png │ │ │ ├── DomainModel.png │ │ │ ├── GuiPreview.png │ │ │ ├── JavaJDBC.png │ │ │ ├── JavaRetrievingDataFromDB.png │ │ │ ├── UnitTest.png │ │ │ └── UseCases.png │ │ ├── linko │ │ │ ├── Main 2.png │ │ │ └── Main.png │ │ ├── printer │ │ │ ├── CustomCuttedFrame.jpg │ │ │ ├── Extruder.jpg │ │ │ ├── ExtruderOnPrinter.jpg │ │ │ ├── FinalPrinter.jpg │ │ │ ├── PresentingProjectToCommision.jpg │ │ │ └── Skeleton.jpg │ │ ├── projectManagementSystem │ │ │ ├── Class.png │ │ │ ├── DomainModel.png │ │ │ ├── ExportXMLFunction.png │ │ │ ├── FunctionForXMLReadingToTable.png │ │ │ ├── TopPriorityRequirements.png │ │ │ ├── UseCaseDescriptions.png │ │ │ ├── UseCases.png │ │ │ ├── UserInterface.png │ │ │ └── XMLReadingOnWebsite.png │ │ ├── rabatoo │ │ │ ├── Checkout.png │ │ │ ├── Experiences.png │ │ │ ├── Index.png │ │ │ ├── Order.png │ │ │ ├── OrderPlaced.png │ │ │ ├── Orders.png │ │ │ ├── SSD.png │ │ │ ├── ShoppingCart.png │ │ │ ├── SignIn.png │ │ │ └── SingleProduct.png │ │ ├── raspberryKubernetes │ │ │ ├── Cloudflare domains.png │ │ │ ├── Deployment Module Usage.png │ │ │ ├── Deployment.png │ │ │ ├── Pods.png │ │ │ └── Services.png │ │ └── skrabmig │ │ │ ├── AddToCart.png │ │ │ ├── CartPage.png │ │ │ ├── CheckoutPage.png │ │ │ ├── ContactUsPage.png │ │ │ ├── Footer.png │ │ │ ├── FrontPage.png │ │ │ └── ProductPage.png │ └── js │ │ ├── about-me.custom.js │ │ ├── main.js │ │ ├── navigation.custom.js │ │ └── plugins │ │ ├── anime.min.js │ │ ├── fancybox.min.js │ │ ├── isotope.min.js │ │ ├── jquery.min.js │ │ ├── overscroll.min.js │ │ ├── progressbar.min.js │ │ ├── smooth-scrollbar.min.js │ │ ├── swiper.min.js │ │ ├── swup.min.js │ │ └── typing.min.js ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── index.html ├── main.ts ├── polyfills.ts ├── styles.css └── test.ts ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.github/workflows/workflow.yml: -------------------------------------------------------------------------------- 1 | name: Tomondre's portfolio webpage 2 | run-name: CI & CD worfklows for the Kubernetes deployment 🚀 3 | on: [push] 4 | jobs: 5 | CI: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: actions/setup-node@v3 10 | with: 11 | node-version: 16 12 | - name: Install dependencies 13 | run: npm ci 14 | - name: Build 15 | run: npm run build 16 | - name: Set up QEMU 17 | uses: docker/setup-qemu-action@v2 18 | - name: Set up Docker Buildx 19 | uses: docker/setup-buildx-action@v2 20 | - name: Login to Docker Hub 21 | uses: docker/login-action@v2 22 | with: 23 | username: ${{ secrets.DOCKERHUB_USERNAME }} 24 | password: ${{ secrets.DOCKERHUB_TOKEN }} 25 | - name: Build and push 26 | uses: docker/build-push-action@v3 27 | with: 28 | context: . 29 | platforms: linux/amd64,linux/arm64 30 | push: true 31 | tags: tomondre/portfolio-angular:${{ github.run_number }} 32 | 33 | CD: 34 | runs-on: self-hosted 35 | needs: CI 36 | env: 37 | DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} 38 | DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} 39 | CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} 40 | KUBE_CONFIG_PATH: ~/kubeconfig.yaml 41 | TF_TOKEN_app_terraform_io: ${{ secrets.TERRAFORM_TOKEN }} 42 | steps: 43 | - name: Check out repository code 44 | uses: actions/checkout@v3 45 | - name: Terraform Initialize 46 | working-directory: infrastructure 47 | run: terraform init 48 | - name: Set-up kube config 49 | run: echo "${{ secrets.KUBE_CONFIG }}" > ~/kubeconfig.yaml 50 | - name: Terraform apply 51 | working-directory: infrastructure 52 | run: terraform apply -auto-approve -var "image_tag=${{ github.run_number }}" 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | /node_modules 11 | npm-debug.log 12 | yarn-error.log 13 | 14 | # IDEs and editors 15 | .idea/ 16 | .project 17 | .classpath 18 | .c9/ 19 | *.launch 20 | .settings/ 21 | *.sublime-workspace 22 | 23 | # Visual Studio Code 24 | .vscode/* 25 | !.vscode/settings.json 26 | !.vscode/tasks.json 27 | !.vscode/launch.json 28 | !.vscode/extensions.json 29 | .history/* 30 | 31 | # Miscellaneous 32 | /.angular/cache 33 | .sass-cache/ 34 | /connect.lock 35 | /coverage 36 | /libpeerconnection.log 37 | testem.log 38 | /typings 39 | 40 | # System files 41 | .DS_Store 42 | Thumbs.db 43 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "pwa-chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "test", 26 | "isBackground": true, 27 | "problemMatcher": { 28 | "owner": "typescript", 29 | "pattern": "$tsc", 30 | "background": { 31 | "activeOnStart": true, 32 | "beginsPattern": { 33 | "regexp": "(.*?)" 34 | }, 35 | "endsPattern": { 36 | "regexp": "bundle generation complete" 37 | } 38 | } 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.17.1-alpine 2 | COPY nginx.conf /etc/nginx/nginx.conf 3 | COPY /dist/portfolio-angular /usr/share/nginx/html 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PortfolioAngular 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.1.0. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. 28 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "portfolio-angular": { 7 | "projectType": "application", 8 | "schematics": {}, 9 | "root": "", 10 | "sourceRoot": "src", 11 | "prefix": "app", 12 | "architect": { 13 | "build": { 14 | "builder": "@angular-devkit/build-angular:browser", 15 | "options": { 16 | "outputPath": "dist/portfolio-angular", 17 | "index": "src/index.html", 18 | "main": "src/main.ts", 19 | "polyfills": "src/polyfills.ts", 20 | "tsConfig": "tsconfig.app.json", 21 | "assets": [ 22 | "src/favico.ico", 23 | "src/assets" 24 | ], 25 | "styles": [ 26 | ], 27 | "scripts": [] 28 | }, 29 | "configurations": { 30 | "production": { 31 | "budgets": [ 32 | { 33 | "type": "initial", 34 | "maximumWarning": "500kb", 35 | "maximumError": "1mb" 36 | }, 37 | { 38 | "type": "anyComponentStyle", 39 | "maximumWarning": "2kb", 40 | "maximumError": "4kb" 41 | } 42 | ], 43 | "fileReplacements": [ 44 | { 45 | "replace": "src/environments/environment.ts", 46 | "with": "src/environments/environment.prod.ts" 47 | } 48 | ], 49 | "outputHashing": "all" 50 | }, 51 | "development": { 52 | "buildOptimizer": false, 53 | "optimization": false, 54 | "vendorChunk": true, 55 | "extractLicenses": false, 56 | "sourceMap": true, 57 | "namedChunks": true 58 | } 59 | }, 60 | "defaultConfiguration": "production" 61 | }, 62 | "serve": { 63 | "builder": "@angular-devkit/build-angular:dev-server", 64 | "configurations": { 65 | "production": { 66 | "browserTarget": "portfolio-angular:build:production" 67 | }, 68 | "development": { 69 | "browserTarget": "portfolio-angular:build:development" 70 | } 71 | }, 72 | "defaultConfiguration": "development" 73 | }, 74 | "extract-i18n": { 75 | "builder": "@angular-devkit/build-angular:extract-i18n", 76 | "options": { 77 | "browserTarget": "portfolio-angular:build" 78 | } 79 | }, 80 | "test": { 81 | "builder": "@angular-devkit/build-angular:karma", 82 | "options": { 83 | "main": "src/test.ts", 84 | "polyfills": "src/polyfills.ts", 85 | "tsConfig": "tsconfig.spec.json", 86 | "karmaConfig": "karma.conf.js", 87 | "assets": [ 88 | "src/favico.ico", 89 | "src/assets" 90 | ], 91 | "styles": [ 92 | "src/styles.css" 93 | ], 94 | "scripts": [] 95 | } 96 | } 97 | } 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /infrastructure/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | cloud { 3 | organization = "raspberry-kubernetes-cluster" 4 | 5 | workspaces { 6 | tags = ["tomondre-portfolio-angular"] 7 | } 8 | } 9 | } 10 | 11 | 12 | module "portfolio_angular_deployment" { 13 | source = "git::https://github.com/tomondre/raspberry-kubernetes-cluster.git//terraform-modules/reusable-modules/full-deployment" 14 | health_check_path = "/" 15 | image_tag = var.image_tag 16 | image_url = "tomondre/portfolio-angular" 17 | service_name = "portfolio" 18 | port = 80 19 | } 20 | 21 | variable "image_tag" {} 22 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | jasmine: { 17 | // you can add configuration options for Jasmine here 18 | // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html 19 | // for example, you can disable the random execution with `random: false` 20 | // or set a specific seed with `seed: 4321` 21 | }, 22 | clearContext: false // leave Jasmine Spec Runner output visible in browser 23 | }, 24 | jasmineHtmlReporter: { 25 | suppressAll: true // removes the duplicated traces 26 | }, 27 | coverageReporter: { 28 | dir: require('path').join(__dirname, './coverage/portfolio-angular'), 29 | subdir: '.', 30 | reporters: [ 31 | { type: 'html' }, 32 | { type: 'text-summary' } 33 | ] 34 | }, 35 | reporters: ['progress', 'kjhtml'], 36 | port: 9876, 37 | colors: true, 38 | logLevel: config.LOG_INFO, 39 | autoWatch: true, 40 | browsers: ['Chrome'], 41 | singleRun: false, 42 | restartOnFileChange: true 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | events{} 2 | http { 3 | include /etc/nginx/mime.types; 4 | server { 5 | listen 80; 6 | server_name localhost; 7 | root /usr/share/nginx/html; 8 | index index.html; 9 | location / { 10 | try_files $uri $uri/ /index.html; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "portfolio-angular", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "tsc && ng build --configuration production", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test" 10 | }, 11 | "private": true, 12 | "dependencies": { 13 | "@angular/animations": "^14.1.0", 14 | "@angular/common": "^14.1.0", 15 | "@angular/compiler": "^14.1.0", 16 | "@angular/core": "^14.1.0", 17 | "@angular/forms": "^14.2.10", 18 | "@angular/platform-browser": "^14.1.0", 19 | "@angular/platform-browser-dynamic": "^14.2.10", 20 | "@angular/router": "^14.2.10", 21 | "rxjs": "~7.5.0", 22 | "tslib": "^2.4.1", 23 | "yargs": "^17.0.13", 24 | "zone.js": "^0.11.8" 25 | }, 26 | "devDependencies": { 27 | "@angular-devkit/build-angular": "^14.2.9", 28 | "@angular/cli": "~14.1.0", 29 | "@angular/compiler-cli": "^14.2.10", 30 | "@types/jasmine": "~4.0.0", 31 | "@types/yargs": "^17.0.13", 32 | "jasmine-core": "~4.2.0", 33 | "karma": "~6.4.0", 34 | "karma-chrome-launcher": "~3.1.0", 35 | "karma-coverage": "~2.2.0", 36 | "karma-jasmine": "~5.1.0", 37 | "karma-jasmine-html-reporter": "~2.0.0", 38 | "typescript": "~4.7.2" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/app/app.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/app.component.css -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 | 8 |
9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 |
24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 | 40 | 41 |
42 | 43 | 44 |
45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 |
53 | 54 | 55 | 56 |
57 | 58 |
59 | 60 |

Tomas Ondrejka

61 | 62 |
63 |
64 | 65 |
66 | 67 | 68 |
69 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | beforeEach(async () => { 6 | await TestBed.configureTestingModule({ 7 | declarations: [ 8 | AppComponent 9 | ], 10 | }).compileComponents(); 11 | }); 12 | 13 | it('should create the app', () => { 14 | const fixture = TestBed.createComponent(AppComponent); 15 | const app = fixture.componentInstance; 16 | expect(app).toBeTruthy(); 17 | }); 18 | 19 | it(`should have as title 'portfolio-angular'`, () => { 20 | const fixture = TestBed.createComponent(AppComponent); 21 | const app = fixture.componentInstance; 22 | expect(app.title).toEqual('portfolio-angular'); 23 | }); 24 | 25 | it('should render title', () => { 26 | const fixture = TestBed.createComponent(AppComponent); 27 | fixture.detectChanges(); 28 | const compiled = fixture.nativeElement as HTMLElement; 29 | expect(compiled.querySelector('.content span')?.textContent).toContain('portfolio-angular app is running!'); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, ViewEncapsulation} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | }) 7 | export class AppComponent { 8 | title = 'portfolio-angular'; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { AppComponent } from './app.component'; 4 | import {SharedModule} from "./shared/shared.module"; 5 | import {routingComponents, RoutingModule} from "./routing/routing.module"; 6 | import {HttpClientModule} from "@angular/common/http"; 7 | import { CertificateComponent } from './routing/certificate/certificate.component'; 8 | 9 | @NgModule({ 10 | declarations: [ 11 | AppComponent, 12 | routingComponents, 13 | CertificateComponent 14 | ], 15 | imports: [ 16 | BrowserModule, 17 | SharedModule, 18 | RoutingModule, 19 | HttpClientModule 20 | ], 21 | providers: [], 22 | bootstrap: [AppComponent] 23 | }) 24 | export class AppModule { } 25 | -------------------------------------------------------------------------------- /src/app/models/Activity.ts: -------------------------------------------------------------------------------- 1 | 2 | export default class Activity { 3 | private _activity: string; 4 | 5 | constructor(activity: string) { 6 | this._activity = activity; 7 | } 8 | 9 | get activity(): string { 10 | return this._activity; 11 | } 12 | 13 | set activity(value: string) { 14 | this._activity = value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/models/Certificate.ts: -------------------------------------------------------------------------------- 1 | export default class Certificate { 2 | private _name: string; 3 | private _organization: string; 4 | private _description: string; 5 | private _issuedDate: Date; 6 | private _expiryDate: Date; 7 | private _credentialId: string; 8 | private _url: string; 9 | 10 | constructor(name: string, organization: string, description: string, issuedDate: Date, expiryDate: Date, credentialId: string, url: string) { 11 | this._name = name; 12 | this._organization = organization; 13 | this._description = description; 14 | this._issuedDate = issuedDate; 15 | this._expiryDate = expiryDate; 16 | this._credentialId = credentialId; 17 | this._url = url; 18 | } 19 | 20 | get description(): string { 21 | return this._description; 22 | } 23 | 24 | set description(value: string) { 25 | this._description = value; 26 | } 27 | 28 | get name(): string { 29 | return this._name; 30 | } 31 | 32 | set name(value: string) { 33 | this._name = value; 34 | } 35 | 36 | get organization(): string { 37 | return this._organization; 38 | } 39 | 40 | set organization(value: string) { 41 | this._organization = value; 42 | } 43 | 44 | get issuedDate(): Date { 45 | return this._issuedDate; 46 | } 47 | 48 | set issuedDate(value: Date) { 49 | this._issuedDate = value; 50 | } 51 | 52 | get expiryDate(): Date { 53 | return this._expiryDate; 54 | } 55 | 56 | set expiryDate(value: Date) { 57 | this._expiryDate = value; 58 | } 59 | 60 | get credentialId(): string { 61 | return this._credentialId; 62 | } 63 | 64 | set credentialId(value: string) { 65 | this._credentialId = value; 66 | } 67 | 68 | get url(): string { 69 | return this._url; 70 | } 71 | 72 | set url(value: string) { 73 | this._url = value; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/app/models/Education.ts: -------------------------------------------------------------------------------- 1 | import Location from "./Location"; 2 | import Link from "./Link"; 3 | import Activity from "./Activity"; 4 | 5 | export default class Education { 6 | 7 | private _school: string; 8 | private _degree: string; 9 | private _fieldOfStudy: string; 10 | private _isCurrent: boolean; 11 | private _startDate: Date; 12 | private _endDate: Date; 13 | private _location: Location; 14 | private _activities: Activity[]; 15 | private _links: Link[]; 16 | 17 | constructor(school: string, degree: string, fieldOfStudy: string, isCurrent: boolean, startDate: Date, endDate: Date, location: Location, activities: Activity[], links: Link[]) { 18 | this._school = school; 19 | this._degree = degree; 20 | this._fieldOfStudy = fieldOfStudy; 21 | this._isCurrent = isCurrent; 22 | this._startDate = new Date(startDate); 23 | this._endDate = new Date(endDate); 24 | this._location = location; 25 | this._activities = activities; 26 | this._links = links; 27 | } 28 | 29 | 30 | get school(): string { 31 | return this._school; 32 | } 33 | 34 | set school(value: string) { 35 | this._school = value; 36 | } 37 | 38 | get degree(): string { 39 | return this._degree; 40 | } 41 | 42 | set degree(value: string) { 43 | this._degree = value; 44 | } 45 | 46 | get fieldOfStudy(): string { 47 | return this._fieldOfStudy; 48 | } 49 | 50 | set fieldOfStudy(value: string) { 51 | this._fieldOfStudy = value; 52 | } 53 | 54 | get isCurrent(): boolean { 55 | return this._isCurrent; 56 | } 57 | 58 | set isCurrent(value: boolean) { 59 | this._isCurrent = value; 60 | } 61 | 62 | get startDate(): Date { 63 | return this._startDate; 64 | } 65 | 66 | set startDate(value: Date) { 67 | this._startDate = value; 68 | } 69 | 70 | get endDate(): Date { 71 | return this._endDate; 72 | } 73 | 74 | set endDate(value: Date) { 75 | this._endDate = value; 76 | } 77 | 78 | get location(): Location { 79 | return this._location; 80 | } 81 | 82 | set location(value: Location) { 83 | this._location = value; 84 | } 85 | 86 | get activities(): Activity[] { 87 | return this._activities; 88 | } 89 | 90 | set activities(value: Activity[]) { 91 | this._activities = value; 92 | } 93 | 94 | get links(): Link[] { 95 | return this._links; 96 | } 97 | 98 | set links(value: Link[]) { 99 | this._links = value; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/app/models/Link.ts: -------------------------------------------------------------------------------- 1 | export default class Link { 2 | private _description: string; 3 | private _url: string; 4 | 5 | constructor(description: string, url: string) { 6 | this._description = description; 7 | this._url = url; 8 | } 9 | 10 | get description(): string { 11 | return this._description; 12 | } 13 | 14 | set description(value: string) { 15 | this._description = value; 16 | } 17 | 18 | get url(): string { 19 | return this._url; 20 | } 21 | 22 | set url(value: string) { 23 | this._url = value; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app/models/Location.ts: -------------------------------------------------------------------------------- 1 | 2 | export default class Location { 3 | private _city: string; 4 | private _country: string; 5 | 6 | constructor(city: string, country: string) { 7 | this._city = city; 8 | this._country = country; 9 | } 10 | 11 | get city(): string { 12 | return this._city; 13 | } 14 | 15 | set city(value: string) { 16 | this._city = value; 17 | } 18 | 19 | get country(): string { 20 | return this._country; 21 | } 22 | 23 | set country(value: string) { 24 | this._country = value; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/models/Project.ts: -------------------------------------------------------------------------------- 1 | import Location from "./Location"; 2 | import Technology from "./Technology"; 3 | import ProjectLink from "./ProjectLink"; 4 | 5 | export default class Project { 6 | private _name: string; 7 | private _description: string; 8 | private _status: string; 9 | private _category: string; 10 | private _startDate: Date; 11 | private _endDate: Date; 12 | private _location: Location; 13 | private _client: string; 14 | private _technologies: Technology[]; 15 | private _links: ProjectLink[]; 16 | 17 | constructor(name: string, description: string, status: string, category: string, startDate: Date, endDate: Date, location: Location, client: string, technologies: Technology[], links: ProjectLink[]) { 18 | this._name = name; 19 | this._description = description; 20 | this._status = status; 21 | this._category = category; 22 | this._startDate = new Date(startDate); 23 | this._endDate = new Date(endDate); 24 | this._location = location; 25 | this._client = client; 26 | this._technologies = technologies; 27 | this._links = links; 28 | } 29 | 30 | get name(): string { 31 | return this._name; 32 | } 33 | 34 | set name(value: string) { 35 | this._name = value; 36 | } 37 | 38 | get description(): string { 39 | return this._description; 40 | } 41 | 42 | set description(value: string) { 43 | this._description = value; 44 | } 45 | 46 | get status(): string { 47 | return this._status; 48 | } 49 | 50 | set status(value: string) { 51 | this._status = value; 52 | } 53 | 54 | get category(): string { 55 | return this._category; 56 | } 57 | 58 | set category(value: string) { 59 | this._category = value; 60 | } 61 | 62 | get startDate(): Date { 63 | return this._startDate; 64 | } 65 | 66 | set startDate(value: Date) { 67 | this._startDate = value; 68 | } 69 | 70 | get endDate(): Date { 71 | return this._endDate; 72 | } 73 | 74 | set endDate(value: Date) { 75 | this._endDate = value; 76 | } 77 | 78 | get location(): Location { 79 | return this._location; 80 | } 81 | 82 | set location(value: Location) { 83 | this._location = value; 84 | } 85 | 86 | get client(): string { 87 | return this._client; 88 | } 89 | 90 | set client(value: string) { 91 | this._client = value; 92 | } 93 | 94 | get technologies(): Technology[] { 95 | return this._technologies; 96 | } 97 | 98 | set technologies(value: Technology[]) { 99 | this._technologies = value; 100 | } 101 | 102 | get links(): ProjectLink[] { 103 | return this._links; 104 | } 105 | 106 | set links(value: ProjectLink[]) { 107 | this._links = value; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/app/models/ProjectLink.ts: -------------------------------------------------------------------------------- 1 | export default class ProjectLink { 2 | private _description: string; 3 | private _url: string; 4 | private _type: string; 5 | 6 | constructor(description: string, url: string, type: string) { 7 | this._description = description; 8 | this._url = url; 9 | this._type = type; 10 | } 11 | 12 | get description(): string { 13 | return this._description; 14 | } 15 | 16 | set description(value: string) { 17 | this._description = value; 18 | } 19 | 20 | get url(): string { 21 | return this._url; 22 | } 23 | 24 | set url(value: string) { 25 | this._url = value; 26 | } 27 | 28 | get type(): string { 29 | return this._type; 30 | } 31 | 32 | set type(value: string) { 33 | this._type = value; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/models/Responsibility.ts: -------------------------------------------------------------------------------- 1 | 2 | export default class Responsibility { 3 | private _responsibility: string; 4 | 5 | constructor(responsibility: string) { 6 | this._responsibility = responsibility; 7 | } 8 | 9 | get responsibility(): string { 10 | return this._responsibility; 11 | } 12 | 13 | set responsibility(value: string) { 14 | this._responsibility = value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/models/Technology.ts: -------------------------------------------------------------------------------- 1 | export default class Technology { 2 | private _technology: string; 3 | 4 | constructor(technology: string) { 5 | this._technology = technology; 6 | } 7 | 8 | get technology(): string { 9 | return this._technology; 10 | } 11 | 12 | set technology(value: string) { 13 | this._technology = value; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/models/WorkExperience.ts: -------------------------------------------------------------------------------- 1 | import Location from "./Location"; 2 | import Link from "./Link"; 3 | import Responsibility from "./Responsibility"; 4 | 5 | export default class WorkExperience { 6 | private _position: string; 7 | private _company: string; 8 | private _employmentType: string; 9 | private _isCurrent: boolean; 10 | private _startDate: Date; 11 | private _endDate: Date; 12 | private _location: Location; 13 | private _responsibilities: Responsibility[]; 14 | private _links: Link[]; 15 | 16 | constructor(position: string, company: string, employmentType: string, isCurrent: boolean, startDate: Date, endDate: Date, location: Location, responsibilities: Responsibility[], links: Link[]) { 17 | this._position = position; 18 | this._company = company; 19 | this._employmentType = employmentType; 20 | this._isCurrent = isCurrent; 21 | this._startDate = startDate; 22 | this._endDate = endDate; 23 | this._location = location; 24 | this._responsibilities = responsibilities; 25 | this._links = links; 26 | } 27 | 28 | get position(): string { 29 | return this._position; 30 | } 31 | 32 | set position(value: string) { 33 | this._position = value; 34 | } 35 | 36 | get company(): string { 37 | return this._company; 38 | } 39 | 40 | set company(value: string) { 41 | this._company = value; 42 | } 43 | 44 | get employmentType(): string { 45 | return this._employmentType; 46 | } 47 | 48 | set employmentType(value: string) { 49 | this._employmentType = value; 50 | } 51 | 52 | get isCurrent(): boolean { 53 | return this._isCurrent; 54 | } 55 | 56 | set isCurrent(value: boolean) { 57 | this._isCurrent = value; 58 | } 59 | 60 | get startDate(): Date { 61 | return this._startDate; 62 | } 63 | 64 | set startDate(value: Date) { 65 | this._startDate = value; 66 | } 67 | 68 | get endDate(): Date { 69 | return this._endDate; 70 | } 71 | 72 | set endDate(value: Date) { 73 | this._endDate = value; 74 | } 75 | 76 | get location(): Location { 77 | return this._location; 78 | } 79 | 80 | set location(value: Location) { 81 | this._location = value; 82 | } 83 | 84 | get responsibilities(): Responsibility[] { 85 | return this._responsibilities; 86 | } 87 | 88 | set responsibilities(value: Responsibility[]) { 89 | this._responsibilities = value; 90 | } 91 | 92 | get links(): Link[] { 93 | return this._links; 94 | } 95 | 96 | set links(value: Link[]) { 97 | this._links = value; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/app/routing/certificate/certificate.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/routing/certificate/certificate.component.css -------------------------------------------------------------------------------- /src/app/routing/certificate/certificate.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |

Certifications

16 |
17 | 18 |
19 | 20 | 21 | 22 |
23 | 24 | 25 |
26 |
27 |
28 | 29 |
30 |
31 |
32 |
{{certificate.name}}
33 |
{{certificate.organization}}
34 |
35 |
36 | {{certificate.issuedDate | date:'MMM y'}} - {{ certificate.expiryDate | date:'MMM y'}} 37 |
38 |
39 |
Description:
40 | {{certificate.description}} 41 |
Credential ID:
42 | {{certificate.credentialId}} 43 |
Url:
{{certificate.url}} 44 |
45 |
46 | 47 |
48 | 49 | 50 |
51 | 52 | 53 |
54 | 55 | 56 |
57 | 58 | -------------------------------------------------------------------------------- /src/app/routing/certificate/certificate.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CertificateComponent } from './certificate.component'; 4 | 5 | describe('CertificateComponent', () => { 6 | let component: CertificateComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ CertificateComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(CertificateComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/routing/certificate/certificate.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from '@angular/core'; 2 | import {CertificatesService} from "../../services/certificates/certificates.service"; 3 | import Certificate from "../../models/Certificate"; 4 | 5 | @Component({ 6 | selector: 'app-certificate', 7 | templateUrl: './certificate.component.html', 8 | styleUrls: ['./certificate.component.css'] 9 | }) 10 | export class CertificateComponent implements OnInit { 11 | 12 | private certificateService: CertificatesService 13 | certificates: Certificate[] | undefined; 14 | 15 | constructor(certificateService: CertificatesService) { 16 | this.certificateService = certificateService; 17 | } 18 | 19 | ngOnInit(): void { 20 | this.certificateService.getCertificates().subscribe((certs) => { 21 | this.certificates = certs; 22 | }); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/app/routing/contact/contact.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/routing/contact/contact.component.css -------------------------------------------------------------------------------- /src/app/routing/contact/contact.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |

Contact information

16 |
17 | 18 |
19 | 20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 |
28 |
    29 |
  • 30 |
    Country:
    {{getLatestLocation()?.country}} 31 |
  • 32 |
  • 33 |
    City:
    {{getLatestLocation()?.city}} 34 |
  • 35 |
36 |
37 |
38 | 39 |
40 | 41 | 42 |
43 | 44 |
45 |
46 |
    47 |
  • LinkedIn:
  • 50 |
  • Github:
    52 |
  • 53 |
  • Instagram:
  • 56 |
  • Facebook:
  • 59 |
  • Docker:
  • 62 |
63 |
64 |
65 | 66 |
67 | 68 | 69 |
70 | 71 |
72 |
73 |
    74 |
  • 75 |
    Email:
    info@tomondre.com 76 |
  • 77 |
  • 78 |
    Phone:
    +421 949 328 168 79 |
  • 80 |
  • 81 |
    CV:
    82 |
  • 83 |
84 |
85 |
86 | 87 | 88 |
89 | 90 | 91 | 92 |
93 | 94 | 95 |
96 | 97 |
98 | 99 |

Get in touch

100 |
101 | 102 |
103 | 104 | 105 | 106 |
107 | 108 | 109 |
111 | 112 |
113 | 114 | 116 | 117 | 118 |
119 | 120 | 121 |
122 | 123 | 125 | 126 | 127 |
128 | 129 | 130 |
131 | 132 | 134 | 135 | 136 |
137 | 138 | 139 |
140 | 142 | 143 |
Success
144 |
145 |
146 | 147 | 148 |
149 | 150 | 151 |
152 | 153 | 154 |
155 | 156 | 157 |
158 | 159 | -------------------------------------------------------------------------------- /src/app/routing/contact/contact.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ContactComponent } from './contact.component'; 4 | 5 | describe('ContactComponent', () => { 6 | let component: ContactComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ContactComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ContactComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/routing/contact/contact.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import Location from "../../models/Location"; 3 | import {ProjectsService} from "../../services/projects/projects.service"; 4 | 5 | @Component({ 6 | selector: 'app-contact', 7 | templateUrl: './contact.component.html', 8 | styleUrls: ['./contact.component.css'] 9 | }) 10 | export class ContactComponent implements OnInit { 11 | 12 | private location: Location | undefined; 13 | 14 | constructor(private projectService: ProjectsService) { } 15 | 16 | ngOnInit(): void { 17 | } 18 | 19 | getLatestLocation(): Location | undefined { 20 | if (!this.location) { 21 | this.projectService.getProjects().subscribe(projects => { 22 | this.location = projects.reduce((prev, curr) => { 23 | return prev.endDate > curr.endDate ? prev : curr; 24 | }).location; 25 | }); 26 | } 27 | return this.location; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app/routing/history/history.component.css: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/routing/history/history.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |

Education

16 |
17 | 18 |
19 | 20 | 21 | 22 | 45 | 46 | 47 |
48 |
49 | 50 | 51 |
52 | 53 |
54 | 55 |

Work History

56 |
57 | 58 |
59 | 60 | 61 | 62 |
63 | 64 | 65 |
66 |
67 |
68 | 69 | 70 |
71 |
72 |
73 |
{{experience.company}}
74 |
{{experience.position}}
75 |
76 |
77 | {{experience.startDate | date:'MMM y'}} - {{experience.isCurrent? 'present': experience.endDate | date:'MMM y'}} 78 |
79 |
80 |

{{getResponsibilities(experience)}}

81 |
82 |
83 | 84 |
85 | 86 | 87 |
88 | 89 | 90 |
91 | 92 | 93 |
94 | 95 | -------------------------------------------------------------------------------- /src/app/routing/history/history.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HistoryComponent } from './history.component'; 4 | 5 | describe('HistoryComponent', () => { 6 | let component: HistoryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ HistoryComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(HistoryComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/routing/history/history.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewEncapsulation} from '@angular/core'; 2 | import {EducationsService} from "../../services/educations/educations.service"; 3 | import Education from "../../models/Education"; 4 | import WorkExperience from "../../models/WorkExperience"; 5 | import {WorkExperiencesService} from "../../services/work-experience/work-experiences.service"; 6 | 7 | @Component({ 8 | selector: 'app-history', 9 | templateUrl: './history.component.html', 10 | styleUrls: ['./history.component.css'], 11 | encapsulation: ViewEncapsulation.None 12 | }) 13 | export class HistoryComponent implements OnInit { 14 | 15 | educations: Education[] = []; 16 | workExperiences: WorkExperience[] = []; 17 | 18 | constructor(private educationService: EducationsService, private workExperienceService: WorkExperiencesService) { } 19 | 20 | ngOnInit(): void { 21 | this.educationService.getEducations().subscribe(educations => { 22 | this.educations = educations; 23 | }); 24 | 25 | this.workExperienceService.getWorkExperiences().subscribe(workExperiences => { 26 | this.workExperiences = workExperiences; 27 | }); 28 | } 29 | 30 | getActivities(education: Education): string { 31 | let activities = ""; 32 | for (let i = 0; i < education.activities.length; i++) { 33 | activities += "• " + education.activities[i].activity; 34 | activities += "\n"; 35 | } 36 | return activities; 37 | } 38 | 39 | getResponsibilities(experience: WorkExperience): string { 40 | let responsibilities = ""; 41 | for (let i = 0; i < experience.responsibilities.length; i++) { 42 | responsibilities += "• " + experience.responsibilities[i].responsibility; 43 | responsibilities += "\n"; 44 | } 45 | return responsibilities; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/app/routing/index/index.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/routing/index/index.component.css -------------------------------------------------------------------------------- /src/app/routing/index/index.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 |
20 | 21 |

Discover my Amazing
Work Space!

22 | 23 |
<code> I make </code> 26 |
27 | 28 |
29 | 30 | 31 | Tomas Ondrejka 32 |
33 | 34 |
35 | 36 | 37 |
38 | 39 |
40 | 41 | 42 |
43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 |
53 | 54 | 55 |
56 | 57 | 58 |
59 | 60 |
61 | 62 |

My skills

63 |
64 | 65 |
66 | 67 | 68 |
69 | 70 | 71 | 72 |
73 | 74 | 75 |
76 | 77 |
78 | 79 |
{{getCards()[0].title}}
80 | 81 |
{{getCards()[0].description}}
82 | 83 |
84 | 85 |
86 | 87 | 88 |
89 | 90 | 91 | 92 |
93 | 94 | 95 |
96 | 97 |
98 | 99 |
{{getCards()[1].title}}
100 | 101 |
{{getCards()[1].description}}
102 | 103 |
104 | 105 |
106 | 107 | 108 |
109 | 110 | 111 | 112 |
113 | 114 | 115 |
116 | 117 |
118 | 119 |
{{getCards()[2].title}}
120 | 121 |
{{getCards()[2].description}} 122 |
123 | 124 |
125 | 126 |
127 | 128 |
129 | 130 | 131 |
132 | 133 |
134 | 135 | -------------------------------------------------------------------------------- /src/app/routing/index/index.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { IndexComponent } from './index.component'; 4 | 5 | describe('IndexComponent', () => { 6 | let component: IndexComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ IndexComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(IndexComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/routing/index/index.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewEncapsulation} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-index', 5 | templateUrl: './index.component.html', 6 | styleUrls: ['./index.component.css'], 7 | encapsulation: ViewEncapsulation.None 8 | }) 9 | export class IndexComponent implements OnInit { 10 | 11 | constructor() { } 12 | 13 | ngOnInit(): void { 14 | } 15 | 16 | getCards(): Card[] { 17 | return [{ 18 | title: 'Java', 19 | description:'Java was first object-oriented programming language I have learned on a high level. The knowledge of Java, learned from school was used on creating projects throughout the semesters and projects outside school. From creating my first Hello World application, through first database connection to creating first RESTful API with Spring, Java is a language from which I got all foundation of object-oriented programming.' 20 | }, { 21 | title: 'JavaScript', 22 | description:'Hands on experience with JavaScript on several projects. The language have been used mostly with NPMjs to ensure easier dependency managing and easier development. Because of JavaScript loose typing, I have learned how not to lose my nerves after getting a random exception that has nothing to do with the real bug and how to debug these issues efficiently (not only in js).' 23 | }, { 24 | title: 'C#', 25 | description:'My C# knowledge grew after learning it in school. The language was used in .NET projects for creating Blazor Server Apps and WEB APIs. Hands-on experience with connecting .net applications to MySQL database via LINQ on a project.\n' 26 | }]; 27 | } 28 | 29 | 30 | } 31 | 32 | interface Card { 33 | title: string; 34 | description: string; 35 | } 36 | -------------------------------------------------------------------------------- /src/app/routing/project/project.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/routing/project/project.component.css -------------------------------------------------------------------------------- /src/app/routing/project/project.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |

{{project?.name}}

16 |
17 | 18 | 19 |
20 |
{{project?.category}}
21 |
22 | 23 |
24 | 25 | 26 |
27 | 28 | 29 | 30 |
31 | 32 | 33 |
34 | 35 |
36 | 37 | 38 | 39 |
40 | 41 | 44 | 45 | item 47 | 48 | 49 | 50 | 51 |
52 | 53 | 54 | 55 | 56 |
57 | 58 |
59 | 60 |
61 | 62 | 63 |
64 | 65 | 66 |
67 | 68 | 69 |
70 | 71 | 72 |
73 | 74 |
75 | 76 | 77 | 78 |
79 | 80 | 81 |
82 | 83 |
85 | 86 |
88 |
89 | 90 | 91 |
92 | 93 | 94 |
95 | 96 | 97 |
98 | 99 | 100 |
101 | 102 | 103 |
104 | 105 | 106 | 107 |
108 | 109 | 110 |
111 | 112 | 113 |
114 | 115 | 116 |
117 | 118 |
119 | 120 |

Project details

121 |
122 | 123 |
124 | 125 | 126 |
127 | 128 | 129 | 130 |
131 | 132 |
133 |
Description
134 |
{{project?.description}}
135 | 136 |
137 | 138 |
139 | 140 | 141 | 142 |
143 | 144 |
145 | 146 |
147 |
    148 |
  • 149 |
    Start Date:
    {{project?.startDate | date:'dd.MM.yyyy' }} 150 |
  • 151 |
  • 152 |
    Final Date:
    {{project?.endDate | date:'dd.MM.yyyy' }} 153 |
  • 154 |
  • 155 |
    Status:
    {{project?.status}} 156 |
  • 157 |
  • 158 |
    Client:
    159 | {{project?.client}} 160 |
  • 161 |
  • 162 |
    Location:
    {{project?.location?.country}}, {{project?.location?.city}} 163 |
  • 164 |
  • 165 |
    Technologies:
    166 | {{getProjectTechnologies()}} 167 |
  • 168 |
  • 169 |
    {{link.description}}
    170 | 171 | 173 |
  • 174 |
175 |
176 | 177 |
178 | 179 |
180 | 181 | 182 |
183 | 184 | 185 |
186 | 187 | 188 | 189 |
190 | 191 | 192 | 193 |
194 | 195 | 196 | 197 | 198 | 199 |
200 | 201 | 202 |
203 | 204 | 205 | 206 | 207 |
208 | 209 | 210 |
211 | 212 | -------------------------------------------------------------------------------- /src/app/routing/project/project.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectComponent } from './project.component'; 4 | 5 | describe('ProjectComponent', () => { 6 | let component: ProjectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ProjectComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/routing/project/project.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewEncapsulation} from '@angular/core'; 2 | import {ProjectsService} from "../../services/projects/projects.service"; 3 | import Project from "../../models/Project"; 4 | import ProjectLink from "../../models/ProjectLink"; 5 | import {ActivatedRoute} from "@angular/router"; 6 | 7 | @Component({ 8 | selector: 'app-project', 9 | templateUrl: './project.component.html', 10 | styleUrls: ['./project.component.css'], 11 | encapsulation: ViewEncapsulation.None 12 | }) 13 | export class ProjectComponent implements OnInit { 14 | 15 | projects: Project[] = []; 16 | project: Project | undefined; 17 | routeSub: any; 18 | 19 | constructor(private projectService: ProjectsService, private route: ActivatedRoute) { 20 | } 21 | 22 | ngOnInit(): void { 23 | this.projectService.getProjects().subscribe(projects => { 24 | this.projects = projects; 25 | this.routeSub = this.route.params.subscribe(params => { 26 | 27 | this.projects.forEach(project => { 28 | if (project.name === params['name']) { 29 | this.project = project; 30 | } 31 | }); 32 | }); 33 | }); 34 | } 35 | 36 | getProjectTechnologies(): string { 37 | let technologies = ""; 38 | if (this.project) { 39 | for (let i = 0; i < this.project.technologies.length; i++) { 40 | technologies += this.project.technologies[i].technology; 41 | 42 | if (this.project.technologies.length - 1 !== i) { 43 | technologies += ", "; 44 | } 45 | } 46 | } 47 | 48 | return technologies; 49 | } 50 | 51 | getProject(): Project | undefined { 52 | return this.project; 53 | } 54 | 55 | getProjectPictures(): string[] | undefined { 56 | let links: string[] = []; 57 | this.project?.links.forEach(link => { 58 | if (link.type === "Image") { 59 | links.push(link.url); 60 | } 61 | }); 62 | return links 63 | } 64 | 65 | getProjectLinks(): ProjectLink[] { 66 | let links: ProjectLink[] = []; 67 | this.project?.links.forEach(link => { 68 | if (link.type !== "Image") { 69 | links.push(link); 70 | } 71 | }); 72 | return links; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/app/routing/routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import {RouterModule, Routes} from "@angular/router"; 4 | import {IndexComponent} from "./index/index.component"; 5 | import {ContactComponent} from "./contact/contact.component"; 6 | import {HistoryComponent} from "./history/history.component"; 7 | import {ProjectComponent} from "./project/project.component"; 8 | import {CertificateComponent} from "./certificate/certificate.component"; 9 | 10 | const routes: Routes = [ 11 | { path: '', component: IndexComponent }, 12 | { path: 'contact', component: ContactComponent }, 13 | { path: 'history', component: HistoryComponent }, 14 | { path: 'certifications', component: CertificateComponent}, 15 | { path: 'projects/:name', component: ProjectComponent } 16 | 17 | ] 18 | 19 | 20 | @NgModule({ 21 | declarations: [], 22 | imports: [RouterModule.forRoot(routes)], 23 | exports: [RouterModule] 24 | }) 25 | export class RoutingModule { } 26 | export const routingComponents = [IndexComponent, ContactComponent, HistoryComponent, ProjectComponent, CertificateComponent]; 27 | -------------------------------------------------------------------------------- /src/app/services/certificates/certificates.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { CertificatesService } from './certificates.service'; 4 | 5 | describe('CertificatesService', () => { 6 | let service: CertificatesService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(CertificatesService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/services/certificates/certificates.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {HttpClient} from "@angular/common/http"; 3 | import {Observable} from "rxjs"; 4 | import Education from "../../models/Education"; 5 | import {environment} from "../../../environments/environment.prod"; 6 | import Certificate from "../../models/Certificate"; 7 | 8 | @Injectable({ 9 | providedIn: 'root' 10 | }) 11 | export class CertificatesService { 12 | 13 | private certificates: Observable | undefined; 14 | 15 | constructor(private http: HttpClient) { 16 | } 17 | 18 | getCertificates(): Observable { 19 | let apiUrl = environment.apiUrl; 20 | if (!this.certificates) { 21 | this.certificates = this.http.get(apiUrl + '/certificates'); 22 | } 23 | return this.certificates; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app/services/educations/educations.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { EducationsService } from './educations.service'; 4 | 5 | describe('EducationsService', () => { 6 | let service: EducationsService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(EducationsService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/services/educations/educations.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {HttpClient} from "@angular/common/http"; 3 | import {Observable} from "rxjs"; 4 | import Education from "../../models/Education"; 5 | import {environment} from "../../../environments/environment.prod"; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class EducationsService { 11 | 12 | private educations: Observable | undefined; 13 | 14 | constructor(private http: HttpClient) { 15 | } 16 | 17 | getEducations(): Observable { 18 | let apiUrl = environment.apiUrl; 19 | if (!this.educations) { 20 | this.educations = this.http.get(apiUrl + '/educations'); 21 | } 22 | return this.educations 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/services/projects/projects.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectsService } from './projects.service'; 4 | 5 | describe('ProjectsService', () => { 6 | let service: ProjectsService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(ProjectsService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/services/projects/projects.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import Project from "../../models/Project"; 3 | import {HttpClient} from "@angular/common/http"; 4 | import {environment} from "../../../environments/environment.prod"; 5 | import {Observable, share} from "rxjs"; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class ProjectsService { 11 | 12 | private projects: Observable | undefined; 13 | 14 | constructor(private http: HttpClient) { 15 | } 16 | 17 | getProjects(): Observable { 18 | let apiUrl = environment.apiUrl; 19 | if (!this.projects) { 20 | this.projects = this.http.get(apiUrl + '/projects').pipe(share()); 21 | } 22 | return this.projects; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/services/services.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | 5 | 6 | @NgModule({ 7 | declarations: [ 8 | ], 9 | imports: [ 10 | CommonModule 11 | ] 12 | }) 13 | export class ServicesModule { } 14 | -------------------------------------------------------------------------------- /src/app/services/work-experience/work-eperiences.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { WorkExperiencesService } from './work-experiences.service'; 4 | 5 | describe('WorkEperiencesService', () => { 6 | let service: WorkExperiencesService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(WorkExperiencesService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/services/work-experience/work-experiences.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import {HttpClient} from "@angular/common/http"; 3 | import {Observable} from "rxjs"; 4 | import WorkExperience from "../../models/WorkExperience"; 5 | import {environment} from "../../../environments/environment.prod"; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class WorkExperiencesService { 11 | 12 | private workExperiences: Observable | undefined; 13 | 14 | constructor(private http: HttpClient) { 15 | } 16 | 17 | getWorkExperiences(): Observable { 18 | let apiUrl = environment.apiUrl; 19 | if (!this.workExperiences) { 20 | this.workExperiences = this.http.get(apiUrl + '/workExperiences'); 21 | } 22 | return this.workExperiences 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/shared/about-me/about-me.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/shared/about-me/about-me.component.css -------------------------------------------------------------------------------- /src/app/shared/about-me/about-me.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 |
19 | 20 |
21 | 22 | avatar 23 | 24 | 25 | 26 |
27 | 28 |
29 |
30 |
31 | 32 | 33 |
Tomas Ondrejka
34 | 35 |
Software Developer
Software Engineering Student
36 |
37 | 38 | 39 | 40 |
41 | 42 | 43 |
44 | 45 |
    46 | 47 |
  • 48 |
    Location:
    {{getLatestLocation()?.country}} 49 |
  • 50 | 51 |
  • 52 |
    City:
    {{getLatestLocation()?.city}} 53 |
  • 54 | 55 |
  • 56 |
    Age:
    {{getAge()}} 57 |
  • 58 |
59 |
60 | 61 | 62 | 63 |
64 | 65 | 66 |
67 | 68 | 69 |
70 |
71 | 72 |
Slovak
73 |
74 | 75 | 76 | 77 |
78 |
79 | 80 |
English
81 |
82 | 83 | 84 | 85 |
86 |
87 | 88 |
Danish
89 |
90 |
91 | 92 | 93 | 94 |
95 | 96 | 97 |
98 | 99 | 100 |
101 |
102 | 103 |
TypeScript
104 |
105 | 106 |
107 | 108 |
109 |
110 | 111 |
112 | 113 | 114 | 115 |
116 |
117 | 118 |
AWS
119 |
120 | 121 |
122 | 123 |
124 |
125 | 126 |
127 | 128 | 129 | 130 |
131 |
132 | 133 |
Terraform
134 |
135 | 136 |
137 | 138 |
139 |
140 | 141 |
142 | 143 | 144 | 145 |
146 |
147 | 148 |
Java
149 |
150 | 151 |
152 | 153 |
154 |
155 | 156 |
157 | 158 | 159 |
160 | 161 | 162 | 163 |
164 | 165 | 166 |
    167 | 168 |
  • Git Knowledge
  • 169 | 170 |
  • Kubernetes
  • 171 | 172 |
  • Networking
  • 173 | 174 |
  • Spring Boot
  • 175 |
176 | 177 | 178 | 179 |
180 | 181 | 182 | 189 | 190 | 191 |
192 | 193 | 194 | 195 |
196 | 197 | 199 | 201 | 203 | 205 | 206 |
207 | 208 | 209 |
210 | 211 | 212 |
213 | -------------------------------------------------------------------------------- /src/app/shared/about-me/about-me.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AboutMeComponent } from './about-me.component'; 4 | 5 | describe('AboutMeComponent', () => { 6 | let component: AboutMeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ AboutMeComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AboutMeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/shared/about-me/about-me.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, ElementRef, OnInit, ViewEncapsulation} from '@angular/core'; 2 | import {ProjectsService} from "../../services/projects/projects.service"; 3 | import Location from "../../models/Location"; 4 | 5 | @Component({ 6 | selector: 'app-about-me', 7 | templateUrl: './about-me.component.html', 8 | styleUrls: ['./about-me.component.css'], 9 | encapsulation: ViewEncapsulation.None 10 | }) 11 | export class AboutMeComponent implements OnInit { 12 | 13 | location: Location | undefined; 14 | 15 | constructor(private projectService: ProjectsService, private elementRef: ElementRef) { 16 | } 17 | 18 | ngOnInit(): void { 19 | var s = document.createElement("script"); 20 | s.type = "text/javascript"; 21 | s.src = "/assets/js/about-me.custom.js"; 22 | this.elementRef.nativeElement.appendChild(s); 23 | } 24 | 25 | getAge(): number { 26 | let number = new Date().getTime() - new Date('2000-11-01').getTime(); 27 | return Math.floor(number / (1000 * 60 * 60 * 24 * 365)); 28 | } 29 | 30 | getLatestLocation(): Location | undefined { 31 | if (!this.location) { 32 | this.projectService.getProjects().subscribe(projects => { 33 | this.location = projects.reduce((prev, curr) => { 34 | return prev.endDate > curr.endDate ? prev : curr; 35 | }).location; 36 | }); 37 | } 38 | return this.location; 39 | } 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/app/shared/experience-summary/experience-summary.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/shared/experience-summary/experience-summary.component.css -------------------------------------------------------------------------------- /src/app/shared/experience-summary/experience-summary.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 10 |
11 | 12 |
13 | 14 | {{getExperienceYears()}}+ 15 |
16 | 17 | 18 |
Years Experience
19 |
20 | 21 | 22 |
23 | 24 | 25 | 26 |
27 | 28 | 29 |
30 | 31 | 32 |
33 | 34 |
35 | 36 | {{getCompletedProjectsCount()}} 37 |
38 | 39 | 40 |
Completed Projects
41 |
42 | 43 | 44 |
45 | 46 |
47 | 48 | 49 | 50 |
51 | 52 | 53 |
54 | 55 |
56 | 57 | {{getCustomersCount()}} 58 |
59 | 60 | 61 |
Happy Customers
62 |
63 | 64 | 65 |
66 | 67 | 68 | 69 |
70 |
71 | 72 | 73 |
74 | 75 |
76 | 77 | 1 78 |
79 | 80 | 81 |
Projects In Progress
82 |
83 | 84 | 85 |
86 |
87 | 88 | 89 |
90 | 91 | 92 |
93 | -------------------------------------------------------------------------------- /src/app/shared/experience-summary/experience-summary.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ExperienceSummaryComponent } from './experience-summary.component'; 4 | 5 | describe('ExperienceSummaryComponent', () => { 6 | let component: ExperienceSummaryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ExperienceSummaryComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ExperienceSummaryComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/shared/experience-summary/experience-summary.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewEncapsulation} from '@angular/core'; 2 | import {ProjectsService} from "../../services/projects/projects.service"; 3 | import Project from "../../models/Project"; 4 | import {addCommandModuleToYargs} from "@angular/cli/src/command-builder/utilities/command"; 5 | 6 | @Component({ 7 | selector: 'app-experience-summary', 8 | templateUrl: './experience-summary.component.html', 9 | styleUrls: ['./experience-summary.component.css'], 10 | encapsulation: ViewEncapsulation.None 11 | }) 12 | export class ExperienceSummaryComponent implements OnInit { 13 | 14 | projects: Project[] = []; 15 | 16 | constructor(private projectsService: ProjectsService) { 17 | } 18 | 19 | ngOnInit(): void { 20 | this.projectsService.getProjects().subscribe(projects => { 21 | this.projects = projects; 22 | }); 23 | } 24 | 25 | getExperienceYears(): number { 26 | let date = new Date(); 27 | if (this.projects) { 28 | this.projects.forEach(project => { 29 | let projectDate = new Date(project.startDate); 30 | if (projectDate < date) { 31 | date = projectDate; 32 | } 33 | }); 34 | } 35 | return new Date().getFullYear() - date.getFullYear(); 36 | } 37 | 38 | getCompletedProjectsCount(): number { 39 | if (this.projects) { 40 | return this.projects.filter(project => project.status === 'Finished').length; 41 | } 42 | return 0; 43 | } 44 | 45 | getCustomersCount(): number { 46 | if (this.projects) { 47 | let customers = new Set(); 48 | this.projects.forEach(project => { 49 | customers.add(project.client); 50 | }); 51 | return customers.size; 52 | } 53 | return 0; 54 | } 55 | 56 | getProjectInProgressCount(): number { 57 | if (this.projects) { 58 | return this.projects.filter(project => project.status === 'In Progress').length; 59 | } 60 | return 0; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/shared/footer/footer.component.css -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 |
© 2022 Artur Carter
8 | 9 | 12 |
13 | 14 |
15 | 16 | -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FooterComponent } from './footer.component'; 4 | 5 | describe('FooterComponent', () => { 6 | let component: FooterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ FooterComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(FooterComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewEncapsulation} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | templateUrl: './footer.component.html', 6 | styleUrls: ['./footer.component.css'], 7 | encapsulation: ViewEncapsulation.None 8 | }) 9 | export class FooterComponent implements OnInit { 10 | 11 | constructor() { } 12 | 13 | ngOnInit(): void { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/shared/navigation/navigation.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/app/shared/navigation/navigation.component.css -------------------------------------------------------------------------------- /src/app/shared/navigation/navigation.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 |
23 | 24 | 25 | 54 | 55 | 56 | 57 |
    58 | 59 | 60 |
  • EN
  • 61 |
62 | 63 | 64 |
65 | 66 | 67 |
68 | 69 | 70 |
71 | -------------------------------------------------------------------------------- /src/app/shared/navigation/navigation.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NavigationComponent } from './navigation.component'; 4 | 5 | describe('NavigationComponent', () => { 6 | let component: NavigationComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ NavigationComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(NavigationComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/shared/navigation/navigation.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, ElementRef, OnInit, ViewEncapsulation} from '@angular/core'; 2 | import {ProjectsService} from "../../services/projects/projects.service"; 3 | import Project from "../../models/Project"; 4 | import {Router} from "@angular/router"; 5 | 6 | @Component({ 7 | selector: 'app-navigation', 8 | templateUrl: './navigation.component.html', 9 | styleUrls: ['./navigation.component.css'], 10 | encapsulation: ViewEncapsulation.None 11 | }) 12 | export class NavigationComponent implements OnInit { 13 | 14 | projects: Project[] = []; 15 | 16 | constructor(private projectService: ProjectsService, private elementRef:ElementRef, private router: Router) { } 17 | 18 | ngOnInit(): void { 19 | var s = document.createElement("script"); 20 | s.type = "text/javascript"; 21 | s.src = "/assets/js/navigation.custom.js"; 22 | this.elementRef.nativeElement.appendChild(s); 23 | 24 | this.projectService.getProjects().subscribe(projects => { 25 | this.projects = projects; 26 | }) 27 | } 28 | 29 | redirectTo(uri:string){ 30 | window.location.href=uri 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/shared/shared.module.ts: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core'; 2 | import {CommonModule} from '@angular/common'; 3 | import {AboutMeComponent} from "./about-me/about-me.component"; 4 | import {FooterComponent} from "./footer/footer.component"; 5 | import {NavigationComponent} from "./navigation/navigation.component"; 6 | import {ExperienceSummaryComponent} from "./experience-summary/experience-summary.component"; 7 | import {RouterModule} from "@angular/router"; 8 | 9 | 10 | @NgModule({ 11 | declarations: [ 12 | AboutMeComponent, 13 | FooterComponent, 14 | NavigationComponent, 15 | ExperienceSummaryComponent 16 | ], 17 | imports: [ 18 | CommonModule, 19 | RouterModule 20 | ], 21 | exports: [ 22 | AboutMeComponent, 23 | FooterComponent, 24 | NavigationComponent, 25 | ExperienceSummaryComponent 26 | ] 27 | }) 28 | export class SharedModule { 29 | } 30 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/TomasOndrejkaCV.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/TomasOndrejkaCV.pdf -------------------------------------------------------------------------------- /src/assets/css/plugins/fancybox.min.css: -------------------------------------------------------------------------------- 1 | body.compensate-for-scrollbar { 2 | overflow: hidden 3 | } 4 | 5 | .fancybox-active { 6 | height: auto 7 | } 8 | 9 | .fancybox-is-hidden { 10 | left: -9999px; 11 | margin: 0; 12 | position: absolute !important; 13 | top: -9999px; 14 | visibility: hidden 15 | } 16 | 17 | .fancybox-container { 18 | -webkit-backface-visibility: hidden; 19 | height: 100%; 20 | left: 0; 21 | outline: none; 22 | position: fixed; 23 | -webkit-tap-highlight-color: transparent; 24 | top: 0; 25 | -ms-touch-action: manipulation; 26 | touch-action: manipulation; 27 | transform: translateZ(0); 28 | width: 100%; 29 | z-index: 99992 30 | } 31 | 32 | .fancybox-container * { 33 | box-sizing: border-box 34 | } 35 | 36 | .fancybox-bg, .fancybox-inner, .fancybox-outer, .fancybox-stage { 37 | bottom: 0; 38 | left: 0; 39 | position: absolute; 40 | right: 0; 41 | top: 0 42 | } 43 | 44 | .fancybox-outer { 45 | -webkit-overflow-scrolling: touch; 46 | overflow-y: auto 47 | } 48 | 49 | .fancybox-bg { 50 | background: #1e1e1e; 51 | opacity: 0; 52 | transition-duration: inherit; 53 | transition-property: opacity; 54 | transition-timing-function: cubic-bezier(.47, 0, .74, .71) 55 | } 56 | 57 | .fancybox-is-open .fancybox-bg { 58 | opacity: .9; 59 | transition-timing-function: cubic-bezier(.22, .61, .36, 1) 60 | } 61 | 62 | .fancybox-caption, .fancybox-infobar, .fancybox-navigation .fancybox-button, .fancybox-toolbar { 63 | direction: ltr; 64 | opacity: 0; 65 | position: absolute; 66 | transition: opacity .25s ease, visibility 0s ease .25s; 67 | visibility: hidden; 68 | z-index: 99997 69 | } 70 | 71 | .fancybox-show-caption .fancybox-caption, .fancybox-show-infobar .fancybox-infobar, .fancybox-show-nav .fancybox-navigation .fancybox-button, .fancybox-show-toolbar .fancybox-toolbar { 72 | opacity: 1; 73 | transition: opacity .25s ease 0s, visibility 0s ease 0s; 74 | visibility: visible 75 | } 76 | 77 | .fancybox-infobar { 78 | color: #ccc; 79 | font-size: 13px; 80 | -webkit-font-smoothing: subpixel-antialiased; 81 | height: 44px; 82 | left: 0; 83 | line-height: 44px; 84 | min-width: 44px; 85 | mix-blend-mode: difference; 86 | padding: 0 10px; 87 | pointer-events: none; 88 | top: 0; 89 | -webkit-touch-callout: none; 90 | -webkit-user-select: none; 91 | -moz-user-select: none; 92 | -ms-user-select: none; 93 | user-select: none 94 | } 95 | 96 | .fancybox-toolbar { 97 | right: 0; 98 | top: 0 99 | } 100 | 101 | .fancybox-stage { 102 | direction: ltr; 103 | overflow: visible; 104 | transform: translateZ(0); 105 | z-index: 99994 106 | } 107 | 108 | .fancybox-is-open .fancybox-stage { 109 | overflow: hidden 110 | } 111 | 112 | .fancybox-slide { 113 | -webkit-backface-visibility: hidden; 114 | display: none; 115 | height: 100%; 116 | left: 0; 117 | outline: none; 118 | overflow: auto; 119 | -webkit-overflow-scrolling: touch; 120 | padding: 44px; 121 | position: absolute; 122 | text-align: center; 123 | top: 0; 124 | transition-property: transform, opacity; 125 | white-space: normal; 126 | width: 100%; 127 | z-index: 99994 128 | } 129 | 130 | .fancybox-slide:before { 131 | content: ""; 132 | display: inline-block; 133 | font-size: 0; 134 | height: 100%; 135 | vertical-align: middle; 136 | width: 0 137 | } 138 | 139 | .fancybox-is-sliding .fancybox-slide, .fancybox-slide--current, .fancybox-slide--next, .fancybox-slide--previous { 140 | display: block 141 | } 142 | 143 | .fancybox-slide--image { 144 | overflow: hidden; 145 | padding: 44px 0 146 | } 147 | 148 | .fancybox-slide--image:before { 149 | display: none 150 | } 151 | 152 | .fancybox-slide--html { 153 | padding: 6px 154 | } 155 | 156 | .fancybox-content { 157 | background: #fff; 158 | display: inline-block; 159 | margin: 0; 160 | max-width: 100%; 161 | overflow: auto; 162 | -webkit-overflow-scrolling: touch; 163 | padding: 44px; 164 | position: relative; 165 | text-align: left; 166 | vertical-align: middle 167 | } 168 | 169 | .fancybox-slide--image .fancybox-content { 170 | animation-timing-function: cubic-bezier(.5, 0, .14, 1); 171 | -webkit-backface-visibility: hidden; 172 | background: transparent; 173 | background-repeat: no-repeat; 174 | background-size: 100% 100%; 175 | left: 0; 176 | max-width: none; 177 | overflow: visible; 178 | padding: 0; 179 | position: absolute; 180 | top: 0; 181 | transform-origin: top left; 182 | transition-property: transform, opacity; 183 | -webkit-user-select: none; 184 | -moz-user-select: none; 185 | -ms-user-select: none; 186 | user-select: none; 187 | z-index: 99995 188 | } 189 | 190 | .fancybox-can-zoomOut .fancybox-content { 191 | cursor: zoom-out 192 | } 193 | 194 | .fancybox-can-zoomIn .fancybox-content { 195 | cursor: zoom-in 196 | } 197 | 198 | .fancybox-can-pan .fancybox-content, .fancybox-can-swipe .fancybox-content { 199 | cursor: grab 200 | } 201 | 202 | .fancybox-is-grabbing .fancybox-content { 203 | cursor: grabbing 204 | } 205 | 206 | .fancybox-container [data-selectable=true] { 207 | cursor: text 208 | } 209 | 210 | .fancybox-image, .fancybox-spaceball { 211 | background: transparent; 212 | border: 0; 213 | height: 100%; 214 | left: 0; 215 | margin: 0; 216 | max-height: none; 217 | max-width: none; 218 | padding: 0; 219 | position: absolute; 220 | top: 0; 221 | -webkit-user-select: none; 222 | -moz-user-select: none; 223 | -ms-user-select: none; 224 | user-select: none; 225 | width: 100% 226 | } 227 | 228 | .fancybox-spaceball { 229 | z-index: 1 230 | } 231 | 232 | .fancybox-slide--iframe .fancybox-content, .fancybox-slide--map .fancybox-content, .fancybox-slide--pdf .fancybox-content, .fancybox-slide--video .fancybox-content { 233 | height: 100%; 234 | overflow: visible; 235 | padding: 0; 236 | width: 100% 237 | } 238 | 239 | .fancybox-slide--video .fancybox-content { 240 | background: #000 241 | } 242 | 243 | .fancybox-slide--map .fancybox-content { 244 | background: #e5e3df 245 | } 246 | 247 | .fancybox-slide--iframe .fancybox-content { 248 | background: #fff 249 | } 250 | 251 | .fancybox-iframe, .fancybox-video { 252 | background: transparent; 253 | border: 0; 254 | display: block; 255 | height: 100%; 256 | margin: 0; 257 | overflow: hidden; 258 | padding: 0; 259 | width: 100% 260 | } 261 | 262 | .fancybox-iframe { 263 | left: 0; 264 | position: absolute; 265 | top: 0 266 | } 267 | 268 | .fancybox-error { 269 | background: #fff; 270 | cursor: default; 271 | max-width: 400px; 272 | padding: 40px; 273 | width: 100% 274 | } 275 | 276 | .fancybox-error p { 277 | color: #444; 278 | font-size: 16px; 279 | line-height: 20px; 280 | margin: 0; 281 | padding: 0 282 | } 283 | 284 | .fancybox-button { 285 | background: rgba(30, 30, 30, .6); 286 | border: 0; 287 | border-radius: 0; 288 | box-shadow: none; 289 | cursor: pointer; 290 | display: inline-block; 291 | height: 44px; 292 | margin: 0; 293 | padding: 10px; 294 | position: relative; 295 | transition: color .2s; 296 | vertical-align: top; 297 | visibility: inherit; 298 | width: 44px 299 | } 300 | 301 | .fancybox-button, .fancybox-button:link, .fancybox-button:visited { 302 | color: #ccc 303 | } 304 | 305 | .fancybox-button:hover { 306 | color: #fff 307 | } 308 | 309 | .fancybox-button:focus { 310 | outline: none 311 | } 312 | 313 | .fancybox-button.fancybox-focus { 314 | outline: 1px dotted 315 | } 316 | 317 | .fancybox-button[disabled], .fancybox-button[disabled]:hover { 318 | color: #888; 319 | cursor: default; 320 | outline: none 321 | } 322 | 323 | .fancybox-button div { 324 | height: 100% 325 | } 326 | 327 | .fancybox-button svg { 328 | display: block; 329 | height: 100%; 330 | overflow: visible; 331 | position: relative; 332 | width: 100% 333 | } 334 | 335 | .fancybox-button svg path { 336 | fill: currentColor; 337 | stroke-width: 0 338 | } 339 | 340 | .fancybox-button--fsenter svg:nth-child(2), .fancybox-button--fsexit svg:first-child, .fancybox-button--pause svg:first-child, .fancybox-button--play svg:nth-child(2) { 341 | display: none 342 | } 343 | 344 | .fancybox-progress { 345 | background: #ff5268; 346 | height: 2px; 347 | left: 0; 348 | position: absolute; 349 | right: 0; 350 | top: 0; 351 | transform: scaleX(0); 352 | transform-origin: 0; 353 | transition-property: transform; 354 | transition-timing-function: linear; 355 | z-index: 99998 356 | } 357 | 358 | .fancybox-close-small { 359 | background: transparent; 360 | border: 0; 361 | border-radius: 0; 362 | color: #ccc; 363 | cursor: pointer; 364 | opacity: .8; 365 | padding: 8px; 366 | position: absolute; 367 | right: -12px; 368 | top: -44px; 369 | z-index: 401 370 | } 371 | 372 | .fancybox-close-small:hover { 373 | color: #fff; 374 | opacity: 1 375 | } 376 | 377 | .fancybox-slide--html .fancybox-close-small { 378 | color: currentColor; 379 | padding: 10px; 380 | right: 0; 381 | top: 0 382 | } 383 | 384 | .fancybox-slide--image.fancybox-is-scaling .fancybox-content { 385 | overflow: hidden 386 | } 387 | 388 | .fancybox-is-scaling .fancybox-close-small, .fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small { 389 | display: none 390 | } 391 | 392 | .fancybox-navigation .fancybox-button { 393 | background-clip: content-box; 394 | height: 100px; 395 | opacity: 0; 396 | position: absolute; 397 | top: calc(50% - 50px); 398 | width: 70px 399 | } 400 | 401 | .fancybox-navigation .fancybox-button div { 402 | padding: 7px 403 | } 404 | 405 | .fancybox-navigation .fancybox-button--arrow_left { 406 | left: 0; 407 | left: env(safe-area-inset-left); 408 | padding: 31px 26px 31px 6px 409 | } 410 | 411 | .fancybox-navigation .fancybox-button--arrow_right { 412 | padding: 31px 6px 31px 26px; 413 | right: 0; 414 | right: env(safe-area-inset-right) 415 | } 416 | 417 | .fancybox-caption { 418 | background: linear-gradient(0deg, rgba(0, 0, 0, .85) 0, rgba(0, 0, 0, .3) 50%, rgba(0, 0, 0, .15) 65%, rgba(0, 0, 0, .075) 75.5%, rgba(0, 0, 0, .037) 82.85%, rgba(0, 0, 0, .019) 88%, transparent); 419 | bottom: 0; 420 | color: #eee; 421 | font-size: 14px; 422 | font-weight: 400; 423 | left: 0; 424 | line-height: 1.5; 425 | padding: 75px 44px 25px; 426 | pointer-events: none; 427 | right: 0; 428 | text-align: center; 429 | z-index: 99996 430 | } 431 | 432 | @supports (padding:max(0px)) { 433 | .fancybox-caption { 434 | padding: 75px max(44px, env(safe-area-inset-right)) max(25px, env(safe-area-inset-bottom)) max(44px, env(safe-area-inset-left)) 435 | } 436 | } 437 | 438 | .fancybox-caption--separate { 439 | margin-top: -50px 440 | } 441 | 442 | .fancybox-caption__body { 443 | max-height: 50vh; 444 | overflow: auto; 445 | pointer-events: all 446 | } 447 | 448 | .fancybox-caption a, .fancybox-caption a:link, .fancybox-caption a:visited { 449 | color: #ccc; 450 | text-decoration: none 451 | } 452 | 453 | .fancybox-caption a:hover { 454 | color: #fff; 455 | text-decoration: underline 456 | } 457 | 458 | .fancybox-loading { 459 | animation: a 1s linear infinite; 460 | background: transparent; 461 | border: 4px solid #888; 462 | border-bottom-color: #fff; 463 | border-radius: 50%; 464 | height: 50px; 465 | left: 50%; 466 | margin: -25px 0 0 -25px; 467 | opacity: .7; 468 | padding: 0; 469 | position: absolute; 470 | top: 50%; 471 | width: 50px; 472 | z-index: 99999 473 | } 474 | 475 | @keyframes a { 476 | to { 477 | transform: rotate(1turn) 478 | } 479 | } 480 | 481 | .fancybox-animated { 482 | transition-timing-function: cubic-bezier(0, 0, .25, 1) 483 | } 484 | 485 | .fancybox-fx-slide.fancybox-slide--previous { 486 | opacity: 0; 487 | transform: translate3d(-100%, 0, 0) 488 | } 489 | 490 | .fancybox-fx-slide.fancybox-slide--next { 491 | opacity: 0; 492 | transform: translate3d(100%, 0, 0) 493 | } 494 | 495 | .fancybox-fx-slide.fancybox-slide--current { 496 | opacity: 1; 497 | transform: translateZ(0) 498 | } 499 | 500 | .fancybox-fx-fade.fancybox-slide--next, .fancybox-fx-fade.fancybox-slide--previous { 501 | opacity: 0; 502 | transition-timing-function: cubic-bezier(.19, 1, .22, 1) 503 | } 504 | 505 | .fancybox-fx-fade.fancybox-slide--current { 506 | opacity: 1 507 | } 508 | 509 | .fancybox-fx-zoom-in-out.fancybox-slide--previous { 510 | opacity: 0; 511 | transform: scale3d(1.5, 1.5, 1.5) 512 | } 513 | 514 | .fancybox-fx-zoom-in-out.fancybox-slide--next { 515 | opacity: 0; 516 | transform: scale3d(.5, .5, .5) 517 | } 518 | 519 | .fancybox-fx-zoom-in-out.fancybox-slide--current { 520 | opacity: 1; 521 | transform: scaleX(1) 522 | } 523 | 524 | .fancybox-fx-rotate.fancybox-slide--previous { 525 | opacity: 0; 526 | transform: rotate(-1turn) 527 | } 528 | 529 | .fancybox-fx-rotate.fancybox-slide--next { 530 | opacity: 0; 531 | transform: rotate(1turn) 532 | } 533 | 534 | .fancybox-fx-rotate.fancybox-slide--current { 535 | opacity: 1; 536 | transform: rotate(0deg) 537 | } 538 | 539 | .fancybox-fx-circular.fancybox-slide--previous { 540 | opacity: 0; 541 | transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0) 542 | } 543 | 544 | .fancybox-fx-circular.fancybox-slide--next { 545 | opacity: 0; 546 | transform: scale3d(0, 0, 0) translate3d(100%, 0, 0) 547 | } 548 | 549 | .fancybox-fx-circular.fancybox-slide--current { 550 | opacity: 1; 551 | transform: scaleX(1) translateZ(0) 552 | } 553 | 554 | .fancybox-fx-tube.fancybox-slide--previous { 555 | transform: translate3d(-100%, 0, 0) scale(.1) skew(-10deg) 556 | } 557 | 558 | .fancybox-fx-tube.fancybox-slide--next { 559 | transform: translate3d(100%, 0, 0) scale(.1) skew(10deg) 560 | } 561 | 562 | .fancybox-fx-tube.fancybox-slide--current { 563 | transform: translateZ(0) scale(1) 564 | } 565 | 566 | @media (max-height:576px) { 567 | .fancybox-slide { 568 | padding-left: 6px; 569 | padding-right: 6px 570 | } 571 | 572 | .fancybox-slide--image { 573 | padding: 6px 0 574 | } 575 | 576 | .fancybox-close-small { 577 | right: -6px 578 | } 579 | 580 | .fancybox-slide--image .fancybox-close-small { 581 | background: #4e4e4e; 582 | color: #f2f4f6; 583 | height: 36px; 584 | opacity: 1; 585 | padding: 6px; 586 | right: 0; 587 | top: 0; 588 | width: 36px 589 | } 590 | 591 | .fancybox-caption { 592 | padding-left: 12px; 593 | padding-right: 12px 594 | } 595 | 596 | @supports (padding:max(0px)) { 597 | .fancybox-caption { 598 | padding-left: max(12px, env(safe-area-inset-left)); 599 | padding-right: max(12px, env(safe-area-inset-right)) 600 | } 601 | } 602 | } 603 | 604 | .fancybox-share { 605 | background: #f4f4f4; 606 | border-radius: 3px; 607 | max-width: 90%; 608 | padding: 30px; 609 | text-align: center 610 | } 611 | 612 | .fancybox-share h1 { 613 | color: #222; 614 | font-size: 35px; 615 | font-weight: 700; 616 | margin: 0 0 20px 617 | } 618 | 619 | .fancybox-share p { 620 | margin: 0; 621 | padding: 0 622 | } 623 | 624 | .fancybox-share__button { 625 | border: 0; 626 | border-radius: 3px; 627 | display: inline-block; 628 | font-size: 14px; 629 | font-weight: 700; 630 | line-height: 40px; 631 | margin: 0 5px 10px; 632 | min-width: 130px; 633 | padding: 0 15px; 634 | text-decoration: none; 635 | transition: all .2s; 636 | -webkit-user-select: none; 637 | -moz-user-select: none; 638 | -ms-user-select: none; 639 | user-select: none; 640 | white-space: nowrap 641 | } 642 | 643 | .fancybox-share__button:link, .fancybox-share__button:visited { 644 | color: #fff 645 | } 646 | 647 | .fancybox-share__button:hover { 648 | text-decoration: none 649 | } 650 | 651 | .fancybox-share__button--fb { 652 | background: #3b5998 653 | } 654 | 655 | .fancybox-share__button--fb:hover { 656 | background: #344e86 657 | } 658 | 659 | .fancybox-share__button--pt { 660 | background: #bd081d 661 | } 662 | 663 | .fancybox-share__button--pt:hover { 664 | background: #aa0719 665 | } 666 | 667 | .fancybox-share__button--tw { 668 | background: #1da1f2 669 | } 670 | 671 | .fancybox-share__button--tw:hover { 672 | background: #0d95e8 673 | } 674 | 675 | .fancybox-share__button svg { 676 | height: 25px; 677 | margin-right: 7px; 678 | position: relative; 679 | top: -1px; 680 | vertical-align: middle; 681 | width: 25px 682 | } 683 | 684 | .fancybox-share__button svg path { 685 | fill: #fff 686 | } 687 | 688 | .fancybox-share__input { 689 | background: transparent; 690 | border: 0; 691 | border-bottom: 1px solid #d7d7d7; 692 | border-radius: 0; 693 | color: #5d5b5b; 694 | font-size: 14px; 695 | margin: 10px 0 0; 696 | outline: none; 697 | padding: 10px 15px; 698 | width: 100% 699 | } 700 | 701 | .fancybox-thumbs { 702 | background: #ddd; 703 | bottom: 0; 704 | display: none; 705 | margin: 0; 706 | -webkit-overflow-scrolling: touch; 707 | -ms-overflow-style: -ms-autohiding-scrollbar; 708 | padding: 2px 2px 4px; 709 | position: absolute; 710 | right: 0; 711 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 712 | top: 0; 713 | width: 212px; 714 | z-index: 99995 715 | } 716 | 717 | .fancybox-thumbs-x { 718 | overflow-x: auto; 719 | overflow-y: hidden 720 | } 721 | 722 | .fancybox-show-thumbs .fancybox-thumbs { 723 | display: block 724 | } 725 | 726 | .fancybox-show-thumbs .fancybox-inner { 727 | right: 212px 728 | } 729 | 730 | .fancybox-thumbs__list { 731 | font-size: 0; 732 | height: 100%; 733 | list-style: none; 734 | margin: 0; 735 | overflow-x: hidden; 736 | overflow-y: auto; 737 | padding: 0; 738 | position: absolute; 739 | position: relative; 740 | white-space: nowrap; 741 | width: 100% 742 | } 743 | 744 | .fancybox-thumbs-x .fancybox-thumbs__list { 745 | overflow: hidden 746 | } 747 | 748 | .fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar { 749 | width: 7px 750 | } 751 | 752 | .fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track { 753 | background: #fff; 754 | border-radius: 10px; 755 | box-shadow: inset 0 0 6px rgba(0, 0, 0, .3) 756 | } 757 | 758 | .fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb { 759 | background: #2a2a2a; 760 | border-radius: 10px 761 | } 762 | 763 | .fancybox-thumbs__list a { 764 | -webkit-backface-visibility: hidden; 765 | backface-visibility: hidden; 766 | background-color: rgba(0, 0, 0, .1); 767 | background-position: 50%; 768 | background-repeat: no-repeat; 769 | background-size: cover; 770 | cursor: pointer; 771 | float: left; 772 | height: 75px; 773 | margin: 2px; 774 | max-height: calc(100% - 8px); 775 | max-width: calc(50% - 4px); 776 | outline: none; 777 | overflow: hidden; 778 | padding: 0; 779 | position: relative; 780 | -webkit-tap-highlight-color: transparent; 781 | width: 100px 782 | } 783 | 784 | .fancybox-thumbs__list a:before { 785 | border: 6px solid #ff5268; 786 | bottom: 0; 787 | content: ""; 788 | left: 0; 789 | opacity: 0; 790 | position: absolute; 791 | right: 0; 792 | top: 0; 793 | transition: all .2s cubic-bezier(.25, .46, .45, .94); 794 | z-index: 99991 795 | } 796 | 797 | .fancybox-thumbs__list a:focus:before { 798 | opacity: .5 799 | } 800 | 801 | .fancybox-thumbs__list a.fancybox-thumbs-active:before { 802 | opacity: 1 803 | } 804 | 805 | @media (max-width:576px) { 806 | .fancybox-thumbs { 807 | width: 110px 808 | } 809 | 810 | .fancybox-show-thumbs .fancybox-inner { 811 | right: 110px 812 | } 813 | 814 | .fancybox-thumbs__list a { 815 | max-width: calc(100% - 10px) 816 | } 817 | } -------------------------------------------------------------------------------- /src/assets/css/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/css/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/assets/css/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/css/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/assets/css/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/css/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/assets/img/BackGround.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/BackGround.jpg -------------------------------------------------------------------------------- /src/assets/img/apiCV/EducationPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/apiCV/EducationPage.png -------------------------------------------------------------------------------- /src/assets/img/apiCV/IndexPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/apiCV/IndexPage.png -------------------------------------------------------------------------------- /src/assets/img/apiCV/ProjectsPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/apiCV/ProjectsPage.png -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Buy Stock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Buy Stock.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Deposit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Deposit.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Main Menu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Main Menu.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Main Screen 2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Main Screen 2.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Main Screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Main Screen.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Notifications.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Notifications.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Signin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Signin.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Signup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Signup.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Stock Details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Stock Details.jpg -------------------------------------------------------------------------------- /src/assets/img/erotoApp/Watchlist.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/erotoApp/Watchlist.jpg -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/AnalgyphExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/AnalgyphExercise.png -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/FirstLevelFootball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/FirstLevelFootball.png -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/LastLevelJumpingColumn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/LastLevelJumpingColumn.png -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/LevelOneMaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/LevelOneMaze.png -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/LevelTwoMaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/LevelTwoMaze.png -------------------------------------------------------------------------------- /src/assets/img/eyeExercises/SecondLevelFootbll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/eyeExercises/SecondLevelFootbll.png -------------------------------------------------------------------------------- /src/assets/img/face-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/face-2.png -------------------------------------------------------------------------------- /src/assets/img/favicon/about.txt: -------------------------------------------------------------------------------- 1 | This favicon was generated using the following graphics from Twitter Twemoji: 2 | 3 | - Graphics Title: 1f9d0.svg 4 | - Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) 5 | - Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f9d0.svg 6 | - Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) 7 | -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/assets/img/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/favicon/favicon.ico -------------------------------------------------------------------------------- /src/assets/img/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"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"} -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/ActivityDiagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/ActivityDiagram.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/ClassDiagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/ClassDiagram.jpg -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/DatabaseDomains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/DatabaseDomains.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/DatabaseFunction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/DatabaseFunction.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/DomainModel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/DomainModel.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/GuiPreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/GuiPreview.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/JavaJDBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/JavaJDBC.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/JavaRetrievingDataFromDB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/JavaRetrievingDataFromDB.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/UnitTest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/UnitTest.png -------------------------------------------------------------------------------- /src/assets/img/hospitalManagementSystem/UseCases.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/hospitalManagementSystem/UseCases.png -------------------------------------------------------------------------------- /src/assets/img/linko/Main 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/linko/Main 2.png -------------------------------------------------------------------------------- /src/assets/img/linko/Main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/linko/Main.png -------------------------------------------------------------------------------- /src/assets/img/printer/CustomCuttedFrame.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/CustomCuttedFrame.jpg -------------------------------------------------------------------------------- /src/assets/img/printer/Extruder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/Extruder.jpg -------------------------------------------------------------------------------- /src/assets/img/printer/ExtruderOnPrinter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/ExtruderOnPrinter.jpg -------------------------------------------------------------------------------- /src/assets/img/printer/FinalPrinter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/FinalPrinter.jpg -------------------------------------------------------------------------------- /src/assets/img/printer/PresentingProjectToCommision.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/PresentingProjectToCommision.jpg -------------------------------------------------------------------------------- /src/assets/img/printer/Skeleton.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/printer/Skeleton.jpg -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/Class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/Class.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/DomainModel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/DomainModel.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/ExportXMLFunction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/ExportXMLFunction.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/FunctionForXMLReadingToTable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/FunctionForXMLReadingToTable.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/TopPriorityRequirements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/TopPriorityRequirements.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/UseCaseDescriptions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/UseCaseDescriptions.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/UseCases.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/UseCases.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/UserInterface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/UserInterface.png -------------------------------------------------------------------------------- /src/assets/img/projectManagementSystem/XMLReadingOnWebsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/projectManagementSystem/XMLReadingOnWebsite.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/Checkout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/Checkout.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/Experiences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/Experiences.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/Index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/Index.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/Order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/Order.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/OrderPlaced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/OrderPlaced.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/Orders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/Orders.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/SSD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/SSD.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/ShoppingCart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/ShoppingCart.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/SignIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/SignIn.png -------------------------------------------------------------------------------- /src/assets/img/rabatoo/SingleProduct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/rabatoo/SingleProduct.png -------------------------------------------------------------------------------- /src/assets/img/raspberryKubernetes/Cloudflare domains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/raspberryKubernetes/Cloudflare domains.png -------------------------------------------------------------------------------- /src/assets/img/raspberryKubernetes/Deployment Module Usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/raspberryKubernetes/Deployment Module Usage.png -------------------------------------------------------------------------------- /src/assets/img/raspberryKubernetes/Deployment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/raspberryKubernetes/Deployment.png -------------------------------------------------------------------------------- /src/assets/img/raspberryKubernetes/Pods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/raspberryKubernetes/Pods.png -------------------------------------------------------------------------------- /src/assets/img/raspberryKubernetes/Services.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/raspberryKubernetes/Services.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/AddToCart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/AddToCart.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/CartPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/CartPage.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/CheckoutPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/CheckoutPage.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/ContactUsPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/ContactUsPage.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/Footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/Footer.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/FrontPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/FrontPage.png -------------------------------------------------------------------------------- /src/assets/img/skrabmig/ProductPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomondre/portfolio-angular/065cd8bb0ad824df187de314ae0a3b790b10da12/src/assets/img/skrabmig/ProductPage.png -------------------------------------------------------------------------------- /src/assets/js/about-me.custom.js: -------------------------------------------------------------------------------- 1 | const circleValues = [1, 0.95, 0.3]; 2 | const values = [0.9, 0.7, 0.8, 0.75]; 3 | 4 | $(function () { 5 | 6 | // scrollbar 7 | Scrollbar.use(OverscrollPlugin); 8 | Scrollbar.init(document.querySelector('#scrollbar'), { 9 | damping: 0.05, 10 | renderByPixel: true, 11 | continuousScrolling: true, 12 | }); 13 | Scrollbar.init(document.querySelector('#scrollbar2'), { 14 | damping: 0.05, 15 | renderByPixel: true, 16 | continuousScrolling: true, 17 | }); 18 | 19 | 20 | // progressbars 21 | var bar = new ProgressBar.Circle(circleprog1, { 22 | strokeWidth: 7, 23 | easing: 'easeInOut', 24 | duration: 1400, 25 | delay: 2500, 26 | trailWidth: 7, 27 | step: function (state, circle) { 28 | var value = Math.round(circle.value() * 100); 29 | if (value === 0) { 30 | circle.setText(''); 31 | } else { 32 | circle.setText(value); 33 | } 34 | } 35 | }); 36 | 37 | bar.animate(circleValues[0]); 38 | 39 | var bar = new ProgressBar.Circle(circleprog2, { 40 | strokeWidth: 7, 41 | easing: 'easeInOut', 42 | duration: 1400, 43 | delay: 2600, 44 | trailWidth: 7, 45 | step: function (state, circle) { 46 | var value = Math.round(circle.value() * 100); 47 | if (value === 0) { 48 | circle.setText(''); 49 | } else { 50 | circle.setText(value); 51 | } 52 | } 53 | }); 54 | 55 | bar.animate(circleValues[1]); 56 | 57 | var bar = new ProgressBar.Circle(circleprog3, { 58 | strokeWidth: 7, 59 | easing: 'easeInOut', 60 | duration: 1400, 61 | delay: 2700, 62 | trailWidth: 7, 63 | step: function (state, circle) { 64 | var value = Math.round(circle.value() * 100); 65 | if (value === 0) { 66 | circle.setText(''); 67 | } else { 68 | circle.setText(value); 69 | } 70 | } 71 | }); 72 | 73 | bar.animate(circleValues[2]); 74 | 75 | var bar = new ProgressBar.Line(lineprog1, { 76 | strokeWidth: 1.72, 77 | easing: 'easeInOut', 78 | duration: 1400, 79 | delay: 2800, 80 | trailWidth: 1.72, 81 | svgStyle: { 82 | width: '100%', 83 | height: '100%' 84 | }, 85 | step: (state, bar) => { 86 | bar.setText(Math.round(bar.value() * 100) + ' %'); 87 | } 88 | }); 89 | 90 | bar.animate(values[0]); 91 | 92 | var bar = new ProgressBar.Line(lineprog2, { 93 | strokeWidth: 1.72, 94 | easing: 'easeInOut', 95 | duration: 1400, 96 | delay: 2900, 97 | trailWidth: 1.72, 98 | svgStyle: { 99 | width: '100%', 100 | height: '100%' 101 | }, 102 | step: (state, bar) => { 103 | bar.setText(Math.round(bar.value() * 100) + ' %'); 104 | } 105 | }); 106 | 107 | bar.animate(values[1]); 108 | 109 | var bar = new ProgressBar.Line(lineprog3, { 110 | strokeWidth: 1.72, 111 | easing: 'easeInOut', 112 | duration: 1400, 113 | delay: 3000, 114 | trailWidth: 1.72, 115 | svgStyle: { 116 | width: '100%', 117 | height: '100%' 118 | }, 119 | step: (state, bar) => { 120 | bar.setText(Math.round(bar.value() * 100) + ' %'); 121 | } 122 | }); 123 | 124 | bar.animate(values[2]); 125 | 126 | var bar = new ProgressBar.Line(lineprog4, { 127 | strokeWidth: 1.72, 128 | easing: 'easeInOut', 129 | duration: 1400, 130 | delay: 3100, 131 | trailWidth: 1.72, 132 | svgStyle: { 133 | width: '100%', 134 | height: '100%' 135 | }, 136 | step: (state, bar) => { 137 | bar.setText(Math.round(bar.value() * 100) + ' %'); 138 | } 139 | }); 140 | 141 | bar.animate(values[3]); 142 | 143 | }); 144 | -------------------------------------------------------------------------------- /src/assets/js/main.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | function sent() { 3 | document.getElementById("button1").value = "Close Curtain"; 4 | } 5 | 6 | "use strict"; 7 | 8 | // page loading 9 | $(document).ready(function () { 10 | anime({ 11 | targets: '.art-preloader .art-preloader-content', 12 | opacity: [0, 1], 13 | delay: 200, 14 | duration: 600, 15 | easing: 'linear', 16 | complete: function (anim) { 17 | 18 | } 19 | }); 20 | anime({ 21 | targets: '.art-preloader', 22 | opacity: [1, 0], 23 | delay: 2200, 24 | duration: 400, 25 | easing: 'linear', 26 | complete: function (anim) { 27 | $('.art-preloader').css('display', 'none'); 28 | } 29 | }); 30 | }); 31 | 32 | var bar = new ProgressBar.Line(preloader, { 33 | strokeWidth: 1.7, 34 | easing: 'easeInOut', 35 | duration: 1400, 36 | delay: 750, 37 | trailWidth: 1.7, 38 | svgStyle: { 39 | width: '100%', 40 | height: '100%' 41 | }, 42 | step: (state, bar) => { 43 | bar.setText(Math.round(bar.value() * 100) + ' %'); 44 | } 45 | }); 46 | 47 | bar.animate(1); 48 | 49 | // counters 50 | anime({ 51 | targets: '.art-counter-frame', 52 | opacity: [0, 1], 53 | duration: 800, 54 | delay: 2300, 55 | easing: 'linear', 56 | }); 57 | 58 | anime({ 59 | targets: '.art-counter', 60 | delay: 1300, 61 | opacity: [1, 1], 62 | complete: function (anim) { 63 | $('.art-counter').each(function () { 64 | $(this).prop('Counter', 0).animate({ 65 | Counter: $(this).text() 66 | }, { 67 | duration: 2000, 68 | easing: 'linear', 69 | step: function (now) { 70 | $(this).text(Math.ceil(now)); 71 | } 72 | }); 73 | }); 74 | } 75 | }); 76 | 77 | // Contact form 78 | $('.art-input').keyup(function () { 79 | if ($(this).val()) { 80 | $(this).addClass('art-active'); 81 | } else { 82 | $(this).removeClass('art-active'); 83 | } 84 | }); 85 | 86 | var form; 87 | var action; 88 | $('form[action^="https://usebasin.com"]').each(function (i, el) { 89 | form = $(el); 90 | form.submit(function (e) { 91 | e.preventDefault(); 92 | form = $(e.target); 93 | action = form.attr('action') + '.json'; 94 | $.ajax({ 95 | url: action, 96 | method: "POST", 97 | data: form.serialize(), 98 | dataType: "json", 99 | success: function (data) { 100 | if (data.success) { 101 | var tl = anime.timeline({ 102 | easing: 'easeOutExpo', 103 | }); 104 | tl.add({ 105 | targets: '.art-submit', 106 | opacity: 0, 107 | scale: .5, 108 | }) 109 | .add({ 110 | targets: '.art-success', 111 | scale: 1, 112 | height: '45px', 113 | }) 114 | } else { 115 | } 116 | }, 117 | error: function () { 118 | //failed submission - show the failure message 119 | } 120 | }); 121 | }); 122 | }); 123 | 124 | 125 | // portfolio filter 126 | $('.art-filter a').on('click', function () { 127 | $('.art-filter .art-current').removeClass('art-current'); 128 | $(this).addClass('art-current'); 129 | 130 | var selector = $(this).data('filter'); 131 | $('.art-grid').isotope({ 132 | filter: selector 133 | }); 134 | return false; 135 | }); 136 | 137 | // masonry Grid 138 | $('.art-grid').isotope({ 139 | filter: '*', 140 | itemSelector: '.art-grid-item', 141 | transitionDuration: '.6s', 142 | }); 143 | 144 | // slider testimonials 145 | var swiper = new Swiper('.art-testimonial-slider', { 146 | slidesPerView: 3, 147 | spaceBetween: 30, 148 | speed: 1400, 149 | autoplay: false, 150 | autoplaySpeed: 5000, 151 | pagination: { 152 | el: '.swiper-pagination', 153 | clickable: true, 154 | }, 155 | navigation: { 156 | nextEl: '.art-testi-swiper-next', 157 | prevEl: '.art-testi-swiper-prev', 158 | }, 159 | breakpoints: { 160 | 1500: { 161 | slidesPerView: 2, 162 | }, 163 | 1200: { 164 | slidesPerView: 2, 165 | }, 166 | 992: { 167 | slidesPerView: 1, 168 | }, 169 | }, 170 | }); 171 | 172 | // slider works 173 | var swiper = new Swiper('.art-works-slider', { 174 | slidesPerView: 3, 175 | spaceBetween: 30, 176 | speed: 1400, 177 | autoplay: { 178 | delay: 4000, 179 | }, 180 | autoplaySpeed: 5000, 181 | pagination: { 182 | el: '.swiper-pagination', 183 | clickable: true, 184 | }, 185 | navigation: { 186 | nextEl: '.art-works-swiper-next', 187 | prevEl: '.art-works-swiper-prev', 188 | }, 189 | breakpoints: { 190 | 1500: { 191 | slidesPerView: 2, 192 | }, 193 | 1200: { 194 | slidesPerView: 2, 195 | }, 196 | 992: { 197 | slidesPerView: 1, 198 | }, 199 | }, 200 | }); 201 | 202 | // slider blog 203 | var swiper = new Swiper('.art-blog-slider', { 204 | slidesPerView: 3, 205 | spaceBetween: 30, 206 | speed: 1400, 207 | autoplay: { 208 | delay: 4000, 209 | }, 210 | autoplaySpeed: 5000, 211 | pagination: { 212 | el: '.swiper-pagination', 213 | clickable: true, 214 | }, 215 | navigation: { 216 | nextEl: '.art-blog-swiper-next', 217 | prevEl: '.art-blog-swiper-prev', 218 | }, 219 | breakpoints: { 220 | 1500: { 221 | slidesPerView: 3, 222 | }, 223 | 1200: { 224 | slidesPerView: 2, 225 | }, 226 | 992: { 227 | slidesPerView: 1, 228 | }, 229 | }, 230 | }); 231 | 232 | $('[data-fancybox="gallery"]').fancybox({ 233 | animationEffect: "zoom-in-out", 234 | animationDuration: 600, 235 | transitionDuration: 1200, 236 | buttons: [ 237 | "zoom", 238 | "share", 239 | "slideShow", 240 | "thumbs", 241 | "close" 242 | ], 243 | }); 244 | 245 | $('[data-fancybox="diplome"]').fancybox({ 246 | animationEffect: "zoom-in-out", 247 | animationDuration: 600, 248 | transitionDuration: 1200, 249 | buttons: [ 250 | "zoom", 251 | "slideShow", 252 | "thumbs", 253 | "close", 254 | ], 255 | }); 256 | 257 | $('[data-fancybox="avatar"]').fancybox({ 258 | animationEffect: "zoom-in-out", 259 | animationDuration: 600, 260 | transitionDuration: 1200, 261 | buttons: [ 262 | "zoom", 263 | "close" 264 | ], 265 | }); 266 | 267 | $('[data-fancybox="recommendation"]').fancybox({ 268 | animationEffect: "zoom-in-out", 269 | animationDuration: 600, 270 | transitionDuration: 1200, 271 | buttons: [ 272 | "zoom", 273 | "slideShow", 274 | "thumbs", 275 | "close", 276 | ], 277 | }); 278 | 279 | $.fancybox.defaults.hash = false; 280 | 281 | $('.current-menu-item a').clone().appendTo('.art-current-page'); 282 | 283 | $('.art-map-overlay').on('click', function () { 284 | $(this).addClass('art-active'); 285 | }); 286 | 287 | $('.art-info-bar-btn').on('click', function () { 288 | $('.art-info-bar').toggleClass('art-active'); 289 | $('.art-menu-bar-btn').toggleClass('art-disabled'); 290 | }); 291 | 292 | $('.art-menu-bar-btn').on('click', function () { 293 | $('.art-menu-bar-btn , .art-menu-bar').toggleClass("art-active"); 294 | $('.art-info-bar-btn').toggleClass('art-disabled'); 295 | }); 296 | 297 | $('.art-info-bar-btn , .art-menu-bar-btn').on('click', function () { 298 | $('.art-content').toggleClass('art-active'); 299 | }); 300 | 301 | $('.art-curtain , .art-mobile-top-bar').on('click', function () { 302 | $('.art-menu-bar-btn , .art-menu-bar , .art-info-bar , .art-content , .art-menu-bar-btn , .art-info-bar-btn').removeClass('art-active , art-disabled'); 303 | }); 304 | 305 | $('.menu-item').on('click', function () { 306 | if ($(this).hasClass('menu-item-has-children')) { 307 | $(this).children('.sub-menu').toggleClass('art-active'); 308 | } else { 309 | $('.art-menu-bar-btn , .art-menu-bar , .art-info-bar , .art-content , .art-menu-bar-btn , .art-info-bar-btn').removeClass('art-active , art-disabled'); 310 | } 311 | }); 312 | 313 | // reinit 314 | document.addEventListener("swup:contentReplaced", function () { 315 | 316 | Scrollbar.use(OverscrollPlugin); 317 | Scrollbar.init(document.querySelector('#scrollbar'), { 318 | damping: 0.05, 319 | renderByPixel: true, 320 | continuousScrolling: true, 321 | }); 322 | Scrollbar.init(document.querySelector('#scrollbar2'), { 323 | damping: 0.05, 324 | renderByPixel: true, 325 | continuousScrolling: true, 326 | }); 327 | 328 | 329 | // Masonry Grid 330 | $('.art-grid').isotope({ 331 | filter: '*', 332 | itemSelector: '.art-grid-item', 333 | transitionDuration: '.6s', 334 | }); 335 | 336 | $('.art-filter a').on('click', function () { 337 | $('.art-filter .art-current').removeClass('art-current'); 338 | $(this).addClass('art-current'); 339 | 340 | var selector = $(this).data('filter'); 341 | $('.art-grid').isotope({ 342 | filter: selector 343 | }); 344 | return false; 345 | }); 346 | 347 | anime({ 348 | targets: '.art-counter-frame', 349 | opacity: [0, 1], 350 | duration: 800, 351 | delay: 300, 352 | easing: 'linear', 353 | }); 354 | 355 | $('.art-counter').each(function () { 356 | $(this).prop('Counter', 0).animate({ 357 | Counter: $(this).text() 358 | }, { 359 | duration: 2000, 360 | easing: 'linear', 361 | step: function (now) { 362 | $(this).text(Math.ceil(now)); 363 | } 364 | }); 365 | }); 366 | 367 | // slider testimonials 368 | var swiper = new Swiper('.art-testimonial-slider', { 369 | slidesPerView: 3, 370 | spaceBetween: 30, 371 | speed: 1400, 372 | autoplay: false, 373 | autoplaySpeed: 5000, 374 | pagination: { 375 | el: '.swiper-pagination', 376 | clickable: true, 377 | }, 378 | navigation: { 379 | nextEl: '.art-testi-swiper-next', 380 | prevEl: '.art-testi-swiper-prev', 381 | }, 382 | breakpoints: { 383 | 1500: { 384 | slidesPerView: 2, 385 | }, 386 | 1200: { 387 | slidesPerView: 2, 388 | }, 389 | 992: { 390 | slidesPerView: 2, 391 | }, 392 | 768: { 393 | slidesPerView: 1, 394 | } 395 | }, 396 | }); 397 | 398 | // slider works 399 | var swiper = new Swiper('.art-works-slider', { 400 | slidesPerView: 3, 401 | spaceBetween: 30, 402 | speed: 1400, 403 | autoplay: { 404 | delay: 4000, 405 | }, 406 | autoplaySpeed: 5000, 407 | pagination: { 408 | el: '.swiper-pagination', 409 | clickable: true, 410 | }, 411 | navigation: { 412 | nextEl: '.art-works-swiper-next', 413 | prevEl: '.art-works-swiper-prev', 414 | }, 415 | breakpoints: { 416 | 1500: { 417 | slidesPerView: 2, 418 | }, 419 | 1200: { 420 | slidesPerView: 2, 421 | }, 422 | 992: { 423 | slidesPerView: 1, 424 | }, 425 | }, 426 | }); 427 | 428 | // slider blog 429 | var swiper = new Swiper('.art-blog-slider', { 430 | slidesPerView: 3, 431 | spaceBetween: 30, 432 | speed: 1400, 433 | autoplay: { 434 | delay: 4000, 435 | }, 436 | autoplaySpeed: 5000, 437 | pagination: { 438 | el: '.swiper-pagination', 439 | clickable: true, 440 | }, 441 | navigation: { 442 | nextEl: '.art-blog-swiper-next', 443 | prevEl: '.art-blog-swiper-prev', 444 | }, 445 | breakpoints: { 446 | 1500: { 447 | slidesPerView: 3, 448 | }, 449 | 1200: { 450 | slidesPerView: 3, 451 | }, 452 | 992: { 453 | slidesPerView: 1, 454 | }, 455 | }, 456 | }); 457 | 458 | $('[data-fancybox="gallery"]').fancybox({ 459 | animationEffect: "zoom-in-out", 460 | animationDuration: 600, 461 | transitionDuration: 1200, 462 | buttons: [ 463 | "zoom", 464 | "slideShow", 465 | "thumbs", 466 | "close" 467 | ], 468 | }); 469 | 470 | $('[data-fancybox="diplome"]').fancybox({ 471 | animationEffect: "zoom-in-out", 472 | animationDuration: 600, 473 | transitionDuration: 1200, 474 | buttons: [ 475 | "zoom", 476 | "slideShow", 477 | "thumbs", 478 | "close", 479 | ], 480 | }); 481 | 482 | $('[data-fancybox="recommendation"]').fancybox({ 483 | animationEffect: "zoom-in-out", 484 | animationDuration: 600, 485 | transitionDuration: 1200, 486 | buttons: [ 487 | "zoom", 488 | "slideShow", 489 | "thumbs", 490 | "close", 491 | ], 492 | }); 493 | 494 | $.fancybox.defaults.hash = false; 495 | 496 | $('.current-menu-item a').clone().prependTo('.art-current-page'); 497 | 498 | $('.menu-item').on('click', function () { 499 | if ($(this).hasClass('menu-item-has-children')) { 500 | $(this).children('.sub-menu').toggleClass('art-active'); 501 | } else { 502 | $('.art-menu-bar-btn , .art-menu-bar , .art-info-bar , .art-content , .art-menu-bar-btn , .art-info-bar-btn').removeClass('art-active , art-disabled'); 503 | } 504 | }); 505 | 506 | }) 507 | 508 | }) 509 | ; 510 | -------------------------------------------------------------------------------- /src/assets/js/navigation.custom.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | // swup js 3 | const options = { 4 | containers: ["#swup", "#swupMenu"], 5 | animateHistoryBrowsing: true, 6 | }; 7 | 8 | const swup = new Swup(options); 9 | 10 | }); 11 | -------------------------------------------------------------------------------- /src/assets/js/plugins/anime.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * anime.js v3.0.0 3 | * (c) 2019 Julian Garnier 4 | * Released under the MIT license 5 | * animejs.com 6 | */ 7 | 8 | !function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):n.anime=e()}(this,function(){"use strict";var n={update:null,begin:null,loopBegin:null,changeBegin:null,change:null,changeComplete:null,loopComplete:null,complete:null,loop:1,direction:"normal",autoplay:!0,timelineOffset:0},e={duration:1e3,delay:0,endDelay:0,easing:"easeOutElastic(1, .5)",round:0},r=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","scale","scaleX","scaleY","scaleZ","skew","skewX","skewY","perspective"],t={CSS:{},springs:{}};function a(n,e,r){return Math.min(Math.max(n,e),r)}function i(n,e){return n.indexOf(e)>-1}function o(n,e){return n.apply(null,e)}var u={arr:function(n){return Array.isArray(n)},obj:function(n){return i(Object.prototype.toString.call(n),"Object")},pth:function(n){return u.obj(n)&&n.hasOwnProperty("totalLength")},svg:function(n){return n instanceof SVGElement},inp:function(n){return n instanceof HTMLInputElement},dom:function(n){return n.nodeType||u.svg(n)},str:function(n){return"string"==typeof n},fnc:function(n){return"function"==typeof n},und:function(n){return void 0===n},hex:function(n){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(n)},rgb:function(n){return/^rgb/.test(n)},hsl:function(n){return/^hsl/.test(n)},col:function(n){return u.hex(n)||u.rgb(n)||u.hsl(n)},key:function(r){return!n.hasOwnProperty(r)&&!e.hasOwnProperty(r)&&"targets"!==r&&"keyframes"!==r}};function s(n){var e=/\(([^)]+)\)/.exec(n);return e?e[1].split(",").map(function(n){return parseFloat(n)}):[]}function c(n,e){var r=s(n),i=a(u.und(r[0])?1:r[0],.1,100),o=a(u.und(r[1])?100:r[1],.1,100),c=a(u.und(r[2])?10:r[2],.1,100),f=a(u.und(r[3])?0:r[3],.1,100),l=Math.sqrt(o/i),d=c/(2*Math.sqrt(o*i)),p=d<1?l*Math.sqrt(1-d*d):0,v=1,h=d<1?(d*l-f)/p:-f+l;function g(n){var r=e?e*n/1e3:n;return r=d<1?Math.exp(-r*d*l)*(v*Math.cos(p*r)+h*Math.sin(p*r)):(v+h*r)*Math.exp(-r*l),0===n||1===n?n:1-r}return e?g:function(){var e=t.springs[n];if(e)return e;for(var r=0,a=0;;)if(1===g(r+=1/6)){if(++a>=16)break}else a=0;var i=r*(1/6)*1e3;return t.springs[n]=i,i}}function f(n,e){void 0===n&&(n=1),void 0===e&&(e=.5);var r=a(n,1,10),t=a(e,.1,2);return function(n){return 0===n||1===n?n:-r*Math.pow(2,10*(n-1))*Math.sin((n-1-t/(2*Math.PI)*Math.asin(1/r))*(2*Math.PI)/t)}}function l(n){return void 0===n&&(n=10),function(e){return Math.round(e*n)*(1/n)}}var d=function(){var n=11,e=1/(n-1);function r(n,e){return 1-3*e+3*n}function t(n,e){return 3*e-6*n}function a(n){return 3*n}function i(n,e,i){return((r(e,i)*n+t(e,i))*n+a(e))*n}function o(n,e,i){return 3*r(e,i)*n*n+2*t(e,i)*n+a(e)}return function(r,t,a,u){if(0<=r&&r<=1&&0<=a&&a<=1){var s=new Float32Array(n);if(r!==t||a!==u)for(var c=0;c=.001?function(n,e,r,t){for(var a=0;a<4;++a){var u=o(e,r,t);if(0===u)return e;e-=(i(e,r,t)-n)/u}return e}(t,l,r,a):0===d?l:function(n,e,r,t,a){for(var o,u,s=0;(o=i(u=e+(r-e)/2,t,a)-n)>0?r=u:e=u,Math.abs(o)>1e-7&&++s<10;);return u}(t,u,u+e,r,a)}}}(),p=function(){var n=["Quad","Cubic","Quart","Quint","Sine","Expo","Circ","Back","Elastic"],e={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],f],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(n,e){return function(r){return 1-f(n,e)(1-r)}}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(n,e){return function(r){return r<.5?f(n,e)(2*r)/2:1-f(n,e)(-2*r+2)/2}}]},r={linear:[.25,.25,.75,.75]},t=function(t){e[t].forEach(function(e,a){r["ease"+t+n[a]]=e})};for(var a in e)t(a);return r}();function v(n,e){if(u.fnc(n))return n;var r=n.split("(")[0],t=p[r],a=s(n);switch(r){case"spring":return c(n,e);case"cubicBezier":return o(d,a);case"steps":return o(l,a);default:return u.fnc(t)?o(t,a):o(d,t)}}function h(n){try{return document.querySelectorAll(n)}catch(n){return}}function g(n,e){for(var r=n.length,t=arguments.length>=2?arguments[1]:void 0,a=[],i=0;i1&&(r-=1),r<1/6?n+6*(e-n)*r:r<.5?e:r<2/3?n+(e-n)*(2/3-r)*6:n}if(0==o)e=r=t=u;else{var f=u<.5?u*(1+o):u+o-u*o,l=2*u-f;e=c(l,f,i+1/3),r=c(l,f,i),t=c(l,f,i-1/3)}return"rgba("+255*e+","+255*r+","+255*t+","+s+")"}(n):void 0;var e,r,t,a}function C(n){var e=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(n);if(e)return e[2]}function O(n,e){return u.fnc(n)?n(e.target,e.id,e.total):n}function P(n,e){return n.getAttribute(e)}function I(n,e,r){if(b([r,"deg","rad","turn"],C(e)))return e;var a=t.CSS[e+r];if(!u.und(a))return a;var i=document.createElement(n.tagName),o=n.parentNode&&n.parentNode!==document?n.parentNode:document.body;o.appendChild(i),i.style.position="absolute",i.style.width=100+r;var s=100/i.offsetWidth;o.removeChild(i);var c=s*parseFloat(e);return t.CSS[e+r]=c,c}function B(n,e,r){if(e in n.style){var t=e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),a=n.style[e]||getComputedStyle(n).getPropertyValue(t)||"0";return r?I(n,a,r):a}}function D(n,e){return u.dom(n)&&!u.inp(n)&&(P(n,e)||u.svg(n)&&n[e])?"attribute":u.dom(n)&&b(r,e)?"transform":u.dom(n)&&"transform"!==e&&B(n,e)?"css":null!=n[e]?"object":void 0}function T(n){if(u.dom(n)){for(var e,r=n.style.transform||"",t=/(\w+)\(([^)]*)\)/g,a=new Map;e=t.exec(r);)a.set(e[1],e[2]);return a}}function F(n,e,r,t){var a,o=i(e,"scale")?1:0+(i(a=e,"translate")||"perspective"===a?"px":i(a,"rotate")||i(a,"skew")?"deg":void 0),u=T(n).get(e)||o;return r&&(r.transforms.list.set(e,u),r.transforms.last=e),t?I(n,u,t):u}function N(n,e,r,t){switch(D(n,e)){case"transform":return F(n,e,t,r);case"css":return B(n,e,r);case"attribute":return P(n,e);default:return n[e]||0}}function A(n,e){var r=/^(\*=|\+=|-=)/.exec(n);if(!r)return n;var t=C(n)||0,a=parseFloat(e),i=parseFloat(n.replace(r[0],""));switch(r[0][0]){case"+":return a+i+t;case"-":return a-i+t;case"*":return a*i+t}}function E(n,e){if(u.col(n))return k(n);var r=C(n),t=r?n.substr(0,n.length-r.length):n;return e&&!/\s/g.test(n)?t+e:t}function L(n,e){return Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2))}function S(n){for(var e,r=n.points,t=0,a=0;a0&&(t+=L(e,i)),e=i}return t}function j(n){if(n.getTotalLength)return n.getTotalLength();switch(n.tagName.toLowerCase()){case"circle":return i=n,2*Math.PI*P(i,"r");case"rect":return 2*P(a=n,"width")+2*P(a,"height");case"line":return L({x:P(t=n,"x1"),y:P(t,"y1")},{x:P(t,"x2"),y:P(t,"y2")});case"polyline":return S(n);case"polygon":return r=(e=n).points,S(e)+L(r.getItem(r.numberOfItems-1),r.getItem(0))}var e,r,t,a,i}function q(n,e){var r=e||{},t=r.el||function(n){for(var e=n.parentNode;u.svg(e)&&(e=e.parentNode,u.svg(e.parentNode)););return e}(n),a=t.getBoundingClientRect(),i=P(t,"viewBox"),o=a.width,s=a.height,c=r.viewBox||(i?i.split(" "):[0,0,o,s]);return{el:t,viewBox:c,x:c[0]/1,y:c[1]/1,w:o/c[2],h:s/c[3]}}function $(n,e){function r(r){void 0===r&&(r=0);var t=e+r>=1?e+r:0;return n.el.getPointAtLength(t)}var t=q(n.el,n.svg),a=r(),i=r(-1),o=r(1);switch(n.property){case"x":return(a.x-t.x)*t.w;case"y":return(a.y-t.y)*t.h;case"angle":return 180*Math.atan2(o.y-i.y,o.x-i.x)/Math.PI}}function X(n,e){var r=/-?\d*\.?\d+/g,t=E(u.pth(n)?n.totalLength:n,e)+"";return{original:t,numbers:t.match(r)?t.match(r).map(Number):[0],strings:u.str(n)||e?t.split(r):[]}}function Y(n){return g(n?m(u.arr(n)?n.map(y):y(n)):[],function(n,e,r){return r.indexOf(n)===e})}function Z(n){var e=Y(n);return e.map(function(n,r){return{target:n,id:r,total:e.length,transforms:{list:T(n)}}})}function Q(n,e){var r=x(e);if(/^spring/.test(r.easing)&&(r.duration=c(r.easing)),u.arr(n)){var t=n.length;2===t&&!u.obj(n[0])?n={value:n}:u.fnc(e.duration)||(r.duration=e.duration/t)}var a=u.arr(n)?n:[n];return a.map(function(n,r){var t=u.obj(n)&&!u.pth(n)?n:{value:n};return u.und(t.delay)&&(t.delay=r?0:e.delay),u.und(t.endDelay)&&(t.endDelay=r===a.length-1?e.endDelay:0),t}).map(function(n){return w(n,r)})}function V(n,e){var r=[],t=e.keyframes;for(var a in t&&(e=w(function(n){for(var e=g(m(n.map(function(n){return Object.keys(n)})),function(n){return u.key(n)}).reduce(function(n,e){return n.indexOf(e)<0&&n.push(e),n},[]),r={},t=function(t){var a=e[t];r[a]=n.map(function(n){var e={};for(var r in n)u.key(r)?r==a&&(e.value=n[r]):e[r]=n[r];return e})},a=0;a-1&&(U.splice(i,1),r=U.length)}else a.tick(e);t++}n()}else K=cancelAnimationFrame(K)}return n}();function en(r){void 0===r&&(r={});var t,i=0,o=0,u=0,s=0,c=null;function f(){return window.Promise&&new Promise(function(n){return c=n})}var l,d,p,v,h,m,y,b,x=f(),k=(d=M(n,l=r),p=M(e,l),v=V(p,l),h=Z(l.targets),m=R(h,v),y=W(m,p),b=J,J++,w(d,{id:b,children:[],animatables:h,animations:m,duration:y.duration,delay:y.delay,endDelay:y.endDelay}));function C(){k.reversed=!k.reversed,t.forEach(function(n){return n.reversed=k.reversed})}function O(n){return k.reversed?k.duration-n:n}function P(){i=0,o=O(k.currentTime)*(1/en.speed)}function I(n,e){e&&e.seek(n-e.timelineOffset)}function B(n){for(var e=0,r=k.animations,t=r.length;e2||(b=Math.round(b*p)/p)),v.push(b)}var w=d.length;if(w){m=d[0];for(var C=0;C0&&(k.began=!0,D("begin"),D("loopBegin")),d<=r&&0!==k.currentTime&&B(0),(d>=l&&k.currentTime!==e||!e)&&B(e),d>r&&d=e&&(o=0,k.remaining&&!0!==k.remaining&&k.remaining--,k.remaining?(i=u,D("loopComplete"),D("loopBegin"),"alternate"===k.direction&&C()):(k.paused=!0,k.completed||(k.completed=!0,D("loopComplete"),D("complete"),"Promise"in window&&(c(),x=f()))))}return k.reset=function(){var n=k.direction;k.passThrough=!1,k.currentTime=0,k.progress=0,k.paused=!0,k.began=!1,k.changeBegan=!1,k.completed=!1,k.changeCompleted=!1,k.reversePlayback=!1,k.reversed="reverse"===n,k.remaining=k.loop,t=k.children;for(var e=s=t.length;e--;)k.children[e].reset();(k.reversed&&!0!==k.loop||"alternate"===n&&1===k.loop)&&k.remaining++,B(0)},k.set=function(n,e){return G(n,e),k},k.tick=function(n){u=n,i||(i=u),T((u+(o-i))*en.speed)},k.seek=function(n){T(O(n))},k.pause=function(){k.paused=!0,P()},k.play=function(){k.paused&&(k.paused=!1,U.push(k),P(),K||nn())},k.reverse=function(){C(),P()},k.restart=function(){k.reset(),k.play()},k.finished=x,k.reset(),k.autoplay&&k.play(),k}function rn(n,e){for(var r=e.length;r--;)b(n,e[r].animatable.target)&&e.splice(r,1)}return document.addEventListener("visibilitychange",function(){document.hidden?(U.forEach(function(n){return n.pause()}),_=U.slice(0),U=[]):_.forEach(function(n){return n.play()})}),en.version="3.0.0",en.speed=1,en.running=U,en.remove=function(n){for(var e=Y(n),r=U.length;r--;){var t=U[r],a=t.animations,i=t.children;rn(e,a);for(var o=i.length;o--;){var u=i[o],s=u.animations;rn(e,s),s.length||u.children.length||i.splice(o,1)}a.length||i.length||t.pause()}},en.get=N,en.set=G,en.convertPx=I,en.path=function(n,e){var r=u.str(n)?h(n)[0]:n,t=e||100;return function(n){return{property:n,el:r,svg:q(r),totalLength:j(r)*(t/100)}}},en.setDashoffset=function(n){var e=j(n);return n.setAttribute("stroke-dasharray",e),e},en.stagger=function(n,e){void 0===e&&(e={});var r=e.direction||"normal",t=e.easing?v(e.easing):null,a=e.grid,i=e.axis,o=e.from||0,s="first"===o,c="center"===o,f="last"===o,l=u.arr(n),d=l?parseFloat(n[0]):parseFloat(n),p=l?parseFloat(n[1]):0,h=C(l?n[1]:n)||0,g=e.start||0+(l?d:0),m=[],y=0;return function(n,e,u){if(s&&(o=0),c&&(o=(u-1)/2),f&&(o=u-1),!m.length){for(var v=0;v-1&&U.splice(i,1);for(var c=0;c=e?t:e)),t}(O(t),e,o)},j=function(){return l.Date.now()},S=Math.max,M=Math.min,k=function(t,e,o){var r,n,s,c,l,a,u=0,h=!1,f=!1,p=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function d(e){var o=r,i=n;return r=n=void 0,u=e,c=t.apply(i,o)}function v(t){var o=t-a;return void 0===a||o>=e||o<0||f&&t-u>=s}function y(){var t=j();if(v(t))return _(t);l=setTimeout(y,function(t){var o=e-(t-a);return f?M(o,s-(t-u)):o}(t))}function _(t){return l=void 0,p&&r?d(t):(r=n=void 0,c)}function b(){var t=j(),o=v(t);if(r=arguments,n=this,a=t,o){if(void 0===l)return function(t){return u=t,l=setTimeout(y,e),h?d(t):c}(a);if(f)return clearTimeout(l),l=setTimeout(y,e),d(a)}return void 0===l&&(l=setTimeout(y,e)),c}return e=O(e)||0,i(o)&&(h=!!o.leading,s=(f="maxWait"in o)?S(O(o.maxWait)||0,e):s,p="trailing"in o?!!o.trailing:p),b.cancel=function(){void 0!==l&&clearTimeout(l),u=0,r=a=n=l=void 0},b.flush=function(){return void 0===l?c:_(j())},b},P=o(0),T=["webkit","moz","ms","o"],E=new RegExp("^-(?!(?:"+T.join("|")+")-)");function W(t,e){e=function(t){var e={};return Object.keys(t).forEach((function(o){if(E.test(o)){var r=t[o];o=o.replace(/^-/,""),e[o]=r,T.forEach((function(t){e["-"+t+"-"+o]=r}))}else e[o]=t[o]})),e}(e),Object.keys(e).forEach((function(o){var r=o.replace(/^-/,"").replace(/-([a-z])/g,(function(t,e){return e.toUpperCase()}));t.style[r]=e[o]}))}var A,C=function(){function t(t){this._scrollbar=t}return t.prototype.render=function(t){var e=t.x,o=void 0===e?0:e,r=t.y,n=void 0===r?0:r,i=this._scrollbar,s=i.size,c=i.track,l=i.offset;if(W(i.contentEl,{"-transform":"translate3d("+-(l.x+o)+"px, "+-(l.y+n)+"px, 0)"}),o){c.xAxis.show();var a=s.container.width/(s.container.width+Math.abs(o));W(c.xAxis.thumb.element,{"-transform":"translate3d("+c.xAxis.thumb.offset+"px, 0, 0) scale3d("+a+", 1, 1)","-transform-origin":o<0?"left":"right"})}n&&(c.yAxis.show(),a=s.container.height/(s.container.height+Math.abs(n)),W(c.yAxis.thumb.element,{"-transform":"translate3d(0, "+c.yAxis.thumb.offset+"px, 0) scale3d(1, "+a+", 1)","-transform-origin":n<0?"top":"bottom"})),c.autoHideOnIdle()},t}(),N=function(){function t(t){this._scrollbar=t,this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d"),W(this._canvas,{position:"absolute",top:0,left:0,width:"100%",height:"100%",display:"none"})}return t.prototype.mount=function(){this._scrollbar.containerEl.appendChild(this._canvas)},t.prototype.unmount=function(){this._canvas.parentNode&&this._canvas.parentNode.removeChild(this._canvas)},t.prototype.adjust=function(){var t=this._scrollbar.size,e=window.devicePixelRatio||1,o=t.container.width*e,r=t.container.height*e;o===this._canvas.width&&r===this._canvas.height||(this._canvas.width=o,this._canvas.height=r,this._ctx.scale(e,e))},t.prototype.recordTouch=function(t){var e=t.touches[t.touches.length-1];this._touchX=e.clientX,this._touchY=e.clientY},t.prototype.render=function(t,e){var o=t.x,r=void 0===o?0:o,n=t.y,i=void 0===n?0:n;if(r||i){W(this._canvas,{display:"block"});var s=this._scrollbar.size;this._ctx.clearRect(0,0,s.container.width,s.container.height),this._ctx.fillStyle=e,this._renderX(r),this._renderY(i)}else W(this._canvas,{display:"none"})},t.prototype._getMaxOverscroll=function(){var t=this._scrollbar.options.plugins.overscroll;return t&&t.maxOverscroll?t.maxOverscroll:150},t.prototype._renderX=function(t){var e=this._scrollbar.size,o=this._getMaxOverscroll(),r=e.container,n=r.width,i=r.height,s=this._ctx;s.save(),t>0&&s.transform(-1,0,0,1,n,0);var c=w(Math.abs(t)/o,0,.75),l=w(c,0,.25)*n,a=Math.abs(t),u=this._touchY||i/2;s.globalAlpha=c,s.beginPath(),s.moveTo(0,-l),s.quadraticCurveTo(a,u,0,i+l),s.fill(),s.closePath(),s.restore()},t.prototype._renderY=function(t){var e=this._scrollbar.size,o=this._getMaxOverscroll(),r=e.container,n=r.width,i=r.height,s=this._ctx;s.save(),t>0&&s.transform(1,0,0,-1,0,i);var c=w(Math.abs(t)/o,0,.75),l=w(c,0,.25)*n,a=this._touchX||n/2,u=Math.abs(t);s.globalAlpha=c,s.beginPath(),s.moveTo(-l,0),s.quadraticCurveTo(a,u,n+l,0),s.fill(),s.closePath(),s.restore()},t}();o.d(e,"OverscrollEffect",(function(){return A})),function(t){t.BOUNCE="bounce",t.GLOW="glow"}(A||(A={}));var B=/wheel|touch/,z=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._glow=new N(e.scrollbar),e._bounce=new C(e.scrollbar),e._wheelScrollBack={x:!1,y:!1},e._lockWheel={x:!1,y:!1},e._touching=!1,e._amplitude={x:0,y:0},e._position={x:0,y:0},e._releaseWheel=k((function(){e._lockWheel.x=!1,e._lockWheel.y=!1}),30),e}return function(t,e){function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}(e,t),Object.defineProperty(e.prototype,"_isWheelLocked",{get:function(){return this._lockWheel.x||this._lockWheel.y},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_enabled",{get:function(){return!!this.options.effect},enumerable:!0,configurable:!0}),e.prototype.onInit=function(){var t=this._glow,e=this.options,o=this.scrollbar,r=e.effect;Object.defineProperty(e,"effect",{get:function(){return r},set:function(e){if(e){if(e!==A.BOUNCE&&e!==A.GLOW)throw new TypeError("unknow overscroll effect: "+e);r=e,o.options.continuousScrolling=!1,e===A.GLOW?(t.mount(),t.adjust()):t.unmount()}else r=void 0}}),e.effect=r},e.prototype.onUpdate=function(){this.options.effect===A.GLOW&&this._glow.adjust()},e.prototype.onRender=function(t){if(this._enabled){this.scrollbar.options.continuousScrolling&&(this.scrollbar.options.continuousScrolling=!1);var e=t.x,o=t.y;!this._amplitude.x&&this._willOverscroll("x",t.x)&&(e=0,this._absorbMomentum("x",t.x)),!this._amplitude.y&&this._willOverscroll("y",t.y)&&(o=0,this._absorbMomentum("y",t.y)),this.scrollbar.setMomentum(e,o),this._render()}},e.prototype.transformDelta=function(t,e){if(this._lastEventType=e.type,!this._enabled||!B.test(e.type))return t;this._isWheelLocked&&/wheel/.test(e.type)&&(this._releaseWheel(),this._willOverscroll("x",t.x)&&(t.x=0),this._willOverscroll("y",t.y)&&(t.y=0));var o=t.x,r=t.y;switch(this._willOverscroll("x",t.x)&&(o=0,this._addAmplitude("x",t.x)),this._willOverscroll("y",t.y)&&(r=0,this._addAmplitude("y",t.y)),e.type){case"touchstart":case"touchmove":this._touching=!0,this._glow.recordTouch(e);break;case"touchcancel":case"touchend":this._touching=!1}return{x:o,y:r}},e.prototype._willOverscroll=function(t,e){if(!e)return!1;if(this._position[t])return!0;var o=this.scrollbar.offset[t],r=this.scrollbar.limit[t];return 0!==r&&w(o+e,0,r)===o&&(0===o||o===r)},e.prototype._absorbMomentum=function(t,e){var o=this.options,r=this._lastEventType,n=this._amplitude;B.test(r)&&(n[t]=w(e,-o.maxOverscroll,o.maxOverscroll))},e.prototype._addAmplitude=function(t,e){var o=this.options,r=this.scrollbar,n=this._amplitude,i=this._position,s=n[t],c=e*s<0,l=s+e*(1-(c?0:this._wheelScrollBack[t]?1:Math.abs(s/o.maxOverscroll)));n[t]=0===r.offset[t]?w(l,-o.maxOverscroll,0):w(l,0,o.maxOverscroll),c&&(i[t]=n[t])},e.prototype._render=function(){var t=this.options,e=this._amplitude,o=this._position;if(this._enabled&&(e.x||e.y||o.x||o.y)){var r=this._nextAmp("x"),i=this._nextAmp("y");switch(e.x=r.amplitude,o.x=r.position,e.y=i.amplitude,o.y=i.position,t.effect){case A.BOUNCE:this._bounce.render(o);break;case A.GLOW:this._glow.render(o,this.options.glowColor)}"function"==typeof t.onScroll&&t.onScroll.call(this,n({},o))}},e.prototype._nextAmp=function(t){var e=this.options,o=this._amplitude,r=this._position,n=1-e.damping,i=o[t],s=r[t],c=this._touching?i:i*n|0,l=c-s,a=s+l-(l*n|0);return!this._touching&&Math.abs(a)1&&arguments[1]!==undefined?arguments[1]:document;if(typeof t!=="string"){return t}return n.querySelector(t)};var i=t.queryAll=function e(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:document;if(typeof t!=="string"){return t}return Array.prototype.slice.call(n.querySelectorAll(t))}},function(e,t,n){"use strict";var r=n(3);var i=a(r);function a(e){return e&&e.__esModule?e:{default:e}}e.exports=i.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:false;var i={url:window.location.pathname+window.location.search,method:"GET",data:null,headers:{}};var a=r({},i,t);var o=new XMLHttpRequest;o.onreadystatechange=function(){if(o.readyState===4){if(o.status!==500){n(o)}else{n(o)}}};o.open(a.method,a.url,true);Object.keys(a.headers).forEach(function(e){o.setRequestHeader(e,a.headers[e])});o.send(a.data);return o};t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=function e(){var t=document.createElement("div");var n={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var r in n){if(t.style[r]!==undefined){return n[r]}}return false};t.default=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=function e(){return window.location.pathname+window.location.search};t.default=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=n(1);var i=function e(t,n){var i=0;var a=function e(a){if(t.querySelector(n[a])==null){console.warn("Element "+n[a]+" is not in current page.")}else{(0,r.queryAll)(n[a]).forEach(function(e,o){(0,r.queryAll)(n[a],t)[o].setAttribute("data-swup",i);i++})}};for(var o=0;o-1){this._handlers[t].splice(a,1)}}else{console.warn("Handler for event '"+t+"' no found.")}}else{this._handlers[t]=[]}}else{Object.keys(this._handlers).forEach(function(e){r._handlers[e]=[]})}};t.default=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=function e(t,n,r){this.transition={from:t,to:n,custom:r}};t.default=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=n(1);var i=n(0);var a=function e(){var t=[];var n=(0,r.queryAll)(this.options.animationSelector);n.forEach(function(e){var n=new Promise(function(t){e.addEventListener((0,i.transitionEnd)(),function(n){if(e==n.target){t()}})});t.push(n)});return t};t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=n(0);var i=function e(t){var n=t.responseText;var i=(0,r.getDataFromHtml)(n,this.options.containers);if(i){i.responseURL=t.responseURL?t.responseURL:window.location.href}else{console.warn("Received page is invalid.");return null}return i};t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:true});var r=t.use=function e(t){if(!t.isSwupPlugin){console.warn("Not swup plugin instance "+t+".");return}this.plugins.push(t);t.swup=this;if(typeof t._beforeMount==="function"){t._beforeMount()}t.mount();return this.plugins};var i=t.unuse=function e(t){var n=void 0;if(typeof t==="string"){n=this.plugins.find(function(e){return t===e.name})}else{n=t}if(!n){console.warn("No such plugin.");return}n.unmount();if(typeof n._afterUnmount==="function"){n._afterUnmount()}var r=this.plugins.indexOf(n);this.plugins.splice(r,1);return this.plugins};var a=t.findPlugin=function e(t){return this.plugins.find(function(e){return t===e.name})}}])}); -------------------------------------------------------------------------------- /src/assets/js/plugins/typing.min.js: -------------------------------------------------------------------------------- 1 | $(function(){"use strict";var t=function(t,e,i){this.toRotate=e,this.el=t,this.loopNum=0,this.period=parseInt(i,10)||2e3,this.txt="",this.tick(),this.isDeleting=!1};t.prototype.tick=function(){var t=this.loopNum%this.toRotate.length,e=this.toRotate[t];this.isDeleting?this.txt=e.substring(0,this.txt.length-1):this.txt=e.substring(0,this.txt.length+1),this.el.innerHTML=''+this.txt+"";var i=this,s=200-100*Math.random();this.isDeleting&&(s/=6),this.isDeleting||this.txt!==e?this.isDeleting&&""===this.txt&&(this.isDeleting=!1,this.loopNum++,s=500):(s=this.period,this.isDeleting=!0),setTimeout(function(){i.tick()},s)},window.onload=function(){for(var e=document.getElementsByClassName("txt-rotate"),i=0;i .wrap { border-right: 0.08em solid rgba(215,205,240,.6); padding-right: 5px }",document.body.appendChild(a)},document.addEventListener("swup:contentReplaced",function(){for(var e=document.getElementsByClassName("txt-rotate"),i=0;i .wrap { border-right: 0.08em solid rgba(215,205,240,.6); padding-right: 5px }",document.body.appendChild(a)})}); -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | apiUrl: 'https://api.tomondre.com' 4 | }; 5 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Portfolio 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes recent versions of Safari, Chrome (including 12 | * Opera), Edge on the desktop, and iOS and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** 22 | * By default, zone.js will patch all possible macroTask and DomEvents 23 | * user can disable parts of macroTask/DomEvents patch by setting following flags 24 | * because those flags need to be set before `zone.js` being loaded, and webpack 25 | * will put import in the top of bundle, so user need to create a separate file 26 | * in this directory (for example: zone-flags.ts), and put the following flags 27 | * into that file, and then add the following code before importing zone.js. 28 | * import './zone-flags'; 29 | * 30 | * The flags allowed in zone-flags.ts are listed here. 31 | * 32 | * The following flags will work for all browsers. 33 | * 34 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 35 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 36 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 37 | * 38 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 39 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 40 | * 41 | * (window as any).__Zone_enable_cross_context_check = true; 42 | * 43 | */ 44 | 45 | /*************************************************************************************************** 46 | * Zone JS is required by default for Angular itself. 47 | */ 48 | import 'zone.js'; // Included with Angular CLI. 49 | 50 | 51 | /*************************************************************************************************** 52 | * APPLICATION IMPORTS 53 | */ 54 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: { 11 | context(path: string, deep?: boolean, filter?: RegExp): { 12 | (id: string): T; 13 | keys(): string[]; 14 | }; 15 | }; 16 | 17 | // First, initialize the Angular testing environment. 18 | getTestBed().initTestEnvironment( 19 | BrowserDynamicTestingModule, 20 | platformBrowserDynamicTesting(), 21 | ); 22 | 23 | // Then we find all the tests. 24 | const context = require.context('./', true, /\.spec\.ts$/); 25 | // And load the modules. 26 | context.keys().forEach(context); 27 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "noImplicitOverride": true, 10 | "noPropertyAccessFromIndexSignature": true, 11 | "noImplicitReturns": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "sourceMap": true, 14 | "declaration": false, 15 | "downlevelIteration": true, 16 | "experimentalDecorators": true, 17 | "moduleResolution": "node", 18 | "importHelpers": true, 19 | "target": "es2020", 20 | "module": "es2020", 21 | "skipLibCheck": true, 22 | "lib": [ 23 | "es2020", 24 | "dom" 25 | ] 26 | }, 27 | "angularCompilerOptions": { 28 | "enableI18nLegacyMessageIdFormat": false, 29 | "strictInjectionParameters": true, 30 | "strictInputAccessModifiers": true, 31 | "strictTemplates": true 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | --------------------------------------------------------------------------------