11---
22import { type CollectionEntry , getEntries , getEntry } from " astro:content" ;
3- import { IoLanguageSharp } from " react-icons/io5" ;
3+ import { IoLanguageSharp , IoSparklesSharp } from " react-icons/io5" ;
44import SpeakerForCard from " ./SpeakerForCard.astro" ;
55import { lunalink } from " @bearstudio/lunalink" ;
66import { ROUTES } from " @/routes.gen" ;
77import { LuSquarePlay } from " react-icons/lu" ;
8+ import { FiXCircle } from " react-icons/fi" ;
9+ import { cn } from " @/lib/utils-client" ;
810
911interface Props {
1012 activity: NonNullable <
@@ -27,6 +29,9 @@ const speakers = (
2729 },
2830}));
2931const people = [... hosts , ... speakers ];
32+ const scheduleItem = (event .data .schedule ?.items ?? []).find (
33+ (conference ) => conference .slug ?.id === talk ?.id ,
34+ );
3035---
3136
3237{
@@ -36,13 +41,45 @@ const people = [...hosts, ...speakers];
3641 id: event .id ,
3742 talkId: talk .id ,
3843 })}
39- class = " group flex w-full flex-col gap-4 rounded-lg bg-white/5 p-4 backdrop-blur-md transition hover:bg-white/10 sm:px-6 sm:py-5"
44+ class = { cn (
45+ " group flex w-full flex-col gap-4 rounded-lg bg-white/5 p-4 backdrop-blur-md transition hover:bg-white/10 sm:px-6 sm:py-5" ,
46+ scheduleItem ?.status === " cancelled" && " opacity-60" ,
47+ )}
4048 >
41- <p class = " text-balance font-heading text-base font-medium leading-tight tracking-wider text-white transition group-hover:text-primary" >
42- { talk .data .title }
43- </p >
49+ <div class = " flex justify-between" >
50+ <p
51+ class = { cn (
52+ " text-balance font-heading text-base font-medium leading-tight tracking-wider text-white transition group-hover:text-primary" ,
53+ scheduleItem ?.status === " cancelled" ? " line-through" : " " ,
54+ )}
55+ >
56+ { talk .data .title }
57+ </p >
58+ { scheduleItem ?.status === " cancelled" && (
59+ <div class = " h-full w-fit rounded-full bg-white/10 px-2 py-1 text-white" >
60+ <div class = " flex items-center gap-1" >
61+ <FiXCircle className = " h-3 w-3" />
62+ <span class = " text-xs font-medium" >Cancelled</span >
63+ </div >
64+ </div >
65+ )}
66+ { scheduleItem ?.status === " replacement" && (
67+ <div class = " isolate h-full w-fit justify-center rounded-full bg-white from-accent px-2 py-1 text-background" >
68+ <div class = " flex items-center gap-1" >
69+ <IoSparklesSharp className = " h-3 w-3" />
70+ <span class = " text-xs font-medium" >New</span >
71+ </div >
72+ </div >
73+ )}
74+ </div >
75+
4476 { !! people .length && (
45- <div class = " grid grid-cols-2 gap-3 md:grid-cols-3" >
77+ <div
78+ class = { cn (
79+ " grid grid-cols-2 gap-3 md:grid-cols-3" ,
80+ scheduleItem ?.status === " cancelled" ? " grayscale" : " " ,
81+ )}
82+ >
4683 { speakers .map ((speaker ) => (
4784 <SpeakerForCard
4885 name = { speaker .data .name }
@@ -53,8 +90,13 @@ const people = [...hosts, ...speakers];
5390 </div >
5491 )}
5592
56- <div class = " flex flex-row gap-2" >
57- <span class = " flex w-fit items-center gap-1.5 rounded-full border border-black/60 bg-black/40 px-2 py-0.5 text-2xs font-bold uppercase leading-none opacity-60 transition group-hover:opacity-100" >
93+ <div
94+ class = { cn (
95+ " flex flex-row gap-2" ,
96+ scheduleItem ?.status === " cancelled" ? " grayscale" : " " ,
97+ )}
98+ >
99+ <span class = " flex w-fit items-center gap-1.5 rounded-full border border-black/60 bg-black/40 px-2 py-0.5 text-2xs font-bold uppercase leading-none opacity-60 grayscale transition group-hover:opacity-100" >
58100 <IoLanguageSharp className = " text-base" />
59101 <span >Talk in { talk .data .language } </span >
60102 </span >
0 commit comments