diff --git a/src/assets/lang/es/relational-links.json b/src/assets/lang/es/relational-links.json index 8c9032022..f586254e8 100644 --- a/src/assets/lang/es/relational-links.json +++ b/src/assets/lang/es/relational-links.json @@ -18,11 +18,11 @@ "link": "/pricing" }, { - "cta": "Almacenamiento privado en la nube", + "cta": "Almacenamiento privado\n en la nube", "link": "/private-cloud-storage-solutions" }, { - "cta": "Nube de almacenamiento de código abierto", + "cta": "Nube de almacenamiento\n de código abierto", "link": "/open-source" }, { diff --git a/src/components/comparison/HeroSection.tsx b/src/components/comparison/HeroSection.tsx index a1ed2a033..3b42d86d7 100644 --- a/src/components/comparison/HeroSection.tsx +++ b/src/components/comparison/HeroSection.tsx @@ -21,7 +21,7 @@ export const HeroSection = ({ textContent, percentage, competitor }: HeroSection
-

+

diff --git a/src/components/drive/components/LinkTo.tsx b/src/components/drive/components/LinkTo.tsx index 8ebc80bd0..d55c52f65 100644 --- a/src/components/drive/components/LinkTo.tsx +++ b/src/components/drive/components/LinkTo.tsx @@ -8,9 +8,9 @@ interface LinkTo { export const LinkTo = ({ text, linkToRedirect }: LinkTo) => { return ( - -

{text}

- + +

{text}

+ ); }; diff --git a/src/components/shared/sections/RelationalLinks.tsx b/src/components/shared/sections/RelationalLinks.tsx index dd3461449..5fb97f850 100644 --- a/src/components/shared/sections/RelationalLinks.tsx +++ b/src/components/shared/sections/RelationalLinks.tsx @@ -1,5 +1,7 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; +import { useRouter } from 'next/router'; import { LinkTo } from '../../drive/components/LinkTo'; +import { CaretLeft, CaretRight } from '@phosphor-icons/react'; interface Card { cta: string; @@ -24,30 +26,142 @@ const shuffleData = (data: Card[]): Card[] => { const RelationalLinks = ({ textContent }: RelationalLinksProps) => { const [cards, setCards] = useState([]); + const router = useRouter(); + + const scrollContainerRef = useRef(null); + const [scrollState, setScrollState] = useState({ + canGoLeft: false, + canGoRight: true, + }); + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + const checkIsMobile = () => { + setIsMobile(window.innerWidth < 1024); + }; + checkIsMobile(); + window.addEventListener('resize', checkIsMobile); + return () => window.removeEventListener('resize', checkIsMobile); + }, []); useEffect(() => { if (textContent?.links) { - const shuffledLinks = shuffleData(textContent.links); - setCards(shuffledLinks.slice(0, 3)); + const filteredLinks = textContent.links.filter((link) => link.link !== router.asPath); + const shuffledLinks = shuffleData(filteredLinks); + setCards(shuffledLinks.slice(0, 9)); } - }, [textContent]); + }, [textContent, router.asPath]); + + const updateScrollButtons = () => { + if (scrollContainerRef.current === null) return; + const { scrollLeft, scrollWidth, clientWidth } = scrollContainerRef.current; + + const maxScrollLeft = scrollWidth - clientWidth; + + setScrollState({ + canGoLeft: scrollLeft > 2, + canGoRight: scrollLeft < maxScrollLeft - 2, + }); + }; + + const getScrollAmount = () => { + const cardWidth = isMobile ? 300 : 350; + const gap = 24; // gap-6 refers to 1.5rem which is 24px + return cardWidth + gap; + }; + + const scrollLeft = () => { + if (scrollContainerRef.current === null) return; + scrollContainerRef.current.scrollBy({ + left: -getScrollAmount(), + behavior: 'smooth', + }); + }; + + const scrollRight = () => { + if (scrollContainerRef.current === null) return; + scrollContainerRef.current.scrollBy({ + left: getScrollAmount(), + behavior: 'smooth', + }); + }; + + useEffect(() => { + const scrollContainer = scrollContainerRef.current; + if (scrollContainer === null) return; + + updateScrollButtons(); + scrollContainer.addEventListener('scroll', updateScrollButtons); + + const resizeObserver = new ResizeObserver(updateScrollButtons); + resizeObserver.observe(scrollContainer); + + return () => { + scrollContainer.removeEventListener('scroll', updateScrollButtons); + resizeObserver.disconnect(); + }; + }, [isMobile, cards]); if (cards.length === 0) return null; return ( -
-

- {textContent.title} -

-
- {cards.map((card) => ( -
- +
+
+

+ {textContent.title} +

+
+ +
+
+ {cards.map((card) => ( +
+
+ +
+
+ ))} +
+ +
+
+ +
- ))} +
);