1import { SocialLink } from "../SocialLink"; 2import { personalInfo, socialLinks } from "../../data/portfolio"; 3import { useSystemTheme } from "../../hooks/useSystemTheme"; 4import { BlueskyProfile } from "atproto-ui"; 5import { type AtProtoStyles } from "atproto-ui"; 6 7interface ConnectProps { 8 sectionRef: (el: HTMLElement | null) => void; 9} 10 11export function Connect({ sectionRef }: ConnectProps) { 12 const isLightMode = useSystemTheme(); 13 14 return ( 15 <section 16 id="connect" 17 ref={sectionRef} 18 className="py-20 sm:py-32 opacity-0" 19 style={ 20 isLightMode 21 ? { 22 backgroundColor: "#e2e2e2", 23 color: "oklch(0.2 0.02 255)", 24 } 25 : {} 26 } 27 > 28 <div className="max-w-4xl mx-auto px-6 sm:px-8 lg:px-16"> 29 <div className="grid lg:grid-cols-2 gap-12 sm:gap-16"> 30 <div className="space-y-6 sm:space-y-8"> 31 <h2 className="text-3xl sm:text-4xl font-light"> 32 Let's Connect 33 </h2> 34 35 <div className="space-y-6"> 36 <p 37 className="text-lg sm:text-xl leading-relaxed" 38 style={ 39 isLightMode 40 ? { 41 color: "oklch(0.48 0.015 255)", 42 } 43 : {} 44 } 45 > 46 Always interested in new opportunities, 47 collaborations, and conversations about technology 48 and design. 49 </p> 50 51 <div className="space-y-4"> 52 <a 53 href={`mailto:${personalInfo.contact.email}`} 54 className="group flex items-center gap-3 transition-colors duration-300" 55 style={ 56 isLightMode 57 ? { 58 color: "oklch(0.2 0.02 255)", 59 } 60 : {} 61 } 62 onMouseEnter={(e) => { 63 if (isLightMode) { 64 e.currentTarget.style.color = 65 "oklch(0.48 0.015 255)"; 66 } 67 }} 68 onMouseLeave={(e) => { 69 if (isLightMode) { 70 e.currentTarget.style.color = 71 "oklch(0.2 0.02 255)"; 72 } 73 }} 74 > 75 <span className="text-base sm:text-lg"> 76 {personalInfo.contact.email} 77 </span> 78 <svg 79 className="w-5 h-5 transform group-hover:translate-x-1 transition-transform duration-300" 80 fill="none" 81 stroke="currentColor" 82 viewBox="0 0 24 24" 83 > 84 <path 85 strokeLinecap="round" 86 strokeLinejoin="round" 87 strokeWidth={2} 88 d="M17 8l4 4m0 0l-4 4m4-4H3" 89 /> 90 </svg> 91 </a> 92 </div> 93 </div> 94 </div> 95 96 <div className="space-y-6 sm:space-y-8"> 97 <div 98 className="text-sm font-mono" 99 style={ 100 isLightMode 101 ? { 102 color: "oklch(0.48 0.015 255)", 103 } 104 : {} 105 } 106 > 107 ELSEWHERE 108 </div> 109 110 <div className="grid grid-cols-1 lg:grid-cols-2 gap-4"> 111 {socialLinks.map((social) => ( 112 <SocialLink key={social.name} {...social} /> 113 ))} 114 </div> 115 </div> 116 </div> 117 <div style={{ 118 '--atproto-color-bg': isLightMode ? '#f2f2f2' : '#1f1f1f', 119 } as AtProtoStyles } 120 className="pt-8 grid lg:grid-cols-2 gap-12 sm:gap-4" 121 > 122 <BlueskyProfile did="nekomimi.pet" /> 123 <BlueskyProfile did="art.nekomimi.pet" /> 124 <p className="text-sm sm:text-base"> 125 ^ This is <a className="text-cyan-600" href="https://tangled.org/@nekomimi.pet/atproto-ui" target="_blank" rel="noopener noreferrer">atproto-ui</a> btw. :) 126 </p> 127 </div> 128 </div> 129 </section> 130 ); 131}