diff --git a/src/components/MarqueeText.js b/src/components/MarqueeText.js index 3d7795f..272525f 100644 --- a/src/components/MarqueeText.js +++ b/src/components/MarqueeText.js @@ -1,23 +1,42 @@ import React, { useRef, useState, useEffect } from 'react'; import './MarqueeText.css'; -const MarqueeText = ({ text, className, style, duration = '10s' }) => { +const DEFAULT_SPEED = 50; // pixels per second for uniform, calm scrolling + +const MarqueeText = ({ text, className, style, speed = DEFAULT_SPEED, duration }) => { const containerRef = useRef(null); const textRef = useRef(null); const [isOverflowing, setIsOverflowing] = useState(false); - - const formattedDuration = typeof duration === 'number' ? `${duration}s` : duration; + const [computedDuration, setComputedDuration] = useState('20s'); useEffect(() => { - const checkOverflow = () => { + const updateMarquee = () => { if (containerRef.current && textRef.current) { - setIsOverflowing(textRef.current.scrollWidth > containerRef.current.clientWidth); + const containerWidth = containerRef.current.clientWidth; + const textWidth = textRef.current.scrollWidth; + const overflowing = textWidth > containerWidth; + setIsOverflowing(overflowing); + + if (overflowing) { + if (duration) { + setComputedDuration(typeof duration === 'number' ? `${duration}s` : duration); + } else { + const totalDistance = textWidth + containerWidth; + const seconds = totalDistance / speed; + setComputedDuration(`${seconds.toFixed(2)}s`); + } + } } }; - checkOverflow(); - window.addEventListener('resize', checkOverflow); - return () => window.removeEventListener('resize', checkOverflow); - }, [text]); + + updateMarquee(); + window.addEventListener('resize', updateMarquee); + const timer = setTimeout(updateMarquee, 100); + return () => { + window.removeEventListener('resize', updateMarquee); + clearTimeout(timer); + }; + }, [text, speed, duration]); return (
@@ -26,7 +45,7 @@ const MarqueeText = ({ text, className, style, duration = '10s' }) => { ref={textRef} style={{ display: 'inline-block', - animation: isOverflowing ? `marquee-scroll ${formattedDuration} linear infinite` : 'none', + animation: isOverflowing ? `marquee-scroll ${computedDuration} linear infinite` : 'none', paddingLeft: isOverflowing ? '100%' : '0', fontSize: 'inherit', fontWeight: 'inherit', diff --git a/src/pages/afficheurs/classiques/ClassiquesArrivees.css b/src/pages/afficheurs/classiques/ClassiquesArrivees.css index 9dbc6b2..f54628e 100644 --- a/src/pages/afficheurs/classiques/ClassiquesArrivees.css +++ b/src/pages/afficheurs/classiques/ClassiquesArrivees.css @@ -356,8 +356,8 @@ justify-content: space-between; box-sizing: border-box; padding-left: 24px; - padding-right: 12px; - background: linear-gradient(180deg, #13571d 0%, #0a2d0f 100%) !important; + padding-right: 14px; + background: linear-gradient(180deg, #165b21 0%, #0a2d0f 100%) !important; position: relative; z-index: 25; border-top: 1.5px solid rgba(255, 255, 255, 0.18); @@ -383,22 +383,22 @@ .aff-classiques-arrivees__bottom-clock { display: inline-flex; - align-items: center; + align-items: flex-start; justify-content: center; - border: 3.5px solid #ffffff; + border: 2.5px solid rgba(255, 255, 255, 0.85); border-radius: 6px; - padding: 4px 16px; - background: #0d3613; + padding: 6px 14px 4px 14px; + background: rgba(10, 42, 16, 0.45); font-family: "Achemine", sans-serif; flex-shrink: 0; - margin-right: 6px; + margin-right: 4px; box-sizing: border-box; - height: 76px; - gap: 12px; + height: 74px; + gap: 8px; } .aff-classiques-arrivees__bottom-clock-hm { - font-size: 54px; + font-size: 52px; font-weight: 700; line-height: 1; letter-spacing: 1.5px; @@ -406,10 +406,11 @@ } .aff-classiques-arrivees__bottom-clock-s { - font-size: 54px; + font-size: 34px; font-weight: 700; line-height: 1; - letter-spacing: 1.5px; + letter-spacing: 0.5px; color: var(--yellow) !important; - margin-top: 0; + margin-top: 1px; + margin-left: 2px; } \ No newline at end of file diff --git a/src/pages/afficheurs/classiques/ClassiquesArrivees.js b/src/pages/afficheurs/classiques/ClassiquesArrivees.js index 8aaa627..f81d324 100644 --- a/src/pages/afficheurs/classiques/ClassiquesArrivees.js +++ b/src/pages/afficheurs/classiques/ClassiquesArrivees.js @@ -1314,7 +1314,7 @@ export default function ClassiquesArrivees(){
{stopsList.map((stopName, sIdx) => ( diff --git a/src/pages/afficheurs/classiques/ClassiquesDeparts.css b/src/pages/afficheurs/classiques/ClassiquesDeparts.css index b6ec100..24d421b 100644 --- a/src/pages/afficheurs/classiques/ClassiquesDeparts.css +++ b/src/pages/afficheurs/classiques/ClassiquesDeparts.css @@ -356,8 +356,8 @@ justify-content: space-between; box-sizing: border-box; padding-left: 24px; - padding-right: 12px; - background: linear-gradient(180deg, #07418a 0%, #00225e 100%) !important; + padding-right: 14px; + background: linear-gradient(180deg, #093c83 0%, #001f55 100%) !important; position: relative; z-index: 25; border-top: 1.5px solid rgba(255, 255, 255, 0.18); @@ -383,22 +383,22 @@ .aff-classiques-departs__bottom-clock { display: inline-flex; - align-items: center; + align-items: flex-start; justify-content: center; - border: 3.5px solid #ffffff; + border: 2.5px solid rgba(255, 255, 255, 0.85); border-radius: 6px; - padding: 4px 16px; - background: #001e40; + padding: 6px 14px 4px 14px; + background: rgba(0, 24, 64, 0.45); font-family: "Achemine", sans-serif; flex-shrink: 0; - margin-right: 6px; + margin-right: 4px; box-sizing: border-box; - height: 76px; - gap: 12px; + height: 74px; + gap: 8px; } .aff-classiques-departs__bottom-clock-hm { - font-size: 54px; + font-size: 52px; font-weight: 700; line-height: 1; letter-spacing: 1.5px; @@ -406,10 +406,11 @@ } .aff-classiques-departs__bottom-clock-s { - font-size: 54px; + font-size: 34px; font-weight: 700; line-height: 1; - letter-spacing: 1.5px; + letter-spacing: 0.5px; color: var(--yellow) !important; - margin-top: 0; + margin-top: 1px; + margin-left: 2px; } \ No newline at end of file diff --git a/src/pages/afficheurs/classiques/ClassiquesDeparts.js b/src/pages/afficheurs/classiques/ClassiquesDeparts.js index 4213953..87a836a 100644 --- a/src/pages/afficheurs/classiques/ClassiquesDeparts.js +++ b/src/pages/afficheurs/classiques/ClassiquesDeparts.js @@ -1311,7 +1311,7 @@ export default function ClassiquesDeparts(){
{stopsList.map((stopName, sIdx) => (