From e4fd3ad107026092466f41d607b09170d9426ba3 Mon Sep 17 00:00:00 2001 From: jaaaaavier Date: Thu, 26 Mar 2026 17:07:33 +0100 Subject: [PATCH] feat: levante ud LP --- src/assets/lang/de/metatags-descriptions.json | 7 + src/assets/lang/en/levante-ud.json | 48 ++++++ src/assets/lang/en/metatags-descriptions.json | 5 + src/assets/lang/es/metatags-descriptions.json | 7 + src/assets/lang/fr/metatags-descriptions.json | 5 + src/assets/lang/it/metatags-descriptions.json | 7 + src/assets/lang/ru/metatags-descriptions.json | 5 + .../lang/zh-tw/metatags-descriptions.json | 7 + src/assets/lang/zh/metatags-descriptions.json | 7 + .../certificationsSections.tsx | 57 +++++-- .../levanteud/DigitalIndependenceSection.tsx | 55 +++++++ src/components/levanteud/HeroSection.tsx | 102 ++++++++++++ .../levanteud/LeadingOrganitationsSection.tsx | 150 ++++++++++++++++++ src/pages/levanteud.tsx | 98 ++++++++++++ 14 files changed, 546 insertions(+), 14 deletions(-) create mode 100644 src/assets/lang/en/levante-ud.json create mode 100644 src/components/levanteud/DigitalIndependenceSection.tsx create mode 100644 src/components/levanteud/HeroSection.tsx create mode 100644 src/components/levanteud/LeadingOrganitationsSection.tsx create mode 100644 src/pages/levanteud.tsx diff --git a/src/assets/lang/de/metatags-descriptions.json b/src/assets/lang/de/metatags-descriptions.json index 5b9246108..bcd34fe15 100644 --- a/src/assets/lang/de/metatags-descriptions.json +++ b/src/assets/lang/de/metatags-descriptions.json @@ -548,5 +548,12 @@ "id": "alternative-to-totalav", "title": "Internxt — TotalAV Alternative", "description": "Wechseln Sie zu Internxt für eine Open-Source-Alternative zu TotalAV. Inklusive Post-Quanten- und Zero-Knowledge-verschlüsseltem Cloud-Speicher und mehr." + }, + { + "id": "levante-ud", + "title": "Internxt — Offizieller Cloud-Partner von Levante UD", + "description": "Internxt ist ein offizieller Partner von Levante UD und bietet verschlüsselten Cloud-Speicher und Backups zum Schutz der wertvollen Daten des Vereins.", + "og:title": "Internxt — Offizieller Cloud-Partner von Levante UD", + "og:description": "Internxt ist ein offizieller Partner von Levante UD und bietet verschlüsselten Cloud-Speicher und Backups zum Schutz der wertvollen Daten des Vereins." } ] \ No newline at end of file diff --git a/src/assets/lang/en/levante-ud.json b/src/assets/lang/en/levante-ud.json new file mode 100644 index 000000000..c7075e238 --- /dev/null +++ b/src/assets/lang/en/levante-ud.json @@ -0,0 +1,48 @@ +{ + "HeroSection":{ + "title": "A **partnership** born from a passion for\n security and advanced data protection" + }, + "DigitalIndependenceSection":{ + "title":"Digital independence through \nsports collaboration", + "features":[ + "**Founded in 1909 in Valencia**, Spain, Levante UD is the **oldest football club** in the city with a rich history of resilience and passion to become one of the most respected football teams in La Liga, Spain’s top sports division.", + "Also based in Valencia, Internxt is creating a digital world that respects users' privacy. Through its suite of products, such as Drive, Mail, Meet, VPN, Antivirus, and Send, Internxt offers cloud storage and communication solutions with post-quantum end-to-end encryption to thousands of customers worldwide.", + "This collaboration highlights Internxt’s expanding role in the European tech landscape, where it advances a model built on privacy, trust, and digital independence.", + "Just like our zero-knowledge architecture protects your data without compromise, Levante's fighting spirit inspires us to push boundaries \nevery day." + ] + }, + "LeadingOrganizationsSection":{ + "title":"Why leading organizations trust Internxt", + "subtitle":[ + "Internxt provides a private, encrypted product suite including Drive, VPN, Antivirus, Mail, and Meet for maximum online privacy.", + "Internxt and Levante have partnered to unite technology and sport under a shared vision of progress and security. As Levante modernizes its digital infrastructure, Internxt will support the Club with secure, encrypted cloud storage to keep its data safe and private." + ], + "cards":[ + { + "title": "Advanced encryption", + "description":[ + "Internxt drives innovation with the most advanced post-quantum encryption trusted by the historic football team, Levante UD.", + "This collaboration reflects Internxt’s growing influence in the European tech landscape, where it continues to drive forward a model of innovation rooted in privacy, trust, and digital independence.", +"As cybersecurity evolves with emerging quantum threats, Internxt continues to prioritize a security-first approach to protect data across users and industries." + ] + }, + { + "title":"Open source & verified", + "description":[ + "Internxt’s mission of privacy is reflected in its open source software and verifiable infrastructure. To maximize trust, it is independently audited to ensure strong security for users, businesses, and enterprises worldwide." + ] + }, + { + "title":"Certified security standards", + "description":[ + "Backed by GDPR, ISO 27001, SOC 2, and HIPAA compliance, Internxt provides certified security frameworks that protect sensitive data across industries while supporting Levante UD for its cloud storage needs." + ] + } + ] + }, + + "ctaBanner": { + "description": "Internxt combines secure cloud technology with sporting excellence to provide maximum security, control, and digital independence.", + "cta": "Get Internxt" + } +} diff --git a/src/assets/lang/en/metatags-descriptions.json b/src/assets/lang/en/metatags-descriptions.json index aa4db727a..4a23faa2e 100644 --- a/src/assets/lang/en/metatags-descriptions.json +++ b/src/assets/lang/en/metatags-descriptions.json @@ -738,5 +738,10 @@ "id": "alternative-to-totalav", "title": "Internxt — TotalAV Alternative", "description": "Switch to Internxt for an open-source alternative to TotalAV. Includes post-quantum and zero-knowledge encrypted cloud storage and more." + }, + { + "id": "levante-ud", + "title": "Internxt — Official Cloud Partner of Levante UD", + "description": "Internxt is an official partner of Levante UD, providing encrypted cloud storage and backups to protect the club’s valuable data." } ] \ No newline at end of file diff --git a/src/assets/lang/es/metatags-descriptions.json b/src/assets/lang/es/metatags-descriptions.json index e7ea894cf..f492966c4 100644 --- a/src/assets/lang/es/metatags-descriptions.json +++ b/src/assets/lang/es/metatags-descriptions.json @@ -638,5 +638,12 @@ "id": "alternative-to-totalav", "title": "Internxt — Internxt — Alternativa a TotalAV", "description": "Pásate a Internxt para una alternativa de código abierto a TotalAV. Incluye almacenamiento en la nube con cifrado post-cuántico y de conocimiento cero, y más." + }, + { + "id": "levante-ud", + "title": "Internxt — Partner oficial en la nube del Levante UD", + "description": "Internxt es socio oficial del Levante UD, proporcionando almacenamiento cifrado en la nube y copias de seguridad para proteger los valiosos datos del club.", + "og:title": "Internxt — Partner oficial en la nube del Levante UD", + "og:description": "Internxt es socio oficial del Levante UD, proporcionando almacenamiento cifrado en la nube y copias de seguridad para proteger los valiosos datos del club." } ] \ No newline at end of file diff --git a/src/assets/lang/fr/metatags-descriptions.json b/src/assets/lang/fr/metatags-descriptions.json index d655f687a..6318fbfdb 100644 --- a/src/assets/lang/fr/metatags-descriptions.json +++ b/src/assets/lang/fr/metatags-descriptions.json @@ -538,5 +538,10 @@ "id": "alternative-to-totalav", "title": "Internxt — Alternative à TotalAV", "description": "Passez à Internxt pour une alternative open-source à TotalAV. Comprend un stockage cloud crypté post-quantique et à connaissance zéro, et plus encore." + }, + { + "id": "levante-ud", + "title": "Internxt — Partenaire cloud officiel du Levante UD", + "description": "Internxt est un partenaire officiel de Levante UD, fournissant un stockage cloud chiffré et des sauvegardes pour protéger les données précieuses du club." } ] \ No newline at end of file diff --git a/src/assets/lang/it/metatags-descriptions.json b/src/assets/lang/it/metatags-descriptions.json index 918c6208e..452a43814 100644 --- a/src/assets/lang/it/metatags-descriptions.json +++ b/src/assets/lang/it/metatags-descriptions.json @@ -568,5 +568,12 @@ "id": "alternative-to-totalav", "title": "Internxt — Alternativa a TotalAV", "description": "Passa a Internxt per un'alternativa open-source a TotalAV. Include archiviazione cloud crittografata post-quantistica e zero-knowledge e altro ancora." + }, + { + "id": "levante-ud", + "title": "Internxt — Partner cloud ufficiale del Levante UD", + "description": "Internxt è un partner ufficiale di Levante UD, che fornisce archiviazione cloud crittografata e backup per proteggere i preziosi dati del club.", + "og:title": "Internxt — Partner cloud ufficiale del Levante UD", + "og:description": "Internxt è un partner ufficiale di Levante UD, che fornisce archiviazione cloud crittografata e backup per proteggere i preziosi dati del club." } ] \ No newline at end of file diff --git a/src/assets/lang/ru/metatags-descriptions.json b/src/assets/lang/ru/metatags-descriptions.json index 182793058..24a703a3c 100644 --- a/src/assets/lang/ru/metatags-descriptions.json +++ b/src/assets/lang/ru/metatags-descriptions.json @@ -553,5 +553,10 @@ "id": "alternative-to-totalav", "title": "Internxt — Альтернатива TotalAV", "description": "Перейдите на Internxt — альтернативу TotalAV с открытым исходным кодом. Включает облачное хранилище с постквантовым шифрованием и нулевым разглашением и многое другое." + }, + { + "id": "levante-ud", + "title": "Internxt — официальный облачный партнер «Леванте»", + "description": "Internxt является официальным партнером «Леванте», предоставляя зашифрованное облачное хранилище и резервное копирование для защиты ценных данных клуба." } ] \ No newline at end of file diff --git a/src/assets/lang/zh-tw/metatags-descriptions.json b/src/assets/lang/zh-tw/metatags-descriptions.json index a71e65f89..e2979db1b 100644 --- a/src/assets/lang/zh-tw/metatags-descriptions.json +++ b/src/assets/lang/zh-tw/metatags-descriptions.json @@ -549,6 +549,13 @@ "title": "Internxt — Sync 的替代方案", "description": "切換到 Internxt,體驗 Sync 的開源替代方案。後量子和零知識加密雲端儲存,為您提供全方位的檔案隱私保護。" }, + { + "id": "levante-ud", + "title": "Internxt — 萊萬特體育會 (Levante UD) 官方雲端合作夥伴", + "description": "Internxt 是萊萬特體育會 (Levante UD) 的官方合作夥伴,提供加密雲端儲存及備份服務,保護俱樂部的寶貴數據。", + "og:title": "Internxt — 萊萬特體育會 (Levante UD) 官方雲端合作夥伴", + "og:description": "Internxt 是萊萬特體育會 (Levante UD) 的官方合作夥伴,提供加密雲端儲存及備份服務,保護俱樂部的寶貴數據。" + }, { "id": "filen-alternative", "title": "Internxt — Filen 的替代方案", diff --git a/src/assets/lang/zh/metatags-descriptions.json b/src/assets/lang/zh/metatags-descriptions.json index 7cdcf05f3..ba18616ff 100644 --- a/src/assets/lang/zh/metatags-descriptions.json +++ b/src/assets/lang/zh/metatags-descriptions.json @@ -389,6 +389,13 @@ "title": "Internxt — Sync 的替代方案", "description": "切换到 Internxt,体验 Sync 的开源替代方案。后量子和零知识加密云存储,为您提供全方位的档案隐私保护。" }, + { + "id": "levante-ud", + "title": "Internxt — 莱万特足球俱乐部 (Levante UD) 官方云合作伙伴", + "description": "Internxt 是莱万特足球俱乐部 (Levante UD) 的官方合作伙伴,提供加密云存储及备份服务,保护俱乐部的宝贵数据。", + "og:title": "Internxt — 莱万特足球俱乐部 (Levante UD) 官方云合作伙伴", + "og:description": "Internxt 是莱万特足球俱乐部 (Levante UD) 的官方合作伙伴,提供加密云存储及备份服务,保护俱乐部的宝贵数据。" + }, { "id": "filen-alternative", "title": "Internxt — Filen 的替代方案", diff --git a/src/components/cloud-object-storage/certificationsSections.tsx b/src/components/cloud-object-storage/certificationsSections.tsx index f07b2ba78..d75765921 100644 --- a/src/components/cloud-object-storage/certificationsSections.tsx +++ b/src/components/cloud-object-storage/certificationsSections.tsx @@ -2,7 +2,7 @@ import { getImage } from '@/lib/getImage'; import Image from 'next/image'; export const CertificationsSection = () => { - const certifications = [ + const certifications = [ { src: '/images/datacenters-and-certifications/ISO.webp', width: 48, alt: 'ISO Certification' }, { src: '/images/datacenters-and-certifications/HipaaCompilance.webp', width: 102, alt: 'HIPAA Compliance' }, { src: '/images/datacenters-and-certifications/AICPA.webp', width: 120, alt: 'AICPA Certification' }, @@ -10,23 +10,52 @@ export const CertificationsSection = () => { { src: '/images/datacenters-and-certifications/ENS.webp', width: 110, alt: 'ENS Certification' }, { src: '/images/datacenters-and-certifications/CSA.webp', width: 48, alt: 'CSA Certification' }, ]; + return ( -
-
- {certifications.map((cert, index) => ( +
+ +
+ +
+ {[...certifications, ...certifications].map((cert, index) => ( {cert.alt} + ))} +
+
+ + {/* Desktop: static row */} +
+ {certifications.map((cert) => ( + {cert.alt} ))} -
- +
+
); }; diff --git a/src/components/levanteud/DigitalIndependenceSection.tsx b/src/components/levanteud/DigitalIndependenceSection.tsx new file mode 100644 index 000000000..e2d7ab966 --- /dev/null +++ b/src/components/levanteud/DigitalIndependenceSection.tsx @@ -0,0 +1,55 @@ +import Image from 'next/image'; +import { getImage } from '@/lib/getImage'; + +interface DigitalIndependenceSectionProps { + textContent: any; +} + +export default function DigitalIndependenceSection({ + textContent, +}: Readonly): JSX.Element { + const HighlightText = ({ text, className = 'text-base text-start leading-tight lg:whitespace-pre-line text-gray-55' }) => { + const parts = text.split(/(\*\*.*?\*\*)/); + + return ( + + {parts.map((part, index) => { + if (part.startsWith('**') && part.endsWith('**')) { + return ( + + {part.slice(2, -2)} + + ); + } + return {part}; + })} + + ); + }; + + return ( +
+

{textContent.title}

+
+
+ {textContent.features.map((feature, index) => ( + + ))} +
+ Internxt x Levante +
+ + +
+ ); +} diff --git a/src/components/levanteud/HeroSection.tsx b/src/components/levanteud/HeroSection.tsx new file mode 100644 index 000000000..75a54e962 --- /dev/null +++ b/src/components/levanteud/HeroSection.tsx @@ -0,0 +1,102 @@ +'use client'; + +import Image from 'next/image'; +import { useEffect, useRef } from 'react'; +import { getImage } from '@/lib/getImage'; + +interface HeroSectionProps { + textContent: any; +} + +const IMAGES = [ + { src: '/images/Levante/Levante1.webp', width: 452, height: 320 }, + { src: '/images/Levante/Levante2.webp', width: 365, height: 320 }, + { src: '/images/Levante/Levante4.webp', width: 558, height: 372 }, + { src: '/images/Levante/Levante5.webp', width: 558, height: 372 }, +]; + +export default function HeroSection({ + textContent, +}: Readonly): JSX.Element { + const scrollRef = useRef(null); + const indexRef = useRef(0); + + useEffect(() => { + const interval = setInterval(() => { + const el = scrollRef.current; + if (!el) return; + indexRef.current = (indexRef.current + 1) % IMAGES.length; + el.scrollTo({ left: indexRef.current * el.clientWidth, behavior: 'smooth' }); + }, 3000); + return () => clearInterval(interval); + }, []); + + const HighlightText = ({ text, className = 'lg:text-5xl text-30 text-start lg:text-center font-semibold leading-tight lg:whitespace-pre-line' }) => { + const parts = text.split(/(\*\*.*?\*\*)/); + + return ( + + {parts.map((part, index) => { + if (part.startsWith('**') && part.endsWith('**')) { + return ( + + {part.slice(2, -2)} + + ); + } + return {part}; + })} + + ); + }; + + return ( +
+
+ Internxt x Levante Logo + +
+ +
+
+ Internxt x Levante + Internxt x Levante + Internxt x Levante +
+
+ Internxt x Levante + Internxt x Levante +
+
+ +
+ {IMAGES.map((img, i) => ( +
+ {`Internxt +
+ ))} +
+
+ ); +} diff --git a/src/components/levanteud/LeadingOrganitationsSection.tsx b/src/components/levanteud/LeadingOrganitationsSection.tsx new file mode 100644 index 000000000..307a2469e --- /dev/null +++ b/src/components/levanteud/LeadingOrganitationsSection.tsx @@ -0,0 +1,150 @@ +import { useRef, useState, useEffect } from 'react'; +import Image from 'next/image'; +import { getImage } from '@/lib/getImage'; +import { CertificationsSection } from '../cloud-object-storage/certificationsSections'; +import { CaretLeft, CaretRight } from '@phosphor-icons/react'; + +interface LeadingOrganizationsSectionProps { + textContent: any; +} + +export default function LeadingOrganizationsSection({ + textContent, +}: Readonly): JSX.Element { + const scrollContainerRef = useRef(null); + const [canScrollLeft, setCanScrollLeft] = useState(false); + const [canScrollRight, setCanScrollRight] = useState(true); + const [isMobile, setIsMobile] = useState(false); + + const mobileCardWidth = 340; + const mobileGap = 32; + + useEffect(() => { + const checkIsMobile = () => { + setIsMobile(window.innerWidth < 1024); + }; + + checkIsMobile(); + window.addEventListener('resize', checkIsMobile); + + return () => window.removeEventListener('resize', checkIsMobile); + }, []); + + const updateScrollButtons = () => { + if (!scrollContainerRef.current) return; + + const { scrollLeft, scrollWidth, clientWidth } = scrollContainerRef.current; + + setCanScrollLeft(scrollLeft > 0); + setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 1); + }; + + const scrollLeftHandler = () => { + if (!scrollContainerRef.current) return; + const scrollAmount = mobileCardWidth + mobileGap; + scrollContainerRef.current.scrollBy({ + left: -scrollAmount, + behavior: 'smooth', + }); + }; + + const scrollRightHandler = () => { + if (!scrollContainerRef.current) return; + const scrollAmount = mobileCardWidth + mobileGap; + scrollContainerRef.current.scrollBy({ + left: scrollAmount, + behavior: 'smooth', + }); + }; + + useEffect(() => { + const scrollContainer = scrollContainerRef.current; + if (!scrollContainer) return; + updateScrollButtons(); + scrollContainer.addEventListener('scroll', updateScrollButtons); + const resizeObserver = new ResizeObserver(updateScrollButtons); + resizeObserver.observe(scrollContainer); + return () => { + scrollContainer.removeEventListener('scroll', updateScrollButtons); + resizeObserver.disconnect(); + }; + }, [isMobile]); + + return ( +
+
+

{textContent.title}

+

{textContent.subtitle[0]}

+

{textContent.subtitle[1]}

+
+
+
+ Levante +
+
+
+ {textContent.cards.map((card, index) => ( +
+

{card.title}

+
+ {card.description.map((description, idx) => ( +

{description}

+ ))} +
+
+ ))} +
+ {isMobile && ( +
+ + +
+ )} +
+
+ +
+ ); +} diff --git a/src/pages/levanteud.tsx b/src/pages/levanteud.tsx new file mode 100644 index 000000000..d5247ec98 --- /dev/null +++ b/src/pages/levanteud.tsx @@ -0,0 +1,98 @@ +import { FooterText, MetatagsDescription, NavigationBarText } from "@/assets/types/layout/types"; +import Footer from "@/components/layout/footers/Footer"; +import Layout from "@/components/layout/Layout"; +import Navbar from "@/components/layout/navbars/Navbar"; +import HeroSection from "@/components/levanteud/HeroSection"; +import cookies from "@/lib/cookies"; +import { GetServerSidePropsContext } from "next"; +import Image from "next/image"; +import DigitalIndependenceSection from "@/components/levanteud/DigitalIndependenceSection"; +import LeadingOrganizationsSection from "@/components/levanteud/LeadingOrganitationsSection"; +import FloatingCtaSectionv2 from "@/components/shared/FloatingCtaSectionV2"; +import { getImage } from "@/lib/getImage"; + +interface LevanteProps { + lang: GetServerSidePropsContext['locale']; + textContent: any; + metatagsDescriptions: MetatagsDescription[]; + navbarLang: NavigationBarText; + footerLang: FooterText; +} + + +const LevantePage = ({ metatagsDescriptions, textContent, lang, navbarLang, footerLang }: LevanteProps): JSX.Element => { + const metatags = metatagsDescriptions.filter((desc) => desc.id === 'levante-ud'); + + const locale = lang as string; + const navbarCta = ''; + + + return ( + + + + + + + + + + + Internxt x Levante + Internxt x Levante +

+ {textContent.ctaBanner.description} +

+ + } + bgGradientContainerColor="linear-gradient(115.95deg, rgba(244, 248, 255, 0.75) 10.92%, rgba(255, 255, 255, 0.08) 96.4%)" + containerDetails="shadow-lg backdrop-blur-[55px]" + bgPadding="lg:pb-20 pb-20" + /> + +