├── .babelrc ├── .editorconfig ├── .env.example ├── .eslintrc.json ├── .github ├── dependabot.yml └── workflows │ └── ci.yml ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── generators ├── plopfile.js └── templates │ ├── index.tsx.hbs │ └── styles.ts.hbs ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── prettierrc.json ├── public ├── fonts │ ├── poppins-v15-latin-300.woff2 │ ├── poppins-v15-latin-500.woff2 │ ├── poppins-v15-latin-700.woff2 │ └── poppins-v15-latin-regular.woff2 ├── img │ ├── back_top.svg │ ├── favicon.ico │ ├── hands.svg │ ├── logo.svg │ ├── logo144.png │ ├── logo192.png │ ├── logo256.png │ ├── logo384.png │ ├── logo48.png │ ├── logo512.png │ ├── logo72.png │ └── logo96.png ├── manifest.json ├── sw.js └── workbox-019999f6.js ├── src ├── Templates │ └── Home │ │ └── index.tsx ├── components │ ├── Sections │ │ ├── About │ │ │ ├── index.tsx │ │ │ └── styles.tsx │ │ ├── Contact │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── Home │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ └── Portfolio │ │ │ ├── index.tsx │ │ │ └── styles.tsx │ └── UI │ │ ├── Button │ │ ├── index.tsx │ │ └── styles.tsx │ │ ├── Footer │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── Header │ │ ├── index.tsx │ │ └── styles.tsx │ │ ├── Portfolio │ │ ├── index.tsx │ │ ├── projects.json │ │ └── styles.tsx │ │ ├── ScrollTop │ │ ├── index.tsx │ │ └── styles.tsx │ │ └── Title │ │ ├── index.tsx │ │ └── styles.tsx ├── config │ └── links.ts ├── graphql │ ├── client.ts │ └── queries.ts ├── hooks │ ├── useAnimateOnScroll.tsx │ └── useScroll.tsx ├── pages │ ├── _app.tsx │ ├── _document.tsx │ └── index.tsx ├── styles │ ├── globals.ts │ ├── keyframes │ │ └── keyframes.ts │ ├── styled-components.d.ts │ └── theme │ │ └── theme.ts └── types │ └── types.ts ├── tsconfig.json └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "development": { 4 | "plugins": [ 5 | [ 6 | "babel-plugin-styled-components", 7 | { "ssr": true, "displayName": true, "preprocess": false } 8 | ] 9 | ], 10 | "presets": ["next/babel"] 11 | }, 12 | "production": { 13 | "plugins": [ 14 | [ 15 | "babel-plugin-styled-components", 16 | { "ssr": true, "displayName": true, "preprocess": false } 17 | ] 18 | ], 19 | "presets": ["next/babel"] 20 | } 21 | }, 22 | "plugins": [ 23 | [ 24 | "babel-plugin-styled-components", 25 | { "ssr": true, "displayName": true, "preprocess": false } 26 | ] 27 | ] 28 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = spaces 5 | indent_size = 2 6 | end_of_lines = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | GRAPHQL_HOST= 2 | GRAPHQL_TOKEN= 3 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2020": true, 5 | "jest": true, 6 | "node": true 7 | }, 8 | "settings": { 9 | "react": { 10 | "version": "detect" 11 | } 12 | }, 13 | "extends": [ 14 | "eslint:recommended", 15 | "plugin:react/recommended", 16 | "plugin:@typescript-eslint/eslint-recommended", 17 | "plugin:@typescript-eslint/recommended", 18 | "plugin:prettier/recommended" 19 | ], 20 | "parser": "@typescript-eslint/parser", 21 | "parserOptions": { 22 | "ecmaFeatures": { 23 | "jsx": true 24 | }, 25 | "ecmaVersion": 11, 26 | "sourceType": "module" 27 | }, 28 | "plugins": ["react", "react-hooks", "@typescript-eslint"], 29 | "rules": { 30 | "react-hooks/rules-of-hooks": "error", 31 | "react-hooks/exhaustive-deps": "warn", 32 | "react/prop-types": "off", 33 | "react/react-in-jsx-scope": "off", 34 | "@typescript-eslint/explicit-module-boundary-types": "false" 35 | } 36 | } -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "08:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: "@types/node" 11 | versions: 12 | - 14.14.28 13 | - 14.14.30 14 | - 14.14.31 15 | - 14.14.32 16 | - 14.14.33 17 | - 15.0.0 18 | - dependency-name: next-pwa 19 | versions: 20 | - 5.0.6 21 | - 5.2.1 22 | - 5.2.14 23 | - 5.2.15 24 | - 5.2.3 25 | - 5.2.5 26 | - 5.2.9 27 | - dependency-name: "@babel/core" 28 | versions: 29 | - 7.12.13 30 | - 7.13.14 31 | - 7.13.15 32 | - 7.13.16 33 | - dependency-name: "@storybook/addon-essentials" 34 | versions: 35 | - 6.1.16 36 | - 6.1.18 37 | - 6.1.19 38 | - 6.2.3 39 | - 6.2.4 40 | - 6.2.5 41 | - 6.2.7 42 | - dependency-name: "@storybook/react" 43 | versions: 44 | - 6.1.16 45 | - 6.1.17 46 | - 6.1.20 47 | - 6.1.21 48 | - 6.2.1 49 | - 6.2.2 50 | - 6.2.3 51 | - 6.2.5 52 | - dependency-name: "@typescript-eslint/eslint-plugin" 53 | versions: 54 | - 4.14.2 55 | - 4.15.1 56 | - 4.15.2 57 | - 4.16.1 58 | - 4.18.0 59 | - 4.19.0 60 | - 4.21.0 61 | - dependency-name: next 62 | versions: 63 | - 10.0.6 64 | - 10.0.7 65 | - 10.1.1 66 | - 10.1.3 67 | - dependency-name: "@typescript-eslint/parser" 68 | versions: 69 | - 4.17.0 70 | - 4.20.0 71 | - dependency-name: "@types/jest" 72 | versions: 73 | - 26.0.22 74 | - dependency-name: react-dom 75 | versions: 76 | - 17.0.2 77 | - dependency-name: react 78 | versions: 79 | - 17.0.2 80 | - dependency-name: react-scroll 81 | versions: 82 | - 1.8.2 83 | - dependency-name: husky 84 | versions: 85 | - 5.1.2 86 | - dependency-name: eslint-config-prettier 87 | versions: 88 | - 8.0.0 89 | - 8.1.0 90 | - dependency-name: typescript 91 | versions: 92 | - 4.1.4 93 | - 4.1.5 94 | - 4.2.2 95 | - dependency-name: "@babel/preset-typescript" 96 | versions: 97 | - 7.12.16 98 | - 7.12.17 99 | - 7.13.0 100 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: [pull_request] 3 | 4 | jobs: 5 | build: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - name: Checkout Repository 9 | uses: actions/checkout@v2 10 | 11 | - name: Setup Node 12 | uses: actions/setup-node@v1 13 | with: 14 | node-version: 14.x 15 | 16 | - name: Install dependencies 17 | run: yarn install 18 | 19 | - name: Build 20 | run: yarn build 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env 29 | .env.local 30 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | # vercel 35 | .vercel 36 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": true 5 | } 6 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🚀 Portfólio 2 | 3 | Portfólio desenvolvido com NextJS e TypeScript. 4 | 5 | ## ℹ️ Sobre o projeto 6 | 7 | Este projeto consiste em mostrar meus recentes e futuros trabalhos realizados ao decorrer da minha carreira. 8 | 9 | ## ✨ Demonstração 10 | 11 | Veja abaixo uma foto do projeto. 12 | [![Image from Gyazo](https://i.gyazo.com/b340efdafe7ee1970be4edac40c45f19.png)](https://gyazo.com/b340efdafe7ee1970be4edac40c45f19) 13 | 14 | Você pode conferir o resultado final em: https://www.caioaugusto.dev/ 15 | 16 | ## 🎯 Objetivo do projeto 17 | 18 | Foi realizado este projeto com o intuito de aplicar os conhecimentos adquiridos com NextJS. Foi reforçado, também, os conhecimentos com TypeScript. 19 | 20 | ## 📝 Tecnologias 21 | 22 | - [React.js](https://pt-br.reactjs.org) 23 | - [Next.js](https://nextjs.org) 24 | - [TypeScript](https://www.typescriptlang.org/) 25 | - [styled-components](https://styled-components.com/) 26 | - [GraphQL](https://graphql.org/) 27 | - [graphql-request](https://www.npmjs.com/package/graphql-request) 28 | - [GraphCMS](https://graphcms.com/) 29 | - [next-pwa](https://www.npmjs.com/package/next-pwa) 30 | - [Plop.js](https://plopjs.com/) 31 | - [Husky](https://www.npmjs.com/package/husky) 32 | 33 | ## ⚙️ Instalação 34 | 35 | Para que este rode em sua máquina, siga os passos abaixo: 36 | 37 | ```bash 38 | # Clone o repositório em alguma pasta em sua máquina 39 | $ git clone https://github.com/CaioAugustoo/portfolio.git 40 | 41 | # Entre no repositório 42 | $ cd portfolio 43 | 44 | Instale as dependências digitando no termimal: 45 | $ yarn install 46 | 47 | Rode a aplicação no modo de desenvolvimento. 48 | $ yarn dev 49 | 50 | Abra http://localhost:3000 no seu navegador para visualizar o projeto 51 | ``` 52 | 53 | ## Licença 54 | Copyright © 2021 Caio Augusto. 55 | -------------------------------------------------------------------------------- /generators/plopfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (plop) { 2 | // controller generator 3 | plop.setGenerator("component", { 4 | description: "application component logic", 5 | prompts: [ 6 | { 7 | type: "input", 8 | name: "name", 9 | message: "controller name please", 10 | }, 11 | ], 12 | actions: [ 13 | { 14 | type: "add", 15 | path: "../src/components/{{pascalCase name}}/index.tsx", 16 | templateFile: "templates/index.tsx.hbs", 17 | }, 18 | { 19 | type: "add", 20 | path: "../src/components/{{pascalCase name}}/styles.tsx", 21 | templateFile: "templates/styles.ts.hbs", 22 | }, 23 | ], 24 | }); 25 | }; 26 | -------------------------------------------------------------------------------- /generators/templates/index.tsx.hbs: -------------------------------------------------------------------------------- 1 | import * as S from "./styles"; 2 | 3 | const {{pascalCase name}} = () => ( 4 | 5 |

