Skip to content

Commit 6d9fb40

Browse files
committed
feat: use version-selector in package-header
1 parent 766266e commit 6d9fb40

3 files changed

Lines changed: 34 additions & 35 deletions

File tree

app/components/Package/Header.vue

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
<script setup lang="ts">
2-
import type { PackumentVersion, ProvenanceDetails, SlimVersion } from '#shared/types'
2+
import type { PackumentVersion, ProvenanceDetails, SlimVersion, SlimPackument } from '#shared/types'
33
import type { RouteLocationRaw } from 'vue-router'
44
import { SCROLL_TO_TOP_THRESHOLD } from '~/composables/useScrollToTop'
55
import { useModal } from '~/composables/useModal'
66
import { useAtproto } from '~/composables/atproto/useAtproto'
77
import { togglePackageLike } from '~/utils/atproto/likes'
88
99
const props = defineProps<{
10-
pkg: { name: string } | null
10+
pkg: SlimPackument | null
1111
resolvedVersion?: string | null
1212
displayVersion: PackumentVersion | null
1313
latestVersion: SlimVersion | null
1414
provenanceData: ProvenanceDetails | null
1515
provenanceStatus: string
1616
docsLink: RouteLocationRaw | null
1717
codeLink: RouteLocationRaw | null
18-
page: 'docs' | 'code' | 'diff'
18+
page: 'readme' | 'docs' | 'code' | 'diff'
19+
versionUrlPattern: string
1920
}>()
2021
2122
const { requestedVersion, orgName } = usePackageRoute()
@@ -74,11 +75,6 @@ const { copied: copiedPkgName, copy: copyPkgName } = useClipboard({
7475
copiedDuring: 2000,
7576
})
7677
77-
const { copied: copiedVersion, copy: copyVersion } = useClipboard({
78-
source: () => props.resolvedVersion ?? '',
79-
copiedDuring: 2000,
80-
})
81-
8278
function hasProvenance(version: PackumentVersion | null): boolean {
8379
if (!version?.dist) return false
8480
return !!(version.dist as { attestations?: unknown }).attestations
@@ -238,7 +234,7 @@ const likeAction = async () => {
238234
class="py-1.5 px-2.5 sm:me-2"
239235
:tabindex="showScrollToTop ? 0 : -1"
240236
/>
241-
<div class="break-all font-mono text-fg-muted">
237+
<div class="flex-inline items-center flex-nowrap gap-1 font-mono text-fg-muted">
242238
<template v-if="hasProvenance(displayVersion)">
243239
<TooltipApp
244240
:text="
@@ -271,28 +267,15 @@ const likeAction = async () => {
271267
<span class="i-lucide:cable rtl-flip min-w-3 w-3 h-3 mx-1" aria-hidden="true" />
272268
</TooltipApp>
273269
</template>
274-
<CopyToClipboardButton
275-
v-if="resolvedVersion"
276-
:copied="copiedVersion"
277-
:copy-text="$t('package.copy_version')"
278-
@click="copyVersion()"
279-
class="inline"
280-
>
281-
<LinkBase
282-
v-if="requestedVersion && resolvedVersion !== requestedVersion"
283-
:to="packageRoute(packageName, resolvedVersion)"
284-
:title="$t('package.view_permalink')"
285-
dir="ltr"
286-
class="inline!"
287-
>{{ resolvedVersion }}</LinkBase
288-
>
289-
<span dir="ltr" v-else>v{{ resolvedVersion }}</span>
290-
</CopyToClipboardButton>
291-
<span
292-
v-if="requestedVersion && latestVersion && resolvedVersion !== latestVersion.version"
293-
class="text-fg-subtle text-sm text-nowrap ms-1"
294-
>{{ $t('package.not_latest') }}</span
295-
>
270+
<!-- Version selector -->
271+
<VersionSelector
272+
v-if="resolvedVersion && pkg?.versions && pkg?.['dist-tags']"
273+
:package-name="packageName"
274+
:current-version="resolvedVersion"
275+
:versions="pkg.versions"
276+
:dist-tags="pkg['dist-tags']"
277+
:url-pattern="versionUrlPattern"
278+
/>
296279
</div>
297280
</div>
298281
<!-- Docs + Code — inline on desktop, floating bottom bar on mobile -->
@@ -303,6 +286,15 @@ const likeAction = async () => {
303286
:style="navExtraOffsetStyle"
304287
:class="$style.packageNav"
305288
>
289+
<LinkBase
290+
v-if="docsLink"
291+
:to="docsLink"
292+
aria-keyshortcuts="r"
293+
class="decoration-none border-b-2 p-1 hover:border-accent/50 lowercase"
294+
:class="page === 'readme' ? 'border-accent text-accent!' : 'border-transparent'"
295+
>
296+
{{ $t('package.readme.title') }}
297+
</LinkBase>
306298
<LinkBase
307299
v-if="docsLink"
308300
:to="docsLink"
@@ -325,6 +317,7 @@ const likeAction = async () => {
325317
v-if="displayVersion && latestVersion && displayVersion.version !== latestVersion.version"
326318
:to="diffRoute(packageName, displayVersion.version, latestVersion.version)"
327319
:title="$t('compare.compare_versions_title')"
320+
aria-keyshortcuts="f"
328321
class="decoration-none border-b-2 p-1 hover:border-accent/50"
329322
:class="page === 'diff' ? 'border-accent text-accent!' : 'border-transparent'"
330323
>

app/components/VersionSelector.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,19 +472,19 @@ watch(
472472
type="button"
473473
aria-haspopup="listbox"
474474
:aria-expanded="isOpen"
475-
class="flex items-center gap-1.5 text-fg-subtle font-mono text-sm hover:text-fg transition-[color] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg rounded"
475+
class="break-all text-start text-fg-subtle font-mono text-sm hover:text-fg transition-[color] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg rounded"
476476
@click="isOpen = !isOpen"
477477
@keydown="handleButtonKeydown"
478478
>
479479
<span dir="ltr">{{ currentVersion }}</span>
480480
<span
481481
v-if="currentVersion === latestVersion"
482-
class="text-xs px-1.5 py-0.5 rounded badge-green font-sans font-medium"
482+
class="text-xs px-1.5 py-0.5 rounded badge-green font-sans font-medium mx-1.5"
483483
>
484484
latest
485485
</span>
486486
<span
487-
class="i-lucide:chevron-down w-3.5 h-3.5 transition-[transform] duration-200 motion-reduce:transition-none"
487+
class="i-lucide:chevron-down w-3.5 h-3.5 transition-[transform] duration-200 motion-reduce:transition-none vertical-middle"
488488
:class="{ 'rotate-180': isOpen }"
489489
aria-hidden="true"
490490
/>

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,11 @@ onKeyStroke(
600600
},
601601
)
602602
603+
// URL pattern for version selector - includes file path if present
604+
const versionUrlPattern = computed(
605+
() => `/package/${pkg.value?.name || packageName.value}/v/{version}`,
606+
)
607+
603608
const showSkeleton = shallowRef(false)
604609
</script>
605610

@@ -650,7 +655,8 @@ const showSkeleton = shallowRef(false)
650655
:docs-link="docsLink"
651656
:code-link="codeLink"
652657
:class="$style.areaHeader"
653-
page="docs"
658+
:version-url-pattern="versionUrlPattern"
659+
page="readme"
654660
/>
655661
<article id="package-article" :class="$style.packagePage">
656662
<!-- Package details -->

0 commit comments

Comments
 (0)