Skip to content

Commit d463eb6

Browse files
Refactor carousel to use fade transition
Replaced the slide transition with a fade transition for a smoother visual effect.
1 parent dcc9861 commit d463eb6

3 files changed

Lines changed: 42 additions & 16 deletions

File tree

src/components/ui/carousel/Carousel.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export const Carousel = React.forwardRef<
2525
{
2626
...opts,
2727
axis: orientation === "horizontal" ? "x" : "y",
28+
dragFree: false,
29+
draggable: false,
30+
duration: 30, // Transition plus rapide pour le fade
2831
},
2932
plugins
3033
)

src/components/ui/carousel/CarouselContent.tsx

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,15 @@ export const CarouselContent = React.forwardRef<
1010
const { carouselRef, orientation } = useCarousel()
1111

1212
return (
13-
<div className="overflow-hidden">
14-
<div ref={carouselRef} className="overflow-visible">
15-
<div
16-
ref={ref}
17-
className={cn(
18-
"flex",
19-
orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
20-
className
21-
)}
22-
{...props}
23-
/>
24-
</div>
13+
<div ref={carouselRef} className="overflow-visible">
14+
<div
15+
ref={ref}
16+
className={cn(
17+
"relative w-full h-full",
18+
className
19+
)}
20+
{...props}
21+
/>
2522
</div>
2623
)
2724
})

src/components/ui/carousel/CarouselItem.tsx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,42 @@ export const CarouselItem = React.forwardRef<
77
HTMLDivElement,
88
React.HTMLAttributes<HTMLDivElement>
99
>(({ className, ...props }, ref) => {
10-
const { orientation } = useCarousel()
10+
const { api } = useCarousel()
11+
const [isActive, setIsActive] = React.useState(false)
12+
const itemRef = React.useRef<HTMLDivElement>(null)
13+
14+
React.useEffect(() => {
15+
if (!api || !itemRef.current) return
16+
17+
const updateActiveState = () => {
18+
const slides = api.slideNodes()
19+
const currentSlide = api.selectedScrollSnap()
20+
const slideIndex = slides.indexOf(itemRef.current!)
21+
setIsActive(slideIndex === currentSlide)
22+
}
23+
24+
updateActiveState()
25+
api.on('select', updateActiveState)
26+
api.on('reInit', updateActiveState)
27+
28+
return () => {
29+
api.off('select', updateActiveState)
30+
api.off('reInit', updateActiveState)
31+
}
32+
}, [api])
1133

1234
return (
1335
<div
14-
ref={ref}
36+
ref={(node) => {
37+
if (typeof ref === 'function') ref(node)
38+
else if (ref) ref.current = node
39+
itemRef.current = node
40+
}}
1541
role="group"
1642
aria-roledescription="slide"
1743
className={cn(
18-
"min-w-0 shrink-0 grow-0 basis-full",
19-
orientation === "horizontal" ? "pl-4" : "pt-4",
44+
"absolute inset-0 w-full transition-opacity duration-500",
45+
isActive ? "opacity-100 z-10" : "opacity-0 z-0",
2046
className
2147
)}
2248
{...props}

0 commit comments

Comments
 (0)