Skip to content

Commit 77f2035

Browse files
Merge branch 'main' into feat/action-bar
2 parents 205430b + 31db8f8 commit 77f2035

File tree

15 files changed

+1596
-266
lines changed

15 files changed

+1596
-266
lines changed

app/components/Package/Header.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ const likeAction = async () => {
247247

248248
<template>
249249
<!-- Package header -->
250-
<header class="bg-bg pt-5 w-full container">
250+
<header class="bg-bg pt-5 pb-1 w-full container">
251251
<!-- Package name and version -->
252252
<div class="flex items-baseline justify-between gap-x-2 gap-y-1 flex-wrap min-w-0">
253253
<CopyToClipboardButton
@@ -319,7 +319,7 @@ const likeAction = async () => {
319319
</header>
320320
<div
321321
ref="header"
322-
class="w-full bg-bg sticky top-14 z-50 border-b border-border pt-2"
322+
class="w-full bg-bg sticky top-14 z-10 border-b border-border pt-2"
323323
:class="[$style.packageHeader]"
324324
data-testid="package-subheader"
325325
>
@@ -395,7 +395,7 @@ const likeAction = async () => {
395395
v-if="mainLink"
396396
:to="mainLink"
397397
aria-keyshortcuts="m"
398-
class="decoration-none border-b-2 p-1 hover:border-accent/50 lowercase"
398+
class="decoration-none border-b-2 p-1 hover:border-accent/50 lowercase focus-visible:[outline-offset:-2px]!"
399399
:class="page === 'main' ? 'border-accent text-accent!' : 'border-transparent'"
400400
>
401401
{{ $t('package.links.main') }}
@@ -404,7 +404,7 @@ const likeAction = async () => {
404404
v-if="docsLink"
405405
:to="docsLink"
406406
aria-keyshortcuts="d"
407-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
407+
class="decoration-none border-b-2 p-1 hover:border-accent/50 focus-visible:[outline-offset:-2px]!"
408408
:class="page === 'docs' ? 'border-accent text-accent!' : 'border-transparent'"
409409
>
410410
{{ $t('package.links.docs') }}
@@ -413,7 +413,7 @@ const likeAction = async () => {
413413
v-if="codeLink"
414414
:to="codeLink"
415415
aria-keyshortcuts="."
416-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
416+
class="decoration-none border-b-2 p-1 hover:border-accent/50 focus-visible:[outline-offset:-2px]!"
417417
:class="page === 'code' ? 'border-accent text-accent!' : 'border-transparent'"
418418
>
419419
{{ $t('package.links.code') }}
@@ -423,7 +423,7 @@ const likeAction = async () => {
423423
:to="diffLink"
424424
:title="$t('compare.compare_versions_title')"
425425
aria-keyshortcuts="f"
426-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
426+
class="decoration-none border-b-2 p-1 hover:border-accent/50 focus-visible:[outline-offset:-2px]!"
427427
:class="page === 'diff' ? 'border-accent text-accent!' : 'border-transparent'"
428428
>
429429
{{ $t('compare.compare_versions') }}

app/components/Package/Versions.vue

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ function versionRoute(version: string): RouteLocationRaw {
9595
return packageRoute(props.packageName, version)
9696
}
9797
98+
// Route to the full versions history page
99+
const versionsPageRoute = computed((): RouteLocationRaw => {
100+
const [org, name = ''] = props.packageName.startsWith('@')
101+
? props.packageName.split('/')
102+
: ['', props.packageName]
103+
return { name: 'package-versions', params: { org, name } }
104+
})
105+
98106
// Version to tags lookup (supports multiple tags per version)
99107
const versionToTags = computed(() => buildVersionToTagsMap(props.distTags))
100108
@@ -521,15 +529,27 @@ function majorGroupContainsCurrent(group: (typeof otherMajorGroups.value)[0]): b
521529
id="versions"
522530
>
523531
<template #actions>
524-
<ButtonBase
525-
variant="secondary"
526-
class="text-fg-subtle hover:text-fg transition-colors min-w-6 min-h-6 -m-1 p-1 rounded"
527-
:title="$t('package.downloads.community_distribution')"
528-
classicon="i-lucide:file-stack"
529-
@click="openDistributionModal"
530-
>
531-
<span class="sr-only">{{ $t('package.downloads.community_distribution') }}</span>
532-
</ButtonBase>
532+
<div class="flex items-center gap-3">
533+
<LinkBase
534+
:to="versionsPageRoute"
535+
variant="button-secondary"
536+
class="text-fg-subtle hover:text-fg transition-colors min-w-6 min-h-6 p-1 rounded"
537+
:title="$t('package.versions.view_all_versions')"
538+
classicon="i-lucide:history"
539+
data-testid="view-all-versions-link"
540+
>
541+
<span class="sr-only">{{ $t('package.versions.view_all_versions') }}</span>
542+
</LinkBase>
543+
<ButtonBase
544+
variant="secondary"
545+
class="text-fg-subtle hover:text-fg transition-colors min-w-6 min-h-6 -m-1 p-1 rounded"
546+
:title="$t('package.downloads.community_distribution')"
547+
classicon="i-lucide:file-stack"
548+
@click="openDistributionModal"
549+
>
550+
<span class="sr-only">{{ $t('package.downloads.community_distribution') }}</span>
551+
</ButtonBase>
552+
</div>
533553
</template>
534554
<div class="space-y-0.5 min-w-0">
535555
<!-- Semver range filter -->

app/pages/compare.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import FacetBarChart from '~/components/Compare/FacetBarChart.vue'
55
66
definePageMeta({
77
name: 'compare',
8+
preserveScrollOnQuery: true,
89
})
910
1011
const { locale } = useI18n()

app/pages/package/[[org]]/[name].vue

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ const { diff: sizeDiff } = useInstallSizeDiff(packageName, resolvedVersion, pkg,
211211
// → Preserve the server-rendered DOM, don't flash to skeleton.
212212
const nuxtApp = useNuxtApp()
213213
const route = useRoute()
214+
// Gates template rendering only — data fetches intentionally still run.
215+
// immediate is set once at mount — skipped requests won't re-fire on navigation, leaving data permanently missing.
216+
const isVersionsRoute = computed(() => route.name === 'package-versions')
214217
const hasEmptyPayload =
215218
import.meta.client &&
216219
nuxtApp.payload.serverRendered &&
@@ -479,7 +482,8 @@ const showSkeleton = shallowRef(false)
479482
</script>
480483

481484
<template>
482-
<DevOnly>
485+
<NuxtPage v-if="isVersionsRoute" />
486+
<DevOnly v-else>
483487
<ButtonBase
484488
class="fixed bottom-4 inset-is-4 z-50 shadow-lg rounded-full! px-3! py-2!"
485489
classicon="i-simple-icons:skeleton"
@@ -491,7 +495,7 @@ const showSkeleton = shallowRef(false)
491495
<span class="text-xs">Skeleton</span>
492496
</ButtonBase>
493497
</DevOnly>
494-
<main class="flex-1 pb-8">
498+
<main v-if="!isVersionsRoute" class="flex-1 pb-8">
495499
<!-- Scenario 1: SPA fallback — show skeleton (no real content to preserve) -->
496500
<!-- Scenario 2: SSR with missing payload — preserve server DOM, skip skeleton -->
497501
<PackageSkeleton
@@ -593,10 +597,8 @@ const showSkeleton = shallowRef(false)
593597
<!-- Direct deps (muted) -->
594598
<span class="text-fg-muted">{{ numberFormatter.format(dependencyCount) }}</span>
595599

596-
<!-- Separator and total transitive deps -->
600+
<!-- Total transitive deps in parens -->
597601
<template v-if="dependencyCount > 0 && dependencyCount !== totalDepsCount">
598-
<span class="text-fg-subtle">/</span>
599-
600602
<ClientOnly>
601603
<span
602604
v-if="
@@ -605,14 +607,16 @@ const showSkeleton = shallowRef(false)
605607
"
606608
class="inline-flex items-center gap-1 text-fg-subtle"
607609
>
608-
<span class="i-svg-spinners:ring-resize w-3 h-3" aria-hidden="true" />
610+
(<span class="i-svg-spinners:ring-resize w-3 h-3" aria-hidden="true" />)
609611
</span>
610-
<span v-else-if="totalDepsCount !== null">{{
611-
numberFormatter.format(totalDepsCount)
612-
}}</span>
613-
<span v-else class="text-fg-subtle">-</span>
612+
<span v-else-if="totalDepsCount !== null"
613+
><span class="text-fg-subtle">(</span
614+
>{{ numberFormatter.format(totalDepsCount)
615+
}}<span class="text-fg-subtle">)</span></span
616+
>
617+
<span v-else class="text-fg-subtle">(-)</span>
614618
<template #fallback>
615-
<span class="text-fg-subtle">-</span>
619+
<span class="text-fg-subtle">(-)</span>
616620
</template>
617621
</ClientOnly>
618622
</template>
@@ -662,20 +666,22 @@ const showSkeleton = shallowRef(false)
662666
<span v-else>-</span>
663667
</span>
664668

665-
<!-- Separator and install size -->
669+
<!-- Total install size in parens -->
666670
<template v-if="displayVersion?.dist?.unpackedSize !== installSize?.totalSize">
667-
<span class="text-fg-subtle mx-1">/</span>
668-
669-
<span
670-
v-if="installSizeStatus === 'pending'"
671-
class="inline-flex items-center gap-1 text-fg-subtle"
672-
>
673-
<span class="i-svg-spinners:ring-resize w-3 h-3" aria-hidden="true" />
674-
</span>
675-
<span v-else-if="installSize?.totalSize" dir="ltr">
676-
{{ bytesFormatter.format(installSize.totalSize) }}
671+
<span class="ms-1">
672+
<span
673+
v-if="installSizeStatus === 'pending'"
674+
class="inline-flex items-center gap-1 text-fg-subtle"
675+
>
676+
(<span class="i-svg-spinners:ring-resize w-3 h-3" aria-hidden="true" />)
677+
</span>
678+
<span v-else-if="installSize?.totalSize" dir="ltr">
679+
<span class="text-fg-subtle">(</span
680+
>{{ bytesFormatter.format(installSize.totalSize)
681+
}}<span class="text-fg-subtle">)</span>
682+
</span>
683+
<span v-else class="text-fg-subtle">(-)</span>
677684
</span>
678-
<span v-else class="text-fg-subtle">-</span>
679685
</template>
680686
</dd>
681687
</div>

0 commit comments

Comments
 (0)