6 Commits

Author SHA1 Message Date
cf73b46800 Bob AI: Modify the carousel component to: 1) Slow down the auto-play 2026-02-27 09:58:09 +00:00
78c98816bb Merge version_4 into main
Merge version_4 into main
2026-02-27 08:51:15 +00:00
b9fae9dc4b Bob AI: Add a blurred background image of a track/athletic field to 2026-02-27 08:50:34 +00:00
338c2ffeff Merge version_3 into main
Merge version_3 into main
2026-02-27 08:48:34 +00:00
aed064ca08 Bob AI: Add a track/athletic background image to the hero section wi 2026-02-27 08:47:53 +00:00
9f9b653fd6 Merge version_2 into main
Merge version_2 into main
2026-02-27 08:46:15 +00:00

View File

@@ -1,5 +1,6 @@
"use client";
import { useState, useRef } from "react";
import TextBox from "@/components/Textbox";
import MediaContent from "@/components/shared/MediaContent";
import AutoCarousel from "@/components/cardStack/layouts/carousels/AutoCarousel";
@@ -44,6 +45,8 @@ interface HeroBillboardCarouselProps {
buttons?: ButtonConfig[];
buttonAnimation?: ButtonAnimationType;
mediaItems: MediaItem[];
backgroundImageSrc?: string;
backgroundImageOpacity?: number;
ariaLabel?: string;
className?: string;
containerClassName?: string;
@@ -67,6 +70,8 @@ const HeroBillboardCarousel = ({
buttons,
buttonAnimation,
mediaItems,
backgroundImageSrc,
backgroundImageOpacity = 0.3,
ariaLabel = "Hero section",
className = "",
containerClassName = "",
@@ -79,6 +84,8 @@ const HeroBillboardCarousel = ({
buttonTextClassName = "",
mediaWrapperClassName = "",
}: HeroBillboardCarouselProps) => {
const [isHovered, setIsHovered] = useState(false);
const carouselRef = useRef<HTMLDivElement>(null);
const renderCarouselItem = (item: MediaItem, index: number) => (
<div
key={index}
@@ -98,11 +105,24 @@ const HeroBillboardCarousel = ({
<section
aria-label={ariaLabel}
className={cls(
"relative w-full py-hero-page-padding md:h-svh md:py-0",
"relative w-full py-hero-page-padding md:h-svh md:py-0 overflow-hidden",
className
)}
>
<HeroBackgrounds {...background} />
{backgroundImageSrc && (
<div
className="absolute inset-0 z-0"
style={{
backgroundImage: `url('${backgroundImageSrc}')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
opacity: backgroundImageOpacity,
filter: 'blur(40px)',
}}
aria-hidden="true"
/>
)}
<div className={cls(
"mx-auto flex flex-col gap-14 md:gap-10 relative z-10",
"w-full md:w-content-width md:h-full md:items-center md:justify-center",
@@ -129,7 +149,12 @@ const HeroBillboardCarousel = ({
center={true}
/>
<div className={cls("w-full -mx-[var(--content-padding)]", mediaWrapperClassName)}>
<div
ref={carouselRef}
className={cls("w-full -mx-[var(--content-padding)] relative z-20", mediaWrapperClassName)}
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>
<AutoCarousel
title=""
description=""
@@ -141,6 +166,8 @@ const HeroBillboardCarousel = ({
itemClassName="!w-55 md:!w-carousel-item-4"
ariaLabel="Hero carousel"
showTextBox={false}
autoPlayInterval={isHovered ? 0 : 5000}
pauseOnHover={true}
>
{mediaItems?.map(renderCarouselItem)}
</AutoCarousel>