Skip to content

Commit c042618

Browse files
committed
Updates package card layout. Adds weekly downloads indicator
1 parent 2df63c6 commit c042618

1 file changed

Lines changed: 68 additions & 55 deletions

File tree

app/components/PackageCard.vue

Lines changed: 68 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -20,69 +20,82 @@ const emit = defineEmits<{
2020

2121
<template>
2222
<article
23-
class="group card-interactive scroll-mt-48 scroll-mb-6"
23+
class="group card-interactive scroll-mt-48 scroll-mb-6 relative focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-bg focus-within:ring-offset-2 focus-within:ring-fg/50"
2424
:class="{ 'bg-bg-muted border-border-hover': selected }"
2525
>
26-
<NuxtLink
27-
:to="{ name: 'package', params: { package: result.package.name.split('/') } }"
28-
:prefetch-on="prefetch ? 'visibility' : 'interaction'"
29-
class="block focus:outline-none decoration-none scroll-mt-48 scroll-mb-6"
30-
:data-result-index="index"
31-
@focus="index != null && emit('focus', index)"
32-
@mouseenter="index != null && emit('focus', index)"
33-
>
34-
<header class="flex items-start justify-between gap-4 mb-2">
35-
<component
36-
:is="headingLevel ?? 'h3'"
37-
class="font-mono text-base font-medium text-fg group-hover:text-fg transition-colors duration-200 min-w-0 break-all"
38-
>
39-
{{ result.package.name }}
40-
</component>
41-
<div class="flex items-center gap-1.5 shrink-0 max-w-32">
42-
<span
43-
v-if="result.package.version"
44-
class="font-mono text-xs text-fg-subtle truncate"
45-
:title="result.package.version"
26+
<div class="flex justify-between items-end gap-8">
27+
<div>
28+
<div class="flex items-center gap-2 mb-2">
29+
<component
30+
:is="headingLevel ?? 'h3'"
31+
class="font-mono text-base font-medium text-fg group-hover:text-fg transition-colors duration-200 min-w-0 break-all"
4632
>
33+
<NuxtLink
34+
:to="{ name: 'package', params: { package: result.package.name.split('/') } }"
35+
:prefetch-on="prefetch ? 'visibility' : 'interaction'"
36+
class="focus:outline-none decoration-none scroll-mt-48 scroll-mb-6 after:content-[''] after:absolute after:inset-0"
37+
:data-result-index="index"
38+
@focus="index != null && emit('focus', index)"
39+
@mouseenter="index != null && emit('focus', index)"
40+
>
41+
{{ result.package.name }}
42+
</NuxtLink>
43+
</component>
44+
</div>
45+
<p v-if="result.package.description" class="text-fg-muted text-sm line-clamp-2 mb-3">
46+
<MarkdownText :text="result.package.description" />
47+
</p>
48+
<div class="flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-fg-subtle">
49+
<dl v-if="showPublisher || result.package.date" class="flex items-center gap-4 m-0">
50+
<div
51+
v-if="showPublisher && result.package.publisher?.username"
52+
class="flex items-center gap-1.5"
53+
>
54+
<dt class="sr-only">Publisher</dt>
55+
<dd class="font-mono">@{{ result.package.publisher.username }}</dd>
56+
</div>
57+
<div v-if="result.package.date" class="flex items-center gap-1.5">
58+
<dt class="sr-only">Updated</dt>
59+
<dd>
60+
<NuxtTime
61+
:datetime="result.package.date"
62+
year="numeric"
63+
month="short"
64+
day="numeric"
65+
/>
66+
</dd>
67+
</div>
68+
</dl>
69+
</div>
70+
</div>
71+
<div class="flex flex-col gap-2 shrink-0">
72+
<div class="text-fg-subtle flex items-start gap-2 justify-end">
73+
<span v-if="result.package.version" class="font-mono text-xs truncate">
4774
v{{ result.package.version }}
4875
</span>
49-
<ProvenanceBadge
50-
v-if="result.package.publisher?.trustedPublisher"
51-
:provider="result.package.publisher.trustedPublisher.id"
52-
:package-name="result.package.name"
53-
:version="result.package.version"
54-
compact
55-
/>
56-
</div>
57-
</header>
58-
59-
<p v-if="result.package.description" class="text-fg-muted text-sm line-clamp-2 mb-3">
60-
<MarkdownText :text="result.package.description" />
61-
</p>
62-
63-
<footer class="flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-fg-subtle">
64-
<dl v-if="showPublisher || result.package.date" class="flex items-center gap-4 m-0">
6576
<div
66-
v-if="showPublisher && result.package.publisher?.username"
67-
class="flex items-center gap-1.5"
77+
v-if="result.package.publisher?.trustedPublisher"
78+
class="flex items-center gap-1.5 shrink-0 max-w-32"
6879
>
69-
<dt class="sr-only">Publisher</dt>
70-
<dd class="font-mono">@{{ result.package.publisher.username }}</dd>
80+
<ProvenanceBadge
81+
:provider="result.package.publisher.trustedPublisher.id"
82+
:package-name="result.package.name"
83+
:version="result.package.version"
84+
compact
85+
/>
7186
</div>
72-
<div v-if="result.package.date" class="flex items-center gap-1.5">
73-
<dt class="sr-only">Updated</dt>
74-
<dd>
75-
<NuxtTime
76-
:datetime="result.package.date"
77-
year="numeric"
78-
month="short"
79-
day="numeric"
80-
/>
81-
</dd>
82-
</div>
83-
</dl>
84-
</footer>
85-
</NuxtLink>
87+
</div>
88+
<div
89+
v-if="result.downloads?.weekly"
90+
class="text-fg-subtle gap-2 flex items-center justify-end"
91+
>
92+
<span class="i-carbon-chart-line w-3.5 h-3.5 inline-block" aria-hidden="true" />
93+
<span class="font-mono text-xs">
94+
{{ formatNumber(result.downloads.weekly) }} / week
95+
</span>
96+
</div>
97+
</div>
98+
</div>
8699

87100
<ul
88101
v-if="result.package.keywords?.length"

0 commit comments

Comments
 (0)