From b08e2f08e8a380c5dee0f859b9ac75c56561a034 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Sat, 21 Mar 2026 23:02:26 +0530 Subject: [PATCH 1/3] fix(package): make README markdown copy work in Safari by enabling clipboard legacy fallback --- app/pages/package/[[org]]/[name].vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index a83a101243..87182dd961 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -99,6 +99,7 @@ const { const { copied: copiedReadme, copy: copyReadme } = useClipboard({ source: () => '', copiedDuring: 2000, + legacy: true, }) function prefetchReadmeMarkdown() { @@ -108,9 +109,12 @@ function prefetchReadmeMarkdown() { } async function copyReadmeHandler() { - await fetchReadmeMarkdown() + let markdown = readmeMarkdownData.value?.markdown + if (!markdown) { + await fetchReadmeMarkdown() + markdown = readmeMarkdownData.value?.markdown + } - const markdown = readmeMarkdownData.value?.markdown if (!markdown) return await copyReadme(markdown) From 0698249c27b90b08fa4167bf37df77e91dd97098 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Sun, 22 Mar 2026 12:40:51 +0530 Subject: [PATCH 2/3] fix(ui): make readme markdown copy more reliable with prefetch and loading state --- app/pages/package/[[org]]/[name].vue | 73 ++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index 87182dd961..79152cba38 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -95,29 +95,70 @@ const { }, ) +function maybePrefetchReadmeMarkdown() { + if (import.meta.server) return + if (!readmeData.value.mdExists) return + if (readmeMarkdownStatus.value !== 'idle') return + void fetchReadmeMarkdown() +} + +watch([() => readmeData.value.mdExists, readmeMarkdownStatus], () => { + maybePrefetchReadmeMarkdown() +}, { immediate: true }) + //copy README file as Markdown const { copied: copiedReadme, copy: copyReadme } = useClipboard({ source: () => '', copiedDuring: 2000, legacy: true, }) +const isCopyingReadme = shallowRef(false) + +const readmeCopyTooltip = computed(() => + isCopyingReadme.value ? $t('common.loading') : $t('package.readme.copy_as_markdown'), +) + +const readmeCopyAriaLabel = computed(() => { + if (isCopyingReadme.value) return $t('common.loading') + if (copiedReadme.value) return $t('common.copied') + return $t('package.readme.copy_as_markdown') +}) + +const readmeCopyIcon = computed(() => { + if (isCopyingReadme.value) return 'i-svg-spinners:ring-resize' + if (copiedReadme.value) return 'i-lucide:check' + return 'i-simple-icons:markdown' +}) + +const readmeCopyText = computed(() => { + if (isCopyingReadme.value) return $t('common.loading') + if (copiedReadme.value) return $t('common.copied') + return $t('common.copy') +}) function prefetchReadmeMarkdown() { - if (readmeMarkdownStatus.value === 'idle') { - fetchReadmeMarkdown() - } + maybePrefetchReadmeMarkdown() } async function copyReadmeHandler() { - let markdown = readmeMarkdownData.value?.markdown - if (!markdown) { - await fetchReadmeMarkdown() - markdown = readmeMarkdownData.value?.markdown - } + if (isCopyingReadme.value) return - if (!markdown) return + isCopyingReadme.value = true + + try { + let markdown = readmeMarkdownData.value?.markdown + if (!markdown) { + await fetchReadmeMarkdown() + markdown = readmeMarkdownData.value?.markdown + } - await copyReadme(markdown) + if (!markdown) return + + await copyReadme(markdown) + } + finally { + isCopyingReadme.value = false + } } // Track active TOC item based on scroll position @@ -988,20 +1029,20 @@ const showSkeleton = shallowRef(false) - {{ copiedReadme ? $t('common.copied') : $t('common.copy') }} + {{ readmeCopyText }} Date: Sun, 22 Mar 2026 07:11:57 +0000 Subject: [PATCH 3/3] [autofix.ci] apply automated fixes --- app/pages/package/[[org]]/[name].vue | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index 79152cba38..eb83b22984 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -102,9 +102,13 @@ function maybePrefetchReadmeMarkdown() { void fetchReadmeMarkdown() } -watch([() => readmeData.value.mdExists, readmeMarkdownStatus], () => { - maybePrefetchReadmeMarkdown() -}, { immediate: true }) +watch( + [() => readmeData.value.mdExists, readmeMarkdownStatus], + () => { + maybePrefetchReadmeMarkdown() + }, + { immediate: true }, +) //copy README file as Markdown const { copied: copiedReadme, copy: copyReadme } = useClipboard({ @@ -155,8 +159,7 @@ async function copyReadmeHandler() { if (!markdown) return await copyReadme(markdown) - } - finally { + } finally { isCopyingReadme.value = false } } @@ -1027,11 +1030,7 @@ const showSkeleton = shallowRef(false)
- +