Feature pillars
Three side-by-side value propositions with no borders or cards — the lightest way to say what a product stands for. Collapses to a single column below the md breakpoint.
Privacy-first
Your data is held in trust, not mined. Collect only what a feature needs, never sell it, and analytics never identifies you — opt out in one click.
Open-source
The code that holds your data is public. Read it, audit it, run it. No black boxes between you and your files.
Built to last
Quality over feature count. Small tools that keep working — no hype-cycle rewrites, no forced upgrades, no lock-in.
interface Pillar {
title: string;
body: string;
}
const DEFAULT_PILLARS: Pillar[] = [
{
title: 'Privacy-first',
body: 'Your data is held in trust, not mined. Collect only what a feature needs, never sell it, and analytics never identifies you — opt out in one click.',
},
{
title: 'Open-source',
body: 'The code that holds your data is public. Read it, audit it, run it. No black boxes between you and your files.',
},
{
title: 'Built to last',
body: 'Quality over feature count. Small tools that keep working — no hype-cycle rewrites, no forced upgrades, no lock-in.',
},
];
export function FeaturePillars({ pillars = DEFAULT_PILLARS }: { pillars?: Pillar[] }) {
return (
<section className="border-b border-border/60">
<div className="mx-auto max-w-6xl px-4 py-20 sm:px-6">
<div className="grid gap-8 md:grid-cols-3">
{pillars.map((pillar) => (
<div key={pillar.title} className="space-y-2">
<h3 className="text-base font-semibold">{pillar.title}</h3>
<p className="text-sm leading-relaxed text-muted-foreground">{pillar.body}</p>
</div>
))}
</div>
</div>
</section>
);
}
Dependencies
None. This block is self-contained — plain React and Tailwind utility classes. Paste the file and it renders.
Colours come from CSS variables (--background, --primary, --border) using the shadcn/ui token names, so the block adopts your palette rather than importing ours.