| import React from "react"; |
| import BlogInfo from "/info/Blog/EditorPickBlog.json"; |
| import { BlogInfoType } from './types'; |
| import dateFormatter from "./utils"; |
| import apacheWelcomesDevLake from '/static/img/Blog/apache-welcomes-devLake.png'; |
| import compatibilityOfApacheDevLakeWithPostgreSQL from '/static/img/Blog/compatibility-of-apache-devLake-with-postgreSQL.png'; |
| import HowDevLakeIsUpAndRunning from '/static/img/Blog/How DevLake is up and running.png'; |
| |
| const coverImgArr = [HowDevLakeIsUpAndRunning, apacheWelcomesDevLake, compatibilityOfApacheDevLakeWithPostgreSQL]; |
| const Card = function (props: {cardInfo: BlogInfoType, index: number}) { |
| const { cardInfo, index } = props; |
| return ( |
| <a |
| href={cardInfo.detailLink} |
| className="flex flex-col sm:flex-row mobile:flex-col |
| w-[22.33vw] sm:max-w-[100%] sm:min-w-[100%] |
| p-[16px] bg-neutral-invert |
| rounded-[16px] shadow-lower hover:shadow-high hover:no-underline " |
| > |
| <img |
| src={coverImgArr[index]} |
| className=" |
| w-[100%] sm:w-[43.05vw] sm:min-w-[43.05vw] mobile:w-[100%] |
| h-[12.76vw] sm:h-[24.21vw] mobile:h-[45.88vw] |
| bg-primary-300 rounded-[16px]" |
| /> |
| <div className="sm:ml-5 mobile:ml-[0]"> |
| <div className="flex h-[90px] sm:h-[60px] items-center mt-3 sm:mt-[0] mb-3"> |
| <p |
| className=" |
| text-primary-800 text-heading2 sm:text-heading4 font-semibold |
| line-clamp-3 m-[0] |
| " |
| > |
| {cardInfo.title} |
| </p> |
| </div> |
| <div className=" |
| text-neutral-300 text-label14Lake |
| "> |
| {`${dateFormatter(cardInfo.publishTime)} · ${cardInfo.readTime}`} |
| </div> |
| <div className="mt-3 h-[50px] flex items-center"> |
| <img src={cardInfo.authorImgUrl} className="w-[50px] h-[50px] mr-3 rounded-full bg-primary-500 shrink-0 uppercase flex justify-center items-center overflow-hidden text-white" |
| /> |
| <span className="text-primary-800 text-heading4 font-semibold"> |
| {cardInfo.authorName} |
| </span> |
| </div> |
| </div> |
| </a> |
| ); |
| }; |
| |
| export function EditorPick() { |
| return ( |
| <div> |
| <h2 |
| className=" |
| text-primary-800 text-heading1 sm:text-heading3 font-semibold |
| mt-[60px] sm:mt-[32px] mobile:mt-[20px] |
| " |
| > |
| Editor‘s Picks |
| </h2> |
| <div className=" |
| flex sm:flex-col justify-between |
| mt-[64px] sm:mt-[32px] mobile:mt-[24px] |
| sm:gap-5 mobile:gap-4 |
| "> |
| {BlogInfo.data.map((card: BlogInfoType, index:number) => ( |
| <Card cardInfo ={card} key={card.title} index={index}/> |
| ))} |
| </div> |
| </div> |
| ); |
| } |