11<template >
22 <div
33 ref =" marqueeContainer"
4- class =" relative overflow-hidden w-full"
4+ class =" relative w-full overflow-hidden "
55 @mouseenter =" handleMouseEnter"
66 @mouseleave =" handleMouseLeave"
77 @mousedown =" handleMouseDown"
1414 :style =" {
1515 transform: `translateX(${translateX}px)`,
1616 cursor: isDragging ? 'grabbing' : 'grab',
17- touchAction: 'pan-y' // Allow vertical scrolling but prevent horizontal on touch
17+ touchAction: 'pan-y',
1818 }"
1919 >
20- <!-- First set of items -->
2120 <div class =" flex" >
2221 <slot />
2322 </div >
24- <!-- Duplicate set for seamless looping -->
2523 <div class =" flex" >
2624 <slot />
2725 </div >
@@ -41,11 +39,11 @@ interface Props {
4139const props = withDefaults (defineProps <Props >(), {
4240 direction: ' left' ,
4341 speed: 20 , // default 20 pixels per second
44- pauseOnHover: true
42+ pauseOnHover: true ,
4543})
4644
47- const marqueeContainer = ref < HTMLElement | null >( null )
48- const marqueeTrack = ref < HTMLElement | null >( null )
45+ const marqueeContainer = useTemplateRef ( ' marqueeContainer ' )
46+ const marqueeTrack = useTemplateRef ( ' marqueeTrack ' )
4947
5048const translateX = ref (0 )
5149const isHovered = ref (false )
@@ -139,7 +137,7 @@ const handleMouseMove = (e: MouseEvent) => {
139137
140138 if (timeDelta > 0 ) {
141139 const moveDelta = e .clientX - lastMouseX
142- velocity .value = moveDelta / timeDelta * 16 // normalize to ~60fps
140+ velocity .value = ( moveDelta / timeDelta ) * 16 // normalize to ~60fps
143141 }
144142
145143 lastMouseX = e .clientX
@@ -198,7 +196,7 @@ const handleTouchMove = (e: TouchEvent) => {
198196
199197 if (timeDelta > 0 ) {
200198 const moveDelta = touch .clientX - lastMouseX
201- velocity .value = moveDelta / timeDelta * 16 // normalize to ~60fps
199+ velocity .value = ( moveDelta / timeDelta ) * 16 // normalize to ~60fps
202200 }
203201
204202 lastMouseX = touch .clientX
0 commit comments