Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/components/AppCard.tsx
1006 views
1
import Image from "next/legacy/image"
2
import { FormattedMessage } from "react-intl"
3
4
export type AppCardProps = {
5
name: React.ReactNode
6
icon: string
7
url: URL
8
paid: boolean
9
category: string
10
categoryLabel: string
11
}
12
13
/**
14
* Renders a card with app data.
15
* Layout (width, height, positioning) can be set from the parent.
16
*/
17
export const AppCard = ({ name, icon, url, paid, category, categoryLabel, open }) => {
18
return (
19
<a
20
key={`${url} ${name}`}
21
href={url}
22
target="_blank"
23
rel="noopener noreferrer"
24
className="flex items-stretch justify-start gap-4 rounded border border-gray-3 bg-white p-2 hover:bg-gray-4 md:p-4"
25
>
26
<div className="h-[3.5rem] w-[3.5rem] flex-shrink-0 overflow-hidden rounded-sm">
27
<Image src={icon} alt={`Logo for ${name}`} />
28
</div>
29
<div className="flex flex-auto flex-col">
30
<span className="b4 block text-gray-1">
31
{categoryLabel},{" "}
32
{paid ? (
33
<FormattedMessage id="apps.paid" defaultMessage="Paid" />
34
) : (
35
<FormattedMessage id="apps.free" defaultMessage="Free" />
36
)}
37
{open ? <>, <FormattedMessage id="apps.open" defaultMessage="Open" /></> : null}
38
</span>
39
<h3 className="b1 !font-700 flex flex-auto items-center !leading-[1] rtl:text-right">
40
<span dir="ltr">{name}</span>
41
</h3>
42
</div>
43
</a>
44
)
45
}
46
47