@@ -16,6 +16,11 @@ const props = defineProps<{
1616 searchQuery? : string
1717}>()
1818
19+ const { isPackageSelected, togglePackageSelection, canSelectMore } = usePackageSelection ()
20+ const isSelected = computed <boolean >(() => {
21+ return isPackageSelected (props .result .package .name )
22+ })
23+
1924const emit = defineEmits <{
2025 clickKeyword: [keyword : string ]
2126}>()
@@ -39,16 +44,16 @@ const numberFormatter = useNumberFormatter()
3944 </script >
4045
4146<template >
42- <BaseCard :isExactMatch =" isExactMatch" >
43- <div class =" mb-2 flex items-baseline justify-start gap-2" >
47+ <BaseCard :selected = " isSelected " : isExactMatch =" isExactMatch" >
48+ <header class =" mb-4 flex items-baseline justify-between gap-2" >
4449 <component
4550 :is =" headingLevel ?? 'h3'"
4651 class =" font-mono text-sm sm:text-base font-medium text-fg group-hover:text-fg transition-colors duration-200 min-w-0 break-all"
4752 >
4853 <NuxtLink
4954 :to =" packageRoute(result.package.name)"
5055 :prefetch-on =" prefetch ? 'visibility' : 'interaction'"
51- class =" decoration-none scroll-mt-48 scroll-mb-6 after:content-[''] after:absolute after:inset-0"
56+ class =" decoration-none after:content-[''] after:absolute after:inset-0"
5257 :data-result-index =" index"
5358 dir =" ltr"
5459 >{{ result.package.name }}</NuxtLink
@@ -59,28 +64,17 @@ const numberFormatter = useNumberFormatter()
5964 >{{ $t('search.exact_match') }}</span
6065 >
6166 </component >
62- <span aria-hidden =" true" class =" flex-shrink-1 flex-grow-1" />
63- <!-- Mobile: version next to package name -->
64- <div class =" sm:hidden text-fg-subtle flex items-center gap-1.5 shrink-0" >
65- <span
66- v-if =" result.package.version"
67- class =" font-mono text-xs truncate max-w-20"
68- :title =" result.package.version"
69- >
70- v{{ result.package.version }}
71- </span >
72- <ProvenanceBadge
73- v-if =" result.package.publisher?.trustedPublisher"
74- :provider =" result.package.publisher.trustedPublisher.id"
75- :package-name =" result.package.name"
76- :version =" result.package.version"
77- :linked =" false"
78- compact
79- />
80- </div >
81- </div >
82- <div class =" flex justify-start items-start gap-4 sm:gap-8" >
83- <div class =" min-w-0" >
67+
68+ <PackageSelectionCheckbox
69+ :package-name =" result.package.name"
70+ :disabled =" !canSelectMore && !isSelected"
71+ :checked =" isSelected"
72+ @change =" togglePackageSelection"
73+ />
74+ </header >
75+
76+ <div class =" flex flex-col sm:flex-row sm:justify-start sm:items-start gap-6 sm:gap-8" >
77+ <div class =" min-w-0 w-full" >
8478 <p v-if =" pkgDescription" class =" text-fg-muted text-xs sm:text-sm line-clamp-2 mb-2 sm:mb-3" >
8579 <span v-html =" pkgDescription" />
8680 </p >
@@ -124,10 +118,9 @@ const numberFormatter = useNumberFormatter()
124118 </div >
125119 </dl >
126120 </div >
127- <span aria-hidden =" true" class =" flex-shrink-1 flex-grow-1" />
128- <!-- Desktop: version and downloads on right side -->
129- <div class =" hidden sm:flex flex-col gap-2 shrink-0" >
130- <div class =" text-fg-subtle flex items-start gap-2 justify-end" >
121+
122+ <div class =" flex flex-col gap-2 shrink-0" >
123+ <div class =" text-fg-subtle flex items-start gap-2 sm:justify-end" >
131124 <span
132125 v-if =" result.package.version"
133126 class =" font-mono text-xs truncate max-w-32"
@@ -150,7 +143,7 @@ const numberFormatter = useNumberFormatter()
150143 </div >
151144 <div
152145 v-if =" result.downloads?.weekly"
153- class =" text-fg-subtle gap-2 flex items-center justify-end"
146+ class =" text-fg-subtle gap-2 flex items-center sm: justify-end"
154147 >
155148 <span class =" i-lucide:chart-line w-3.5 h-3.5" aria-hidden =" true" />
156149 <span class =" font-mono text-xs" >
0 commit comments