11import Image from 'next/image' ;
22
33export const ThreePlatforms = ( ) => {
4+ const buildUtmUrl = ( base : string , content : string ) => {
5+ const url = new URL ( base ) ;
6+ url . searchParams . set ( 'utm_source' , 'playgrounds.network' ) ;
7+ url . searchParams . set ( 'utm_medium' , 'referral' ) ;
8+ url . searchParams . set ( 'utm_campaign' , 'homepage' ) ;
9+ url . searchParams . set ( 'utm_content' , content ) ;
10+ return url . toString ( ) ;
11+ } ;
12+
413 const platforms = [
514 {
615 name : 'Rig' ,
716 logo : '/assets/projects/rig-logo.webp' ,
817 bgImage : '/assets/projects/rig-bg.webp' ,
18+ href : buildUtmUrl ( 'https://rig.rs/' , 'three_platforms_rig' ) ,
919 description :
1020 'Open-source Rust LLM framework providing high-performance, modular APIs for building scalable AI applications with type safety and lightning-fast execution.' ,
1121 } ,
1222 {
1323 name : 'Arc' ,
1424 logo : '/assets/projects/arc-logo.webp' ,
1525 bgImage : '/assets/projects/arc-bg.webp' ,
26+ href : buildUtmUrl ( 'https://arc.fun/' , 'three_platforms_arc' ) ,
1627 description :
1728 'AI Rig Complex - A thriving community ecosystem fostering partnerships, side projects, and collaborative innovation built around the Rig framework.' ,
1829 } ,
1930 {
2031 name : 'Ryzome' ,
2132 logo : '/assets/projects/ryzome-logo.webp' ,
2233 bgImage : '/assets/projects/ryzome-bg.webp' ,
34+ href : buildUtmUrl ( 'https://ryzome.ai/' , 'three_platforms_ryzome' ) ,
2335 description :
2436 'AI-powered workspace platform that transforms how teams collaborate, create, and innovate. The user-facing canvas that brings AI capabilities to everyday workflows.' ,
2537 } ,
@@ -41,30 +53,46 @@ export const ThreePlatforms = () => {
4153 Pick and choose what you want to create.
4254 </ span >
4355 < div className = "max-w-[1216px] flex-col gap-y-6 md:flex-row pt-12 md:pt-16 flex gap-x-4" >
44- { platforms . map ( ( platform , index ) => (
45- < div key = { index } className = "flex flex-col gap-y-6" >
46- < div className = "relative w-full h-[296px] border border-[#333333] rounded-lg overflow-hidden group" >
47- < Image
48- src = { platform . bgImage }
49- alt = ""
50- fill
51- className = "object-cover transition-opacity duration-[1000ms] opacity-0 group-hover:opacity-100"
52- />
53- < div className = "absolute inset-0 bg-black/20" />
54- < div className = "relative z-10 flex items-center justify-center w-full h-full" >
56+ { platforms . map ( ( platform , index ) => {
57+ const Card = (
58+ < div className = "flex flex-col gap-y-6" >
59+ < div className = "relative w-full h-[296px] border border-[#333333] rounded-lg overflow-hidden group" >
5560 < Image
56- src = { platform . logo }
57- alt = { platform . name }
58- width = { 250 }
59- height = { 250 }
60- className = "transition-transform duration-500 group-hover:scale-105"
61+ src = { platform . bgImage }
62+ alt = ""
63+ fill
64+ className = "object-cover transition-opacity duration-[1000ms] opacity-0 group-hover:opacity-100"
6165 />
66+ < div className = "absolute inset-0 bg-black/20" />
67+ < div className = "relative z-10 flex items-center justify-center w-full h-full" >
68+ < Image
69+ src = { platform . logo }
70+ alt = { platform . name }
71+ width = { 250 }
72+ height = { 250 }
73+ className = "transition-transform duration-500 group-hover:scale-105"
74+ />
75+ </ div >
6276 </ div >
77+ < span className = "text-[18px]" > { platform . name } </ span >
78+ < span className = "text-[#808080]" > { platform . description } </ span >
6379 </ div >
64- < span className = "text-[18px]" > { platform . name } </ span >
65- < span className = "text-[#808080]" > { platform . description } </ span >
66- </ div >
67- ) ) }
80+ ) ;
81+
82+ return platform . href ? (
83+ < a
84+ key = { index }
85+ href = { platform . href }
86+ target = "_blank"
87+ rel = "noopener noreferrer"
88+ className = "group"
89+ >
90+ { Card }
91+ </ a >
92+ ) : (
93+ < div key = { index } > { Card } </ div >
94+ ) ;
95+ } ) }
6896 </ div >
6997 </ div >
7098 ) ;
0 commit comments