2025-07-11 16:54:37 +05:30
import { motion } from "framer-motion" ;
import { ArrowRight , Calendar , Clock } from "lucide-react" ;
import { Button } from "./ui/button" ;
import { ImageWithFallback } from "./figma/ImageWithFallback" ;
2025-09-23 20:13:31 +05:30
import { useNavigate } from "react-router-dom" ;
2025-07-11 16:54:37 +05:30
const resources = [
{
title : "UX review presentations" ,
2025-07-21 15:57:34 +05:30
excerpt :
"How do you create compelling presentations that wow clients, and actually close projects and deals? Here are the key insights that will elevate your game." ,
2025-07-11 16:54:37 +05:30
readTime : "8 min read" ,
date : "Dec 15, 2024" ,
2025-07-21 15:57:34 +05:30
image :
"https://images.unsplash.com/photo-1560472355-536de3962603?w=800&h=400&fit=crop&auto=format" ,
2025-07-11 16:54:37 +05:30
author : {
name : "Olivia Rhye" ,
2025-07-21 15:57:34 +05:30
avatar :
"https://images.unsplash.com/photo-1494790108755-2616b612b47c?w=150&h=150&fit=crop&crop=face&auto=format" ,
2025-07-11 16:54:37 +05:30
} ,
category : "Design" ,
2025-07-21 15:57:34 +05:30
slug : "ux-review-presentations" ,
2025-07-11 16:54:37 +05:30
} ,
{
title : "Migrating to Linear 101" ,
2025-07-21 15:57:34 +05:30
excerpt :
"Linear helps streamline software projects, sprints, tasks, and bug tracking. Here's how to get started and make the most of it." ,
readTime : "6 min read" ,
2025-07-11 16:54:37 +05:30
date : "Dec 10, 2024" ,
2025-07-21 15:57:34 +05:30
image :
"https://images.unsplash.com/photo-1551434678-e076c223a692?w=800&h=400&fit=crop&auto=format" ,
2025-07-11 16:54:37 +05:30
author : {
name : "Phoenix Baker" ,
2025-07-21 15:57:34 +05:30
avatar :
"https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=150&h=150&fit=crop&crop=face&auto=format" ,
2025-07-11 16:54:37 +05:30
} ,
category : "Software Engineering" ,
2025-07-21 15:57:34 +05:30
slug : "migrating-to-linear-101" ,
2025-07-11 16:54:37 +05:30
} ,
{
title : "Building your API Stack" ,
2025-07-21 15:57:34 +05:30
excerpt :
"The rise of RESTful APIs has been met by a rise in tools for creating, testing, and managing them. Here are the best practices for API development." ,
2025-07-11 16:54:37 +05:30
readTime : "12 min read" ,
date : "Dec 5, 2024" ,
2025-07-21 15:57:34 +05:30
image :
"https://images.unsplash.com/photo-1555949963-ff9fe0c870eb?w=800&h=400&fit=crop&auto=format" ,
2025-07-11 16:54:37 +05:30
author : {
name : "Lana Steiner" ,
2025-07-21 15:57:34 +05:30
avatar :
"https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=150&h=150&fit=crop&crop=face&auto=format" ,
2025-07-11 16:54:37 +05:30
} ,
category : "Software Engineering" ,
2025-07-21 15:57:34 +05:30
slug : "building-your-api-stack" ,
} ,
2025-07-11 16:54:37 +05:30
] ;
2025-07-21 15:57:34 +05:30
const ResourceCard = ( {
resource ,
index ,
} : {
resource : ( typeof resources ) [ 0 ] ;
index : number ;
} ) = > {
2025-09-23 20:13:31 +05:30
const navigate = useNavigate ( ) ;
2025-07-11 16:54:37 +05:30
return (
< motion.article
initial = { { opacity : 0 , y : 50 } }
whileInView = { { opacity : 1 , y : 0 } }
transition = { { duration : 0.6 , delay : index * 0.2 } }
viewport = { { once : true } }
className = "group bg-card rounded-lg border border-border overflow-hidden hover:border-border/80 transition-all duration-300 hover:shadow-lg cursor-pointer"
2025-09-23 20:13:31 +05:30
onClick = { ( ) = > navigate ( ` /insights/ ${ resource . slug } ` ) }
2025-07-11 16:54:37 +05:30
>
{ /* Image */ }
< div className = "aspect-[16/9] overflow-hidden relative" >
< ImageWithFallback
src = { resource . image }
alt = { resource . title }
className = "w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
/ >
{ /* Capsule Tag */ }
< div className = "absolute top-4 left-4" >
< span className = "px-3 py-1.5 bg-background/90 backdrop-blur-sm text-foreground text-xs font-medium rounded-full border border-border/50" >
{ resource . category }
< / span >
< / div >
< / div >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* Content */ }
< div className = "p-6 space-y-4" >
{ /* Date and Read Time */ }
< div className = "flex items-center gap-4 text-sm text-muted-foreground" >
< div className = "flex items-center gap-1" >
< Calendar className = "w-3 h-3" / >
{ resource . date }
< / div >
< div className = "flex items-center gap-1" >
< Clock className = "w-3 h-3" / >
{ resource . readTime }
< / div >
< / div >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* Title */ }
< h3 className = "text-foreground font-medium leading-tight group-hover:text-accent transition-colors" >
{ resource . title }
< / h3 >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* Excerpt */ }
< p className = "text-muted-foreground text-sm leading-relaxed" >
{ resource . excerpt }
< / p >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* Author */ }
2025-07-21 15:57:34 +05:30
< div className = "flex items-center justify-end gap-3 pt-2 border-t border-border" >
{ / * < I m a g e W i t h F a l l b a c k
2025-07-11 16:54:37 +05:30
src = { resource . author . avatar }
alt = { resource . author . name }
className = "w-10 h-10 rounded-full object-cover"
/ >
< div className = "flex-1" >
< div className = "font-medium text-foreground text-sm" >
{ resource . author . name }
< / div >
2025-07-21 15:57:34 +05:30
< / div > * / }
2025-07-11 16:54:37 +05:30
< Button
variant = "ghost"
size = "sm"
className = "text-accent hover:text-accent-foreground hover:bg-accent/10 p-2 h-auto group-hover:translate-x-1 transition-transform"
onClick = { ( e ) = > {
e . stopPropagation ( ) ;
2025-09-23 20:13:31 +05:30
navigate ( ` /insights/ ${ resource . slug } ` ) ;
2025-07-11 16:54:37 +05:30
} }
>
< ArrowRight className = "w-4 h-4" / >
< / Button >
< / div >
< / div >
< / motion.article >
) ;
} ;
export const ResourceCards = ( ) = > {
2025-09-23 20:13:31 +05:30
const navigate = useNavigate ( ) ;
2025-07-11 16:54:37 +05:30
return (
< section className = "relative py-20 overflow-hidden" >
< div className = "container mx-auto px-6 lg:px-8" >
{ /* Header */ }
< motion.div
initial = { { opacity : 0 , y : 30 } }
whileInView = { { opacity : 1 , y : 0 } }
transition = { { duration : 0.8 } }
viewport = { { once : true } }
className = "text-center mb-16"
>
< h2 className = "text-3xl lg:text-4xl font-semibold text-foreground mb-4" >
Insights for Founders & Product Leaders
< / h2 >
< p className = "text-muted-foreground text-lg max-w-2xl mx-auto" >
2026-03-19 19:37:16 +05:30
{ / * L e a r n f r o m o u r e x p e r i e n c e b u i l d i n g 2 0 0 + d i g i t a l p r o d u c t s . P r a c t i c a l
insights , real case studies , and actionable strategies . * / }
Learn from our experience building 200 + digital products , including AI mobile apps . Practical insights , real case studies , and actionable strategies .
2025-07-11 16:54:37 +05:30
< / p >
< / motion.div >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* Resource Cards Grid */ }
< div className = "grid lg:grid-cols-3 gap-8 mb-12 max-w-7xl mx-auto" >
{ resources . map ( ( resource , index ) = > (
2025-07-21 15:57:34 +05:30
< ResourceCard
key = { resource . title }
resource = { resource }
index = { index }
/ >
2025-07-11 16:54:37 +05:30
) ) }
< / div >
2025-07-21 15:57:34 +05:30
2025-07-11 16:54:37 +05:30
{ /* CTA */ }
< motion.div
initial = { { opacity : 0 , y : 20 } }
whileInView = { { opacity : 1 , y : 0 } }
transition = { { duration : 0.6 , delay : 0.8 } }
viewport = { { once : true } }
className = "text-center"
>
2025-07-21 15:57:34 +05:30
< Button
className = "bg-accent hover:bg-accent/90 text-accent-foreground border-0 rounded-lg px-6 py-3"
2025-09-23 20:13:31 +05:30
onClick = { ( ) = > navigate ( "/resources" ) }
2025-07-21 15:57:34 +05:30
>
2025-07-11 16:54:37 +05:30
View All Resources < ArrowRight className = "w-4 h-4 ml-2" / >
< / Button >
< / motion.div >
< / div >
< / section >
) ;
2025-07-21 15:57:34 +05:30
} ;