This commit is contained in:
@@ -118,51 +118,7 @@ export default function Clients() {
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<Section>
|
||||
<div className="flex flex-col gap-12">
|
||||
<SectionHeader
|
||||
align="split"
|
||||
eyebrow={t.testimonials.eyebrow}
|
||||
title={t.testimonials.title}
|
||||
description={t.testimonials.description}
|
||||
/>
|
||||
<div className="grid grid-cols-1 gap-6 md:grid-cols-3">
|
||||
{t.testimonials.items.map((testimonial) => (
|
||||
<Card
|
||||
key={testimonial.initials}
|
||||
className="flex flex-col justify-between gap-6"
|
||||
>
|
||||
<div className="space-y-4">
|
||||
<div
|
||||
className="text-primary flex"
|
||||
aria-label={t.testimonials.rating}
|
||||
>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<Icon key={i} name="star" filled />
|
||||
))}
|
||||
</div>
|
||||
<blockquote className="text-on-surface text-base italic">
|
||||
“{testimonial.quote}”
|
||||
</blockquote>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="bg-surface-container text-primary flex h-10 w-10 items-center justify-center rounded-full font-mono font-bold">
|
||||
{testimonial.initials}
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-on-surface text-sm font-bold">
|
||||
{testimonial.role}
|
||||
</div>
|
||||
<span className="text-on-surface-variant text-sm">
|
||||
{testimonial.organization}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</Section>
|
||||
<Testimonials t={t} />
|
||||
|
||||
<Section tone="muted">
|
||||
<Card
|
||||
@@ -358,6 +314,11 @@ function SectorPortfolio({ t }: { t: Content }) {
|
||||
<span className="text-on-surface font-semibold">
|
||||
{project.title}
|
||||
</span>
|
||||
{project.scope && (
|
||||
<span className="text-on-surface-variant text-sm">
|
||||
{project.scope}
|
||||
</span>
|
||||
)}
|
||||
<span className="text-on-surface-variant flex items-center gap-1.5 text-sm">
|
||||
<Icon
|
||||
name="apartment"
|
||||
@@ -495,6 +456,61 @@ function FeaturedPrograms({ t }: { t: Content }) {
|
||||
);
|
||||
}
|
||||
|
||||
/** Hidden until real client testimonials are added to the content file. */
|
||||
function Testimonials({ t }: { t: Content }) {
|
||||
if (t.testimonials.items.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Section>
|
||||
<div className="flex flex-col gap-12">
|
||||
<SectionHeader
|
||||
align="split"
|
||||
eyebrow={t.testimonials.eyebrow}
|
||||
title={t.testimonials.title}
|
||||
description={t.testimonials.description}
|
||||
/>
|
||||
<div className="grid grid-cols-1 gap-6 md:grid-cols-3">
|
||||
{t.testimonials.items.map((testimonial) => (
|
||||
<Card
|
||||
key={testimonial.initials}
|
||||
className="flex flex-col justify-between gap-6"
|
||||
>
|
||||
<div className="space-y-4">
|
||||
<div
|
||||
className="text-primary flex"
|
||||
aria-label={t.testimonials.rating}
|
||||
>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<Icon key={i} name="star" filled />
|
||||
))}
|
||||
</div>
|
||||
<blockquote className="text-on-surface text-base italic">
|
||||
“{testimonial.quote}”
|
||||
</blockquote>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="bg-surface-container text-primary flex h-10 w-10 items-center justify-center rounded-full font-mono font-bold">
|
||||
{testimonial.initials}
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-on-surface text-sm font-bold">
|
||||
{testimonial.role}
|
||||
</div>
|
||||
<span className="text-on-surface-variant text-sm">
|
||||
{testimonial.organization}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
|
||||
function RetentionGauge({ t }: { t: Content }) {
|
||||
return (
|
||||
<div className="bg-surface-container flex w-full flex-col items-center justify-center rounded-xl p-6 lg:w-96">
|
||||
|
||||
Reference in New Issue
Block a user