diff --git a/app/components/Package/Header.vue b/app/components/Package/Header.vue index 571dff4264..b24af53517 100644 --- a/app/components/Package/Header.vue +++ b/app/components/Package/Header.vue @@ -61,6 +61,7 @@ const { y: scrollY } = useScroll(window) const showScrollToTop = computed(() => scrollY.value > SCROLL_TO_TOP_THRESHOLD) const packageName = computed(() => props.pkg?.name ?? '') +const resolvedVersionDisplay = computed(() => props.resolvedVersion ?? '') const fundingUrl = computed(() => { let funding = props.displayVersion?.funding if (Array.isArray(funding)) funding = funding[0] @@ -75,6 +76,11 @@ const { copied: copiedPkgName, copy: copyPkgName } = useClipboard({ copiedDuring: 2000, }) +const { copied: copiedPkgVersion, copy: copyPkgVersion } = useClipboard({ + source: resolvedVersionDisplay, + copiedDuring: 2000, +}) + function hasProvenance(version: PackumentVersion | null): boolean { if (!version?.dist) return false return !!(version.dist as { attestations?: unknown }).attestations @@ -86,8 +92,10 @@ useCommandPaletteContextCommands( computed((): CommandPaletteContextCommandInput[] => { if (!packageName.value) return [] - const commands: CommandPaletteContextCommandInput[] = [ - { + const commands: CommandPaletteContextCommandInput[] = [] + + if (packageName.value) { + commands.push({ id: 'package-copy-name', group: 'package', label: $t('package.copy_name'), @@ -97,8 +105,22 @@ useCommandPaletteContextCommands( copyPkgName() announce($t('command_palette.announcements.copied_to_clipboard')) }, - }, - ] + }) + } + + if (props.resolvedVersion) { + commands.push({ + id: 'package-copy-version', + group: 'package', + label: $t('package.versions.copy_version'), + keywords: [props.resolvedVersion ?? ''], + iconClass: 'i-lucide:copy', + action: () => { + copyPkgVersion() + announce($t('command_palette.announcements.copied_to_clipboard')) + }, + }) + } if (fundingUrl.value) { commands.push({ @@ -287,16 +309,23 @@ useShortcuts({