{{pascalCase name}}

6 |
7 | ); 8 | 9 | export default {{pascalCase name}}; -------------------------------------------------------------------------------- /generators/templates/styles.ts.hbs: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Wrapper = styled.main``; -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const withPWA = require("next-pwa"); 2 | const isProd = process.env.NODE_ENV === "production"; 3 | 4 | module.exports = withPWA({ 5 | pwa: { 6 | dest: "public", 7 | disable: !isProd, 8 | }, 9 | images: { 10 | domains: ["media.graphcms.com"], 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "portfolio-nextjs", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "deploy": "yarn build && next export", 10 | "generate": "yarn plop --plopfile ./generators/plopfile.js" 11 | }, 12 | "husky": { 13 | "hooks": { 14 | "pre-commit": "lint-staged" 15 | } 16 | }, 17 | "dependencies": { 18 | "graphql": "^15.8.0", 19 | "graphql-request": "^4.0.0", 20 | "next": "^10.2.3", 21 | "next-pwa": "^5.4.5", 22 | "react": "17.0.1", 23 | "react-dom": "17.0.1", 24 | "react-scroll": "^1.8.5", 25 | "styled-components": "^5.3.3" 26 | }, 27 | "devDependencies": { 28 | "@babel/core": "^7.17.5", 29 | "@babel/preset-typescript": "^7.16.7", 30 | "@types/jest": "^27.4.1", 31 | "@types/node": "^17.0.21", 32 | "@types/react": "^17.0.37", 33 | "@types/react-scroll": "^1.8.2", 34 | "@types/styled-components": "^5.1.23", 35 | "@typescript-eslint/eslint-plugin": "^4.25.0", 36 | "@typescript-eslint/parser": "^4.33.0", 37 | "babel-loader": "^8.2.3", 38 | "babel-plugin-styled-components": "^2.0.5", 39 | "eslint-config-prettier": "^8.5.0", 40 | "eslint-plugin-prettier": "^4.0.0", 41 | "eslint-plugin-react": "^7.29.0", 42 | "eslint-plugin-react-hooks": "^4.3.0", 43 | "husky": "^7.0.4", 44 | "lint-staged": "^12.3.2", 45 | "plop": "^3.0.5", 46 | "react-is": "^17.0.2", 47 | "terser-webpack-plugin": "^5.3.0", 48 | "typescript": "^4.3.5" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "semi": true, 4 | "singleQuote": false 5 | } -------------------------------------------------------------------------------- /public/fonts/poppins-v15-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/fonts/poppins-v15-latin-300.woff2 -------------------------------------------------------------------------------- /public/fonts/poppins-v15-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/fonts/poppins-v15-latin-500.woff2 -------------------------------------------------------------------------------- /public/fonts/poppins-v15-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/fonts/poppins-v15-latin-700.woff2 -------------------------------------------------------------------------------- /public/fonts/poppins-v15-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/fonts/poppins-v15-latin-regular.woff2 -------------------------------------------------------------------------------- /public/img/back_top.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/favicon.ico -------------------------------------------------------------------------------- /public/img/hands.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/logo144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo144.png -------------------------------------------------------------------------------- /public/img/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo192.png -------------------------------------------------------------------------------- /public/img/logo256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo256.png -------------------------------------------------------------------------------- /public/img/logo384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo384.png -------------------------------------------------------------------------------- /public/img/logo48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo48.png -------------------------------------------------------------------------------- /public/img/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo512.png -------------------------------------------------------------------------------- /public/img/logo72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo72.png -------------------------------------------------------------------------------- /public/img/logo96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CaioAugustoo/portfolio/bb50c28df2e15fbb1cf2189bb9b37acd521bc057/public/img/logo96.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Caio Augusto | Front-end Developer", 3 | "short_name": "Caio Augusto", 4 | "start_url": "/", 5 | "background_color": "#040413", 6 | "theme_color": "#4C30F5", 7 | "display": "fullscreen", 8 | "icons": [ 9 | { 10 | "src": "/img/logo48.png", 11 | "type": "image/png", 12 | "sizes": "48x48" 13 | }, 14 | { 15 | "src": "/img/logo72.png", 16 | "type": "image/png", 17 | "sizes": "72x72" 18 | }, 19 | { 20 | "src": "/img/logo96.png", 21 | "type": "image/png", 22 | "sizes": "96x96" 23 | }, 24 | { 25 | "src": "/img/logo144.png", 26 | "type": "image/png", 27 | "sizes": "144x144" 28 | }, 29 | { 30 | "src": "/img/logo192.png", 31 | "type": "image/png", 32 | "sizes": "192x192" 33 | }, 34 | { 35 | "src": "/img/logo256.png", 36 | "type": "image/png", 37 | "sizes": "256x256" 38 | }, 39 | { 40 | "src": "/img/logo384.png", 41 | "type": "image/png", 42 | "sizes": "384x384" 43 | }, 44 | { 45 | "src": "/img/logo512.png", 46 | "type": "image/png", 47 | "sizes": "512x512" 48 | } 49 | ] 50 | } -------------------------------------------------------------------------------- /public/sw.js: -------------------------------------------------------------------------------- 1 | if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return s[e]||(r=new Promise((async r=>{if("document"in self){const s=document.createElement("script");s.src=e,document.head.appendChild(s),s.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!s[e])throw new Error(`Module ${e} didn’t register its module`);return s[e]}))},r=(r,s)=>{Promise.all(r.map(e)).then((e=>s(1===e.length?e[0]:e)))},s={require:Promise.resolve(r)};self.define=(r,n,t)=>{s[r]||(s[r]=Promise.resolve().then((()=>{let s={};const i={uri:location.origin+r.slice(1)};return Promise.all(n.map((r=>{switch(r){case"exports":return s;case"module":return i;default:return e(r)}}))).then((e=>{const r=t(...e);return s.default||(s.default=r),s}))})))}}define("./sw.js",["./workbox-019999f6"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_error",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/71247caf95475e3ea7f9a0f8a30beb258b23d005.523fe9d0846fc9163ae4.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/f6078781a05fe1bcb0902d23dbbb2662c8d200b3.d16e34d082bd9267f2e6.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/framework.0c239260661ae1d12aa2.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/main-801c73a5770b9c33fb68.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/pages/_app-1d92680df685be6ae011.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/pages/_error-3280d8d506df4c049934.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/pages/index-6c80d3e26890a9d9e0fc.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/polyfills-4f14e8c8ea1352d3ef0d.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/chunks/webpack-50bee04d1dc61f8adf5b.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/zUWGmoZ0QhEnMZttb-ErJ/_buildManifest.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/_next/static/zUWGmoZ0QhEnMZttb-ErJ/_ssgManifest.js",revision:"zUWGmoZ0QhEnMZttb-ErJ"},{url:"/fonts/poppins-v15-latin-300.woff2",revision:"9ddc04912d6e8f88d9de4045b8b89c59"},{url:"/fonts/poppins-v15-latin-500.woff2",revision:"84780596e268aa0cb2be48af2ed5c375"},{url:"/fonts/poppins-v15-latin-700.woff2",revision:"f4f17fd53c7d040e56f91a3ecb692b22"},{url:"/fonts/poppins-v15-latin-regular.woff2",revision:"9ed361bba8488aeb2797b82befda20f1"},{url:"/img/back_top.svg",revision:"d5c2178d487984f4100e057453034a0c"},{url:"/img/favicon.ico",revision:"c657fffd221375f2620a6b99a8e405d7"},{url:"/img/hands.svg",revision:"6306788471b5f06dd7a23c60f303a626"},{url:"/img/logo.svg",revision:"a1d7012929bd3cc0b7675f868debf719"},{url:"/img/logo144.png",revision:"5887cff92bd6102a298521d976d3efb8"},{url:"/img/logo192.png",revision:"c58423b33a0614fb6dfc0f3ff247e116"},{url:"/img/logo256.png",revision:"f1872d3c73df012ad5388bb54d99df41"},{url:"/img/logo384.png",revision:"aba75a80c1654f8c279c80aef9dd34f1"},{url:"/img/logo48.png",revision:"d8ca74b39cc9f112ea8fa2e9fdfa7e4d"},{url:"/img/logo512.png",revision:"6188099add6bd56d663ad4ac0b3b228d"},{url:"/img/logo72.png",revision:"d8ca74b39cc9f112ea8fa2e9fdfa7e4d"},{url:"/img/logo96.png",revision:"2662b66133e9b64561203150aeee8c11"},{url:"/manifest.json",revision:"db1b7652c0e7cdab0fc749a65d6b6f71"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",networkTimeoutSeconds:10,plugins:[{requestWillFetch:async({request:e})=>(Request(),e)},new e.ExpirationPlugin({maxEntries:1,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis|gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[{handlerDidError:async({request:e,event:r,error:s,state:n})=>caches.match("/offline.jpg",{ignoreSearch:!0})},new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:mp3|mp4)$/i,new e.StaleWhileRevalidate({cacheName:"static-media-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/\/api\/.*$/i,new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),e.registerRoute(/.*/i,new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[{handlerDidError:async({request:e,event:r,error:s,state:n})=>caches.match("/_error",{ignoreSearch:!0})},new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET")})); 2 | -------------------------------------------------------------------------------- /public/workbox-019999f6.js: -------------------------------------------------------------------------------- 1 | define("./workbox-019999f6.js",["exports"],(function(t){"use strict";try{self["workbox:core:6.1.2"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:6.1.2"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class a{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let a=r&&r.handler;const c=t.method;if(!a&&this.i.has(c)&&(a=this.i.get(c)),!a)return;let o;try{o=a.handle({url:s,request:t,event:e,params:i})}catch(t){o=Promise.reject(t)}const h=r&&r.catchHandler;return o instanceof Promise&&(this.o||h)&&(o=o.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){n=t}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),o}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const a=r.match({url:t,sameOrigin:e,request:s,event:n});if(a)return i=a,(Array.isArray(a)&&0===a.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"==typeof a)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const o=()=>(c||(c=new a,c.addFetchListener(),c.addCacheListener()),c);function h(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new i((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)a=new r(t,e,n);else if("function"==typeof t)a=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}return o().registerRoute(a),a}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter((t=>t&&t.length>0)).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t){t.then((()=>{}))}const p=new Set;class y{constructor(t,e,{onupgradeneeded:s,onversionchange:n}={}){this.h=null,this.u=t,this.l=e,this.p=s,this.m=n||(()=>this.close())}get db(){return this.h}async open(){if(!this.h)return this.h=await new Promise(((t,e)=>{let s=!1;setTimeout((()=>{s=!0,e(new Error("The open request was blocked and timed out"))}),this.OPEN_TIMEOUT);const n=indexedDB.open(this.u,this.l);n.onerror=()=>e(n.error),n.onupgradeneeded=t=>{s?(n.transaction.abort(),n.result.close()):"function"==typeof this.p&&this.p(t)},n.onsuccess=()=>{const e=n.result;s?e.close():(e.onversionchange=this.m.bind(this),t(e))}})),this}async getKey(t,e){return(await this.getAllKeys(t,e,1))[0]}async getAll(t,e,s){return await this.getAllMatching(t,{query:e,count:s})}async getAllKeys(t,e,s){return(await this.getAllMatching(t,{query:e,count:s,includeKeys:!0})).map((t=>t.key))}async getAllMatching(t,{index:e,query:s=null,direction:n="next",count:i,includeKeys:r=!1}={}){return await this.transaction([t],"readonly",((a,c)=>{const o=a.objectStore(t),h=e?o.index(e):o,u=[],l=h.openCursor(s,n);l.onsuccess=()=>{const t=l.result;t?(u.push(r?t:t.value),i&&u.length>=i?c(u):t.continue()):c(u)}}))}async transaction(t,e,s){return await this.open(),await new Promise(((n,i)=>{const r=this.h.transaction(t,e);r.onabort=()=>i(r.error),r.oncomplete=()=>n(),s(r,(t=>n(t)))}))}async g(t,e,s,...n){return await this.transaction([e],s,((s,i)=>{const r=s.objectStore(e),a=r[t].apply(r,n);a.onsuccess=()=>i(a.result)}))}close(){this.h&&(this.h.close(),this.h=null)}}y.prototype.OPEN_TIMEOUT=2e3;const m={readonly:["get","count","getKey","getAll","getAllKeys"],readwrite:["add","put","clear","delete"]};for(const[t,e]of Object.entries(m))for(const s of e)s in IDBObjectStore.prototype&&(y.prototype[s]=async function(e,...n){return await this.g(s,e,t,...n)});try{self["workbox:expiration:6.1.2"]&&_()}catch(t){}const g="cache-entries",R=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class v{constructor(t){this.R=t,this.h=new y("workbox-expiration",1,{onupgradeneeded:t=>this.v(t)})}v(t){const e=t.target.result.createObjectStore(g,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1}),(async t=>{await new Promise(((e,s)=>{const n=indexedDB.deleteDatabase(t);n.onerror=()=>{s(n.error)},n.onblocked=()=>{s(new Error("Delete blocked"))},n.onsuccess=()=>{e()}}))})(this.R)}async setTimestamp(t,e){const s={url:t=R(t),timestamp:e,cacheName:this.R,id:this.q(t)};await this.h.put(g,s)}async getTimestamp(t){return(await this.h.get(g,this.q(t))).timestamp}async expireEntries(t,e){const s=await this.h.transaction(g,"readwrite",((s,n)=>{const i=s.objectStore(g).index("timestamp").openCursor(null,"prev"),r=[];let a=0;i.onsuccess=()=>{const s=i.result;if(s){const n=s.value;n.cacheName===this.R&&(t&&n.timestamp=e?r.push(s.value):a++),s.continue()}else n(r)}})),n=[];for(const t of s)await this.h.delete(g,t.id),n.push(t.url);return n}q(t){return this.R+"|"+R(t)}}class q{constructor(t,e={}){this.U=!1,this._=!1,this.L=e.maxEntries,this.N=e.maxAgeSeconds,this.C=e.matchOptions,this.R=t,this.D=new v(t)}async expireEntries(){if(this.U)return void(this._=!0);this.U=!0;const t=this.N?Date.now()-1e3*this.N:0,e=await this.D.expireEntries(t,this.L),s=await self.caches.open(this.R);for(const t of e)await s.delete(t,this.C);this.U=!1,this._&&(this._=!1,d(this.expireEntries()))}async updateTimestamp(t){await this.D.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.N){return await this.D.getTimestamp(t)200===t.status||0===t.status?t:null};function x(){return(x=Object.assign||function(t){for(var e=1;e{this.resolve=t,this.reject=e}))}}function N(t){return"string"==typeof t?new Request(t):t}class C{constructor(t,e){this.T={},Object.assign(this,e),this.event=e.event,this.P=t,this.k=new b,this.K=[],this.O=[...t.plugins],this.W=new Map;for(const t of this.O)this.W.set(t,{});this.event.waitUntil(this.k.promise)}async fetch(t){const{event:e}=this;let n=N(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){throw new s("plugin-error-request-will-fetch",{thrownError:t})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.P.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=N(t);let s;const{cacheName:n,matchOptions:i}=this.P,r=await this.getCacheKey(e,"read"),a=x({},i,{cacheName:n});s=await caches.match(r,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=N(t);var i;await(i=0,new Promise((t=>setTimeout(t,i))));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(a=r.url,new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var a;const c=await this.M(e);if(!c)return!1;const{cacheName:o,matchOptions:h}=this.P,u=await self.caches.open(o),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=L(e.url,s);if(e.url===i)return t.match(e,n);const r=x({},n,{ignoreSearch:!0}),a=await t.keys(e,r);for(const e of a)if(i===L(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?c.clone():c)}catch(t){throw"QuotaExceededError"===t.name&&await async function(){for(const t of p)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:o,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){if(!this.T[e]){let s=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))s=N(await t({mode:e,request:s,event:this.event,params:this.params}));this.T[e]=s}return this.T[e]}hasCallback(t){for(const e of this.P.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.P.plugins)if("function"==typeof e[t]){const s=this.W.get(e),n=n=>{const i=x({},n,{state:s});return e[t](i)};yield n}}waitUntil(t){return this.K.push(t),t}async doneWaiting(){let t;for(;t=this.K.shift();)await t}destroy(){this.k.resolve()}async M(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class E{constructor(t={}){this.cacheName=w(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new C(this,{event:e,request:s,params:n}),r=this.A(i,s,e);return[r,this.S(r,i,s,e)]}async A(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this.I(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async S(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){r=t}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}function D(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.1.2"]&&_()}catch(t){}function T(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class P{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class k{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=e&&e.cacheKey||this.j.getCacheKeyForURL(t.url);return s?new Request(s):t},this.j=t}}let K,O;async function W(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},a=e?e(r):r,c=function(){if(void 0===K){const t=new Response("");if("body"in t)try{new Response(t.body),K=!0}catch(t){K=!1}K=!1}return K}()?i.body:await i.blob();return new Response(c,a)}class M extends E{constructor(t={}){t.cacheName=f(t.cacheName),super(t),this.F=!1!==t.fallbackToNetwork,this.plugins.push(M.copyRedirectedCacheableResponsesPlugin)}async I(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.B(t,e):await this.H(t,e))}async H(t,e){let n;if(!this.F)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return n=await e.fetch(t),n}async B(t,e){this.$();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}$(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==M.copyRedirectedCacheableResponsesPlugin&&(n===M.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(M.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}M.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},M.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await W(t):t};class A{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.G=new Map,this.V=new Map,this.J=new Map,this.P=new M({cacheName:f(t),plugins:[...e,new k({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.P}precache(t){this.addToCacheList(t),this.X||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.X=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=T(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.G.has(i)&&this.G.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.G.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.J.has(t)&&this.J.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.J.set(t,n.integrity)}if(this.G.set(i,t),this.V.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return D(t,(async()=>{const e=new P;this.strategy.plugins.push(e);for(const[e,s]of this.G){const n=this.J.get(s),i=this.V.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return D(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.G.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.G}getCachedURLs(){return[...this.G.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.G.get(e.href)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=x({cacheKey:e},s.params),this.strategy.handle(s))}}const S=()=>(O||(O=new A),O);class I extends i{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const t of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const a=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(r,e);if(yield a.href,s&&a.pathname.endsWith("/")){const t=new URL(a.href);t.pathname+=s,yield t.href}if(n){const t=new URL(a.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(t);if(e)return{cacheKey:e}}}),t.strategy)}}t.CacheFirst=class extends E{async I(t,e){let n,i=await e.cacheMatch(t);if(!i)try{i=await e.fetchAndCachePut(t)}catch(t){n=t}if(!i)throw new s("no-response",{url:t.url,error:n});return i}},t.ExpirationPlugin=class{constructor(t={}){var e;this.cachedResponseWillBeUsed=async({event:t,request:e,cacheName:s,cachedResponse:n})=>{if(!n)return null;const i=this.Y(n),r=this.Z(s);d(r.expireEntries());const a=r.updateTimestamp(e.url);if(t)try{t.waitUntil(a)}catch(t){}return i?n:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const s=this.Z(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.tt=t,this.N=t.maxAgeSeconds,this.et=new Map,t.purgeOnQuotaError&&(e=()=>this.deleteCacheAndMetadata(),p.add(e))}Z(t){if(t===w())throw new s("expire-custom-caches-only");let e=this.et.get(t);return e||(e=new q(t,this.tt),this.et.set(t,e)),e}Y(t){if(!this.N)return!0;const e=this.st(t);if(null===e)return!0;return e>=Date.now()-1e3*this.N}st(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),s=new Date(e).getTime();return isNaN(s)?null:s}async deleteCacheAndMetadata(){for(const[t,e]of this.et)await self.caches.delete(t),await e.delete();this.et=new Map}},t.NetworkFirst=class extends E{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(U),this.nt=t.networkTimeoutSeconds||0}async I(t,e){const n=[],i=[];let r;if(this.nt){const{id:s,promise:a}=this.it({request:t,logs:n,handler:e});r=s,i.push(a)}const a=this.rt({timeoutId:r,request:t,logs:n,handler:e});i.push(a);const c=await e.waitUntil((async()=>await e.waitUntil(Promise.race(i))||await a)());if(!c)throw new s("no-response",{url:t.url});return c}it({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.nt)})),id:n}}async rt({timeoutId:t,request:e,logs:s,handler:n}){let i,r;try{r=await n.fetchAndCachePut(e)}catch(t){i=t}return t&&clearTimeout(t),!i&&r||(r=await n.cacheMatch(e)),r}},t.StaleWhileRevalidate=class extends E{constructor(t){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(U)}async I(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));let i,r=await e.cacheMatch(t);if(r);else try{r=await n}catch(t){i=t}if(!r)throw new s("no-response",{url:t.url,error:i});return r}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=f();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.precacheAndRoute=function(t,e){!function(t){S().precache(t)}(t),function(t){const e=S();h(new I(e,t))}(e)},t.registerRoute=h})); 2 | -------------------------------------------------------------------------------- /src/Templates/Home/index.tsx: -------------------------------------------------------------------------------- 1 | import Header from "components/UI/Header"; 2 | import Home from "components/Sections/Home"; 3 | import AboutSection from "components/Sections/About"; 4 | import PortfolioSection from "components/Sections/Portfolio"; 5 | import ContactSection from "components/Sections/Contact"; 6 | import ScrollTop from "components/UI/ScrollTop"; 7 | import Footer from "components/UI/Footer"; 8 | 9 | import { HomePageProps } from "types/types"; 10 | 11 | const HomePage = ({ homepages, projects }: HomePageProps) => { 12 | return ( 13 | <> 14 |
15 | 16 | 17 | 18 | 19 |