88 filterVersions ,
99 getVersionGroupKey ,
1010 getVersionGroupLabel ,
11+ getTagPriority ,
1112} from ' ~/utils/versions'
1213import { fetchAllPackageVersions } from ' ~/utils/npm/api'
1314
@@ -65,6 +66,19 @@ async function ensureFullDataLoaded() {
6566
6667const versionToTagsMap = computed (() => buildVersionToTagsMap (distTags .value ))
6768const tagRows = computed (() => buildTaggedVersionRows (distTags .value ))
69+ const latestTagRow = computed (() => tagRows .value .find (r => r .tags .includes (' latest' )) ?? null )
70+ const otherTagRows = computed (() =>
71+ tagRows .value
72+ .filter (r => ! r .tags .includes (' latest' ))
73+ .sort ((a , b ) => {
74+ const pa = getTagPriority (a .primaryTag )
75+ const pb = getTagPriority (b .primaryTag )
76+ if (pa !== pb ) return pa - pb
77+ const ta = versionTimes .value [a .version ] ?? ' '
78+ const tb = versionTimes .value [b .version ] ?? ' '
79+ return tb .localeCompare (ta )
80+ }),
81+ )
6882
6983function getVersionTime(version : string ): string | undefined {
7084 return versionTimes .value [version ]
@@ -215,39 +229,39 @@ const flatItems = computed<FlatItem[]>(() => {
215229
216230 <!-- Latest — featured card -->
217231 <div
218- v-if =" tagRows[0] "
232+ v-if =" latestTagRow "
219233 class =" border-y sm:rounded-lg sm:border border-accent/40 bg-accent/5 px-5 py-4 relative flex items-center justify-between gap-4 hover:bg-accent/8 transition-colors"
220234 >
221235 <!-- Left: tags + version -->
222236 <div >
223237 <div class =" flex items-center gap-2 mb-1.5 flex-wrap" >
224238 <span class =" text-3xs font-bold uppercase tracking-widest text-accent" >latest</span >
225239 <span
226- v-for =" tag in tagRows[0] .tags.filter(t => t !== 'latest')"
240+ v-for =" tag in latestTagRow! .tags.filter(t => t !== 'latest')"
227241 :key =" tag"
228242 class =" text-3xs font-semibold uppercase tracking-wide text-fg-subtle"
229243 >{{ tag }}</span
230244 >
231245 </div >
232246 <LinkBase
233- :to =" packageRoute(packageName, tagRows[0] .version)"
247+ :to =" packageRoute(packageName, latestTagRow! .version)"
234248 class =" text-2xl font-semibold tracking-tight after:absolute after:inset-0 after:content-['']"
235249 dir =" ltr"
236- >{{ tagRows[0] .version }}</LinkBase
250+ >{{ latestTagRow! .version }}</LinkBase
237251 >
238252 </div >
239253 <!-- Right: date + provenance -->
240254 <div class =" flex flex-col items-end gap-1.5 shrink-0 relative z-10" >
241255 <ProvenanceBadge
242- v-if =" fullVersionMap?.get(tagRows[0] .version)?.hasProvenance"
256+ v-if =" fullVersionMap?.get(latestTagRow! .version)?.hasProvenance"
243257 :package-name =" packageName"
244- :version =" tagRows[0] .version"
258+ :version =" latestTagRow! .version"
245259 compact
246260 :linked =" false"
247261 />
248262 <DateTime
249- v-if =" getVersionTime(tagRows[0] .version)"
250- :datetime =" getVersionTime(tagRows[0] .version)!"
263+ v-if =" getVersionTime(latestTagRow! .version)"
264+ :datetime =" getVersionTime(latestTagRow! .version)!"
251265 class =" text-xs text-fg-subtle"
252266 year =" numeric"
253267 month =" short"
@@ -258,11 +272,11 @@ const flatItems = computed<FlatItem[]>(() => {
258272
259273 <!-- Other tags — compact list (hidden when only latest exists) -->
260274 <div
261- v-if =" tagRows .length > 1 "
275+ v-if =" otherTagRows .length > 0 "
262276 class =" border-y sm:rounded-lg sm:border border-border sm:overflow-hidden"
263277 >
264278 <div
265- v-for =" row in tagRows.slice(1) "
279+ v-for =" row in otherTagRows "
266280 :key =" row.id"
267281 class =" flex items-center gap-4 px-4 py-2.5 border-b border-border last:border-0 hover:bg-bg-subtle transition-colors relative"
268282 >
0 commit comments