Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe468885b0 | ||
|
|
3ee54504cc | ||
|
|
4fb64cfb88 | ||
|
|
3b7d973d27 | ||
|
|
f3a3931c51 | ||
|
|
3a551728c8 | ||
|
|
7732ce80e5 | ||
|
|
0cd2bf4c38 | ||
|
|
a21cca3df9 | ||
|
|
79d1865dc0 | ||
|
|
13212f6170 | ||
|
|
598395aebe | ||
|
|
9bc484e1da | ||
|
|
b226c82db6 | ||
|
|
2b89661b02 | ||
|
|
8278d62e1c | ||
|
|
72915f515d | ||
|
|
fe01646473 | ||
|
|
95f86f13ba | ||
|
|
ae34843303 | ||
|
|
0f32c5441d | ||
|
|
94908040dd | ||
|
|
74769f78ce | ||
|
|
d5a14354ec | ||
|
|
c5d921e470 | ||
|
|
3cbf508664 |
+11
@@ -0,0 +1,11 @@
|
|||||||
|
FROM node:18-alpine
|
||||||
|
|
||||||
|
WORKDIR /lk-results/
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN npm install
|
||||||
|
RUN npm run build
|
||||||
|
RUN npm install -g
|
||||||
|
|
||||||
|
CMD ["serve", "-s", "dist"]
|
||||||
+1
-1
@@ -13,7 +13,7 @@
|
|||||||
></script>
|
></script>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link rel="icon" href="./logo.ico" />
|
<link rel="icon" href="./logo.ico" />
|
||||||
<title>LK Solutions</title>
|
<title>LK Results</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
Generated
+136
-18
@@ -11,11 +11,14 @@
|
|||||||
"@emailjs/browser": "^4.3.3",
|
"@emailjs/browser": "^4.3.3",
|
||||||
"@headlessui/react": "^1.7.18",
|
"@headlessui/react": "^1.7.18",
|
||||||
"@heroicons/react": "^2.1.3",
|
"@heroicons/react": "^2.1.3",
|
||||||
"emailjs-com": "^3.2.0",
|
"i18next": "^23.11.5",
|
||||||
|
"i18next-browser-languagedetector": "^8.0.0",
|
||||||
|
"i18next-http-backend": "^2.5.2",
|
||||||
"localforage": "^1.10.0",
|
"localforage": "^1.10.0",
|
||||||
"match-sorter": "^6.3.4",
|
"match-sorter": "^6.3.4",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
|
"react-i18next": "^14.1.2",
|
||||||
"react-icons": "^5.0.1",
|
"react-icons": "^5.0.1",
|
||||||
"react-router-dom": "^6.22.3",
|
"react-router-dom": "^6.22.3",
|
||||||
"react-toastify": "^10.0.5",
|
"react-toastify": "^10.0.5",
|
||||||
@@ -1810,12 +1813,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces": {
|
"node_modules/braces": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fill-range": "^7.0.1"
|
"fill-range": "^7.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
@@ -1991,6 +1995,14 @@
|
|||||||
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
|
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/cross-fetch": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
|
||||||
|
"dependencies": {
|
||||||
|
"node-fetch": "^2.6.12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||||
@@ -2094,16 +2106,6 @@
|
|||||||
"integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==",
|
"integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emailjs-com": {
|
|
||||||
"version": "3.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/emailjs-com/-/emailjs-com-3.2.0.tgz",
|
|
||||||
"integrity": "sha512-Prbz3E1usiAwGjMNYRv6EsJ5c373cX7/AGnZQwOfrpNJrygQJ15+E9OOq4pU8yC977Z5xMetRfc3WmDX6RcjAA==",
|
|
||||||
"deprecated": "The SDK name changed to @emailjs/browser",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
"version": "9.2.2",
|
"version": "9.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
||||||
@@ -2516,10 +2518,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fill-range": {
|
"node_modules/fill-range": {
|
||||||
"version": "7.0.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"to-regex-range": "^5.0.1"
|
"to-regex-range": "^5.0.1"
|
||||||
},
|
},
|
||||||
@@ -2740,6 +2743,52 @@
|
|||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/html-parse-stringify": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
|
||||||
|
"dependencies": {
|
||||||
|
"void-elements": "3.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/i18next": {
|
||||||
|
"version": "23.11.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz",
|
||||||
|
"integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com/i18next.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.23.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/i18next-browser-languagedetector": {
|
||||||
|
"version": "8.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz",
|
||||||
|
"integrity": "sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.23.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/i18next-http-backend": {
|
||||||
|
"version": "2.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
|
||||||
|
"integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-fetch": "4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ignore": {
|
"node_modules/ignore": {
|
||||||
"version": "5.3.1",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
||||||
@@ -2854,6 +2903,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.12.0"
|
"node": ">=0.12.0"
|
||||||
}
|
}
|
||||||
@@ -3149,6 +3199,25 @@
|
|||||||
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
|
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/node-fetch": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.14",
|
"version": "2.0.14",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
|
||||||
@@ -3572,6 +3641,27 @@
|
|||||||
"react": "^18.2.0"
|
"react": "^18.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-i18next": {
|
||||||
|
"version": "14.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.2.tgz",
|
||||||
|
"integrity": "sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.23.9",
|
||||||
|
"html-parse-stringify": "^3.0.1"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"i18next": ">= 23.2.3",
|
||||||
|
"react": ">= 16.8.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"react-dom": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-native": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-icons": {
|
"node_modules/react-icons": {
|
||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz",
|
||||||
@@ -4117,6 +4207,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-number": "^7.0.0"
|
"is-number": "^7.0.0"
|
||||||
},
|
},
|
||||||
@@ -4124,6 +4215,11 @@
|
|||||||
"node": ">=8.0"
|
"node": ">=8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
|
},
|
||||||
"node_modules/ts-api-utils": {
|
"node_modules/ts-api-utils": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz",
|
||||||
@@ -4279,6 +4375,28 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/void-elements": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||||
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
|
|||||||
+4
-1
@@ -13,11 +13,14 @@
|
|||||||
"@emailjs/browser": "^4.3.3",
|
"@emailjs/browser": "^4.3.3",
|
||||||
"@headlessui/react": "^1.7.18",
|
"@headlessui/react": "^1.7.18",
|
||||||
"@heroicons/react": "^2.1.3",
|
"@heroicons/react": "^2.1.3",
|
||||||
"emailjs-com": "^3.2.0",
|
"i18next": "^23.11.5",
|
||||||
|
"i18next-browser-languagedetector": "^8.0.0",
|
||||||
|
"i18next-http-backend": "^2.5.2",
|
||||||
"localforage": "^1.10.0",
|
"localforage": "^1.10.0",
|
||||||
"match-sorter": "^6.3.4",
|
"match-sorter": "^6.3.4",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
|
"react-i18next": "^14.1.2",
|
||||||
"react-icons": "^5.0.1",
|
"react-icons": "^5.0.1",
|
||||||
"react-router-dom": "^6.22.3",
|
"react-router-dom": "^6.22.3",
|
||||||
"react-toastify": "^10.0.5",
|
"react-toastify": "^10.0.5",
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"pp": {
|
||||||
|
"lastUpdated": "Last Updated: 06/19/2024",
|
||||||
|
"pageTitle": "Privacy Policy",
|
||||||
|
"introText": "LK Results (\"we\", \"our\", or \"us\") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard your information when you visit our website lk-results.com (the \"Site\") and use our contact form.",
|
||||||
|
"pp1": {
|
||||||
|
"title": "1. Information We Collect",
|
||||||
|
"desc": "We may collect personal information that you voluntarily provide when you fill out the contact form on our Site. This includes:\n\nName\nEmail address\nPhone number\nCompany name\nAny other information you choose to provide in your message."
|
||||||
|
},
|
||||||
|
"pp2": {
|
||||||
|
"title": "2. How We Use Your Information",
|
||||||
|
"desc": "We use the information we collect to:\n\nRespond to your inquiries and provide customer support.\nCommunicate with you about your inquiries or services you have requested.\nImprove our Site and the services we offer.\nMonitor and analyze usage and trends to enhance user experience."
|
||||||
|
},
|
||||||
|
"pp3": {
|
||||||
|
"title": "3. Sharing Your Information",
|
||||||
|
"desc": "We do not sell or rent your personal information to third parties. We may share your information only in the following circumstances:\n\nWith Service Providers: We may share your information with third-party service providers who assist us in operating our Site or conducting our business, so long as those parties agree to keep this information confidential.\nFor Legal Purposes: We may disclose your information if required by law or in response to valid requests by public authorities (e.g., a court or government agency)."
|
||||||
|
},
|
||||||
|
"pp4": {
|
||||||
|
"title": "4. Security of Your Information",
|
||||||
|
"desc": "We implement appropriate security measures to protect your personal information from unauthorized access, use, or disclosure. However, please note that no method of transmission over the internet or method of electronic storage is 100% secure, and we cannot guarantee absolute security."
|
||||||
|
},
|
||||||
|
"pp5": {
|
||||||
|
"title": "5. Retention of Your Information",
|
||||||
|
"desc": "We will retain your personal information for as long as necessary to fulfill the purposes for which it was collected or to comply with legal requirements."
|
||||||
|
},
|
||||||
|
"pp6": {
|
||||||
|
"title": "6. Your Rights",
|
||||||
|
"desc": "Depending on your location, you may have the right to:\n\nAccess and receive a copy of the personal information we hold about you.\nRequest correction or deletion of your personal information.\nObject to or request the restriction of processing your personal information.\nWithdraw your consent to the use of your personal information, where consent was the basis for processing."
|
||||||
|
},
|
||||||
|
"pp7": {
|
||||||
|
"title": "7. Changes to This Privacy Policy",
|
||||||
|
"desc": "We may update this Privacy Policy from time to time. Changes will be posted on this page, and the \"Last Updated\" date will be revised. Your continued use of the Site after any changes indicates your acceptance of the new Privacy Policy."
|
||||||
|
},
|
||||||
|
"pp8": {
|
||||||
|
"title": "8. Contact Us",
|
||||||
|
"desc": "If you have any questions about these Privacy Policy, please contact us at:\n\nLK Results\[email protected]\n(+351) 923-543-517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"pp": {
|
||||||
|
"lastUpdated": "Última Atualização: 06/19/2024",
|
||||||
|
"pageTitle": "Política de Privacidade",
|
||||||
|
"introText": "LK Results (\"nós\", \"nosso\" ou \"nos\") está comprometido com a proteção da sua privacidade. Esta Política de Privacidade explica como recolhemos, utilizamos e protegemos as suas informações quando visita o nosso website lk-results.com (o \"Site\") e utiliza o nosso formulário de contacto.",
|
||||||
|
"pp1": {
|
||||||
|
"title": "1. Informações que Recolhemos",
|
||||||
|
"desc": "Podemos recolher informações pessoais que você fornece voluntariamente ao preencher o formulário de contacto no nosso Site. Isto inclui:\n\nNome\nEndereço de Email\nNúmero de Telefone\nNome da Empresa\nQualquer outra informação que decida fornecer na sua mensagem."
|
||||||
|
},
|
||||||
|
"pp2": {
|
||||||
|
"title": "2. Como Utilizamos as Suas Informações",
|
||||||
|
"desc": "Utilizamos as informações que recolhemos para:\n\nResponder às suas perguntas e fornecer suporte ao cliente.\nComunicar consigo sobre as suas questões ou serviços que solicitou.\nMelhorar o nosso Site e os serviços que oferecemos.\nMonitorizar e analisar o uso e as tendências para melhorar a experiência do utilizador."
|
||||||
|
},
|
||||||
|
"pp3": {
|
||||||
|
"title": "3. Partilha das Suas Informações",
|
||||||
|
"desc": "Não vendemos nem alugamos as suas informações pessoais a terceiros. Podemos partilhar as suas informações apenas nas seguintes circunstâncias:\n\nCom Fornecedores de Serviços: Podemos partilhar as suas informações com fornecedores de serviços terceiros que nos assistem na operação do nosso Site ou na condução do nosso negócio, desde que essas partes concordem em manter essa informação confidencial.\nPara Fins Legais: Podemos divulgar as suas informações se exigido por lei ou em resposta a pedidos válidos de autoridades públicas (por exemplo, um tribunal ou agência governamental)."
|
||||||
|
},
|
||||||
|
"pp4": {
|
||||||
|
"title": "4. Segurança das Suas Informações",
|
||||||
|
"desc": "Implementamos medidas de segurança apropriadas para proteger as suas informações pessoais contra acesso, uso ou divulgação não autorizados. No entanto, note que nenhum método de transmissão pela internet ou método de armazenamento eletrónico é 100% seguro, e não podemos garantir segurança absoluta."
|
||||||
|
},
|
||||||
|
"pp5": {
|
||||||
|
"title": "5. Retenção das Suas Informações",
|
||||||
|
"desc": "Reteremos as suas informações pessoais pelo tempo necessário para cumprir os propósitos para os quais foram recolhidas ou para cumprir os requisitos legais."
|
||||||
|
},
|
||||||
|
"pp6": {
|
||||||
|
"title": "6. Os Seus Direitos",
|
||||||
|
"desc": "Dependendo da sua localização, pode ter o direito de:\n\nAceder e receber uma cópia das informações pessoais que mantemos sobre si.\nSolicitar a correção ou eliminação das suas informações pessoais.\nOpor-se ao processamento ou solicitar a restrição do processamento das suas informações pessoais.\nRetirar o seu consentimento para o uso das suas informações pessoais, quando o consentimento foi a base para o processamento."
|
||||||
|
},
|
||||||
|
"pp7": {
|
||||||
|
"title": "7. Alterações a Esta Política de Privacidade",
|
||||||
|
"desc": "Podemos atualizar esta Política de Privacidade periodicamente. As alterações serão publicadas nesta página, e a data de \"Última Atualização\" será revista. A sua utilização contínua do Site após quaisquer alterações indica a sua aceitação da nova Política de Privacidade."
|
||||||
|
},
|
||||||
|
"pp8": {
|
||||||
|
"title": "8. Contacte-nos",
|
||||||
|
"desc": "Se tiver alguma pergunta sobre esta Política de Privacidade, por favor, contacte-nos em:\n\nLK Results\[email protected]\n(+351) 923-543-517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"tos": {
|
||||||
|
"lastUpdated": "Last Updated: 06/19/2024",
|
||||||
|
"pageTitle": "Terms and Conditions",
|
||||||
|
"introText": "Welcome to LK Results (\"we\", \"our\", or \"us\"). By accessing or using LK Results (the \"Site\"), you agree to comply with and be bound by these Terms and Conditions (\"Terms\"). Please read these Terms carefully. If you do not agree with any part of these Terms, you must not use the Site.",
|
||||||
|
"tos1": {
|
||||||
|
"title": "1. Use of the Site",
|
||||||
|
"desc": "You agree to use the Site and the contact form for lawful purposes only.\nYou must provide accurate and complete information when filling out the contact form.\nYou agree not to use the form to submit any content that is illegal, harmful, or intended to harass or impersonate others."
|
||||||
|
},
|
||||||
|
"tos2": {
|
||||||
|
"title": "2. User Responsibilities",
|
||||||
|
"desc": "You are responsible for ensuring the security and confidentiality of any personal information you provide.\nYou agree not to use the contact form to send unsolicited commercial messages or spam."
|
||||||
|
},
|
||||||
|
"tos3": {
|
||||||
|
"title": "3. Intellectual Property Rights",
|
||||||
|
"desc": "All content and materials on the Site, including text, graphics, logos, and images, are the property of LK Results or its licensors. You may not use, reproduce, or distribute any content without our prior written permission."
|
||||||
|
},
|
||||||
|
"tos4": {
|
||||||
|
"title": "4. Limitation of Liability",
|
||||||
|
"desc": "To the fullest extent permitted by law, LK Results shall not be liable for any damages resulting from your use of the Site or the contact form, including but not limited to direct, indirect, incidental, or consequential damages."
|
||||||
|
},
|
||||||
|
"tos5": {
|
||||||
|
"title": "5. Changes to Terms",
|
||||||
|
"desc": "We may update these Terms from time to time. Changes will be posted on this page, and the \"Last Updated\" date will be revised. Your continued use of the Site after any changes indicates your acceptance of the new Terms."
|
||||||
|
},
|
||||||
|
"tos6": {
|
||||||
|
"title": "6. Contact Us",
|
||||||
|
"desc": "If you have any questions about these Terms, please contact us at:\n\nLK Results\[email protected]\n(+351) 923-543-517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"tos": {
|
||||||
|
"lastUpdated": "Última Atualização: 19/06/2024",
|
||||||
|
"pageTitle": "Termos e Condições",
|
||||||
|
"introText": "Bem-vindo(a) ao LK Results (\"nós\", \"nosso\" ou \"nos\"). Ao aceder ou utilizar LK Results (o \"Site\"), você concorda em cumprir e estar vinculado por estes Termos e Condições (\"Termos\"). Por favor, leia estes Termos cuidadosamente. Se não concordar com qualquer parte destes Termos, não deve utilizar o Site.",
|
||||||
|
"tos1": {
|
||||||
|
"title": "1. Utilização do Site",
|
||||||
|
"desc": "Concorda em utilizar o Site e o formulário de contacto apenas para fins legais.\nDeve fornecer informações precisas e completas ao preencher o formulário de contacto.\nConcorda em não utilizar o formulário para enviar qualquer conteúdo que seja ilegal, prejudicial ou destinado a assediar ou fazer-se passar por outras pessoas."
|
||||||
|
},
|
||||||
|
"tos2": {
|
||||||
|
"title": "2. Responsabilidades do Utilizador",
|
||||||
|
"desc": "É responsável por garantir a segurança e a confidencialidade de qualquer informação pessoal que forneça.\nConcorda em não utilizar o formulário de contacto para enviar mensagens comerciais não solicitadas ou spam."
|
||||||
|
},
|
||||||
|
"tos3": {
|
||||||
|
"title": "3. Direitos de Propriedade Intelectual",
|
||||||
|
"desc": "Todo o conteúdo e materiais no Site, incluindo texto, gráficos, logótipos e imagens, são propriedade do LK Results ou dos seus licenciadores. Não pode utilizar, reproduzir ou distribuir qualquer conteúdo sem a nossa permissão prévia por escrito."
|
||||||
|
},
|
||||||
|
"tos4": {
|
||||||
|
"title": "4. Limitação de Responsabilidade",
|
||||||
|
"desc": "Na medida máxima permitida por lei, LK Results não será responsável por quaisquer danos resultantes da sua utilização do Site ou do formulário de contacto, incluindo, mas não limitado a danos diretos, indiretos, incidentais ou consequenciais."
|
||||||
|
},
|
||||||
|
"tos5": {
|
||||||
|
"title": "5. Alterações aos Termos",
|
||||||
|
"desc": "Podemos atualizar estes Termos periodicamente. As alterações serão publicadas nesta página, e a data de \"Última Atualização\" será revista. A sua utilização contínua do Site após quaisquer alterações indica a sua aceitação dos novos Termos."
|
||||||
|
},
|
||||||
|
"tos6": {
|
||||||
|
"title": "6. Contacte-nos",
|
||||||
|
"desc": "Se tiver alguma pergunta sobre estes Termos, por favor, contacte-nos em:\n\nLK Results\[email protected]\n(+351) 923-543-517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
{
|
||||||
|
"navbar": {
|
||||||
|
"services": "Services",
|
||||||
|
"optimization": "Optimization",
|
||||||
|
"advantages": "Advantages",
|
||||||
|
"contact": "Contact"
|
||||||
|
},
|
||||||
|
"hero": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "GROW YOUR",
|
||||||
|
"part2": "BUSINESS"
|
||||||
|
},
|
||||||
|
"subheading": {
|
||||||
|
"part1": "We do all the digital footprint for you,",
|
||||||
|
"part2": "so you can focus on what's important!"
|
||||||
|
},
|
||||||
|
"button": "Yes, I want that!"
|
||||||
|
},
|
||||||
|
"services": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Unlock The Full ",
|
||||||
|
"part2": "Potential",
|
||||||
|
"part3": "Of Your Business!"
|
||||||
|
},
|
||||||
|
"cards": {
|
||||||
|
"marketing": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Analyze",
|
||||||
|
"description": "Problem"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Create",
|
||||||
|
"description": "Strategy"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Scale",
|
||||||
|
"description": "Company"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Execute",
|
||||||
|
"description": "Plan"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Idealize",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Design",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Develop",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Build",
|
||||||
|
"description": "Website"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"social": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Analyze",
|
||||||
|
"description": "Algorithm"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Schedule",
|
||||||
|
"description": "Content"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Target",
|
||||||
|
"description": "Audience"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Expand",
|
||||||
|
"description": "Platforms"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"media": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Envision",
|
||||||
|
"description": "Prespective"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Capture",
|
||||||
|
"description": "Moments"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Edit",
|
||||||
|
"description": "Moments"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Publish",
|
||||||
|
"description": "Content"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"optimization": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "So How Do You Optimize",
|
||||||
|
"part2": "Your Business?"
|
||||||
|
},
|
||||||
|
"cards": {
|
||||||
|
"card1": {
|
||||||
|
"title": "HANDLE EVERYTHING YOURSELF?",
|
||||||
|
"description": "That's fine if you have very little on your plate.\n\nBut if you're pretty swamped already... this isn't a viable option."
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "NEW STAFF?",
|
||||||
|
"description": "Finding good people isn't easy. Training and onboarding staff is costly.\n\n And even if you do find the perfect man or woman for the position... you're still depending on one person!"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "HIRE AN AGENCY?",
|
||||||
|
"description": "Don't have a marketing budget of tens of thousands of euros?\n\n Then your account could end up being managed by the intern of the assistants' assistant.\n\n Not exactly optimal."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"results": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Ok... So What Makes",
|
||||||
|
"part2": "Us Different?"
|
||||||
|
},
|
||||||
|
"subheading": "We have helped many businesses grow and expand their digital footprint.",
|
||||||
|
"cards": {
|
||||||
|
"card1": {
|
||||||
|
"title": "GUARANTEED",
|
||||||
|
"description": "We only win if you win!\nThat’s the basis for a good\npartnership.\nYou won’t carry all the risk,\nwe’ll share it."
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "RESULTS",
|
||||||
|
"description": "Our first priority is to get\nyou results.\n\nLess talk, more walk."
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "LOCAL",
|
||||||
|
"description": "We’re not a anonymous call\ncenter. We’re a local\ncompany, so you’ll be able to\nreach us when you need us"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "SPECIALIZED",
|
||||||
|
"description": "Jack of all trades... master\nof none. Specialization\nworks. We work with\nindustries we know, so we\ncan guarantee results."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Contact Us For",
|
||||||
|
"part2": "A",
|
||||||
|
"part3": "Free",
|
||||||
|
"part4": "Analysis"
|
||||||
|
},
|
||||||
|
"subheading": {
|
||||||
|
"part1": "Would you like to know what we could do for you? Fill out the form ad we’ll get",
|
||||||
|
"part2": "back to you. No obligation, no annoying tactics. We won’t waste your time."
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"name": "Name",
|
||||||
|
"email": "Email",
|
||||||
|
"company": "Company",
|
||||||
|
"phone": "Phone",
|
||||||
|
"question": "What is your most important question?",
|
||||||
|
"message": "Message",
|
||||||
|
"button": "Send"
|
||||||
|
},
|
||||||
|
"toasts": {
|
||||||
|
"success": "Your message has been sent successfully!",
|
||||||
|
"error": "An error occurred while sending your message. Please try again later.",
|
||||||
|
"empty": "Please fill out all the fields before sending the message."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"rights": "© 2024 LK Results. All rights reservered.",
|
||||||
|
"tos": "Terms of Service",
|
||||||
|
"privacy": "Privacy Policy"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
{
|
||||||
|
"navbar": {
|
||||||
|
"services": "Serviços",
|
||||||
|
"optimization": "Otimização",
|
||||||
|
"advantages": "Vantagens",
|
||||||
|
"contact": "Contacto"
|
||||||
|
},
|
||||||
|
"hero": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "CRESCE O",
|
||||||
|
"part2": "TEU NEGÓCIO"
|
||||||
|
},
|
||||||
|
"subheading": {
|
||||||
|
"part1": "Nós tratamos de toda a tua presença digital,",
|
||||||
|
"part2": "para que te possas concentrar no que é importante!"
|
||||||
|
},
|
||||||
|
"button": "Eu quero isto!"
|
||||||
|
},
|
||||||
|
"services": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Desbloqueia Todo O ",
|
||||||
|
"part2": "Potencial",
|
||||||
|
"part3": "Do Teu Negócio!"
|
||||||
|
},
|
||||||
|
"cards": {
|
||||||
|
"marketing": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Analisar",
|
||||||
|
"description": "Problema"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Criar",
|
||||||
|
"description": "Estratégia"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Escalar",
|
||||||
|
"description": "Empresa"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Executar",
|
||||||
|
"description": "Plano"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Idealizar",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Design",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Desenvolver",
|
||||||
|
"description": "Website"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Construir",
|
||||||
|
"description": "Website"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"social": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Analisar",
|
||||||
|
"description": "Algoritmo"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Agendar",
|
||||||
|
"description": "Conteúdo"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Segmentar",
|
||||||
|
"description": "Audiência"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Expandir",
|
||||||
|
"description": "Plataformas"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"media": {
|
||||||
|
"card1": {
|
||||||
|
"title": "Visualizar",
|
||||||
|
"description": "Perspectiva"
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "Capturar",
|
||||||
|
"description": "Momentos"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "Editar",
|
||||||
|
"description": "Momentos"
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "Publicar",
|
||||||
|
"description": "Conteúdo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"optimization": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Portanto, Como Otimizo",
|
||||||
|
"part2": "O Meu Negócio?"
|
||||||
|
},
|
||||||
|
"cards": {
|
||||||
|
"card1": {
|
||||||
|
"title": "TRATAR DE TUDO SOZINHO?",
|
||||||
|
"description": "É ótimo se tens muito pouco em mãos.\n\nMas se já estás bastante ocupado... esta não é uma opção viável."
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "NOVA STAFF?",
|
||||||
|
"description": "Encontrar boas pessoas não é fácil. Treinar e integrar funcionários é dispendioso.\n\n E mesmo quando encontras a pessoa perfeita para o cargo... ainda estás dependente de uma só pessoa!"
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "CONTRATAR UMA AGÊNCIA?",
|
||||||
|
"description": "Não tens um orçamento de dezenas de milhares de euros?\n\n Então a tua conta pode acabar por ser gerida pelo estagiário do assistente do assistente...\n\n Não é o cenário ideal."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"results": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Ok... Então O Que Nos Torna",
|
||||||
|
"part2": "Diferentes?"
|
||||||
|
},
|
||||||
|
"subheading": "Ajudamos muitos negócios a crescer e expandir a sua presença digital.",
|
||||||
|
"cards": {
|
||||||
|
"card1": {
|
||||||
|
"title": "GARANTIDO",
|
||||||
|
"description": "Nós só ganhamos se tu ganhares!\nEssa é a base para uma boa\nparceria. Não vais carregar todo o risco,\n vamos compartilhá-lo."
|
||||||
|
},
|
||||||
|
"card2": {
|
||||||
|
"title": "RESULTADOS",
|
||||||
|
"description": "A nossa primeira prioridade é obter\nresultados.\n\nMenos conversa, mais ação."
|
||||||
|
},
|
||||||
|
"card3": {
|
||||||
|
"title": "LOCAL",
|
||||||
|
"description": "Não somos um centro de chamadas anónimo. Somos uma\nempresa local, por isso podes\ncontactar-nos quando precisares."
|
||||||
|
},
|
||||||
|
"card4": {
|
||||||
|
"title": "ESPECIALIZADO",
|
||||||
|
"description": "Quem faz tudo, nada faz... A especialização\nfunciona. Trabalhamos com\nindústrias que conhecemos, para que possamos\ngarantir resultados."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact": {
|
||||||
|
"heading": {
|
||||||
|
"part1": "Contacta-nos para uma",
|
||||||
|
"part2": "Análise",
|
||||||
|
"part3": "Gratuita",
|
||||||
|
"part4": ""
|
||||||
|
},
|
||||||
|
"subheading": {
|
||||||
|
"part1": "Gostarias de saber o que podemos fazer por ti? Preenche o formulário e nós entraremos",
|
||||||
|
"part2": "em contacto contigo. Sem obrigações, sem táticas irritantes. Não vamos desperdiçar o teu tempo."
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"name": "Nome",
|
||||||
|
"email": "Email",
|
||||||
|
"company": "Empresa",
|
||||||
|
"phone": "Telefone",
|
||||||
|
"question": "Qual é a tua pergunta mais importante?",
|
||||||
|
"message": "Mensagem",
|
||||||
|
"button": "Enviar"
|
||||||
|
},
|
||||||
|
"toasts": {
|
||||||
|
"success": "A tua mensagem foi enviada com sucesso!",
|
||||||
|
"error": "Ocorreu um erro ao enviar a tua mensagem. Por favor, tenta novamente mais tarde.",
|
||||||
|
"empty": "Por favor, preenche todos os campos antes de enviar a mensagem."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"rights": "©2024 Direitos reservados a LK Results",
|
||||||
|
"tos": "Termos de Serviço",
|
||||||
|
"privacy": "Polítca de Privacidade"
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-1
@@ -1,12 +1,17 @@
|
|||||||
import { Route, Routes } from "react-router-dom";
|
import { Route, Routes } from "react-router-dom";
|
||||||
import Home from "./routes/Home";
|
import Home from "./routes/Home";
|
||||||
|
import TOS from "./routes/TOS";
|
||||||
|
import PP from "./routes/PP";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
return (
|
return (
|
||||||
<div className="font-baijam min-h-screen text-white">
|
<div className="font-baijam min-h-screen text-white">
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Home />} />
|
<Route path="*" element={<Home />} />
|
||||||
|
<Route path="tos" element={<TOS />} />
|
||||||
|
<Route path="privacy" element={<PP />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
interface IProps {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
image: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Card = ({ title, description, image }: IProps) => {
|
||||||
|
const defaultImgClasses = `w-full h-20 mt-5`;
|
||||||
|
const imgClasses = image ? defaultImgClasses : `${defaultImgClasses} hidden`;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="mt-5 xl:mt-0 flex flex-1 bg-gradient-to-b from-gold-light to-gold-dark p-0.5 shadow-lg">
|
||||||
|
<div className="w-full font-medium flex-col md:px-4 py-1 bg-gradient-to-br from-custom-bglight to-custom-bgdark">
|
||||||
|
<object type="image/svg+xml" data={image} className={imgClasses} aria-label={title}></object>
|
||||||
|
<h1 className="mt-2 lg:mt-6 text-3xl xl:text-5xl">{title}</h1>
|
||||||
|
<h2 className="results-card-content">
|
||||||
|
{description.split("\n").map((line, i) => (
|
||||||
|
<span key={i}>
|
||||||
|
{line}
|
||||||
|
<br />
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Card;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { FaFacebook, FaLinkedin } from "react-icons/fa";
|
||||||
|
|
||||||
|
const Footer = () => {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<footer className="flex flex-col space-y-10 justify-center m-10">
|
||||||
|
<div className="flex justify-center space-x-5">
|
||||||
|
<a
|
||||||
|
href="https://www.facebook.com/people/LK-Marketing/61556714037746/"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<FaFacebook className="text-gold-light" size={30} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.linkedin.com/company/lk-results"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<FaLinkedin className="text-gold-light" size={30} />
|
||||||
|
</a>
|
||||||
|
{/* Uncomment these lines if you want to include Instagram and Twitter icons */}
|
||||||
|
{/* <a
|
||||||
|
href="https://instagram.com"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<FaInstagram className="text-gold-light" size={30} />
|
||||||
|
</a>
|
||||||
|
<a href="https://twitter.com" target="_blank" rel="noopener noreferrer">
|
||||||
|
<FaXTwitter className="text-gold-light" size={30} />
|
||||||
|
</a> */}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex justify-center space-x-5">
|
||||||
|
<a
|
||||||
|
href="/tos"
|
||||||
|
className={i18n.language === "en" ? "footer-text hover:text-gold-light" : "footer-text-pt hover:text-gold-light"}
|
||||||
|
>
|
||||||
|
{t("footer.tos")}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/privacy"
|
||||||
|
className={i18n.language === "en" ? "footer-text hover:text-gold-light" : "footer-text-pt hover:text-gold-light"}
|
||||||
|
>
|
||||||
|
{t("footer.privacy")}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className={i18n.language === "en" ? "footer-text text-center" : "footer-text-pt text-center"}>
|
||||||
|
{t("footer.rights")}
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Footer;
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
const Loading = () => {
|
||||||
|
return (
|
||||||
|
<div className="flex items-center justify-center h-screen">
|
||||||
|
<div className="animate-spin rounded-full h-32 w-32 border-t-2 border-b-2 border-gray-900"></div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Loading;
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { FaTimes, FaBars } from "react-icons/fa";
|
||||||
|
|
||||||
|
import Logo from "../../assets/logo.svg";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const [state, setState] = useState(false);
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
|
const [colorChange, setColorChange] = useState(false);
|
||||||
|
useEffect(() => {
|
||||||
|
const changeColor = () => {
|
||||||
|
if (window.scrollY >= 100) {
|
||||||
|
setColorChange(true);
|
||||||
|
} else {
|
||||||
|
setColorChange(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("scroll", changeColor);
|
||||||
|
|
||||||
|
const scrollPath = sessionStorage.getItem("scrollPath");
|
||||||
|
if (scrollPath) {
|
||||||
|
smoothScroll(scrollPath);
|
||||||
|
sessionStorage.removeItem("scrollPath");
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener("scroll", changeColor);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const navigation = [
|
||||||
|
{ title: t("navbar.services"), path: "Services" },
|
||||||
|
{ title: t("navbar.optimization"), path: "Optimization" },
|
||||||
|
{ title: t("navbar.advantages"), path: "Advantages" },
|
||||||
|
{ title: t("navbar.contact"), path: "Contact" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const handleNavigation = (path: string) => {
|
||||||
|
if ((window.location.pathname === "/tos" || window.location.pathname === "/privacy") && navigation.some(navItem => navItem.path === path)) {
|
||||||
|
sessionStorage.setItem("scrollPath", path);
|
||||||
|
window.location.href = "/";
|
||||||
|
}else{
|
||||||
|
smoothScroll(path)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const smoothScroll = (path :string) => {
|
||||||
|
const element = document.getElementById(path);
|
||||||
|
const navbarHeight = 110; // Replace with your navbar's height
|
||||||
|
if (element) {
|
||||||
|
const top =
|
||||||
|
element.getBoundingClientRect().top + window.scrollY - navbarHeight;
|
||||||
|
window.scrollTo({ top: top, behavior: "smooth" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const changeLanguage = (lng: string) => {
|
||||||
|
i18n.changeLanguage(lng);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<nav
|
||||||
|
className={`${
|
||||||
|
colorChange
|
||||||
|
? "bg-black bg-opacity-80 transition duration-500 w-full border-0 sticky top-0 z-10"
|
||||||
|
: "z-10"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div className="items-center px-4 max-w-screen-xl mx-auto md:flex md:px-8">
|
||||||
|
<div className="flex items-center justify-between py-3 md:py-5 md:block">
|
||||||
|
<a
|
||||||
|
href="Top"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault(); // Prevent the default anchor tag behavior
|
||||||
|
if (window.location.pathname === "/") {
|
||||||
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
|
} else {
|
||||||
|
window.location.href = "/";
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img src={Logo} width={60} height={60} alt="logo" />
|
||||||
|
</a>
|
||||||
|
<div className="md:hidden">
|
||||||
|
<button
|
||||||
|
className="outline-none p-2 rounded-md focus:border-gray-400 focus:border"
|
||||||
|
onClick={() => setState(!state)}
|
||||||
|
>
|
||||||
|
{state ? (
|
||||||
|
<FaTimes className="h-6 w-6" />
|
||||||
|
) : (
|
||||||
|
<FaBars className="h-6 w-6" />
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={`absolute top-[3.24rem] md:top-0 left-0 w-full z-50 flex flex-col md:flex-row items-center justify-center pb-3 mt-8 md:relative md:bg-transparent md:pb-0 md:mt-0 ${
|
||||||
|
state
|
||||||
|
? colorChange
|
||||||
|
? "block bg-black bg-opacity-80 transition duration-500"
|
||||||
|
: "block bg-gradient-to-br from-custom-bglight to-custom-bgdark"
|
||||||
|
: "hidden md:flex"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<ul className="text-text-gold space-y-8 md:ml-auto md:flex md:space-x-6 md:space-y-0 justify-center items-center">
|
||||||
|
{navigation.map((item, idx) => {
|
||||||
|
return (
|
||||||
|
<li key={idx} className="hover:text-white">
|
||||||
|
<a
|
||||||
|
href={item.path}
|
||||||
|
className="block py-2 md:py-0 md:px-4 text-xl font-medium"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault(); // Prevent the default anchor tag behavior
|
||||||
|
setState(false); // Close the navigation
|
||||||
|
handleNavigation(item.path); // Navigate to the section
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{item.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</ul>
|
||||||
|
<button
|
||||||
|
className="mt-5 md:mt-0 md:ml-auto"
|
||||||
|
onClick={() => changeLanguage(i18n.language === "en" ? "pt" : "en")}
|
||||||
|
>
|
||||||
|
{i18n.language === "en" ? "PT" : "EN"}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,59 +1,124 @@
|
|||||||
|
import React from "react";
|
||||||
|
import emailjs from "@emailjs/browser";
|
||||||
|
import { ToastContainer, toast } from "react-toastify";
|
||||||
|
import "react-toastify/dist/ReactToastify.css";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const ContactForm = () => {
|
const ContactForm = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const notify = () => {
|
||||||
|
toast.success(t("contact.toasts.success"));
|
||||||
|
};
|
||||||
|
|
||||||
|
const errorToast = () => {
|
||||||
|
toast.error(t("contact.toasts.error"));
|
||||||
|
};
|
||||||
|
|
||||||
|
const emptyForm = () => {
|
||||||
|
toast.warning(t("contact.toasts.empty"));
|
||||||
|
};
|
||||||
|
|
||||||
|
const sendEmail = (e: React.FormEvent<HTMLFormElement>) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
let isEmpty = Array.from(e.currentTarget.elements).some(
|
||||||
|
(input) =>
|
||||||
|
(input as HTMLInputElement).type !== "submit" &&
|
||||||
|
(input as HTMLInputElement).value.trim() === ""
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isEmpty) {
|
||||||
|
emptyForm();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
emailjs
|
||||||
|
.sendForm("service_o7kxotj", "template_f30zlog", e.currentTarget, {
|
||||||
|
publicKey: "vcSOwPedqkRH3nmr9",
|
||||||
|
})
|
||||||
|
.then(
|
||||||
|
(result) => {
|
||||||
|
console.log(result.text);
|
||||||
|
notify();
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.log(error.text);
|
||||||
|
errorToast();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
e.currentTarget.reset();
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-10 mx-5 lg:mx-0 flex justify-center items-center">
|
<div className="mt-10 mx-5 lg:mx-0 flex justify-center items-center">
|
||||||
<form className="w-full md:w-auto">
|
<form onSubmit={sendEmail} className="w-full md:w-auto">
|
||||||
<div className="flex flex-col md:flex-row md:gap-3">
|
<div className="flex flex-col md:flex-row md:gap-3">
|
||||||
<input
|
<input
|
||||||
className="form-input"
|
className="form-input"
|
||||||
type="text"
|
type="text"
|
||||||
id="name"
|
name="user_name"
|
||||||
placeholder="Name"
|
placeholder={t("contact.form.name")}
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
className="form-input"
|
className="form-input"
|
||||||
type="email"
|
type="email"
|
||||||
id="email"
|
name="user_email"
|
||||||
placeholder="Email"
|
placeholder={t("contact.form.email")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col md:flex-row md:gap-3">
|
<div className="flex flex-col md:flex-row md:gap-3">
|
||||||
<input
|
<input
|
||||||
className="form-input"
|
className="form-input"
|
||||||
type="text"
|
type="text"
|
||||||
id="company"
|
name="user_company"
|
||||||
placeholder="Company"
|
placeholder={t("contact.form.company")}
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
className="form-input"
|
className="form-input"
|
||||||
type="number"
|
type="number"
|
||||||
id="phone"
|
name="user_phone"
|
||||||
placeholder="Phone"
|
placeholder={t("contact.form.phone")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<input
|
<input
|
||||||
className="form-input"
|
className="form-input"
|
||||||
type="text"
|
type="text"
|
||||||
id="question"
|
name="user_question"
|
||||||
placeholder="What is your most important question?"
|
placeholder={t("contact.form.question")}
|
||||||
></input>
|
></input>
|
||||||
|
|
||||||
<textarea
|
<textarea
|
||||||
className="form-input"
|
className="form-input"
|
||||||
name="message"
|
name="message"
|
||||||
id="message"
|
placeholder={t("contact.form.message")}
|
||||||
placeholder="Message"
|
|
||||||
rows={6}
|
rows={6}
|
||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex mt-5 mb-10 lg:mt-12 mx-10 lg:mx-20 rounded-xl bg-gradient-to-br from-gold-light to-gold-dark p-0.5 shadow-lg">
|
<div className="flex mt-5 mb-10 lg:mt-12 mx-10 lg:mx-20 rounded-xl bg-gradient-to-br from-gold-light to-gold-dark p-0.5 shadow-lg">
|
||||||
<a className="flex w-full" href="#Contact">
|
<button
|
||||||
<button className="flex-1 font-medium md:px-8 py-3 text-2xl md:text-3xl bg-gradient-to-br from-custom-bglight to-custom-bgdark rounded-xl hover:bg-transparent hover:from-transparent hover:to-transparent transition duration-500">
|
type="submit"
|
||||||
Send!
|
className="flex-1 font-medium md:px-8 py-3 text-2xl md:text-3xl bg-gradient-to-br from-custom-bglight to-custom-bgdark rounded-xl hover:bg-transparent hover:from-transparent hover:to-transparent transition duration-500"
|
||||||
</button>
|
>
|
||||||
</a>
|
{t("contact.form.button")}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ToastContainer
|
||||||
|
position="top-center"
|
||||||
|
autoClose={5000}
|
||||||
|
hideProgressBar
|
||||||
|
newestOnTop={false}
|
||||||
|
closeOnClick
|
||||||
|
rtl={false}
|
||||||
|
pauseOnFocusLoss
|
||||||
|
draggable
|
||||||
|
pauseOnHover
|
||||||
|
theme="dark"
|
||||||
|
/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import ContactForm from "./ContactForm";
|
import ContactForm from "./ContactForm";
|
||||||
|
|
||||||
const ContactPage = () => {
|
const ContactPage = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full">
|
<div className="h-full">
|
||||||
<div className="header-text">
|
<div className="header-text">
|
||||||
<h1>
|
<h1>
|
||||||
Contact Us For <br />A{" "}
|
{t("contact.heading.part1")} <br />
|
||||||
<span className="bg-clip-text text-transparent bg-gradient-to-br from-gold-light to-gold-dark">
|
{t("contact.heading.part2")}{" "}
|
||||||
Free
|
<span className="gold-text">{t("contact.heading.part3")}</span>{" "}
|
||||||
</span>{" "}
|
{t("contact.heading.part4")}
|
||||||
Analysis
|
|
||||||
</h1>
|
</h1>
|
||||||
<h2 className="sub-header-text ">
|
<h2 className="sub-header-text ">
|
||||||
Would you like to know what we could do for you? Fill out the form ad
|
{t("contact.subheading.part1")} <br />
|
||||||
we’ll get <br />
|
{t("contact.subheading.part2")}
|
||||||
back to you No obligation, no annoying tactics. We won’t waste your
|
|
||||||
time.
|
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<ContactForm />
|
<ContactForm />
|
||||||
|
|||||||
@@ -1,7 +1,20 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import HeroImg from "../../../assets/HeroImg.svg";
|
import HeroImg from "../../../assets/HeroImg.svg";
|
||||||
import Stars from "../../../assets/Stars.svg";
|
import Stars from "../../../assets/Stars.svg";
|
||||||
|
|
||||||
const Hero = () => {
|
const Hero = () => {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
|
const handleNavigation = (path: string) => {
|
||||||
|
const element = document.getElementById(path);
|
||||||
|
const navbarHeight = 110; // Replace with your navbar's height
|
||||||
|
if (element) {
|
||||||
|
const top =
|
||||||
|
element.getBoundingClientRect().top + window.scrollY - navbarHeight;
|
||||||
|
window.scrollTo({ top: top, behavior: "smooth" });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col lg:mt-20 lg:flex-row 1920:padding-calc items-center">
|
<div className="flex flex-col lg:mt-20 lg:flex-row 1920:padding-calc items-center">
|
||||||
<div className="lg:w-1/2 w-full xl:w-1/2 hidden lg:flex transform origin-left">
|
<div className="lg:w-1/2 w-full xl:w-1/2 hidden lg:flex transform origin-left">
|
||||||
@@ -15,8 +28,16 @@ const Hero = () => {
|
|||||||
className="md:px-0 ml-auto mr-auto lg:mr-0 lg:text-right"
|
className="md:px-0 ml-auto mr-auto lg:mr-0 lg:text-right"
|
||||||
></img>
|
></img>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="hero-text">GROW YOUR</h1>
|
<h1
|
||||||
<h1 className="hero-text">BUSINESS</h1>
|
className={i18n.language === "en" ? "hero-text" : "hero-text-pt"}
|
||||||
|
>
|
||||||
|
{t("hero.heading.part1")}
|
||||||
|
</h1>
|
||||||
|
<h1
|
||||||
|
className={i18n.language === "en" ? "hero-text" : "hero-text-pt"}
|
||||||
|
>
|
||||||
|
{t("hero.heading.part2")}
|
||||||
|
</h1>
|
||||||
<div>
|
<div>
|
||||||
<img
|
<img
|
||||||
src={HeroImg}
|
src={HeroImg}
|
||||||
@@ -25,16 +46,35 @@ const Hero = () => {
|
|||||||
></img>
|
></img>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h2 className="italic text-lg md:text-2xl 2xl:text-3xl mt-4 md:mt-10">
|
<div className="mx-5 lg:mx-0">
|
||||||
We do all the digital footprint for you,
|
<h2
|
||||||
</h2>
|
className={
|
||||||
<h2 className="italic text-lg md:text-2xl 2xl:text-3xl">
|
i18n.language === "en"
|
||||||
so you can focus on what's important!
|
? "hero-sub-text mt-4 md:mt-10"
|
||||||
</h2>
|
: "hero-sub-text-pt mt-4 md:mt-10"
|
||||||
<div className="flex mt-5 lg:mt-12 mx-20 lg:mx-0 lg:ml-auto rounded-xl bg-gradient-to-br from-gold-light to-gold-dark p-0.5 shadow-lg">
|
}
|
||||||
<a className="flex w-full" href="#Contact">
|
>
|
||||||
|
{t("hero.subheading.part1")}
|
||||||
|
</h2>
|
||||||
|
<h2
|
||||||
|
className={
|
||||||
|
i18n.language === "en" ? "hero-sub-text" : "hero-sub-text-pt"
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{t("hero.subheading.part2")}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
<div className="flex mt-5 lg:mt-12 mx-10 lg:mx-0 lg:ml-auto rounded-xl bg-gradient-to-br from-gold-light to-gold-dark p-0.5 shadow-lg">
|
||||||
|
<a
|
||||||
|
className="flex w-full"
|
||||||
|
href="Contact"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
handleNavigation("Contact");
|
||||||
|
}}
|
||||||
|
>
|
||||||
<button className="flex-1 font-medium md:px-8 py-3 text-2xl md:text-3xl bg-gradient-to-br from-custom-bglight to-custom-bgdark rounded-xl hover:bg-transparent hover:from-transparent hover:to-transparent transition duration-500">
|
<button className="flex-1 font-medium md:px-8 py-3 text-2xl md:text-3xl bg-gradient-to-br from-custom-bglight to-custom-bgdark rounded-xl hover:bg-transparent hover:from-transparent hover:to-transparent transition duration-500">
|
||||||
Yes, I want that!
|
{t("hero.button")}
|
||||||
</button>
|
</button>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
import { useEffect, useState } from "react";
|
|
||||||
|
|
||||||
import Logo from "../../../assets/logo.svg";
|
|
||||||
|
|
||||||
export default () => {
|
|
||||||
const [state, setState] = useState(false);
|
|
||||||
const [colorChange, setColorChange] = useState(false);
|
|
||||||
const [isNavbarCollapsed, setIsNavbarCollapsed] = useState(
|
|
||||||
window.innerWidth <= 768
|
|
||||||
);
|
|
||||||
|
|
||||||
const changeColor = () => {
|
|
||||||
if (window.scrollY >= 100) {
|
|
||||||
setColorChange(true);
|
|
||||||
} else {
|
|
||||||
setColorChange(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const checkNavbarCollapse = () => {
|
|
||||||
if (window.innerWidth <= 768) {
|
|
||||||
setIsNavbarCollapsed(true);
|
|
||||||
} else {
|
|
||||||
setIsNavbarCollapsed(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
window.addEventListener("scroll", changeColor);
|
|
||||||
window.addEventListener("resize", checkNavbarCollapse);
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("scroll", changeColor);
|
|
||||||
window.removeEventListener("resize", checkNavbarCollapse);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// Replace javascript:void(0) path with your path
|
|
||||||
const navigation = [
|
|
||||||
{ title: "Services", path: "#Services" },
|
|
||||||
{ title: "Results", path: "#Results" },
|
|
||||||
{ title: "Contact", path: "#Contact" },
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
|
||||||
<nav
|
|
||||||
className={`${
|
|
||||||
colorChange
|
|
||||||
? "bg-black bg-opacity-80 transition duration-500 w-full border-0 sticky top-0 z-10"
|
|
||||||
: "z-10"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
<div className="items-center px-4 max-w-screen-xl mx-auto md:flex md:px-8">
|
|
||||||
<div className="flex items-center justify-center md:justify-between py-3 md:py-5 md:block">
|
|
||||||
{isNavbarCollapsed ? (
|
|
||||||
<button
|
|
||||||
className="outline-none p-2 rounded-md focus:border-gray-400 focus:border"
|
|
||||||
onClick={() => setState(!state)}
|
|
||||||
>
|
|
||||||
<img src={Logo} width={60} height={60} alt="logo" />
|
|
||||||
</button>
|
|
||||||
) : (
|
|
||||||
<a href="/">
|
|
||||||
<img src={Logo} width={60} height={60} alt="logo" />
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={`flex-1 justify-self-center pb-3 mt-8 md:block md:pb-0 md:mt-0 ${
|
|
||||||
state ? "block" : "hidden"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
<ul className="text-text-gold justify-center items-center space-y-8 md:flex md:space-x-6 md:space-y-0">
|
|
||||||
{navigation.map((item, idx) => {
|
|
||||||
return (
|
|
||||||
<li key={idx} className="hover:text-white">
|
|
||||||
<a
|
|
||||||
href={item.path}
|
|
||||||
className="block py-2 md:py-0 md:px-4 text-xl font-medium$"
|
|
||||||
>
|
|
||||||
{item.title}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import Card from "../../Card";
|
||||||
|
import yourself from "../../../assets/Yourself.svg"
|
||||||
|
import staff from "../../../assets/Staff.svg"
|
||||||
|
import agency from "../../../assets/Agency.svg"
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
const CardContainer = () => {
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="mt-10 lg:mt-32 flex gap-10 flex-col h-full lg:flex-row px-10 lg:px-32 1920:margin-calc">
|
||||||
|
<Card
|
||||||
|
title={t("optimization.cards.card1.title")}
|
||||||
|
description={t("optimization.cards.card1.description")}
|
||||||
|
image={yourself}
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("optimization.cards.card2.title")}
|
||||||
|
description={t("optimization.cards.card2.description")}
|
||||||
|
image={staff}
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("optimization.cards.card3.title")}
|
||||||
|
description={t("optimization.cards.card3.description")}
|
||||||
|
image={agency}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CardContainer;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import CardContainer from './CardContainer'
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
|
const Optimization = () => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
return (
|
||||||
|
<div className="header-text">
|
||||||
|
<h1>
|
||||||
|
<span className="gold-text">"</span>
|
||||||
|
{t("optimization.heading.part1")} <br /> {t("optimization.heading.part2")}
|
||||||
|
<span className="gold-text">"</span>
|
||||||
|
</h1>
|
||||||
|
<CardContainer />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Optimization
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
interface IProps {
|
|
||||||
title: string;
|
|
||||||
description: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Card = ({ title, description }: IProps) => {
|
|
||||||
return (
|
|
||||||
<div className="mt-5 xl:mt-0 flex bg-gradient-to-b from-gold-light to-gold-dark p-0.5 shadow-lg">
|
|
||||||
<div className="w-full font-medium md:px-4 py-1 bg-gradient-to-br from-custom-bglight to-custom-bgdark">
|
|
||||||
<h1 className="mt-2 lg:mt-6 text-3xl xl:text-5xl">{title}</h1>
|
|
||||||
<h2 className="mb-2 mt-3 italic text-xl xl:text-3xl font-medium text-gray-300">
|
|
||||||
{description.split("\n").map((line, i) => (
|
|
||||||
<span key={i}>
|
|
||||||
{line}
|
|
||||||
<br />
|
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Card;
|
|
||||||
@@ -1,23 +1,30 @@
|
|||||||
import Card from "./Card";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import Card from "../../Card";
|
||||||
|
|
||||||
const CardContainer = () => {
|
const CardContainer = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-10 flex-col h-full lg:grid lg:grid-cols-2 lg:gap-10 px-10 lg:px-40 2xl:px-96 1920:margin-calc">
|
<div className="mt-10 flex-col h-full lg:grid lg:grid-cols-2 lg:gap-10 px-10 lg:px-40 2xl:px-96 1920:margin-calc">
|
||||||
<Card
|
<Card
|
||||||
title="GUARANTED"
|
title={t("results.cards.card1.title")}
|
||||||
description={`We only win if you win!\nThat’s the basis for a good\npartnership.\nYou won’t carry all the risk,\nwe’ll share it.`}
|
description={t("results.cards.card1.description")}
|
||||||
|
image=""
|
||||||
/>
|
/>
|
||||||
<Card
|
<Card
|
||||||
title="RESULTS"
|
title={t("results.cards.card2.title")}
|
||||||
description={`Our first priority is to get\nyou results.\n\nLess talk, more walk.`}
|
description={t("results.cards.card2.description")}
|
||||||
|
image=""
|
||||||
/>
|
/>
|
||||||
<Card
|
<Card
|
||||||
title="LOCAL"
|
title={t("results.cards.card3.title")}
|
||||||
description={`We’re not a anonymous call\ncenter. We’re a local\ncompany, so you’ll be able to\nreach us when you need us`}
|
description={t("results.cards.card3.description")}
|
||||||
|
image=""
|
||||||
/>
|
/>
|
||||||
<Card
|
<Card
|
||||||
title="SPECIALIZED"
|
title={t("results.cards.card4.title")}
|
||||||
description={`Jack of all trades... master\nof none Specialization\nworks. We work with\nindustries we know, so we\ncan guarantee results.`}
|
description={t("results.cards.card4.description")}
|
||||||
|
image=""
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import CardContainer from "./CardContainer";
|
import CardContainer from "./CardContainer";
|
||||||
|
|
||||||
const ResultsPage = () => {
|
const ResultsPage = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="header-text">
|
<div className="header-text">
|
||||||
<h1>
|
<h1>
|
||||||
<span className="bg-clip-text text-transparent bg-gradient-to-br from-gold-light to-gold-dark">
|
<span className="gold-text">"</span>
|
||||||
"
|
{t("results.heading.part1")} <br /> {t("results.heading.part2")}
|
||||||
</span>
|
<span className="gold-text">"</span>
|
||||||
Ok... So what makes <br />
|
|
||||||
us different?
|
|
||||||
<span className="bg-clip-text text-transparent bg-gradient-to-br from-gold-light to-gold-dark">
|
|
||||||
"
|
|
||||||
</span>
|
|
||||||
</h1>
|
</h1>
|
||||||
<CardContainer />
|
<CardContainer />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const Buttons = ({ changeActiveGroup }: props) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="lg:px-40 flex flex-row 2xl:gap-8 gap-2 mx-2 md:gap-5 mt-10 mb-4 flex-wrap justify-center">
|
<div className="lg:px-40 flex flex-row 2xl:gap-8 gap-2 mx-2 md:gap-5 mt-5 lg:mt-10 mb-4 justify-center">
|
||||||
<CardBtn
|
<CardBtn
|
||||||
title="Marketing"
|
title="Marketing"
|
||||||
onClick={() => handleClick("markCards")}
|
onClick={() => handleClick("markCards")}
|
||||||
|
|||||||
@@ -3,14 +3,37 @@ import EnvisionImg from "../../../assets/imgs/Envision.jpg";
|
|||||||
import CaptureImg from "../../../assets/imgs/Capture.png";
|
import CaptureImg from "../../../assets/imgs/Capture.png";
|
||||||
import EditImg from "../../../assets/imgs/Edit.png";
|
import EditImg from "../../../assets/imgs/Edit.png";
|
||||||
import PublishImg from "../../../assets/imgs/Publish.jpg";
|
import PublishImg from "../../../assets/imgs/Publish.jpg";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const CameraCards = () => {
|
const CameraCards = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
||||||
<Card title="Envision" description="Prespective" imgSrc={EnvisionImg} />
|
<Card
|
||||||
<Card title="Capture" description="Moments" imgSrc={CaptureImg} />
|
title={t("services.cards.media.card1.title")}
|
||||||
<Card title="Edit" description="Moments" imgSrc={EditImg} />
|
description={t("services.cards.media.card1.description")}
|
||||||
<Card title="Publish" description="Content" imgSrc={PublishImg} />
|
imgSrc={EnvisionImg}
|
||||||
|
delay="0s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.media.card2.title")}
|
||||||
|
description={t("services.cards.media.card2.description")}
|
||||||
|
imgSrc={CaptureImg}
|
||||||
|
delay="0.1s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.media.card3.title")}
|
||||||
|
description={t("services.cards.media.card3.description")}
|
||||||
|
imgSrc={EditImg}
|
||||||
|
delay="0.2s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.media.card4.title")}
|
||||||
|
description={t("services.cards.media.card4.description")}
|
||||||
|
imgSrc={PublishImg}
|
||||||
|
delay="0.3s"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,19 +6,13 @@ interface props {
|
|||||||
|
|
||||||
const CardBtn = ({ title, onClick, isSelected }: props) => {
|
const CardBtn = ({ title, onClick, isSelected }: props) => {
|
||||||
const buttonClass = isSelected
|
const buttonClass = isSelected
|
||||||
? "w-full font-medium md:px-4 py-1 text-xs lg:text-sm xl:text-lg bg-gradient-to-br from-custom-bglight to-custom-bgdark"
|
? "w-full font-bold md:px-4 py-1 text-xs lg:text-sm xl:text-2xl cursor-pointer"
|
||||||
: "w-full font-medium md:px-4 py-1 text-xs lg:text-sm xl:text-lg bg-gradient-to-br from-custom-bglight to-custom-bgdark text-gray-400 shadow-inner";
|
: "w-full font-medium md:px-4 py-1 text-xs lg:text-sm xl:text-xl text-gray-400 shadow-inner hover:text-text-gold cursor-pointer";
|
||||||
|
|
||||||
const divClass = isSelected
|
|
||||||
? "flex flex-1 flex-row mt-5 lg:mt-12 bg-gradient-to-b from-gold-light to-gold-dark p-0.5 shadow-lg transform scale-110"
|
|
||||||
: "flex flex-1 flex-row mt-5 lg:mt-12 bg-gradient-to-b from-gold-light to-gold-dark p-0.5 shadow-lg";
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={divClass}>
|
<a className={buttonClass} onClick={onClick}>
|
||||||
<button className={buttonClass} onClick={onClick}>
|
|
||||||
{title}
|
{title}
|
||||||
</button>
|
</a>
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,37 @@ import AnaliseImg from "../../../assets/imgs/Analise.jpg";
|
|||||||
import CreateImg from "../../../assets/imgs/Create.jpg";
|
import CreateImg from "../../../assets/imgs/Create.jpg";
|
||||||
import ScaleImg from "../../../assets/imgs/Scale.jpg";
|
import ScaleImg from "../../../assets/imgs/Scale.jpg";
|
||||||
import ExecuteImg from "../../../assets/imgs/Execute.jpg";
|
import ExecuteImg from "../../../assets/imgs/Execute.jpg";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const MarketingCards = () => {
|
const MarketingCards = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
||||||
<Card title="Analise" description="Problem" imgSrc={AnaliseImg} />
|
<Card
|
||||||
<Card title="Create" description="Strategy" imgSrc={CreateImg} />
|
title={t("services.cards.marketing.card1.title")}
|
||||||
<Card title="Scale" description="Company" imgSrc={ScaleImg} />
|
description={t("services.cards.marketing.card1.description")}
|
||||||
<Card title="Execute" description="Plan" imgSrc={ExecuteImg} />
|
imgSrc={AnaliseImg}
|
||||||
|
delay="0s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.marketing.card2.title")}
|
||||||
|
description={t("services.cards.marketing.card2.description")}
|
||||||
|
imgSrc={CreateImg}
|
||||||
|
delay="0.1s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.marketing.card3.title")}
|
||||||
|
description={t("services.cards.marketing.card3.description")}
|
||||||
|
imgSrc={ScaleImg}
|
||||||
|
delay="0.2s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.marketing.card4.title")}
|
||||||
|
description={t("services.cards.marketing.card4.description")}
|
||||||
|
imgSrc={ExecuteImg}
|
||||||
|
delay="0.3s"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,13 +2,19 @@ interface IProps {
|
|||||||
title: string;
|
title: string;
|
||||||
description: string;
|
description: string;
|
||||||
imgSrc: string;
|
imgSrc: string;
|
||||||
|
delay: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Card = ({ title, description, imgSrc }: IProps) => {
|
const Card = ({ title, description, imgSrc, delay }: IProps) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="flex flex-col justify-end flex-1 h-full border-solid border shadow-lg bg-cover bg-center text-center"
|
className="flex flex-col justify-end flex-1 h-full border-solid border shadow-lg bg-cover bg-center text-center"
|
||||||
style={{ backgroundImage: `url(${imgSrc})` }}
|
style={{
|
||||||
|
backgroundImage: `url(${imgSrc})`,
|
||||||
|
filter: "saturate(50%)",
|
||||||
|
animation: `fadeEffect 1s ${delay} forwards`,
|
||||||
|
opacity: 0,
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<div className="lg:my-6">
|
<div className="lg:my-6">
|
||||||
<h2
|
<h2
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import Underline from "../../../assets/Underline.svg";
|
import Underline from "../../../assets/Underline.svg";
|
||||||
import ServiceCardContainer from "./ServiceCardContainer";
|
import ServiceCardContainer from "./ServiceCardContainer";
|
||||||
|
|
||||||
const Services = () => {
|
const Services = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="header-text">
|
<div className="header-text">
|
||||||
<h1>
|
<h1>
|
||||||
We've got your{" "}
|
{t("services.heading.part1")}
|
||||||
<span className="relative inline-block">
|
<span className="relative inline-block">
|
||||||
footprint{" "}
|
{t("services.heading.part2")}{" "}
|
||||||
<img
|
<img
|
||||||
src={Underline}
|
src={Underline}
|
||||||
alt="underline"
|
alt="underline"
|
||||||
@@ -16,17 +19,8 @@ const Services = () => {
|
|||||||
</span>{" "}
|
</span>{" "}
|
||||||
</h1>
|
</h1>
|
||||||
<h1>
|
<h1>
|
||||||
bullsh
|
{t("services.heading.part3")}
|
||||||
<span className="bg-clip-text text-transparent bg-gradient-to-br from-gold-light to-gold-dark">
|
|
||||||
*
|
|
||||||
</span>
|
|
||||||
t covered
|
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<h2 className="sub-header-text">
|
|
||||||
Unlock the full potential of your business with our services.
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<ServiceCardContainer />
|
<ServiceCardContainer />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,14 +3,37 @@ import AlgorithmImg from "../../../assets/imgs/Algorithm.jpg";
|
|||||||
import ScheduleImg from "../../../assets/imgs/Schedule.jpg";
|
import ScheduleImg from "../../../assets/imgs/Schedule.jpg";
|
||||||
import TargetImg from "../../../assets/imgs/Target.jpg";
|
import TargetImg from "../../../assets/imgs/Target.jpg";
|
||||||
import ExpandImg from "../../../assets/imgs/Expand.jpg";
|
import ExpandImg from "../../../assets/imgs/Expand.jpg";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const SocialMediaCards = () => {
|
const SocialMediaCards = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
||||||
<Card title="Algorithm" description="Analise" imgSrc={AlgorithmImg} />
|
<Card
|
||||||
<Card title="Schedule" description="Content" imgSrc={ScheduleImg} />
|
title={t("services.cards.social.card1.title")}
|
||||||
<Card title="Target" description="Audience" imgSrc={TargetImg} />
|
description={t("services.cards.social.card1.description")}
|
||||||
<Card title="Expand" description="Platforms" imgSrc={ExpandImg} />
|
imgSrc={AlgorithmImg}
|
||||||
|
delay="0s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.social.card2.title")}
|
||||||
|
description={t("services.cards.social.card2.description")}
|
||||||
|
imgSrc={ScheduleImg}
|
||||||
|
delay="0.1s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.social.card3.title")}
|
||||||
|
description={t("services.cards.social.card3.description")}
|
||||||
|
imgSrc={TargetImg}
|
||||||
|
delay="0.2s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.social.card4.title")}
|
||||||
|
description={t("services.cards.social.card4.description")}
|
||||||
|
imgSrc={ExpandImg}
|
||||||
|
delay="0.3s"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,14 +3,37 @@ import IdealizeImg from "../../../assets/imgs/Idealize.png";
|
|||||||
import DesignImg from "../../../assets/imgs/Design.png";
|
import DesignImg from "../../../assets/imgs/Design.png";
|
||||||
import CodeImg from "../../../assets/imgs/Code.jpg";
|
import CodeImg from "../../../assets/imgs/Code.jpg";
|
||||||
import BuildImg from "../../../assets/imgs/Build.png";
|
import BuildImg from "../../../assets/imgs/Build.png";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const WesiteCards = () => {
|
const WesiteCards = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
<div className="h-full flex lg:mt-20 flex-col flex-wrap gap-4 xl:flex-row mx-4">
|
||||||
<Card title="Idealize" description="Website" imgSrc={IdealizeImg} />
|
<Card
|
||||||
<Card title="Design" description="Website" imgSrc={DesignImg} />
|
title={t("services.cards.website.card1.title")}
|
||||||
<Card title="Code" description="Website" imgSrc={CodeImg} />
|
description={t("services.cards.website.card1.description")}
|
||||||
<Card title="Build" description="Website" imgSrc={BuildImg} />
|
imgSrc={IdealizeImg}
|
||||||
|
delay="0s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.website.card2.title")}
|
||||||
|
description={t("services.cards.website.card2.description")}
|
||||||
|
imgSrc={DesignImg}
|
||||||
|
delay="0.1s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.website.card3.title")}
|
||||||
|
description={t("services.cards.website.card3.description")}
|
||||||
|
imgSrc={CodeImg}
|
||||||
|
delay="0.2s"
|
||||||
|
/>
|
||||||
|
<Card
|
||||||
|
title={t("services.cards.website.card4.title")}
|
||||||
|
description={t("services.cards.website.card4.description")}
|
||||||
|
imgSrc={BuildImg}
|
||||||
|
delay="0.3s"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="goldGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:#FACC97;stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:#54330F;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<path d="M9 0C7.355469 0 6 1.355469 6 3L6 50L44 50L44 3C44 1.355469 42.644531 0 41 0 Z M 9 2L41 2C41.554688 2 42 2.445313 42 3L42 48L38 48L38 36L27 36L27 48L8 48L8 3C8 2.445313 8.445313 2 9 2 Z M 12 6L12 14L23 14L23 6 Z M 27 6L27 14L38 14L38 6 Z M 14 8L21 8L21 12L14 12 Z M 29 8L36 8L36 12L29 12 Z M 12 16L12 24L23 24L23 16 Z M 27 16L27 24L38 24L38 16 Z M 14 18L21 18L21 22L14 22 Z M 29 18L36 18L36 22L29 22 Z M 12 26L12 34L23 34L23 26 Z M 27 26L27 34L38 34L38 26 Z M 14 28L21 28L21 32L14 32 Z M 29 28L36 28L36 32L29 32 Z M 12 36L12 44L23 44L23 36 Z M 14 38L21 38L21 42L14 42 Z M 29 38L36 38L36 48L29 48Z" fill="url(#goldGradient)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 200.688 200.688" xml:space="preserve">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="goldGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:#FACC97;stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:#54330F;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<path d="M190.985,111.644l-0.293-0.347c-1.399-1.729-4.459-4.187-8.922-5.891l-0.684-0.208
|
||||||
|
c-4.649-2.144-8.861-3.582-10.096-3.987c-0.97-0.319-1.782-0.666-2.43-0.948c-5.128-2.53-5.708-4.008-5.791-4.237l-0.233-0.544
|
||||||
|
l0.197-0.49c3.811-4.746,6.488-10.275,7.508-15.486l0.15-0.354c1.052-1.342,1.725-2.91,1.993-4.638
|
||||||
|
c1.213-4.384,1.263-7.605,0.175-9.863l-0.097-0.2l0.05-0.222c1.353-5.665,2.656-16.277-3.847-23.681
|
||||||
|
c-1.038-1.303-5.025-5.705-12.759-7.97l-3.772-1.292c-6.181-1.904-10.089-2.362-10.74-2.373c-0.412,0-0.78,0.05-1.317,0.168
|
||||||
|
l-0.465,0.093c-0.272-0.043-0.555-0.068-0.873-0.068c-2.069,0-4.305,0.909-4.305,0.909c-2.18,0.916-13.252,6.023-16.763,16.874
|
||||||
|
c-0.583,1.542-1.772,6.231-0.233,16.488l0.039,0.254l-0.161,0.215c-1.578,2.126-1.711,5.572-0.397,10.203
|
||||||
|
c0.344,2.051,1.013,3.69,1.997,4.924l0.165,0.347c0.97,5.372,3.357,10.665,6.904,15.317l0.283,0.376l-0.265,0.376
|
||||||
|
c-0.154,0.229-0.261,0.465-0.301,0.637c-0.544,1.553-4.706,4.012-11.159,6.596c-1.442-0.523-2.444-0.852-2.799-0.97
|
||||||
|
c-1.306-0.437-2.398-0.905-3.282-1.292c-6.825-3.368-7.723-5.332-7.859-5.783l-0.358-0.798l0.315-0.741
|
||||||
|
c5.121-6.381,8.715-13.811,10.096-20.843l0.211-0.483c1.417-1.8,2.323-3.905,2.663-6.199c1.628-5.866,1.714-10.182,0.247-13.192
|
||||||
|
l-0.161-0.319l0.086-0.344c1.822-7.609,3.568-21.845-5.161-31.762c-1.385-1.736-6.703-7.641-17.096-10.683l-5.078-1.743
|
||||||
|
C77.89,4.865,72.629,4.296,71.946,4.289c-0.558,0-1.041,0.061-1.746,0.229l-0.68,0.111c-2.813-0.455-6.27,0.88-6.896,1.124
|
||||||
|
c-2.928,1.228-17.769,8.092-22.475,22.643c-0.784,2.061-2.373,8.346-0.308,22.114l0.061,0.415l-0.258,0.344
|
||||||
|
c-2.104,2.813-2.265,7.412-0.501,13.621c0.451,2.734,1.346,4.917,2.673,6.589l0.233,0.49c1.285,7.208,4.491,14.326,9.266,20.593
|
||||||
|
l0.447,0.583l-0.426,0.616c-0.208,0.304-0.347,0.616-0.379,0.812c-1.185,3.375-14.394,9.276-25.968,12.809
|
||||||
|
c-8.332,3.157-11.989,8.271-12.011,8.303C1.503,132.72,0.05,169.292,0,170.863c0.179,9.513,4.499,11.445,5.329,11.724l0.73,0.319
|
||||||
|
c25.385,11.077,62.462,13.235,66.61,13.446l1.296,0.039c1.238,0,2.494-0.068,3.672-0.132l0.104-0.004l0.383,0.029
|
||||||
|
c0.308,0.075,0.558,0.115,0.816,0.115h0.004l0.175-0.007c1.678-0.086,41.486-2.348,66.327-13.496
|
||||||
|
c1.356-0.358,5.737-2.24,6.131-11.488c8.858-0.766,30.048-3.207,44.439-9.659c1.066-0.279,4.556-1.761,4.674-9.273
|
||||||
|
C200.527,149.587,199.142,123.776,190.985,111.644z M55.104,98.377l0.691-0.644l0.687,0.644c6.077,5.726,12.809,8.872,18.936,8.872
|
||||||
|
c6.438,0,13.084-2.792,19.218-8.081l0.519-0.437L96.5,99.39c1.145,1.041,3.196,2.537,4.116,2.988l1.267,0.619l-0.136,0.129
|
||||||
|
l0.487,0.293c1.16,0.684,2.394,1.353,3.804,2.054c1.428,0.633,2.652,1.109,3.951,1.539c0.254,0.086,6.317,2.044,13.227,5.243
|
||||||
|
l1.235,0.383c6.567,2.502,9.344,6.027,9.445,6.148c10.193,15.131,11.907,48.157,12.075,51.85c-0.079,5.161-1.55,6.499-1.933,6.757
|
||||||
|
c-22.844,10.225-57.355,12.884-64.033,13.31l-0.186,0.011l-0.19-0.057c-0.225-0.068-0.455-0.1-0.741-0.1h-0.007l-0.236,0.011
|
||||||
|
c-1.825,0.125-3.335,0.186-4.746,0.186h-1.106c-4.159-0.251-41.372-2.688-65.189-13.285c-0.48-0.2-1.886-1.825-1.99-6.571
|
||||||
|
c0.004-0.354,1.228-36.003,11.925-51.893c0.523-0.659,3.432-4.048,9.244-6.267c5.107-1.571,17.751-5.762,24.665-10.769
|
||||||
|
c0.29-0.175,0.576-0.469,0.884-0.784C52.838,100.639,53.89,99.508,55.104,98.377z M126.273,107.299l-0.945-0.276
|
||||||
|
c-1.553-0.716-3.182-1.424-4.867-2.115c2.38-1.113,4.327-2.205,5.773-3.26c0.233-0.136,0.465-0.372,0.684-0.601
|
||||||
|
c0.523-0.562,1.228-1.317,2.051-2.086l0.44-0.404l0.422,0.412c4.549,4.273,9.573,6.617,14.144,6.617
|
||||||
|
c4.817,0,9.781-2.083,14.351-6.027l0.326-0.276l0.923,0.447c0.841,0.784,2.373,1.886,3.056,2.226l0.798,0.379l-0.097,0.097
|
||||||
|
l0.501,0.293c0.87,0.519,1.8,1.013,2.842,1.528c1.07,0.472,1.979,0.83,2.942,1.152c0.186,0.061,4.656,1.496,9.824,3.89l0.909,0.279
|
||||||
|
c4.706,1.8,6.753,4.27,6.95,4.527c7.605,11.273,8.833,35.71,8.944,38.433c-0.054,3.779-1.102,4.746-1.364,4.917
|
||||||
|
c-14.308,6.403-34.851,8.808-43.49,9.566c-0.777-11.216-3.547-37.632-12.787-51.371l-0.39-0.469
|
||||||
|
C136.34,112.868,132.239,109.583,126.273,107.299z M120.922,66.479l0.161-0.19c0.723-0.53,1.077-1.349,0.941-2.197
|
||||||
|
c-1.718-10.318-0.601-14.648-0.218-15.74c2.996-9.187,12.419-13.474,14.272-14.233c0.372-0.143,1.092-0.358,1.854-0.487
|
||||||
|
l0.229-0.054l1.421-0.075l0.011,0.097l0.429-0.039c0.319-0.025,0.626-0.075,0.841-0.122l0.48-0.107
|
||||||
|
c0.304,0.007,4.026,0.49,9.42,2.144l3.804,1.306c6.907,2.04,10.107,5.851,10.697,6.621c5.551,6.299,4.062,15.776,2.677,20.868
|
||||||
|
c-0.157,0.626-0.061,1.27,0.297,1.797l0.308,0.397c0.39,0.523,0.744,2.602-0.458,7.083c-0.225,1.36-0.73,2.452-1.453,3.178
|
||||||
|
c-0.293,0.308-0.49,0.709-0.562,1.167c-1.872,10.998-11.721,23.291-22.096,23.291c-8.811,0-18.857-11.316-20.664-23.291
|
||||||
|
c-0.075-0.455-0.268-0.855-0.587-1.217c-0.737-0.762-1.213-1.875-1.507-3.554C120.35,70.008,120.253,67.492,120.922,66.479z
|
||||||
|
M44.249,54.626l0.24-0.276c0.931-0.669,1.381-1.721,1.21-2.809c-2.33-13.986-0.809-19.805-0.286-21.266
|
||||||
|
C49.46,17.853,62.215,12.045,64.72,11.014c0.523-0.2,1.496-0.494,2.527-0.662l0.276-0.064l2.101-0.115l0.007,0.132l0.451-0.043
|
||||||
|
c0.419-0.039,0.83-0.104,1.31-0.2l0.48-0.111c0.39,0.004,5.315,0.623,12.741,2.899l5.107,1.757
|
||||||
|
c9.334,2.759,13.682,7.924,14.48,8.958c7.508,8.521,5.504,21.344,3.643,28.234c-0.218,0.795-0.086,1.621,0.369,2.294l0.415,0.533
|
||||||
|
c0.684,0.916,0.941,3.983-0.587,9.663c-0.308,1.854-0.998,3.357-2.008,4.355c-0.369,0.394-0.608,0.909-0.712,1.492
|
||||||
|
c-2.541,14.87-15.869,31.497-29.905,31.497c-11.928,0-25.528-15.303-27.983-31.487c-0.082-0.583-0.322-1.109-0.744-1.568
|
||||||
|
c-1.024-1.056-1.671-2.577-2.069-4.839C43.437,59.479,43.315,56.054,44.249,54.626z" fill="url(#goldGradient)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.0 KiB |
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version='1.0' encoding='iso-8859-1'?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" height="800px" width="800px" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 463.001 463.001" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 463.001 463.001">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="goldGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:#FACC97;stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:#54330F;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path d="m441.044,308.903c-3.285-8.994-10.277-15.956-19.184-19.102-8.9-3.145-18.637-2.163-26.706,2.69l-78.169,46.902-10.752,4.607h-56.404c-0.691,0-1.077-0.386-1.278-0.71-0.202-0.324-0.379-0.841-0.073-1.46 0.174-0.354 0.474-0.622 0.845-0.754l42.802-15.295c16.563-5.566 26.054-22.511 21.614-38.615-2.33-8.452-7.861-15.368-15.573-19.475-7.594-4.044-16.624-4.798-24.766-2.071l-44.166,14.719-115.97,7.733c-7.614,0.508-14.778,3.759-20.173,9.154l-63.084,63.083c-12.102,12.102-13.223,31.298-2.553,43.701 2.82,3.279 14.975,14.926 33.195,32.322 10.618,10.137 20.646,19.711 25.407,24.472 1.458,1.458 3.378,2.197 5.306,2.197 1.698,0 3.403-0.575 4.8-1.738l34.649-28.875c7.263-6.053 16.471-9.387 25.927-9.387h118.622c4.294,0 8.473-0.857 12.42-2.549l55.987-23.995c0.156-0.067 0.31-0.139 0.46-0.216l2.842-1.453c0.151-0.077 0.3-0.159 0.444-0.247l79.285-47.571c13.38-8.028 19.371-24.037 14.246-38.067zm-21.962,25.204l-79.067,47.44-2.39,1.222-55.753,23.895c-2.069,0.887-4.261,1.336-6.512,1.336h-118.622c-12.958,0-25.576,4.568-35.53,12.864l-29.436,24.53c-5.38-5.224-12.912-12.415-20.765-19.912-13.202-12.604-29.632-28.289-32.183-31.255-5.488-6.379-4.686-16.837 1.789-23.312l63.084-63.084c2.824-2.825 6.576-4.527 10.563-4.793l116.93-7.797c0.638-0.042 1.267-0.166 1.872-0.368l45.088-15.027c1.724-0.577 3.49-0.863 5.247-0.863 2.656,0 5.289,0.654 7.716,1.946 4.04,2.152 6.939,5.782 8.163,10.223 2.288,8.298-3.086,17.461-11.979,20.425-0.051,0.017-0.102,0.035-0.151,0.053l-42.872,15.32c-4.063,1.452-7.35,4.384-9.256,8.256-2.534,5.152-2.236,11.137 0.798,16.011 3.034,4.874 8.272,7.783 14.013,7.783h57.943c1.016,0 2.021-0.206 2.954-0.606l12.635-5.414c0.312-0.133 0.614-0.288 0.904-0.462l78.612-47.168c4.224-2.542 9.32-3.052 13.986-1.405 4.737,1.674 8.321,5.262 10.09,10.105 2.62,7.17-0.764,15.793-7.871,20.057z" fill="url(#goldGradient)"/>
|
||||||
|
<path d="m283.86,222.171v17.329c0,4.142 3.357,7.5 7.5,7.5s7.5-3.358 7.5-7.5v-23.144c0-0.003 0-0.007 0-0.01v-35.026c72.319-10.024 129.001-68.702 135.967-141.961 0.211-2.227-0.582-4.432-2.163-6.013-1.582-1.583-3.791-2.378-6.014-2.163-56.453,5.368-104.245,40.259-127.79,89.077v-88.76c0-9.098 7.401-16.5 16.5-16.5 4.143,0 7.5-3.358 7.5-7.5s-3.357-7.5-7.5-7.5c-17.369,0-31.5,14.131-31.5,31.5v28.212c-15.596-24.116-41.665-40.814-71.79-43.678-2.224-0.212-4.433,0.581-6.014,2.163-1.581,1.582-2.374,3.787-2.163,6.013 4.147,43.615 37.298,78.706 79.967,85.844v51.058c-23.546-48.818-71.337-83.711-127.79-89.078-2.227-0.214-4.432,0.581-6.014,2.163-1.581,1.582-2.374,3.787-2.163,6.013 6.966,73.259 63.648,131.936 135.967,141.961zm-63.519-189.691c30.938,6.768 55.271,31.101 62.039,62.04-30.94-6.768-55.273-31.101-62.039-62.04zm198.349,14.839c-9.04,55.857-50.24,100.852-104.009,115.466l61.982-61.982c2.929-2.929 2.929-7.678 0-10.606-2.93-2.929-7.678-2.929-10.607,0l-63.451,63.451c13.935-54.904 59.426-97.159 116.085-106.329zm-138.575,147.179l-63.451-63.451c-2.93-2.929-7.678-2.929-10.607,0s-2.929,7.678 0,10.606l61.982,61.982c-53.77-14.615-94.969-59.61-104.009-115.466 56.658,9.17 102.15,51.426 116.085,106.329z" fill="url(#goldGradient)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
+29
@@ -0,0 +1,29 @@
|
|||||||
|
import i18n from "i18next";
|
||||||
|
import { initReactI18next } from "react-i18next";
|
||||||
|
import LanguageDetector from "i18next-browser-languagedetector";
|
||||||
|
import Backend from "i18next-http-backend";
|
||||||
|
|
||||||
|
i18n
|
||||||
|
.use(Backend)
|
||||||
|
// detect user language
|
||||||
|
// learn more: https://github.com/i18next/i18next-browser-languageDetector
|
||||||
|
.use(LanguageDetector)
|
||||||
|
// pass the i18n instance to react-i18next.
|
||||||
|
.use(initReactI18next)
|
||||||
|
// init i18next
|
||||||
|
// for all options read: https://www.i18next.com/overview/configuration-options
|
||||||
|
.init({
|
||||||
|
ns: ['common', 'TOS'],
|
||||||
|
defaultNS: 'common',
|
||||||
|
backend: {
|
||||||
|
// translation file path
|
||||||
|
loadPath: (lng : string, ns : string) => `/locales/${ns}/${lng}.json`,
|
||||||
|
},
|
||||||
|
debug: true,
|
||||||
|
fallbackLng: "en",
|
||||||
|
interpolation: {
|
||||||
|
escapeValue: false, // not needed for react as it escapes by default
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default i18n;
|
||||||
@@ -11,6 +11,16 @@ body {
|
|||||||
.hero-text {
|
.hero-text {
|
||||||
@apply font-medium text-5xl lg:text-7xl xl:text-8xl;
|
@apply font-medium text-5xl lg:text-7xl xl:text-8xl;
|
||||||
}
|
}
|
||||||
|
.hero-text-pt {
|
||||||
|
@apply font-medium text-4xl lg:text-6xl xl:text-7xl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-sub-text {
|
||||||
|
@apply italic text-lg md:text-2xl 2xl:text-3xl;
|
||||||
|
}
|
||||||
|
.hero-sub-text-pt {
|
||||||
|
@apply italic text-lg md:text-xl 2xl:text-2xl;
|
||||||
|
}
|
||||||
|
|
||||||
.header-text {
|
.header-text {
|
||||||
@apply mt-20 lg:mt-48 text-3xl md:text-5xl xl:text-7xl text-center;
|
@apply mt-20 lg:mt-48 text-3xl md:text-5xl xl:text-7xl text-center;
|
||||||
@@ -23,3 +33,39 @@ body {
|
|||||||
.form-input {
|
.form-input {
|
||||||
@apply rounded-xl px-4 py-2 mt-2 bg-gray-bg border-solid border border-gray-300 text-sm md:text-lg;
|
@apply rounded-xl px-4 py-2 mt-2 bg-gray-bg border-solid border border-gray-300 text-sm md:text-lg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.gold-text {
|
||||||
|
@apply bg-clip-text text-transparent bg-gradient-to-br from-gold-light to-gold-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-effect {
|
||||||
|
animation: fadeEffect 1s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-card-heading {
|
||||||
|
@apply mt-2 lg:mt-6 text-3xl xl:text-5xl;
|
||||||
|
}
|
||||||
|
.results-card-heading-pt {
|
||||||
|
@apply mt-2 lg:mt-6 text-2xl xl:text-4xl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-card-content {
|
||||||
|
@apply mb-2 mt-3 italic text-lg xl:text-2xl font-medium text-gray-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-text {
|
||||||
|
@apply text-gray-400 font-medium text-xs md:text-base
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-text-pt {
|
||||||
|
@apply text-gray-400 font-medium text-xs md:text-base
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeEffect {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+7
-2
@@ -1,13 +1,18 @@
|
|||||||
import React from "react";
|
import React, { Suspense } from "react";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import App from "./App.tsx";
|
import App from "./App.tsx";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
|
|
||||||
|
import "./i18n";
|
||||||
|
import Loading from "./Components/Loading.tsx";
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById("root")!).render(
|
ReactDOM.createRoot(document.getElementById("root")!).render(
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App />
|
<Suspense fallback={<Loading />}>
|
||||||
|
<App />
|
||||||
|
</Suspense>
|
||||||
</React.StrictMode>
|
</React.StrictMode>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
);
|
);
|
||||||
|
|||||||
+8
-2
@@ -1,8 +1,10 @@
|
|||||||
import Navbar from "../Components/Pages/Navbar/Navbar";
|
import Navbar from "../Components/Navbar/Navbar";
|
||||||
import Hero from "../Components/Pages/Hero/Hero";
|
import Hero from "../Components/Pages/Hero/Hero";
|
||||||
import Services from "../Components/Pages/Services/Services";
|
import Services from "../Components/Pages/Services/Services";
|
||||||
import ResultsPage from "../Components/Pages/Results/ResultsPage";
|
import ResultsPage from "../Components/Pages/Results/ResultsPage";
|
||||||
|
import Optimization from "../Components/Pages/Optimization/Optimization";
|
||||||
import ContactPage from "../Components/Pages/Contact/ContactPage";
|
import ContactPage from "../Components/Pages/Contact/ContactPage";
|
||||||
|
import Footer from "../Components/Footer/Footer";
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
return (
|
return (
|
||||||
@@ -12,12 +14,16 @@ const Home = () => {
|
|||||||
<div id="Services">
|
<div id="Services">
|
||||||
<Services />
|
<Services />
|
||||||
</div>
|
</div>
|
||||||
<div id="Results">
|
<div id="Optimization">
|
||||||
|
<Optimization />
|
||||||
|
</div>
|
||||||
|
<div id="Advantages">
|
||||||
<ResultsPage />
|
<ResultsPage />
|
||||||
</div>
|
</div>
|
||||||
<div id="Contact">
|
<div id="Contact">
|
||||||
<ContactPage />
|
<ContactPage />
|
||||||
</div>
|
</div>
|
||||||
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import Navbar from "../Components/Navbar/Navbar";
|
||||||
|
import Footer from "../Components/Footer/Footer";
|
||||||
|
|
||||||
|
const PP = () => {
|
||||||
|
const { t } = useTranslation("PP")
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen">
|
||||||
|
<Navbar />
|
||||||
|
<div className="container mx-auto px-4 py-12">
|
||||||
|
<h1 className="text-3xl font-bold text-center mb-6">{t("pp.pageTitle")}</h1>
|
||||||
|
<div className="shadow-md rounded-lg p-8">
|
||||||
|
<p className="mb-4">{t("pp.lastUpdated")}</p>
|
||||||
|
<p className="mb-4">{t("pp.introText")}</p>
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp1.title")}</h2>
|
||||||
|
{t("pp.pp1.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp2.title")}</h2>
|
||||||
|
{t("pp.pp2.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp3.title")}</h2>
|
||||||
|
{t("pp.pp3.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp4.title")}</h2>
|
||||||
|
{t("pp.pp4.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp5.title")}</h2>
|
||||||
|
{t("pp.pp5.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp6.title")}</h2>
|
||||||
|
{t("pp.pp6.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp7.title")}</h2>
|
||||||
|
{t("pp.pp7.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("pp.pp8.title")}</h2>
|
||||||
|
{t("pp.pp8.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Footer/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PP;
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import Navbar from "../Components/Navbar/Navbar";
|
||||||
|
import Footer from "../Components/Footer/Footer";
|
||||||
|
|
||||||
|
const TOS = () => {
|
||||||
|
const { t } = useTranslation("TOS")
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen">
|
||||||
|
<Navbar />
|
||||||
|
<div className="container mx-auto px-4 py-12">
|
||||||
|
<h1 className="text-3xl font-bold text-center mb-6">{t("tos.pageTitle")}</h1>
|
||||||
|
<div className="shadow-md rounded-lg p-8">
|
||||||
|
<p className="mb-4">{t("tos.lastUpdated")}</p>
|
||||||
|
<p className="mb-4">{t("tos.introText")}</p>
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos1.title")}</h2>
|
||||||
|
{t("tos.tos1.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos2.title")}</h2>
|
||||||
|
{t("tos.tos2.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos3.title")}</h2>
|
||||||
|
{t("tos.tos3.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos4.title")}</h2>
|
||||||
|
{t("tos.tos4.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos5.title")}</h2>
|
||||||
|
{t("tos.tos5.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
<h2 className="text-2xl font-semibold mb-4">{t("tos.tos6.title")}</h2>
|
||||||
|
{t("tos.tos6.desc").split("\n\n").map((paragraph, index) => (
|
||||||
|
<p key={index} className="mb-4">{paragraph.split("\n").map((line, index) => (
|
||||||
|
<span key={index}>{line}<br/></span>
|
||||||
|
))}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Footer/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TOS;
|
||||||
+14
-6
@@ -2,10 +2,13 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2020",
|
"target": "ES2020",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
"lib": [
|
||||||
|
"ES2020",
|
||||||
|
"DOM",
|
||||||
|
"DOM.Iterable"
|
||||||
|
],
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
|
|
||||||
/* Bundler mode */
|
/* Bundler mode */
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowImportingTsExtensions": true,
|
"allowImportingTsExtensions": true,
|
||||||
@@ -13,13 +16,18 @@
|
|||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
|
|
||||||
/* Linting */
|
/* Linting */
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noUnusedLocals": true,
|
"noUnusedLocals": true,
|
||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"noFallthroughCasesInSwitch": true
|
"noFallthroughCasesInSwitch": true
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": [
|
||||||
"references": [{ "path": "./tsconfig.node.json" }]
|
"src"
|
||||||
}
|
],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.node.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user