Initial commit
This commit is contained in:
1
.env.production
Normal file
1
.env.production
Normal file
@@ -0,0 +1 @@
|
||||
DISABLE_ESLINT_PLUGIN=true
|
||||
62
.gitea/workflows/build.yml
Normal file
62
.gitea/workflows/build.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'Branch to build'
|
||||
required: true
|
||||
default: 'main'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
steps:
|
||||
- name: Checkout branch
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ gitea.event.inputs.branch }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 24
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm install --no-audit --silent 2>&1 | tee install.log
|
||||
env:
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
|
||||
- name: Build (react-scripts build)
|
||||
env:
|
||||
CI: 'false'
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm run build 2>&1 | tee build.log
|
||||
timeout-minutes: 5
|
||||
|
||||
- name: Verify build folder exists
|
||||
run: test -d build || (echo "No build folder. Check build logs above."; exit 1)
|
||||
|
||||
- name: Upload logs on failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: build-logs
|
||||
path: |
|
||||
install.log
|
||||
build.log
|
||||
npm-debug.log*
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Build completed
|
||||
if: success()
|
||||
run: echo "Build completed successfully"
|
||||
41
package.json
Normal file
41
package.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "sargas-website",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-scripts": "^5.0.1",
|
||||
"framer-motion": "^11.0.0",
|
||||
"lucide-react": "^0.400.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tailwindcss": "^3.4.0",
|
||||
"postcss": "^8.4.0",
|
||||
"autoprefixer": "^10.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
1
public/images/Gilroy-Bold-1767011178297.woff
Normal file
1
public/images/Gilroy-Bold-1767011178297.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/Gilroy-BoldItalic-1767011178485.woff
Normal file
1
public/images/Gilroy-BoldItalic-1767011178485.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/Gilroy-Medium-1767011178354.woff
Normal file
1
public/images/Gilroy-Medium-1767011178354.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/Gilroy-Regular-1767011178460.woff
Normal file
1
public/images/Gilroy-Regular-1767011178460.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/Gilroy-RegularItalic-1767011178493.woff
Normal file
1
public/images/Gilroy-RegularItalic-1767011178493.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/Gilroy-SemiBold-1767011178428.woff
Normal file
1
public/images/Gilroy-SemiBold-1767011178428.woff
Normal file
File diff suppressed because one or more lines are too long
1
public/images/alex-1767011178436.jpg
Normal file
1
public/images/alex-1767011178436.jpg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/angular-1767011178230.svg
Normal file
1
public/images/angular-1767011178230.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMjYiIHZpZXdCb3g9IjAgMCAyNSAyNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0wLjQyODcxMSA0LjM1MTE1TDEyLjQ1NDUgMC4wNjY0MDYyTDI0LjgwNDEgNC4yNzQ5NkwyMi44MDQ1IDIwLjE4NTZMMTIuNDU0NSAyNS45MTc3TDIuMjY2MzkgMjAuMjYxOEwwLjQyODcxMSA0LjM1MTE1WiIgZmlsbD0icmVkIi8+CjxwYXRoIGQ9Ik0yNC44MDQyIDQuMjc0OTZMMTIuNDU0NiAwLjA2NjQwNjJWMjUuOTE3N0wyMi44MDQ2IDIwLjE5NTJMMjQuODA0MiA0LjI3NDk2WiIgZmlsbD0icmVkIi8+CjxwYXRoIGQ9Ik0xMi40NzM0IDMuMDg0OTZMNC45Nzk5OCAxOS43NTc0TDcuNzc5MjggMTkuNzA5OEw5LjI4Mzc1IDE1Ljk0ODdIMTYuMDA2TDE3LjY1MzMgMTkuNzU3NEwyMC4zMjg4IDE5LjgwNUwxMi40NzM0IDMuMDg0OTZaTTEyLjQ5MjUgOC40MjY2MkwxNS4wMjUzIDEzLjcyMDZIMTAuMjY0NEwxMi40OTI1IDguNDI2NjJaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjI0LjQ3MTIiIGhlaWdodD0iMjYiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjQxODk0NSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K
|
||||
1
public/images/apple-touch-icon-1767011178495.png
Normal file
1
public/images/apple-touch-icon-1767011178495.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/apple-touch-icon-180x180-1767011178466.png
Normal file
1
public/images/apple-touch-icon-180x180-1767011178466.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/bg-about-1767011178177.svg
Normal file
1
public/images/bg-about-1767011178177.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iOTMzIiBoZWlnaHQ9IjExNzkiIHZpZXdCb3g9IjAgMCA5MzMgMTE3OSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUzMS40MzYgMzAyLjA5NlYxMDgzLjRDNTMxLjQzNiAxMTA0LjU3IDUxNi4wNzcgMTEyMi42MiA0OTUuMTc4IDExMjZMMTgxLjQ3NyAxMTc2Ljc2QzE1NS4yMzYgMTE4MS4wMSAxMzEuNDM0IDExNjAuNzUgMTMxLjQzNCAxMTM0LjE2VjcxNi4xNTVMLTIxOC41MjMgNzcyLjc2MUMtMjQ0Ljc2MyA3NzcuMDA1IC0yNjguNTYzIDc1Ni43NDUgLTI2OC41NjQgNzMwLjE2NEwtMjY4LjU2NiA0MTcuNTgyQy0yNjguNTY3IDM5Ni40MTEgLTI1My4yMDggMzc4LjM2NyAtMjMyLjMwOCAzNzQuOTg1TDQ4MS4zOTMgMjU5LjVNNTMxLjQzNiAzMDIuMDk2QzUzMS40MzYgMjc1LjUxNCA1MDcuNjMzIDI1NS4yNTQgNDgxLjM5MyAyNTkuNU01MzEuNDM2IDMwMi4wOTZMNTMxLjQzOCA0NTguOTM4TDE4MS40NzkgNTE1LjU1OE00ODEuMzkzIDI1OS41TDEzMS40MzYgMzE2LjY1NkwxMzEuNDM2IDQ3Mi45NjFNMTMxLjQzNiA0NzIuOTYxTDEzMS40MzYgMTYwLjMzNEMxMzEuNDM2IDEzOS4xNjIgMTQ2Ljc5NiAxMjEuMTE4IDE2Ny42OTYgMTE3LjczN0w4ODEuMzkgMi4yOTc2NUM5MDcuNjMgLTEuOTQ2NjEgOTMxLjQzMSAxOC4zMTM1IDkzMS40MzEgNDQuODk0Mkw5MzEuNDM0IDM1Ny40NzZDOTMxLjQzNCAzNzguNjQ3IDkxNi4wNzUgMzk2LjY5MSA4OTUuMTc2IDQwMC4wNzNMMTgxLjQ3OSA1MTUuNTU4TTEzMS40MzYgNDcyLjk2MUMxMzEuNDM2IDQ5OS41NDMgMTU1LjIzOSA1MTkuODA0IDE4MS40NzkgNTE1LjU1OCIgc3Ryb2tlPSIjMUUyNTMyIiBzdHJva2Utb3BhY2l0eT0iMC4wNSIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=
|
||||
1
public/images/case-2-1767011179252.png
Normal file
1
public/images/case-2-1767011179252.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/case-4-1767011179030.png
Normal file
1
public/images/case-4-1767011179030.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/case-5-1767011179450.png
Normal file
1
public/images/case-5-1767011179450.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/case-location-1767011178427.svg
Normal file
1
public/images/case-location-1767011178427.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTkiIHZpZXdCb3g9IjAgMCAxNCAxOSIgZmlsbD0id2hpdGUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cgk8cGF0aCBkPSJNNi45OTk4OCAwLjcxMDkzOEMzLjQwNTMyIDAuNzEwOTM4IDAuNDgwOTU3IDMuNjM1MyAwLjQ4MDk1NyA3LjIyOTgyQzAuNDgwOTU3IDExLjY5MDcgNi4zMTQ3NSAxOC4yMzk2IDYuNTYzMTMgMTguNTE2MkM2Ljc5NjQzIDE4Ljc3NiA3LjIwMzc1IDE4Ljc3NTYgNy40MzY2MiAxOC41MTYyQzcuNjg1IDE4LjIzOTYgMTMuNTE4OCAxMS42OTA3IDEzLjUxODggNy4yMjk4MkMxMy41MTg3IDMuNjM1MyAxMC41OTQ0IDAuNzEwOTM4IDYuOTk5ODggMC43MTA5MzhaTTYuOTk5ODggMTAuNTA5N0M1LjE5MTM3IDEwLjUwOTcgMy43MjAwOCA5LjAzODMzIDMuNzIwMDggNy4yMjk4MkMzLjcyMDA4IDUuNDIxMzEgNS4xOTE0IDMuOTUwMDIgNi45OTk4OCAzLjk1MDAyQzguODA4MzUgMy45NTAwMiAxMC4yNzk2IDUuNDIxMzUgMTAuMjc5NiA3LjIyOTg2QzEwLjI3OTYgOS4wMzgzNiA4LjgwODM1IDEwLjUwOTcgNi45OTk4OCAxMC41MDk3WiIvPgo8L3N2Zz4=
|
||||
1
public/images/case-topic-1767011178451.svg
Normal file
1
public/images/case-topic-1767011178451.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTkiIHZpZXdCb3g9IjAgMCAxOCAxOSIgZmlsbD0id2hpdGUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cgk8cGF0aCBkPSJNMTEuMjUgNS41ODU5NEMxMC44MzYgNS41ODU5NCAxMC41IDUuMjQ5OTQgMTAuNSA0LjgzNTk0VjMuNzEwOTRINy41VjQuODM1OTRDNy41IDUuMjQ5OTQgNy4xNjQgNS41ODU5NCA2Ljc1IDUuNTg1OTRDNi4zMzYgNS41ODU5NCA2IDUuMjQ5OTQgNiA0LjgzNTk0VjMuNzEwOTRDNiAyLjg4MzY5IDYuNjcyNzUgMi4yMTA5NCA3LjUgMi4yMTA5NEgxMC41QzExLjMyNzIgMi4yMTA5NCAxMiAyLjg4MzY5IDEyIDMuNzEwOTRWNC44MzU5NEMxMiA1LjI0OTk0IDExLjY2NCA1LjU4NTk0IDExLjI1IDUuNTg1OTRaIi8+Cgk8cGF0aCBkPSJNOS41MzI1IDEyLjI0NThDOS4zOTc1IDEyLjI5ODMgOS4yMDI1IDEyLjMzNTggOSAxMi4zMzU4QzguNzk3NSAxMi4zMzU4IDguNjAyNSAxMi4yOTgzIDguNDIyNSAxMi4yMzA4TDAgOS40MjU3OFYxNS4xNDgzQzAgMTYuMjg4MyAwLjkyMjUgMTcuMjEwOCAyLjA2MjUgMTcuMjEwOEgxNS45Mzc1QzE3LjA3NzUgMTcuMjEwOCAxOCAxNi4yODgzIDE4IDE1LjE0ODNWOS40MjU3OEw5LjUzMjUgMTIuMjQ1OFoiLz4KCTxwYXRoIGQ9Ik0xOCA2LjUyMzQ0VjguMjQwOTRMOS4xOCAxMS4xODA5QzkuMTIgMTEuMjAzNCA5LjA2IDExLjIxMDkgOSAxMS4yMTA5QzguOTQgMTEuMjEwOSA4Ljg4IDExLjIwMzQgOC44MiAxMS4xODA5TDAgOC4yNDA5NFY2LjUyMzQ0QzAgNS4zODM0NCAwLjkyMjUgNC40NjA5NCAyLjA2MjUgNC40NjA5NEgxNS45Mzc1QzE3LjA3NzUgNC40NjA5NCAxOCA1LjM4MzQ0IDE4IDYuNTIzNDRaIi8+Cjwvc3ZnPg==
|
||||
1
public/images/cristopher-1767011179267.png
Normal file
1
public/images/cristopher-1767011179267.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/css-1767011178462.svg
Normal file
1
public/images/css-1767011178462.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjciIHZpZXdCb3g9IjAgMCAyNCAyNyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuNjgzNTk0IDAuNjY4OTQ1TDIuNzU1NDcgMjQuMDY4OUwxMi4wNTg2IDI2LjY2ODlMMjEuMzU4NSAyNC4wNzA2TDIzLjQzMzYgMC42Njg5NDVIMC42ODM1OTRaIiBmaWxsPSIjMDA3MGI3Ii8+CjxwYXRoIGQ9Ik0xOS4wMDQyIDguMzIwMjdMMTguNzQyNiAxMS4yNTk5TDE3Ljk1MjggMjAuMDcyM0wxMi4wNTg5IDIxLjcwMjJMMTIuMDU0MSAyMS43MDM4TDYuMTYzNDMgMjAuMDcyM0w1Ljc1MjMxIDE1LjQ2MzhIOC42MzgzMUw4Ljg1MjgxIDE3Ljg1NDFMMTIuMDU1NyAxOC43MTg2TDEyLjA1NzMgMTguNzE3TDE1LjI2NTEgMTcuODUyNUwxNS43MDIyIDEzLjg2OTZMNS42MTQxOCAxMy44OTczTDUuMzI4MTggMTEuMTczOEwxNS45NDQzIDExLjA0ODZMMTYuMTU4OCA4LjEzMzRMNS4wNDM4MSA4LjE2NDI3TDQuODU2OTMgNS40NTIxNUgxMi4wNTg5SDE5LjI2MDlMMTkuMDA0MiA4LjMyMDI3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==
|
||||
1
public/images/ecommerce-1767011178226.svg
Normal file
1
public/images/ecommerce-1767011178226.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjciIGhlaWdodD0iMjYiIHZpZXdCb3g9IjAgMCAyNyAyNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxnIG9wYWNpdHk9IjAuMiI+CjxwYXRoIGQ9Ik0yMC42NjQ4IDE5LjMxOThDMTkuMDAwOSAxOS4zMTk4IDE3LjYyODkgMjAuNjYyNiAxNy42Mjg5IDIyLjM1NTdDMTcuNjI4OSAyNC4wMTk2IDE4Ljk3MTcgMjUuMzkxNiAyMC42NjQ4IDI1LjM5MTZDMjIuMzI4NyAyNS4zOTE2IDIzLjcwMDcgMjQuMDQ4OCAyMy43MDA3IDIyLjM1NTdDMjMuNjcxNSAyMC42OTE4IDIyLjMyODcgMTkuMzE5OCAyMC42NjQ4IDE5LjMxOThaIiBmaWxsPSIjZjg3YjAwIi8+CjwvZz4KPGcgb3BhY2l0eT0iMC40Ij4KPHBhdGggZD0iTTI2LjAwNjkgNC44NDExMUMyNS45NDg1IDQuODQxMTEgMjUuODYxIDQuODExOTIgMjUuNzczNCA0LjgxMTkySDcuMzgyOTlMNy4wOTEwNyAyLjg1NjEyQzYuOTE1OTMgMS41NzE3MSA1LjgwNjY2IDAuNjA4Mzk4IDQuNDkzMDYgMC42MDgzOThIMi4xMjg1OEMxLjQ4NjM4IDAuNjA4Mzk4IDAuOTYwOTM4IDEuMTMzODQgMC45NjA5MzggMS43NzYwNEMwLjk2MDkzOCAyLjQxODI1IDEuNDg2MzggMi45NDM2OSAyLjEyODU4IDIuOTQzNjlINC40OTMwNkM0LjYzOTAyIDIuOTQzNjkgNC43NTU3OCAzLjA2MDQ1IDQuNzg0OTcgMy4yMDY0MUw2LjU5NDgyIDE1LjUyNTFDNi44MjgzNSAxNy4wNzIyIDguMTcxMTUgMTguMjM5OCA5Ljc0NzQ3IDE4LjIzOThIMjEuODkxQzIzLjQwODkgMTguMjM5OCAyNC43MjI1IDE3LjE1OTggMjUuMDQzNiAxNS42NzFMMjYuOTQxIDYuMTgzOUMyNy4wNTc4IDUuNTcwODkgMjYuNjQ5MSA0Ljk1Nzg4IDI2LjAwNjkgNC44NDExMVoiIGZpbGw9IiNmODdiMDAiLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjIiPgo8cGF0aCBkPSJNMTMuMjIxNyAyMi4yMDk3QzEzLjE2MzMgMjAuNjA0MiAxMS44MjA1IDE5LjMxOTggMTAuMjE1IDE5LjMxOThDOC41MjE4OSAxOS40MDc0IDcuMjM3NDggMjAuODA4NiA3LjI5NTg2IDIyLjQ3MjVDNy4zNTQyNCAyNC4wNzggOC42Njc4NCAyNS4zNjI0IDEwLjI3MzQgMjUuMzYyNEgxMC4zMzE3QzExLjk5NTYgMjUuMjc0OCAxMy4zMDkyIDIzLjg3MzYgMTMuMjIxNyAyMi4yMDk3WiIgZmlsbD0iI2Y4N2IwMCIvPgo8L2c+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjk2MDkzOCkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K
|
||||
1
public/images/flutter-1767011178103.svg
Normal file
1
public/images/flutter-1767011178103.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9Ii0zMC41IDAgMzE3IDMxNyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjMuOTUxNzA4OCUiIHkxPSIyNi45OTMwMjg3JSIgeDI9Ijc1Ljg5NzA3MzQlIiB5Mj0iNTIuOTE5MjY1NyUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgb2Zmc2V0PSIwJSI+Cg08L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj4KDTwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgoJCTxnPgoJCQkJPHBvbHlnb24gZmlsbD0iIzQ3QzVGQiIgcG9pbnRzPSIxNTcuNjY1Nzg1IDAuMDAwNTQ5MzU2MjIzIDAuMDAwNTQ5MzU2MjIzIDE1Ny42NjU3ODUgNDguODAwOTYxNCAyMDYuNDY2MTk3IDI1NS4yNjc3MDggMC4wMDA1NDkzNTYyMjMiPgoNPC9wb2x5Z29uPgoJCQkJPHBvbHlnb24gZmlsbD0iIzQ3QzVGQiIgcG9pbnRzPSIxNTYuNTY3MTgzIDE0NS4zOTY3OTMgNzIuMTQ4NzEwNyAyMjkuODE1MjY1IDEyMS4xMzI2MDggMjc5LjUzMDkwNSAxNjkuODQyOTI1IDIzMC44MjA1ODcgMjU1LjI2NzgxOCAxNDUuMzk2NzkzIj4KDTwvcG9seWdvbj4KCQkJCTxwb2x5Z29uIGZpbGw9IiMwMDU2OUUiIHBvaW50cz0iMTIxLjEzMzA0NyAyNzkuNTMxMTI0IDE1OC4yMTQ1OTIgMzE2LjYxMjY3IDI1NS4yNjcxNTkgMzE2LjYxMjY3IDE2OS44NDIyNjYgMjMwLjgyMDgwNyI+Cg08L3BvbHlnb24+CgkJCQk8cG9seWdvbiBmaWxsPSIjMDBCNUY4IiBwb2ludHM9IjcxLjU5OTU3NDIgMjMwLjM2NDA3MiAxMjAuNDAxMDg1IDE4MS41NjI1NjEgMTY5Ljg0MjA0NiAyMzAuODIxMTM2IDEyMS4xMzI4MjcgMjc5LjUzMTQ1NCI+Cg08L3BvbHlnb24+CgkJCQk8cG9seWdvbiBmaWxsLW9wYWNpdHk9IjAuOCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xKSIgcG9pbnRzPSIxMjEuMTMyODI3IDI3OS41MzE0NTQgMTYxLjY5Mjg5NiAyNjYuMDcyMjI3IDE2NS43MjE4NzUgMjM0Ljk0MTMwOCI+Cg08L3BvbHlnb24+CgkJPC9nPgo8L3N2Zz4=
|
||||
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iNjQyIiBoZWlnaHQ9IjcxOCIgdmlld0JveD0iMCAwIDY0MiA3MTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02MTEuNDEyIDAuNjk0MzM2SDMxLjQxODdDMTQuODY2NCAwLjY5NDMzNiAxLjQ0MTc2IDE0LjEwMDMgMS40MTg2OCAzMC42NTI1TDAuNTAyMzMzIDY4Ny45MjFDMC40NzkyMTEgNzA0LjUwNiAxMy45MTc0IDcxNy45NjMgMzAuNTAyMyA3MTcuOTYzSDUxOS41NjZDNTI2LjU2MyA3MTcuOTYzIDUzMy4zNCA3MTUuNTE3IDUzOC43MjUgNzExLjA0OUw2MjkuNjQxIDYzNS42QzYzNi40OTYgNjI5LjkxMSA2NDAuNDY5IDYyMS40NyA2NDAuNDgzIDYxMi41NjJMNjQxLjQxMiAzMC43NDIzQzY0MS40MzkgMTQuMTU1IDYyOCAwLjY5NDMzNiA2MTEuNDEyIDAuNjk0MzM2WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==
|
||||
1
public/images/html5-1767011178106.svg
Normal file
1
public/images/html5-1767011178106.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjciIGhlaWdodD0iMjciIHZpZXdCb3g9IjAgMCAyNyAyNyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0yLjYyNTU0IDAuNTM1MTU2QzIuMzg2NTYgMC41MzUxNTYgMi4yMDg1MiAwLjcyOTkwMyAyLjIyOTc0IDAuOTY3ODY2TDQuMjQ0MyAyMy41NjQ1QzQuMjY1NTMgMjMuODAyNSA0LjQ3MTE5IDI0LjA0OTYgNC43MDE1NCAyNC4xMTM1TDEzLjI1MDMgMjYuNDg3MkMxMy40ODA2IDI2LjU1MTEgMTMuODU3MyAyNi41NTExIDE0LjA4NzcgMjYuNDg3M0wyMi42NjI1IDI0LjEwOThDMjIuODkyOCAyNC4wNDU5IDIzLjA5ODcgMjMuNzk4OSAyMy4xMTk4IDIzLjU2MDlMMjUuMTM3OCAwLjk2Nzg2NkMyNS4xNTkxIDAuNzI5OTAzIDI0Ljk4MDkgMC41MzUxNTYgMjQuNzQxOSAwLjUzNTE1NkgyLjYyNTU0Wk0yMC44NDc1IDUuNzE3NjJDMjAuODI4NCA1LjkyOTg4IDIwLjc5NTUgNi4yOTg0MSAyMC43NzQzIDYuNTM2NDJMMjAuNzIxMiA3LjEyOTI5QzIwLjY5OTkgNy4zNjcyIDIwLjY2OTQgNy43MDc0OSAyMC42NTM0IDcuODg1MzhDMjAuNjM3NCA4LjA2MzMyIDIwLjYyMjIgOC4yMDg5MSAyMC42MTk0IDguMjA4OTFDMjAuNjE2NyA4LjIwODkxIDIwLjQxODkgOC4yMDg5MSAyMC4xOCA4LjIwODkxSDE0LjExODJDMTMuODc5MiA4LjIwODkxIDEzLjY4MTcgOC4yMDg5MSAxMy42NzkyIDguMjA4OTFDMTMuNjc2NiA4LjIwODkxIDEzLjQ3ODkgOC4yMDg5MSAxMy4yMzk5IDguMjA4OTFIMTAuMDQ3NEM5LjgwODM4IDguMjA4OTEgOS42MzAzNCA4LjQwMzY2IDkuNjUxNTcgOC42NDE2Mkw5LjgzNzc4IDEwLjcyMzJDOS44NTkwMSAxMC45NjExIDEwLjA3MiAxMS4xNTU5IDEwLjMxMDkgMTEuMTU1OUgxMy4yMzk5QzEzLjQ3ODkgMTEuMTU1OSAxMy42NzY2IDExLjE1NTkgMTMuNjc5MiAxMS4xNTU5QzEzLjY4MTggMTEuMTU1OSAxMy44NzkzIDExLjE1NTkgMTQuMTE4MyAxMS4xNTU5SDE5LjE1MjhDMTkuMzkxOCAxMS4xNTU5IDE5Ljc2MTYgMTEuMTU1OSAxOS45NzQ2IDExLjE1NTlDMjAuMTg3NCAxMS4xNTU5IDIwLjM0NTkgMTEuMzI5NiAyMC4zMjY2IDExLjU0MTlDMjAuMzA3MiAxMS43NTQxIDIwLjI3NDEgMTIuMTIyNyAyMC4yNTI5IDEyLjM2MDdMMTkuNjU0MiAxOS4wNzE0QzE5LjYzMjggMTkuMzA5NSAxOS42MDU4IDE5LjYxMzUgMTkuNTk0MSAxOS43NDcxQzE5LjU4MjMgMTkuODgwNyAxOS4zODQyIDIwLjA0MjIgMTkuMTUzOSAyMC4xMDYxTDE0LjEwMjUgMjEuNTA2OEMxMy44NzIyIDIxLjU3MDUgMTMuNjgwOSAyMS42MjM0IDEzLjY3NzMgMjEuNjI0MkMxMy42NzM3IDIxLjYyNDkgMTMuNDgyNSAyMS41NzMyIDEzLjI1MjEgMjEuNTA5NEw4LjE5NTI2IDIwLjEwNjJDNy45NjQ5NiAyMC4wNDIzIDcuNzU5MTkgMTkuNzk1MyA3LjczODAyIDE5LjU1NzNMNy40MTI1MSAxNS45MDM4QzcuMzkxMjggMTUuNjY1OCA3LjU2OTUzIDE1LjQ3MTEgNy44MDg1IDE1LjQ3MTFIOC4yNzAwMUM4LjUwODk4IDE1LjQ3MTEgOC45IDE1LjQ3MTEgOS4xMzg5MyAxNS40NzExSDkuODI3MTJDMTAuMDY2MSAxNS40NzExIDEwLjI3ODkgMTUuNjY1OCAxMC4zMDAzIDE1LjkwMzhMMTAuNDI3OSAxNy4zMzRDMTAuNDQ5MSAxNy41NzIxIDEwLjY1NTIgMTcuODE3NyAxMC44ODU5IDE3Ljg4TDEzLjI1MTMgMTguNTE4OEMxMy40ODE5IDE4LjU4MTEgMTMuNjcxNSAxOC42MzIxIDEzLjY3MjYgMTguNjMyMUMxMy42NzM2IDE4LjYzMjEgMTMuODYzMSAxOC41ODEgMTQuMDkzOCAxOC41MTg3TDE2LjQ2MzUgMTcuODc4NEMxNi42OTQxIDE3LjgxNjEgMTYuOTAwMyAxNy41NzAzIDE2LjkyMTcgMTcuMzMyNEwxNy4xNzg2IDE0LjQ2N0MxNy4yIDE0LjIyOSAxNy4wMjE5IDE0LjAzNDIgMTYuNzgzIDE0LjAzNDJIMTQuMTE4M0MxMy44NzkzIDE0LjAzNDIgMTMuNjgxOCAxNC4wMzQyIDEzLjY3OTIgMTQuMDM0MkMxMy42NzY2IDE0LjAzNDIgMTMuNDc4OSAxNC4wMzQyIDEzLjIzOTkgMTQuMDM0Mkg3LjY3OTY3QzcuNDQwNjkgMTQuMDM0MiA3LjIyNzkyIDEzLjgzOTQgNy4yMDY2OSAxMy42MDE1TDYuNTc2MTkgNi41MzY0N0M2LjU1NDk2IDYuMjk4NDYgNi41MjIwNSA1LjkzMDA0IDYuNTAzMDEgNS43MTc2N0M2LjQ4NDE3IDUuNTA1NCA2LjY2NDA5IDUuMzMxNjggNi45MDMwNyA1LjMzMTY4SDEzLjIzOTlDMTMuNDc4OSA1LjMzMTY4IDEzLjY3NjYgNS4zMzE2OCAxMy42NzkyIDUuMzMxNjhDMTMuNjgxOCA1LjMzMTY4IDEzLjg3OTMgNS4zMzE2OCAxNC4xMTgzIDUuMzMxNjhIMjAuNDQ3NUMyMC42ODY0IDUuMzMxNTcgMjAuODY2NCA1LjUwNTI1IDIwLjg0NzUgNS43MTc2MloiIGZpbGw9IiNkYzRhMjUiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuNjgzNTk0IDAuNTM1MTU2KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=
|
||||
1
public/images/icon-currency-exchange-1767011178239.png
Normal file
1
public/images/icon-currency-exchange-1767011178239.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-eco-1767011178224.png
Normal file
1
public/images/icon-eco-1767011178224.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-option-1767011178419.png
Normal file
1
public/images/icon-option-1767011178419.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-personalization-1767011178274.png
Normal file
1
public/images/icon-personalization-1767011178274.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-phone-battery-1767011178236.png
Normal file
1
public/images/icon-phone-battery-1767011178236.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-rating-1767011178137.png
Normal file
1
public/images/icon-rating-1767011178137.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-robotic-hand-1767011178147.png
Normal file
1
public/images/icon-robotic-hand-1767011178147.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/icon-training-1767011178147.png
Normal file
1
public/images/icon-training-1767011178147.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/illia-1767011178842.png
Normal file
1
public/images/illia-1767011178842.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/imran-1767011178791.jpg
Normal file
1
public/images/imran-1767011178791.jpg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/javascript-1767011178113.svg
Normal file
1
public/images/javascript-1767011178113.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjciIHZpZXdCb3g9IjAgMCAyNCAyNyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIuODA3MTQgMjQuMDQ1N0wwLjY4MzU5NCAwLjY2ODk0NUwyMy41NjA3IDAuNjc3ODY4TDIxLjQ1NSAyNC4wMjc5TDEyLjEwNDMgMjYuNjY4OUwyLjgwNzE0IDI0LjA0NTdaTTE5LjczMyAyMi43Njk4TDIxLjUwODYgMi43NDc4N0gxMi4xNEwxMi4yMTE0IDI0LjgzMDlMMTkuNzMzIDIyLjc2OThaTTExLjI2NTYgNS42ODMzNkg4Ljk5MDM5TDguOTYzNjIgMTcuNjY2Mkw0LjU0NzAxIDE2LjQ2MTdMNC41NTU5MyAxOS4yMDA5TDExLjI2NTYgMjEuMDEyMVY1LjY4MzM2WiIgZmlsbD0iI2QzYjMyYyIvPgo8cGF0aCBvcGFjaXR5PSIwLjk4NiIgZD0iTTEwLjUxNjIgMjAuNzg4M0MxMC4yMjE3IDIwLjY5OTEgOC43NjczNyAyMC4zMDY1IDcuMjg2MjQgMTkuOTA1TDQuNjAwNTkgMTkuMTgyM1YxNy44MzVDNC42MDA1OSAxNi41MTQ1IDQuNjAwNTkgMTYuNDg3NyA0LjczNDQyIDE2LjUzMjNDNC44MDU4IDE2LjU1OTEgNS43ODcyNyAxNi44MjY3IDYuOTExNSAxNy4xMzlMOC45NTQ3NCAxNy43MDExTDguOTcyNTggMTEuNzIzMUw4Ljk5MDQzIDUuNzQ1MTJIMTEuMjIxVjEzLjM0N0MxMS4yMjEgMTkuMzg3NSAxMS4yMDMyIDIwLjk0ODkgMTEuMTQwNyAyMC45NDg5QzExLjA5NjEgMjAuOTQgMTAuODEwNiAyMC44Njg2IDEwLjUxNjIgMjAuNzg4M1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIuMTQwMSAyLjczOTI2SDIxLjUwODdMMTkuNzMzMSAyMi43NjEyTDEyLjE0MDEgMjQuODIyM1YyLjczOTI2Wk0xOS44NjcgMTEuOTIwNUwxOS4yNTEzIDE5LjQwNjRMMTMuMDg1OSAyMS4wMTI0TDEzLjA0MTMgMTguM0wxNy41MDI1IDE3LjExMzNMMTcuNTY1IDE0LjkwMDVMMTMuMTM5NSAxNS42NTlMMTMuMDQxMyA1LjcxOTM1TDIwLjM2NjYgNS42ODM2NkwyMC4xNzAzIDguNDEzOTNMMTUuMzE2NSA4LjQzMTc4VjEyLjQyOUwxOS44NjcgMTEuOTIwNVoiIGZpbGw9IiNmN2QxMzgiLz4KPHBhdGggZD0iTTE5LjI1MTMgMTkuNDA2NEwxOS44NjcgMTEuOTIwNUwxNS4zMTY1IDEyLjQyOVY4LjQzMTc4TDIwLjE3MDMgOC40MTM5M0wyMC4zNjY2IDUuNjgzNjZMMTMuMDQxMyA1LjcxOTM1TDEzLjEzOTUgMTUuNjU5TDE3LjU2NSAxNC45MDA1TDE3LjUwMjUgMTcuMTEzM0wxMy4wNDEzIDE4LjNMMTMuMDg1OSAyMS4wMTI0TDE5LjI1MTMgMTkuNDA2NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=
|
||||
1
public/images/kristina-1767011178219.jpg
Normal file
1
public/images/kristina-1767011178219.jpg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/ksenia-1767011178967.png
Normal file
1
public/images/ksenia-1767011178967.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/laravel-1767011178106.svg
Normal file
1
public/images/laravel-1767011178106.svg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/list-box-1767011178481.svg
Normal file
1
public/images/list-box-1767011178481.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMjMiIHZpZXdCb3g9IjAgMCAyMyAyMyIgZmlsbD0iIzFFMjUzMiIgZmlsbC1vcGFjaXR5PSIuMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0xMC4xMzk2IDExLjU5OTVMMy4xMTQ2NCA3Ljc4MTY1QzIuODAyMTYgNy42MTE5MiAyLjQzMzE2IDcuNjE4OTMgMi4xMjczOSA3LjgwMDY5QzEuODIxNjIgNy45ODI0MiAxLjYzOTE2IDguMzAzMjggMS42MzkxNiA4LjY1OVYxNy41MTU1QzEuNjM5MTYgMTcuODczOCAxLjgzMjY2IDE4LjIwNjQgMi4xNDQxOSAxOC4zODM2TDkuMTY5MjUgMjIuMzc3M0M5LjMyNDExIDIyLjQ2NTMgOS40OTM0NiAyMi41MDkzIDkuNjYyODUgMjIuNTA5M0M5LjgzNTQ3IDIyLjUwOTMgMTAuMDA4IDIyLjQ2MzYgMTAuMTY1IDIyLjM3MjNDMTAuNDc1OCAyMi4xOTE0IDEwLjY2MTMgMjEuODY4OCAxMC42NjEzIDIxLjUwOTFWMTIuNDc2OEMxMC42NjEzIDEyLjExMDYgMTAuNDYxNSAxMS43NzQ0IDEwLjEzOTYgMTEuNTk5NVoiLz4KCTxwYXRoIGQ9Ik0xOS45OTQ1IDUuNDc3NDhDMTkuOTk0MSA1LjEwMzU0IDE5Ljc4NzUgNC43NjQzNyAxOS40NTU2IDQuNTkyMzJMMTEuNzk1MSAwLjYyMDg1MkMxMS41MDUxIDAuNDcwNDE3IDExLjE1OTQgMC40NzE1MzQgMTAuODcwNCAwLjYyMzY0NkwzLjMyMjU5IDQuNTk1MTFDMi45OTM5NiA0Ljc2ODExIDIuNzg5NTQgNS4xMDYyNSAyLjc4OTA2IDUuNDc3NjVDMi43ODg2MyA1Ljg0ODk3IDIuOTkyMjQgNi4xODc1OCAzLjMyMDQgNi4zNjEzMUwxMC44NjgyIDEwLjM1NzZDMTEuMDE0NCAxMC40MzQ5IDExLjE3NDggMTAuNDczNiAxMS4zMzU0IDEwLjQ3MzZDMTEuNDkzOSAxMC40NzM2IDExLjY1MjUgMTAuNDM1OCAxMS43OTcyIDEwLjM2MDNMMTkuNDU3OCA2LjM2NDE1QzE5Ljc4OTQgNi4xOTExOSAxOS45OTUxIDUuODUxNDIgMTkuOTk0NSA1LjQ3NzQ4WiIvPgoJPHBhdGggZD0iTTIwLjc4MSA3Ljc5OTc5QzIwLjQ3NTQgNy42MTgwMiAyMC4xMDYyIDcuNjEwODQgMTkuNzkzOSA3Ljc4MDcxTDEyLjc2ODcgMTEuNTk4NkMxMi40NDY5IDExLjc3MzUgMTIuMjQ3MSAxMi4xMDk2IDEyLjI0NzEgMTIuNDc1OVYyMS41MDgyQzEyLjI0NzEgMjEuODY3OCAxMi40MzI2IDIyLjE5MDUgMTIuNzQzNCAyMi4zNzEzQzEyLjkwMDQgMjIuNDYyNiAxMy4wNzI5IDIyLjUwODMgMTMuMjQ1NSAyMi41MDgzQzEzLjQxNDkgMjIuNTA4MyAxMy41ODQzIDIyLjQ2NDMgMTMuNzM5MSAyMi4zNzYzTDIwLjc2NDIgMTguMzgyNkMyMS4wNzU4IDE4LjIwNTUgMjEuMjY5MiAxNy44NzI4IDIxLjI2OTIgMTcuNTE0NVY4LjY1ODA5QzIxLjI2OTIgOC4zMDIzOCAyMS4wODY4IDcuOTgxNTIgMjAuNzgxIDcuNzk5NzlaIi8+Cjwvc3ZnPg==
|
||||
1
public/images/logo-1767011178066.png
Normal file
1
public/images/logo-1767011178066.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/menu-about-1767011178282.svg
Normal file
1
public/images/menu-about-1767011178282.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNSAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTguMDE2NiAwQzQuMTcxOCAwIDAuOTg5MjU4IDMuMTI3ODUgMC45ODkyNTggNi45NzI2NkMwLjk4OTI1OCAxMC44MTc1IDQuMTcxOCAxNCA4LjAxNjYgMTRDMTEuODYxNCAxNCAxNC45ODkzIDEwLjgxNzUgMTQuOTg5MyA2Ljk3MjY2QzE0Ljk4OTMgMy4xMjc4NSAxMS44NjE0IDAgOC4wMTY2IDBaTTguODM2OTEgMTAuNzE4OEM4LjgzNjkxIDExLjE3MSA4LjQ2ODU5IDExLjUzOTEgOC4wMTY2IDExLjUzOTFDNy41NjQzNCAxMS41MzkxIDcuMTk2MjkgMTEuMTcxIDcuMTk2MjkgMTAuNzE4OFY2LjU2MjVDNy4xOTYyOSA2LjExMDIzIDcuNTY0MzQgNS43NDIxOSA4LjAxNjYgNS43NDIxOUM4LjQ2ODU5IDUuNzQyMTkgOC44MzY5MSA2LjExMDIzIDguODM2OTEgNi41NjI1VjEwLjcxODhaTTguMDE2NiA0LjEwMTU2QzcuNTY0MzQgNC4xMDE1NiA3LjE5NjI5IDMuNzMzNTIgNy4xOTYyOSAzLjI4MTI1QzcuMTk2MjkgMi44Mjg5OCA3LjU2NDM0IDIuNDYwOTQgOC4wMTY2IDIuNDYwOTRDOC40Njg1OSAyLjQ2MDk0IDguODM2OTEgMi44Mjg5OCA4LjgzNjkxIDMuMjgxMjVDOC44MzY5MSAzLjczMzUyIDguNDY4NTkgNC4xMDE1NiA4LjAxNjYgNC4xMDE1NloiIGZpbGw9IiMxRTI1MzIiLz4KPC9zdmc+Cg==
|
||||
1
public/images/menu-contacts-1767011178367.svg
Normal file
1
public/images/menu-contacts-1767011178367.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNSAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik02LjE4NzczIDAuNDM3OTg4QzMuMDUxODIgMC40Mzc5ODggMC41MDAzOSAyLjU5NjU1IDAuNTAwMzkgNS4yNTAzNkMwLjUwMDM5IDYuMzM4ODMgMC45MjkxMjggNy4zODA5MiAxLjcxNjYxIDguMjI3OUwwLjYyODEzNiA5LjMxNjM3QzAuNTAzMDE0IDkuNDQxNDkgMC40NjUzOSA5LjYyOTYxIDAuNTMzNjM5IDkuNzkzMjNDMC42MDEwMTIgOS45NTU5OCAwLjc2MTEzMiAxMC4wNjI3IDAuOTM3ODc4IDEwLjA2MjdINi4xODc3M0M5LjMyMzY1IDEwLjA2MjcgMTEuODc1MSA3LjkwNDE2IDExLjg3NTEgNS4yNTAzNkMxMS44NzUxIDIuNTk2NTUgOS4zMjM2NSAwLjQzNzk4OCA2LjE4NzczIDAuNDM3OTg4WiIgZmlsbD0iIzFFMjUzMiIvPgo8cGF0aCBkPSJNMTMuMjgzMiAxMS43Mjc1QzE0LjA3MDYgMTAuODgxNCAxNC40OTk0IDkuODM4NDMgMTQuNDk5NCA4Ljc0OTk2QzE0LjQ5OTQgNy4zODg1IDEzLjgyNDggNi4xNjAwMyAxMi43NDc3IDUuMjg0MThDMTIuNzI1OCA4LjQwNDM0IDkuNzkyODkgMTAuOTM3NCA2LjE4NzExIDEwLjkzNzRIMy43NTI5M0M0LjY5NjE1IDEyLjQ5MzEgNi42MDc5OCAxMy41NjIzIDguODEyMDQgMTMuNTYyM0gxNC4wNjE5QzE0LjIzODYgMTMuNTYyMyAxNC4zOTg4IDEzLjQ1NTYgMTQuNDY2MSAxMy4yOTJDMTQuNTMzNSAxMy4xMjgzIDE0LjQ5NTkgMTIuOTQwMiAxNC4zNzE2IDEyLjgxNTFMMTMuMjgzMiAxMS43Mjc1WiIgZmlsbD0iIzFFMjUzMiIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC41KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=
|
||||
1
public/images/menu-portfolio-1767011178240.svg
Normal file
1
public/images/menu-portfolio-1767011178240.svg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/mongodb-1767011178112.svg
Normal file
1
public/images/mongodb-1767011178112.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyBoZWlnaHQ9IjI1MDAiIHZpZXdCb3g9IjguNzM4IC0uMDM2IDE0LjUxNyAzMi4wMzgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0xNS45LjA4Ny44NTQgMS42MDRjLjE5Mi4yOTYuNC41NTguNjQ1LjgwMmEyMi40MDYgMjIuNDA2IDAgMCAxIDIuMDA0IDIuMjY2YzEuNDQ3IDEuOSAyLjQyMyA0LjAxIDMuMTIgNi4yOTIuNDE4IDEuMzk0LjY0NSAyLjgyNC42NjIgNC4yNy4wNyA0LjMyMy0xLjQxMiA4LjAzNS00LjQgMTEuMTJhMTIuNyAxMi43IDAgMCAxIC0xLjU3IDEuMzQyYy0uMjk2IDAtLjQzNi0uMjI3LS41NTgtLjQzNmEzLjU4OSAzLjU4OSAwIDAgMSAtLjQzNi0xLjI1NWMtLjEwNS0uNTIzLS4xNzQtMS4wNDYtLjE0LTEuNTg2di0uMjQ0Yy0uMDI0LS4wNTItLjI4NS0yNC4wNTItLjE4MS0yNC4xNzV6IiBmaWxsPSIjNTk5NjM2Ii8+PHBhdGggZD0ibTE1LjkuMDM0Yy0uMDM1LS4wNy0uMDctLjAxNy0uMTA1LjAxNy4wMTcuMzUtLjEwNS42NjItLjI5Ni45Ni0uMjEuMjk2LS40ODguNTIzLS43NjcuNzY3LTEuNTUgMS4zNDItMi43NyAyLjk2My0zLjc0NyA0Ljc3Ni0xLjMgMi40NC0xLjk3IDUuMDU1LTIuMTYgNy44MDgtLjA4Ny45OTMuMzE0IDQuNDk3LjYyNyA1LjUwOC44NTQgMi42ODQgMi4zODggNC45MzMgNC4zNzUgNi44ODUuNDg4LjQ3IDEuMDEuOTA2IDEuNTUgMS4zMjUuMTU3IDAgLjE3NC0uMTQuMjEtLjI0NGE0Ljc4IDQuNzggMCAwIDAgLjE1Ny0uNjhsLjM1LTIuNjE0eiIgZmlsbD0iIzZjYWM0OCIvPjxwYXRoIGQ9Im0xNi43NTQgMjguODQ1Yy4wMzUtLjQuMjI3LS43MzIuNDM2LTEuMDYzLS4yMS0uMDg3LS4zNjYtLjI2LS40ODgtLjQ1M2EzLjIzNSAzLjIzNSAwIDAgMSAtLjI2LS41NzVjLS4yNDQtLjczMi0uMjk2LTEuNS0uMzY2LTIuMjQ4di0uNDUzYy0uMDg3LjA3LS4xMDUuNjYyLS4xMDUuNzVhMTcuMzcgMTcuMzcgMCAwIDEgLS4zMTQgMi4zNTNjLS4wNTIuMzE0LS4wODcuNjI3LS4yOC45MDYgMCAuMDM1IDAgLjA3LjAxNy4xMjIuMzE0LjkyNC40IDEuODY1LjQ1MyAyLjgyNHYuMzVjMCAuNDE4LS4wMTcuMzMuMzMuNDcuMTQuMDUyLjI5Ni4wNy40MzYuMTc0LjEwNSAwIC4xMjItLjA4Ny4xMjItLjE1N2wtLjA1Mi0uNTc1di0xLjYwNGMtLjAxNy0uMjguMDM1LS41NTguMDctLjgyeiIgZmlsbD0iI2MyYmZiZiIvPjwvc3ZnPg==
|
||||
1
public/images/mysql-1767011178100.svg
Normal file
1
public/images/mysql-1767011178100.svg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/nestjs-1767011178104.svg
Normal file
1
public/images/nestjs-1767011178104.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSIxNS45OTciIHkxPSI5OTMiIHgyPSIxNS45OTciIHkyPSIxMDIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEsIDAsIDAsIC0xLCAwLCAxMDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmYjE5OSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmMDg0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5maWxlX3R5cGVfbmVzdF9taWRkbGV3YXJlX3RzPC90aXRsZT48cGF0aCBkPSJNMTguNDg4LDJhMS43NTMsMS43NTMsMCwwLDAtLjU2NC4xYzEuNjExLDEuMDU4LS4yOCwyLjU5NC42LDMuOUEyLjIzNCwyLjIzNCwwLDAsMSwxOS42LDMuNzY1Yy4yODUtLjIzNy40NjctLjMyMi40MDYtLjcxNEMxOS45MSwyLjQwOSwxOS4wNTQsMiwxOC40ODgsMlptMi4zLjQxNGMtLjIyMiwxLjEyMy0uNSwxLjE2NC0xLjMyMywxLjg4N2ExLjgyLDEuODIsMCwwLDAtLjUyOCwyLjE5MWMtMy40LTEuMzItNy43NTgtMi4xMTgtMTAuOTUzLjE2Ni0xLjE0OS44MjEtMS44NTEsMi0zLjI2OCwyLjQ4MUMzLjgsOS40NTIsMi45LDkuMzYsMi4zMjgsMTAuMjY4QTEuNDEzLDEuNDEzLDAsMCwwLDIuMzg0LDEyLjFjLjE3LjE3NS41LjI4Ny42MzYuNDY1LjA3OS4xLjA3Ny4yLjE1Mi4zMzNhMi41ODYsMi41ODYsMCwwLDAsLjU2NC44MjhjLjE0Ni4xMjEuNjUyLjIzOS43MzguMzY4LjEwNy4xNjEtLjE3My44LjA2Mi45LjE1OS4wNzMuNjIyLS43NDQuNjY3LS44MTYtLjA5Mi42NDMtLjIxMywxLjc4NC41MS44MzQuMzQzLS40NTEuMzY0LS42Ljk0MS0uN2E4LjM2LDguMzYsMCwwLDEsOS43MzksNy41MDZjLS4xMDgtLjUtLjc2MS0xLjMtMS4zNjktMS4xMS0uMjU5LjA4LS4zNTUuNTI3LS41MjUuNzg2YTMuNzUsMy43NSwwLDAsMS0uNzg1Ljg2OCw0LjY1Nyw0LjY1NywwLDAsMC0uMDcyLTEuNDUyYy0uMTgyLjc0OC0uNTQ3LDEuOTg5LTEuNDY2LDEuNzg4YTEuNjUyLDEuNjUyLDAsMCwxLTEuMzI4LTEuMTQyYy0uMTE5LS43Ni42ODQtMS42NTEtLjYwNy0xLjcxNC0yLjU5LS4xMjctMS45OTEsMy42ODItLjQ2Miw0LjY3NWEzLjI3MiwzLjI3MiwwLDAsMC0xLjAxNS4yODNBNi44OTMsNi44OTMsMCwwLDAsMTkuMDQsMTkuODg5YTcuMDQ2LDcuMDQ2LDAsMCwxLS42NDYsNC43OSw2LjksNi45LDAsMCwxLTEuMjMsMS42NjhjLS4zLjMtLjg5NC42My0xLjA4OS45NDFBMTMuNDI3LDEzLjQyNywwLDAsMCwxOS42LDI2LjMyLDExLjY0NywxMS42NDcsMCwwLDEsMTUuMSwzMGExMS41OSwxMS41OSwwLDAsMCw5LjMtNS45MDksMTEuNjU3LDExLjY1NywwLDAsMS0xLjk0NSw0LjY2OCwxMS41MzEsMTEuNTMxLDAsMCwwLDQuOTc1LTcuNzgzLDExLjY1NSwxMS42NTUsMCwwLDEsLjIwOSwzLjVBMTIuNDE4LDEyLjQxOCwwLDAsMCwyOS41MywxMy45MWExNS43NTUsMTUuNzU1LDAsMCwwLTEuNjg5LTMuOTYyQTE0LjgzOCwxNC44MzgsMCwwLDAsMjYuOSw4LjU1NGMtLjEzMy0uMTczLS44NDQtLjgwNi0uODQ0LTFxLS4wMDkuMDI5LS4wMTUsMGMwLDMuMjY2LTMuNSw1LjMxMS02LjQzMSw0LjQ2M2E1LDUsMCwwLDAsNC41Ni00LjI4OEE0Ljk4OCw0Ljk4OCwwLDAsMCwyMC43ODksMi40MTRaIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDp1cmwoI2EpIi8+PHBhdGggZD0iTTI2LjQsMTguNmEyLjgyLDIuODIsMCwwLDEsMS40MS44MSwzLjgsMy44LDAsMCwxLC41NC43MnMtMSwuNjktMS41NywxLjA2YS40OS40OSwwLDAsMS0uMi0uMjIsMS4yODMsMS4yODMsMCwwLDAtMS4wNi0uNjQuOTIuOTIsMCwwLDAtMS4xLjcuODkzLjg5MywwLDAsMC0uMDIyLjIxMi44MTguODE4LDAsMCwwLC4xLjQyLDIuMjE4LDIuMjE4LDAsMCwwLDEuMzEuODhjMS42Mi43LDIuMzEsMS4xNiwyLjc0LDEuODFhMy4yODMsMy4yODMsMCwwLDEsLjI2LDIuNzYsMywzLDAsMCwxLTIuNTEsMS44NCw2Ljg3NSw2Ljg3NSwwLDAsMS0xLjcyLDAsNC4xNDIsNC4xNDIsMCwwLDEtMi4zLTEuMiwzLjk1OCwzLjk1OCwwLDAsMS0uNTktLjg3bC4yMS0uMTMuODQtLjQ4LjY1LS4zOC4xNC4yYTIuOTg3LDIuOTg3LDAsMCwwLC44Ni44MiwyLjEsMi4xLDAsMCwwLDIuMi0uMTEsMSwxLDAsMCwwLC4xMy0xLjI1LDMuNzQyLDMuNzQyLDAsMCwwLTEuNTUtLjksNS41ODQsNS41ODQsMCwwLDEtMi4xOC0xLjM4LDIuOTg4LDIuOTg4LDAsMCwxLS42Mi0xLjEzLDQuNTE3LDQuNTE3LDAsMCwxLDAtMS40NCwyLjc2MSwyLjc2MSwwLDAsMSwyLjMyLTIuMTVBNS43MzUsNS43MzUsMCwwLDEsMjYuNCwxOC42Wm0tNS4zMS45NHYuOTNIMTguMTV2OC4zNkgxNi4wN3YtOC4zNkgxMy4xM3YtLjkxYTguNDg2LDguNDg2LDAsMCwxLDAtLjkzaDh2LjkyWiIgc3R5bGU9ImZpbGw6IzAwN2FjYyIvPjwvc3ZnPg==
|
||||
1
public/images/nginx-1767011178116.svg
Normal file
1
public/images/nginx-1767011178116.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9Ii0xNy41IDAgMjkxIDI5MSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+CiAgICA8Zz4KCQkJCTxwYXRoIGQ9Ik0yLjA1Mzg2ODE5LDIxOC4xODY4MTkgQzMuMzc0MjEyMDMsMjIwLjUzNDA5NyA1LjI4MTM3NTM2LDIyMi4yOTQ1NTYgNy42Mjg2NTMzLDIyMy42MTQ5IEwxMjAuNTkxNDA0LDI4OC43NTE4NjIgTDEyMC41OTE0MDQsMjg4Ljc1MTg2MiBDMTI1LjI4NTk2LDI5MS41MzkyNTUgMTMxLjAwNzQ1LDI5MS41MzkyNTUgMTM1LjU1NTMwMSwyODguNzUxODYyIEwyNDguNTE4MDUyLDIyMy42MTQ5IEMyNTMuMjEyNjA3LDIyMC45NzQyMTIgMjU2LDIxNS45ODYyNDYgMjU2LDIxMC41NTgxNjYgTDI1Niw4MC4yODQyNDA3IEwyNTYsODAuMjg0MjQwNyBDMjU2LDc0Ljg1NjE2MDUgMjUzLjIxMjYwNyw2OS44NjgxOTQ4IDI0OC41MTgwNTIsNjcuMjI3NTA3MiBMMTM1LjU1NTMwMSwyLjA5MDU0NDQxIEwxMzUuNTU1MzAxLDIuMDkwNTQ0NDEgQzEzMC44NjA3NDUsLTAuNjk2ODQ4MTM4IDEyNS4xMzkyNTUsLTAuNjk2ODQ4MTM4IDEyMC41OTE0MDQsMi4wOTA1NDQ0MSBMMTIwLjU5MTQwNCwyLjA5MDU0NDQxIEw3LjYyODY1MzMsNjcuMjI3NTA3MiBDMi43ODczOTI1NSw2OS44NjgxOTQ4IDAsNzQuODU2MTYwNSAwLDgwLjI4NDI0MDcgTDAsODAuMjg0MjQwNyBMMCwyMTAuNzA0ODcxIEMwLDIxMy4zNDU1NTkgMC41ODY4MTk0ODQsMjE1LjgzOTU0MiAyLjA1Mzg2ODE5LDIxOC4xODY4MTkiIGZpbGw9IiMwMDk2MzkiPgoNPC9wYXRoPgoJCQkJPHBhdGggZD0iTTkxLjgzNzI0OTMsMTk1LjE1NDE1NSBDOTEuODM3MjQ5MywyMDMuMjIyOTIzIDg1LjM4MjIzNSwyMDkuNjc3OTM3IDc3LjMxMzQ2NywyMDkuNjc3OTM3IEM2OS4yNDQ2OTkxLDIwOS42Nzc5MzcgNjIuNzg5Njg0OCwyMDMuMjIyOTIzIDYyLjc4OTY4NDgsMTk1LjE1NDE1NSBMNjIuNzg5Njg0OCwxOTUuMTU0MTU1IEw2Mi43ODk2ODQ4LDk1LjU0MTU0NzMgQzYyLjc4OTY4NDgsODcuNzY2MTg5MSA2OS42ODQ4MTM4LDgxLjQ1Nzg3OTcgNzkuMjIwNjMwNCw4MS40NTc4Nzk3IEM4Ni4xMTU3NTkzLDgxLjQ1Nzg3OTcgOTQuMTg0NTI3Miw4NC4yNDUyNzIyIDk5LjAyNTc4OCw5MC4yNjAxNzE5IEwxMDMuNDI2OTM0LDk1LjU0MTU0NzMgTDE2NC4xNjI3NTEsMTY4LjE2MDQ1OCBMMTY0LjE2Mjc1MSw5NS44MzQ5NTcgTDE2NC4xNjI3NTEsOTUuODM0OTU3IEMxNjQuMTYyNzUxLDg3Ljc2NjE4OTEgMTcwLjYxNzc2NSw4MS4zMTExNzQ4IDE3OC42ODY1MzMsODEuMzExMTc0OCBDMTg2Ljc1NTMwMSw4MS4zMTExNzQ4IDE5My4yMTAzMTUsODcuNzY2MTg5MSAxOTMuMjEwMzE1LDk1LjgzNDk1NyBMMTkzLjIxMDMxNSw5NS44MzQ5NTcgTDE5My4yMTAzMTUsMTk1LjQ0NzU2NCBDMTkzLjIxMDMxNSwyMDMuMjIyOTIzIDE4Ni4zMTUxODYsMjA5LjUzMTIzMiAxNzYuNzc5MzcsMjA5LjUzMTIzMiBDMTY5Ljg4NDI0MSwyMDkuNTMxMjMyIDE2MS44MTU0NzMsMjA2Ljc0Mzg0IDE1Ni45NzQyMTIsMjAwLjcyODk0IEw5MS44MzcyNDkzLDEyMi45NzUzNTggTDkxLjgzNzI0OTMsMTk1LjE1NDE1NSBMOTEuODM3MjQ5MywxOTUuMTU0MTU1IFoiIGZpbGw9IiNGRkZGRkYiPgoNPC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=
|
||||
1
public/images/nodejs-1767011178362.svg
Normal file
1
public/images/nodejs-1767011178362.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjYiIHZpZXdCb3g9IjAgMCAyNCAyNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0xMC44NTU4IDAuMzI5ODkyQzExLjQ5NzcgLTAuMDM3NTE5MiAxMi4zMzM4IC0wLjAzOTE3ODggMTIuOTc1MSAwLjMyOTg5MkMxNi4yMDE2IDIuMTUzMDMgMTkuNDI5MSAzLjk3MzMgMjIuNjU1IDUuNzk3NTRDMjMuMjYxOCA2LjEzOTMyIDIzLjY2NzYgNi44MTQ1OSAyMy42NjE1IDcuNTEzNzNWMTguNDgyNEMyMy42NjYgMTkuMjEwNSAyMy4yMiAxOS45MDE5IDIyLjU3OTkgMjAuMjM1OUMxOS4zNjQgMjIuMDQ5IDE2LjE0OTggMjMuODY0MyAxMi45MzQ0IDI1LjY3NzRDMTIuMjc5MyAyNi4wNTIgMTEuNDI2NCAyNi4wMjMxIDEwLjc5MTcgMjUuNjE3OEM5LjgyNzYyIDI1LjA1ODkgOC44NjE4NCAyNC41MDI4IDcuODk3NjIgMjMuOTQ0NEM3LjcwMDYgMjMuODI3IDcuNDc4NDkgMjMuNzMzNSA3LjMzOTM2IDIzLjU0MjVDNy40NjIzNiAyMy4zNzY3IDcuNjgyMjUgMjMuMzU2IDcuODYwOTMgMjMuMjgzNkM4LjI2MzM4IDIzLjE1NTcgOC42MzMgMjIuOTUwMyA5LjAwMjcyIDIyLjc1MDlDOS4wOTYyMSAyMi42ODY5IDkuMjEwMzUgMjIuNzExNSA5LjI5OTk2IDIyLjc2ODdDMTAuMTI0NCAyMy4yNDE0IDEwLjk0MTYgMjMuNzI3OSAxMS43Njg4IDI0LjE5NkMxMS45NDUyIDI0LjI5NzkgMTIuMTIzOSAyNC4xNjI3IDEyLjI3NDggMjQuMDc4NkMxNS40MzA1IDIyLjI5NSAxOC41OTAyIDIwLjUxODIgMjEuNzQ1NCAxOC43MzRDMjEuODYyMyAxOC42Nzc4IDIxLjkyNjkgMTguNTUzNyAyMS45MTc0IDE4LjQyNTZDMjEuOTE5NiAxNC44MDczIDIxLjkxOCAxMS4xODgzIDIxLjkxODUgNy41Njk5N0MyMS45MzE5IDcuNDI0NjcgMjEuODQ3OCA3LjI5MTA3IDIxLjcxNjQgNy4yMzE2QzE4LjUxMTcgNS40MjY4MSAxNS4zMDg2IDMuNjE5MjYgMTIuMTA0NSAxLjgxNDAxQzEyLjA0ODkgMS43NzU4NSAxMS45ODMyIDEuNzU1MzcgMTEuOTE1OCAxLjc1NTI3QzExLjg0ODQgMS43NTUxNyAxMS43ODI2IDEuNzc1NDYgMTEuNzI3IDEuODEzNDZDOC41MjI4MiAzLjYxOTI2IDUuMzIwMzEgNS40Mjg0NyAyLjExNjEzIDcuMjMzMTdDMS45ODUyMSA3LjI5MjczIDEuODk3MzQgNy40MjQxMSAxLjkxMjkyIDcuNTY5OTdDMS45MTM0OCAxMS4xODgzIDEuOTEyOTIgMTQuODA3MyAxLjkxMjkyIDE4LjQyNjJDMS45MDczNyAxOC40ODg3IDEuOTIxMDkgMTguNTUxMyAxLjk1MjI1IDE4LjYwNThDMS45ODM0IDE4LjY2MDIgMi4wMzA0OSAxOC43MDM4IDIuMDg3MTggMTguNzMwN0MyLjk0MjIzIDE5LjIxNTYgMy43OTgzOCAxOS42OTcgNC42NTM5OSAyMC4xODAyQzUuMTM2IDIwLjQzOTcgNS43Mjc4MiAyMC41OTM4IDYuMjU4ODkgMjAuMzk1MUM2LjcyNzUzIDIwLjIyNyA3LjA1NjA0IDE5Ljc0ODggNy4wNDcwOSAxOS4yNTEyQzcuMDUxNTIgMTUuNjUzOSA3LjA0NDg4IDEyLjA1NjIgNy4wNTA0MSA4LjQ1OTVDNy4wMzg3IDguMjk5ODEgNy4xOTAxOSA4LjE2Nzg4IDcuMzQ1NDUgOC4xODI5MUM3Ljc1NjI4IDguMTgwMTQgOC4xNjc2NyA4LjE3NzM3IDguNTc4NTEgOC4xODQwMUM4Ljc1IDguMTgwMTQgOC44NjgwMSA4LjM1MjA5IDguODQ2ODEgOC41MTI5OEM4Ljg0NTE1IDEyLjEzMyA4Ljg1MTIzIDE1Ljc1MzEgOC44NDQwNCAxOS4zNzNDOC44NDUxNSAyMC4zMzc4IDguNDQ4NzkgMjEuMzg3NiA3LjU1NjQgMjEuODU5NkM2LjQ1NzAyIDIyLjQyOTIgNS4wOTgyIDIyLjMwODQgNC4wMTIxIDIxLjc2MjNDMy4wNzE4NiAyMS4yOTMgMi4xNzQ1OCAyMC43MzkyIDEuMjUxMDMgMjAuMjM2NEMwLjYwOTIzNSAxOS45MDQyIDAuMTY1NDgzIDE5LjIxIDAuMTcwMDAxIDE4LjQ4MjVWNy41MTM3M0MwLjE2MzI3MSA2LjgwMDExIDAuNTg1MjY0IDYuMTEyNTkgMS4yMTA5MiA1Ljc3NTc5QzQuNDI2MjYgMy45NjEyMyA3LjY0MTA0IDIuMTQ1MjggMTAuODU1OCAwLjMyOTg5MloiIGZpbGw9IiM2NDlhNjAiLz4KPHBhdGggZD0iTTEzLjY2MSA3LjkyODMzQzE1LjA2MzQgNy44MzgwNyAxNi41NjQ2IDcuODc0ODYgMTcuODI2NiA4LjU2NTcxQzE4LjgwMzYgOS4wOTUxMiAxOS4zNDUzIDEwLjIwNjIgMTkuMzYyNSAxMS4yOTE3QzE5LjMzNTIgMTEuNDM4MSAxOS4xODIyIDExLjUxODkgMTkuMDQyNCAxMS41MDg4QzE4LjYzNTUgMTEuNTA4MyAxOC4yMjg2IDExLjUxNDMgMTcuODIxNyAxMS41MDZDMTcuNjQ5MSAxMS41MTI3IDE3LjU0ODggMTEuMzUzNSAxNy41MjcxIDExLjIwMUMxNy40MTAyIDEwLjY4MTYgMTcuMTI3IDEwLjE2NzIgMTYuNjM4MSA5LjkxNjcxQzE1Ljg4NzcgOS41NDEgMTUuMDE3NiA5LjU1OTkgMTQuMTk5NCA5LjU2NzczQzEzLjYwMiA5LjU5OTQ1IDEyLjk1OTcgOS42NTExNyAxMi40NTM2IDEwLjAwMjVDMTIuMDY1IDEwLjI2ODUgMTEuOTQ3IDEwLjgwNTcgMTIuMDg1NyAxMS4yMzgzQzEyLjIxNjQgMTEuNTQ4OSAxMi41NzUgMTEuNjQ5MSAxMi44Njg0IDExLjc0MTVDMTQuNTU4NCAxMi4xODM1IDE2LjM0OTMgMTIuMTM5NSAxOC4wMDcgMTIuNzIxMkMxOC42OTMzIDEyLjk1ODQgMTkuMzY0NyAxMy40MTk0IDE5LjU5OTcgMTQuMTM4QzE5LjkwNyAxNS4xMDExIDE5Ljc3MjMgMTYuMjUyMyAxOS4wODcgMTcuMDI1NUMxOC41MzEzIDE3LjY2MTggMTcuNzIyIDE4LjAwODEgMTYuOTE0OCAxOC4xOTYxQzE1Ljg0MSAxOC40MzU2IDE0LjcyNjYgMTguNDQxNyAxMy42MzYgMTguMzM1NEMxMi42MTA2IDE4LjIxODUgMTEuNTQzNSAxNy45NDkgMTAuNzUxOSAxNy4yNTA0QzEwLjA3NDkgMTYuNjYyNiA5Ljc0NDMgMTUuNzQ2OCA5Ljc3NzEzIDE0Ljg2MjlDOS43ODQ5NiAxNC43MTM2IDkuOTMzNTkgMTQuNjA5NSAxMC4wNzY2IDE0LjYyMTdDMTAuNDg2MyAxNC42MTg0IDEwLjg5NjEgMTQuNjE3MyAxMS4zMDU4IDE0LjYyMjNDMTEuNDY5NCAxNC42MTA2IDExLjU5MDggMTQuNzUyIDExLjU5OTIgMTQuOTA2M0MxMS42NzQ4IDE1LjQwMTEgMTEuODYwNyAxNS45MjA1IDEyLjI5MjIgMTYuMjEzOUMxMy4xMjUgMTYuNzUxMSAxNC4xNjk5IDE2LjcxNDMgMTUuMTIzNCAxNi43MjkzQzE1LjkxMzMgMTYuNjk0MyAxNi44MDAxIDE2LjY4MzcgMTcuNDQ0OCAxNi4xNjE2QzE3Ljc4NDkgMTUuODYzOCAxNy44ODU3IDE1LjM2NTUgMTcuNzkzNyAxNC45MzY5QzE3LjY5NDIgMTQuNTc1IDE3LjMxNTYgMTQuNDA2NCAxNi45OTA1IDE0LjI5NjFDMTUuMzIyMiAxMy43NjgzIDEzLjUxMTMgMTMuOTU5OCAxMS44NTkxIDEzLjM2M0MxMS4xODgzIDEzLjEyNiAxMC41Mzk3IDEyLjY3NzggMTAuMjgyIDExLjk4ODdDOS45MjI0MyAxMS4wMTM0IDEwLjA4NzIgOS44MDcwOCAxMC44NDQyIDkuMDU5OTlDMTEuNTgyNCA4LjMxNjg2IDEyLjY0NzkgOC4wMzA2NyAxMy42NjEgNy45MjgyNFY3LjkyODMzWiIgZmlsbD0iIzY0OWE2MCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjIzLjYwOCIgaGVpZ2h0PSIyNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMTE0MjU4KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=
|
||||
1
public/images/php-1767011178421.svg
Normal file
1
public/images/php-1767011178421.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDMyIDMyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTQiIGZpbGw9IiM4ODkyQkYiLz4NCjxwYXRoIGQ9Ik0xNC40MzkyIDEwSDE2LjExOTJMMTUuNjQ0NCAxMi41MjQySDE3LjE1NEMxNy45ODE5IDEyLjU0MTkgMTguNTk4NiAxMi43MjY5IDE5LjAwNDUgMTMuMDc5M0MxOS40MTg0IDEzLjQzMTYgMTkuNTQwMiAxNC4xMDE0IDE5LjM2OTggMTUuMDg4MUwxOC41NTQxIDE5LjQ4ODlIMTYuODQ5N0wxNy42Mjg4IDE1LjI4NjNDMTcuNzA5OSAxNC44NDU3IDE3LjY4NTYgMTQuNTMzIDE3LjU1NTggMTQuMzQ4QzE3LjQyNiAxNC4xNjMgMTcuMTQ2IDE0LjA3MDUgMTYuNzE1OCAxNC4wNzA1TDE1LjM2NDQgMTQuMDU3M0wxNC4zNjYxIDE5LjQ4ODlIMTIuNjg2MUwxNC40MzkyIDEwWiIgZmlsbD0id2hpdGUiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNi43NDA5MiAxMi41MjQzSDEwLjAwMzZDMTAuOTYxMiAxMi41MzMgMTEuNjU1MiAxMi44MzI3IDEyLjA4NTQgMTMuNDIyOUMxMi41MTU2IDE0LjAxMzIgMTIuNjU3NiAxNC44MTkzIDEyLjUxMTUgMTUuODQxNEMxMi40NTQ4IDE2LjMwODUgMTIuMzI4OSAxNi43NjY1IDEyLjEzNDEgMTcuMjE1OUMxMS45NDc0IDE3LjY2NTIgMTEuNjg3OCAxOC4wNzA0IDExLjM1NSAxOC40MzE3QzEwLjk0OTEgMTguODg5OCAxMC41MTQ5IDE5LjE4MDUgMTAuMDUyMyAxOS4zMDRDOS41ODk2OSAxOS40Mjc0IDkuMTEwNzYgMTkuNDg5IDguNjE1NzUgMTkuNDg5SDcuMTU0ODRMNi42OTIyMiAyMkg1TDYuNzQwOTIgMTIuNTI0M1pNNy40MzQ4NSAxNy45OTU2TDguMTYyODcgMTQuMDQ0MUg4LjQwODc5QzguNDk4MTUgMTQuMDQ0MSA4LjU5MTQgMTQuMDM5NiA4LjY4ODggMTQuMDMwOUM5LjMzODE3IDE0LjAyMjEgOS44Nzc3NCAxNC4wODgyIDEwLjMwOCAxNC4yMjkxQzEwLjc0NjIgMTQuMzcgMTAuODkyMyAxNC45MDMxIDEwLjc0NjIgMTUuODI4MkMxMC41Njc4IDE2LjkyOTYgMTAuMjE4NiAxNy41NzI3IDkuNjk5MjYgMTcuNzU3N0M5LjE3OTkgMTcuOTM0IDguNTMwNTMgMTguMDE3NiA3Ljc1MTM4IDE4LjAwODhINy41ODA5NEM3LjUzMjI0IDE4LjAwODggNy40ODM1NSAxOC4wMDQzIDcuNDM0ODUgMTcuOTk1NloiIGZpbGw9IndoaXRlIi8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTI0LjQzNjUgMTIuNTI0M0gyMS4xNzM4TDE5LjQzMjkgMjJIMjEuMTI1MUwyMS41ODc4IDE5LjQ4OUgyMy4wNDg3QzIzLjU0MzcgMTkuNDg5IDI0LjAyMjYgMTkuNDI3NCAyNC40ODUyIDE5LjMwNEMyNC45NDc5IDE5LjE4MDUgMjUuMzgyIDE4Ljg4OTggMjUuNzg3OSAxOC40MzE3QzI2LjEyMDcgMTguMDcwNCAyNi4zODAzIDE3LjY2NTIgMjYuNTY3IDE3LjIxNTlDMjYuNzYxOCAxNi43NjY1IDI2Ljg4NzcgMTYuMzA4NSAyNi45NDQ0IDE1Ljg0MTRDMjcuMDkwNSAxNC44MTkzIDI2Ljk0ODYgMTQuMDEzMiAyNi41MTgzIDEzLjQyMjlDMjYuMDg4MSAxMi44MzI3IDI1LjM5NDIgMTIuNTMzIDI0LjQzNjUgMTIuNTI0M1pNMjIuNTk1OCAxNC4wNDQxTDIxLjg2NzggMTcuOTk1NkMyMS45MTY1IDE4LjAwNDMgMjEuOTY1MiAxOC4wMDg4IDIyLjAxMzkgMTguMDA4OEgyMi4xODQzQzIyLjk2MzUgMTguMDE3NiAyMy42MTI4IDE3LjkzNCAyNC4xMzIyIDE3Ljc1NzdDMjQuNjUxNSAxNy41NzI3IDI1LjAwMDcgMTYuOTI5NiAyNS4xNzkyIDE1LjgyODJDMjUuMzI1MyAxNC45MDMxIDI1LjE3OTIgMTQuMzcgMjQuNzQwOSAxNC4yMjkxQzI0LjMxMDcgMTQuMDg4MiAyMy43NzExIDE0LjAyMjEgMjMuMTIxNyAxNC4wMzA5QzIzLjAyNDMgMTQuMDM5NiAyMi45MzExIDE0LjA0NDEgMjIuODQxNyAxNC4wNDQxSDIyLjU5NThaIiBmaWxsPSJ3aGl0ZSIvPg0KPC9zdmc+
|
||||
1
public/images/reactjs-1767011178149.svg
Normal file
1
public/images/reactjs-1767011178149.svg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/reactnative-1767011178240.svg
Normal file
1
public/images/reactnative-1767011178240.svg
Normal file
File diff suppressed because one or more lines are too long
1
public/images/redis-1767011178113.svg
Normal file
1
public/images/redis-1767011178113.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAtMTggMjU2IDI1NiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij48cGF0aCBkPSJNMjQ1Ljk3IDE2OC45NDNjLTEzLjY2MiA3LjEyMS04NC40MzQgMzYuMjItOTkuNTAxIDQ0LjA3NS0xNS4wNjcgNy44NTYtMjMuNDM3IDcuNzgtMzUuMzQgMi4wOS0xMS45MDItNS42OS04Ny4yMTYtMzYuMTEyLTEwMC43ODMtNDIuNTk3QzMuNTY2IDE2OS4yNzEgMCAxNjYuNTM1IDAgMTYzLjk1MXYtMjUuODc2czk4LjA1LTIxLjM0NSAxMTMuODc5LTI3LjAyNGMxNS44MjgtNS42NzkgMjEuMzItNS44ODQgMzQuNzktLjk1IDEzLjQ3MiA0LjkzNiA5NC4wMTggMTkuNDY4IDEwNy4zMzEgMjQuMzQ0bC0uMDA2IDI1LjUxYy4wMDIgMi41NTgtMy4wNyA1LjM2NC0xMC4wMjQgOC45ODgiIGZpbGw9IiM5MTI2MjYiLz48cGF0aCBkPSJNMjQ1Ljk2NSAxNDMuMjJjLTEzLjY2MSA3LjExOC04NC40MzEgMzYuMjE4LTk5LjQ5OCA0NC4wNzItMTUuMDY2IDcuODU3LTIzLjQzNiA3Ljc4LTM1LjMzOCAyLjA5LTExLjkwMy01LjY4Ni04Ny4yMTQtMzYuMTEzLTEwMC43OC00Mi41OTQtMTMuNTY2LTYuNDg1LTEzLjg1LTEwLjk0OC0uNTI0LTE2LjE2NiAxMy4zMjYtNS4yMiA4OC4yMjQtMzQuNjA1IDEwNC4wNTUtNDAuMjg0IDE1LjgyOC01LjY3NyAyMS4zMTktNS44ODQgMzQuNzg5LS45NDggMTMuNDcxIDQuOTM0IDgzLjgxOSAzMi45MzUgOTcuMTMgMzcuODEgMTMuMzE2IDQuODgxIDEzLjgyNyA4LjkuMTY2IDE2LjAyIiBmaWxsPSIjQzYzMDJCIi8+PHBhdGggZD0iTTI0NS45NyAxMjcuMDc0Yy0xMy42NjIgNy4xMjItODQuNDM0IDM2LjIyLTk5LjUwMSA0NC4wNzgtMTUuMDY3IDcuODUzLTIzLjQzNyA3Ljc3Ny0zNS4zNCAyLjA4Ny0xMS45MDMtNS42ODctODcuMjE2LTM2LjExMi0xMDAuNzgzLTQyLjU5N0MzLjU2NiAxMjcuNDAyIDAgMTI0LjY3IDAgMTIyLjA4NVY5Ni4yMDZzOTguMDUtMjEuMzQ0IDExMy44NzktMjcuMDIzYzE1LjgyOC01LjY3OSAyMS4zMi01Ljg4NSAzNC43OS0uOTVDMTYyLjE0MiA3My4xNjggMjQyLjY4OCA4Ny42OTcgMjU2IDkyLjU3NGwtLjAwNiAyNS41MTNjLjAwMiAyLjU1Ny0zLjA3IDUuMzYzLTEwLjAyNCA4Ljk4NyIgZmlsbD0iIzkxMjYyNiIvPjxwYXRoIGQ9Ik0yNDUuOTY1IDEwMS4zNTFjLTEzLjY2MSA3LjEyLTg0LjQzMSAzNi4yMTgtOTkuNDk4IDQ0LjA3NS0xNS4wNjYgNy44NTQtMjMuNDM2IDcuNzc3LTM1LjMzOCAyLjA4Ny0xMS45MDMtNS42ODYtODcuMjE0LTM2LjExMi0xMDAuNzgtNDIuNTk0LTEzLjU2Ni02LjQ4My0xMy44NS0xMC45NDctLjUyNC0xNi4xNjdDMjMuMTUxIDgzLjUzNSA5OC4wNSA1NC4xNDggMTEzLjg4IDQ4LjQ3YzE1LjgyOC01LjY3OCAyMS4zMTktNS44ODQgMzQuNzg5LS45NDkgMTMuNDcxIDQuOTM0IDgzLjgxOSAzMi45MzMgOTcuMTMgMzcuODEgMTMuMzE2IDQuODggMTMuODI3IDguOS4xNjYgMTYuMDIiIGZpbGw9IiNDNjMwMkIiLz48cGF0aCBkPSJNMjQ1Ljk3IDgzLjY1M2MtMTMuNjYyIDcuMTItODQuNDM0IDM2LjIyLTk5LjUwMSA0NC4wNzgtMTUuMDY3IDcuODU0LTIzLjQzNyA3Ljc3Ny0zNS4zNCAyLjA4Ny0xMS45MDMtNS42ODctODcuMjE2LTM2LjExMy0xMDAuNzgzLTQyLjU5NUMzLjU2NiA4My45OCAwIDgxLjI0NyAwIDc4LjY2NXYtMjUuODhzOTguMDUtMjEuMzQzIDExMy44NzktMjcuMDIxYzE1LjgyOC01LjY4IDIxLjMyLTUuODg0IDM0Ljc5LS45NUMxNjIuMTQyIDI5Ljc0OSAyNDIuNjg4IDQ0LjI3OCAyNTYgNDkuMTU1bC0uMDA2IDI1LjUxMmMuMDAyIDIuNTU1LTMuMDcgNS4zNjEtMTAuMDI0IDguOTg2IiBmaWxsPSIjOTEyNjI2Ii8+PHBhdGggZD0iTTI0NS45NjUgNTcuOTNjLTEzLjY2MSA3LjEyLTg0LjQzMSAzNi4yMi05OS40OTggNDQuMDc0LTE1LjA2NiA3Ljg1NC0yMy40MzYgNy43NzctMzUuMzM4IDIuMDlDOTkuMjI3IDk4LjQwNCAyMy45MTUgNjcuOTggMTAuMzUgNjEuNDk3LTMuMjE3IDU1LjAxNS0zLjUgNTAuNTUgOS44MjUgNDUuMzMxIDIzLjE1MSA0MC4xMTMgOTguMDUgMTAuNzMgMTEzLjg4IDUuMDVjMTUuODI4LTUuNjc5IDIxLjMxOS01Ljg4MyAzNC43ODktLjk0OCAxMy40NzEgNC45MzUgODMuODE5IDMyLjkzNCA5Ny4xMyAzNy44MTEgMTMuMzE2IDQuODc2IDEzLjgyNyA4Ljg5Ny4xNjYgMTYuMDE3IiBmaWxsPSIjQzYzMDJCIi8+PHBhdGggZD0iTTE1OS4yODMgMzIuNzU3bC0yMi4wMSAyLjI4NS00LjkyNyAxMS44NTYtNy45NTgtMTMuMjMtMjUuNDE1LTIuMjg0IDE4Ljk2NC02LjgzOS01LjY5LTEwLjQ5OCAxNy43NTUgNi45NDQgMTYuNzM4LTUuNDgtNC41MjQgMTAuODU1IDE3LjA2NyA2LjM5MU0xMzEuMDMyIDkwLjI3NUw4OS45NTUgNzMuMjM4bDU4Ljg2LTkuMDM1LTE3Ljc4MyAyNi4wNzJNNzQuMDgyIDM5LjM0N2MxNy4zNzUgMCAzMS40NiA1LjQ2IDMxLjQ2IDEyLjE5NCAwIDYuNzM2LTE0LjA4NSAxMi4xOTUtMzEuNDYgMTIuMTk1cy0zMS40Ni01LjQ2LTMxLjQ2LTEyLjE5NWMwLTYuNzM0IDE0LjA4NS0xMi4xOTQgMzEuNDYtMTIuMTk0IiBmaWxsPSIjRkZGIi8+PHBhdGggZD0iTTE4NS4yOTUgMzUuOTk4bDM0LjgzNiAxMy43NjYtMzQuODA2IDEzLjc1My0uMDMtMjcuNTIiIGZpbGw9IiM2MjFCMUMiLz48cGF0aCBkPSJNMTQ2Ljc1NSA1MS4yNDNsMzguNTQtMTUuMjQ1LjAzIDI3LjUxOS0zLjc3OSAxLjQ3OC0zNC43OTEtMTMuNzUyIiBmaWxsPSIjOUEyOTI4Ii8+PC9zdmc+
|
||||
1
public/images/review-linkedin-1767011178481.svg
Normal file
1
public/images/review-linkedin-1767011178481.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyBoZWlnaHQ9IjI1MDAiIHdpZHRoPSIyNDkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2Ij48ZyBmaWxsPSJub25lIj48cGF0aCBkPSJNMCAxOC4zMzhDMCA4LjIxNiA4LjQ3NCAwIDE4LjkyIDBoMjE4LjE2QzI0Ny41MyAwIDI1NiA4LjIxNiAyNTYgMTguMzM4djIxOS4zMjdDMjU2IDI0Ny43OSAyNDcuNTMgMjU2IDIzNy4wOCAyNTZIMTguOTJDOC40NzUgMjU2IDAgMjQ3Ljc5MSAwIDIzNy42NjhWMTguMzM1eiIgZmlsbD0iIzA2OSIvPjxwYXRoIGQ9Ik03Ny43OTYgMjE0LjIzOFY5OC45ODZIMzkuNDg4djExNS4yNTJINzcuOHpNNTguNjUgODMuMjUzYzEzLjM1NiAwIDIxLjY3MS04Ljg1IDIxLjY3MS0xOS45MS0uMjUtMTEuMzEyLTguMzE1LTE5LjkxNS0yMS40MTctMTkuOTE1LTEzLjExMSAwLTIxLjY3NCA4LjYwMy0yMS42NzQgMTkuOTE0IDAgMTEuMDYgOC4zMTIgMTkuOTEgMjEuMTY5IDE5LjkxaC4yNDh6TTk5IDIxNC4yMzhoMzguMzA1di02NC4zNTVjMC0zLjQ0LjI1LTYuODg5IDEuMjYyLTkuMzQ2IDIuNzY4LTYuODg1IDkuMDcxLTE0LjAxMiAxOS42NTYtMTQuMDEyIDEzLjg1OCAwIDE5LjQwNSAxMC41NjggMTkuNDA1IDI2LjA2M3Y2MS42NWgzOC4zMDR2LTY2LjA4MmMwLTM1LjM5OS0xOC44OTYtNTEuODcyLTQ0LjA5OS01MS44NzItMjAuNjYzIDAtMjkuNzM4IDExLjU0OS0zNC43OCAxOS40MTVoLjI1NVY5OC45OUg5OS4wMDJjLjUgMTAuODEyLS4wMDMgMTE1LjI1Mi0uMDAzIDExNS4yNTJ6IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPg==
|
||||
1
public/images/review-star-1767011178349.svg
Normal file
1
public/images/review-star-1767011178349.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTciIHZpZXdCb3g9IjAgMCAxNiAxNyIgZmlsbD0iI0ZGQ0E0OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik04LjM3ODQ1IDAuNzkyMzM3TDEwLjQxMzcgNS42MDkzNEwxNS42MjQxIDYuMDU2OTVDMTUuOTg1NCA2LjA4ODE2IDE2LjEzMjUgNi41MzkwNiAxNS44NTgxIDYuNzc2NDJMMTEuOTA2IDEwLjIwMDVMMTMuMDkwMyAxNS4yOTQzQzEzLjE3MjQgMTUuNjQ4MiAxMi43ODg5IDE1LjkyNjcgMTIuNDc4NCAxNS43Mzg2TDguMDAwNjQgMTMuMDM4MUwzLjUyMjg0IDE1LjczODZDMy4yMTE1NyAxNS45MjU5IDIuODI4ODMgMTUuNjQ3NCAyLjkxMDk2IDE1LjI5NDNMNC4wOTUzIDEwLjIwMDVMMC4xNDIzMTkgNi43NzU2Qy0wLjEzMiA2LjUzODI0IDAuMDE0MTkzNyA2LjA4NzM0IDAuMzc2MzkzIDYuMDU2MTNMNS41ODY4IDUuNjA4NTJMNy42MjIwMiAwLjc5MjMzN0M3Ljc2MzI4IDAuNDU3MjQyIDguMjM3MTggMC40NTcyNDIgOC4zNzg0NSAwLjc5MjMzN1oiLz4KPC9zdmc+
|
||||
1
public/images/review-upwork-1767011178117.svg
Normal file
1
public/images/review-upwork-1767011178117.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjkiIHZpZXdCb3g9IjAgMCAyOCAyOSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIxLjY1MiAxNi42NDgyQzIwLjM2MzggMTYuNjQ4MiAxOS4xNTggMTYuMTAyMyAxOC4wNjEgMTUuMjEzM0wxOC4zMjggMTMuOTU5MkwxOC4zMzk4IDEzLjkxMzRDMTguNTc4MSAxMi41NzggMTkuMzMyMiAxMC4zMzU1IDIxLjY1MiAxMC4zMzU1QzIzLjM5MTggMTAuMzM1NSAyNC44MDcgMTEuNzUzMyAyNC44MDcgMTMuNDk0NEMyNC44MDE4IDE1LjIzMDQgMjMuMzg2NiAxNi42NDgyIDIxLjY1MiAxNi42NDgyWk0yMS42NTIgNy4xMzQ2MkMxOC42ODgxIDcuMTM0NjIgMTYuMzkwNSA5LjA2Mjk5IDE1LjQ1NzEgMTIuMjMzN0MxNC4wMzAxIDEwLjA5MDcgMTIuOTUxNCA3LjUxODIgMTIuMzE5MSA1LjM1MTU2SDkuMTNWMTMuNjYyQzkuMTMgMTUuMjk5NyA3Ljc5NTk5IDE2LjYzNTEgNi4xNTk1NiAxNi42MzUxQzQuNTIzMTMgMTYuNjM1MSAzLjE5MDQyIDE1LjI5OTcgMy4xOTA0MiAxMy42NjJWNS4zNTE1NkgzLjc0ODE4ZS0wNVYxMy42NjJDLTAuMDExNzQ0OCAxNy4wNjU4IDIuNzU1NzggMTkuODU5NSA2LjE1NDMyIDE5Ljg1OTVDOS41NTI4NiAxOS44NTk1IDEyLjMyMDQgMTcuMDY1OCAxMi4zMjA0IDEzLjY2MlYxMi4yNjc4QzEyLjk0MDkgMTMuNTYyNSAxMy43MDAyIDE0Ljg2OSAxNC42MjMyIDE2LjAzMTZMMTIuNjY4NiAyNS4yMzA5SDE1LjkzNDlMMTcuMzUwMSAxOC41NTgyQzE4LjU5MTIgMTkuMzU0MiAyMC4wMTgyIDE5Ljg1MyAyMS42NTQ2IDE5Ljg1M0MyNS4xNTI2IDE5Ljg1MyAyOCAxNi45ODMzIDI4IDEzLjQ4MTNDMjcuOTk3NCA5Ljk4NTkzIDI1LjE1IDcuMTM0NjIgMjEuNjUyIDcuMTM0NjJaIiBmaWxsPSIjNkZEQTQ0Ii8+Cjwvc3ZnPgo=
|
||||
1
public/images/select-carret-1767011178495.svg
Normal file
1
public/images/select-carret-1767011178495.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI3IiB2aWV3Qm94PSIwIDAgOCA3IiBvcGFjaXR5PSIwLjQiIGZpbGw9IiMxRTI1MzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cgk8cGF0aCBkPSJNNS4wMzI5NSA2LjAzMTY1QzQuNDY0MiA2LjYwNjMgMy41MzU4IDYuNjA2MyAyLjk2NzA1IDYuMDMxNjVMMC40MjMzMDEgMy40NjE1NEMtMC40ODQ5ODQgMi41NDM4NSAwLjE2NTA3IDAuOTg1ODQgMS40NTYyNSAwLjk4NTg0TDYuNTQzNzUgMC45ODU4NEM3LjgzNDkzIDAuOTg1ODQgOC40ODQ5OSAyLjU0Mzg1IDcuNTc2NyAzLjQ2MTU0TDUuMDMyOTUgNi4wMzE2NVoiLz4KPC9zdmc+
|
||||
1
public/images/services-mobile-1767011178463.png
Normal file
1
public/images/services-mobile-1767011178463.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/services-web-1767011178219.png
Normal file
1
public/images/services-web-1767011178219.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/small-colored-instagram-1767011178481.svg
Normal file
1
public/images/small-colored-instagram-1767011178481.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAxNSAxNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiIGQ9Ik0xMC4zMjkxIDAuNUg1LjA3OTFDMi42NjMyMyAwLjUgMC43MDQxMDIgMi40NTkxMyAwLjcwNDEwMiA0Ljg3NVYxMC4xMjVDMC43MDQxMDIgMTIuNTQwOSAyLjY2MzIzIDE0LjUgNS4wNzkxIDE0LjVIMTAuMzI5MUMxMi43NDUgMTQuNSAxNC43MDQxIDEyLjU0MDkgMTQuNzA0MSAxMC4xMjVWNC44NzVDMTQuNzA0MSAyLjQ1OTEzIDEyLjc0NSAwLjUgMTAuMzI5MSAwLjVaTTEzLjM5MTYgMTAuMTI1QzEzLjM5MTYgMTEuODEzOCAxMi4wMTc5IDEzLjE4NzUgMTAuMzI5MSAxMy4xODc1SDUuMDc5MUMzLjM5MDM1IDEzLjE4NzUgMi4wMTY2IDExLjgxMzggMi4wMTY2IDEwLjEyNVY0Ljg3NUMyLjAxNjYgMy4xODYyNSAzLjM5MDM1IDEuODEyNSA1LjA3OTEgMS44MTI1SDEwLjMyOTFDMTIuMDE3OSAxLjgxMjUgMTMuMzkxNiAzLjE4NjI1IDEzLjM5MTYgNC44NzVWMTAuMTI1WiIvPgoJPHBhdGggZmlsbD0idXJsKCNwYWludDFfbGluZWFyKSIgZD0iTTcuNzA0MSA0QzUuNzcxMjMgNCA0LjIwNDEgNS41NjcxMiA0LjIwNDEgNy41QzQuMjA0MSA5LjQzMjg3IDUuNzcxMjMgMTEgNy43MDQxIDExQzkuNjM2OTggMTEgMTEuMjA0MSA5LjQzMjg3IDExLjIwNDEgNy41QzExLjIwNDEgNS41NjcxMiA5LjYzNjk4IDQgNy43MDQxIDRaTTcuNzA0MSA5LjY4NzVDNi40OTgzNSA5LjY4NzUgNS41MTY2IDguNzA1NzUgNS41MTY2IDcuNUM1LjUxNjYgNi4yOTMzOCA2LjQ5ODM1IDUuMzEyNSA3LjcwNDEgNS4zMTI1QzguOTA5ODUgNS4zMTI1IDkuODkxNiA2LjI5MzM4IDkuODkxNiA3LjVDOS44OTE2IDguNzA1NzUgOC45MDk4NSA5LjY4NzUgNy43MDQxIDkuNjg3NVoiLz4KCTxwYXRoIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiIGQ9Ik0xMS40NjY3IDQuMjAzNTdDMTEuNzI0MiA0LjIwMzU3IDExLjkzMyAzLjk5NDc3IDExLjkzMyAzLjczNzJDMTEuOTMzIDMuNDc5NjMgMTEuNzI0MiAzLjI3MDgzIDExLjQ2NjcgMy4yNzA4M0MxMS4yMDkxIDMuMjcwODMgMTEuMDAwMyAzLjQ3OTYzIDExLjAwMDMgMy43MzcyQzExLjAwMDMgMy45OTQ3NyAxMS4yMDkxIDQuMjAzNTcgMTEuNDY2NyA0LjIwMzU3WiIvPgoJPGRlZnM+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyIiB4MT0iMS42NDQwOSIgeTE9IjEzLjU4NzkiIHgyPSIxNC42MTYiIHkyPSIyLjM1ODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNGRkRENTUiLz4KCQkJPHN0b3Agb2Zmc2V0PSIwLjUiIHN0b3AtY29sb3I9IiNGRjU0M0UiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQzgzN0FCIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIxLjY0NDA5IiB5MT0iMTMuNTg3OSIgeDI9IjE0LjYxNiIgeTI9IjIuMzU4NjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZGREQ1NSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjAuNSIgc3RvcC1jb2xvcj0iI0ZGNTQzRSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNDODM3QUIiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhciIgeDE9IjEuNjQ0MDkiIHkxPSIxMy41ODc5IiB4Mj0iMTQuNjE2IiB5Mj0iMi4zNTg2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjRkZERDU1Ii8+CgkJCTxzdG9wIG9mZnNldD0iMC41IiBzdG9wLWNvbG9yPSIjRkY1NDNFIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0M4MzdBQiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+Cgk8L2RlZnM+Cjwvc3ZnPg==
|
||||
1
public/images/socials-clutch-1767011178362.svg
Normal file
1
public/images/socials-clutch-1767011178362.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNSwtLjIpIj4KCQk8cGF0aCBkPSJNMTkuNDI4NiAxOS45NjgyQzE4IDIxLjExMSAxNiAyMS45NjgyIDE0IDIxLjk2ODJDOS40Mjg1OCAyMS45NjgyIDYuMjg1NzEgMTguNTM5NiA2LjI4NTcxIDEzLjk2ODJDNi4yODU3MSA5LjM5Njc2IDkuNDI4NTggNi4yNTM5IDE0IDYuMjUzOUMxNiA2LjI1MzkgMTggNi44MjUzMyAxOS40Mjg2IDguMjUzOUwyMC4yODU3IDkuMTExMDVMMjQuODU3MSA0LjgyNTMzTDIzLjcxNDMgMy45NjgxOUMyMS4xNDI5IDEuNjgyNDcgMTcuNzE0MyAwLjI1MzkwNiAxNCAwLjI1MzkwNkM2LjAwMDAxIDAuMjUzOTA2IDAgNi4yNTM5IDAgMTQuMjUzOUMwIDIyLjI1MzkgNi4wMDAwMSAyOC4yNTM5IDE0IDI4LjI1MzlDMTcuNzE0MyAyOC4yNTM5IDIxLjE0MjkgMjYuODI1MyAyMy43MTQzIDI0LjUzOTZMMjQuODU3MSAyMy42ODI1TDIwLjI4NTcgMTkuMTExTDE5LjQyODYgMTkuOTY4MloiLz4KCQk8cGF0aCBkPSJNMTMuNzE0IDE4LjgyNDVDMTYuMjM4NyAxOC44MjQ1IDE4LjI4NTQgMTYuNzc3OCAxOC4yODU0IDE0LjI1MzFDMTguMjg1NCAxMS43MjgzIDE2LjIzODcgOS42ODE2NCAxMy43MTQgOS42ODE2NEMxMS4xODkzIDkuNjgxNjQgOS4xNDI1OCAxMS43MjgzIDkuMTQyNTggMTQuMjUzMUM5LjE0MjU4IDE2Ljc3NzggMTEuMTg5MyAxOC44MjQ1IDEzLjcxNCAxOC44MjQ1WiIvPgoJPC9nPgo8L3N2Zz4=
|
||||
1
public/images/socials-github-1767011178240.svg
Normal file
1
public/images/socials-github-1767011178240.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0xNC4wMDE2IDAuNjI1MDAxQzYuMjY1NjcgMC42MjE4NzMgMCA2Ljg4NDQxIDAgMTQuNjE0MUMwIDIwLjcyNjQgMy45MTk1NiAyNS45MjIzIDkuMzc4MTcgMjcuODMwNUMxMC4xMTMzIDI4LjAxNSAxMC4wMDA3IDI3LjQ5MjYgMTAuMDAwNyAyNy4xMzZWMjQuNzExN0M1Ljc1NTc4IDI1LjIwOTEgNS41ODM3MyAyMi40IDUuMjk5MDcgMjEuOTMwOEM0LjcyMzQ5IDIwLjk0ODUgMy4zNjI3NSAyMC42OTgzIDMuNzY5NDEgMjAuMjI5MUM0LjczNjAxIDE5LjczMTcgNS43MjEzNyAyMC4zNTQyIDYuODYzMTQgMjIuMDQwM0M3LjY4ODk3IDIzLjI2MzQgOS4yOTk5NyAyMy4wNTY5IDEwLjExNjQgMjIuODUzNkMxMC4yOTQ3IDIyLjExODUgMTAuNjc2MyAyMS40NjE2IDExLjIwMTkgMjAuOTUxN0M2LjgwMzcxIDIwLjE2MzQgNC45NzA2MiAxNy40Nzk0IDQuOTcwNjIgMTQuMjg4N0M0Ljk3MDYyIDEyLjc0MDMgNS40ODA1MSAxMS4zMTcgNi40ODE1MSAxMC4xNjlDNS44NDMzNyA4LjI3NjQ0IDYuNTQwOTUgNi42NTYwNiA2LjYzNDc5IDYuNDE1MTlDOC40NTIyNCA2LjI1MjUzIDEwLjM0MTYgNy43MTY1IDEwLjQ4ODcgNy44MzIyNEMxMS41MjA5IDcuNTUzODQgMTIuNzAwMyA3LjQwNjgxIDE0LjAyMDMgNy40MDY4MUMxNS4zNDY3IDcuNDA2ODEgMTYuNTI5MSA3LjU2MDA5IDE3LjU3MDggNy44NDE2MkMxNy45MjQzIDcuNTcyNiAxOS42NzYgNi4zMTUwOSAyMS4zNjUyIDYuNDY4MzdDMjEuNDU1OSA2LjcwOTI0IDIyLjEzNzkgOC4yOTIwOCAyMS41MzczIDEwLjE1OTZDMjIuNTUwOCAxMS4zMTA3IDIzLjA2NjkgMTIuNzQ2NiAyMy4wNjY5IDE0LjI5ODFDMjMuMDY2OSAxNy40OTUxIDIxLjIyMTMgMjAuMTgyMSAxNi44MTA2IDIwLjk1NzlDMTcuMTg4NCAyMS4zMjk1IDE3LjQ4ODQgMjEuNzcyNSAxNy42OTMgMjIuMjYxM0MxNy44OTc3IDIyLjc1IDE4LjAwMjggMjMuMjc0NyAxOC4wMDI1IDIzLjgwNDVWMjcuMzIzN0MxOC4wMjc1IDI3LjYwNTIgMTguMDAyNSAyNy44ODM2IDE4LjQ3MTcgMjcuODgzNkMyNC4wMTE2IDI2LjAxNjEgMjggMjAuNzgyNyAyOCAxNC42MTcyQzI4IDYuODg0NDEgMjEuNzMxMiAwLjYyNTAwMSAxNC4wMDE2IDAuNjI1MDAxWiIvPgo8L3N2Zz4=
|
||||
1
public/images/socials-linkedin-1767011178113.svg
Normal file
1
public/images/socials-linkedin-1767011178113.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLS4yKSI+CgkJPHBhdGggZD0iTTI3Ljk5MzUgMjguMjUzNVYyOC4yNTIzSDI4LjAwMDVWMTcuOTgzM0MyOC4wMDA1IDEyLjk1OTcgMjYuOTE5IDkuMDg5ODQgMjEuMDQ2IDkuMDg5ODRDMTguMjIyNiA5LjA4OTg0IDE2LjMyOCAxMC42MzkyIDE1LjU1NDUgMTIuMTA4SDE1LjQ3MjhWOS41NTg4NEg5LjkwNDNWMjguMjUyM0gxNS43MDI2VjE4Ljk5NkMxNS43MDI2IDE2LjU1ODggMTYuMTY0NiAxNC4yMDIyIDE5LjE4MjggMTQuMjAyMkMyMi4xNTY3IDE0LjIwMjIgMjIuMjAxIDE2Ljk4MzUgMjIuMjAxIDE5LjE1MjNWMjguMjUzNUgyNy45OTM1WiIvPgoJCTxwYXRoIGQ9Ik0wLjQ2MTkxNCA5LjU2MDU1SDYuMjY3MjVWMjguMjU0SDAuNDYxOTE0VjkuNTYwNTVaIi8+CgkJPHBhdGggZD0iTTMuMzYyMzMgMC4yNTM5MDZDMS41MDYxNyAwLjI1MzkwNiAwIDEuNzYwMDcgMCAzLjYxNjI0QzAgNS40NzI0MSAxLjUwNjE3IDcuMDEwMDcgMy4zNjIzMyA3LjAxMDA3QzUuMjE4NSA3LjAxMDA3IDYuNzI0NjcgNS40NzI0MSA2LjcyNDY3IDMuNjE2MjRDNi43MjM1IDEuNzYwMDcgNS4yMTczMyAwLjI1MzkwNiAzLjM2MjMzIDAuMjUzOTA2VjAuMjUzOTA2WiIvPgoJPC9nPgo8L3N2Zz4K
|
||||
1
public/images/socials-telegram-1767011178103.svg
Normal file
1
public/images/socials-telegram-1767011178103.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyMSAyMSIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik04LjI4OTA1IDEyLjkwNDRMNy45NTgyMiAxNy41NTc4QzguNDMxNTYgMTcuNTU3OCA4LjYzNjU1IDE3LjM1NDQgOC44ODIzOSAxNy4xMTAzTDExLjEwMTYgMTQuOTg5NEwxNS42OTk5IDE4LjM1NjlDMTYuNTQzMiAxOC44MjY5IDE3LjEzNzQgMTguNTc5NCAxNy4zNjQ5IDE3LjU4MTFMMjAuMzgzMiAzLjQzNzc2TDIwLjM4NDEgMy40MzY5M0MyMC42NTE2IDIuMTkwMjYgMTkuOTMzMiAxLjcwMjc2IDE5LjExMTYgMi4wMDg1OUwxLjM2OTg5IDguODAxMDlDMC4xNTkwNTQgOS4yNzEwOSAwLjE3NzM4OCA5Ljk0NjA5IDEuMTY0MDUgMTAuMjUxOUw1LjY5OTg5IDExLjY2MjhMMTYuMjM1NyA1LjA3MDI2QzE2LjczMTYgNC43NDE5MyAxNy4xODI0IDQuOTIzNTkgMTYuODExNiA1LjI1MTkzTDguMjg5MDUgMTIuOTA0NFoiLz4KPC9zdmc+
|
||||
1
public/images/socials-upwork-1767011178110.svg
Normal file
1
public/images/socials-upwork-1767011178110.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNywwKSIgZD0iTTIyLjUwOTQgMTYuNzMyMkMyMS4yMjEyIDE2LjczMjIgMjAuMDE1NSAxNi4xODYyIDE4LjkxODQgMTUuMjk3M0wxOS4xODU1IDE0LjA0MzJMMTkuMTk3MyAxMy45OTc0QzE5LjQzNTUgMTIuNjYyIDIwLjE4OTYgMTAuNDE5NSAyMi41MDk0IDEwLjQxOTVDMjQuMjQ5MiAxMC40MTk1IDI1LjY2NDQgMTEuODM3MyAyNS42NjQ0IDEzLjU3ODRDMjUuNjU5MiAxNS4zMTQ0IDI0LjI0NCAxNi43MzIyIDIyLjUwOTQgMTYuNzMyMlpNMjIuNTA5NCA3LjIxODZDMTkuNTQ1NSA3LjIxODYgMTcuMjQ3OSA5LjE0Njk3IDE2LjMxNDUgMTIuMzE3N0MxNC44ODc2IDEwLjE3NDYgMTMuODA4OCA3LjYwMjE4IDEzLjE3NjUgNS40MzU1NUg5Ljk4NzQzVjEzLjc0NkM5Ljk4NzQzIDE1LjM4MzcgOC42NTM0MSAxNi43MTkxIDcuMDE2OTggMTYuNzE5MUM1LjM4MDU1IDE2LjcxOTEgNC4wNDc4NCAxNS4zODM3IDQuMDQ3ODQgMTMuNzQ2VjUuNDM1NTVIMC44NTc0NTlWMTMuNzQ2QzAuODQ1Njc3IDE3LjE0OTggMy42MTMyMSAxOS45NDM1IDcuMDExNzQgMTkuOTQzNUMxMC40MTAzIDE5Ljk0MzUgMTMuMTc3OCAxNy4xNDk4IDEzLjE3NzggMTMuNzQ2VjEyLjM1MThDMTMuNzk4MyAxMy42NDY1IDE0LjU1NzYgMTQuOTUzIDE1LjQ4MDYgMTYuMTE1NUwxMy41MjYgMjUuMzE0OUgxNi43OTI0TDE4LjIwNzUgMTguNjQyMkMxOS40NDg2IDE5LjQzODIgMjAuODc1NiAxOS45MzY5IDIyLjUxMiAxOS45MzY5QzI2LjAxIDE5LjkzNjkgMjguODU3NCAxNy4wNjczIDI4Ljg1NzQgMTMuNTY1M0MyOC44NTQ4IDEwLjA2OTkgMjYuMDA3NCA3LjIxODYgMjIuNTA5NCA3LjIxODZaIi8+Cjwvc3ZnPg==
|
||||
1
public/images/socials-whatsapp-1767011178103.svg
Normal file
1
public/images/socials-whatsapp-1767011178103.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyMSAyMSIgZmlsbD0iIzlFQTJBQSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0xMC40NDM5IDAuMjUzOTA2SDEwLjQzODlDNC45MjUxNiAwLjI1MzkwNiAwLjQ0MTQwNiA0LjczODkxIDAuNDQxNDA2IDEwLjI1MzlDMC40NDE0MDYgMTIuNDQxNCAxLjE0NjQxIDE0LjQ2ODkgMi4zNDUxNiAxNi4xMTUyTDEuMDk4OTEgMTkuODMwMkw0Ljk0MjY2IDE4LjYwMTRDNi41MjM5MSAxOS42NDg5IDguNDEwMTYgMjAuMjUzOSAxMC40NDM5IDIwLjI1MzlDMTUuOTU3NyAyMC4yNTM5IDIwLjQ0MTQgMTUuNzY3NyAyMC40NDE0IDEwLjI1MzlDMjAuNDQxNCA0Ljc0MDE2IDE1Ljk1NzcgMC4yNTM5MDYgMTAuNDQzOSAwLjI1MzkwNlpNMTYuMjYyNyAxNC4zNzUyQzE2LjAyMTQgMTUuMDU2NCAxNS4wNjM5IDE1LjYyMTQgMTQuMzAwMiAxNS43ODY0QzEzLjc3NzcgMTUuODk3NyAxMy4wOTUyIDE1Ljk4NjQgMTAuNzk3NyAxNS4wMzM5QzcuODU4OTEgMTMuODE2NCA1Ljk2NjQxIDEwLjgzMDIgNS44MTg5MSAxMC42MzY0QzUuNjc3NjYgMTAuNDQyNyA0LjYzMTQxIDkuMDU1MTYgNC42MzE0MSA3LjYyMDE2QzQuNjMxNDEgNi4xODUxNiA1LjM2MDE2IDUuNDg2NDEgNS42NTM5MSA1LjE4NjQxQzUuODk1MTYgNC45NDAxNiA2LjI5MzkxIDQuODI3NjYgNi42NzY0MSA0LjgyNzY2QzYuODAwMTYgNC44Mjc2NiA2LjkxMTQxIDQuODMzOTEgNy4wMTE0MSA0LjgzODkxQzcuMzA1MTYgNC44NTE0MSA3LjQ1MjY2IDQuODY4OTEgNy42NDY0MSA1LjMzMjY2QzcuODg3NjYgNS45MTM5MSA4LjQ3NTE2IDcuMzQ4OTEgOC41NDUxNiA3LjQ5NjQxQzguNjE2NDEgNy42NDM5MSA4LjY4NzY2IDcuODQzOTEgOC41ODc2NiA4LjAzNzY2QzguNDkzOTEgOC4yMzc2NiA4LjQxMTQxIDguMzI2NDEgOC4yNjM5MSA4LjQ5NjQxQzguMTE2NDEgOC42NjY0MSA3Ljk3NjQxIDguNzk2NDEgNy44Mjg5MSA4Ljk3ODkxQzcuNjkzOTEgOS4xMzc2NiA3LjU0MTQxIDkuMzA3NjYgNy43MTE0MSA5LjYwMTQxQzcuODgxNDEgOS44ODg5MSA4LjQ2ODkxIDEwLjg0NzcgOS4zMzM5MSAxMS42MTc3QzEwLjQ1MDIgMTIuNjExNCAxMS4zNTUyIDEyLjkyODkgMTEuNjc4OSAxMy4wNjM5QzExLjkyMDIgMTMuMTYzOSAxMi4yMDc3IDEzLjE0MDIgMTIuMzgzOSAxMi45NTI3QzEyLjYwNzcgMTIuNzExNCAxMi44ODM5IDEyLjMxMTQgMTMuMTY1MiAxMS45MTc3QzEzLjM2NTIgMTEuNjM1MiAxMy42MTc3IDExLjYwMDIgMTMuODgyNyAxMS43MDAyQzE0LjE1MjcgMTEuNzkzOSAxNS41ODE0IDEyLjUwMDIgMTUuODc1MiAxMi42NDY0QzE2LjE2ODkgMTIuNzkzOSAxNi4zNjI3IDEyLjg2MzkgMTYuNDMzOSAxMi45ODc3QzE2LjUwMzkgMTMuMTExNCAxNi41MDM5IDEzLjY5MjcgMTYuMjYyNyAxNC4zNzUyWiIvPgo8L3N2Zz4=
|
||||
1
public/images/typescript-1767011178113.svg
Normal file
1
public/images/typescript-1767011178113.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0aXRsZT5maWxlX3R5cGVfdHlwZXNjcmlwdDwvdGl0bGU+PHBhdGggZD0iTTIzLjgyNyw4LjI0M0E0LjQyNCw0LjQyNCwwLDAsMSwyNi4wNSw5LjUyNGE1Ljg1Myw1Ljg1MywwLDAsMSwuODUyLDEuMTQzYy4wMTEuMDQ1LTEuNTM0LDEuMDgzLTIuNDcxLDEuNjYyLS4wMzQuMDIzLS4xNjktLjEyNC0uMzIyLS4zNWEyLjAxNCwyLjAxNCwwLDAsMC0xLjY3LTFjLTEuMDc3LS4wNzQtMS43NzEuNDktMS43NjYsMS40MzNhMS4zLDEuMywwLDAsMCwuMTUzLjY2NmMuMjM3LjQ5LjY3Ny43ODQsMi4wNTksMS4zODMsMi41NDQsMS4wOTUsMy42MzYsMS44MTcsNC4zMSwyLjg0M2E1LjE1OCw1LjE1OCwwLDAsMSwuNDE2LDQuMzMzLDQuNzY0LDQuNzY0LDAsMCwxLTMuOTMyLDIuODE1LDEwLjksMTAuOSwwLDAsMS0yLjcwOC0uMDI4LDYuNTMxLDYuNTMxLDAsMCwxLTMuNjE2LTEuODg0LDYuMjc4LDYuMjc4LDAsMCwxLS45MjYtMS4zNzEsMi42NTUsMi42NTUsMCwwLDEsLjMyNy0uMjA4Yy4xNTgtLjA5Ljc1Ni0uNDM0LDEuMzItLjc2MUwxOS4xLDE5LjZsLjIxNC4zMTJhNC43NzEsNC43NzEsMCwwLDAsMS4zNSwxLjI5MiwzLjMsMy4zLDAsMCwwLDMuNDU4LS4xNzUsMS41NDUsMS41NDUsMCwwLDAsLjItMS45NzRjLS4yNzYtLjM5NS0uODQtLjcyNy0yLjQ0My0xLjQyMmE4LjgsOC44LDAsMCwxLTMuMzQ5LTIuMDU1LDQuNjg3LDQuNjg3LDAsMCwxLS45NzYtMS43NzcsNy4xMTYsNy4xMTYsMCwwLDEtLjA2Mi0yLjI2OCw0LjMzMiw0LjMzMiwwLDAsMSwzLjY0NC0zLjM3NEE5LDksMCwwLDEsMjMuODI3LDguMjQzWk0xNS40ODQsOS43MjZsLjAxMSwxLjQ1NGgtNC42M1YyNC4zMjhINy42VjExLjE4M0gyLjk3VjkuNzU1QTEzLjk4NiwxMy45ODYsMCwwLDEsMy4wMSw4LjI4OWMuMDE3LS4wMjMsMi44MzItLjAzNCw2LjI0NS0uMDI4bDYuMjExLjAxN1oiIHN0eWxlPSJmaWxsOiMwMDdhY2MiLz48L3N2Zz4=
|
||||
1
public/images/vadym-1767011179032.png
Normal file
1
public/images/vadym-1767011179032.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/valery-1767011178780.png
Normal file
1
public/images/valery-1767011178780.png
Normal file
File diff suppressed because one or more lines are too long
1
public/images/vuejs-1767011178113.svg
Normal file
1
public/images/vuejs-1767011178113.svg
Normal file
@@ -0,0 +1 @@
|
||||
PHN2ZyB3aWR0aD0iMjciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNyAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0yMS42ODgyIDAuNzc4MzJIMjYuODg3N0wxMy44ODg5IDIzLjIwMTJMMC44OTAxMzcgMC43NzgzMkgxMC44MzQyTDEzLjg4ODkgNS45Nzc4M0wxNi44Nzg2IDAuNzc4MzJIMjEuNjg4MloiIGZpbGw9IiMzZWIyN2YiLz4KPHBhdGggZD0iTTAuODkwMTM3IDAuNzc4MzJMMTMuODg4OSAyMy4yMDEyTDI2Ljg4NzcgMC43NzgzMkgyMS42ODgyTDEzLjg4ODkgMTQuMjMyMUw2LjAyNDY1IDAuNzc4MzJIMC44OTAxMzdaIiBmaWxsPSIjM2ViMjdmIi8+CjxwYXRoIGQ9Ik02LjAyNDQxIDAuNzc4MzJMMTMuODg4NyAxNC4yOTdMMjEuNjg4IDAuNzc4MzJIMTYuODc4NUwxMy44ODg3IDUuOTc3ODNMMTAuODM0IDAuNzc4MzJINi4wMjQ0MVoiIGZpbGw9IiMzMjQ3NWIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSIyNiIgaGVpZ2h0PSIyMi40NDMyIiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC44OTAxMzcgMC43NzgzMikiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K
|
||||
1
public/images/wordpress-1767011178106.svg
Normal file
1
public/images/wordpress-1767011178106.svg
Normal file
@@ -0,0 +1 @@
|
||||
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIGZpbGw9IiMwMDAwMDAiIHZlcnNpb249IjEuMSIgaWQ9IkNhcGFfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgDQoJIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDk2LjI0IDk2LjI0IiB4bWw6c3BhY2U9InByZXNlcnZlIg0KCT4NCjxnPg0KCTxwYXRoIGQ9Ik00OC4xMjIsMEMyMS41ODcsMCwwLjAwMSwyMS41ODUsMC4wMDEsNDguMTE4YzAsMjYuNTM1LDIxLjU4Nyw0OC4xMjIsNDguMTIsNDguMTIyYzI2LjUzMiwwLDQ4LjExNy0yMS41ODcsNDguMTE3LTQ4LjEyMg0KCQlDOTYuMjM5LDIxLjU4Niw3NC42NTQsMCw0OC4xMjIsMHogTTQuODU3LDQ4LjExOGMwLTYuMjcxLDEuMzQ1LTEyLjIyNywzLjc0Ni0xNy42MDZsMjAuNjM4LDU2LjU0NA0KCQlDMTQuODEsODAuMDQyLDQuODU3LDY1LjI0Myw0Ljg1Nyw0OC4xMTh6IE00OC4xMjIsOTEuMzg1Yy00LjI0NywwLTguMzQ2LTAuNjIzLTEyLjIyMi0xLjc2M0w0OC44OCw1MS45MDNsMTMuMzAxLDM2LjQzMw0KCQljMC4wODYsMC4yMTUsMC4xOTEsMC40MTEsMC4zMDgsMC41OTZDNTcuOTkyLDkwLjUxNCw1My4xNiw5MS4zODUsNDguMTIyLDkxLjM4NXogTTU0LjA4MywyNy44MzQNCgkJYzIuNjA0LTAuMTM3LDQuOTUzLTAuNDEyLDQuOTUzLTAuNDEyYzIuMzMtMC4yNzYsMi4wNTctMy43MDEtMC4yNzctMy41NjRjMCwwLTcuMDA3LDAuNTQ5LTExLjUzMiwwLjU0OQ0KCQljLTQuMjUsMC0xMS4zOTYtMC41NDktMTEuMzk2LTAuNTQ5Yy0yLjMzMi0wLjEzNy0yLjYwNCwzLjQyNy0wLjI3MywzLjU2NGMwLDAsMi4yMDgsMC4yNzUsNC41MzcsMC40MTJsNi43NCwxOC40NjlsLTkuNDY4LDI4LjM5NQ0KCQlMMjEuNjE1LDI3LjgzNWMyLjYwOC0wLjEzNiw0Ljk1Mi0wLjQxMiw0Ljk1Mi0wLjQxMmMyLjMzLTAuMjc1LDIuMDU1LTMuNzAyLTAuMjc4LTMuNTYyYzAsMC03LjAwNCwwLjU0OS0xMS41MywwLjU0OQ0KCQljLTAuODEzLDAtMS43Ny0wLjAyMS0yLjc4NC0wLjA1MkMxOS43MDksMTIuNjExLDMzLjAwOCw0Ljg1Niw0OC4xMjIsNC44NTZjMTEuMjY1LDAsMjEuNTE5LDQuMzA2LDI5LjIxNSwxMS4zNTcNCgkJYy0wLjE4Ny0wLjAxLTAuMzY4LTAuMDM1LTAuNTYyLTAuMDM1Yy00LjI0OCwwLTcuMjY0LDMuNzAyLTcuMjY0LDcuNjc5YzAsMy41NjQsMi4wNTUsNi41ODIsNC4yNDgsMTAuMTQ2DQoJCWMxLjY0NywyLjg4MiwzLjU2Nyw2LjU4NSwzLjU2NywxMS45MzJjMCwzLjcwNC0xLjQyMiw4LTMuMjkzLDEzLjk4NmwtNC4zMTUsMTQuNDIxTDU0LjA4MywyNy44MzR6IE02OS44NzEsODUuNTE2bDEzLjIxNS0zOC4yMDgNCgkJYzIuNDcxLTYuMTcxLDMuMjktMTEuMTA2LDMuMjktMTUuNDk3YzAtMS41OTEtMC4xMDQtMy4wNy0wLjI5Mi00LjQ0OWMzLjM4LDYuMTYzLDUuMzAzLDEzLjIzNiw1LjMwMSwyMC43NTgNCgkJQzkxLjM4NCw2NC4wOCw4Mi43MzIsNzguMDE2LDY5Ljg3MSw4NS41MTZ6Ii8+DQo8L2c+DQo8L3N2Zz4=
|
||||
1
public/images/yii2-1767011178420.svg
Normal file
1
public/images/yii2-1767011178420.svg
Normal file
File diff suppressed because one or more lines are too long
1237
public/index.html
Normal file
1237
public/index.html
Normal file
File diff suppressed because it is too large
Load Diff
36
src/App.js
Normal file
36
src/App.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import React, { useState } from 'react';
|
||||
import Header from './components/Header';
|
||||
import Hero from './components/Hero';
|
||||
import Stats from './components/Stats';
|
||||
import Services from './components/Services';
|
||||
import CaseStudies from './components/CaseStudies';
|
||||
import Testimonials from './components/Testimonials';
|
||||
import Team from './components/Team';
|
||||
import Contact from './components/Contact';
|
||||
import Footer from './components/Footer';
|
||||
import CookieConsent from './components/CookieConsent';
|
||||
|
||||
function App() {
|
||||
const [showCookieConsent, setShowCookieConsent] = useState(true);
|
||||
|
||||
return (
|
||||
<div className="App">
|
||||
<Header />
|
||||
<main>
|
||||
<Hero />
|
||||
<Stats />
|
||||
<Services />
|
||||
<CaseStudies />
|
||||
<Testimonials />
|
||||
<Team />
|
||||
<Contact />
|
||||
</main>
|
||||
<Footer />
|
||||
{showCookieConsent && (
|
||||
<CookieConsent onClose={() => setShowCookieConsent(false)} />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
112
src/components/CaseStudies.js
Normal file
112
src/components/CaseStudies.js
Normal file
@@ -0,0 +1,112 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const CaseStudies = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-white">
|
||||
<div className="container-custom">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Case Studies
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="bg-gradient-to-r from-blue-400 to-blue-600 rounded-2xl p-8 lg:p-12 text-white">
|
||||
<div className="grid lg:grid-cols-2 gap-8 items-center">
|
||||
<div>
|
||||
<h3 className="text-2xl lg:text-3xl font-bold mb-4">Dios</h3>
|
||||
<p className="text-blue-100 mb-6">
|
||||
A comprehensive platform for managing digital assets and workflows with advanced automation capabilities.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-4 mb-6">
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">React</span>
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">Node.js</span>
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">MongoDB</span>
|
||||
</div>
|
||||
<div className="flex items-center space-x-6">
|
||||
<div>
|
||||
<div className="text-2xl font-bold">$2,500</div>
|
||||
<div className="text-blue-200 text-sm">Project Value</div>
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-2xl font-bold">12w</div>
|
||||
<div className="text-blue-200 text-sm">Timeline</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-white/10 rounded-lg p-6 backdrop-blur-sm">
|
||||
<div className="w-full h-48 bg-white/20 rounded-lg flex items-center justify-center">
|
||||
<div className="text-white/60">Project Preview</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-white"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-center mb-16"
|
||||
>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Case Studies
|
||||
</h2>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.3, 0.8)}
|
||||
className="bg-gradient-to-r from-blue-400 to-blue-600 rounded-2xl p-8 lg:p-12 text-white"
|
||||
>
|
||||
<div className="grid lg:grid-cols-2 gap-8 items-center">
|
||||
<div>
|
||||
<h3 className="text-2xl lg:text-3xl font-bold mb-4">Dios</h3>
|
||||
<p className="text-blue-100 mb-6">
|
||||
A comprehensive platform for managing digital assets and workflows with advanced automation capabilities.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-4 mb-6">
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">React</span>
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">Node.js</span>
|
||||
<span className="bg-white/20 px-3 py-1 rounded-full text-sm">MongoDB</span>
|
||||
</div>
|
||||
<div className="flex items-center space-x-6">
|
||||
<div>
|
||||
<div className="text-2xl font-bold">$2,500</div>
|
||||
<div className="text-blue-200 text-sm">Project Value</div>
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-2xl font-bold">12w</div>
|
||||
<div className="text-blue-200 text-sm">Timeline</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-white/10 rounded-lg p-6 backdrop-blur-sm">
|
||||
<div className="w-full h-48 bg-white/20 rounded-lg flex items-center justify-center">
|
||||
<div className="text-white/60">Project Preview</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default CaseStudies;
|
||||
91
src/components/Contact.js
Normal file
91
src/components/Contact.js
Normal file
@@ -0,0 +1,91 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
import { Mail } from 'lucide-react';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Contact = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-gray-50">
|
||||
<div className="container-custom">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
How can we help? Let's talk
|
||||
</h2>
|
||||
<p className="text-gray-600 max-w-2xl mx-auto">
|
||||
Ready to start your next project? Get in touch with our team to discuss your requirements and get a custom quote.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="max-w-2xl mx-auto">
|
||||
<div className="bg-white rounded-2xl p-8 shadow-sm">
|
||||
<div className="flex items-center justify-center space-x-2 mb-6">
|
||||
<Mail className="w-5 h-5 text-primary-600" />
|
||||
<span className="text-gray-600">Feel free to drop us a note:</span>
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<a
|
||||
href="mailto:contact@sargas.io"
|
||||
className="text-primary-600 hover:text-primary-700 font-medium text-lg"
|
||||
>
|
||||
contact@sargas.io
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-gray-50"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-center mb-16"
|
||||
>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
How can we help? Let's talk
|
||||
</h2>
|
||||
<p className="text-gray-600 max-w-2xl mx-auto">
|
||||
Ready to start your next project? Get in touch with our team to discuss your requirements and get a custom quote.
|
||||
</p>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.3, 0.8)}
|
||||
className="max-w-2xl mx-auto"
|
||||
>
|
||||
<div className="bg-white rounded-2xl p-8 shadow-sm">
|
||||
<div className="flex items-center justify-center space-x-2 mb-6">
|
||||
<Mail className="w-5 h-5 text-primary-600" />
|
||||
<span className="text-gray-600">Feel free to drop us a note:</span>
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<a
|
||||
href="mailto:contact@sargas.io"
|
||||
className="text-primary-600 hover:text-primary-700 font-medium text-lg"
|
||||
>
|
||||
contact@sargas.io
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Contact;
|
||||
56
src/components/CookieConsent.js
Normal file
56
src/components/CookieConsent.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import React from 'react';
|
||||
import { X } from 'lucide-react';
|
||||
|
||||
const CookieConsent = ({ onClose }) => {
|
||||
const handleAccept = () => {
|
||||
// Handle cookie acceptance logic here
|
||||
onClose();
|
||||
};
|
||||
|
||||
const handleDeny = () => {
|
||||
// Handle cookie denial logic here
|
||||
onClose();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 bg-black/50 flex items-center justify-center p-4 z-50">
|
||||
<div className="bg-white rounded-2xl p-8 max-w-md w-full relative">
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="absolute top-4 right-4 text-gray-400 hover:text-gray-600"
|
||||
>
|
||||
<X className="w-5 h-5" />
|
||||
</button>
|
||||
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-4">
|
||||
This site uses cookies
|
||||
</h3>
|
||||
|
||||
<p className="text-gray-600 mb-4">
|
||||
We and selected third parties use cookies (or similar technologies) for technical purposes, to enhance and analyze site usage, to support our marketing efforts, and for other purposes described below.
|
||||
</p>
|
||||
|
||||
<p className="text-gray-600 mb-6">
|
||||
By clicking "Accept all", you agree to the storing of cookies on your device for these purposes.
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-3">
|
||||
<button
|
||||
onClick={handleDeny}
|
||||
className="btn-outline flex-1"
|
||||
>
|
||||
Deny
|
||||
</button>
|
||||
<button
|
||||
onClick={handleAccept}
|
||||
className="btn-secondary flex-1"
|
||||
>
|
||||
Accept all
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default CookieConsent;
|
||||
70
src/components/Footer.js
Normal file
70
src/components/Footer.js
Normal file
@@ -0,0 +1,70 @@
|
||||
import React from 'react';
|
||||
import { Github, Linkedin, ExternalLink } from 'lucide-react';
|
||||
|
||||
const Footer = () => {
|
||||
return (
|
||||
<footer className="bg-white border-t border-gray-200">
|
||||
<div className="container-custom py-12">
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{/* Logo & Description */}
|
||||
<div className="lg:col-span-2">
|
||||
<div className="flex items-center space-x-2 mb-4">
|
||||
<div className="w-8 h-8 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center">
|
||||
<span className="text-white font-bold text-sm">S</span>
|
||||
</div>
|
||||
<span className="text-xl font-bold text-gray-900">Sargas</span>
|
||||
</div>
|
||||
<p className="text-gray-600 mb-6 max-w-md">
|
||||
AI-powered web and mobile development solutions delivered in 12 weeks. Transform your ideas into reality with our expert team.
|
||||
</p>
|
||||
<div className="flex space-x-4">
|
||||
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
|
||||
<Github className="w-5 h-5" />
|
||||
</a>
|
||||
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
|
||||
<Linkedin className="w-5 h-5" />
|
||||
</a>
|
||||
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
|
||||
<ExternalLink className="w-5 h-5" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Menu */}
|
||||
<div>
|
||||
<h3 className="font-semibold text-gray-900 mb-4">Menu</h3>
|
||||
<ul className="space-y-3">
|
||||
<li><a href="#case-studies" className="text-gray-600 hover:text-gray-900 transition-colors">Case Studies</a></li>
|
||||
<li><a href="#blog" className="text-gray-600 hover:text-gray-900 transition-colors">Blog</a></li>
|
||||
<li><a href="#contacts" className="text-gray-600 hover:text-gray-900 transition-colors">Contacts</a></li>
|
||||
<li><a href="#about" className="text-gray-600 hover:text-gray-900 transition-colors">About Us</a></li>
|
||||
<li><a href="#faq" className="text-gray-600 hover:text-gray-900 transition-colors">FAQ</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Services */}
|
||||
<div>
|
||||
<h3 className="font-semibold text-gray-900 mb-4">Services</h3>
|
||||
<ul className="space-y-3">
|
||||
<li><a href="#web-development" className="text-gray-600 hover:text-gray-900 transition-colors">Web Development</a></li>
|
||||
<li><a href="#mobile-development" className="text-gray-600 hover:text-gray-900 transition-colors">Mobile Development</a></li>
|
||||
<li><a href="#support" className="text-gray-600 hover:text-gray-900 transition-colors">Support and Maintenance</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="border-t border-gray-200 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center">
|
||||
<div className="text-gray-500 text-sm mb-4 md:mb-0">
|
||||
© 2024 Sargas. All rights reserved.
|
||||
</div>
|
||||
<div className="flex space-x-6 text-sm">
|
||||
<a href="#privacy" className="text-gray-500 hover:text-gray-700 transition-colors">Privacy Policy</a>
|
||||
<a href="#terms" className="text-gray-500 hover:text-gray-700 transition-colors">Terms of Use</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
};
|
||||
|
||||
export default Footer;
|
||||
101
src/components/Header.js
Normal file
101
src/components/Header.js
Normal file
@@ -0,0 +1,101 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Menu, X, ChevronDown, Star } from 'lucide-react';
|
||||
|
||||
const Header = () => {
|
||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||
const [isServicesOpen, setIsServicesOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<header className="fixed top-0 left-0 right-0 bg-white/95 backdrop-blur-sm border-b border-gray-200 z-50">
|
||||
<div className="container-custom">
|
||||
<div className="flex items-center justify-between h-16">
|
||||
{/* Logo */}
|
||||
<div className="flex items-center">
|
||||
<div className="flex items-center space-x-2">
|
||||
<div className="w-8 h-8 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center">
|
||||
<span className="text-white font-bold text-sm">S</span>
|
||||
</div>
|
||||
<span className="text-xl font-bold text-gray-900">Sargas</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Desktop Navigation */}
|
||||
<nav className="hidden lg:flex items-center space-x-8">
|
||||
<div className="relative">
|
||||
<button
|
||||
className="flex items-center space-x-1 text-gray-700 hover:text-gray-900 transition-colors"
|
||||
onMouseEnter={() => setIsServicesOpen(true)}
|
||||
onMouseLeave={() => setIsServicesOpen(false)}
|
||||
>
|
||||
<span>Services</span>
|
||||
<ChevronDown className="w-4 h-4" />
|
||||
</button>
|
||||
{isServicesOpen && (
|
||||
<div
|
||||
className="absolute top-full left-0 mt-2 w-64 bg-white rounded-lg shadow-lg border border-gray-200 py-2"
|
||||
onMouseEnter={() => setIsServicesOpen(true)}
|
||||
onMouseLeave={() => setIsServicesOpen(false)}
|
||||
>
|
||||
<a href="#web-development" className="block px-4 py-2 text-gray-700 hover:bg-gray-50">Web Development</a>
|
||||
<a href="#mobile-development" className="block px-4 py-2 text-gray-700 hover:bg-gray-50">Mobile Development</a>
|
||||
<a href="#support" className="block px-4 py-2 text-gray-700 hover:bg-gray-50">Support and Maintenance</a>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<a href="#portfolio" className="text-gray-700 hover:text-gray-900 transition-colors">Portfolio</a>
|
||||
<a href="#about" className="text-gray-700 hover:text-gray-900 transition-colors">About</a>
|
||||
<a href="#contacts" className="text-gray-700 hover:text-gray-900 transition-colors">Contacts</a>
|
||||
</nav>
|
||||
|
||||
{/* Clutch Rating & CTA */}
|
||||
<div className="hidden lg:flex items-center space-x-4">
|
||||
<div className="flex items-center space-x-2 bg-gray-900 text-white px-3 py-2 rounded-lg">
|
||||
<div className="w-6 h-6 bg-orange-500 rounded flex items-center justify-center">
|
||||
<span className="text-white font-bold text-xs">C</span>
|
||||
</div>
|
||||
<div className="flex items-center space-x-1">
|
||||
<span className="font-semibold">4.9</span>
|
||||
<div className="flex">
|
||||
{[...Array(5)].map((_, i) => (
|
||||
<Star key={i} className="w-3 h-3 fill-yellow-400 text-yellow-400" />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span className="text-xs text-gray-500">Based on 6 Clutch reviews</span>
|
||||
<button className="btn-primary">
|
||||
Book a Call
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Mobile Menu Button */}
|
||||
<button
|
||||
className="lg:hidden p-2"
|
||||
onClick={() => setIsMenuOpen(!isMenuOpen)}
|
||||
>
|
||||
{isMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Mobile Menu */}
|
||||
{isMenuOpen && (
|
||||
<div className="lg:hidden bg-white border-t border-gray-200">
|
||||
<div className="container-custom py-4">
|
||||
<div className="flex flex-col space-y-4">
|
||||
<a href="#services" className="text-gray-700 hover:text-gray-900">Services</a>
|
||||
<a href="#portfolio" className="text-gray-700 hover:text-gray-900">Portfolio</a>
|
||||
<a href="#about" className="text-gray-700 hover:text-gray-900">About</a>
|
||||
<a href="#contacts" className="text-gray-700 hover:text-gray-900">Contacts</a>
|
||||
<button className="btn-primary w-full mt-4">
|
||||
Book a Call
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</header>
|
||||
);
|
||||
};
|
||||
|
||||
export default Header;
|
||||
169
src/components/Hero.js
Normal file
169
src/components/Hero.js
Normal file
@@ -0,0 +1,169 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Hero = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="pt-24 pb-16 bg-gradient-to-br from-gray-50 to-gray-100">
|
||||
<div className="container-custom">
|
||||
<div className="max-w-4xl mx-auto text-center">
|
||||
<h1 className="text-4xl lg:text-6xl font-bold mb-6">
|
||||
<span className="text-gradient">AI-powered</span>
|
||||
<br />
|
||||
<span className="text-gray-900">web and mobile</span>
|
||||
<br />
|
||||
<span className="text-gradient">in 12 weeks</span>
|
||||
</h1>
|
||||
|
||||
<div className="flex items-center justify-center space-x-2 mb-8">
|
||||
<span className="text-gray-600">Powered by</span>
|
||||
<div className="flex items-center space-x-1">
|
||||
<div className="w-6 h-6 bg-red-500 rounded-full flex items-center justify-center">
|
||||
<span className="text-white text-xs font-bold">n</span>
|
||||
</div>
|
||||
<span className="font-semibold text-gray-900">n8n</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center mb-12">
|
||||
<button className="btn-primary">
|
||||
Start Discovery
|
||||
</button>
|
||||
<button className="btn-secondary flex items-center justify-center space-x-2">
|
||||
<span>Portfolio Showcase</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-4 mb-16">
|
||||
{[
|
||||
{ name: 'Telegram', color: 'bg-blue-500' },
|
||||
{ name: 'Instagram', color: 'bg-pink-500' },
|
||||
{ name: 'Whatsapp', color: 'bg-green-500' }
|
||||
].map((platform, index) => (
|
||||
<div key={platform.name} className="tech-badge">
|
||||
<div className={`w-4 h-4 ${platform.color} rounded-full`}></div>
|
||||
<span>{platform.name}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-4">
|
||||
{[
|
||||
{ name: '#nestjs', color: 'text-red-500' },
|
||||
{ name: '#mysql', color: 'text-blue-500' },
|
||||
{ name: '#mongodb', color: 'text-green-500' },
|
||||
{ name: '#nginx', color: 'text-green-600' },
|
||||
{ name: '#redis', color: 'text-red-600' },
|
||||
{ name: '#typescript', color: 'text-blue-600' }
|
||||
].map((tech, index) => (
|
||||
<div key={tech.name} className="tech-badge">
|
||||
<span className={`font-mono text-sm ${tech.color}`}>{tech.name}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="pt-24 pb-16 bg-gradient-to-br from-gray-50 to-gray-100"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<div className="max-w-4xl mx-auto text-center">
|
||||
<motion.h1
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-4xl lg:text-6xl font-bold mb-6"
|
||||
>
|
||||
<span className="text-gradient">AI-powered</span>
|
||||
<br />
|
||||
<span className="text-gray-900">web and mobile</span>
|
||||
<br />
|
||||
<span className="text-gradient">in 12 weeks</span>
|
||||
</motion.h1>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.3, 0.8)}
|
||||
className="flex items-center justify-center space-x-2 mb-8"
|
||||
>
|
||||
<span className="text-gray-600">Powered by</span>
|
||||
<div className="flex items-center space-x-1">
|
||||
<div className="w-6 h-6 bg-red-500 rounded-full flex items-center justify-center">
|
||||
<span className="text-white text-xs font-bold">n</span>
|
||||
</div>
|
||||
<span className="font-semibold text-gray-900">n8n</span>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.4, 0.8)}
|
||||
className="flex flex-col sm:flex-row gap-4 justify-center mb-12"
|
||||
>
|
||||
<button className="btn-primary">
|
||||
Start Discovery
|
||||
</button>
|
||||
<button className="btn-secondary flex items-center justify-center space-x-2">
|
||||
<span>Portfolio Showcase</span>
|
||||
</button>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.5, 0.8)}
|
||||
className="flex flex-wrap justify-center gap-4 mb-16"
|
||||
>
|
||||
{[
|
||||
{ name: 'Telegram', color: 'bg-blue-500' },
|
||||
{ name: 'Instagram', color: 'bg-pink-500' },
|
||||
{ name: 'Whatsapp', color: 'bg-green-500' }
|
||||
].map((platform, index) => (
|
||||
<motion.div
|
||||
key={platform.name}
|
||||
{...fadeUpPreset(0.6 + index * 0.1, 0.6)}
|
||||
className="tech-badge"
|
||||
>
|
||||
<div className={`w-4 h-4 ${platform.color} rounded-full`}></div>
|
||||
<span>{platform.name}</span>
|
||||
</motion.div>
|
||||
))}
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.7, 0.8)}
|
||||
className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-4"
|
||||
>
|
||||
{[
|
||||
{ name: '#nestjs', color: 'text-red-500' },
|
||||
{ name: '#mysql', color: 'text-blue-500' },
|
||||
{ name: '#mongodb', color: 'text-green-500' },
|
||||
{ name: '#nginx', color: 'text-green-600' },
|
||||
{ name: '#redis', color: 'text-red-600' },
|
||||
{ name: '#typescript', color: 'text-blue-600' }
|
||||
].map((tech, index) => (
|
||||
<motion.div
|
||||
key={tech.name}
|
||||
{...fadeUpPreset(0.8 + index * 0.05, 0.6)}
|
||||
className="tech-badge"
|
||||
>
|
||||
<span className={`font-mono text-sm ${tech.color}`}>{tech.name}</span>
|
||||
</motion.div>
|
||||
))}
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Hero;
|
||||
120
src/components/Services.js
Normal file
120
src/components/Services.js
Normal file
@@ -0,0 +1,120 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Services = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-gray-50">
|
||||
<div className="container-custom">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Explore our services
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid lg:grid-cols-2 gap-16">
|
||||
{/* Web Development */}
|
||||
<div className="text-center">
|
||||
<h3 className="text-2xl font-bold text-gray-900 mb-4">Web Development</h3>
|
||||
<p className="text-gray-600 mb-8">Custom web applications built with modern technologies</p>
|
||||
<div className="w-64 h-48 mx-auto bg-gradient-to-br from-blue-100 to-purple-100 rounded-lg flex items-center justify-center">
|
||||
<div className="w-32 h-32 bg-white rounded-lg shadow-lg flex items-center justify-center">
|
||||
<div className="w-16 h-16 bg-blue-500 rounded-lg"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Mobile Development */}
|
||||
<div className="text-center">
|
||||
<h3 className="text-2xl font-bold text-gray-900 mb-4">MOBILE DEVELOPMENT</h3>
|
||||
<p className="text-gray-600 mb-8">Native and cross-platform mobile applications</p>
|
||||
<div className="w-64 h-48 mx-auto flex items-center justify-center">
|
||||
<div className="w-32 h-48 bg-gradient-to-b from-blue-500 to-blue-600 rounded-2xl shadow-lg flex items-center justify-center">
|
||||
<div className="w-24 h-40 bg-white rounded-xl"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="text-center mt-16">
|
||||
<div className="bg-white rounded-2xl p-8 shadow-sm">
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-4">
|
||||
Get the same high-quality service for a smaller task
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-gray-50"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-center mb-16"
|
||||
>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Explore our services
|
||||
</h2>
|
||||
</motion.div>
|
||||
|
||||
<div className="grid lg:grid-cols-2 gap-16">
|
||||
{/* Web Development */}
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.3, 0.8)}
|
||||
className="text-center"
|
||||
>
|
||||
<h3 className="text-2xl font-bold text-gray-900 mb-4">Web Development</h3>
|
||||
<p className="text-gray-600 mb-8">Custom web applications built with modern technologies</p>
|
||||
<div className="w-64 h-48 mx-auto bg-gradient-to-br from-blue-100 to-purple-100 rounded-lg flex items-center justify-center">
|
||||
<div className="w-32 h-32 bg-white rounded-lg shadow-lg flex items-center justify-center">
|
||||
<div className="w-16 h-16 bg-blue-500 rounded-lg"></div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
{/* Mobile Development */}
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.4, 0.8)}
|
||||
className="text-center"
|
||||
>
|
||||
<h3 className="text-2xl font-bold text-gray-900 mb-4">MOBILE DEVELOPMENT</h3>
|
||||
<p className="text-gray-600 mb-8">Native and cross-platform mobile applications</p>
|
||||
<div className="w-64 h-48 mx-auto flex items-center justify-center">
|
||||
<div className="w-32 h-48 bg-gradient-to-b from-blue-500 to-blue-600 rounded-2xl shadow-lg flex items-center justify-center">
|
||||
<div className="w-24 h-40 bg-white rounded-xl"></div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.5, 0.8)}
|
||||
className="text-center mt-16"
|
||||
>
|
||||
<div className="bg-white rounded-2xl p-8 shadow-sm">
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-4">
|
||||
Get the same high-quality service for a smaller task
|
||||
</h3>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Services;
|
||||
69
src/components/Stats.js
Normal file
69
src/components/Stats.js
Normal file
@@ -0,0 +1,69 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Stats = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
const stats = [
|
||||
{ value: '92%', label: 'Client satisfaction rate' },
|
||||
{ value: '50+', label: 'Completed projects' },
|
||||
{ value: '30k+', label: 'Lines of code written' },
|
||||
{ value: '100%', label: 'On-time delivery' }
|
||||
];
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-white">
|
||||
<div className="container-custom">
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{stats.map((stat, index) => (
|
||||
<div key={index} className="text-center">
|
||||
<div className="text-3xl lg:text-4xl font-bold text-gray-900 mb-2">
|
||||
{stat.value}
|
||||
</div>
|
||||
<div className="text-gray-600">
|
||||
{stat.label}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-white"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{stats.map((stat, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
{...fadeUpPreset(index * 0.1, 0.8)}
|
||||
className="text-center"
|
||||
>
|
||||
<div className="text-3xl lg:text-4xl font-bold text-gray-900 mb-2">
|
||||
{stat.value}
|
||||
</div>
|
||||
<div className="text-gray-600">
|
||||
{stat.label}
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Stats;
|
||||
101
src/components/Team.js
Normal file
101
src/components/Team.js
Normal file
@@ -0,0 +1,101 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Team = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
const teamMembers = [
|
||||
{
|
||||
name: "Alex Rodriguez",
|
||||
role: "Lead Developer",
|
||||
image: "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&h=400&fit=crop&crop=face"
|
||||
},
|
||||
{
|
||||
name: "Maria Chen",
|
||||
role: "UI/UX Designer",
|
||||
image: "https://images.unsplash.com/photo-1494790108755-2616b612b786?w=400&h=400&fit=crop&crop=face"
|
||||
},
|
||||
{
|
||||
name: "David Kim",
|
||||
role: "Mobile Developer",
|
||||
image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop&crop=face"
|
||||
}
|
||||
];
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-white">
|
||||
<div className="container-custom">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Sargas Team
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
{teamMembers.map((member, index) => (
|
||||
<div key={index} className="text-center">
|
||||
<div className="w-32 h-32 mx-auto mb-4 bg-gray-200 rounded-full overflow-hidden">
|
||||
<img
|
||||
src={member.image}
|
||||
alt={member.name}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-2">{member.name}</h3>
|
||||
<p className="text-gray-600">{member.role}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-white"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-center mb-16"
|
||||
>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Sargas Team
|
||||
</h2>
|
||||
</motion.div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
{teamMembers.map((member, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
{...fadeUpPreset(0.3 + index * 0.1, 0.8)}
|
||||
className="text-center"
|
||||
>
|
||||
<div className="w-32 h-32 mx-auto mb-4 bg-gray-200 rounded-full overflow-hidden">
|
||||
<img
|
||||
src={member.image}
|
||||
alt={member.name}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-2">{member.name}</h3>
|
||||
<p className="text-gray-600">{member.role}</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Team;
|
||||
101
src/components/Testimonials.js
Normal file
101
src/components/Testimonials.js
Normal file
@@ -0,0 +1,101 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
import { Star } from 'lucide-react';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, amount: 0.2 },
|
||||
transition: { delay, duration, ease: "easeOut" }
|
||||
});
|
||||
|
||||
const Testimonials = () => {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
const testimonials = [
|
||||
{
|
||||
name: "John Smith",
|
||||
company: "Tech Startup",
|
||||
rating: 5,
|
||||
text: "Sargas delivered an exceptional web application that exceeded our expectations. Their AI-powered approach saved us months of development time."
|
||||
},
|
||||
{
|
||||
name: "Sarah Johnson",
|
||||
company: "E-commerce Platform",
|
||||
rating: 5,
|
||||
text: "The mobile app they built for us has been a game-changer. Professional, efficient, and delivered exactly on time."
|
||||
}
|
||||
];
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<section className="section-padding bg-gray-50">
|
||||
<div className="container-custom">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Testimonials
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid lg:grid-cols-2 gap-8">
|
||||
{testimonials.map((testimonial, index) => (
|
||||
<div key={index} className="bg-white rounded-2xl p-8 shadow-sm">
|
||||
<div className="flex mb-4">
|
||||
{[...Array(testimonial.rating)].map((_, i) => (
|
||||
<Star key={i} className="w-5 h-5 fill-yellow-400 text-yellow-400" />
|
||||
))}
|
||||
</div>
|
||||
<p className="text-gray-600 mb-6">"{testimonial.text}"</p>
|
||||
<div>
|
||||
<div className="font-semibold text-gray-900">{testimonial.name}</div>
|
||||
<div className="text-gray-500 text-sm">{testimonial.company}</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.section
|
||||
{...fadeUpPreset(0.1, 0.8)}
|
||||
className="section-padding bg-gray-50"
|
||||
>
|
||||
<div className="container-custom">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.8)}
|
||||
className="text-center mb-16"
|
||||
>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
|
||||
Testimonials
|
||||
</h2>
|
||||
</motion.div>
|
||||
|
||||
<div className="grid lg:grid-cols-2 gap-8">
|
||||
{testimonials.map((testimonial, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
{...fadeUpPreset(0.3 + index * 0.1, 0.8)}
|
||||
className="bg-white rounded-2xl p-8 shadow-sm"
|
||||
>
|
||||
<div className="flex mb-4">
|
||||
{[...Array(testimonial.rating)].map((_, i) => (
|
||||
<Star key={i} className="w-5 h-5 fill-yellow-400 text-yellow-400" />
|
||||
))}
|
||||
</div>
|
||||
<p className="text-gray-600 mb-6">"{testimonial.text}"</p>
|
||||
<div>
|
||||
<div className="font-semibold text-gray-900">{testimonial.name}</div>
|
||||
<div className="text-gray-500 text-sm">{testimonial.company}</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
};
|
||||
|
||||
export default Testimonials;
|
||||
58
src/index.css
Normal file
58
src/index.css
Normal file
@@ -0,0 +1,58 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
* {
|
||||
@apply border-border;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-gray-50 text-gray-900 font-sans;
|
||||
font-feature-settings: "rlig" 1, "calt" 1;
|
||||
}
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
.btn-primary {
|
||||
@apply bg-primary-600 hover:bg-primary-700 text-white font-medium px-6 py-3 rounded-lg transition-colors duration-200;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
@apply bg-dark-800 hover:bg-dark-700 text-white font-medium px-6 py-3 rounded-lg transition-colors duration-200;
|
||||
}
|
||||
|
||||
.btn-outline {
|
||||
@apply border border-gray-300 hover:border-gray-400 text-gray-700 hover:text-gray-900 font-medium px-6 py-3 rounded-lg transition-colors duration-200;
|
||||
}
|
||||
|
||||
.section-padding {
|
||||
@apply py-16 lg:py-24;
|
||||
}
|
||||
|
||||
.container-custom {
|
||||
@apply max-w-7xl mx-auto px-4 sm:px-6 lg:px-8;
|
||||
}
|
||||
|
||||
.tech-badge {
|
||||
@apply inline-flex items-center gap-2 px-4 py-2 bg-white rounded-full shadow-sm border border-gray-200 text-sm font-medium text-gray-700;
|
||||
}
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.text-gradient {
|
||||
@apply bg-gradient-to-r from-primary-600 to-primary-500 bg-clip-text text-transparent;
|
||||
}
|
||||
|
||||
.shadow-custom {
|
||||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.shadow-custom-lg {
|
||||
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
}
|
||||
13
src/index.js
Normal file
13
src/index.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import React from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
|
||||
const container = document.getElementById('root');
|
||||
const root = createRoot(container);
|
||||
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
);
|
||||
61
tailwind.config.js
Normal file
61
tailwind.config.js
Normal file
@@ -0,0 +1,61 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./src/**/*.{js,jsx,ts,tsx}",
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: {
|
||||
50: '#eff6ff',
|
||||
100: '#dbeafe',
|
||||
200: '#bfdbfe',
|
||||
300: '#93c5fd',
|
||||
400: '#60a5fa',
|
||||
500: '#3b82f6',
|
||||
600: '#2563eb',
|
||||
700: '#1d4ed8',
|
||||
800: '#1e40af',
|
||||
900: '#1e3a8a',
|
||||
},
|
||||
dark: {
|
||||
50: '#f8fafc',
|
||||
100: '#f1f5f9',
|
||||
200: '#e2e8f0',
|
||||
300: '#cbd5e1',
|
||||
400: '#94a3b8',
|
||||
500: '#64748b',
|
||||
600: '#475569',
|
||||
700: '#334155',
|
||||
800: '#1e293b',
|
||||
900: '#0f172a',
|
||||
},
|
||||
accent: {
|
||||
red: '#ef4444',
|
||||
green: '#22c55e',
|
||||
blue: '#3b82f6',
|
||||
purple: '#8b5cf6',
|
||||
orange: '#f97316',
|
||||
}
|
||||
},
|
||||
fontFamily: {
|
||||
sans: ['Inter', 'system-ui', 'sans-serif'],
|
||||
},
|
||||
animation: {
|
||||
'fade-in': 'fadeIn 0.5s ease-in-out',
|
||||
'slide-up': 'slideUp 0.6s ease-out',
|
||||
},
|
||||
keyframes: {
|
||||
fadeIn: {
|
||||
'0%': { opacity: '0' },
|
||||
'100%': { opacity: '1' },
|
||||
},
|
||||
slideUp: {
|
||||
'0%': { opacity: '0', transform: 'translateY(20px)' },
|
||||
'100%': { opacity: '1', transform: 'translateY(0)' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
5
vercel.json
Normal file
5
vercel.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"installCommand": "npm install",
|
||||
"buildCommand": "CI=false npm run build",
|
||||
"outputDirectory": "build"
|
||||
}
|
||||
Reference in New Issue
Block a user