21 CSS Pricing Sections
A CSS pricing section is the band on a landing page where visitors decide whether to buy. These 21 hand-coded layouts are full-featured pricing pages you can drop into a project today — find-and-replace your brand colors and ship.
Built for builders. Priced for shipping.
Builder
- Unlimited projects
- 100 GB storage
- Priority support
- API + webhooks
@property animatable angle. Slate base, violet/cyan highlight on the recommended tier — the modern AI-product launch treatment.@property --ps-grb-ang {
syntax: '<angle>';
initial-value: 0deg;
inherits: false;
}
.ps-grb {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #0a0d1a;
color: #e6e7f0;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-grb-head { text-align: center; margin-bottom: clamp(24px, 4vw, 40px); }
.ps-grb-eye {
display: inline-block; font-size: 11px; font-weight: 700;
letter-spacing: 0.18em; text-transform: uppercase;
color: #a5b4fc; padding: 5px 12px;
background: rgba(165,180,252,0.1);
border: 1px solid rgba(165,180,252,0.25);
border-radius: 999px; margin-bottom: 14px;
}
.ps-grb-head h2 {
font-size: clamp(22px, 3.4vw, 34px); font-weight: 700;
letter-spacing: -0.02em; margin: 0; color: #fff;
}
.ps-grb-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px; max-width: 980px; margin: 0 auto;
}
.ps-grb-card {
position: relative;
border-radius: 16px;
padding: 1.5px;
background: rgba(255,255,255,0.04);
}
.ps-grb-edge {
position: absolute; inset: 0;
border-radius: 16px; padding: 1.5px;
background: conic-gradient(from var(--ps-grb-ang), #1e293b, #475569, #1e293b);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor; mask-composite: exclude;
animation: ps-grb-spin 6s linear infinite;
}
.ps-grb-pri .ps-grb-edge {
background: conic-gradient(from var(--ps-grb-ang), #6366f1, #22d3ee, #a855f7, #6366f1);
}
@keyframes ps-grb-spin { to { --ps-grb-ang: 360deg; } }
.ps-grb-body {
position: relative;
background: #0f1224;
border-radius: 14.5px;
padding: 22px 20px 20px;
display: flex; flex-direction: column;
height: 100%;
}
.ps-grb-pill {
display: inline-block; align-self: flex-start;
background: linear-gradient(135deg, #6366f1, #22d3ee); color: #0a0d1a;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 4px 10px;
border-radius: 999px; margin-bottom: 10px;
}
.ps-grb-card h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; margin: 0 0 12px; color: #c7d2fe;
}
.ps-grb-price {
display: flex; align-items: baseline; gap: 4px;
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 18px; color: #fff;
}
.ps-grb-price em { font-size: 0.5em; font-style: normal; padding-right: 2px; opacity: 0.7; }
.ps-grb-price span { font-size: 0.34em; font-weight: 500; opacity: 0.65; margin-left: 6px; }
.ps-grb-card ul {
list-style: none; padding: 0; margin: 0 0 22px; flex: 1;
font-size: 13.5px; line-height: 1.95; color: #b8bfd8;
}
.ps-grb-card ul li::before { content: '✓'; color: #a5b4fc; display: inline-block; width: 20px; font-weight: 700; }
.ps-grb-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 9px;
background: rgba(165,180,252,0.08); color: #c7d2fe;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(165,180,252,0.25);
transition: background 0.18s, color 0.18s;
}
.ps-grb-cta-pri { background: linear-gradient(135deg, #6366f1, #22d3ee); color: #0a0d1a; border-color: transparent; }
.ps-grb-cta:hover { background: rgba(165,180,252,0.18); color: #fff; }
.ps-grb-cta-pri:hover { filter: brightness(1.1); }
.ps-grb-cta:focus-visible { outline: 2px solid #a5b4fc; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-grb-grid { grid-template-columns: 1fr; max-width: 380px; }
}
@media (prefers-reduced-motion: reduce) {
.ps-grb-edge { animation: none; background: linear-gradient(135deg, #475569, #1e293b); }
.ps-grb-pri .ps-grb-edge { background: linear-gradient(135deg, #6366f1, #22d3ee); }
} <section class="ps-grb" aria-label="Pricing">
<header class="ps-grb-head">
<span class="ps-grb-eye">Plans</span>
<h2>Built for builders. Priced for shipping.</h2>
</header>
<div class="ps-grb-grid">
<article class="ps-grb-card">
<span class="ps-grb-edge" aria-hidden="true"></span>
<div class="ps-grb-body">
<h3>Starter</h3>
<div class="ps-grb-price"><em>$</em>14<span>/mo</span></div>
<ul>
<li>3 projects</li>
<li>10 GB storage</li>
<li>Community support</li>
</ul>
<a class="ps-grb-cta" href="#starter">Choose Starter</a>
</div>
</article>
<article class="ps-grb-card ps-grb-pri">
<span class="ps-grb-edge" aria-hidden="true"></span>
<div class="ps-grb-body">
<span class="ps-grb-pill">Recommended</span>
<h3>Builder</h3>
<div class="ps-grb-price"><em>$</em>32<span>/mo</span></div>
<ul>
<li>Unlimited projects</li>
<li>100 GB storage</li>
<li>Priority support</li>
<li>API + webhooks</li>
</ul>
<a class="ps-grb-cta ps-grb-cta-pri" href="#builder">Choose Builder</a>
</div>
</article>
<article class="ps-grb-card">
<span class="ps-grb-edge" aria-hidden="true"></span>
<div class="ps-grb-body">
<h3>Scale</h3>
<div class="ps-grb-price"><em>$</em>89<span>/mo</span></div>
<ul>
<li>Everything in Builder</li>
<li>SSO + audit logs</li>
<li>SLA + CSM</li>
</ul>
<a class="ps-grb-cta" href="#scale">Talk to sales</a>
</div>
</article>
</div>
</section> Two plans. Pick one, change later.
We don’t play games with feature gating, seat limits, or upsell pop-ups. Pick a plan, get the whole product, and move on with your work.
All plans include unlimited projects, every integration, and email support. Cancel any time, money back inside 30 days.
See the full feature list →Solo
$15/ monthFor freelancers and indie builders shipping client work.
- Single workspace
- 10 GB storage
- Email support
Studio Recommended
$48/ monthFor small teams who run multiple client engagements.
- Unlimited workspaces
- 250 GB storage
- Priority support & onboarding
- Client billing & white-label
.ps-edt {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #f5f1ea;
color: #1c1c1e;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-edt-grid {
max-width: 1040px; margin: 0 auto;
display: grid; grid-template-columns: 1.1fr 1fr; gap: 56px;
align-items: start;
}
.ps-edt-copy { padding-top: 6px; }
.ps-edt-eye {
display: block; font-family: 'JetBrains Mono', monospace;
font-size: 12px; letter-spacing: 0.1em; color: #6b6b6e;
margin-bottom: 14px;
}
.ps-edt-copy h2 {
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(28px, 4.4vw, 44px); font-weight: 700;
letter-spacing: -0.015em; line-height: 1.1;
margin: 0 0 18px;
}
.ps-edt-copy h2 em { font-style: italic; color: #6b6b6e; }
.ps-edt-copy p { font-size: 15px; line-height: 1.65; color: #3d3d40; margin: 0 0 12px; max-width: 380px; }
.ps-edt-fine { font-size: 13px !important; color: #6b6b6e !important; padding-top: 12px; border-top: 1px solid #d8d2c5; }
.ps-edt-link {
display: inline-block; margin-top: 12px;
font-size: 13px; font-weight: 600;
color: #1c1c1e; text-decoration: underline;
text-underline-offset: 4px; text-decoration-thickness: 1.5px;
}
.ps-edt-link:hover { color: #6b6b6e; }
.ps-edt-tiers { display: flex; flex-direction: column; gap: 14px; }
.ps-edt-row {
background: #fff; border: 1px solid #d8d2c5;
border-radius: 6px; padding: 22px 22px 18px;
transition: border-color 0.18s, box-shadow 0.18s;
}
.ps-edt-row:hover { border-color: #1c1c1e; box-shadow: 4px 4px 0 0 #1c1c1e; }
.ps-edt-rec { border-color: #1c1c1e; box-shadow: 4px 4px 0 0 #1c1c1e; }
.ps-edt-row header {
display: flex; align-items: baseline; justify-content: space-between;
gap: 12px; padding-bottom: 12px; margin-bottom: 12px;
border-bottom: 1px dashed #d8d2c5;
}
.ps-edt-row h3 {
font-family: 'Playfair Display', Georgia, serif;
font-size: 22px; font-weight: 700; margin: 0;
display: flex; align-items: center; gap: 10px;
}
.ps-edt-tag {
font-family: 'JetBrains Mono', monospace;
font-size: 9.5px; font-weight: 700; letter-spacing: 0.12em;
text-transform: uppercase;
background: #1c1c1e; color: #f5f1ea;
padding: 3px 8px; border-radius: 2px;
}
.ps-edt-pri { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; }
.ps-edt-pri em { font-size: 11px; font-style: normal; color: #6b6b6e; font-weight: 500; margin-left: 4px; letter-spacing: 0; }
.ps-edt-row p { font-size: 13.5px; color: #3d3d40; margin: 0 0 10px; line-height: 1.5; }
.ps-edt-row ul {
list-style: none; padding: 0; margin: 0 0 16px;
font-size: 13px; line-height: 1.85; color: #3d3d40;
}
.ps-edt-row ul li::before { content: '·'; color: #1c1c1e; font-weight: 800; display: inline-block; width: 18px; font-size: 18px; line-height: 0.5; vertical-align: middle; }
.ps-edt-cta {
display: inline-block; padding: 9px 16px; border-radius: 4px;
font-size: 13px; font-weight: 600; text-decoration: none;
border: 1.5px solid #1c1c1e; color: #1c1c1e;
background: transparent;
transition: background 0.18s, color 0.18s;
}
.ps-edt-cta-pri { background: #1c1c1e; color: #f5f1ea; }
.ps-edt-cta:hover { background: #1c1c1e; color: #f5f1ea; }
.ps-edt-cta-pri:hover { background: #f5f1ea; color: #1c1c1e; }
.ps-edt-cta:focus-visible { outline: 2px solid #1c1c1e; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-edt-grid { grid-template-columns: 1fr; gap: 32px; }
}
@media (prefers-reduced-motion: reduce) {
.ps-edt-row { transition: none; }
.ps-edt-row:hover { transform: none; }
} <section class="ps-edt" aria-label="Pricing">
<div class="ps-edt-grid">
<div class="ps-edt-copy">
<span class="ps-edt-eye">— Pricing</span>
<h2>Two plans. <em>Pick one,</em> change later.</h2>
<p>
We don’t play games with feature gating, seat limits, or upsell pop-ups. Pick a plan, get
the whole product, and move on with your work.
</p>
<p class="ps-edt-fine">
All plans include unlimited projects, every integration, and email support. Cancel any time,
money back inside 30 days.
</p>
<a class="ps-edt-link" href="#compare">See the full feature list →</a>
</div>
<div class="ps-edt-tiers">
<article class="ps-edt-row">
<header>
<h3>Solo</h3>
<span class="ps-edt-pri">$15<em>/ month</em></span>
</header>
<p>For freelancers and indie builders shipping client work.</p>
<ul>
<li>Single workspace</li>
<li>10 GB storage</li>
<li>Email support</li>
</ul>
<a class="ps-edt-cta" href="#solo">Choose Solo →</a>
</article>
<article class="ps-edt-row ps-edt-rec">
<header>
<h3>Studio <span class="ps-edt-tag">Recommended</span></h3>
<span class="ps-edt-pri">$48<em>/ month</em></span>
</header>
<p>For small teams who run multiple client engagements.</p>
<ul>
<li>Unlimited workspaces</li>
<li>250 GB storage</li>
<li>Priority support & onboarding</li>
<li>Client billing & white-label</li>
</ul>
<a class="ps-edt-cta ps-edt-cta-pri" href="#studio">Choose Studio →</a>
</article>
</div>
</div>
</section> Pricing with depth.
Hover to bring a plan forward.
Lite
- Personal projects
- 5 GB storage
- Community support
Plus
- Unlimited projects
- 50 GB storage
- Priority support
- Custom domains
Power
- Everything in Plus
- SSO + audit logs
- Dedicated CSM
perspective() + rotateY(), no JS..ps-tlt {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(60% 60% at 50% 0%, rgba(124,58,237,0.18), transparent 60%),
radial-gradient(60% 60% at 50% 100%, rgba(34,211,238,0.14), transparent 60%),
#0d0a1a;
color: #e9e6ff;
font-family: 'Inter', system-ui, sans-serif;
perspective: 1400px;
}
.ps-tlt-head { text-align: center; margin-bottom: clamp(24px, 4vw, 40px); }
.ps-tlt-head h2 {
font-size: clamp(24px, 3.6vw, 36px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #fff;
}
.ps-tlt-head p { color: #a8a0c8; margin: 0; font-size: 14px; }
.ps-tlt-stage {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 20px; max-width: 980px; margin: 0 auto;
transform-style: preserve-3d;
align-items: center;
}
.ps-tlt-card {
position: relative;
background: linear-gradient(160deg, rgba(124,58,237,0.18), rgba(34,211,238,0.10));
border: 1px solid rgba(167,139,250,0.25);
border-radius: 16px;
padding: 26px 22px 22px;
display: flex; flex-direction: column;
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
transform-origin: center;
transition: transform 0.4s cubic-bezier(.22,1,.36,1), box-shadow 0.4s;
box-shadow: 0 10px 30px rgba(13,10,26,0.5);
}
.ps-tlt-l { transform: rotateY(14deg) translateZ(-30px); }
.ps-tlt-c { transform: translateZ(0); z-index: 2; }
.ps-tlt-r { transform: rotateY(-14deg) translateZ(-30px); }
.ps-tlt-card:hover {
transform: rotateY(0) translateZ(20px) translateY(-4px);
box-shadow: 0 24px 60px rgba(124,58,237,0.4);
z-index: 3;
}
.ps-tlt-c { background: linear-gradient(160deg, rgba(124,58,237,0.32), rgba(34,211,238,0.18)); border-color: rgba(34,211,238,0.45); }
.ps-tlt-pill {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: linear-gradient(135deg, #a78bfa, #22d3ee); color: #0d0a1a;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 5px 12px;
border-radius: 999px;
}
.ps-tlt-card h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; margin: 0 0 12px; color: #c4b5fd;
}
.ps-tlt-c h3 { color: #67e8f9; }
.ps-tlt-price {
display: flex; align-items: baseline; gap: 4px;
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 18px; color: #fff;
}
.ps-tlt-price em { font-size: 0.5em; font-style: normal; padding-right: 2px; opacity: 0.7; }
.ps-tlt-price span { font-size: 0.32em; font-weight: 500; opacity: 0.65; margin-left: 6px; }
.ps-tlt-card ul {
list-style: none; padding: 0; margin: 0 0 22px; flex: 1;
font-size: 13px; line-height: 1.95; color: #c4bde0;
}
.ps-tlt-card ul li::before { content: '◆'; color: #a78bfa; display: inline-block; width: 20px; font-size: 9px; }
.ps-tlt-c ul li::before { color: #22d3ee; }
.ps-tlt-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 9px;
background: rgba(167,139,250,0.12); color: #c4b5fd;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(167,139,250,0.3);
transition: background 0.18s, color 0.18s;
}
.ps-tlt-cta-pri { background: linear-gradient(135deg, #a78bfa, #22d3ee); color: #0d0a1a; border-color: transparent; }
.ps-tlt-cta:hover { background: rgba(167,139,250,0.28); color: #fff; }
.ps-tlt-cta:focus-visible { outline: 2px solid #22d3ee; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-tlt-stage { grid-template-columns: 1fr; max-width: 380px; perspective: none; }
.ps-tlt-l, .ps-tlt-c, .ps-tlt-r { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-tlt-card { transition: none; }
.ps-tlt-l, .ps-tlt-c, .ps-tlt-r { transform: none; }
.ps-tlt-card:hover { transform: none; }
} <section class="ps-tlt" aria-label="Pricing">
<header class="ps-tlt-head">
<h2>Pricing with depth.</h2>
<p>Hover to bring a plan forward.</p>
</header>
<div class="ps-tlt-stage">
<article class="ps-tlt-card ps-tlt-l">
<h3>Lite</h3>
<div class="ps-tlt-price"><em>$</em>9<span>/mo</span></div>
<ul>
<li>Personal projects</li>
<li>5 GB storage</li>
<li>Community support</li>
</ul>
<a class="ps-tlt-cta" href="#lite">Pick Lite</a>
</article>
<article class="ps-tlt-card ps-tlt-c">
<span class="ps-tlt-pill">Best fit</span>
<h3>Plus</h3>
<div class="ps-tlt-price"><em>$</em>29<span>/mo</span></div>
<ul>
<li>Unlimited projects</li>
<li>50 GB storage</li>
<li>Priority support</li>
<li>Custom domains</li>
</ul>
<a class="ps-tlt-cta ps-tlt-cta-pri" href="#plus">Pick Plus</a>
</article>
<article class="ps-tlt-card ps-tlt-r">
<h3>Power</h3>
<div class="ps-tlt-price"><em>$</em>79<span>/mo</span></div>
<ul>
<li>Everything in Plus</li>
<li>SSO + audit logs</li>
<li>Dedicated CSM</li>
</ul>
<a class="ps-tlt-cta" href="#power">Pick Power</a>
</article>
</div>
</section> .ps-syn {
position: relative; overflow: hidden;
contain: layout paint;
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: linear-gradient(180deg, #0c0420 0%, #1a052e 60%, #2a0843 100%);
color: #f0e6ff;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-syn-grid-bg {
position: absolute; bottom: 0; left: 50%; transform: translateX(-50%);
width: 220%; height: 50%;
background:
repeating-linear-gradient(0deg, transparent 0, transparent 24px, rgba(236,72,153,0.4) 24px, rgba(236,72,153,0.4) 25px),
repeating-linear-gradient(90deg, transparent 0, transparent 24px, rgba(34,211,238,0.4) 24px, rgba(34,211,238,0.4) 25px);
transform: translateX(-50%) perspective(700px) rotateX(60deg);
transform-origin: center top;
mask-image: linear-gradient(180deg, transparent 0%, #000 35%);
-webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 35%);
z-index: 0;
}
.ps-syn-sun {
position: absolute; left: 50%; top: 30%;
transform: translateX(-50%);
width: 360px; height: 360px;
border-radius: 50%;
background:
repeating-linear-gradient(180deg, transparent 0, transparent 16px, #0c0420 16px, #0c0420 19px),
linear-gradient(180deg, #fde68a 0%, #f59e0b 30%, #ec4899 60%, #a855f7 90%);
filter: blur(0.4px);
opacity: 0.55;
z-index: 0;
}
.ps-syn-head { position: relative; z-index: 2; text-align: center; margin-bottom: clamp(24px, 4vw, 40px); }
.ps-syn-eye {
display: inline-block;
font-family: 'JetBrains Mono', monospace;
font-size: 12px; font-weight: 700; letter-spacing: 0.4em;
color: #22d3ee; margin-bottom: 14px;
text-shadow: 0 0 8px #22d3ee;
}
.ps-syn-head h2 {
font-size: clamp(28px, 5vw, 48px); font-weight: 800;
letter-spacing: -0.02em; margin: 0;
background: linear-gradient(180deg, #fff 0%, #fff 50%, #f9a8d4 50%, #ec4899 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
text-shadow: 0 0 30px rgba(236,72,153,0.5);
}
.ps-syn-head h2 em { font-style: italic; }
.ps-syn-grid {
position: relative; z-index: 2;
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px; max-width: 940px; margin: 0 auto;
align-items: center;
}
.ps-syn-card {
position: relative;
background: rgba(12,4,32,0.7);
border: 1.5px solid #ec4899;
border-radius: 4px;
padding: 22px 20px 20px;
display: flex; flex-direction: column;
box-shadow: 0 0 0 1px rgba(236,72,153,0.4) inset, 0 0 24px rgba(236,72,153,0.3);
backdrop-filter: blur(6px);
}
.ps-syn-pri { border-color: #22d3ee; box-shadow: 0 0 0 1px rgba(34,211,238,0.5) inset, 0 0 30px rgba(34,211,238,0.5); }
.ps-syn-tag {
position: absolute; top: -11px; left: 50%; transform: translateX(-50%);
background: #0c0420; color: #22d3ee;
font-family: 'JetBrains Mono', monospace;
font-size: 10px; font-weight: 700; letter-spacing: 0.18em;
padding: 3px 12px;
border: 1px solid #22d3ee;
text-shadow: 0 0 6px #22d3ee;
}
.ps-syn-card h3 {
font-family: 'JetBrains Mono', monospace;
font-size: 14px; font-weight: 700; letter-spacing: 0.16em;
text-transform: uppercase; margin: 0 0 12px;
color: #ec4899;
text-shadow: 0 0 8px rgba(236,72,153,0.7);
}
.ps-syn-pri h3 { color: #22d3ee; text-shadow: 0 0 8px rgba(34,211,238,0.7); }
.ps-syn-price {
font-family: 'JetBrains Mono', monospace;
font-size: 42px; font-weight: 800; letter-spacing: -0.02em;
margin-bottom: 18px; color: #fff;
text-shadow: 0 0 12px rgba(236,72,153,0.6);
}
.ps-syn-pri .ps-syn-price { text-shadow: 0 0 12px rgba(34,211,238,0.6); }
.ps-syn-card ul {
list-style: none; padding: 0; margin: 0 0 20px; flex: 1;
font-size: 13px; line-height: 1.95; color: #d6c8ee;
font-family: 'JetBrains Mono', monospace;
}
.ps-syn-card ul li::before { content: '▸ '; color: #ec4899; }
.ps-syn-pri ul li::before { color: #22d3ee; }
.ps-syn-cta {
display: block; text-align: center;
padding: 10px 14px;
font-family: 'JetBrains Mono', monospace;
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; text-decoration: none;
background: transparent; color: #ec4899;
border: 1.5px solid #ec4899;
transition: background 0.15s, color 0.15s, box-shadow 0.15s;
}
.ps-syn-cta-pri { color: #22d3ee; border-color: #22d3ee; }
.ps-syn-cta:hover { background: #ec4899; color: #0c0420; box-shadow: 0 0 16px #ec4899; }
.ps-syn-cta-pri:hover { background: #22d3ee; color: #0c0420; box-shadow: 0 0 16px #22d3ee; }
.ps-syn-cta:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-syn-grid { grid-template-columns: 1fr; max-width: 360px; }
.ps-syn-sun { width: 240px; height: 240px; top: 22%; }
}
@media (prefers-reduced-motion: reduce) {
.ps-syn-cta { transition: none; }
} <section class="ps-syn" aria-label="Pricing">
<div class="ps-syn-grid-bg" aria-hidden="true"></div>
<div class="ps-syn-sun" aria-hidden="true"></div>
<header class="ps-syn-head">
<span class="ps-syn-eye">★ Pricing ★</span>
<h2>Choose your <em>signal.</em></h2>
</header>
<div class="ps-syn-grid">
<article class="ps-syn-card">
<h3>Wave</h3>
<div class="ps-syn-price">$15</div>
<ul>
<li>Solo channel</li>
<li>5 GB</li>
<li>Email reach</li>
</ul>
<a class="ps-syn-cta" href="#wave">Tune in</a>
</article>
<article class="ps-syn-card ps-syn-pri">
<span class="ps-syn-tag">★ FAVORITE ★</span>
<h3>Pulse</h3>
<div class="ps-syn-price">$39</div>
<ul>
<li>Multi-channel</li>
<li>50 GB</li>
<li>Live chat</li>
<li>Custom domain</li>
</ul>
<a class="ps-syn-cta ps-syn-cta-pri" href="#pulse">Tune in</a>
</article>
<article class="ps-syn-card">
<h3>Storm</h3>
<div class="ps-syn-price">$99</div>
<ul>
<li>Unlimited</li>
<li>500 GB</li>
<li>SSO + SLA</li>
</ul>
<a class="ps-syn-cta" href="#storm">Tune in</a>
</article>
</div>
</section> Support the project — name your price.
The full product is yours regardless of the amount. Pay more if it helps, pay less if it’s tight. We trust you.
- Lifetime access to the full product
- All future updates included
- Source files + commercial use rights
No questions asked refund inside 14 days. Powered by Stripe.
:has(). Mint palette, the indie-product / crowdfunding pattern..ps-pwy {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(50% 50% at 50% 0%, rgba(45,212,191,0.16), transparent 60%),
#06181a;
color: #d4f5ee;
font-family: 'Inter', system-ui, sans-serif;
display: flex; align-items: center; justify-content: center;
}
.ps-pwy-card {
width: 100%; max-width: 560px;
background: linear-gradient(180deg, #0d2326, #06181a);
border: 1px solid rgba(45,212,191,0.3);
border-radius: 18px;
padding: clamp(26px, 4vw, 38px);
box-shadow: 0 24px 60px rgba(45,212,191,0.12);
}
.ps-pwy-head { text-align: center; margin-bottom: 24px; }
.ps-pwy-eye {
display: inline-block; font-size: 11px; font-weight: 700;
letter-spacing: 0.16em; text-transform: uppercase;
color: #5eead4; padding: 4px 12px;
background: rgba(94,234,212,0.12);
border-radius: 999px; margin-bottom: 14px;
}
.ps-pwy-head h2 {
font-size: clamp(22px, 3.6vw, 30px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 10px; color: #fff;
}
.ps-pwy-head h2 em { color: #5eead4; font-style: italic; }
.ps-pwy-head p { color: #92b8b1; font-size: 14px; line-height: 1.6; margin: 0 auto; max-width: 420px; }
.ps-pwy-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }
.ps-pwy-amounts {
border: 0; padding: 0; margin: 0 0 20px;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 8px;
}
.ps-pwy-amounts input[type="radio"] { position: absolute; opacity: 0; pointer-events: none; }
.ps-pwy-amounts label {
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 14px 6px;
background: rgba(94,234,212,0.06);
border: 1.5px solid rgba(94,234,212,0.18);
border-radius: 10px;
cursor: pointer;
transition: border-color 0.18s, background 0.18s, transform 0.18s;
text-align: center;
min-height: 64px;
}
.ps-pwy-amounts label strong {
font-size: 16px; font-weight: 800; letter-spacing: -0.01em;
color: #fff;
}
.ps-pwy-amounts label span {
display: block; font-size: 10.5px; font-weight: 600;
letter-spacing: 0.06em; text-transform: uppercase;
color: #5eead4; margin-top: 2px;
}
.ps-pwy-amounts label:hover { border-color: rgba(94,234,212,0.5); background: rgba(94,234,212,0.1); }
.ps-pwy-amounts input:checked + label {
background: linear-gradient(135deg, #2dd4bf, #5eead4);
border-color: #5eead4;
transform: translateY(-2px);
box-shadow: 0 6px 18px rgba(45,212,191,0.4);
}
.ps-pwy-amounts input:checked + label strong { color: #06181a; }
.ps-pwy-amounts input:checked + label span { color: rgba(6,24,26,0.7); }
.ps-pwy-amounts input:focus-visible + label { outline: 2px solid #5eead4; outline-offset: 3px; }
.ps-pwy-feats {
list-style: none; padding: 0; margin: 0 0 20px;
font-size: 13px; line-height: 1.95; color: #b8d6cf;
}
.ps-pwy-feats li::before { content: '✓'; color: #5eead4; display: inline-block; width: 22px; font-weight: 700; }
.ps-pwy-cta {
display: block; position: relative;
text-align: center;
padding: 14px 18px; border-radius: 10px;
background: linear-gradient(135deg, #2dd4bf, #5eead4);
color: #06181a; text-decoration: none;
font-size: 14px; font-weight: 700; letter-spacing: 0.01em;
box-shadow: 0 10px 24px rgba(45,212,191,0.3);
transition: transform 0.18s;
margin-bottom: 12px;
}
.ps-pwy-cta:hover { transform: translateY(-1px); }
.ps-pwy-cta:focus-visible { outline: 2px solid #5eead4; outline-offset: 3px; }
.ps-pwy-cta span { display: none; }
.ps-pwy-cta .ps-pwy-cta-default { display: block; }
.ps-pwy:has(#ps-pwy-5:checked) .ps-pwy-cta-default,
.ps-pwy:has(#ps-pwy-25:checked) .ps-pwy-cta-default,
.ps-pwy:has(#ps-pwy-50:checked) .ps-pwy-cta-default,
.ps-pwy:has(#ps-pwy-x:checked) .ps-pwy-cta-default { display: none; }
.ps-pwy:has(#ps-pwy-5:checked) .ps-pwy-cta-5 { display: block; }
.ps-pwy:has(#ps-pwy-25:checked) .ps-pwy-cta-25 { display: block; }
.ps-pwy:has(#ps-pwy-50:checked) .ps-pwy-cta-50 { display: block; }
.ps-pwy:has(#ps-pwy-x:checked) .ps-pwy-cta-x { display: block; }
.ps-pwy-foot { font-size: 11.5px; color: #6e8a85; text-align: center; margin: 0; }
@media (max-width: 540px) {
.ps-pwy-amounts { grid-template-columns: repeat(3, 1fr); }
}
@media (prefers-reduced-motion: reduce) {
.ps-pwy-amounts label, .ps-pwy-cta { transition: none; }
} <section class="ps-pwy" aria-label="Pay what you want">
<div class="ps-pwy-card">
<header class="ps-pwy-head">
<span class="ps-pwy-eye">Pay what you want</span>
<h2>Support the project — <em>name your price.</em></h2>
<p>
The full product is yours regardless of the amount. Pay more if it helps, pay less if it’s
tight. We trust you.
</p>
</header>
<fieldset class="ps-pwy-amounts">
<legend class="ps-pwy-sr">Choose an amount</legend>
<input type="radio" name="ps-pwy" id="ps-pwy-5" />
<label for="ps-pwy-5"><strong>$5</strong><span>Coffee</span></label>
<input type="radio" name="ps-pwy" id="ps-pwy-10" checked />
<label for="ps-pwy-10"><strong>$10</strong><span>Average</span></label>
<input type="radio" name="ps-pwy" id="ps-pwy-25" />
<label for="ps-pwy-25"><strong>$25</strong><span>Generous</span></label>
<input type="radio" name="ps-pwy" id="ps-pwy-50" />
<label for="ps-pwy-50"><strong>$50</strong><span>Sponsor</span></label>
<input type="radio" name="ps-pwy" id="ps-pwy-x" />
<label for="ps-pwy-x"><strong>Custom</strong><span>You decide</span></label>
</fieldset>
<ul class="ps-pwy-feats">
<li>Lifetime access to the full product</li>
<li>All future updates included</li>
<li>Source files + commercial use rights</li>
</ul>
<a class="ps-pwy-cta" href="#pay">
<span class="ps-pwy-cta-default">Pay $10 — get it now</span>
<span class="ps-pwy-cta-5">Pay $5 — get it now</span>
<span class="ps-pwy-cta-25">Pay $25 — get it now</span>
<span class="ps-pwy-cta-50">Pay $50 — get it now</span>
<span class="ps-pwy-cta-x">Enter custom amount →</span>
</a>
<p class="ps-pwy-foot">No questions asked refund inside 14 days. Powered by Stripe.</p>
</div>
</section> Pricing in your currency.
Pay where you live, with the rate fixed at billing time.
Petit
- Solo cellar
- 3 bottles tracked
- Email reminders
Reserve
- Full cellar
- Unlimited bottles
- Tasting notes
- Pairing engine
Grand Cru
- Multi-cellar
- Insurance valuation
- White-glove setup
:has() to swap every visible price across all three tiers. Burgundy on cream — the wine-merchant / boutique-software aesthetic..ps-cur {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #faf6ee;
color: #2a0a14;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-cur-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-cur-head h2 {
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(26px, 4vw, 38px); font-weight: 700;
letter-spacing: -0.015em; margin: 0 0 8px; color: #6b1224;
}
.ps-cur-head p { color: #8a4555; margin: 0 0 20px; font-size: 14px; }
.ps-cur-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }
.ps-cur-tabs {
position: relative; display: inline-grid;
grid-template-columns: repeat(3, 1fr); gap: 0;
border: 1.5px solid #6b1224; border-radius: 999px;
padding: 3px; background: #fff;
margin: 0;
}
.ps-cur-tabs input[type="radio"] { position: absolute; opacity: 0; pointer-events: none; }
.ps-cur-tabs label {
padding: 7px 22px;
font-family: 'JetBrains Mono', monospace;
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
color: #8a4555; cursor: pointer; border-radius: 999px;
transition: color 0.18s, background 0.18s;
}
.ps-cur-tabs input:checked + label { background: #6b1224; color: #faf6ee; }
.ps-cur-tabs input:focus-visible + label { outline: 2px solid #6b1224; outline-offset: 3px; }
.ps-cur-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px; max-width: 1000px; margin: 0 auto;
align-items: center;
}
.ps-cur-card {
position: relative;
background: #fff;
border: 1px solid #e7d8c8;
border-radius: 8px;
padding: 26px 22px 22px;
display: flex; flex-direction: column;
}
.ps-cur-best {
background: #6b1224; color: #faf6ee;
border: 0;
transform: scale(1.04);
box-shadow: 0 18px 44px rgba(107,18,36,0.3);
}
.ps-cur-pill {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: #faf6ee; color: #6b1224;
font-family: 'JetBrains Mono', monospace;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.12em;
text-transform: uppercase; padding: 4px 11px;
border: 1.5px solid #6b1224;
border-radius: 999px;
}
.ps-cur-card h3 {
font-family: 'Playfair Display', Georgia, serif;
font-size: 22px; font-weight: 700; margin: 0 0 12px;
color: #6b1224; font-style: italic;
}
.ps-cur-best h3 { color: #faf6ee; }
.ps-cur-price {
display: flex; align-items: baseline; gap: 4px;
margin-bottom: 18px; padding-bottom: 18px;
border-bottom: 1px dashed #e7d8c8;
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
}
.ps-cur-best .ps-cur-price { border-bottom-color: rgba(250,246,238,0.25); }
.ps-cur-price em { font-size: 13px; font-weight: 500; color: #8a4555; font-style: normal; margin-left: 6px; }
.ps-cur-best .ps-cur-price em { color: rgba(250,246,238,0.7); }
.ps-cur-price > span { display: none; }
.ps-cur:has(#ps-cur-usd:checked) .ps-cur-usd,
.ps-cur:has(#ps-cur-eur:checked) .ps-cur-eur,
.ps-cur:has(#ps-cur-gbp:checked) .ps-cur-gbp { display: inline; }
.ps-cur-card ul {
list-style: none; padding: 0; margin: 0 0 20px; flex: 1;
font-size: 13.5px; line-height: 1.95; color: #4a2030;
}
.ps-cur-best ul { color: rgba(250,246,238,0.85); }
.ps-cur-card ul li::before { content: '◆'; color: #6b1224; display: inline-block; width: 20px; font-size: 9px; }
.ps-cur-best ul li::before { color: #faf6ee; }
.ps-cur-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 6px;
text-decoration: none; font-size: 13px; font-weight: 600;
letter-spacing: 0.04em; text-transform: uppercase;
border: 1.5px solid currentColor; color: #6b1224;
background: transparent;
transition: background 0.18s, color 0.18s;
}
.ps-cur-best .ps-cur-cta { color: #faf6ee; }
.ps-cur-cta-pri { background: #faf6ee; color: #6b1224 !important; border-color: #faf6ee; }
.ps-cur-cta:hover { background: #6b1224; color: #faf6ee; border-color: #6b1224; }
.ps-cur-cta-pri:hover { background: transparent; color: #faf6ee !important; border-color: #faf6ee; }
.ps-cur-cta:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-cur-grid { grid-template-columns: 1fr; max-width: 380px; }
.ps-cur-best { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-cur-tabs label, .ps-cur-cta { transition: none; }
} <section class="ps-cur" aria-label="Pricing">
<header class="ps-cur-head">
<h2>Pricing in your currency.</h2>
<p>Pay where you live, with the rate fixed at billing time.</p>
<fieldset class="ps-cur-tabs">
<legend class="ps-cur-sr">Currency</legend>
<input type="radio" name="ps-cur-c" id="ps-cur-usd" checked />
<label for="ps-cur-usd">USD</label>
<input type="radio" name="ps-cur-c" id="ps-cur-eur" />
<label for="ps-cur-eur">EUR</label>
<input type="radio" name="ps-cur-c" id="ps-cur-gbp" />
<label for="ps-cur-gbp">GBP</label>
</fieldset>
</header>
<div class="ps-cur-grid">
<article class="ps-cur-card">
<h3>Petit</h3>
<div class="ps-cur-price">
<span class="ps-cur-usd">$12</span><span class="ps-cur-eur">€11</span
><span class="ps-cur-gbp">£10</span>
<em>/month</em>
</div>
<ul>
<li>Solo cellar</li>
<li>3 bottles tracked</li>
<li>Email reminders</li>
</ul>
<a class="ps-cur-cta" href="#petit">Choose Petit</a>
</article>
<article class="ps-cur-card ps-cur-best">
<span class="ps-cur-pill">Sommelier’s pick</span>
<h3>Reserve</h3>
<div class="ps-cur-price">
<span class="ps-cur-usd">$36</span><span class="ps-cur-eur">€33</span
><span class="ps-cur-gbp">£28</span>
<em>/month</em>
</div>
<ul>
<li>Full cellar</li>
<li>Unlimited bottles</li>
<li>Tasting notes</li>
<li>Pairing engine</li>
</ul>
<a class="ps-cur-cta ps-cur-cta-pri" href="#reserve">Choose Reserve</a>
</article>
<article class="ps-cur-card">
<h3>Grand Cru</h3>
<div class="ps-cur-price">
<span class="ps-cur-usd">$96</span><span class="ps-cur-eur">€88</span
><span class="ps-cur-gbp">£76</span>
<em>/month</em>
</div>
<ul>
<li>Multi-cellar</li>
<li>Insurance valuation</li>
<li>White-glove setup</li>
</ul>
<a class="ps-cur-cta" href="#grand">Talk to us</a>
</article>
</div>
</section> Pricing teams actually pay for.
Free
- 1 project
- 5 GB storage
- Community
Team
- Unlimited projects
- Priority support
- SSO + roles
Enterprise
- Everything in Team
- Dedicated CSM
- SLA 99.99%
.ps-spr {
position: relative;
overflow: hidden;
contain: layout paint;
padding: clamp(20px, 4vw, 36px) clamp(20px, 4vw, 40px) clamp(28px, 5vw, 48px);
min-height: 480px;
background: #0f172a;
color: #e2e8f0;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-spr-marquee {
position: relative; overflow: hidden;
contain: layout paint;
border-block: 1px solid rgba(163,230,53,0.18);
margin: 0 calc(-1 * clamp(20px, 4vw, 40px)) clamp(20px, 4vw, 32px);
padding: 14px 0;
background: rgba(15,23,42,0.6);
-webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
}
.ps-spr-track {
display: flex; gap: 56px;
white-space: nowrap;
animation: ps-spr-roll 28s linear infinite;
width: max-content;
}
@keyframes ps-spr-roll { to { transform: translateX(-50%); } }
.ps-spr-logo {
font-family: 'JetBrains Mono', monospace;
font-size: 14px; font-weight: 700; letter-spacing: 0.18em;
color: #94a3b8; flex-shrink: 0;
}
.ps-spr-head { text-align: center; margin-bottom: clamp(20px, 4vw, 32px); }
.ps-spr-rating {
display: inline-block; font-size: 12px; font-weight: 600;
letter-spacing: 0.08em; color: #a3e635;
margin-bottom: 10px;
}
.ps-spr-head h2 {
font-size: clamp(24px, 3.6vw, 36px); font-weight: 700;
letter-spacing: -0.02em; margin: 0; color: #fff;
}
.ps-spr-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px; max-width: 940px; margin: 0 auto;
align-items: center;
}
.ps-spr-card {
position: relative;
background: #1e293b;
border: 1px solid rgba(163,230,53,0.12);
border-radius: 12px;
padding: 22px 20px 18px;
display: flex; flex-direction: column;
}
.ps-spr-best {
background: linear-gradient(180deg, #1e293b, #243f1a);
border-color: #a3e635;
box-shadow: 0 0 0 1px #a3e635 inset, 0 14px 36px rgba(163,230,53,0.18);
}
.ps-spr-tag {
position: absolute; top: -11px; left: 50%; transform: translateX(-50%);
background: #a3e635; color: #0f172a;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 4px 11px;
border-radius: 999px;
}
.ps-spr-card h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; margin: 0 0 12px; color: #cbd5e1;
}
.ps-spr-best h3 { color: #d9f99d; }
.ps-spr-price {
display: flex; align-items: baseline; gap: 4px;
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 18px; color: #fff;
}
.ps-spr-price em { font-size: 0.5em; font-style: normal; padding-right: 2px; opacity: 0.7; }
.ps-spr-price span { font-size: 0.32em; font-weight: 500; opacity: 0.65; margin-left: 6px; }
.ps-spr-card ul {
list-style: none; padding: 0; margin: 0 0 18px; flex: 1;
font-size: 13px; line-height: 1.95; color: #b8c1d1;
}
.ps-spr-card ul li::before { content: '✓'; color: #a3e635; display: inline-block; width: 20px; font-weight: 700; }
.ps-spr-cta {
display: block; text-align: center;
padding: 10px 16px; border-radius: 8px;
text-decoration: none; font-size: 13px; font-weight: 600;
background: rgba(163,230,53,0.1); color: #a3e635;
border: 1px solid rgba(163,230,53,0.28);
transition: background 0.18s, color 0.18s;
}
.ps-spr-cta-pri { background: #a3e635; color: #0f172a; border-color: #a3e635; }
.ps-spr-cta:hover { background: #a3e635; color: #0f172a; }
.ps-spr-cta-pri:hover { background: #d9f99d; }
.ps-spr-cta:focus-visible { outline: 2px solid #a3e635; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-spr-grid { grid-template-columns: 1fr; max-width: 360px; }
}
@media (prefers-reduced-motion: reduce) {
.ps-spr-track { animation: none; }
} <section class="ps-spr" aria-label="Pricing">
<div class="ps-spr-marquee" aria-label="Customers using this product">
<div class="ps-spr-track">
<span class="ps-spr-logo">◇ NORTHWIND</span>
<span class="ps-spr-logo">▲ APEX.IO</span>
<span class="ps-spr-logo">★ PULSE</span>
<span class="ps-spr-logo">⬣ HEXLAB</span>
<span class="ps-spr-logo">◯ ORBITA</span>
<span class="ps-spr-logo">◤ FLINT</span>
<span class="ps-spr-logo">⬢ MERIDIAN</span>
<span class="ps-spr-logo">◇ NORTHWIND</span>
<span class="ps-spr-logo">▲ APEX.IO</span>
<span class="ps-spr-logo">★ PULSE</span>
<span class="ps-spr-logo">⬣ HEXLAB</span>
<span class="ps-spr-logo">◯ ORBITA</span>
<span class="ps-spr-logo">◤ FLINT</span>
<span class="ps-spr-logo">⬢ MERIDIAN</span>
</div>
</div>
<header class="ps-spr-head">
<span class="ps-spr-rating" aria-label="Rated 4.9 out of 5">★★★★★ 4.9 from 12,400 teams</span>
<h2>Pricing teams actually pay for.</h2>
</header>
<div class="ps-spr-grid">
<article class="ps-spr-card">
<h3>Free</h3>
<div class="ps-spr-price"><em>$</em>0<span>forever</span></div>
<ul>
<li>1 project</li>
<li>5 GB storage</li>
<li>Community</li>
</ul>
<a class="ps-spr-cta" href="#free">Start free</a>
</article>
<article class="ps-spr-card ps-spr-best">
<span class="ps-spr-tag">Most teams pick this</span>
<h3>Team</h3>
<div class="ps-spr-price"><em>$</em>32<span>/mo</span></div>
<ul>
<li>Unlimited projects</li>
<li>Priority support</li>
<li>SSO + roles</li>
</ul>
<a class="ps-spr-cta ps-spr-cta-pri" href="#team">Choose Team</a>
</article>
<article class="ps-spr-card">
<h3>Enterprise</h3>
<div class="ps-spr-price"><em>$</em>0<span>custom</span></div>
<ul>
<li>Everything in Team</li>
<li>Dedicated CSM</li>
<li>SLA 99.99%</li>
</ul>
<a class="ps-spr-cta" href="#ent">Talk to sales</a>
</article>
</div>
</section> Pricing without the wall of checkmarks.
Open any tier to read the full feature list. Tap to collapse.
Indie
For solo developers shipping side projects.
See all features
- 1 project workspace
- 10 GB storage
- Community forum support
- Public deploys with auto-SSL
- 50K monthly visitor cap
- 1-year version history
Studio
For small teams shipping to real users.
See all features
- Unlimited project workspaces
- 100 GB storage
- Priority email + chat support
- Custom domains with auto-SSL
- 500K monthly visitor cap
- 3-year version history
- Team roles & permissions
- Slack, GitHub, Linear sync
Org
For organisations with compliance requirements.
See all features
- Everything in Studio
- SAML SSO & SCIM provisioning
- Audit logs (90-day retention)
- Unlimited monthly visitors
- Forever version history
- SOC 2 + DPA on file
- SLA 99.99% with credits
- Dedicated CSM & quarterly review
<details>/<summary> dropdowns that reveal the full feature list on click — keeps the page short and lets curious buyers dig in. Deep purple palette, no JS, fully keyboard-accessible..ps-acc {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(60% 60% at 50% 0%, rgba(168,85,247,0.16), transparent 60%),
#15071f;
color: #f3e8ff;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-acc-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-acc-head h2 {
font-size: clamp(22px, 3.4vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #fff;
}
.ps-acc-head p { color: #c4a8d6; margin: 0; font-size: 14px; }
.ps-acc-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px; max-width: 980px; margin: 0 auto;
align-items: start;
}
.ps-acc-card {
position: relative;
background: #281033;
border: 1px solid rgba(168,85,247,0.2);
border-radius: 14px;
padding: 24px 22px 20px;
display: flex; flex-direction: column;
}
.ps-acc-pri {
background: linear-gradient(180deg, #3b1554, #281033);
border-color: #a855f7;
box-shadow: 0 0 0 1px #a855f7 inset, 0 16px 40px rgba(168,85,247,0.22);
}
.ps-acc-pill {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: linear-gradient(135deg, #a855f7, #d946ef);
color: #15071f;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 4px 11px;
border-radius: 999px;
}
.ps-acc-card h3 {
font-size: 15px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; margin: 0 0 6px; color: #d8b4fe;
}
.ps-acc-price {
display: flex; align-items: baseline; gap: 4px;
font-size: 36px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 6px; color: #fff;
}
.ps-acc-price em { font-size: 0.5em; font-style: normal; padding-right: 2px; opacity: 0.7; }
.ps-acc-price span { font-size: 0.32em; font-weight: 500; opacity: 0.65; margin-left: 6px; }
.ps-acc-sub { font-size: 13px; color: #c4a8d6; margin: 0 0 16px; line-height: 1.5; min-height: 36px; }
.ps-acc-det {
border: 1px solid rgba(168,85,247,0.18);
border-radius: 8px;
padding: 0 14px;
margin-bottom: 16px;
background: rgba(168,85,247,0.05);
}
.ps-acc-det[open] { padding-bottom: 4px; }
.ps-acc-det summary {
cursor: pointer;
padding: 11px 0;
font-size: 13px; font-weight: 600; color: #d8b4fe;
list-style: none;
display: flex; align-items: center; justify-content: space-between;
outline: 0;
}
.ps-acc-det summary::-webkit-details-marker { display: none; }
.ps-acc-det summary span {
display: inline-block; font-size: 14px; transition: transform 0.25s;
}
.ps-acc-det[open] summary span { transform: rotate(180deg); }
.ps-acc-det summary:focus-visible { outline: 2px solid #a855f7; outline-offset: 3px; border-radius: 4px; }
.ps-acc-det ul {
list-style: none; padding: 0; margin: 0 0 8px;
font-size: 12.5px; line-height: 1.95; color: #d8c8e8;
border-top: 1px dashed rgba(168,85,247,0.18);
padding-top: 10px;
}
.ps-acc-det ul li::before { content: '✓'; color: #d946ef; display: inline-block; width: 18px; font-weight: 700; }
.ps-acc-cta {
display: block; text-align: center; margin-top: auto;
padding: 11px 16px; border-radius: 8px;
background: rgba(168,85,247,0.12); color: #d8b4fe;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(168,85,247,0.3);
transition: background 0.18s, color 0.18s;
}
.ps-acc-cta-pri { background: linear-gradient(135deg, #a855f7, #d946ef); color: #15071f; border-color: transparent; }
.ps-acc-cta:hover { background: rgba(168,85,247,0.28); color: #fff; }
.ps-acc-cta:focus-visible { outline: 2px solid #d946ef; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-acc-grid { grid-template-columns: 1fr; max-width: 380px; }
.ps-acc-sub { min-height: 0; }
}
@media (prefers-reduced-motion: reduce) {
.ps-acc-det summary span { transition: none; }
.ps-acc-cta { transition: none; }
} <section class="ps-acc" aria-label="Pricing">
<header class="ps-acc-head">
<h2>Pricing without the wall of checkmarks.</h2>
<p>Open any tier to read the full feature list. Tap to collapse.</p>
</header>
<div class="ps-acc-grid">
<article class="ps-acc-card">
<h3>Indie</h3>
<div class="ps-acc-price"><em>$</em>11<span>/mo</span></div>
<p class="ps-acc-sub">For solo developers shipping side projects.</p>
<details class="ps-acc-det">
<summary>See all features <span aria-hidden="true">⌄</span></summary>
<ul>
<li>1 project workspace</li>
<li>10 GB storage</li>
<li>Community forum support</li>
<li>Public deploys with auto-SSL</li>
<li>50K monthly visitor cap</li>
<li>1-year version history</li>
</ul>
</details>
<a class="ps-acc-cta" href="#indie">Choose Indie →</a>
</article>
<article class="ps-acc-card ps-acc-pri">
<span class="ps-acc-pill">Recommended</span>
<h3>Studio</h3>
<div class="ps-acc-price"><em>$</em>34<span>/mo</span></div>
<p class="ps-acc-sub">For small teams shipping to real users.</p>
<details class="ps-acc-det" open>
<summary>See all features <span aria-hidden="true">⌄</span></summary>
<ul>
<li>Unlimited project workspaces</li>
<li>100 GB storage</li>
<li>Priority email + chat support</li>
<li>Custom domains with auto-SSL</li>
<li>500K monthly visitor cap</li>
<li>3-year version history</li>
<li>Team roles & permissions</li>
<li>Slack, GitHub, Linear sync</li>
</ul>
</details>
<a class="ps-acc-cta ps-acc-cta-pri" href="#studio">Choose Studio →</a>
</article>
<article class="ps-acc-card">
<h3>Org</h3>
<div class="ps-acc-price"><em>$</em>96<span>/mo</span></div>
<p class="ps-acc-sub">For organisations with compliance requirements.</p>
<details class="ps-acc-det">
<summary>See all features <span aria-hidden="true">⌄</span></summary>
<ul>
<li>Everything in Studio</li>
<li>SAML SSO & SCIM provisioning</li>
<li>Audit logs (90-day retention)</li>
<li>Unlimited monthly visitors</li>
<li>Forever version history</li>
<li>SOC 2 + DPA on file</li>
<li>SLA 99.99% with credits</li>
<li>Dedicated CSM & quarterly review</li>
</ul>
</details>
<a class="ps-acc-cta" href="#org">Talk to sales →</a>
</article>
</div>
</section> Move the light. Read the price.
Cursor-aware cards. Real cards, real prices, real keyboard support.
OSS
- Self-hosted
- MIT licence
- GitHub issues
Cloud
- Hosted & maintained
- Auto-updates + backups
- Email support
- API access
Self-Hosted Pro
- Commercial licence
- Priority email support
- Audit logs
.ps-spt {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #050505;
color: #f5e6c8;
font-family: 'JetBrains Mono', 'Inter', system-ui, sans-serif;
}
.ps-spt-head { text-align: center; margin-bottom: clamp(24px, 4vw, 40px); }
.ps-spt-head h2 {
font-family: 'Inter', sans-serif;
font-size: clamp(22px, 3.4vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #fff;
}
.ps-spt-head p { color: #8a7656; margin: 0; font-size: 13.5px; }
.ps-spt-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px; max-width: 980px; margin: 0 auto;
align-items: stretch;
}
.ps-spt-card {
position: relative; overflow: hidden;
background: #0a0a0a;
border: 1px solid #2a2418;
border-radius: 14px;
padding: 24px 22px 20px;
display: flex; flex-direction: column;
isolation: isolate;
}
.ps-spt-glow {
position: absolute; inset: 0;
background: radial-gradient(180px circle at var(--ps-spt-x, 50%) var(--ps-spt-y, 50%),
rgba(245,158,11,0.4) 0%, rgba(245,158,11,0.1) 30%, transparent 60%);
opacity: 0; pointer-events: none;
transition: opacity 0.25s;
z-index: 0;
}
.ps-spt-card:hover .ps-spt-glow,
.ps-spt-card:focus-within .ps-spt-glow { opacity: 1; }
.ps-spt-card > *:not(.ps-spt-glow) { position: relative; z-index: 1; }
.ps-spt-card { transition: border-color 0.2s, transform 0.2s; }
.ps-spt-card:hover, .ps-spt-card:focus-within { border-color: #f59e0b; transform: translateY(-2px); }
.ps-spt-card:focus { outline: 0; }
.ps-spt-card:focus-visible { outline: 2px solid #f59e0b; outline-offset: 3px; }
.ps-spt-best { border-color: #b45309; background: linear-gradient(180deg, #1a0f02, #0a0a0a); }
.ps-spt-pill {
display: inline-block; align-self: flex-start;
background: #f59e0b; color: #050505;
font-size: 10px; font-weight: 700; letter-spacing: 0.12em;
text-transform: uppercase; padding: 3px 10px;
border-radius: 4px; margin-bottom: 10px;
}
.ps-spt-card h3 {
font-size: 13px; font-weight: 700; letter-spacing: 0.16em;
text-transform: uppercase; margin: 0 0 12px; color: #f59e0b;
}
.ps-spt-price {
font-family: 'JetBrains Mono', monospace;
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 18px; color: #fff;
display: flex; align-items: baseline; gap: 8px;
}
.ps-spt-price span { font-size: 12px; font-weight: 500; color: #8a7656; letter-spacing: 0.04em; }
.ps-spt-card ul {
list-style: none; padding: 0; margin: 0 0 20px; flex: 1;
font-size: 12.5px; line-height: 2; color: #d8c69a;
}
.ps-spt-card ul li::before { content: '> '; color: #f59e0b; }
.ps-spt-cta {
display: block; text-align: center;
padding: 10px 16px; border-radius: 6px;
font-family: 'JetBrains Mono', monospace;
font-size: 11.5px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; text-decoration: none;
background: transparent; color: #f59e0b;
border: 1.5px solid #b45309;
transition: background 0.18s, color 0.18s, border-color 0.18s;
}
.ps-spt-cta-pri { background: #f59e0b; color: #050505; border-color: #f59e0b; }
.ps-spt-cta:hover { background: #f59e0b; color: #050505; border-color: #f59e0b; }
.ps-spt-cta:focus-visible { outline: 2px solid #f59e0b; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-spt-grid { grid-template-columns: 1fr; max-width: 360px; }
}
@media (prefers-reduced-motion: reduce) {
.ps-spt-card, .ps-spt-glow, .ps-spt-cta { transition: none; }
} <section class="ps-spt" aria-label="Pricing">
<header class="ps-spt-head">
<h2>Move the light. Read the price.</h2>
<p>Cursor-aware cards. Real cards, real prices, real keyboard support.</p>
</header>
<div class="ps-spt-grid">
<article class="ps-spt-card" tabindex="0">
<div class="ps-spt-glow" aria-hidden="true"></div>
<h3>OSS</h3>
<div class="ps-spt-price">$0<span>open source</span></div>
<ul>
<li>Self-hosted</li>
<li>MIT licence</li>
<li>GitHub issues</li>
</ul>
<a class="ps-spt-cta" href="#oss">Clone the repo</a>
</article>
<article class="ps-spt-card ps-spt-best" tabindex="0">
<div class="ps-spt-glow" aria-hidden="true"></div>
<span class="ps-spt-pill">Recommended</span>
<h3>Cloud</h3>
<div class="ps-spt-price">$24<span>/mo</span></div>
<ul>
<li>Hosted & maintained</li>
<li>Auto-updates + backups</li>
<li>Email support</li>
<li>API access</li>
</ul>
<a class="ps-spt-cta ps-spt-cta-pri" href="#cloud">Choose Cloud</a>
</article>
<article class="ps-spt-card" tabindex="0">
<div class="ps-spt-glow" aria-hidden="true"></div>
<h3>Self-Hosted Pro</h3>
<div class="ps-spt-price">$199<span>/yr</span></div>
<ul>
<li>Commercial licence</li>
<li>Priority email support</li>
<li>Audit logs</li>
</ul>
<a class="ps-spt-cta" href="#shp">Buy licence</a>
</article>
</div>
</section> (function () {
var cards = document.querySelectorAll('.ps-spt-card');
cards.forEach(function (card) {
card.addEventListener('pointermove', function (e) {
var rect = card.getBoundingClientRect();
var x = ((e.clientX - rect.left) / rect.width) * 100;
var y = ((e.clientY - rect.top) / rect.height) * 100;
card.style.setProperty('--ps-spt-x', x + '%');
card.style.setProperty('--ps-spt-y', y + '%');
});
card.addEventListener('focus', function () {
card.style.setProperty('--ps-spt-x', '50%');
card.style.setProperty('--ps-spt-y', '50%');
});
});
})(); Pay yearly, save real money.
Same product, two months free when you commit to a year.
Seedling
- 1 garden
- 30 plant slots
- Care reminders
Greenhouse
- 10 gardens
- Unlimited slots
- Disease alerts
- Soil data sync
Estate
- Multi-property
- Pro APIs
- Phone support
.ps-sav {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(60% 60% at 50% 0%, rgba(34,107,72,0.2), transparent 60%),
#07140e;
color: #e7f5ee;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-sav-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-sav-head h2 {
font-size: clamp(24px, 3.6vw, 36px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px;
color: #fff;
}
.ps-sav-head p { color: #94b5a3; margin: 0; font-size: 14px; }
.ps-sav-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px; max-width: 980px; margin: 0 auto;
align-items: center;
}
.ps-sav-card {
position: relative;
background: #0d2018;
border: 1px solid rgba(52,153,108,0.22);
border-radius: 14px;
padding: 24px 22px 20px;
display: flex; flex-direction: column;
}
.ps-sav-rec {
background: linear-gradient(180deg, #14301f, #0d2018);
border-color: #34996c;
box-shadow: 0 0 0 1px #34996c inset, 0 14px 36px rgba(52,153,108,0.2);
transform: scale(1.04);
}
.ps-sav-pill {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: #34996c; color: #07140e;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 4px 11px;
border-radius: 999px;
}
.ps-sav-card h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; margin: 0 0 14px;
color: #6ee7b7;
}
.ps-sav-prices {
display: flex; flex-direction: column; gap: 4px;
margin-bottom: 8px;
}
.ps-sav-was {
font-size: 14px; color: #94b5a3;
text-decoration: line-through;
text-decoration-color: #f97316;
text-decoration-thickness: 2px;
}
.ps-sav-was em { font-style: normal; font-size: 12px; opacity: 0.8; }
.ps-sav-now {
display: flex; align-items: baseline; gap: 6px;
}
.ps-sav-now strong {
font-size: 38px; font-weight: 800; letter-spacing: -0.03em;
color: #fff;
}
.ps-sav-now em { font-style: normal; font-size: 12px; color: #94b5a3; }
.ps-sav-bag {
display: inline-block; align-self: flex-start;
background: #f97316; color: #07140e;
font-size: 11px; font-weight: 700; letter-spacing: 0.04em;
padding: 3px 10px;
border-radius: 4px;
margin-bottom: 18px;
}
.ps-sav-card ul {
list-style: none; padding: 0; margin: 0 0 20px; flex: 1;
font-size: 13.5px; line-height: 1.95; color: #c8e0d3;
}
.ps-sav-card ul li::before { content: '✓'; color: #34d399; display: inline-block; width: 20px; font-weight: 700; }
.ps-sav-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 8px;
background: rgba(52,153,108,0.14); color: #6ee7b7;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(52,153,108,0.32);
transition: background 0.18s, color 0.18s;
}
.ps-sav-cta-pri { background: #34996c; color: #07140e; border-color: #34996c; }
.ps-sav-cta:hover { background: #34996c; color: #07140e; }
.ps-sav-cta:focus-visible { outline: 2px solid #34996c; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-sav-grid { grid-template-columns: 1fr; max-width: 380px; }
.ps-sav-rec { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-sav-cta { transition: none; }
} <section class="ps-sav" aria-label="Pricing">
<header class="ps-sav-head">
<h2>Pay yearly, save real money.</h2>
<p>Same product, two months free when you commit to a year.</p>
</header>
<div class="ps-sav-grid">
<article class="ps-sav-card">
<h3>Seedling</h3>
<div class="ps-sav-prices">
<span class="ps-sav-was" aria-label="Monthly price, was">$15<em>/mo</em></span>
<span class="ps-sav-now"><strong>$12</strong><em>/mo billed yearly</em></span>
</div>
<span class="ps-sav-bag" aria-label="Yearly savings">Save $36/yr</span>
<ul>
<li>1 garden</li>
<li>30 plant slots</li>
<li>Care reminders</li>
</ul>
<a class="ps-sav-cta" href="#seedling">Choose Seedling</a>
</article>
<article class="ps-sav-card ps-sav-rec">
<span class="ps-sav-pill">Recommended</span>
<h3>Greenhouse</h3>
<div class="ps-sav-prices">
<span class="ps-sav-was" aria-label="Monthly price, was">$36<em>/mo</em></span>
<span class="ps-sav-now"><strong>$29</strong><em>/mo billed yearly</em></span>
</div>
<span class="ps-sav-bag" aria-label="Yearly savings">Save $84/yr</span>
<ul>
<li>10 gardens</li>
<li>Unlimited slots</li>
<li>Disease alerts</li>
<li>Soil data sync</li>
</ul>
<a class="ps-sav-cta ps-sav-cta-pri" href="#greenhouse">Choose Greenhouse</a>
</article>
<article class="ps-sav-card">
<h3>Estate</h3>
<div class="ps-sav-prices">
<span class="ps-sav-was" aria-label="Monthly price, was">$96<em>/mo</em></span>
<span class="ps-sav-now"><strong>$79</strong><em>/mo billed yearly</em></span>
</div>
<span class="ps-sav-bag" aria-label="Yearly savings">Save $204/yr</span>
<ul>
<li>Multi-property</li>
<li>Pro APIs</li>
<li>Phone support</li>
</ul>
<a class="ps-sav-cta" href="#estate">Choose Estate</a>
</article>
</div>
</section> Pick the plan that fits today.
Upgrade, downgrade, or cancel any time. No fine print.
Starter
For solo builders shipping their first thing.
- 1 project
- 2 GB storage
- Community support
- Basic analytics
Team
For small teams who need to ship together.
- 10 projects
- 50 GB storage
- Email support
- Team analytics
- Role-based access
Business
For growing companies that need governance.
- Unlimited projects
- 500 GB storage
- Priority support
- Advanced analytics
- SSO + audit logs
- SOC 2 ready
<ul> feature lists, dashed dividers, and full-width CTAs at the bottom. The conversion-tested baseline every team starts from..ps-cls {
display: block;
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #07120e;
color: #e7f5ee;
font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
.ps-cls-head { text-align: center; margin-bottom: clamp(20px, 4vw, 40px); }
.ps-cls-eye {
display: inline-block; font-size: 12px; font-weight: 600;
letter-spacing: 0.18em; text-transform: uppercase;
color: #34d399; margin-bottom: 12px;
}
.ps-cls-head h2 {
font-size: clamp(22px, 3.4vw, 34px); font-weight: 700;
letter-spacing: -0.01em; margin: 0 0 8px;
}
.ps-cls-head p { color: #9bb5a8; margin: 0; font-size: 14px; }
.ps-cls-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
max-width: 980px; margin: 0 auto;
}
.ps-cls-card {
background: #0d1f18;
border: 1px solid rgba(52,211,153,0.2);
border-radius: 14px;
padding: 22px 20px 20px;
display: flex; flex-direction: column;
transition: border-color 0.2s, transform 0.2s;
}
.ps-cls-card:hover { border-color: #34d399; transform: translateY(-2px); }
.ps-cls-card h3 {
font-size: 15px; font-weight: 700; margin: 0 0 4px;
color: #34d399; letter-spacing: 0.04em; text-transform: uppercase;
}
.ps-cls-sub { font-size: 13px; color: #9bb5a8; margin: 0 0 18px; line-height: 1.5; min-height: 38px; }
.ps-cls-price { display: flex; align-items: baseline; gap: 6px; margin-bottom: 18px;
padding-bottom: 18px; border-bottom: 1px dashed rgba(52,211,153,0.25);
}
.ps-cls-amt { font-size: 38px; font-weight: 800; letter-spacing: -0.02em; color: #f0fff7; }
.ps-cls-per { font-size: 13px; color: #9bb5a8; }
.ps-cls-feats { list-style: none; padding: 0; margin: 0 0 22px; flex: 1; }
.ps-cls-feats li {
position: relative;
padding: 6px 0 6px 22px;
font-size: 13.5px; color: #d2e9dc;
}
.ps-cls-feats li::before {
content: ''; position: absolute; left: 0; top: 50%;
width: 14px; height: 14px;
transform: translateY(-50%);
background:
linear-gradient(135deg, transparent 50%, #34d399 50%) center/100% 100% no-repeat;
-webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M6.5 11.5 3 8l1-1 2.5 2.5L12 4l1 1z'/></svg>") center/contain no-repeat;
mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M6.5 11.5 3 8l1-1 2.5 2.5L12 4l1 1z'/></svg>") center/contain no-repeat;
background: #34d399;
}
.ps-cls-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 8px;
background: rgba(52,211,153,0.12);
color: #34d399; text-decoration: none;
font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(52,211,153,0.28);
transition: background 0.18s, color 0.18s;
}
.ps-cls-cta:hover { background: #34d399; color: #07120e; }
.ps-cls-cta:focus-visible { outline: 2px solid #34d399; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-cls-grid { grid-template-columns: 1fr; max-width: 460px; }
.ps-cls-sub { min-height: 0; }
}
@media (prefers-reduced-motion: reduce) {
.ps-cls-card { transition: none; }
.ps-cls-card:hover { transform: none; }
} <section class="ps-cls" aria-label="Pricing">
<header class="ps-cls-head">
<span class="ps-cls-eye">Pricing</span>
<h2>Pick the plan that fits today.</h2>
<p>Upgrade, downgrade, or cancel any time. No fine print.</p>
</header>
<div class="ps-cls-grid">
<article class="ps-cls-card">
<h3>Starter</h3>
<p class="ps-cls-sub">For solo builders shipping their first thing.</p>
<div class="ps-cls-price">
<span class="ps-cls-amt">$9</span><span class="ps-cls-per">/ month</span>
</div>
<ul class="ps-cls-feats">
<li>1 project</li>
<li>2 GB storage</li>
<li>Community support</li>
<li>Basic analytics</li>
</ul>
<a class="ps-cls-cta" href="#starter">Start free →</a>
</article>
<article class="ps-cls-card">
<h3>Team</h3>
<p class="ps-cls-sub">For small teams who need to ship together.</p>
<div class="ps-cls-price">
<span class="ps-cls-amt">$29</span><span class="ps-cls-per">/ month</span>
</div>
<ul class="ps-cls-feats">
<li>10 projects</li>
<li>50 GB storage</li>
<li>Email support</li>
<li>Team analytics</li>
<li>Role-based access</li>
</ul>
<a class="ps-cls-cta" href="#team">Start 14-day trial →</a>
</article>
<article class="ps-cls-card">
<h3>Business</h3>
<p class="ps-cls-sub">For growing companies that need governance.</p>
<div class="ps-cls-price">
<span class="ps-cls-amt">$79</span><span class="ps-cls-per">/ month</span>
</div>
<ul class="ps-cls-feats">
<li>Unlimited projects</li>
<li>500 GB storage</li>
<li>Priority support</li>
<li>Advanced analytics</li>
<li>SSO + audit logs</li>
<li>SOC 2 ready</li>
</ul>
<a class="ps-cls-cta" href="#business">Talk to sales →</a>
</article>
</div>
</section> Simple pricing, no surprises.
Three plans. Same product. Pick what you can grow into.
Basic
Just the essentials.
- 3 projects
- 5 GB storage
- Email-only support
Pro
Everything teams actually need.
- Unlimited projects
- 100 GB storage
- Priority support
- Custom domains
- Team roles
Enterprise
Compliance + dedicated success.
- Everything in Pro
- SSO & SAML
- SLA + dedicated CSM
.ps-pop {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #1a1410;
color: #fef2e6;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-pop-head { text-align: center; margin-bottom: clamp(28px, 5vw, 48px); }
.ps-pop-head h2 {
font-size: clamp(24px, 3.6vw, 36px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 10px;
background: linear-gradient(90deg, #ff8b5a, #ffb37a);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-pop-head p { color: #c9b3a3; margin: 0; font-size: 14px; }
.ps-pop-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px; align-items: center;
max-width: 980px; margin: 0 auto;
}
.ps-pop-card {
position: relative;
background: #261c16;
border: 1px solid rgba(255,179,122,0.12);
border-radius: 16px;
padding: 26px 22px 22px;
display: flex; flex-direction: column;
}
.ps-pop-popular {
background: linear-gradient(180deg, #ff8b5a 0%, #f56a3a 100%);
color: #1a1410;
transform: scale(1.05);
box-shadow: 0 14px 40px rgba(245,106,58,0.35);
border: 0;
z-index: 2;
}
.ps-pop-badge {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: #1a1410; color: #ff8b5a;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 5px 12px;
border-radius: 999px;
}
.ps-pop-card h3 {
font-size: 15px; font-weight: 700; letter-spacing: 0.06em;
text-transform: uppercase; margin: 0 0 14px;
color: #ffb37a;
}
.ps-pop-popular h3 { color: #1a1410; }
.ps-pop-price {
display: flex; align-items: baseline; gap: 3px;
margin-bottom: 6px;
}
.ps-pop-cur { font-size: 18px; font-weight: 600; opacity: 0.7; }
.ps-pop-amt { font-size: 44px; font-weight: 800; letter-spacing: -0.03em; }
.ps-pop-per { font-size: 13px; opacity: 0.7; margin-left: 4px; }
.ps-pop-sub { font-size: 13px; opacity: 0.75; margin: 0 0 18px; }
.ps-pop-feats {
list-style: none; padding: 0; margin: 0 0 22px; flex: 1;
font-size: 13.5px; line-height: 1.9;
}
.ps-pop-feats li::before {
content: '✓'; display: inline-block; width: 18px;
font-weight: 800; opacity: 0.85;
}
.ps-pop-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 8px;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid currentColor;
color: #ffb37a; background: transparent;
transition: background 0.18s, color 0.18s;
}
.ps-pop-cta:hover { background: #ffb37a; color: #1a1410; }
.ps-pop-cta-pri { background: #1a1410; color: #ff8b5a; border-color: #1a1410; }
.ps-pop-cta-pri:hover { background: #fef2e6; color: #1a1410; border-color: #fef2e6; }
.ps-pop-cta:focus-visible { outline: 2px solid #ff8b5a; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-pop-grid { grid-template-columns: 1fr; max-width: 380px; }
.ps-pop-popular { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-pop-cta { transition: none; }
} <section class="ps-pop" aria-label="Pricing">
<header class="ps-pop-head">
<h2>Simple pricing, no surprises.</h2>
<p>Three plans. Same product. Pick what you can grow into.</p>
</header>
<div class="ps-pop-grid">
<article class="ps-pop-card">
<h3>Basic</h3>
<div class="ps-pop-price">
<span class="ps-pop-cur">$</span><span class="ps-pop-amt">12</span
><span class="ps-pop-per">/mo</span>
</div>
<p class="ps-pop-sub">Just the essentials.</p>
<ul class="ps-pop-feats">
<li>3 projects</li>
<li>5 GB storage</li>
<li>Email-only support</li>
</ul>
<a class="ps-pop-cta" href="#basic">Choose Basic</a>
</article>
<article class="ps-pop-card ps-pop-popular">
<span class="ps-pop-badge" aria-label="Most popular plan">Most popular</span>
<h3>Pro</h3>
<div class="ps-pop-price">
<span class="ps-pop-cur">$</span><span class="ps-pop-amt">36</span
><span class="ps-pop-per">/mo</span>
</div>
<p class="ps-pop-sub">Everything teams actually need.</p>
<ul class="ps-pop-feats">
<li>Unlimited projects</li>
<li>100 GB storage</li>
<li>Priority support</li>
<li>Custom domains</li>
<li>Team roles</li>
</ul>
<a class="ps-pop-cta ps-pop-cta-pri" href="#pro">Choose Pro</a>
</article>
<article class="ps-pop-card">
<h3>Enterprise</h3>
<div class="ps-pop-price">
<span class="ps-pop-cur">$</span><span class="ps-pop-amt">99</span
><span class="ps-pop-per">/mo</span>
</div>
<p class="ps-pop-sub">Compliance + dedicated success.</p>
<ul class="ps-pop-feats">
<li>Everything in Pro</li>
<li>SSO & SAML</li>
<li>SLA + dedicated CSM</li>
</ul>
<a class="ps-pop-cta" href="#enterprise">Contact sales</a>
</article>
</div>
</section> Compare every feature.
Pick the column that matches what you ship today.
| Feature | Free $0 |
RecommendedPro $24 |
Team $48 |
Enterprise Contact |
|---|---|---|---|---|
| Projects | 1 | 10 | 50 | Unlimited |
| Storage | 500 MB | 10 GB | 50 GB | 500 GB |
| Custom domain | — | ✓ | ✓ | ✓ |
| Team roles | — | ✓ | ✓ | ✓ |
| Priority support | — | ✓ | ✓ | ✓ |
| SSO & SAML | — | — | ✓ | ✓ |
| Audit logs | — | — | ✓ | ✓ |
| 99.99% SLA | — | — | — | ✓ |
| Dedicated CSM | — | — | — | ✓ |
| Get started | Choose Pro → | Choose Team | Talk to sales |
<table> with proper <th scope>, sticky header row, and check / dash cells comparing four plans across nine features. Cyan accent on the recommended column. Mobile fallback collapses to a stacked card list under 720px..ps-cmp {
padding: clamp(28px, 5vw, 56px) clamp(16px, 4vw, 40px);
min-height: 480px;
background: #06141a;
color: #e0f2f7;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-cmp-head { text-align: center; margin-bottom: clamp(20px, 4vw, 36px); }
.ps-cmp-head h2 {
font-size: clamp(22px, 3.2vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #f1fbff;
}
.ps-cmp-head p { color: #88a8b3; margin: 0; font-size: 14px; }
.ps-cmp-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 980px; margin: 0 auto; }
.ps-cmp-tbl {
width: 100%; border-collapse: separate; border-spacing: 0;
font-size: 13.5px; min-width: 720px;
}
.ps-cmp-tbl th, .ps-cmp-tbl td {
text-align: center; padding: 14px 12px;
border-bottom: 1px solid rgba(34,211,238,0.1);
}
.ps-cmp-tbl thead th {
font-size: 14px; font-weight: 700;
color: #cfeaf2;
background: #0c1f27;
position: relative;
}
.ps-cmp-tbl thead th span:not(.ps-cmp-pill) {
display: block; font-size: 13px; font-weight: 500; color: #88a8b3; margin-top: 4px;
}
.ps-cmp-fc { text-align: left !important; color: #88a8b3 !important; font-weight: 500 !important; background: transparent !important; }
.ps-cmp-tbl tbody th {
text-align: left; font-weight: 500; color: #cfeaf2;
}
.ps-cmp-rec {
background: rgba(34,211,238,0.06);
color: #22d3ee;
position: relative;
}
.ps-cmp-tbl thead th.ps-cmp-rec {
background: linear-gradient(180deg, rgba(34,211,238,0.18), rgba(34,211,238,0.04));
color: #5eead4;
}
.ps-cmp-pill {
position: absolute; top: -10px; left: 50%; transform: translateX(-50%);
background: #22d3ee; color: #06141a;
font-size: 10px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 3px 10px;
border-radius: 999px;
}
.ps-cmp-yes { display: inline-block; width: 22px; height: 22px; line-height: 22px;
border-radius: 50%; background: rgba(34,211,238,0.15); color: #22d3ee;
font-weight: 700;
}
.ps-cmp-no { color: #4a606a; font-weight: 500; }
.ps-cmp-tbl tfoot td { padding-top: 18px; padding-bottom: 4px; border: 0; }
.ps-cmp-cta {
display: inline-block; padding: 9px 16px; border-radius: 7px;
font-size: 12.5px; font-weight: 600;
text-decoration: none;
border: 1px solid rgba(34,211,238,0.3); color: #5eead4;
transition: background 0.18s, color 0.18s;
}
.ps-cmp-cta:hover { background: rgba(34,211,238,0.18); color: #f1fbff; }
.ps-cmp-cta-pri { background: #22d3ee; color: #06141a; border-color: #22d3ee; }
.ps-cmp-cta-pri:hover { background: #5eead4; color: #06141a; }
.ps-cmp-cta:focus-visible { outline: 2px solid #22d3ee; outline-offset: 3px; }
@media (max-width: 720px) {
.ps-cmp-scroll { padding-bottom: 8px; }
.ps-cmp-tbl thead th, .ps-cmp-tbl tbody th, .ps-cmp-tbl td { padding: 10px 8px; font-size: 12px; }
.ps-cmp-pill { font-size: 9px; padding: 2px 6px; }
} <section class="ps-cmp" aria-label="Plan comparison">
<header class="ps-cmp-head">
<h2>Compare every feature.</h2>
<p>Pick the column that matches what you ship today.</p>
</header>
<div class="ps-cmp-scroll">
<table class="ps-cmp-tbl">
<thead>
<tr>
<th scope="col" class="ps-cmp-fc">Feature</th>
<th scope="col">Free<br /><span>$0</span></th>
<th scope="col" class="ps-cmp-rec">
<span class="ps-cmp-pill">Recommended</span>Pro<br /><span>$24</span>
</th>
<th scope="col">Team<br /><span>$48</span></th>
<th scope="col">Enterprise<br /><span>Contact</span></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Projects</th>
<td>1</td>
<td class="ps-cmp-rec">10</td>
<td>50</td>
<td>Unlimited</td>
</tr>
<tr>
<th scope="row">Storage</th>
<td>500 MB</td>
<td class="ps-cmp-rec">10 GB</td>
<td>50 GB</td>
<td>500 GB</td>
</tr>
<tr>
<th scope="row">Custom domain</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">Team roles</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">Priority support</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">SSO & SAML</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">Audit logs</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">99.99% SLA</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
<tr>
<th scope="row">Dedicated CSM</th>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td class="ps-cmp-rec"><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-no" aria-label="not included">—</span></td>
<td><span class="ps-cmp-yes" aria-label="included">✓</span></td>
</tr>
</tbody>
<tfoot>
<tr>
<th scope="row" class="ps-cmp-fc"></th>
<td><a class="ps-cmp-cta" href="#free">Get started</a></td>
<td class="ps-cmp-rec">
<a class="ps-cmp-cta ps-cmp-cta-pri" href="#pro">Choose Pro →</a>
</td>
<td><a class="ps-cmp-cta" href="#team">Choose Team</a></td>
<td><a class="ps-cmp-cta" href="#ent">Talk to sales</a></td>
</tr>
</tfoot>
</table>
</div>
</section> Pay how it suits you.
Switch billing — no contracts, no negotiation.
Hobby
- 1 site
- Public projects
- Community
Studio
- Unlimited sites
- Custom domains
- Email support
- Form submissions
Agency
- Everything in Studio
- Client billing
- Workspace switcher
- Priority support
:has(). No JavaScript — selecting Yearly swaps every visible price across all three tiers via sibling state. Teal gradient, save-20%-pill on the yearly option..ps-tog {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #062021;
color: #e0fafa;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-tog-head { text-align: center; margin-bottom: clamp(24px, 4vw, 40px); }
.ps-tog-head h2 {
font-size: clamp(22px, 3.4vw, 34px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px;
background: linear-gradient(90deg, #14b8a6, #5eead4);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-tog-head p { color: #7ea7a4; margin: 0 0 22px; font-size: 14px; }
.ps-tog-sr {
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.ps-tog-switch {
position: relative; display: inline-grid;
grid-template-columns: 1fr 1fr;
gap: 0; padding: 4px;
background: #0d2f30;
border: 1px solid rgba(94,234,212,0.18);
border-radius: 999px;
margin: 0;
}
.ps-tog-switch input[type="radio"] {
position: absolute; opacity: 0; pointer-events: none;
}
.ps-tog-switch input:focus-visible + label {
outline: 2px solid #5eead4; outline-offset: 3px;
}
.ps-tog-switch label {
position: relative; z-index: 1;
padding: 8px 22px; cursor: pointer;
font-size: 13px; font-weight: 600; color: #7ea7a4;
border-radius: 999px;
transition: color 0.2s;
display: inline-flex; align-items: center; gap: 6px;
white-space: nowrap;
}
.ps-tog-save {
font-size: 10px; font-weight: 700;
background: rgba(94,234,212,0.18); color: #5eead4;
padding: 2px 6px; border-radius: 6px;
}
.ps-tog-thumb {
position: absolute; top: 4px; left: 4px;
width: calc(50% - 4px); height: calc(100% - 8px);
background: linear-gradient(135deg, #14b8a6, #5eead4);
border-radius: 999px;
transition: transform 0.28s cubic-bezier(.4,0,.2,1);
z-index: 0;
box-shadow: 0 4px 14px rgba(20,184,166,0.3);
}
.ps-tog-switch:has(#ps-tog-y:checked) .ps-tog-thumb { transform: translateX(100%); }
.ps-tog-switch:has(#ps-tog-m:checked) label[for="ps-tog-m"],
.ps-tog-switch:has(#ps-tog-y:checked) label[for="ps-tog-y"] { color: #062021; }
.ps-tog-switch:has(#ps-tog-y:checked) .ps-tog-save { background: rgba(6,32,33,0.25); color: #062021; }
.ps-tog-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px; max-width: 980px; margin: 0 auto;
}
.ps-tog-card {
position: relative;
background: #0d2f30;
border: 1px solid rgba(94,234,212,0.15);
border-radius: 14px;
padding: 24px 22px 22px;
display: flex; flex-direction: column;
}
.ps-tog-best { border-color: #5eead4; box-shadow: 0 0 0 1px #5eead4 inset; }
.ps-tog-badge {
position: absolute; top: -10px; right: 16px;
background: #5eead4; color: #062021;
font-size: 10px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 4px 10px;
border-radius: 6px;
}
.ps-tog-card h3 {
font-size: 15px; font-weight: 700; letter-spacing: 0.06em;
text-transform: uppercase; margin: 0 0 14px; color: #5eead4;
}
.ps-tog-price { display: flex; align-items: baseline; gap: 8px; margin-bottom: 18px; }
.ps-tog-m-amt, .ps-tog-y-amt { font-size: 38px; font-weight: 800; letter-spacing: -0.02em; color: #f0fff7; }
.ps-tog-per { font-size: 13px; color: #7ea7a4; }
.ps-tog:has(#ps-tog-m:checked) .ps-tog-y-amt { display: none; }
.ps-tog:has(#ps-tog-y:checked) .ps-tog-m-amt { display: none; }
.ps-tog-card ul {
list-style: none; padding: 0; margin: 0 0 22px; flex: 1;
font-size: 13.5px; line-height: 2; color: #c8eaea;
}
.ps-tog-card ul li::before {
content: '✓'; color: #5eead4; font-weight: 700;
display: inline-block; width: 20px;
}
.ps-tog-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 8px;
text-decoration: none; font-size: 13.5px; font-weight: 600;
background: rgba(94,234,212,0.12); color: #5eead4;
border: 1px solid rgba(94,234,212,0.25);
transition: background 0.18s, color 0.18s;
}
.ps-tog-cta-pri { background: #5eead4; color: #062021; border-color: #5eead4; }
.ps-tog-cta:hover { background: #5eead4; color: #062021; }
.ps-tog-cta:focus-visible { outline: 2px solid #5eead4; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-tog-grid { grid-template-columns: 1fr; max-width: 380px; }
}
@media (prefers-reduced-motion: reduce) {
.ps-tog-thumb { transition: none; }
.ps-tog-cta { transition: none; }
.ps-tog-switch label { transition: none; }
} <section class="ps-tog" aria-label="Pricing">
<header class="ps-tog-head">
<h2>Pay how it suits you.</h2>
<p>Switch billing — no contracts, no negotiation.</p>
<fieldset class="ps-tog-switch">
<legend class="ps-tog-sr">Billing cycle</legend>
<input type="radio" name="ps-tog-cycle" id="ps-tog-m" checked />
<label for="ps-tog-m">Monthly</label>
<input type="radio" name="ps-tog-cycle" id="ps-tog-y" />
<label for="ps-tog-y">Yearly <span class="ps-tog-save">−20%</span></label>
<span class="ps-tog-thumb" aria-hidden="true"></span>
</fieldset>
</header>
<div class="ps-tog-grid">
<article class="ps-tog-card">
<h3>Hobby</h3>
<div class="ps-tog-price">
<span class="ps-tog-m-amt">$0</span><span class="ps-tog-y-amt">$0</span
><span class="ps-tog-per">forever</span>
</div>
<ul>
<li>1 site</li>
<li>Public projects</li>
<li>Community</li>
</ul>
<a class="ps-tog-cta" href="#hobby">Start free</a>
</article>
<article class="ps-tog-card ps-tog-best">
<span class="ps-tog-badge">Best value</span>
<h3>Studio</h3>
<div class="ps-tog-price">
<span class="ps-tog-m-amt">$19</span><span class="ps-tog-y-amt">$15</span
><span class="ps-tog-per">/ month</span>
</div>
<ul>
<li>Unlimited sites</li>
<li>Custom domains</li>
<li>Email support</li>
<li>Form submissions</li>
</ul>
<a class="ps-tog-cta ps-tog-cta-pri" href="#studio">Start trial</a>
</article>
<article class="ps-tog-card">
<h3>Agency</h3>
<div class="ps-tog-price">
<span class="ps-tog-m-amt">$59</span><span class="ps-tog-y-amt">$47</span
><span class="ps-tog-per">/ month</span>
</div>
<ul>
<li>Everything in Studio</li>
<li>Client billing</li>
<li>Workspace switcher</li>
<li>Priority support</li>
</ul>
<a class="ps-tog-cta" href="#agency">Choose Agency</a>
</article>
</div>
</section> Only pay for what you actually send.
Slide to estimate your monthly bill — we round up to the nearest tier so you’re never surprised.
- No setup fee, no minimum spend
- Auto-tier switching at every milestone
- Usage cap option to prevent surprises
<input type="range"> drives a live monthly estimate. Drag the slider, the requests count, total price, and recommended tier all update — with aria-valuetext announcing the result to screen readers. Magenta accent, the usage-based pricing pattern from Twilio / Stripe..ps-slr {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #1a0a18;
color: #fde7f4;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-slr-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-slr-eye {
display: inline-block; font-size: 11px; font-weight: 700;
letter-spacing: 0.18em; text-transform: uppercase;
color: #f472b6; padding: 5px 12px;
background: rgba(244,114,182,0.12);
border: 1px solid rgba(244,114,182,0.25);
border-radius: 999px; margin-bottom: 14px;
}
.ps-slr-head h2 {
font-size: clamp(22px, 3.4vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 10px;
color: #fff;
}
.ps-slr-head p { color: #c2a0b6; margin: 0 auto; max-width: 520px; font-size: 14px; line-height: 1.6; }
.ps-slr-card {
max-width: 580px; margin: 0 auto;
background: linear-gradient(180deg, #2a1227, #1a0a18);
border: 1px solid rgba(244,114,182,0.2);
border-radius: 18px;
padding: clamp(24px, 4vw, 36px) clamp(20px, 4vw, 32px);
box-shadow: 0 22px 60px rgba(244,114,182,0.12);
}
.ps-slr-display {
text-align: center; padding-bottom: 22px; margin-bottom: 22px;
border-bottom: 1px dashed rgba(244,114,182,0.2);
}
.ps-slr-label {
display: block; font-size: 11px; letter-spacing: 0.16em;
text-transform: uppercase; color: #c2a0b6;
}
.ps-slr-amount {
display: flex; justify-content: center; align-items: baseline; gap: 4px;
font-size: 64px; font-weight: 800; letter-spacing: -0.04em;
margin: 8px 0 6px;
background: linear-gradient(180deg, #f472b6, #be185d);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-slr-amount em { font-size: 28px; font-style: normal; align-self: flex-start; padding-top: 12px; opacity: 0.7; }
.ps-slr-detail { font-size: 13px; color: #c2a0b6; }
.ps-slr-detail strong { color: #f472b6; font-weight: 700; }
.ps-slr-track-wrap { padding: 0 4px 22px; }
.ps-slr-sr {
position: absolute; width: 1px; height: 1px;
overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.ps-slr-range {
-webkit-appearance: none; appearance: none;
width: 100%; height: 6px; background: transparent; cursor: pointer;
margin: 8px 0 12px;
}
.ps-slr-range::-webkit-slider-runnable-track {
height: 6px; border-radius: 999px;
background: linear-gradient(90deg, #f472b6 0%, #f472b6 var(--ps-slr-fill, 10%), #3a1a30 var(--ps-slr-fill, 10%), #3a1a30 100%);
}
.ps-slr-range::-moz-range-track {
height: 6px; border-radius: 999px; background: #3a1a30;
}
.ps-slr-range::-moz-range-progress {
height: 6px; border-radius: 999px; background: #f472b6;
}
.ps-slr-range::-webkit-slider-thumb {
-webkit-appearance: none; appearance: none;
width: 22px; height: 22px; margin-top: -8px;
border-radius: 50%; background: #fff;
border: 3px solid #f472b6;
box-shadow: 0 4px 12px rgba(244,114,182,0.4);
cursor: grab;
}
.ps-slr-range::-moz-range-thumb {
width: 22px; height: 22px; border-radius: 50%; background: #fff;
border: 3px solid #f472b6; box-shadow: 0 4px 12px rgba(244,114,182,0.4);
cursor: grab;
}
.ps-slr-range:focus-visible::-webkit-slider-thumb { outline: 3px solid #f9a8d4; outline-offset: 2px; }
.ps-slr-range:focus-visible::-moz-range-thumb { outline: 3px solid #f9a8d4; outline-offset: 2px; }
.ps-slr-ticks {
display: flex; justify-content: space-between;
font-family: 'JetBrains Mono', monospace;
font-size: 10.5px; color: #8a647a;
}
.ps-slr-feats {
list-style: none; padding: 0; margin: 0 0 22px;
font-size: 13px; line-height: 1.9; color: #d8b8cc;
}
.ps-slr-feats li::before {
content: '✦'; color: #f472b6; display: inline-block; width: 20px;
}
.ps-slr-cta {
display: block; text-align: center;
padding: 13px 18px; border-radius: 10px;
background: linear-gradient(135deg, #f472b6, #be185d);
color: #fff; text-decoration: none;
font-size: 14px; font-weight: 700; letter-spacing: 0.02em;
box-shadow: 0 8px 22px rgba(190,24,93,0.35);
transition: transform 0.18s;
}
.ps-slr-cta:hover { transform: translateY(-1px); }
.ps-slr-cta:focus-visible { outline: 2px solid #f9a8d4; outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) {
.ps-slr-cta { transition: none; }
} <section class="ps-slr" aria-label="Usage-based pricing">
<header class="ps-slr-head">
<span class="ps-slr-eye">Pay-as-you-go</span>
<h2>Only pay for what you actually send.</h2>
<p>
Slide to estimate your monthly bill — we round up to the nearest tier so you’re never
surprised.
</p>
</header>
<div class="ps-slr-card">
<div class="ps-slr-stage">
<div class="ps-slr-display">
<span class="ps-slr-label" id="ps-slr-lbl">Estimated monthly cost</span>
<span class="ps-slr-amount"><em>$</em><span id="ps-slr-price">12</span></span>
<span class="ps-slr-detail"
><span id="ps-slr-units">10,000</span> requests on the
<strong id="ps-slr-tier">Starter</strong> tier</span
>
</div>
<div class="ps-slr-track-wrap">
<label class="ps-slr-sr" for="ps-slr-range">Monthly request volume</label>
<input
type="range"
id="ps-slr-range"
class="ps-slr-range"
min="0"
max="100"
step="1"
value="10"
aria-labelledby="ps-slr-lbl"
aria-valuetext="10,000 requests, Starter tier, 12 dollars per month"
/>
<div class="ps-slr-ticks" aria-hidden="true">
<span>10K</span><span>100K</span><span>500K</span><span>1M</span><span>5M+</span>
</div>
</div>
<ul class="ps-slr-feats">
<li>No setup fee, no minimum spend</li>
<li>Auto-tier switching at every milestone</li>
<li>Usage cap option to prevent surprises</li>
</ul>
<a class="ps-slr-cta" href="#start">Start with this plan →</a>
</div>
</div>
</section> (function () {
var range = document.getElementById('ps-slr-range');
var priceEl = document.getElementById('ps-slr-price');
var unitsEl = document.getElementById('ps-slr-units');
var tierEl = document.getElementById('ps-slr-tier');
if (!range || !priceEl) return;
// 5 tiers — index → { units (k), price ($), tier name }
var tiers = [
{ units: 10, price: 12, name: 'Starter' },
{ units: 100, price: 49, name: 'Starter' },
{ units: 500, price: 149, name: 'Growth' },
{ units: 1000, price: 249, name: 'Growth' },
{ units: 5000, price: 749, name: 'Scale' }
];
function fmtUnits(k) { return k >= 1000 ? (k / 1000).toFixed(k % 1000 ? 1 : 0) + 'M' : k.toLocaleString() + 'K'; }
function update() {
var v = parseInt(range.value, 10);
// map 0..100 → 0..4 with stops at 10/30/55/80/100
var idx = v < 25 ? 0 : v < 50 ? 1 : v < 75 ? 2 : v < 95 ? 3 : 4;
var t = tiers[idx];
priceEl.textContent = t.price.toLocaleString();
unitsEl.textContent = fmtUnits(t.units) + ' requests';
// strip the trailing " requests" when re-using textContent below — show only the formatted number
unitsEl.textContent = fmtUnits(t.units);
tierEl.textContent = t.name;
range.style.setProperty('--ps-slr-fill', v + '%');
range.setAttribute('aria-valuetext',
fmtUnits(t.units) + ' requests, ' + t.name + ' tier, ' + t.price + ' dollars per month');
}
range.addEventListener('input', update);
update();
})(); The whole product, flat fee.
Stop comparing tiers. One price. Every feature. Every team member. As long as you need it.
- Unlimited team members
- Unlimited projects & storage
- SSO & SAML included
- SOC 2 & HIPAA ready
- Priority email + chat support
- 30-day money-back guarantee
No demo required. Cancel any time, refund any time within 30 days.
“It paid for itself in the first week. We never looked at the tier ladder again.”
— Maya R., Head of Ops at Northwood
.ps-her {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(60% 60% at 30% 0%, rgba(212,175,55,0.12), transparent 60%),
radial-gradient(50% 50% at 90% 100%, rgba(212,175,55,0.10), transparent 60%),
#0b0b1a;
color: #f4ecd8;
font-family: 'Inter', system-ui, sans-serif;
display: flex; align-items: center; justify-content: center;
}
.ps-her-card {
position: relative;
width: 100%; max-width: 540px;
background: linear-gradient(180deg, #14142a 0%, #0b0b1a 100%);
border: 1px solid #d4af37;
border-radius: 22px;
padding: clamp(28px, 5vw, 44px);
text-align: center;
box-shadow: 0 20px 60px rgba(212,175,55,0.15), inset 0 0 0 1px rgba(212,175,55,0.15);
}
.ps-her-card::before {
content: ''; position: absolute; inset: 0;
border-radius: 22px;
background:
linear-gradient(135deg, transparent 40%, rgba(255,212,121,0.06) 50%, transparent 60%);
pointer-events: none;
}
.ps-her-eye {
display: inline-block;
font-size: 11px; font-weight: 600;
letter-spacing: 0.18em; text-transform: uppercase;
color: #d4af37; padding: 5px 14px;
border: 1px solid rgba(212,175,55,0.4);
border-radius: 999px;
margin-bottom: 18px;
}
.ps-her-card h2 {
font-family: 'Playfair Display', 'Cormorant Garamond', Georgia, serif;
font-size: clamp(28px, 4.5vw, 44px);
font-weight: 700; letter-spacing: -0.01em;
margin: 0 0 14px; color: #fff;
}
.ps-her-card h2 em { color: #d4af37; font-style: italic; }
.ps-her-lead { color: #b8a888; font-size: 14.5px; line-height: 1.6; margin: 0 auto 28px; max-width: 380px; }
.ps-her-price {
display: flex; flex-direction: column; align-items: center;
gap: 4px; margin-bottom: 28px;
padding: 22px 0; border-top: 1px solid rgba(212,175,55,0.18);
border-bottom: 1px solid rgba(212,175,55,0.18);
}
.ps-her-amt {
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(56px, 9vw, 88px); font-weight: 800;
letter-spacing: -0.04em; line-height: 1;
background: linear-gradient(180deg, #ffd479, #d4af37);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-her-amt em { font-size: 0.5em; font-style: normal; vertical-align: top; padding-right: 2px; opacity: 0.85; }
.ps-her-per { font-size: 13px; color: #b8a888; }
.ps-her-feats {
list-style: none; padding: 0; margin: 0 0 28px;
display: grid; grid-template-columns: 1fr 1fr; gap: 10px 22px;
text-align: left; font-size: 13.5px; color: #f4ecd8;
}
.ps-her-feats li::before {
content: '✓'; color: #d4af37; font-weight: 700;
display: inline-block; width: 20px;
}
.ps-her-cta {
display: block;
padding: 14px 20px; border-radius: 10px;
background: linear-gradient(180deg, #ffd479, #d4af37);
color: #0b0b1a; text-decoration: none;
font-size: 15px; font-weight: 700; letter-spacing: 0.01em;
box-shadow: 0 10px 24px rgba(212,175,55,0.3);
transition: transform 0.18s;
}
.ps-her-cta:hover { transform: translateY(-1px); }
.ps-her-cta:focus-visible { outline: 2px solid #ffd479; outline-offset: 3px; }
.ps-her-foot { font-size: 12px; color: #8a8068; margin: 12px 0 26px; }
.ps-her-quote {
margin: 0; padding-top: 22px; border-top: 1px dashed rgba(212,175,55,0.2);
}
.ps-her-quote p {
font-family: 'Playfair Display', Georgia, serif;
font-size: 16px; font-style: italic; color: #f4ecd8;
margin: 0 0 8px; line-height: 1.5;
}
.ps-her-quote cite { font-style: normal; font-size: 12px; color: #8a8068; letter-spacing: 0.05em; }
@media (max-width: 540px) {
.ps-her-feats { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
.ps-her-cta { transition: none; }
} <section class="ps-her" aria-label="Pricing">
<article class="ps-her-card">
<span class="ps-her-eye">One plan · everything included</span>
<h2>The whole product, <em>flat fee.</em></h2>
<p class="ps-her-lead">
Stop comparing tiers. One price. Every feature. Every team member. As long as you need it.
</p>
<div class="ps-her-price">
<span class="ps-her-amt"><em>$</em>249</span>
<span class="ps-her-per">per month, billed annually</span>
</div>
<ul class="ps-her-feats">
<li>Unlimited team members</li>
<li>Unlimited projects & storage</li>
<li>SSO & SAML included</li>
<li>SOC 2 & HIPAA ready</li>
<li>Priority email + chat support</li>
<li>30-day money-back guarantee</li>
</ul>
<a class="ps-her-cta" href="#buy">Buy now — instant access</a>
<p class="ps-her-foot">No demo required. Cancel any time, refund any time within 30 days.</p>
<blockquote class="ps-her-quote">
<p>“It paid for itself in the first week. We never looked at the tier ladder again.”</p>
<cite>— Maya R., Head of Ops at Northwood</cite>
</blockquote>
</article>
</section> Pricing in tiles, not tiers.
One canvas, three offers, and the proof points that make the choice obvious.
Pro
- Unlimited projects
- 100 GB storage
- Priority support
- Custom domains
Free
Build something small, ship it, keep it free.
Start free →Team
Roles, billing, and audit logs for growing companies.
Choose Team →“We tried five tools. This was the only one priced like a partner, not a tax.”
— Lior, CTO at Pulse<article> with semantic content; the layout uses CSS Grid named areas..ps-bnt {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #1a0d0d;
color: #ffe7df;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-bnt-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-bnt-head h2 {
font-size: clamp(22px, 3.4vw, 34px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px;
color: #ffd0bf;
}
.ps-bnt-head p { color: #b89180; margin: 0 auto; max-width: 480px; font-size: 14px; }
.ps-bnt-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: auto auto;
grid-template-areas:
"pro pro free stat"
"pro pro team quote";
gap: 14px;
max-width: 980px; margin: 0 auto;
}
.ps-bnt-tile {
background: #2a1612;
border: 1px solid rgba(255,108,79,0.15);
border-radius: 16px;
padding: 22px 20px;
display: flex; flex-direction: column; justify-content: space-between;
min-height: 130px;
}
.ps-bnt-pro {
grid-area: pro;
background: linear-gradient(135deg, #ff6b4a 0%, #f43f5e 100%);
border: 0;
color: #1a0d0d;
position: relative;
overflow: hidden;
}
.ps-bnt-pro::after {
content: ''; position: absolute; right: -40px; bottom: -40px;
width: 160px; height: 160px; border-radius: 50%;
background: radial-gradient(circle, rgba(255,255,255,0.18), transparent 70%);
pointer-events: none;
}
.ps-bnt-pill {
display: inline-block; align-self: flex-start;
background: #1a0d0d; color: #ff6b4a;
font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; padding: 5px 11px;
border-radius: 999px; margin-bottom: 8px;
}
.ps-bnt-tile h3 { font-size: 13px; letter-spacing: 0.1em; text-transform: uppercase; margin: 0 0 6px; opacity: 0.8; }
.ps-bnt-pro h3 { color: #1a0d0d; opacity: 1; font-weight: 700; }
.ps-bnt-price {
font-size: clamp(36px, 5vw, 56px); font-weight: 800;
letter-spacing: -0.03em; line-height: 1;
margin-bottom: 12px;
}
.ps-bnt-price em { font-size: 0.5em; font-style: normal; vertical-align: top; padding-right: 2px; opacity: 0.7; }
.ps-bnt-price span { font-size: 0.28em; font-weight: 500; opacity: 0.7; margin-left: 6px; }
.ps-bnt-pro ul {
list-style: none; padding: 0; margin: 0 0 18px;
font-size: 13px; line-height: 1.9;
}
.ps-bnt-pro ul li::before { content: '✓'; display: inline-block; width: 20px; font-weight: 700; }
.ps-bnt-tile p {
font-size: 13px; line-height: 1.5; color: #b89180; margin: 0 0 12px;
}
.ps-bnt-cta, .ps-bnt-cta-sm {
display: inline-block; padding: 10px 16px; border-radius: 8px;
text-decoration: none; font-size: 13.5px; font-weight: 600;
border: 1px solid currentColor; color: inherit;
transition: background 0.18s, color 0.18s;
}
.ps-bnt-cta { background: #1a0d0d; color: #ff6b4a; border-color: #1a0d0d; align-self: flex-start; }
.ps-bnt-cta:hover { background: transparent; color: #fff; border-color: #fff; }
.ps-bnt-cta-sm { color: #ff6b4a; border-color: rgba(255,108,79,0.4); padding: 8px 14px; align-self: flex-start; font-size: 12.5px; }
.ps-bnt-cta-sm:hover { background: #ff6b4a; color: #1a0d0d; border-color: #ff6b4a; }
.ps-bnt-cta:focus-visible, .ps-bnt-cta-sm:focus-visible { outline: 2px solid #ffe7df; outline-offset: 3px; }
.ps-bnt-stat { grid-area: stat; align-items: flex-start; background: #2a1612; }
.ps-bnt-stat-num {
font-size: clamp(36px, 5vw, 50px); font-weight: 800;
letter-spacing: -0.03em; color: #ff6b4a;
background: linear-gradient(180deg, #ffb37a, #ff6b4a);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-bnt-stat-lbl { font-size: 12px; color: #b89180; line-height: 1.4; }
.ps-bnt-team { grid-area: team; }
.ps-bnt-free { grid-area: free; }
.ps-bnt-quote {
grid-area: quote;
background: linear-gradient(135deg, #f43f5e 0%, #be123c 100%);
color: #1a0d0d; border: 0;
}
.ps-bnt-quote p { font-style: italic; color: #1a0d0d; font-weight: 500; line-height: 1.5; font-size: 13px; opacity: 0.92; }
.ps-bnt-quote cite { font-style: normal; font-size: 11px; color: rgba(26,13,13,0.7); letter-spacing: 0.05em; }
@media (max-width: 820px) {
.ps-bnt-grid {
grid-template-columns: 1fr 1fr;
grid-template-areas:
"pro pro"
"free team"
"stat quote";
}
}
@media (max-width: 520px) {
.ps-bnt-grid {
grid-template-columns: 1fr;
grid-template-areas:
"pro"
"free"
"team"
"stat"
"quote";
}
} <section class="ps-bnt" aria-label="Pricing">
<header class="ps-bnt-head">
<h2>Pricing in tiles, not tiers.</h2>
<p>One canvas, three offers, and the proof points that make the choice obvious.</p>
</header>
<div class="ps-bnt-grid">
<article class="ps-bnt-tile ps-bnt-pro">
<span class="ps-bnt-pill">Recommended</span>
<h3>Pro</h3>
<div class="ps-bnt-price"><em>$</em>34<span>/mo</span></div>
<ul>
<li>Unlimited projects</li>
<li>100 GB storage</li>
<li>Priority support</li>
<li>Custom domains</li>
</ul>
<a class="ps-bnt-cta" href="#pro">Choose Pro →</a>
</article>
<article class="ps-bnt-tile ps-bnt-free">
<h3>Free</h3>
<div class="ps-bnt-price"><em>$</em>0<span>forever</span></div>
<p>Build something small, ship it, keep it free.</p>
<a class="ps-bnt-cta-sm" href="#free">Start free →</a>
</article>
<article class="ps-bnt-tile ps-bnt-stat">
<span class="ps-bnt-stat-num">14k+</span>
<span class="ps-bnt-stat-lbl">teams pay for Pro every month</span>
</article>
<article class="ps-bnt-tile ps-bnt-team">
<h3>Team</h3>
<div class="ps-bnt-price"><em>$</em>99<span>/mo</span></div>
<p>Roles, billing, and audit logs for growing companies.</p>
<a class="ps-bnt-cta-sm" href="#team">Choose Team →</a>
</article>
<article class="ps-bnt-tile ps-bnt-quote">
<p>“We tried five tools. This was the only one priced like a partner, not a tax.”</p>
<cite>— Lior, CTO at Pulse</cite>
</article>
</div>
</section> Grow into the next plan, not out of one.
Three stops on the same road. Switch up or down with one click.
-
Free
$0Open-source projects, side experiments, anything you want to ship without a credit card.
- 1 project
- 500 MB storage
- Public repos only
-
Pro
$24/moWhere most teams settle. Private projects, real support, and the integrations you actually use.
- Unlimited projects
- 50 GB storage
- Email + chat support
- Slack, GitHub, Linear sync
-
Enterprise
CustomFor teams with procurement processes, security reviews, and quarterly business reviews.
- SSO + SAML + audit logs
- SLA, dedicated CSM
- Custom DPA & invoicing
<ol>/<li> with a numbered milestone, price, and feature list. Reads as a growth path, not a column comparison..ps-tml {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #0a1408;
color: #ecfccb;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-tml-head { text-align: center; margin-bottom: clamp(28px, 5vw, 44px); }
.ps-tml-head h2 {
font-size: clamp(22px, 3.4vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #f7feec;
}
.ps-tml-head p { color: #93a87f; margin: 0; font-size: 14px; }
.ps-tml-line {
position: relative; list-style: none; padding: 0;
margin: 0 auto; max-width: 580px;
}
.ps-tml-line::before {
content: ''; position: absolute; left: 28px; top: 18px; bottom: 18px;
width: 2px; background: linear-gradient(180deg, #84cc16, rgba(132,204,22,0.2));
border-radius: 2px;
}
.ps-tml-stop {
position: relative; padding: 0 0 24px 70px;
min-height: 56px;
}
.ps-tml-stop:last-child { padding-bottom: 0; }
.ps-tml-num {
position: absolute; left: 6px; top: 0;
width: 46px; height: 46px;
border-radius: 50%;
background: #0a1408; border: 2px solid #84cc16;
font-family: 'JetBrains Mono', monospace;
font-size: 13px; font-weight: 700; color: #84cc16;
display: flex; align-items: center; justify-content: center;
z-index: 1;
}
.ps-tml-current .ps-tml-num {
background: #84cc16; color: #0a1408;
box-shadow: 0 0 0 6px rgba(132,204,22,0.18);
}
.ps-tml-pane {
background: #14210e;
border: 1px solid rgba(132,204,22,0.18);
border-radius: 12px;
padding: 18px 18px 16px;
}
.ps-tml-current .ps-tml-pane {
border-color: #84cc16;
background: linear-gradient(180deg, #1a3010, #14210e);
box-shadow: 0 8px 24px rgba(132,204,22,0.12);
}
.ps-tml-pane header {
display: flex; align-items: baseline; justify-content: space-between;
margin-bottom: 8px;
border-bottom: 1px dashed rgba(132,204,22,0.18);
padding-bottom: 10px;
}
.ps-tml-pane h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.06em;
text-transform: uppercase; margin: 0; color: #84cc16;
}
.ps-tml-pri { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; color: #f7feec; }
.ps-tml-pri em { font-size: 12px; font-style: normal; color: #93a87f; font-weight: 500; margin-left: 2px; }
.ps-tml-pane p { font-size: 13px; color: #c8d8b0; margin: 10px 0; line-height: 1.55; }
.ps-tml-pane ul {
list-style: none; padding: 0; margin: 0 0 14px;
font-size: 13px; line-height: 1.85; color: #c8d8b0;
}
.ps-tml-pane ul li::before {
content: '→'; color: #84cc16; display: inline-block; width: 20px; font-weight: 700;
}
.ps-tml-cta {
display: inline-block; padding: 9px 14px; border-radius: 7px;
font-size: 13px; font-weight: 600; text-decoration: none;
border: 1px solid rgba(132,204,22,0.4); color: #84cc16;
background: transparent;
transition: background 0.18s, color 0.18s;
}
.ps-tml-cta:hover { background: rgba(132,204,22,0.15); color: #ecfccb; }
.ps-tml-cta-pri { background: #84cc16; color: #0a1408; border-color: #84cc16; }
.ps-tml-cta-pri:hover { background: #a3e635; color: #0a1408; border-color: #a3e635; }
.ps-tml-cta:focus-visible { outline: 2px solid #a3e635; outline-offset: 3px; } <section class="ps-tml" aria-label="Pricing">
<header class="ps-tml-head">
<h2>Grow into the next plan, not out of one.</h2>
<p>Three stops on the same road. Switch up or down with one click.</p>
</header>
<ol class="ps-tml-line">
<li class="ps-tml-stop">
<span class="ps-tml-num" aria-hidden="true">01</span>
<article class="ps-tml-pane">
<header>
<h3>Free</h3>
<span class="ps-tml-pri">$0</span>
</header>
<p>
Open-source projects, side experiments, anything you want to ship without a credit card.
</p>
<ul>
<li>1 project</li>
<li>500 MB storage</li>
<li>Public repos only</li>
</ul>
<a class="ps-tml-cta" href="#free">Start free →</a>
</article>
</li>
<li class="ps-tml-stop ps-tml-current">
<span class="ps-tml-num" aria-hidden="true">02</span>
<article class="ps-tml-pane">
<header>
<h3>Pro</h3>
<span class="ps-tml-pri">$24<em>/mo</em></span>
</header>
<p>
Where most teams settle. Private projects, real support, and the integrations you actually
use.
</p>
<ul>
<li>Unlimited projects</li>
<li>50 GB storage</li>
<li>Email + chat support</li>
<li>Slack, GitHub, Linear sync</li>
</ul>
<a class="ps-tml-cta ps-tml-cta-pri" href="#pro">Choose Pro →</a>
</article>
</li>
<li class="ps-tml-stop">
<span class="ps-tml-num" aria-hidden="true">03</span>
<article class="ps-tml-pane">
<header>
<h3>Enterprise</h3>
<span class="ps-tml-pri">Custom</span>
</header>
<p>
For teams with procurement processes, security reviews, and quarterly business reviews.
</p>
<ul>
<li>SSO + SAML + audit logs</li>
<li>SLA, dedicated CSM</li>
<li>Custom DPA & invoicing</li>
</ul>
<a class="ps-tml-cta" href="#ent">Talk to sales →</a>
</article>
</li>
</ol>
</section> Three sizes. One product. Pick.
- 1 site, 1 admin
- 5 GB storage
- Forum support
- 10 sites, 5 admins
- 50 GB storage
- Email support
- Custom domain
- Unlimited sites
- 500 GB storage
- Priority support
- White-label
.ps-brt {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
repeating-linear-gradient(0deg, transparent 0, transparent 23px, rgba(0,0,0,0.04) 23px, rgba(0,0,0,0.04) 24px),
repeating-linear-gradient(90deg, transparent 0, transparent 23px, rgba(0,0,0,0.04) 23px, rgba(0,0,0,0.04) 24px),
#f4eccc;
color: #0e0e0e;
font-family: 'JetBrains Mono', 'Courier New', monospace;
}
.ps-brt-head { margin-bottom: clamp(24px, 4vw, 36px); }
.ps-brt-eye {
display: inline-block; font-size: 11px; letter-spacing: 0.18em;
text-transform: uppercase; padding: 4px 10px;
background: #0e0e0e; color: #f4eccc; margin-bottom: 12px;
}
.ps-brt-head h2 {
font-size: clamp(28px, 5vw, 44px); font-weight: 800;
letter-spacing: -0.02em; line-height: 1.1; margin: 0;
text-transform: uppercase;
}
.ps-brt-grid {
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 24px; max-width: 980px; margin: 0 auto;
}
.ps-brt-card {
position: relative;
background: #f4eccc;
border: 2px solid #0e0e0e;
padding: 22px 20px 20px;
box-shadow: 8px 8px 0 0 #0e0e0e;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.ps-brt-card:hover { transform: translate(2px, 2px); box-shadow: 6px 6px 0 0 #0e0e0e; }
.ps-brt-r1 { transform: rotate(-1.2deg); }
.ps-brt-r2 { transform: rotate(0.8deg); }
.ps-brt-r3 { transform: rotate(-0.6deg); }
.ps-brt-pop { background: #facc15; border-color: #0e0e0e; box-shadow: 8px 8px 0 0 #0e0e0e; }
.ps-brt-stamp {
position: absolute; top: -14px; right: -10px;
background: #0e0e0e; color: #facc15;
font-size: 11px; font-weight: 700; letter-spacing: 0.12em;
padding: 5px 12px; transform: rotate(4deg);
text-transform: uppercase;
}
.ps-brt-row {
display: flex; justify-content: space-between; align-items: baseline;
font-size: 12px; padding: 4px 0;
border-bottom: 1px dotted rgba(0,0,0,0.25);
}
.ps-brt-row span { text-transform: uppercase; opacity: 0.7; letter-spacing: 0.06em; }
.ps-brt-row strong { font-size: 14px; font-weight: 700; }
.ps-brt-pri { font-size: 22px !important; font-weight: 800 !important; }
.ps-brt-card hr { border: 0; border-top: 2px solid #0e0e0e; margin: 14px 0 12px; }
.ps-brt-card ul {
list-style: none; padding: 0; margin: 0 0 18px;
font-size: 12.5px; line-height: 1.7;
}
.ps-brt-card ul li::before { content: '▸ '; }
.ps-brt-cta {
display: block; text-align: center;
padding: 11px 16px;
background: #f4eccc; color: #0e0e0e;
border: 2px solid #0e0e0e;
text-decoration: none; font-size: 13px; font-weight: 700;
letter-spacing: 0.06em; text-transform: uppercase;
transition: background 0.15s, color 0.15s;
}
.ps-brt-cta-pri { background: #0e0e0e; color: #facc15; }
.ps-brt-cta:hover { background: #0e0e0e; color: #facc15; }
.ps-brt-cta-pri:hover { background: #facc15; color: #0e0e0e; }
.ps-brt-cta:focus-visible { outline: 3px solid #ff5e5e; outline-offset: 2px; }
@media (max-width: 820px) {
.ps-brt-grid { grid-template-columns: 1fr; max-width: 380px; gap: 32px; }
.ps-brt-r1, .ps-brt-r2, .ps-brt-r3 { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-brt-card { transition: none; }
.ps-brt-card:hover { transform: none; box-shadow: 8px 8px 0 0 #0e0e0e; }
.ps-brt-r1, .ps-brt-r2, .ps-brt-r3 { transform: none; }
} <section class="ps-brt" aria-label="Pricing">
<header class="ps-brt-head">
<span class="ps-brt-eye">issue №07 · pricing</span>
<h2>Three sizes. One product. Pick.</h2>
</header>
<div class="ps-brt-grid">
<article class="ps-brt-card ps-brt-r1">
<div class="ps-brt-row"><span>Plan</span><strong>Solo</strong></div>
<div class="ps-brt-row"><span>Cost</span><strong class="ps-brt-pri">$8/mo</strong></div>
<div class="ps-brt-row"><span>Built for</span><strong>Indie devs</strong></div>
<hr />
<ul>
<li>1 site, 1 admin</li>
<li>5 GB storage</li>
<li>Forum support</li>
</ul>
<a class="ps-brt-cta" href="#solo">[ Buy Solo ]</a>
</article>
<article class="ps-brt-card ps-brt-r2 ps-brt-pop">
<span class="ps-brt-stamp">★ POPULAR</span>
<div class="ps-brt-row"><span>Plan</span><strong>Studio</strong></div>
<div class="ps-brt-row"><span>Cost</span><strong class="ps-brt-pri">$24/mo</strong></div>
<div class="ps-brt-row"><span>Built for</span><strong>Small studios</strong></div>
<hr />
<ul>
<li>10 sites, 5 admins</li>
<li>50 GB storage</li>
<li>Email support</li>
<li>Custom domain</li>
</ul>
<a class="ps-brt-cta ps-brt-cta-pri" href="#studio">[ Buy Studio ]</a>
</article>
<article class="ps-brt-card ps-brt-r3">
<div class="ps-brt-row"><span>Plan</span><strong>Shop</strong></div>
<div class="ps-brt-row"><span>Cost</span><strong class="ps-brt-pri">$60/mo</strong></div>
<div class="ps-brt-row"><span>Built for</span><strong>Agencies</strong></div>
<hr />
<ul>
<li>Unlimited sites</li>
<li>500 GB storage</li>
<li>Priority support</li>
<li>White-label</li>
</ul>
<a class="ps-brt-cta" href="#shop">[ Buy Shop ]</a>
</article>
</div>
</section> Pricing, on the house.
Three tiers, all built on the same calm interface.
Drift
- Personal projects
- 1 GB storage
- Community access
Float
- Unlimited projects
- 30 GB storage
- Priority email support
- Custom domains
Stratos
- Everything in Float
- SSO + audit logs
- Dedicated success manager
backdrop-filter: blur() over layered conic / radial gradients. Ice-blue palette, the high-end consumer-app pricing treatment..ps-aur {
position: relative; overflow: hidden;
contain: layout paint;
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background: #050a1a;
color: #e6f0ff;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-aur-blobs { position: absolute; inset: 0; pointer-events: none; z-index: 0; overflow: hidden; }
.ps-aur-blobs span {
position: absolute; border-radius: 50%;
filter: blur(60px); opacity: 0.7;
animation: ps-aur-drift 22s ease-in-out infinite alternate;
}
.ps-aur-b1 { top: -10%; left: -10%; width: 380px; height: 380px;
background: radial-gradient(circle, #38bdf8 0%, transparent 60%);
animation-delay: -3s;
}
.ps-aur-b2 { top: 20%; right: -8%; width: 320px; height: 320px;
background: radial-gradient(circle, #818cf8 0%, transparent 60%);
animation-delay: -8s;
}
.ps-aur-b3 { bottom: -15%; left: 30%; width: 360px; height: 360px;
background: radial-gradient(circle, #22d3ee 0%, transparent 60%);
animation-delay: -14s;
}
@keyframes ps-aur-drift {
0% { transform: translate(0,0) scale(1); }
50% { transform: translate(40px,-30px) scale(1.08); }
100% { transform: translate(-30px,30px) scale(0.95); }
}
.ps-aur-head { position: relative; z-index: 2; text-align: center; margin-bottom: clamp(28px, 4vw, 44px); }
.ps-aur-head h2 {
font-size: clamp(24px, 3.6vw, 36px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #fff;
}
.ps-aur-head p { color: #b8c4dc; margin: 0; font-size: 14px; }
.ps-aur-grid {
position: relative; z-index: 2;
display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px; max-width: 980px; margin: 0 auto;
align-items: center;
}
.ps-aur-card {
position: relative;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 18px;
padding: 26px 22px 22px;
display: flex; flex-direction: column;
backdrop-filter: blur(20px) saturate(140%);
-webkit-backdrop-filter: blur(20px) saturate(140%);
box-shadow: 0 18px 48px rgba(0,0,0,0.25);
}
.ps-aur-mid {
background: rgba(255,255,255,0.1);
border-color: rgba(56,189,248,0.4);
transform: scale(1.04);
box-shadow: 0 0 0 1px rgba(56,189,248,0.4) inset, 0 22px 56px rgba(56,189,248,0.18);
}
.ps-aur-pill {
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
background: linear-gradient(90deg, #38bdf8, #818cf8);
color: #050a1a;
font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; padding: 5px 12px;
border-radius: 999px;
}
.ps-aur-card h3 {
font-size: 14px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; margin: 0 0 12px; color: #93c5fd;
}
.ps-aur-price {
display: flex; align-items: baseline; gap: 4px;
font-size: 42px; font-weight: 800; letter-spacing: -0.03em;
margin-bottom: 18px; color: #fff;
}
.ps-aur-price em { font-size: 0.5em; font-style: normal; padding-right: 2px; opacity: 0.7; }
.ps-aur-price span { font-size: 0.32em; font-weight: 500; opacity: 0.65; margin-left: 6px; }
.ps-aur-card ul {
list-style: none; padding: 0; margin: 0 0 22px; flex: 1;
font-size: 13.5px; line-height: 1.9; color: #d1ddee;
}
.ps-aur-card ul li::before { content: '◇'; color: #38bdf8; display: inline-block; width: 20px; }
.ps-aur-cta {
display: block; text-align: center;
padding: 11px 16px; border-radius: 10px;
background: rgba(255,255,255,0.08);
color: #93c5fd; text-decoration: none;
font-size: 13.5px; font-weight: 600;
border: 1px solid rgba(147,197,253,0.3);
transition: background 0.18s, color 0.18s;
}
.ps-aur-cta-pri {
background: linear-gradient(90deg, #38bdf8, #818cf8);
color: #050a1a; border-color: transparent;
}
.ps-aur-cta:hover { background: rgba(255,255,255,0.18); color: #fff; }
.ps-aur-cta-pri:hover { background: linear-gradient(90deg, #7dd3fc, #a5b4fc); color: #050a1a; }
.ps-aur-cta:focus-visible { outline: 2px solid #38bdf8; outline-offset: 3px; }
@media (max-width: 820px) {
.ps-aur-grid { grid-template-columns: 1fr; max-width: 380px; }
.ps-aur-mid { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.ps-aur-blobs span { animation: none; }
.ps-aur-cta { transition: none; }
} <section class="ps-aur" aria-label="Pricing">
<div class="ps-aur-blobs" aria-hidden="true">
<span class="ps-aur-b1"></span>
<span class="ps-aur-b2"></span>
<span class="ps-aur-b3"></span>
</div>
<header class="ps-aur-head">
<h2>Pricing, on the house.</h2>
<p>Three tiers, all built on the same calm interface.</p>
</header>
<div class="ps-aur-grid">
<article class="ps-aur-card">
<h3>Drift</h3>
<div class="ps-aur-price"><em>$</em>0<span>free</span></div>
<ul>
<li>Personal projects</li>
<li>1 GB storage</li>
<li>Community access</li>
</ul>
<a class="ps-aur-cta" href="#drift">Get started</a>
</article>
<article class="ps-aur-card ps-aur-mid">
<span class="ps-aur-pill">Recommended</span>
<h3>Float</h3>
<div class="ps-aur-price"><em>$</em>18<span>/mo</span></div>
<ul>
<li>Unlimited projects</li>
<li>30 GB storage</li>
<li>Priority email support</li>
<li>Custom domains</li>
</ul>
<a class="ps-aur-cta ps-aur-cta-pri" href="#float">Choose Float</a>
</article>
<article class="ps-aur-card">
<h3>Stratos</h3>
<div class="ps-aur-price"><em>$</em>56<span>/mo</span></div>
<ul>
<li>Everything in Float</li>
<li>SSO + audit logs</li>
<li>Dedicated success manager</li>
</ul>
<a class="ps-aur-cta" href="#stratos">Talk to sales</a>
</article>
</div>
</section> Per-seat pricing, calculated live.
One number to change. Everything else updates with you.
Billed monthly · cancel any time
Start 14-day trial →aria-label) and the per-seat × seats × cycle cost recomputes live. Indigo + sky palette. The pattern Linear / Notion / Slack use to let buyers self-serve estimates..ps-cal {
padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 40px);
min-height: 480px;
background:
radial-gradient(60% 80% at 80% 0%, rgba(99,102,241,0.18), transparent 60%),
radial-gradient(60% 80% at 0% 100%, rgba(56,189,248,0.14), transparent 60%),
#07091a;
color: #e6e9ff;
font-family: 'Inter', system-ui, sans-serif;
}
.ps-cal-head { text-align: center; margin-bottom: clamp(24px, 4vw, 36px); }
.ps-cal-eye {
display: inline-block; font-size: 11px; font-weight: 700;
letter-spacing: 0.18em; text-transform: uppercase;
color: #818cf8; padding: 5px 12px;
background: rgba(129,140,248,0.12);
border: 1px solid rgba(129,140,248,0.28);
border-radius: 999px; margin-bottom: 14px;
}
.ps-cal-head h2 {
font-size: clamp(22px, 3.4vw, 32px); font-weight: 700;
letter-spacing: -0.02em; margin: 0 0 8px; color: #fff;
}
.ps-cal-head p { color: #9aa3c8; margin: 0; font-size: 14px; }
.ps-cal-card {
display: grid; grid-template-columns: 1.1fr 1fr;
gap: 0;
max-width: 820px; margin: 0 auto;
background: rgba(20,22,48,0.7);
border: 1px solid rgba(129,140,248,0.2);
border-radius: 18px;
overflow: hidden;
box-shadow: 0 24px 60px rgba(0,0,0,0.35);
backdrop-filter: blur(8px);
}
.ps-cal-controls {
padding: clamp(22px, 4vw, 32px);
border-right: 1px solid rgba(129,140,248,0.15);
display: flex; flex-direction: column; gap: 22px;
}
.ps-cal-summary {
padding: clamp(22px, 4vw, 32px);
background: linear-gradient(180deg, rgba(99,102,241,0.1), rgba(56,189,248,0.06));
display: flex; flex-direction: column;
}
.ps-cal-cycle {
border: 1px solid rgba(129,140,248,0.2);
border-radius: 10px; padding: 4px;
display: grid; grid-template-columns: 1fr 1fr; gap: 0;
background: rgba(7,9,26,0.4);
margin: 0;
}
.ps-cal-sr {
position: absolute; width: 1px; height: 1px;
overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.ps-cal-cycle input[type="radio"] { position: absolute; opacity: 0; pointer-events: none; }
.ps-cal-cycle label {
text-align: center; padding: 9px 12px;
font-size: 12.5px; font-weight: 600; color: #9aa3c8;
cursor: pointer; border-radius: 7px;
transition: background 0.18s, color 0.18s;
}
.ps-cal-cycle input:checked + label {
background: linear-gradient(135deg, #6366f1, #38bdf8); color: #fff;
}
.ps-cal-cycle input:focus-visible + label { outline: 2px solid #818cf8; outline-offset: 2px; }
.ps-cal-stp-lbl {
display: block; font-size: 11px; letter-spacing: 0.16em;
text-transform: uppercase; color: #9aa3c8; margin-bottom: 8px;
}
.ps-cal-stp {
display: grid; grid-template-columns: 44px 1fr 44px;
border: 1px solid rgba(129,140,248,0.25);
border-radius: 10px; overflow: hidden;
background: rgba(7,9,26,0.5);
}
.ps-cal-btn {
background: transparent; border: 0; cursor: pointer;
font-size: 22px; font-weight: 700; color: #818cf8;
font-family: inherit;
transition: background 0.15s, color 0.15s;
}
.ps-cal-btn:hover { background: rgba(129,140,248,0.15); color: #fff; }
.ps-cal-btn:focus-visible { outline: 2px solid #818cf8; outline-offset: -2px; }
.ps-cal-btn:disabled { opacity: 0.4; cursor: not-allowed; }
.ps-cal-stp input[type="number"] {
background: transparent; border: 0; outline: 0;
text-align: center; color: #fff;
font-size: 22px; font-weight: 700; letter-spacing: -0.01em;
font-family: inherit;
border-left: 1px solid rgba(129,140,248,0.18);
border-right: 1px solid rgba(129,140,248,0.18);
-moz-appearance: textfield;
}
.ps-cal-stp input::-webkit-outer-spin-button,
.ps-cal-stp input::-webkit-inner-spin-button {
-webkit-appearance: none; margin: 0;
}
.ps-cal-stp input:focus-visible { background: rgba(129,140,248,0.12); }
.ps-cal-stp-hint { display: block; font-size: 11.5px; color: #6c759b; margin-top: 8px; }
.ps-cal-row {
display: flex; justify-content: space-between; align-items: baseline;
padding: 10px 0;
font-size: 13.5px;
}
.ps-cal-row span { color: #9aa3c8; }
.ps-cal-row strong { color: #fff; font-weight: 600; }
.ps-cal-summary hr { border: 0; border-top: 1px dashed rgba(129,140,248,0.25); margin: 4px 0; }
.ps-cal-total span { color: #93c5fd; font-size: 13px; letter-spacing: 0.04em; text-transform: uppercase; }
.ps-cal-total strong {
font-size: clamp(28px, 4vw, 38px); font-weight: 800; letter-spacing: -0.02em;
background: linear-gradient(90deg, #818cf8, #38bdf8);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.ps-cal-foot { font-size: 12px; color: #6c759b; margin: 4px 0 16px; }
.ps-cal-cta {
display: block; text-align: center;
padding: 12px 18px; border-radius: 10px;
background: linear-gradient(135deg, #6366f1, #38bdf8);
color: #fff; text-decoration: none;
font-size: 14px; font-weight: 700;
margin-top: auto;
box-shadow: 0 10px 24px rgba(99,102,241,0.3);
transition: transform 0.18s;
}
.ps-cal-cta:hover { transform: translateY(-1px); }
.ps-cal-cta:focus-visible { outline: 2px solid #818cf8; outline-offset: 3px; }
@media (max-width: 720px) {
.ps-cal-card { grid-template-columns: 1fr; }
.ps-cal-controls { border-right: 0; border-bottom: 1px solid rgba(129,140,248,0.15); }
}
@media (prefers-reduced-motion: reduce) {
.ps-cal-cta, .ps-cal-btn, .ps-cal-cycle label { transition: none; }
} <section class="ps-cal" aria-label="Per-seat calculator">
<header class="ps-cal-head">
<span class="ps-cal-eye">Build your plan</span>
<h2>Per-seat pricing, calculated live.</h2>
<p>One number to change. Everything else updates with you.</p>
</header>
<div class="ps-cal-card">
<div class="ps-cal-controls">
<fieldset class="ps-cal-cycle">
<legend class="ps-cal-sr">Billing cycle</legend>
<input type="radio" name="ps-cal-cycle" id="ps-cal-m" checked />
<label for="ps-cal-m">Monthly</label>
<input type="radio" name="ps-cal-cycle" id="ps-cal-y" />
<label for="ps-cal-y">Yearly · save 25%</label>
</fieldset>
<div class="ps-cal-stepper">
<span class="ps-cal-stp-lbl">Team size</span>
<div class="ps-cal-stp">
<button type="button" class="ps-cal-btn" id="ps-cal-dec" aria-label="Decrease team size">
−
</button>
<input
type="number"
id="ps-cal-seats"
value="5"
min="1"
max="500"
inputmode="numeric"
pattern="[0-9]*"
aria-label="Number of team members"
/>
<button type="button" class="ps-cal-btn" id="ps-cal-inc" aria-label="Increase team size">
+
</button>
</div>
<span class="ps-cal-stp-hint">Up to 500 seats. Above that, we’ll talk.</span>
</div>
</div>
<div class="ps-cal-summary">
<div class="ps-cal-row"><span>Seats</span><strong id="ps-cal-out-seats">5</strong></div>
<div class="ps-cal-row">
<span>Per seat</span><strong id="ps-cal-out-per">$12 /mo</strong>
</div>
<div class="ps-cal-row"><span>Cycle</span><strong id="ps-cal-out-cyc">Monthly</strong></div>
<hr />
<div class="ps-cal-row ps-cal-total">
<span>Total today</span>
<strong id="ps-cal-out-total">$60.00</strong>
</div>
<p class="ps-cal-foot" id="ps-cal-out-foot">Billed monthly · cancel any time</p>
<a class="ps-cal-cta" href="#start">Start 14-day trial →</a>
</div>
</div>
</section> (function () {
var seats = document.getElementById('ps-cal-seats');
var dec = document.getElementById('ps-cal-dec');
var inc = document.getElementById('ps-cal-inc');
var rM = document.getElementById('ps-cal-m');
var rY = document.getElementById('ps-cal-y');
var outSeats= document.getElementById('ps-cal-out-seats');
var outPer = document.getElementById('ps-cal-out-per');
var outCyc = document.getElementById('ps-cal-out-cyc');
var outTot = document.getElementById('ps-cal-out-total');
var outFoot = document.getElementById('ps-cal-out-foot');
if (!seats || !inc) return;
var BASE_MONTHLY = 12; // $12 / seat / mo
var YEARLY_DISC = 0.25; // 25% off when yearly
function clamp(v) {
if (isNaN(v) || v < 1) return 1;
if (v > 500) return 500;
return v;
}
function fmt(n) { return '$' + n.toFixed(2); }
function update() {
var n = clamp(parseInt(seats.value, 10));
seats.value = n;
var yearly = rY.checked;
var per = yearly ? BASE_MONTHLY * (1 - YEARLY_DISC) : BASE_MONTHLY;
var months = yearly ? 12 : 1;
var total = per * n * months;
outSeats.textContent = n + (n === 1 ? ' member' : ' members');
outPer.textContent = '$' + per.toFixed(2) + ' / mo';
outCyc.textContent = yearly ? 'Yearly (–25%)' : 'Monthly';
outTot.textContent = fmt(total);
outFoot.textContent = yearly
? 'Billed yearly · ' + fmt(total) + ' once, then renews annually'
: 'Billed monthly · cancel any time';
dec.disabled = n <= 1;
inc.disabled = n >= 500;
}
dec.addEventListener('click', function () { seats.value = clamp(parseInt(seats.value, 10) - 1); update(); });
inc.addEventListener('click', function () { seats.value = clamp(parseInt(seats.value, 10) + 1); update(); });
seats.addEventListener('input', update);
rM.addEventListener('change', update);
rY.addEventListener('change', update);
update();
})(); Build your own
Tweak the exact look in our visual generators — no signup, instant copy-paste.
Frequently asked questions
What is a CSS pricing section?
Should the middle tier be highlighted?
How do I let users compare features without overwhelming them?
Should pricing toggles (monthly/yearly) be JavaScript or pure CSS?
Are these pricing sections accessible?
Related collections
15 CSS Footer Designs
15 hand-coded CSS footer designs — aurora-drift, newspaper masthead, mega multi-column, CTA stripe, trust badges, vinyl record, neon sign, FAQ drawer, language switcher, hover wave and more. Copy-paste ready.
24 CSS Grid Layouts
24 hand-coded CSS grid layouts — holy grail, 12-column, bento, masonry, subgrid, dashboard, kanban, container queries and more. Pure CSS, copy-paste ready.
30 CSS Hero Sections
30 hand-coded CSS hero sections — gradient mesh, glassmorphism, bento, terminal, parallax, 3D card stack, conic orbit and more. No images, copy-paste ready.