| 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; | |