@@ -669,7 +669,12 @@ const showSkeleton = shallowRef(false)
669669 >
670670 <!-- Package name and version -->
671671 <div class =" flex items-baseline gap-x-2 gap-y-1 sm:gap-x-3 flex-wrap min-w-0" >
672- <div class =" group relative flex flex-col items-start min-w-0" >
672+ <CopyToClipboardButton
673+ :copied =" copiedPkgName"
674+ :copy-text =" $t('package.copy_name')"
675+ class =" flex flex-col items-start min-w-0"
676+ @click =" copyPkgName()"
677+ >
673678 <h1
674679 class =" font-mono text-2xl sm:text-3xl font-medium min-w-0 break-words"
675680 :title =" pkg.name"
@@ -683,30 +688,14 @@ const showSkeleton = shallowRef(false)
683688 {{ orgName ? pkg.name.replace(`@${orgName}/`, '') : pkg.name }}
684689 </span >
685690 </h1 >
691+ </CopyToClipboardButton >
686692
687- <!-- Floating copy name button -->
688- <button
689- type =" button"
690- @click =" copyPkgName()"
691- class =" absolute z-20 inset-is-0 top-full inline-flex items-center gap-1 px-2 py-1 rounded border text-xs font-mono whitespace-nowrap transition-all duration-150 opacity-0 -translate-y-1 pointer-events-none group-hover:opacity-100 group-hover:translate-y-0 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:translate-y-0 focus-visible:pointer-events-auto"
692- :class =" [
693- $style.copyButton,
694- copiedPkgName ? 'text-accent bg-accent/10' : 'text-fg-muted bg-bg border-border',
695- ]"
696- :aria-label =" copiedPkgName ? $t('common.copied') : $t('package.copy_name')"
697- >
698- <span
699- :class =" copiedPkgName ? 'i-lucide:check' : 'i-lucide:copy'"
700- class =" w-3.5 h-3.5"
701- aria-hidden =" true"
702- />
703- {{ copiedPkgName ? $t('common.copied') : $t('package.copy_name') }}
704- </button >
705- </div >
706-
707- <span
693+ <CopyToClipboardButton
708694 v-if =" resolvedVersion"
709- class =" inline-flex items-baseline gap-1.5 font-mono text-base sm:text-lg text-fg-muted shrink-0 relative group"
695+ :copied =" copiedVersion"
696+ :copy-text =" $t('package.copy_version')"
697+ class =" inline-flex items-baseline gap-1.5 font-mono text-base sm:text-lg text-fg-muted shrink-0"
698+ @click =" copyVersion()"
710699 >
711700 <!-- Version resolution indicator (e.g., "latest → 4.2.0") -->
712701 <template v-if =" requestedVersion && resolvedVersion !== requestedVersion " >
@@ -749,26 +738,7 @@ const showSkeleton = shallowRef(false)
749738 class =" text-fg-subtle text-sm shrink-0"
750739 >{{ $t('package.not_latest') }}</span
751740 >
752-
753- <!-- Floating copy version button -->
754- <button
755- type =" button"
756- @click =" copyVersion()"
757- class =" absolute z-20 inset-is-0 top-full inline-flex items-center gap-1 px-2 py-1 rounded border text-xs font-mono whitespace-nowrap transition-all duration-150 opacity-0 -translate-y-1 pointer-events-none group-hover:opacity-100 group-hover:translate-y-0 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:translate-y-0 focus-visible:pointer-events-auto"
758- :class =" [
759- $style.copyButton,
760- copiedVersion ? 'text-accent bg-accent/10' : 'text-fg-muted bg-bg border-border',
761- ]"
762- :aria-label =" copiedVersion ? $t('common.copied') : $t('package.copy_version')"
763- >
764- <span
765- :class =" copiedVersion ? 'i-lucide:check' : 'i-lucide:copy'"
766- class =" w-3.5 h-3.5"
767- aria-hidden =" true"
768- />
769- {{ copiedVersion ? $t('common.copied') : $t('package.copy_version') }}
770- </button >
771- </span >
741+ </CopyToClipboardButton >
772742
773743 <!-- Docs + Code + Compare — inline on desktop, floating bottom bar on mobile -->
774744 <ButtonGroup
@@ -1541,39 +1511,6 @@ const showSkeleton = shallowRef(false)
15411511 grid-area : sidebar;
15421512}
15431513
1544- .copyButton {
1545- clip : rect (0 0 0 0 );
1546- clip-path : inset (50% );
1547- height : 1px ;
1548- overflow : hidden ;
1549- width : 1px ;
1550- transition :
1551- opacity 0.25s 0.1s ,
1552- translate 0.15s 0.1s ,
1553- clip 0.01s 0.34s allow-discrete,
1554- clip-path 0.01s 0.34s allow-discrete,
1555- height 0.01s 0.34s allow-discrete,
1556- width 0.01s 0.34s allow-discrete;
1557- }
1558-
1559- :global(.group ):hover .copyButton ,
1560- .copyButton :focus-visible {
1561- clip : auto ;
1562- clip-path : none ;
1563- height : auto ;
1564- overflow : visible ;
1565- width : auto ;
1566- transition :
1567- opacity 0.15s ,
1568- translate 0.15s ;
1569- }
1570-
1571- @media (hover : none) {
1572- .copyButton {
1573- display : none ;
1574- }
1575- }
1576-
15771514/* Mobile floating nav: safe-area positioning + kbd hiding */
15781515@media (max-width : 639.9px ) {
15791516 .packageNav {
0 commit comments