|
import React from 'react'; |
|
|
|
const tailwindColors = { |
|
red: '#dc2626', |
|
yellow: '#d97706', |
|
green: '#16a34a', |
|
blue: '#2563eb', |
|
indigo: '#4f46e5', |
|
purple: '#7c3aed', |
|
pink: '#db2777', |
|
gray: '#4b5563', |
|
}; |
|
|
|
const Card = ({ |
|
space_id, |
|
author, |
|
title, |
|
description, |
|
emoji, |
|
lastModified, |
|
colorFrom, |
|
colorTo, |
|
likes, |
|
sdk, |
|
runtimeStage, |
|
currentHardware, |
|
}) => { |
|
const gradientStyle = { |
|
background: `linear-gradient(to bottom right, ${tailwindColors[colorFrom]}, ${tailwindColors[colorTo]})`, |
|
}; |
|
|
|
const spaceUrl = `https://huggingface.co/spaces/${space_id}`; |
|
|
|
let runtimeStageIcon = null; |
|
if (runtimeStage === 'STOPPED') { |
|
runtimeStageIcon = <svg className="mr-0.5" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1.1em" height="1.1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"> |
|
<rect x="11" y="9" width="2" height="14" fill="currentColor" /> |
|
<rect x="19" y="9" width="2" height="14" fill="currentColor" /> |
|
</svg>; |
|
} else if (runtimeStage.includes('ERROR')) { |
|
runtimeStageIcon = <svg className="mr-0.5" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1.1em" height="1.1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M24 9.4L22.6 8L16 14.6L9.4 8L8 9.4l6.6 6.6L8 22.6L9.4 24l6.6-6.6l6.6 6.6l1.4-1.4l-6.6-6.6L24 9.4z" fill="currentColor"></path></svg>; |
|
} |
|
|
|
return ( |
|
<div className="flex flex-col"> |
|
{/* <a href={spaceUrl} target="_blank" rel="noopener noreferrer"> |
|
<div className="text-sm truncate px-2 py-1 w-full font-bold text-clip"> |
|
{emoji} {title} |
|
</div> |
|
</a> */} |
|
|
|
<a href={spaceUrl} target="_blank" rel="noopener noreferrer"> |
|
<div |
|
// className={`relative z-0 mx-auto flex flex-col items-center justify-center p-4 filter hover:brightness-110 overflow-hidden h-52 rounded-lg`} |
|
// to resize to 100% on hover we can use the following: |
|
className={`relative z-0 mx-auto flex flex-col items-center justify-center p-4 filter hover:brightness-110 overflow-hidden h-52 rounded-lg transition-all duration-50 ease-in-out hover:scale-[1.008]`} |
|
style={gradientStyle} |
|
> |
|
<div className="flex justify-between items-center w-full"> |
|
<div className="right-16 flex flex-wrap content-start gap-1.5 overflow-hidden top-3 left-3 text-xs"> |
|
<div className={`inline-flex select-none items-center overflow-hidden font-mono rounded bg-white/10 px-1 py-0 leading-tight text-white opacity-80`}> |
|
{runtimeStageIcon} |
|
<strong>{runtimeStage}</strong> |
|
{runtimeStage === "RUNNING" && ( |
|
<> |
|
<span className="mx-1">on</span> |
|
<strong>{currentHardware}</strong> |
|
</> |
|
)} |
|
</div> |
|
<div className="inline-flex select-none items-center overflow-hidden font-mono rounded bg-white/10 px-1 py-0 leading-tight text-white opacity-80"> |
|
<span>{lastModified}</span> |
|
</div> |
|
</div> |
|
<div className="flex items-center"> |
|
<svg className="mr-1.5 text-white" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32" fill="currentColor"> |
|
<path d="M22.45,6a5.47,5.47,0,0,1,3.91,1.64,5.7,5.7,0,0,1,0,8L16,26.13,5.64,15.64a5.7,5.7,0,0,1,0-8,5.48,5.48,0,0,1,7.82,0L16,10.24l2.53-2.58A5.44,5.44,0,0,1,22.45,6m0-2a7.47,7.47,0,0,0-5.34,2.24L16,7.36,14.89,6.24a7.49,7.49,0,0,0-10.68,0,7.72,7.72,0,0,0,0,10.82L16,29,27.79,17.06a7.72,7.72,0,0,0,0-10.82A7.49,7.49,0,0,0,22.45,4Z"></path> |
|
</svg> |
|
<span className="text-white text-sm">{likes}</span> |
|
</div> |
|
</div> |
|
<div className="flex items-center h-full flex-col gap-2 p-4 w-full"> |
|
<div className="text-white text-center text-xl truncate px-2 py-1 w-full font-bold text-clip overflow-hidden"> |
|
{emoji} {title} |
|
</div> |
|
<p className="text-white text-base text-center font-medium text-ellipsis overflow-hidden"> |
|
{description} |
|
</p> |
|
</div> |
|
</div> |
|
</a> |
|
</div> |
|
); |
|
}; |
|
|
|
export default Card; |
|
|