11---
22import { getCollection } from ' astro:content'
33import { Picture } from ' astro:assets'
4+ import Icon from ' @components/Icon/index.astro'
45import PageLayout from ' @layouts/PageLayout.astro'
56
67const allCaseStudies = await getCollection (' caseStudies' )
@@ -32,10 +33,13 @@ const path = '/case-studies'
3233 {
3334 sortedCaseStudies .map (caseStudy => {
3435 return (
35- <article class = " bg-content-inverse rounded-2xl shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 overflow-hidden group" >
36- <a href = { ` /case-studies/${caseStudy .id } ` } class = " block h-full" >
36+ <article class = " group h-full relative after:pointer-events-none after:absolute after:content-[''] after:inset-0 after:rounded-none after:border-2 after:border-transparent after:opacity-0 after:transition-opacity after:duration-150 after:ease-out focus-within:after:opacity-100 focus-within:after:-inset-1.5 focus-within:after:border-spotlight" >
37+ <a
38+ href = { ` /case-studies/${caseStudy .id } ` }
39+ class = " flex h-full flex-col bg-content-inverse rounded-xl shadow-lg transition-all duration-300 overflow-hidden border border-trim transform hover:-translate-y-2 no-underline hover:no-underline focus-visible:no-underline focus-visible:outline-none focus-visible:shadow-none"
40+ >
3741 { caseStudy .data .cover && (
38- <div class = " relative aspect-video overflow-hidden" >
42+ <div class = " relative aspect-video overflow-hidden shrink-0 " >
3943 <Picture
4044 src = { caseStudy .data .cover }
4145 alt = { caseStudy .data .coverAlt }
@@ -51,33 +55,46 @@ const path = '/case-studies'
5155 </div >
5256 )}
5357
54- <div class = " p-6 space-y-4" >
55- <h2 class = " text-xl font-semibold leading-tight group-hover:text-primary transition-colors duration-300" >
56- { caseStudy .data .title }
57- </h2 >
58+ <div class = " flex flex-1 min-h-0 flex-col justify-between p-6" >
59+ <div >
60+ <h3 class = " text-xl font-semibold mb-3 group-hover:text-primary transition-colors" >
61+ { caseStudy .data .title }
62+ </h3 >
5863
59- { caseStudy .data .description && (
60- <p class = " text-sm leading-relaxed line-clamp-3" >
61- { caseStudy .data .description }
62- </p >
63- )}
64+ { caseStudy .data .description && (
65+ <p class = " text-content-offset leading-relaxed text-sm" >
66+ { caseStudy .data .description }
67+ </p >
68+ )}
69+ </div >
6470
65- <div class = " space-y-3" >
71+ <div class = " space-y-3 mt-4 " >
6672 { caseStudy .data .client && (
67- <span class = " inline-block text-sm font-medium text-primary bg-blue-100 px-3 py-1 rounded-full" >
73+ <span class = " inline-block text-sm font-medium text-primary bg-content-inverse-active px-3 py-1 rounded-full" >
6874 Client: { caseStudy .data .client }
6975 </span >
7076 )}
7177
72- <time
73- datetime = { caseStudy .data .publishDate .toISOString ()}
74- class = " block text-sm"
75- >
76- { caseStudy .data .publishDate .toLocaleDateString (' en-US' , {
77- year: ' numeric' ,
78- month: ' long' ,
79- })}
80- </time >
78+ <div class = " flex justify-between px-3" >
79+ <time
80+ datetime = { caseStudy .data .publishDate .toISOString ()}
81+ class = " block text-sm"
82+ >
83+ { caseStudy .data .publishDate .toLocaleDateString (' en-US' , {
84+ year: ' numeric' ,
85+ month: ' long' ,
86+ })}
87+ </time >
88+
89+ <div class = " flex items-center text-primary text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity" >
90+ <span >Learn more</span >
91+ <Icon
92+ icon = " exit-right-thin"
93+ size = { 4 }
94+ classes = " ml-0.5 mb-0.5 transform group-hover:translate-x-1 transition-transform"
95+ />
96+ </div >
97+ </div >
8198 </div >
8299 </div >
83100 </a >
0 commit comments