|
| 1 | +--- |
| 2 | +import { formatCount, formatHistory, formatRetention, pricingPlans } from "../data/pricing"; |
| 3 | +--- |
| 4 | + |
| 5 | +<section class="mx-auto max-w-7xl px-6 py-28"> |
| 6 | + <div class="mx-auto max-w-3xl text-center"> |
| 7 | + <p class="mb-5 inline-flex items-center gap-3 border border-white/10 bg-white/4 px-4 py-2 text-xs uppercase tracking-[0.35em] text-on-surface-variant backdrop-blur"> |
| 8 | + <span class="h-2 w-2 rounded-full bg-primary pulse-dot"></span> |
| 9 | + Pricing & limits |
| 10 | + </p> |
| 11 | + <h1 class="font-headline text-5xl font-bold leading-[0.92] tracking-[-0.08em] md:text-7xl"> |
| 12 | + Pick the tier that fits your |
| 13 | + <span class="text-primary"> live traffic shape.</span> |
| 14 | + </h1> |
| 15 | + <p class="mx-auto mt-6 max-w-2xl text-lg leading-8 text-on-surface-variant"> |
| 16 | + These plans are generated from the shared limit configuration used by Livedot itself, so the page reflects the actual site, connection, retention, and history ceilings defined in code. |
| 17 | + </p> |
| 18 | + </div> |
| 19 | + |
| 20 | + <div class="mt-16 grid gap-5 lg:grid-cols-2 xl:grid-cols-4"> |
| 21 | + {pricingPlans.map((plan) => ( |
| 22 | + <article |
| 23 | + class:list={[ |
| 24 | + "grid-panel relative flex h-full flex-col border p-8", |
| 25 | + plan.featured |
| 26 | + ? "border-primary/35 bg-primary/[0.08] shadow-[0_0_40px_rgba(174,252,45,0.08)]" |
| 27 | + : "border-white/8 bg-surface-container", |
| 28 | + ]} |
| 29 | + > |
| 30 | + <div class="relative z-10 flex h-full flex-col"> |
| 31 | + <div class="flex items-start justify-between gap-4"> |
| 32 | + <div> |
| 33 | + <p class="text-xs uppercase tracking-[0.32em] text-on-surface-variant">{plan.mode}</p> |
| 34 | + <h2 class="mt-3 font-headline text-3xl font-bold tracking-[-0.05em]">{plan.label}</h2> |
| 35 | + </div> |
| 36 | + {plan.featured && ( |
| 37 | + <span class="rounded-full border border-primary/30 bg-primary/12 px-3 py-1 text-xs font-medium uppercase tracking-[0.25em] text-primary"> |
| 38 | + Popular |
| 39 | + </span> |
| 40 | + )} |
| 41 | + </div> |
| 42 | + |
| 43 | + <p class="mt-6 min-h-[3.5rem] text-lg leading-7 text-white">{plan.headline}</p> |
| 44 | + <p class="mt-3 min-h-[4.5rem] text-sm leading-6 text-on-surface-variant">{plan.summary}</p> |
| 45 | + |
| 46 | + <ul class="mt-8 space-y-3 border-t border-white/8 pt-6 text-sm leading-6 text-on-surface-variant"> |
| 47 | + <li>{formatCount(plan.config.maxWebsites, "websites")}</li> |
| 48 | + <li>{formatCount(plan.config.maxConnectionsPerSite, "connections per site")}</li> |
| 49 | + <li>{formatRetention(plan.config.eventRetentionMs)}</li> |
| 50 | + <li>{formatHistory(plan.config.historyMax)}</li> |
| 51 | + </ul> |
| 52 | + |
| 53 | + <div class="mt-8 pt-2"> |
| 54 | + <a |
| 55 | + href={plan.ctaHref} |
| 56 | + class:list={[ |
| 57 | + "inline-flex w-full items-center justify-center rounded-md px-5 py-3 font-headline text-sm font-semibold tracking-[-0.03em] transition-all", |
| 58 | + plan.featured |
| 59 | + ? "bg-primary text-on-primary-container hover:bg-primary-container" |
| 60 | + : "border border-outline-variant/60 bg-surface text-white hover:border-primary/40 hover:bg-surface-container-high", |
| 61 | + ]} |
| 62 | + > |
| 63 | + {plan.ctaLabel} |
| 64 | + </a> |
| 65 | + </div> |
| 66 | + </div> |
| 67 | + </article> |
| 68 | + ))} |
| 69 | + </div> |
| 70 | + |
| 71 | + <div class="mt-12 grid gap-5 lg:grid-cols-[1.3fr_0.7fr]"> |
| 72 | + <div class="grid-panel border border-white/8 bg-surface-container-high p-8"> |
| 73 | + <p class="text-xs uppercase tracking-[0.32em] text-on-surface-variant">How to choose</p> |
| 74 | + <h2 class="mt-4 font-headline text-3xl font-bold tracking-[-0.05em]">Community for control, cloud tiers for managed capacity.</h2> |
| 75 | + <p class="mt-4 max-w-3xl text-base leading-7 text-on-surface-variant"> |
| 76 | + The community edition stays uncapped because you operate the infrastructure yourself. The hosted tiers are segmented by how many sites, concurrent users, and retained events you need to watch in real time. |
| 77 | + </p> |
| 78 | + </div> |
| 79 | + |
| 80 | + <div class="grid-panel border border-primary/20 bg-primary/[0.06] p-8"> |
| 81 | + <p class="text-xs uppercase tracking-[0.32em] text-primary">Need more?</p> |
| 82 | + <h2 class="mt-4 font-headline text-3xl font-bold tracking-[-0.05em]">Custom rollout</h2> |
| 83 | + <p class="mt-4 text-base leading-7 text-on-surface-variant"> |
| 84 | + If your traffic profile exceeds the published tiers, reach out for a custom plan and rollout support. |
| 85 | + </p> |
| 86 | + <a |
| 87 | + href="mailto:hello@livedot.dev" |
| 88 | + class="mt-8 inline-flex items-center justify-center rounded-md bg-primary px-5 py-3 font-headline text-sm font-semibold tracking-[-0.03em] text-on-primary-container transition-all hover:bg-primary-container" |
| 89 | + > |
| 90 | + Contact sales |
| 91 | + </a> |
| 92 | + </div> |
| 93 | + </div> |
| 94 | +</section> |
0 commit comments