diff --git a/package.json b/package.json index e49a6f854..25cc61333 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "preinstall": "node ./scripts/use-yarn.js", "find:unused": "next-unused", "prebuild": "node ./scripts/check-envs.js", - "dev": "next dev -p 3001", + "dev": "next dev --webpack -p 3001", "dev:tw": "TAILWIND_MODE=watch tailwindcss -o src/tailwind.css --watch", "build": "node ./scripts/check-envs.js && next build --webpack", "start": "next start", diff --git a/public/js/cookiebanner.script.js b/public/js/cookiebanner.script.js index 845753e7f..b4ff6a011 100644 --- a/public/js/cookiebanner.script.js +++ b/public/js/cookiebanner.script.js @@ -156,10 +156,14 @@ var t = translations[lang]; var headerScripts = [ { - title: 'Google Analytics', + title: 'Google Tag Manager', type: 'analytics', value: - "\n\n", + "", }, { title: 'Google Analytics', diff --git a/src/assets/lang/de/specialOfferTemplate.json b/src/assets/lang/de/specialOfferTemplate.json index 1ba7261e6..94d847fd3 100644 --- a/src/assets/lang/de/specialOfferTemplate.json +++ b/src/assets/lang/de/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "Der sicherste Cloud-Speicher **für weniger**", + "valentinesTitle": "//Liebe// verdient **Privatsphär**", "description": "Sicherer Cloud-Speicher für weniger. Sichern Sie sich noch heute Ihren besonderen Rabatt. Erhalten Sie Zugang zu Internxts preisgekrönter Privatsphäre-Suite mit post-quantenverschlüsseltem Cloud-Speicher und vielem mehr.", "subtitle": "Jetzt {{discount}}% Rabatt erhalten", "claimDeal": "Angebot beanspruchen" @@ -60,6 +61,7 @@ "tableSection": { "title": "Internxt Tarife", "hotLabel": "{{discount}}% Rabatt", + "valentinesTitle": "Sichere Liebe - ", "planTitles": { "header": "Wählen Sie Ihren Plan", "individuals": "Jahrestärife", diff --git a/src/assets/lang/en/specialOfferTemplate.json b/src/assets/lang/en/specialOfferTemplate.json index 292ba079c..324392601 100644 --- a/src/assets/lang/en/specialOfferTemplate.json +++ b/src/assets/lang/en/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "Lifetime cloud storage **for less**", + "valentinesTitle": "//Love// deserves **privacy**", "description": "Secure cloud storage for less. Claim your special discount today. Access Internxt's award-winning privacy suite with post-quantum encrypted cloud storage and much more.", "subtitle": "Get {{discount}}% off now", "claimDeal": "Claim deal" @@ -59,6 +60,7 @@ }, "tableSection": { "title": "Internxt Plans", + "valentinesTitle": "Secure love - ", "hotLabel": "{{discount}}% off", "planTitles": { "header": "Select your lifetime plans", diff --git a/src/assets/lang/es/specialOfferTemplate.json b/src/assets/lang/es/specialOfferTemplate.json index 3e5f7455a..e35952aa7 100644 --- a/src/assets/lang/es/specialOfferTemplate.json +++ b/src/assets/lang/es/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "El almacenamiento más seguro **por menos**", + "valentinesTitle": "El //amor// merece **privacidad**", "description": "Almacenamiento seguro en la nube por menos. Reclama tu descuento especial hoy. Accede a la galardonada suite de privacidad de Internxt con almacenamiento en la nube encriptado post-cuántico y mucho más.", "subtitle": "Obtén un {{discount}}% de descuento", "claimDeal": "Reclamar oferta" @@ -60,6 +61,7 @@ "tableSection": { "title": "Planes de Internxt", "hotLabel": "{{discount}}% de descuento", + "valentinesTitle": "Amor seguro - ", "planTitles": { "header": "Elige tu plan", "individuals": "Planes Anuales", diff --git a/src/assets/lang/fr/specialOfferTemplate.json b/src/assets/lang/fr/specialOfferTemplate.json index 22e700ebc..04128f6e1 100644 --- a/src/assets/lang/fr/specialOfferTemplate.json +++ b/src/assets/lang/fr/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "Le stockage cloud le plus sécurisé **pour moins cher**", + "valentinesTitle": "//L'amour// mérite **vie privée**", "description": "Stockage cloud sécurisé pour moins cher. Réclamez votre remise spéciale dès aujourd'hui. Accédez à la suite de confidentialité primée d'Internxt avec un stockage cloud chiffré post-quantique et bien plus encore.", "subtitle": "Obtenez {{discount}}% de réduction maintenant", "claimDeal": "Réclamer l'offre" @@ -60,6 +61,7 @@ "tableSection": { "title": "Forfaits Internxt", "hotLabel": "{{discount}}% remise", + "valentinesTitle": "Amour sécurisé - ", "planTitles": { "header": "Choisissez votre plan", "individuals": "Forfaits Annuels", diff --git a/src/assets/lang/it/specialOfferTemplate.json b/src/assets/lang/it/specialOfferTemplate.json index b1554f723..c83e90c0b 100644 --- a/src/assets/lang/it/specialOfferTemplate.json +++ b/src/assets/lang/it/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "Il cloud storage più sicuro **a meno**", + "valentinesTitle": "L'//amour// mérite **vie privée**", "description": "Cloud storage sicuro a meno. Rivendica il tuo sconto speciale oggi. Accedi alla pluripremiata suite per la privacy di Internxt con cloud storage crittografato post-quantico e molto altro.", "subtitle": "Ottieni {{discount}}% di sconto ora", "claimDeal": "Rivendica l'offerta" @@ -60,6 +61,7 @@ "tableSection": { "title": "Piani Internxt", "hotLabel": "{{discount}}% sconto", + "valentinesTitle": "Amore sicuro - ", "planTitles": { "header": "Scegli il tuo piano", "individuals": "Piani Annuali", diff --git a/src/assets/lang/ru/specialOfferTemplate.json b/src/assets/lang/ru/specialOfferTemplate.json index b45d7f035..2765c67c8 100644 --- a/src/assets/lang/ru/specialOfferTemplate.json +++ b/src/assets/lang/ru/specialOfferTemplate.json @@ -10,6 +10,7 @@ "ai": "AI" }, "title": "Самое безопасное облачное хранилище **за меньшие деньги**", + "valentinesTitle": "//Любовь// заслуживает **приватности**", "description": "Безопасное облачное хранилище за меньшие деньги. Получите свою специальную скидку сегодня. Получите доступ к отмеченному наградами пакету конфиденциальности Internxt с пост-квантовым зашифрованным облачным хранилищем и многим другим.", "subtitle": "Получите {{discount}}% скидки прямо сейчас", "claimDeal": "Получить предложение" @@ -60,6 +61,7 @@ "tableSection": { "title": "Тарифы Internxt", "hotLabel": "{{discount}}% скидка ", + "valentinesTitle": "Безопасная любовь - ", "planTitles": { "header": " Выберите свой план", "individuals": "Годовые тарифы", diff --git a/src/assets/lang/zh-tw/specialOfferTemplate.json b/src/assets/lang/zh-tw/specialOfferTemplate.json index 82affe78a..8c894e610 100644 --- a/src/assets/lang/zh-tw/specialOfferTemplate.json +++ b/src/assets/lang/zh-tw/specialOfferTemplate.json @@ -9,6 +9,7 @@ "mail": "郵件" }, "title": "最安全的雲端儲存**價格更優**", + "valentinesTitle": "//爱//值得**隐私**", "description": "更優價格的安全雲端儲存。立即獲取您的專屬折扣。存取Internxt屢獲殊榮的隱私套件,包含後量子加密雲端儲存及更多功能。", "subtitle": "立即享受{{discount}}%折扣", "claimDeal": "領取優惠" @@ -54,6 +55,7 @@ "tableSection": { "title": "Internxt方案", "hotLabel": "{{discount}}% 折扣 ", + "valentinesTitle": "安全的愛 - ", "planTitles": { "header": " 選擇您的計劃", "individuals": "年度方案", diff --git a/src/assets/lang/zh/specialOfferTemplate.json b/src/assets/lang/zh/specialOfferTemplate.json index ee9faa02f..552bcad28 100644 --- a/src/assets/lang/zh/specialOfferTemplate.json +++ b/src/assets/lang/zh/specialOfferTemplate.json @@ -9,6 +9,7 @@ "mail": "邮箱" }, "title": "最安全的云存储**价格更低**", + "valentinesTitle": "//爱//值得**隐私**", "description": "更低价格的安全云存储。立即获取您的专属折扣。访问Internxt屡获殊荣的隐私套件,包含后量子加密云存储等更多功能。", "subtitle": "立即享受{{discount}}%折扣", "claimDeal": "获取优惠" @@ -54,6 +55,7 @@ "tableSection": { "title": "Internxt套餐", "hotLabel": "{{discount}}% 折扣 ", + "valentinesTitle": "安全的爱 - ", "planTitles": { "header": " 選擇您的計劃", "individuals": "年度套餐", diff --git a/src/components/home/HorizontalScrollableSection.tsx b/src/components/home/HorizontalScrollableSection.tsx index d1c4e64c4..1616ea8e7 100644 --- a/src/components/home/HorizontalScrollableSection.tsx +++ b/src/components/home/HorizontalScrollableSection.tsx @@ -4,11 +4,13 @@ import { useRef, useState, useEffect } from 'react'; interface HorizontalScrollableProps { textContent: any; darkMode?: boolean; + isValentinesMode?: boolean; } export default function HorizontalScrollableSection({ textContent, darkMode = false, + isValentinesMode = false, }: Readonly): JSX.Element { const scrollContainerRef = useRef(null); const [scrollState, setScrollState] = useState({ @@ -116,7 +118,7 @@ export default function HorizontalScrollableSection({ return (
diff --git a/src/components/home/TrustedSection.tsx b/src/components/home/TrustedSection.tsx index ab3cc1eb0..326df7ac0 100644 --- a/src/components/home/TrustedSection.tsx +++ b/src/components/home/TrustedSection.tsx @@ -7,6 +7,7 @@ interface TrustedSectionProps { bottomBar?: boolean; darkMode?: boolean; image?: string; + isValentinesMode?: boolean; } export default function TrustedSection({ @@ -14,13 +15,20 @@ export default function TrustedSection({ bottomBar = true, darkMode, image, + isValentinesMode, }: Readonly): JSX.Element { return (
{bottomBar && ( diff --git a/src/components/partnersTemplate/HeroSection.tsx b/src/components/partnersTemplate/HeroSection.tsx index b5c534a42..28e649439 100644 --- a/src/components/partnersTemplate/HeroSection.tsx +++ b/src/components/partnersTemplate/HeroSection.tsx @@ -21,6 +21,7 @@ interface HeroSectionForPartnerProps { cloudWards?: boolean; darkMode?: boolean; image?: any; + isValentinesMode?: boolean; } export default function HeroSection({ @@ -28,6 +29,7 @@ export default function HeroSection({ percentOff, cloudWards = false, darkMode = false, + isValentinesMode = false, image = 'internxt-private-cloud', }: Readonly): JSX.Element { const [currency, setCurrency] = useState('€'); @@ -38,56 +40,61 @@ export default function HeroSection({ .then((currency) => { setCurrency(currency.currency); }) - .catch(() => { - // - }); + .catch(() => {}); }, []); const products = [ - { - icon: CloudArrowUp, - text: textContent.products.drive, - }, - { - icon: ShieldPlus, - text: textContent.products.antivirus, - }, - { - icon: Sparkle, - text: textContent.products.cleaner, - }, - { - icon: CellTower, - text: textContent.products.vpn, - }, - { - icon: VideoConference, - text: textContent.products.meet, - }, - { - icon: Envelope, - text: textContent.products.mail, - }, - { - icon: Brain, - text: textContent.products.ai, - }, + { icon: CloudArrowUp, text: textContent.products.drive }, + { icon: ShieldPlus, text: textContent.products.antivirus }, + { icon: Sparkle, text: textContent.products.cleaner }, + { icon: CellTower, text: textContent.products.vpn }, + { icon: VideoConference, text: textContent.products.meet }, + { icon: Envelope, text: textContent.products.mail }, + { icon: Brain, text: textContent.products.ai }, ]; const parsePercentText = (text: string) => { return typeof text === 'string' ? text.replace(/{{discount}}/g, percentOff) : text; }; + const StyledTitle = ({ rawText }: { rawText: string }) => { + const parts = rawText.split(/(\/\/.*?\/\/|\*\*.*?\*\*)/g); + + return ( + <> + {parts.map((part, index) => { + if (part.startsWith('//') && part.endsWith('//')) { + return ( + + {part.slice(2, -2)} + + ); + } + if (part.startsWith('**') && part.endsWith('**')) { + return ( + + {part.slice(2, -2)} + + ); + } + return part; + })} + + ); + }; + return (
-
+
{cloudWards && (
- + {isValentinesMode ? ( + + ) : ( + + )}
{percentOff !== '0' && ( -

{parsePercentText(textContent.subtitle)} -

+ {isValentinesMode ? '💘' : undefined} + )}

{textContent.claimDeal} @@ -165,7 +181,9 @@ export default function HeroSection({

-
+
diff --git a/src/hooks/useSpecialOfferConfig.ts b/src/hooks/useSpecialOfferConfig.ts index 4c83d34a1..1e8b2ab8b 100644 --- a/src/hooks/useSpecialOfferConfig.ts +++ b/src/hooks/useSpecialOfferConfig.ts @@ -24,6 +24,8 @@ export const ALLOWED_PATHS = [ 'bluewin', 'tatiana', 'simon42', + 'devopstoolbox', + 'heisect', ]; export const ALTERNATE_RECOMENDATED_PLAN_PATHS = new Set([]); export const DARK_MODE_PATHS = new Set(['baity', 'xavier', 'oscar', 'rimembah', 'believemy', 'ghareeb']); @@ -50,6 +52,8 @@ export const COUPON_CODES = { bluewin: PromoCodeName.Bluewin, tatiana: PromoCodeName.Tatiana, simon42: PromoCodeName.simon42, + devopstoolbox: PromoCodeName.devopstoolbox, + heisect: PromoCodeName.heisect, }; interface OfferConfig { diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts index cf3b258ba..0877dc0be 100644 --- a/src/lib/types/index.ts +++ b/src/lib/types/index.ts @@ -203,6 +203,9 @@ export enum PromoCodeName { Tatiana = 'TATIANA', Rclone = 'RCLONE87', simon42 = 'SIMON42', + love = 'LOVE88', + heisect = 'HEISECT', + devopstoolbox = 'DEVOPSTOOLBOX', } export interface PromoCodeProps { diff --git a/src/pages/[filename].tsx b/src/pages/[filename].tsx index 69013b4e2..1c305e5b0 100644 --- a/src/pages/[filename].tsx +++ b/src/pages/[filename].tsx @@ -70,6 +70,8 @@ const LANG_MAP = { bluewin: 'de', tatiana: 'en', simon42: 'de', + heisect: 'de', + devopstoolbox: 'en', }; function CombinedSpecialOffer({ diff --git a/src/pages/specialoffer/[filename].tsx b/src/pages/specialoffer/[filename].tsx index 4178ffe09..51184f6d5 100644 --- a/src/pages/specialoffer/[filename].tsx +++ b/src/pages/specialoffer/[filename].tsx @@ -37,6 +37,7 @@ const ALLOWED_PATHS = [ 'nextjump', 'kripesh', 'rclone', + 'love', ]; const ALTERNATE_RECOMENDATED_PLAN_PATHS = ['grabon', 'kripesh']; @@ -52,6 +53,7 @@ const COUPON_CODES = { pcmag: PromoCodeName.PcmagCoupon, kripesh: PromoCodeName.FreePlanUpsell, rclone: PromoCodeName.Rclone, + love: PromoCodeName.love, }; function CombinedSpecialOffer({ @@ -65,6 +67,7 @@ function CombinedSpecialOffer({ const router = useRouter(); const selectedPathname = ALLOWED_PATHS.find((p) => p === pathname); const isDarkMode = selectedPathname ? DARK_MODE_PATHS.includes(selectedPathname) : false; + const isValentinesMode = selectedPathname === 'love'; const alternateRecommendedPlan = selectedPathname ? !ALTERNATE_RECOMENDATED_PLAN_PATHS.includes(selectedPathname) @@ -135,6 +138,8 @@ function CombinedSpecialOffer({ return <>; } + const HeroImage = isValentinesMode ? 'valentines' : 'internxt-private-cloud'; + return ( @@ -143,7 +148,8 @@ function CombinedSpecialOffer({ textContent={langJson.HeroSection} percentOff={percentOff} darkMode={isDarkMode} - image={'internxt-private-cloud'} + image={HeroImage} + isValentinesMode={isValentinesMode} /> @@ -167,6 +173,8 @@ function CombinedSpecialOffer({ darkMode={isDarkMode} differentRecommended={alternateRecommendedPlan} showPromo + isValentinesMode={isValentinesMode} + backgroundGradientColor={isValentinesMode ? 'linear-gradient(180deg, #FFFFFF 0%, #FFF2F8 100%)' : undefined} /> - + - + +

{parsePercentText(langJson.ctaSection2.description)} diff --git a/tailwind.config.js b/tailwind.config.js index a0c2e2eed..c9c8990ab 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -25,8 +25,14 @@ module.exports = { 'orange-dark': 'rgb(230,134,0)', yellow: 'rgb(255,204,0)', 'yellow-dark': 'rgb(230,184,0)', - pink: 'rgb(255,36,76)', - 'pink-dark': 'rgb(235,0,63)', + pink: { + 0: 'rgba(255, 242, 248, 1)', + 10: 'rgba(255, 229, 242, 1)', + 30: 'rgba(255, 102, 177, 1)', + 50: 'rgb(255, 36, 76)', + 60: 'rgb(235, 0, 63)', + 80: 'rgba(204, 0, 100, 1)', + }, indigo: 'rgb(81,78,212)', 'indigo-dark': 'rgb(60,58,207)', teal: 'rgb(50,182,205)',