Files
stats/apps/public/src/app/punch-lines.tsx
Carl-Gerhard Lindesvärd 32e91959f6 chore(root): migrate to biome
2024-09-18 23:46:11 +02:00

167 lines
4.2 KiB
TypeScript

import { cn } from '@/utils/cn';
import type { LucideIcon, LucideProps } from 'lucide-react';
import {
ClockIcon,
CloudIcon,
CookieIcon,
DollarSignIcon,
HandshakeIcon,
KeyIcon,
ShieldIcon,
WebhookIcon,
} from 'lucide-react';
import Image from 'next/image';
import { Heading2, Heading4 } from './copy';
const items = [
{
title: 'Own Your Own Data',
description: (
<p>
We believe that you should own your own data. That&apos;s why we
don&apos;t sell your data to third parties.{' '}
<strong>Ever. Period.</strong>
</p>
),
icon: KeyIcon,
color: '#2563EB',
className: 'bg-blue-light',
},
{
title: 'GDPR Compliant',
description: (
<p>
All our serveres are hosted in EU (Stockholm) and we are fully GDPR
compliant.
</p>
),
icon: ShieldIcon,
color: '#b051d3',
className: 'bg-[#b051d3]',
},
{
title: 'Cloud or Self-Hosting',
description: (
<p>
Choose between the flexibility of cloud-based hosting or the autonomy of
self-hosting to tailor your analytics infrastructure to your needs.
</p>
),
icon: CloudIcon,
color: '#ff7557',
className: '', // 'bg-[#ff7557]',
},
{
title: 'Real-Time Events',
description: (
<p>
Stay up-to-date with real-time event tracking, enabling instant insights
into user actions as they happen.
</p>
),
icon: ClockIcon,
color: '#7fe1d8',
className: '', // bg-[#7fe1d8]
},
{
title: 'No cookies!',
description: (
<p>
Our trackers are cookie-free, skip that annyoing cookie consent banner!
</p>
),
icon: CookieIcon,
color: '#f8bc3c',
className: 'bg-blue-dark', //'bg-[#f8bc3c]',
},
{
title: 'Cost-Effective',
description: (
<p>
We have combined the best from Mixpanel and Plausible. Cut the costs and
keep the features.
</p>
),
icon: DollarSignIcon,
color: '#0f7ea0',
className: 'bg-[#3ba974]',
},
{
title: 'Predictable pricing',
description: (
<p>You only pay for events, everything else is included. No surprises.</p>
),
icon: HandshakeIcon,
color: '#0f7ea0',
className: 'bg-[#3ba974]',
},
{
title: 'First Class React Native Support',
description: (
<p>
Our SDK is built with React Native in mind, making it easy to integrate
with your mobile apps.
</p>
),
icon: (({ className }: LucideProps) => {
return (
<Image
src="/react-native.svg"
alt="React Native"
className={cn(className, 'p-3')}
width={50}
height={50}
/>
);
}) as unknown as LucideIcon,
color: '#3ba974',
className: 'bg-[#e19900]',
},
{
title: 'Powerful Export API',
description: <p>Use our powerful export API to access your data.</p>,
icon: WebhookIcon,
color: '#3ba974',
className: 'bg-[#e93838]',
},
];
export function PunchLines() {
return (
<div className="bg-blue-darker relative py-32">
<div className="absolute inset-0 h-full w-full bg-[radial-gradient(circle,rgba(255,255,255,0.2)_0%,rgba(255,255,255,0)_100%)]" />
<div className="relative">
<Heading2 className="mb-16 text-center text-white">
Not convinced?
</Heading2>
<div className="container">
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
{items.map((item) => {
const Icon = item.icon;
return (
<div
className="rounded-xl border border-border bg-white p-6"
key={item.title}
>
<div
className={cn(
'mb-4 flex h-14 w-14 items-center justify-center rounded-full',
item.color,
)}
style={{ background: item.color }}
>
<Icon color="#fff" />
</div>
<Heading4>{item.title}</Heading4>
<div className="prose">{item.description}</div>
</div>
);
})}
</div>
</div>
</div>
</div>
);
}