diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c5a9891 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18-alpine + +# Path: /app + +WORKDIR /lk-results/ + +COPY . . + +RUN npm install +RUN npm run build +RUN npm install -g serve + +CMD ["serve", "-s", "build"] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b38db3e..005d2ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1813,12 +1813,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2517,10 +2518,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2901,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4204,6 +4207,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, diff --git a/public/locales/en.json b/public/locales/en.json index b290042..711fb79 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -10,10 +10,12 @@ "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!" }, @@ -22,9 +24,12 @@ "part1": "We've got your", "part2": "footprint", "part3": "bullsh", - "part4": "t covered!" + "part4": "*", + "part5": "t covered!" }, + "subheading": "Unlock the full potential of your business with our services.", + "cards": { "marketing": { "card1": { @@ -44,6 +49,7 @@ "description": "Plan" } }, + "website": { "card1": { "title": "Idealize", @@ -62,6 +68,7 @@ "description": "Website" } }, + "social": { "card1": { "title": "Analyze", @@ -80,6 +87,7 @@ "description": "Platforms" } }, + "media": { "card1": { "title": "Envision", @@ -100,31 +108,38 @@ } } }, + "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": "GARANTEED", "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." + "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", @@ -132,10 +147,12 @@ "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", diff --git a/public/locales/pt.json b/public/locales/pt.json new file mode 100644 index 0000000..1715a86 --- /dev/null +++ b/public/locales/pt.json @@ -0,0 +1,153 @@ +{ + "navbar": { + "services": "Serviços", + "advantages": "Vantagens", + "contact": "Contacto" + }, + "hero": { + "heading": { + "part1": "CRESÇA O", + "part2": "SEU NEGÓCIO" + }, + "subheading": { + "part1": "Nós tratamos de toda a sua presença digital,", + "part2": "para que possa concentrar-se no que é importante!" + }, + "button": "Eu quero isto!" + }, + "services": { + "heading": { + "part1": "Nós cuidamos da sua", + "part2": "presença", + "part3": "digital", + "part4": " ", + "part5": "por completo!" + }, + "subheading": "Desbloqueie todo o potencial do seu negócio com os nossos serviços.", + "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" + } + } + } + }, + "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 você ganhar!\nEssa é a base para uma boa\nparceria.\nVocê não vai carregar todo o risco,\nnós 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 poderá\ncontactar-nos quando precisar." + }, + "card4": { + "title": "ESPECIALIZADO", + "description": "Faz-tudo... mestre de nada. A especialização\nfunciona. Trabalhamos com\nindústrias que conhecemos, para que possamos\ngarantir resultados." + } + } + }, + "contact": { + "heading": { + "part1": "Contacte-nos para uma", + "part2": "Análise", + "part3": "Gratuita", + "part4": "" + }, + "subheading": { + "part1": "Gostaria de saber o que podemos fazer por si? Preencha o formulário e nós entraremos", + "part2": "em contacto consigo. Sem obrigações, sem táticas irritantes. Não vamos desperdiçar o seu tempo." + }, + "form": { + "name": "Nome", + "email": "Email", + "company": "Empresa", + "phone": "Telefone", + "question": "Qual é a sua pergunta mais importante?", + "message": "Mensagem", + "button": "Enviar" + }, + "toasts": { + "success": "A sua mensagem foi enviada com sucesso!", + "error": "Ocorreu um erro ao enviar a sua mensagem. Por favor, tente novamente mais tarde.", + "empty": "Por favor, preencha todos os campos antes de enviar a mensagem." + } + } +} diff --git a/src/Components/Footer/Footer.tsx b/src/Components/Footer/Footer.tsx index d7cc818..af25446 100644 --- a/src/Components/Footer/Footer.tsx +++ b/src/Components/Footer/Footer.tsx @@ -19,7 +19,7 @@ const Footer = () => { > - { - + */}

© 2024 LK Results. All rights reservered. diff --git a/src/Components/Navbar/Navbar.tsx b/src/Components/Navbar/Navbar.tsx index 0ca21f9..c065061 100644 --- a/src/Components/Navbar/Navbar.tsx +++ b/src/Components/Navbar/Navbar.tsx @@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next"; export default () => { const [state, setState] = useState(false); - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const [colorChange, setColorChange] = useState(false); const changeColor = () => { @@ -28,7 +28,16 @@ export default () => { const handleNavigation = (path: string) => { const element = document.getElementById(path); - element?.scrollIntoView({ behavior: "smooth" }); + 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 ( @@ -64,7 +73,7 @@ export default () => {

{ : "hidden md:flex" }`} > -
diff --git a/src/Components/Pages/Hero/Hero.tsx b/src/Components/Pages/Hero/Hero.tsx index 5db431c..620a7db 100644 --- a/src/Components/Pages/Hero/Hero.tsx +++ b/src/Components/Pages/Hero/Hero.tsx @@ -7,7 +7,12 @@ const Hero = () => { const handleNavigation = (path: string) => { const element = document.getElementById(path); - element?.scrollIntoView({ behavior: "smooth" }); + 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 ( diff --git a/src/Components/Pages/Services/CameraCards.tsx b/src/Components/Pages/Services/CameraCards.tsx index f4cfef3..47c8e06 100644 --- a/src/Components/Pages/Services/CameraCards.tsx +++ b/src/Components/Pages/Services/CameraCards.tsx @@ -9,26 +9,30 @@ const CameraCards = () => { const { t } = useTranslation(); return ( -
+
); diff --git a/src/Components/Pages/Services/MarketingCards.tsx b/src/Components/Pages/Services/MarketingCards.tsx index 9b2b463..ba1cbd8 100644 --- a/src/Components/Pages/Services/MarketingCards.tsx +++ b/src/Components/Pages/Services/MarketingCards.tsx @@ -9,26 +9,30 @@ const MarketingCards = () => { const { t } = useTranslation(); return ( -
+
); diff --git a/src/Components/Pages/Services/ServiceCard.tsx b/src/Components/Pages/Services/ServiceCard.tsx index 3b22a7b..c4cc001 100644 --- a/src/Components/Pages/Services/ServiceCard.tsx +++ b/src/Components/Pages/Services/ServiceCard.tsx @@ -2,13 +2,18 @@ interface IProps { title: string; description: string; imgSrc: string; + delay: string; } -const Card = ({ title, description, imgSrc }: IProps) => { +const Card = ({ title, description, imgSrc, delay }: IProps) => { return (

{

{t("services.heading.part3")} - * - {t("services.heading.part4")} + {t("services.heading.part4")} + {t("services.heading.part5")}

{t("services.subheading")}

diff --git a/src/Components/Pages/Services/SocialMedia.tsx b/src/Components/Pages/Services/SocialMedia.tsx index cd5085a..0fae620 100644 --- a/src/Components/Pages/Services/SocialMedia.tsx +++ b/src/Components/Pages/Services/SocialMedia.tsx @@ -9,26 +9,30 @@ const SocialMediaCards = () => { const { t } = useTranslation(); return ( -
+
); diff --git a/src/Components/Pages/Services/WesiteCards.tsx b/src/Components/Pages/Services/WesiteCards.tsx index f9a48aa..0ad69a1 100644 --- a/src/Components/Pages/Services/WesiteCards.tsx +++ b/src/Components/Pages/Services/WesiteCards.tsx @@ -9,26 +9,30 @@ const WesiteCards = () => { const { t } = useTranslation(); return ( -
+
);