@@ -432,6 +432,7 @@ function getDatapointPlots(
432432 item : TimelineDatasetItem ,
433433 predicate : (datapoint : TimelineSourceItem , index : number ) => boolean ,
434434 markerKey : string ,
435+ zoomOffset : number ,
435436): TimelineMarkerItem [] {
436437 if (! item || ! Array .isArray (item .source ) || ! Array .isArray (item .plots )) {
437438 return []
@@ -440,9 +441,10 @@ function getDatapointPlots(
440441 const timelineItem = item as TimelineSvgDataItem
441442
442443 return timelineItem .source .flatMap ((datapoint , index ) => {
443- const plot = timelineItem .plots [index ]
444+ const plotIndex = index - zoomOffset
445+ const plot = timelineItem .plots [plotIndex ]
444446
445- if (! plot || ! predicate (datapoint , index )) {
447+ if (plotIndex < 0 || ! plot || ! predicate (datapoint , index )) {
446448 return []
447449 }
448450
@@ -461,16 +463,35 @@ function getDatapointPlots(
461463 })
462464}
463465
464- function getLatestDatapointPlot(item : TimelineDatasetItem ): TimelinePlotItem | null {
465- return item ?.plots ?.[activeVersionIndex .value ] ?? null
466+ function getActiveVersionDatapointPlot(
467+ item : TimelineDatasetItem ,
468+ zoomOffset : number ,
469+ ): TimelinePlotItem | null {
470+ return item ?.plots ?.[activeVersionIndex .value - zoomOffset ] ?? null
466471}
467472
468- function getPositiveDatapointPlots(item : TimelineDatasetItem ): TimelineMarkerItem [] {
469- return getDatapointPlots (item , datapoint => datapoint .hasPositive === true , ' positive' )
473+ function getPositiveDatapointPlots(
474+ item : TimelineDatasetItem ,
475+ zoomOffset : number ,
476+ ): TimelineMarkerItem [] {
477+ return getDatapointPlots (
478+ item ,
479+ datapoint => datapoint .hasPositive === true ,
480+ ' positive' ,
481+ zoomOffset ,
482+ )
470483}
471484
472- function getNegativeDatapointPlots(item : TimelineDatasetItem ): TimelineMarkerItem [] {
473- return getDatapointPlots (item , datapoint => datapoint .hasNegative === true , ' negative' )
485+ function getNegativeDatapointPlots(
486+ item : TimelineDatasetItem ,
487+ zoomOffset : number ,
488+ ): TimelineMarkerItem [] {
489+ return getDatapointPlots (
490+ item ,
491+ datapoint => datapoint .hasNegative === true ,
492+ ' negative' ,
493+ zoomOffset ,
494+ )
474495}
475496
476497const indexSelection = computed (() => {
@@ -507,13 +528,13 @@ const indexSelection = computed(() => {
507528 <ClientOnly >
508529 <VueUiXy :dataset =" datasets[activeTab]" :config :selected-x-index =" indexSelection" >
509530 <!-- Custom tooltip -->
510- <template #tooltip =" { seriesIndex } " >
531+ <template #tooltip =" { timeLabel } " >
511532 <div class =" font-mono text-xs flex flex-col" >
512533 <div class =" border-border border-b pb-2 mb-2 flex flex-col" >
513534 <div class =" flex flex-row gap-4" >
514- <span class =" text-fg" >{{ convertedData[seriesIndex ]?.version }}</span >
535+ <span class =" text-fg" >{{ convertedData[timeLabel.absoluteIndex ]?.version }}</span >
515536 <span
516- v-for =" tag in convertedData[seriesIndex ]?.tags"
537+ v-for =" tag in convertedData[timeLabel.absoluteIndex ]?.tags"
517538 :key =" tag"
518539 class =" text-3xs font-semibold uppercase tracking-wide"
519540 :class =" tag === 'latest' ? 'text-accent' : 'text-fg-subtle'"
@@ -522,7 +543,7 @@ const indexSelection = computed(() => {
522543 </span >
523544 </div >
524545 <DateTime
525- :datetime =" convertedData[seriesIndex ]?.time!"
546+ :datetime =" convertedData[timeLabel.absoluteIndex ]?.time!"
526547 class =" text-xs text-fg-subtle"
527548 year =" numeric"
528549 month =" short"
@@ -535,7 +556,9 @@ const indexSelection = computed(() => {
535556 <div class =" flex flex-row gap-2 items-end" >
536557 <span class =" text-[var(--fg)]/70" >{{ $t('package.stats.install_size') }}</span >
537558 <span class =" text-sm" >
538- {{ bytesFormatter.format(convertedData[seriesIndex]?.totalSize ?? 0) }}
559+ {{
560+ bytesFormatter.format(convertedData[timeLabel.absoluteIndex]?.totalSize ?? 0)
561+ }}
539562 </span >
540563 </div >
541564
@@ -544,15 +567,20 @@ const indexSelection = computed(() => {
544567 <span class =" text-[var(--fg)]/70" >{{ $t('compare.dependencies') }}</span >
545568 <span class =" text-sm" >
546569 {{
547- compactNumberFormatter.format(convertedData[seriesIndex]?.dependencyCount ?? 0)
570+ compactNumberFormatter.format(
571+ convertedData[timeLabel.absoluteIndex]?.dependencyCount ?? 0,
572+ )
548573 }}
549574 </span >
550575 </div >
551576 </div >
552577
553- <ol v-if =" convertedData[seriesIndex]?.events.length" class =" relative font-[Geist] mt-2" >
578+ <ol
579+ v-if =" convertedData[timeLabel.absoluteIndex]?.events.length"
580+ class =" relative font-[Geist] mt-2"
581+ >
554582 <li
555- v-for =" event in convertedData[seriesIndex ]?.events"
583+ v-for =" event in convertedData[timeLabel.absoluteIndex ]?.events"
556584 :key =" event.key"
557585 class =" relative mb-1 ms-4 last:mb-0"
558586 >
@@ -611,9 +639,9 @@ const indexSelection = computed(() => {
611639 <!-- Marker for selected version -->
612640 <circle
613641 class =" pointer-events-none svg-element-transition"
614- v-if =" getLatestDatapointPlot (svg.data[0])"
615- :cx =" getLatestDatapointPlot (svg.data[0])!.x"
616- :cy =" getLatestDatapointPlot (svg.data[0])!.y"
642+ v-if =" getActiveVersionDatapointPlot (svg.data[0], svg.slicer.start )"
643+ :cx =" getActiveVersionDatapointPlot (svg.data[0], svg.slicer.start )!.x"
644+ :cy =" getActiveVersionDatapointPlot (svg.data[0], svg.slicer.start )!.y"
617645 r =" 8"
618646 :fill =" colors.accent"
619647 :stroke =" colors.bg"
@@ -622,7 +650,7 @@ const indexSelection = computed(() => {
622650
623651 <!-- Marker for positive events -->
624652 <g
625- v-for =" plot in getPositiveDatapointPlots(svg.data[0])"
653+ v-for =" plot in getPositiveDatapointPlots(svg.data[0], svg.slicer.start )"
626654 :key =" `pos_${plot.key}`"
627655 class =" pointer-events-none"
628656 >
@@ -648,7 +676,7 @@ const indexSelection = computed(() => {
648676
649677 <!-- Marker for negative events -->
650678 <g
651- v-for =" plot in getNegativeDatapointPlots(svg.data[0])"
679+ v-for =" plot in getNegativeDatapointPlots(svg.data[0], svg.slicer.start )"
652680 :key =" `neg_${plot.key}`"
653681 class =" pointer-events-none"
654682 >
0 commit comments