Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
'use client'
|
|
|
|
import * as React from 'react'
|
|
import { Carousel, CarouselContent, CarouselItem, type CarouselApi } from '@/components/ui/carousel'
|
|
import Image from 'next/image'
|
|
|
|
export function RepairsImageCarousel() {
|
|
const [api, setApi] = React.useState<CarouselApi>()
|
|
const [current, setCurrent] = React.useState(0)
|
|
|
|
React.useEffect(() => {
|
|
if (!api) return
|
|
|
|
setCurrent(api.selectedScrollSnap())
|
|
|
|
api.on('select', () => {
|
|
setCurrent(api.selectedScrollSnap())
|
|
})
|
|
}, [api])
|
|
|
|
React.useEffect(() => {
|
|
if (!api) return
|
|
|
|
const interval = setInterval(() => {
|
|
api.scrollNext()
|
|
}, 4000)
|
|
|
|
return () => clearInterval(interval)
|
|
}, [api])
|
|
|
|
return (
|
|
<Carousel
|
|
setApi={setApi}
|
|
className="w-full"
|
|
opts={{
|
|
align: 'start',
|
|
loop: true,
|
|
}}
|
|
>
|
|
<CarouselContent>
|
|
<CarouselItem className="md:basis-1/2">
|
|
<div className="relative aspect-video rounded-lg overflow-hidden shadow-lg">
|
|
<Image
|
|
src="https://rockymountainvending.com/wp-content/uploads/2025/09/IMG_4660-scaled.jpeg"
|
|
alt="Vending machine repair service"
|
|
fill
|
|
className="object-cover"
|
|
sizes="(max-width: 768px) 100vw, 50vw"
|
|
/>
|
|
</div>
|
|
</CarouselItem>
|
|
<CarouselItem className="md:basis-1/2">
|
|
<div className="relative aspect-video rounded-lg overflow-hidden shadow-lg">
|
|
<Image
|
|
src="https://rockymountainvending.com/wp-content/uploads/2025/09/IMG_4676-scaled.jpeg"
|
|
alt="Vending machine maintenance"
|
|
fill
|
|
className="object-cover"
|
|
sizes="(max-width: 768px) 100vw, 50vw"
|
|
/>
|
|
</div>
|
|
</CarouselItem>
|
|
</CarouselContent>
|
|
</Carousel>
|
|
)
|
|
}
|
|
|