11<script setup lang="ts">
22import type { CompareResponse , FileChange } from ' #shared/types'
3+ import type { RouteLocationRaw } from ' vue-router'
34import { diffRoute , packageRoute } from ' ~/utils/router'
45
56definePageMeta ({
@@ -90,12 +91,24 @@ const groupedDeps = computed(() => {
9091 }
9192 return groups
9293})
94+ // Keep latestVersion for comparison (to show "(latest)" badge)
95+ const latestVersionDetailed = computed (() => {
96+ if (! pkg .value ) return null
97+ const latestTag = pkg .value [' dist-tags' ]?.latest
98+ if (! latestTag ) return null
99+ return pkg .value .versions [latestTag ] ?? null
100+ })
101+
102+ const normalizeRoutePath = (route : RouteLocationRaw ) => {
103+ const resolvedHref = router .resolve (route ).href
104+ return resolvedHref .replace (/ %7B/ g , ' {' ).replace (/ %7D/ g , ' }' )
105+ }
93106
94107const fromVersionUrlPattern = computed (() => {
95- return router . resolve (diffRoute (packageName .value , ' {version}' , toVersion .value )). href
108+ return normalizeRoutePath (diffRoute (packageName .value , ' {version}' , toVersion .value ))
96109})
97110const toVersionUrlPattern = computed (() => {
98- return router . resolve (diffRoute (packageName .value , fromVersion .value , ' {version}' )). href
111+ return normalizeRoutePath (diffRoute (packageName .value , fromVersion .value , ' {version}' ))
99112})
100113
101114useSeoMeta ({
@@ -112,53 +125,17 @@ useSeoMeta({
112125
113126<template >
114127 <main class =" flex-1 flex flex-col min-h-0" >
115- <!-- Header -->
116- <header class =" border-b border-border bg-bg sticky top-14 z-20" >
117- <div class =" container py-4" >
118- <!-- Package info -->
119- <div class =" flex items-center gap-2 mb-3 flex-wrap min-w-0" >
120- <NuxtLink
121- :to =" packageRoute(packageName)"
122- class =" font-mono text-lg font-medium hover:text-fg transition-colors min-w-0 truncate"
123- >
124- {{ packageName }}
125- </NuxtLink >
126- <span class =" text-fg-subtle" >/</span >
127- <span class =" font-mono text-sm text-fg-muted" >compare</span >
128- </div >
129-
130- <!-- Version selectors -->
131- <div class =" flex items-center gap-3 flex-wrap" >
132- <div class =" flex items-center gap-2" >
133- <span class =" text-xs text-fg-subtle uppercase tracking-wide" >From</span >
134- <VersionSelector
135- v-if =" pkg?.versions && pkg?.['dist-tags']"
136- :package-name =" packageName"
137- :current-version =" fromVersion"
138- :versions =" pkg.versions"
139- :dist-tags =" pkg['dist-tags']"
140- :url-pattern =" fromVersionUrlPattern"
141- />
142- <span v-else class =" font-mono text-sm text-fg-muted" >{{ fromVersion }}</span >
143- </div >
144-
145- <span class =" i-lucide:arrow-right w-4 h-4 text-fg-subtle" />
146-
147- <div class =" flex items-center gap-2" >
148- <span class =" text-xs text-fg-subtle uppercase tracking-wide" >To</span >
149- <VersionSelector
150- v-if =" pkg?.versions && pkg?.['dist-tags']"
151- :package-name =" packageName"
152- :current-version =" toVersion"
153- :versions =" pkg.versions"
154- :dist-tags =" pkg['dist-tags']"
155- :url-pattern =" toVersionUrlPattern"
156- />
157- <span v-else class =" font-mono text-sm text-fg-muted" >{{ toVersion }}</span >
158- </div >
159- </div >
160- </div >
161- </header >
128+ <div class =" w-full container -mb-px" >
129+ <PackageHeader
130+ :pkg =" pkg"
131+ :resolved-version =" fromVersion"
132+ :display-version =" pkg?.requestedVersion"
133+ :latest-version =" latestVersionDetailed"
134+ :version-url-pattern =" fromVersionUrlPattern"
135+ page =" diff"
136+ />
137+ </div >
138+ <span class =" block h-px w-full bg-border" />
162139
163140 <!-- Error: invalid route -->
164141 <div v-if =" !versionRange" class =" container py-20 text-center" >
@@ -186,6 +163,20 @@ useSeoMeta({
186163 <aside
187164 class =" hidden md:flex w-80 border-ie border-border bg-bg-subtle flex-col shrink-0 min-h-0"
188165 >
166+ <div class =" px-3 py-2 border-b border-border" >
167+ <p class =" text-xs font-medium text-fg mb-1 flex items-center gap-1.5" >
168+ <span class =" block i-lucide-git-compare-arrows w-3.5 h-3.5" />
169+ {{ $t('compare.version_selector_title') }}
170+ </p >
171+ <VersionSelector
172+ v-if =" pkg?.versions && pkg?.['dist-tags']"
173+ :package-name =" packageName"
174+ :current-version =" toVersion"
175+ :versions =" pkg.versions"
176+ :dist-tags =" pkg['dist-tags']"
177+ :url-pattern =" toVersionUrlPattern"
178+ />
179+ </div >
189180 <DiffSidebarPanel
190181 :compare =" compare"
191182 :grouped-deps =" groupedDeps"
0 commit comments