@@ -1296,6 +1296,11 @@ function ensureScrollProgress(mainElement) {
12961296 progress . innerHTML =
12971297 '<input class="scroll-progress-slider" type="range" min="0" max="100" step="0.1" value="0" aria-label="Carousel position" />' ;
12981298 mainElement . appendChild ( progress ) ;
1299+ const slider = progress . querySelector ( '.scroll-progress-slider' ) ;
1300+ if ( slider ) {
1301+ slider . value = '0' ;
1302+ slider . style . setProperty ( '--progress' , '0%' ) ;
1303+ }
12991304 }
13001305 return progress ;
13011306}
@@ -1315,7 +1320,27 @@ function updateScrollProgress(mainElement) {
13151320 }
13161321
13171322 progress . style . display = 'block' ;
1318- const percent = Math . min ( 100 , Math . max ( 0 , ( track . scrollLeft / maxScroll ) * 100 ) ) ;
1323+
1324+ // Map percent against actual first/last card snap positions so the thumb
1325+ // reads 0% when the first card is active and 100% when the last is active,
1326+ // regardless of scroll-snap padding or sub-pixel rounding.
1327+ let rangeStart = 0 ;
1328+ let rangeEnd = maxScroll ;
1329+ const cards = getSpotlightCards ( mainElement ) ;
1330+ if ( cards . length >= 2 ) {
1331+ const layout = getSpotlightLayout ( track , cards ) ;
1332+ if ( layout !== 'left' ) {
1333+ const first = cards [ 0 ] ;
1334+ const last = cards [ cards . length - 1 ] ;
1335+ const firstSnap = first . offsetLeft - ( track . clientWidth - first . clientWidth ) / 2 ;
1336+ const lastSnap = last . offsetLeft - ( track . clientWidth - last . clientWidth ) / 2 ;
1337+ rangeStart = Math . max ( 0 , Math . min ( maxScroll , firstSnap ) ) ;
1338+ rangeEnd = Math . max ( 0 , Math . min ( maxScroll , lastSnap ) ) ;
1339+ }
1340+ }
1341+
1342+ const range = rangeEnd - rangeStart ;
1343+ const percent = range > 0 ? Math . min ( 100 , Math . max ( 0 , ( ( track . scrollLeft - rangeStart ) / range ) * 100 ) ) : 0 ;
13191344 slider . value = `${ percent } ` ;
13201345 slider . style . setProperty ( '--progress' , `${ percent } %` ) ;
13211346}
0 commit comments