Page Sections pricingsingle-planlifetimeguarantee
Pricing Single Plan
One-plan pricing with price card, struck-through original price, feature checklist and guarantee.
Live Preview
One price. Everything included.
Lifetime access to every component, section and future update.
Lifetime license
Was $249 Now $149
one-time payment
Get lifetime access30-day money-back guarantee. No questions asked.
What’s included
- 250+ components & sections
- 45 dependency-free SVG charts
- Lifetime updates
- Unlimited projects
- Commercial license
- Figma design kit
- Private community
- Priority email support
Usage
Copy and paste this code into your Astro page:
astro
---
import { PricingSinglePlan } from 'astro-component-kit/sections';
---
<PricingSinglePlan
planName="Lifetime license"
price="$149"
originalPrice="$249"
features={['All components', 'Lifetime updates']}
/> ---
import { PricingSinglePlan } from 'astro-component-kit/sections';
---
<PricingSinglePlan
planName="Lifetime license"
price="$149"
originalPrice="$249"
features={['All components', 'Lifetime updates']}
/> Manual Installation
If you are not using the npm package, create a new file and paste the following code: src/components/lib/PricingSinglePlan.astro:
astro
---
/**
* PricingSinglePlan — One-plan pricing section: price card on one side,
* full feature checklist on the other, with a money-back guarantee note.
*
* @param {string} title - Section heading.
* @param {string} subtitle - Section description.
* @param {string} planName - Plan name.
* @param {string} price - Formatted price.
* @param {string} period - Billing period label.
* @param {string} originalPrice - Optional struck-through price.
* @param {string[]} features - Included features.
* @param {{label: string, href: string}} cta - CTA button.
* @param {string} guarantee - Reassurance note under the CTA.
* @param {string} variant - Card style (glow|glass|minimal).
* @param {string} size - Vertical rhythm (sm|md|lg).
* @param {string} className - Extra CSS class.
*/
interface Props {
title?: string;
subtitle?: string;
planName?: string;
price?: string;
period?: string;
originalPrice?: string;
features?: string[];
cta?: { label: string; href: string };
guarantee?: string;
variant?: 'glow' | 'glass' | 'minimal';
size?: 'sm' | 'md' | 'lg';
className?: string;
}
const {
title = 'One price. Everything included.',
subtitle = 'Lifetime access to every component, section and future update.',
planName = 'Lifetime license',
price = '$149',
period = 'one-time payment',
originalPrice = '$249',
features = [
'250+ components & sections',
'45 dependency-free SVG charts',
'Lifetime updates',
'Unlimited projects',
'Commercial license',
'Figma design kit',
'Private community',
'Priority email support',
],
cta = { label: 'Get lifetime access', href: '#' },
guarantee = '30-day money-back guarantee. No questions asked.',
variant = 'glow',
size = 'md',
className = '',
} = Astro.props;
const id = `psp-${Math.random().toString(36).slice(2, 8)}`;
---
<div class="cq-pricing-single-plan-cq">
<section class={`psp psp--${variant} psp--${size} ${className}`} aria-labelledby={id}>
<div class="psp__inner">
<header class="psp__head">
<h2 id={id} class="psp__title">{title}</h2>
<p class="psp__subtitle">{subtitle}</p>
</header>
<div class="psp__card">
<div class="psp__price-col">
<p class="psp__plan">{planName}</p>
<p class="psp__price">
{originalPrice && <s class="psp__orig"><span class="psp__sr">Was </span>{originalPrice}</s>}
<span class="psp__amount"><span class="psp__sr">Now </span>{price}</span>
</p>
<p class="psp__period">{period}</p>
<a class="psp__cta" href={cta.href}>{cta.label}</a>
<p class="psp__guarantee">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" /><path d="m9 12 2 2 4-4" /></svg>
{guarantee}
</p>
</div>
<div class="psp__features-col">
<h3 class="psp__features-title">What’s included</h3>
<ul class="psp__features">
{features.map((f) => (
<li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5" /></svg>{f}</li>
))}
</ul>
</div>
</div>
</div>
</section>
</div>
<style>
.cq-pricing-single-plan-cq { container-type: inline-size; }
.psp {
--psp-py: 5.5rem;
padding: var(--psp-py) var(--sp-6, 1.5rem);
background: var(--c-bg, #050505);
}
.psp--sm { --psp-py: 3.5rem; }
.psp--lg { --psp-py: 7.5rem; }
.psp__inner { max-width: 960px; margin: 0 auto; }
.psp__head { text-align: center; margin-bottom: 3rem; }
.psp__title { margin: 0 0 0.75rem; font-size: clamp(1.9rem, 4vw, 2.75rem); font-weight: 800; letter-spacing: -0.03em; color: var(--c-text-1, #fff); }
.psp__subtitle { margin: 0; font-size: 1.0625rem; color: var(--c-text-2, #a3a3a3); }
.psp__card {
position: relative;
display: grid;
grid-template-columns: 1fr 1.3fr;
border-radius: var(--r-xl, 28px);
overflow: hidden;
border: 1px solid var(--c-border, rgb(var(--ink-rgb, 255 255 255) / 0.08));
background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
}
.psp--glow .psp__card { border-color: color-mix(in srgb, var(--c-primary-light, #d4a017) 35%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-primary-light, #d4a017) 8%, transparent), 0 40px 100px -40px color-mix(in srgb, var(--c-primary-light, #d4a017) 40%, transparent); }
.psp--glass .psp__card { backdrop-filter: blur(16px); background: linear-gradient(160deg, rgb(var(--ink-rgb, 255 255 255) / 0.06), rgb(var(--ink-rgb, 255 255 255) / 0.015)); }
.psp--minimal .psp__card { background: transparent; }
.psp__price-col {
display: flex;
flex-direction: column;
justify-content: center;
padding: clamp(2rem, 5vw, 3rem);
background: radial-gradient(circle at 30% 0%, var(--c-primary-glow, color-mix(in srgb, var(--c-primary, #b8860b) 18%, transparent)), transparent 70%), rgb(var(--ink-rgb, 255 255 255) / 0.02);
border-right: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
}
.psp__plan { margin: 0 0 1rem; font-size: 0.875rem; font-weight: 650; letter-spacing: 0.06em; text-transform: uppercase; color: var(--c-primary-light, #d4a017); }
.psp__price { display: flex; align-items: baseline; gap: 0.75rem; margin: 0; }
.psp__orig { font-size: 1.25rem; color: var(--c-text-3, #8a8a8a); }
.psp__amount { font-size: clamp(3rem, 7vw, 4rem); font-weight: 800; letter-spacing: -0.04em; color: var(--c-text-1, #fff); line-height: 1; }
.psp__period { margin: 0.5rem 0 2rem; font-size: 0.9rem; color: var(--c-text-2, #a3a3a3); }
.psp__cta {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 52px;
border-radius: var(--r-md, 12px);
background: var(--c-primary-light, #d4a017);
color: var(--c-on-primary, #0a0a0a);
font-weight: 700;
text-decoration: none;
transition: background 0.2s ease, transform 0.2s ease;
}
.psp__cta:hover { background: var(--c-accent, #fef3c7); color: var(--c-on-primary, #0a0a0a); transform: translateY(-1px); }
.psp__cta:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 3px; }
.psp__guarantee { display: flex; align-items: flex-start; gap: 0.5rem; margin: 1.25rem 0 0; font-size: 0.8125rem; line-height: 1.5; color: var(--c-text-2, #a3a3a3); }
.psp__guarantee svg { color: var(--chart-pos, #34c38f); flex-shrink: 0; margin-top: 1px; }
.psp__features-col { padding: clamp(2rem, 5vw, 3rem); }
.psp__features-title { margin: 0 0 1.5rem; font-size: 1rem; font-weight: 650; color: var(--c-text-1, #fff); }
.psp__features { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 1rem 1.5rem; }
.psp__features li { display: flex; align-items: flex-start; gap: 0.6rem; font-size: 0.9375rem; line-height: 1.4; color: var(--c-text-1, #fff); }
.psp__features svg { color: var(--c-primary-light, #d4a017); flex-shrink: 0; }
.psp__sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
@container (max-width: 760px) {
.psp__card { grid-template-columns: 1fr; }
.psp__price-col { border-right: 0; border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06); }
.psp__features { grid-template-columns: 1fr; }
}
</style> ---
/**
* PricingSinglePlan — One-plan pricing section: price card on one side,
* full feature checklist on the other, with a money-back guarantee note.
*
* @param {string} title - Section heading.
* @param {string} subtitle - Section description.
* @param {string} planName - Plan name.
* @param {string} price - Formatted price.
* @param {string} period - Billing period label.
* @param {string} originalPrice - Optional struck-through price.
* @param {string[]} features - Included features.
* @param {{label: string, href: string}} cta - CTA button.
* @param {string} guarantee - Reassurance note under the CTA.
* @param {string} variant - Card style (glow|glass|minimal).
* @param {string} size - Vertical rhythm (sm|md|lg).
* @param {string} className - Extra CSS class.
*/
interface Props {
title?: string;
subtitle?: string;
planName?: string;
price?: string;
period?: string;
originalPrice?: string;
features?: string[];
cta?: { label: string; href: string };
guarantee?: string;
variant?: 'glow' | 'glass' | 'minimal';
size?: 'sm' | 'md' | 'lg';
className?: string;
}
const {
title = 'One price. Everything included.',
subtitle = 'Lifetime access to every component, section and future update.',
planName = 'Lifetime license',
price = '$149',
period = 'one-time payment',
originalPrice = '$249',
features = [
'250+ components & sections',
'45 dependency-free SVG charts',
'Lifetime updates',
'Unlimited projects',
'Commercial license',
'Figma design kit',
'Private community',
'Priority email support',
],
cta = { label: 'Get lifetime access', href: '#' },
guarantee = '30-day money-back guarantee. No questions asked.',
variant = 'glow',
size = 'md',
className = '',
} = Astro.props;
const id = `psp-${Math.random().toString(36).slice(2, 8)}`;
---
<div class="cq-pricing-single-plan-cq">
<section class={`psp psp--${variant} psp--${size} ${className}`} aria-labelledby={id}>
<div class="psp__inner">
<header class="psp__head">
<h2 id={id} class="psp__title">{title}</h2>
<p class="psp__subtitle">{subtitle}</p>
</header>
<div class="psp__card">
<div class="psp__price-col">
<p class="psp__plan">{planName}</p>
<p class="psp__price">
{originalPrice && <s class="psp__orig"><span class="psp__sr">Was </span>{originalPrice}</s>}
<span class="psp__amount"><span class="psp__sr">Now </span>{price}</span>
</p>
<p class="psp__period">{period}</p>
<a class="psp__cta" href={cta.href}>{cta.label}</a>
<p class="psp__guarantee">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" /><path d="m9 12 2 2 4-4" /></svg>
{guarantee}
</p>
</div>
<div class="psp__features-col">
<h3 class="psp__features-title">What’s included</h3>
<ul class="psp__features">
{features.map((f) => (
<li><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5" /></svg>{f}</li>
))}
</ul>
</div>
</div>
</div>
</section>
</div>
<style>
.cq-pricing-single-plan-cq { container-type: inline-size; }
.psp {
--psp-py: 5.5rem;
padding: var(--psp-py) var(--sp-6, 1.5rem);
background: var(--c-bg, #050505);
}
.psp--sm { --psp-py: 3.5rem; }
.psp--lg { --psp-py: 7.5rem; }
.psp__inner { max-width: 960px; margin: 0 auto; }
.psp__head { text-align: center; margin-bottom: 3rem; }
.psp__title { margin: 0 0 0.75rem; font-size: clamp(1.9rem, 4vw, 2.75rem); font-weight: 800; letter-spacing: -0.03em; color: var(--c-text-1, #fff); }
.psp__subtitle { margin: 0; font-size: 1.0625rem; color: var(--c-text-2, #a3a3a3); }
.psp__card {
position: relative;
display: grid;
grid-template-columns: 1fr 1.3fr;
border-radius: var(--r-xl, 28px);
overflow: hidden;
border: 1px solid var(--c-border, rgb(var(--ink-rgb, 255 255 255) / 0.08));
background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
}
.psp--glow .psp__card { border-color: color-mix(in srgb, var(--c-primary-light, #d4a017) 35%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-primary-light, #d4a017) 8%, transparent), 0 40px 100px -40px color-mix(in srgb, var(--c-primary-light, #d4a017) 40%, transparent); }
.psp--glass .psp__card { backdrop-filter: blur(16px); background: linear-gradient(160deg, rgb(var(--ink-rgb, 255 255 255) / 0.06), rgb(var(--ink-rgb, 255 255 255) / 0.015)); }
.psp--minimal .psp__card { background: transparent; }
.psp__price-col {
display: flex;
flex-direction: column;
justify-content: center;
padding: clamp(2rem, 5vw, 3rem);
background: radial-gradient(circle at 30% 0%, var(--c-primary-glow, color-mix(in srgb, var(--c-primary, #b8860b) 18%, transparent)), transparent 70%), rgb(var(--ink-rgb, 255 255 255) / 0.02);
border-right: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
}
.psp__plan { margin: 0 0 1rem; font-size: 0.875rem; font-weight: 650; letter-spacing: 0.06em; text-transform: uppercase; color: var(--c-primary-light, #d4a017); }
.psp__price { display: flex; align-items: baseline; gap: 0.75rem; margin: 0; }
.psp__orig { font-size: 1.25rem; color: var(--c-text-3, #8a8a8a); }
.psp__amount { font-size: clamp(3rem, 7vw, 4rem); font-weight: 800; letter-spacing: -0.04em; color: var(--c-text-1, #fff); line-height: 1; }
.psp__period { margin: 0.5rem 0 2rem; font-size: 0.9rem; color: var(--c-text-2, #a3a3a3); }
.psp__cta {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 52px;
border-radius: var(--r-md, 12px);
background: var(--c-primary-light, #d4a017);
color: var(--c-on-primary, #0a0a0a);
font-weight: 700;
text-decoration: none;
transition: background 0.2s ease, transform 0.2s ease;
}
.psp__cta:hover { background: var(--c-accent, #fef3c7); color: var(--c-on-primary, #0a0a0a); transform: translateY(-1px); }
.psp__cta:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 3px; }
.psp__guarantee { display: flex; align-items: flex-start; gap: 0.5rem; margin: 1.25rem 0 0; font-size: 0.8125rem; line-height: 1.5; color: var(--c-text-2, #a3a3a3); }
.psp__guarantee svg { color: var(--chart-pos, #34c38f); flex-shrink: 0; margin-top: 1px; }
.psp__features-col { padding: clamp(2rem, 5vw, 3rem); }
.psp__features-title { margin: 0 0 1.5rem; font-size: 1rem; font-weight: 650; color: var(--c-text-1, #fff); }
.psp__features { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 1rem 1.5rem; }
.psp__features li { display: flex; align-items: flex-start; gap: 0.6rem; font-size: 0.9375rem; line-height: 1.4; color: var(--c-text-1, #fff); }
.psp__features svg { color: var(--c-primary-light, #d4a017); flex-shrink: 0; }
.psp__sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
@container (max-width: 760px) {
.psp__card { grid-template-columns: 1fr; }
.psp__price-col { border-right: 0; border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06); }
.psp__features { grid-template-columns: 1fr; }
}
</style>
Quick Info
- Category
- Page Sections
- Filename
PricingSinglePlan.astro- Dependencies
- None — pure Astro + CSS
- Tags
- pricingsingle-planlifetimeguarantee