1 estrella en GitHub = 1 componente nuevo.

Dar una estrella
Tablas de Precios

Pricing Single Plan

Precio de plan único con tarjeta, precio original tachado, lista de funciones y garantía.

pricingsingle-planlifetimeguarantee
Vista Previa en Vivo

One price. Everything included.

Lifetime access to every component, section and future update.

Lifetime license

Was $249 Now $149

one-time payment

Get lifetime access

30-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

Uso

Copia y pega este código directamente en tu página de Astro:

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']} />

Instalación Manual

Si no estás usando el paquete npm, crea un archivo nuevo y pega el siguiente código: src/components/sections/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>