// Hero — carousel of use cases, auto-advances every 10s with proper fade transitions const Hero = ({ onNav }) => { const [parRef, mouse] = useMouseParallax(); const [revealRef, shown] = useReveal(0); const [activeUseCase, setActiveUseCase] = React.useState(0); const [fadeState, setFadeState] = React.useState('in'); // 'in' | 'out' const isMobile = useResponsive(); const useCases = [ { title: 'Interact in natural language', user: 'Hey BlinkFree, Give me a summary of the entire workday', response: 'Hello boss, new stocks arrived... Customers were mostly in aisle G31... 3 customers stopped at the return center... etc.', image: 'uploads/1.jpg?v=2', }, { title: 'Retrieve any piece of information very easily', user: 'Hey BlinkFree, I cannot find my car keys, could you please check if you can find anything', response: 'Sure, it looks like you dropped them at the reception', image: 'uploads/2.jpg?v=2', }, { title: 'Get customized analytics and set your real-time metrics', user: 'Hey BlinkFree, how many customers did we have today?', response: 'We had 40 customers, 15 of them walked out without buying anything', image: 'uploads/3.jpg?v=2', }, { title: 'Maintain high situational awareness and set custom triggers', user: 'Hey BlinkFree, alert me if a customer waits at the counter for more than 2 minutes', response: 'Got it. I\'ll notify you immediately if any customer remains unattended at the counter for over 2 minutes', image: 'uploads/4.jpg?v=2', }, { title: 'Automates company policies, reduce mistakes, and protect assets and efficiency', user: 'Hey BlinkFree, notify anyone who enters the loading dock without a safety vest', response: 'Understood. I\'ll remind employees at the loading dock to wear a safety vest if they enter without one', image: 'uploads/5.jpg?v=2', }, { title: 'Get fast and accurate incident reporting', user: 'Thank you for informing me', response: 'Attention; A Toyota Camry with license plate \'xxxxxxx\' hit a red Corvette at 1:30 pm. Should I pull up the footage for you?', inverted: true, image: 'uploads/6.jpg?v=2', }, { title: 'Turn emotions into insights', user: 'Hey BlinkFree, how was the overall workplace atmosphere today?', response: 'Overall, the workplace atmosphere was calm, though several customers appeared frustrated', image: 'uploads/7.jpg?v=2', }, ]; // Auto-advance every 10s with fade transition React.useEffect(() => { const fadeOutTimer = setTimeout(() => { setFadeState('out'); }, 9000); // start fading out at 9s const switchTimer = setTimeout(() => { setActiveUseCase(i => (i + 1) % useCases.length); setFadeState('in'); }, 10000); // switch + fade in at 10s return () => { clearTimeout(fadeOutTimer); clearTimeout(switchTimer); }; }, [activeUseCase, useCases.length]); const goTo = (i) => { setFadeState('out'); setTimeout(() => { setActiveUseCase(i); setFadeState('in'); }, 400); }; const current = useCases[activeUseCase]; const opacity = fadeState === 'in' ? 1 : 0; const fadeStyle = { opacity, transition: 'opacity 800ms cubic-bezier(0.2,0,0,1)', }; return (
{/* ambient glow — drifts subtly with mouse */}
{/* grid lines */}
{/* Use case title — min height so layout doesn't shift between slides */}
USE CASE {activeUseCase + 1} / {useCases.length}

{current.title}

{/* Conversation flow — fixed height */}
{(() => { const userBubble = (
You
{current.user}
); const blinkBubble = (
B
BlinkFree
{current.response}
); return current.inverted ? [blinkBubble, userBubble] : [userBubble, blinkBubble]; })()}
{/* Spacer to push dots and button to bottom */}
{/* Carousel dots */}
{useCases.map((_, i) => (
{/* Right: image carousel — visible on all screen sizes */}
{current.image ? ( {current.title} ) : (
Image coming soon
)}
{/* down arrow */}
Scroll
); }; window.Hero = Hero;