* esm * wip * wip * wip * wip * wip * wip * subscription notice * wip * wip * wip * fix envs * fix: update docker build * fix * esm/types * delete dashboard :D * add patches to dockerfiles * update packages + catalogs + ts * wip * remove native libs * ts * improvements * fix redirects and fetching session * try fix favicon * fixes * fix * order and resize reportds within a dashboard * improvements * wip * added userjot to dashboard * fix * add op * wip * different cache key * improve date picker * fix table * event details loading * redo onboarding completely * fix login * fix * fix * extend session, billing and improve bars * fix * reduce price on 10M
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { motion } from 'framer-motion';
|
|
import type { LucideIcon } from 'lucide-react';
|
|
|
|
function SellingPointIcon({ icon: Icon }: { icon: LucideIcon }) {
|
|
return (
|
|
<div className="size-22 center-center rounded-xl bg-gradient-to-br from-green-500 to-emerald-600">
|
|
<Icon className="h-8 w-8 text-white" />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function SellingPoint({
|
|
title,
|
|
description,
|
|
bgImage,
|
|
}: {
|
|
title: string;
|
|
description: React.ReactNode;
|
|
bgImage: string;
|
|
}) {
|
|
return (
|
|
<div className="flex flex-col justify-center h-full p-8 select-none relative">
|
|
<img
|
|
src={bgImage}
|
|
className="absolute inset-0 w-full h-full object-cover"
|
|
/>
|
|
<div className="relative z-10 center-center col">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
>
|
|
<h2 className="text-6xl font-bold text-white drop-shadow-2xl drop-shadow-highlight mb-2">
|
|
{title}
|
|
</h2>
|
|
</motion.div>
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
>
|
|
<p className="text-lg text-white/70 leading-relaxed">{description}</p>
|
|
</motion.div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export { SellingPoint, SellingPointIcon };
|