All Taste components
Features
Features — list beside a big visual
A short ruled list of features on the left and a large product picture that bleeds off the right edge.
heading · 4 ruled items with icons · 5 : 7 split · chart window bleeding to the edge
Reports
Know where every rupee is, without a spreadsheet
- Monthly incomePaid, pending and late — side by side, month by month.
- Best and slowest clientsSee who pays on day one and who needs a nudge.
- Tax set asideA running total of what to keep back for the tax bill.
- One-click exportsCSV and PDF packs, ready for your accountant.
import { Download, ShieldCheck, TrendingUp, Users, type LucideIcon } from "lucide-react";
import { cn } from "@/lib/utils";
const points: { icon: LucideIcon; title: string; text: string }[] = [
{ icon: TrendingUp, title: "Monthly income", text: "Paid, pending and late — side by side, month by month." },
{ icon: Users, title: "Best and slowest clients", text: "See who pays on day one and who needs a nudge." },
{ icon: ShieldCheck, title: "Tax set aside", text: "A running total of what to keep back for the tax bill." },
{ icon: Download, title: "One-click exports", text: "CSV and PDF packs, ready for your accountant." },
];
const months = [42, 55, 48, 62, 58, 70, 66, 74, 82, 78, 88, 94];
const highlight = 10;
export function FeaturesListVisual() {
return (
<section aria-labelledby="features-title" className="overflow-hidden bg-bg font-sans">
<div className="mx-auto grid max-w-6xl items-center gap-8 px-4 py-16 sm:px-6 lg:grid-cols-[5fr_7fr] lg:gap-14 lg:py-24">
<div>
<p className="text-[13px] font-medium text-primary">Reports</p>
<h2 id="features-title" className="mt-3.5 text-balance text-3xl font-semibold tracking-tight text-fg sm:text-4xl">
Know where every rupee is, without a spreadsheet
</h2>
<ul className="mt-7">
{points.map(({ icon: Icon, title, text }) => (
<li key={title} className="grid grid-cols-[20px_1fr] gap-x-3.5 gap-y-1 border-t border-border py-4">
<Icon className="row-span-2 mt-0.5 size-5 text-primary" aria-hidden />
<h3 className="text-[15px] font-semibold tracking-tight text-fg">{title}</h3>
<p className="text-sm leading-relaxed text-fg-muted">{text}</p>
</li>
))}
</ul>
</div>
{/* Picture bleeds off the right edge of the page */}
<div aria-hidden className="-mr-4 rounded-l-xl bg-surface bg-gradient-to-br from-primary-soft to-surface py-5 pl-5 sm:-mr-6 lg:-mr-12 lg:py-8 lg:pl-8">
<div className="overflow-hidden rounded-l-xl border border-r-0 border-border bg-bg shadow-2xl">
<div className="flex h-9 items-center gap-1.5 border-b border-border bg-surface px-3.5">
<span className="size-2.5 rounded-full bg-border-strong" /><span className="size-2.5 rounded-full bg-border-strong" /><span className="size-2.5 rounded-full bg-border-strong" />
</div>
<div className="grid gap-3.5 p-[18px] text-xs">
<div className="flex items-center justify-between">
<p className="text-sm font-semibold text-fg">Income, 2026</p>
<span className="inline-flex items-center gap-1 rounded-full bg-success-soft px-2 py-0.5 font-medium text-success-fg"><TrendingUp className="size-3" />+18% vs 2025</span>
</div>
<div className="grid h-[150px] grid-cols-12 items-end gap-2 border-b border-border bg-[linear-gradient(var(--tst-border)_1px,transparent_1px)] bg-[length:100%_25%] pb-1.5">
{months.map((h, i) => (
<span key={i} style={{ height: h + "%" }} className={cn("rounded-t-[3px]", i === highlight ? "bg-primary" : "bg-primary/30")} />
))}
</div>
<div className="flex gap-4 text-fg-muted">
<span className="inline-flex items-center gap-1.5"><span className="size-2 rounded-[2px] bg-primary" />November</span>
<span className="inline-flex items-center gap-1.5"><span className="size-2 rounded-[2px] bg-primary/30" />Other months</span>
</div>
</div>
</div>
</div>
</div>
</section>
);
}
The code uses the Taste Tailwind preset. Make yours on the Taste page with Export my system.