@@ -14,8 +14,14 @@ const props = defineProps<{
1414 filters? : StructuredFilters
1515 /** Search query for highlighting exact matches */
1616 searchQuery? : string
17+ /** Shows checkbox to all cards and the click will work as selection */
18+ forceSelection? : boolean
1719}>()
1820
21+ const selected = defineModel <boolean >(' selected' , {
22+ default: false ,
23+ })
24+
1925const emit = defineEmits <{
2026 clickKeyword: [keyword : string ]
2127}>()
@@ -39,13 +45,23 @@ const numberFormatter = useNumberFormatter()
3945 </script >
4046
4147<template >
42- <BaseCard :isExactMatch =" isExactMatch" >
43- <div class =" mb-2 flex items-baseline justify-start gap-2" >
48+ <BaseCard :selected : isExactMatch =" isExactMatch" >
49+ <header class =" mb-4 flex items-baseline justify-between gap-2" >
4450 <component
4551 :is =" headingLevel ?? 'h3'"
4652 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"
4753 >
54+ <button
55+ v-if =" forceSelection"
56+ @click =" selected = !selected"
57+ class =" after:content-[''] after:absolute after:inset-0 cursor-pointer"
58+ :data-result-index =" index"
59+ dir =" ltr"
60+ >
61+ {{ result.package.name }}
62+ </button >
4863 <NuxtLink
64+ v-else
4965 :to =" packageRoute(result.package.name)"
5066 :prefetch-on =" prefetch ? 'visibility' : 'interaction'"
5167 class =" decoration-none scroll-mt-48 scroll-mb-6 after:content-[''] after:absolute after:inset-0"
@@ -59,28 +75,23 @@ const numberFormatter = useNumberFormatter()
5975 >{{ $t('search.exact_match') }}</span
6076 >
6177 </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- />
78+
79+ <div class =" flex items-center gap-4" >
80+ <div class =" relative z-1" >
81+ <input
82+ data-package-card-checkbox
83+ class =" md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors"
84+ :class =" { 'opacity-100!': forceSelection }"
85+ type =" checkbox"
86+ :checked =" !!selected"
87+ v-model =" selected"
88+ />
89+ </div >
8090 </div >
81- </div >
82- <div class =" flex justify-start items-start gap-4 sm:gap-8" >
83- <div class =" min-w-0" >
91+ </header >
92+
93+ <div class =" flex flex-col sm:flex-row sm:justify-start sm:items-start gap-6 sm:gap-8" >
94+ <div class =" min-w-0 w-full" >
8495 <p v-if =" pkgDescription" class =" text-fg-muted text-xs sm:text-sm line-clamp-2 mb-2 sm:mb-3" >
8596 <span v-html =" pkgDescription" />
8697 </p >
@@ -124,10 +135,9 @@ const numberFormatter = useNumberFormatter()
124135 </div >
125136 </dl >
126137 </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" >
138+
139+ <div class =" flex flex-col gap-2 shrink-0" >
140+ <div class =" text-fg-subtle flex items-start gap-2 sm:justify-end" >
131141 <span
132142 v-if =" result.package.version"
133143 class =" font-mono text-xs truncate max-w-32"
@@ -150,7 +160,7 @@ const numberFormatter = useNumberFormatter()
150160 </div >
151161 <div
152162 v-if =" result.downloads?.weekly"
153- class =" text-fg-subtle gap-2 flex items-center justify-end"
163+ class =" text-fg-subtle gap-2 flex items-center sm: justify-end"
154164 >
155165 <span class =" i-lucide:chart-line w-3.5 h-3.5" aria-hidden =" true" />
156166 <span class =" font-mono text-xs" >
0 commit comments