Section
Pricing Table — Vercel
Dark monochrome three-tier SaaS pricing table with hairline borders, generous spacing, white/white-50/white-35 text hierarchy, a single teal accent on the popular badge, check/dash feature lists, and a working monthly/annual billing toggle that swaps the displayed prices live. White primary CTA and subtle hover fills give it a refined, product-grade feel.
- Section
- Tailwind
- HTML
- MIT
Preview
Live section
9:41 100%
devsnips.dev/library/tailwind/sections/saas/pricing-table/vercel/ fluid · no fixed width 100%
Install
Add to your project
npx devsnips add Tailwind/Sections/SaaS/pricing-table/vercel Tailwind/Sections/SaaS/pricing-table/vercel <!--
Snippet Name: Pricing Table — Vercel
Description: Dark monochrome three-tier SaaS pricing table with hairline borders, a single teal accent, a working monthly/annual billing toggle, and check/dash feature lists.
Author: DevSnips Contributors
Usage Example: Drop into a dark product/marketing page. Toggle the billing switch to swap displayed prices live.
-->
<section class="relative w-full" data-pricing="vc">
<!-- Billing toggle -->
<div class="mb-12 flex flex-col items-center gap-3">
<div role="radiogroup" aria-label="Billing period" class="inline-flex items-center rounded-full border border-white/10 bg-white/[0.03] p-1">
<button type="button" data-billing="monthly" aria-pressed="true" role="radio"
class="billing-btn rounded-full px-4 py-1.5 vc-mono text-[12px] font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/30">
Monthly
</button>
<button type="button" data-billing="annual" aria-pressed="false" role="radio"
class="billing-btn rounded-full px-4 py-1.5 vc-mono text-[12px] font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/30">
Annual
<span class="vc-mono ml-1 rounded-md border border-white/10 bg-white/[0.06] px-1 py-0.5 text-[10px] text-white/60">-20%</span>
</button>
</div>
<p class="vc-mono text-[11px] text-white/40">save two months with annual billing</p>
</div>
<!-- Tiers grid -->
<div class="grid grid-cols-1 gap-px overflow-hidden rounded-[14px] border border-white/10 bg-white/[0.07] md:grid-cols-3">
<!-- Starter -->
<article class="relative flex flex-col bg-[#0a0a0a] p-6 transition-colors hover:bg-[#0c0c0c]">
<header>
<p class="vc-mono text-[11px] uppercase tracking-wider text-white/40">Starter</p>
<h2 class="font-g mt-2 text-[20px] font-semibold tracking-tight text-white">Solo dev</h2>
<p class="font-g mt-2 text-[14px] leading-relaxed text-white/50">Ship side-projects with the core toolkit.</p>
</header>
<div class="mt-6 flex items-end gap-1.5 border-b border-white/[0.07] pb-6">
<span class="font-g text-[44px] font-semibold leading-none tracking-tighter text-white" data-price="starter">$0</span>
<span class="vc-mono mb-1 text-[12px] text-white/40" data-period="starter">/mo</span>
</div>
<ul class="mt-6 flex-1 space-y-3.5" role="list">
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">1 project</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">Community snippets</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/30" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 12h14" /></svg>
<span class="font-g text-[14px] text-white/35">AI pair programmer</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/30" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 12h14" /></svg>
<span class="font-g text-[14px] text-white/35">Team workspace</span>
</li>
</ul>
<a href="#" class="font-g mt-6 block rounded-lg border border-white/15 px-4 py-2.5 text-center text-[13px] font-medium text-white transition-colors hover:border-white/25 hover:bg-white/[0.06] focus:outline-none focus-visible:ring-2 focus-visible:ring-white/30">
Start free
</a>
</article>
<!-- Pro (popular) -->
<article class="relative flex flex-col bg-[#0d0d0d] p-6" aria-describedby="pro-badge-vc">
<div class="pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/40 to-transparent" aria-hidden="true"></div>
<span id="pro-badge-vc" class="vc-mono absolute right-5 top-5 inline-flex items-center gap-1.5 rounded-full border border-white/10 bg-white/[0.05] px-2.5 py-1 text-[10px] text-white/70">
<span class="vc-dot"></span> Popular
</span>
<header>
<p class="vc-mono text-[11px] uppercase tracking-wider text-white/40">Pro</p>
<h2 class="font-g mt-2 text-[20px] font-semibold tracking-tight text-white">Indie maker</h2>
<p class="font-g mt-2 text-[14px] leading-relaxed text-white/50">Everything you need to launch & iterate fast.</p>
</header>
<div class="mt-6 flex items-end gap-1.5 border-b border-white/[0.07] pb-6">
<span class="font-g text-[44px] font-semibold leading-none tracking-tighter text-white" data-price="pro">$19</span>
<span class="vc-mono mb-1 text-[12px] text-white/40" data-period="pro">/mo</span>
</div>
<ul class="mt-6 flex-1 space-y-3.5" role="list">
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">Unlimited projects</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">All premium snippets</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">AI pair programmer</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/30" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 12h14" /></svg>
<span class="font-g text-[14px] text-white/35">Team workspace</span>
</li>
</ul>
<a href="#" class="font-g mt-6 block rounded-lg bg-white px-4 py-2.5 text-center text-[13px] font-medium text-black transition-colors hover:bg-white/90 focus:outline-none focus-visible:ring-2 focus-visible:ring-white/40">
Get Pro
</a>
</article>
<!-- Team -->
<article class="relative flex flex-col bg-[#0a0a0a] p-6 transition-colors hover:bg-[#0c0c0c]">
<header>
<p class="vc-mono text-[11px] uppercase tracking-wider text-white/40">Team</p>
<h2 class="font-g mt-2 text-[20px] font-semibold tracking-tight text-white">Scale up</h2>
<p class="font-g mt-2 text-[14px] leading-relaxed text-white/50">Collaborate across the whole crew.</p>
</header>
<div class="mt-6 flex items-end gap-1.5 border-b border-white/[0.07] pb-6">
<span class="font-g text-[44px] font-semibold leading-none tracking-tighter text-white" data-price="team">$49</span>
<span class="vc-mono mb-1 text-[12px] text-white/40" data-period="team">/mo</span>
</div>
<ul class="mt-6 flex-1 space-y-3.5" role="list">
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">Everything in Pro</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">Team workspace (10 seats)</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">SSO & audit logs</span>
</li>
<li class="flex items-start gap-3">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-white/70" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M5 12l5 5L20 6" /></svg>
<span class="font-g text-[14px] text-white/80">Priority support</span>
</li>
</ul>
<a href="#" class="font-g mt-6 block rounded-lg border border-white/15 px-4 py-2.5 text-center text-[13px] font-medium text-white transition-colors hover:border-white/25 hover:bg-white/[0.06] focus:outline-none focus-visible:ring-2 focus-visible:ring-white/30">
Start team trial
</a>
</article>
</div>
<p class="vc-mono mt-6 text-center text-[11px] text-white/35">
prices in USD · cancel anytime · no card required for free tier
</p>
<script>
(function () {
var root = document.currentScript.closest('[data-pricing]');
if (!root) return;
var PRICES = {
starter: { monthly: '$0', annual: '$0', periodM: '/mo', periodA: '/yr' },
pro: { monthly: '$19', annual: '$182', periodM: '/mo', periodA: '/yr' },
team: { monthly: '$49', annual: '$470', periodM: '/mo', periodA: '/yr' }
};
var buttons = root.querySelectorAll('.billing-btn');
function render(mode) {
Object.keys(PRICES).forEach(function (tier) {
var p = root.querySelector('[data-price="' + tier + '"]');
var per = root.querySelector('[data-period="' + tier + '"]');
if (p) p.textContent = PRICES[tier][mode];
if (per) per.textContent = mode === 'annual' ? PRICES[tier].periodA : PRICES[tier].periodM;
});
buttons.forEach(function (b) {
var active = b.getAttribute('data-billing') === mode;
b.setAttribute('aria-pressed', String(active));
b.classList.toggle('bg-white', active);
b.classList.toggle('text-black', active);
b.classList.toggle('text-white/60', !active);
});
}
buttons.forEach(function (b) {
b.addEventListener('click', function () {
render(b.getAttribute('data-billing'));
});
});
render('monthly');
})();
</script>
</section> 185 lines UTF-8 · LF · Spaces: 2
Continue browsing