├── .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 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
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 |
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 |
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 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
39 |
40 | {{getActivities(education)}}
41 |
42 |
43 |
44 |
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 |
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 |
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 |
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 |
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 |
15 |
16 |
17 |
18 |
37 |
38 |
39 |
40 |
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 |
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 |
--------------------------------------------------------------------------------