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