Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/assets/lang/de/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
48 changes: 48 additions & 0 deletions src/assets/lang/en/levante-ud.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
5 changes: 5 additions & 0 deletions src/assets/lang/en/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
7 changes: 7 additions & 0 deletions src/assets/lang/es/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
5 changes: 5 additions & 0 deletions src/assets/lang/fr/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
7 changes: 7 additions & 0 deletions src/assets/lang/it/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
5 changes: 5 additions & 0 deletions src/assets/lang/ru/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -553,5 +553,10 @@
"id": "alternative-to-totalav",
"title": "Internxt — Альтернатива TotalAV",
"description": "Перейдите на Internxt — альтернативу TotalAV с открытым исходным кодом. Включает облачное хранилище с постквантовым шифрованием и нулевым разглашением и многое другое."
},
{
"id": "levante-ud",
"title": "Internxt — официальный облачный партнер «Леванте»",
"description": "Internxt является официальным партнером «Леванте», предоставляя зашифрованное облачное хранилище и резервное копирование для защиты ценных данных клуба."
}
]
7 changes: 7 additions & 0 deletions src/assets/lang/zh-tw/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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 的替代方案",
Expand Down
7 changes: 7 additions & 0 deletions src/assets/lang/zh/metatags-descriptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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 的替代方案",
Expand Down
57 changes: 43 additions & 14 deletions src/components/cloud-object-storage/certificationsSections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,60 @@ 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' },
{ src: '/images/datacenters-and-certifications/GDPR.webp', width: 146, alt: 'GDPR Compliance' },
{ 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 (
<section
className="flex h-min w-full flex-col items-center justify-between gap-8 px-5 pt-28 lg:pt-0 lg:flex-row lg:gap-16 lg:px-10 lg:py-10 xl:px-32 3xl:px-80"
>
<div className="flex flex-row items-center gap-16 w-full justify-between">
{certifications.map((cert, index) => (
<section className="flex h-min w-full flex-col items-center justify-between gap-8 px-5 lg:pt-0 lg:flex-row lg:gap-16 lg:px-10 lg:py-10 xl:px-32 3xl:px-80">

<div className="relative w-full overflow-hidden lg:hidden">
<style>{`
@keyframes marquee {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
.marquee-track {
display: flex;
align-items: center;
gap: 2.5rem;
width: max-content;
animation: marquee 18s linear infinite;
}
`}</style>
<div className="marquee-track">
{[...certifications, ...certifications].map((cert, index) => (
<Image
key={cert.src}
src={getImage(cert.src)}
alt={cert.alt}
width={cert.width}
height={40}
quality={100}
key={`${cert.src}-${index}`}
src={getImage(cert.src)}
alt={cert.alt}
width={cert.width}
height={40}
quality={100}
/>
))}
</div>
</div>

{/* Desktop: static row */}
<div className="hidden lg:flex flex-row items-center gap-16 w-full justify-between">
{certifications.map((cert) => (
<Image
key={cert.src}
src={getImage(cert.src)}
alt={cert.alt}
width={cert.width}
height={40}
quality={100}
/>
))}
</div>
</div>

</section>
);
};
55 changes: 55 additions & 0 deletions src/components/levanteud/DigitalIndependenceSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import Image from 'next/image';
import { getImage } from '@/lib/getImage';

interface DigitalIndependenceSectionProps {
textContent: any;
}

export default function DigitalIndependenceSection({
textContent,
}: Readonly<DigitalIndependenceSectionProps>): JSX.Element {
const HighlightText = ({ text, className = 'text-base text-start leading-tight lg:whitespace-pre-line text-gray-55' }) => {

Check warning on line 11 in src/components/levanteud/DigitalIndependenceSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Move this component definition out of the parent component and pass data as props.

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICn5avuLfPrVutI&open=AZ0q8ICn5avuLfPrVutI&pullRequest=1868
const parts = text.split(/(\*\*.*?\*\*)/);

return (
<span className={className}>
{parts.map((part, index) => {
if (part.startsWith('**') && part.endsWith('**')) {
return (
<span key={index} className="font-semibold">

Check warning on line 19 in src/components/levanteud/DigitalIndependenceSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICn5avuLfPrVutJ&open=AZ0q8ICn5avuLfPrVutJ&pullRequest=1868
{part.slice(2, -2)}
</span>
);
}
return <span key={index}>{part}</span>;

Check warning on line 24 in src/components/levanteud/DigitalIndependenceSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICn5avuLfPrVutK&open=AZ0q8ICn5avuLfPrVutK&pullRequest=1868
})}
</span>
);
};

return (
<section
className={`flex h-min flex flex-col w-full items-center justify-center overflow-hidden py-10 lg:py-20 lg:mt-16 lg:px-20 px-6 lg:gap-16 gap-8`}
style={{ background: 'linear-gradient(360deg, #F4F8FF 63.1%, #FFFFFF 100%)' }}
>
<p className='text-30 lg:text-5xl lg:text-center text-start font-semibold leading-tight lg:whitespace-pre-line'>{textContent.title}</p>
<div className='flex flex-col-reverse lg:flex-row gap-6'>
<div className='flex flex-col gap-6'>
{textContent.features.map((feature, index) => (
<HighlightText text={feature}/>

Check warning on line 39 in src/components/levanteud/DigitalIndependenceSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Missing "key" prop for element in iterator

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICn5avuLfPrVutL&open=AZ0q8ICn5avuLfPrVutL&pullRequest=1868
))}
</div>
<Image
src={getImage('/images/Levante/Levante6.webp')}
alt="Internxt x Levante"
width={534}
height={320}
className='rounded-16'
quality={100}
/>
</div>


</section>
);
}
102 changes: 102 additions & 0 deletions src/components/levanteud/HeroSection.tsx
Original file line number Diff line number Diff line change
@@ -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<HeroSectionProps>): JSX.Element {
const scrollRef = useRef<HTMLDivElement>(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' }) => {

Check warning on line 34 in src/components/levanteud/HeroSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Move this component definition out of the parent component and pass data as props.

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICd5avuLfPrVutE&open=AZ0q8ICd5avuLfPrVutE&pullRequest=1868
const parts = text.split(/(\*\*.*?\*\*)/);

return (
<span className={className}>
{parts.map((part, index) => {
if (part.startsWith('**') && part.endsWith('**')) {
return (
<span key={index} className="text-primary">

Check warning on line 42 in src/components/levanteud/HeroSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICd5avuLfPrVutF&open=AZ0q8ICd5avuLfPrVutF&pullRequest=1868
{part.slice(2, -2)}
</span>
);
}
return <span key={index}>{part}</span>;

Check warning on line 47 in src/components/levanteud/HeroSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICd5avuLfPrVutG&open=AZ0q8ICd5avuLfPrVutG&pullRequest=1868
})}
</span>
);
};

return (
<section
className={`flex h-min flex-col w-full items-center justify-center overflow-hidden py-20 mt-8 lg:mt-16 px-6 lg:px-20 lg:gap-16 gap-10`}
style={{ background: 'linear-gradient(360deg, #FFFFFF 0%, #F4F8FF 100%)' }}
>
<div className='flex flex-col lg:gap-6 gap-10'>
<Image
src={getImage('/images/Levante/InternxtLevanteOPCP.webp')}
alt="Internxt x Levante Logo"
width={850}
height={116}
quality={100}
/>
<HighlightText text={textContent.title} />
</div>

<div className='hidden lg:flex flex-col gap-6'>
<div className='flex flex-row justify-between gap-2.5'>
<Image src={getImage('/images/Levante/Levante1.webp')} alt="Internxt x Levante" width={452} height={320} className='rounded-16' quality={100} />
<Image src={getImage('/images/Levante/Levante2.webp')} alt="Internxt x Levante" width={365} height={320} className='rounded-16' quality={100} />
<Image src={getImage('/images/Levante/Levante3.webp')} alt="Internxt x Levante" width={275} height={320} className='rounded-16' quality={100} />
</div>
<div className='flex flex-row justify-between gap-2.5'>
<Image src={getImage('/images/Levante/Levante4.webp')} alt="Internxt x Levante" width={558} height={372} className='rounded-16' quality={100} />
<Image src={getImage('/images/Levante/Levante5.webp')} alt="Internxt x Levante" width={558} height={372} className='rounded-16' quality={100} />
</div>
</div>

<div
ref={scrollRef}
className='flex lg:hidden w-full overflow-x-auto snap-x snap-mandatory scroll-smooth gap-3'
style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}
>
{IMAGES.map((img, i) => (
<div key={i} className='flex-none w-full snap-center'>

Check warning on line 87 in src/components/levanteud/HeroSection.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=internxt_website&issues=AZ0q8ICd5avuLfPrVutH&open=AZ0q8ICd5avuLfPrVutH&pullRequest=1868
<Image
src={getImage(img.src)}
alt={`Internxt x Levante ${i + 1}`}
width={img.width}
height={img.height}
className='rounded-xl w-full object-cover'
style={{ maxHeight: '195px' }}
quality={100}
/>
</div>
))}
</div>
</section>
);
}
Loading
Loading