@burdenoff/website-sdk 0.0.0-dev → 2026.511.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/index.js +0 -1
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +0 -1
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/client/index.d.mts +2 -5
- package/dist/client/index.d.ts +2 -5
- package/dist/client/index.js +2 -11
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +2 -11
- package/dist/client/index.mjs.map +1 -1
- package/dist/components/contact.d.mts +2 -77
- package/dist/components/contact.d.ts +2 -77
- package/dist/components/contact.js +9 -112
- package/dist/components/contact.js.map +1 -1
- package/dist/components/contact.mjs +10 -112
- package/dist/components/contact.mjs.map +1 -1
- package/dist/components/newsletter.js +6 -17
- package/dist/components/newsletter.js.map +1 -1
- package/dist/components/newsletter.mjs +6 -17
- package/dist/components/newsletter.mjs.map +1 -1
- package/dist/components/pricing.d.mts +0 -38
- package/dist/components/pricing.d.ts +0 -38
- package/dist/components/pricing.js +84 -267
- package/dist/components/pricing.js.map +1 -1
- package/dist/components/pricing.mjs +84 -267
- package/dist/components/pricing.mjs.map +1 -1
- package/dist/components/waitlist.js +2 -6
- package/dist/components/waitlist.js.map +1 -1
- package/dist/components/waitlist.mjs +2 -6
- package/dist/components/waitlist.mjs.map +1 -1
- package/dist/content/index.d.mts +9 -181
- package/dist/content/index.d.ts +9 -181
- package/dist/content/index.js +16 -2177
- package/dist/content/index.js.map +1 -1
- package/dist/content/index.mjs +6 -2141
- package/dist/content/index.mjs.map +1 -1
- package/dist/index.d.mts +5 -43
- package/dist/index.d.ts +5 -43
- package/dist/index.js +373 -3919
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +378 -3905
- package/dist/index.mjs.map +1 -1
- package/dist/product/index.d.mts +0 -8
- package/dist/product/index.d.ts +0 -8
- package/dist/product/index.js +4 -24
- package/dist/product/index.js.map +1 -1
- package/dist/product/index.mjs +4 -24
- package/dist/product/index.mjs.map +1 -1
- package/package.json +3 -5
- package/dist/components/electron-download.d.mts +0 -32
- package/dist/components/electron-download.d.ts +0 -32
- package/dist/components/electron-download.js +0 -131
- package/dist/components/electron-download.js.map +0 -1
- package/dist/components/electron-download.mjs +0 -108
- package/dist/components/electron-download.mjs.map +0 -1
- package/dist/components/launch-countdown.d.mts +0 -15
- package/dist/components/launch-countdown.d.ts +0 -15
- package/dist/components/launch-countdown.js +0 -89
- package/dist/components/launch-countdown.js.map +0 -1
- package/dist/components/launch-countdown.mjs +0 -87
- package/dist/components/launch-countdown.mjs.map +0 -1
- package/dist/components/partners.d.mts +0 -88
- package/dist/components/partners.d.ts +0 -88
- package/dist/components/partners.js +0 -1169
- package/dist/components/partners.js.map +0 -1
- package/dist/components/partners.mjs +0 -1143
- package/dist/components/partners.mjs.map +0 -1
- package/dist/components/problems-solved.d.mts +0 -37
- package/dist/components/problems-solved.d.ts +0 -37
- package/dist/components/problems-solved.js +0 -157
- package/dist/components/problems-solved.js.map +0 -1
- package/dist/components/problems-solved.mjs +0 -135
- package/dist/components/problems-solved.mjs.map +0 -1
- package/dist/components/resource-links.d.mts +0 -28
- package/dist/components/resource-links.d.ts +0 -28
- package/dist/components/resource-links.js +0 -229
- package/dist/components/resource-links.js.map +0 -1
- package/dist/components/resource-links.mjs +0 -227
- package/dist/components/resource-links.mjs.map +0 -1
- package/dist/components/social-links.d.mts +0 -37
- package/dist/components/social-links.d.ts +0 -37
- package/dist/components/social-links.js +0 -268
- package/dist/components/social-links.js.map +0 -1
- package/dist/components/social-links.mjs +0 -266
- package/dist/components/social-links.mjs.map +0 -1
- package/dist/components/website-switcher.d.mts +0 -27
- package/dist/components/website-switcher.d.ts +0 -27
- package/dist/components/website-switcher.js +0 -168
- package/dist/components/website-switcher.js.map +0 -1
- package/dist/components/website-switcher.mjs +0 -146
- package/dist/components/website-switcher.mjs.map +0 -1
|
@@ -253,9 +253,9 @@ var Button = React.forwardRef(
|
|
|
253
253
|
}
|
|
254
254
|
);
|
|
255
255
|
Button.displayName = "Button";
|
|
256
|
-
var
|
|
257
|
-
query
|
|
258
|
-
|
|
256
|
+
var GET_ALL_PLANS_QUERY = `
|
|
257
|
+
query GetAllPlans {
|
|
258
|
+
getAllPlans {
|
|
259
259
|
id
|
|
260
260
|
name
|
|
261
261
|
price
|
|
@@ -300,15 +300,11 @@ function formatInterval(duration, billingIntervals) {
|
|
|
300
300
|
const intervals = billingIntervals || defaultIntervals;
|
|
301
301
|
return intervals[duration] || `/${duration}`;
|
|
302
302
|
}
|
|
303
|
-
function isEnterprisePlan(planName) {
|
|
304
|
-
const name = planName.toLowerCase();
|
|
305
|
-
return name.includes("team") || name.includes("business") || name.includes("enterprise");
|
|
306
|
-
}
|
|
307
303
|
function detectPlanTier(planName) {
|
|
308
304
|
const name = planName.toLowerCase();
|
|
309
|
-
if (name.includes("
|
|
305
|
+
if (name.includes("basic") || name.includes("starter")) {
|
|
310
306
|
return "basic";
|
|
311
|
-
} else if (name.includes("pro") || name.includes("professional") || name.includes("premium")
|
|
307
|
+
} else if (name.includes("pro") || name.includes("professional") || name.includes("premium")) {
|
|
312
308
|
return "professional";
|
|
313
309
|
} else if (name.includes("enterprise") || name.includes("business")) {
|
|
314
310
|
return "enterprise";
|
|
@@ -328,8 +324,7 @@ function getMetadataForPlan(planName, planMetadata) {
|
|
|
328
324
|
defaultDescription: meta.defaultDescription || "Choose this plan",
|
|
329
325
|
popular: meta.popular ?? false,
|
|
330
326
|
ctaText: meta.ctaText || "Get Started",
|
|
331
|
-
ctaType: meta.ctaType || "signup"
|
|
332
|
-
features: meta.features
|
|
327
|
+
ctaType: meta.ctaType || "signup"
|
|
333
328
|
};
|
|
334
329
|
}
|
|
335
330
|
const tier = detectPlanTier(planName);
|
|
@@ -352,54 +347,37 @@ function getMetadataForPlan(planName, planMetadata) {
|
|
|
352
347
|
ctaType: "signup"
|
|
353
348
|
};
|
|
354
349
|
}
|
|
355
|
-
function humanizeQuotaName(name) {
|
|
356
|
-
const parts = name.split(".");
|
|
357
|
-
const resource = parts.length >= 3 ? parts[parts.length - 2] : parts[parts.length - 1];
|
|
358
|
-
return resource.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
359
|
-
}
|
|
360
350
|
function transformQuotaToFeature(quota) {
|
|
361
351
|
const { name, limits } = quota;
|
|
362
352
|
if (!limits || typeof limits !== "object") {
|
|
363
|
-
return
|
|
353
|
+
return name;
|
|
364
354
|
}
|
|
365
355
|
const limitsObj = limits;
|
|
366
356
|
const value = limitsObj.value;
|
|
367
357
|
const unit = limitsObj.unit;
|
|
368
358
|
const type = limitsObj.type;
|
|
369
359
|
const description = limitsObj.description;
|
|
370
|
-
if (
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
return description;
|
|
375
|
-
}
|
|
376
|
-
if (typeof unit === "string" && unit) {
|
|
377
|
-
if (typeof value === "number") {
|
|
378
|
-
return `${value.toLocaleString()} ${unit}`;
|
|
379
|
-
}
|
|
380
|
-
return `${unit}`;
|
|
381
|
-
}
|
|
382
|
-
const label = humanizeQuotaName(name);
|
|
383
|
-
if (type === "boolean") {
|
|
384
|
-
return label;
|
|
360
|
+
if (type === "number" && typeof value === "number") {
|
|
361
|
+
const formattedValue = value.toLocaleString();
|
|
362
|
+
return `${formattedValue} ${unit || ""}${description ? " - " + description : ""}`.trim();
|
|
363
|
+
} else if (type === "boolean") {
|
|
364
|
+
return typeof description === "string" && description || name;
|
|
385
365
|
}
|
|
386
366
|
if (typeof value === "number") {
|
|
387
|
-
|
|
367
|
+
const formattedValue = value.toLocaleString();
|
|
368
|
+
return `${name}: ${formattedValue} ${unit || ""}`.trim();
|
|
388
369
|
}
|
|
389
|
-
return
|
|
370
|
+
return name;
|
|
390
371
|
}
|
|
391
372
|
function extractDisplayFeatures(features, planName, fallbackFeatures) {
|
|
392
|
-
const tier = detectPlanTier(planName);
|
|
393
|
-
if (tier) {
|
|
394
|
-
const tierFeatures = getFallbackFeaturesForTier(tier, fallbackFeatures);
|
|
395
|
-
if (tierFeatures.length > 0) {
|
|
396
|
-
return tierFeatures;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
373
|
const quotaFeatures = features.filter((f) => f.quota).map((f) => transformQuotaToFeature(f.quota));
|
|
400
374
|
if (quotaFeatures.length > 0) {
|
|
401
375
|
return quotaFeatures;
|
|
402
376
|
}
|
|
377
|
+
const tier = detectPlanTier(planName);
|
|
378
|
+
if (tier) {
|
|
379
|
+
return getFallbackFeaturesForTier(tier, fallbackFeatures);
|
|
380
|
+
}
|
|
403
381
|
return [];
|
|
404
382
|
}
|
|
405
383
|
function transformToDisplayCard(plan, props) {
|
|
@@ -410,7 +388,7 @@ function transformToDisplayCard(plan, props) {
|
|
|
410
388
|
props.currencies
|
|
411
389
|
);
|
|
412
390
|
const interval = formatInterval(plan.duration, props.billingIntervals);
|
|
413
|
-
const features =
|
|
391
|
+
const features = extractDisplayFeatures(
|
|
414
392
|
plan.features,
|
|
415
393
|
plan.name,
|
|
416
394
|
props.fallbackFeatures
|
|
@@ -448,25 +426,22 @@ function PricingSection(props) {
|
|
|
448
426
|
const [billingCycle, setBillingCycle] = useState(
|
|
449
427
|
"monthly"
|
|
450
428
|
);
|
|
451
|
-
const [audience, setAudience] = useState(
|
|
452
|
-
"individual"
|
|
453
|
-
);
|
|
454
429
|
useEffect(() => {
|
|
455
430
|
let cancelled = false;
|
|
456
431
|
async function loadPlans() {
|
|
457
432
|
try {
|
|
458
433
|
setLoading(true);
|
|
459
|
-
const response = await client.query(
|
|
460
|
-
productId: resolvedProductId
|
|
461
|
-
});
|
|
434
|
+
const response = await client.query(GET_ALL_PLANS_QUERY);
|
|
462
435
|
if (cancelled) return;
|
|
463
436
|
if (response.errors && response.errors.length > 0) {
|
|
464
437
|
throw new Error(response.errors[0].message);
|
|
465
438
|
}
|
|
466
|
-
if (!response.data?.
|
|
439
|
+
if (!response.data?.getAllPlans) {
|
|
467
440
|
throw new Error("No plans data received");
|
|
468
441
|
}
|
|
469
|
-
const cards = response.data.
|
|
442
|
+
const cards = response.data.getAllPlans.filter(
|
|
443
|
+
(plan) => plan.isActive && (!resolvedProductId || plan.productID === resolvedProductId)
|
|
444
|
+
).map((plan) => transformToDisplayCard(plan, props)).sort((a, b) => a.priceRaw - b.priceRaw);
|
|
470
445
|
setAllPlans(cards);
|
|
471
446
|
setError(null);
|
|
472
447
|
} catch (err) {
|
|
@@ -484,56 +459,13 @@ function PricingSection(props) {
|
|
|
484
459
|
cancelled = true;
|
|
485
460
|
};
|
|
486
461
|
}, [client, resolvedProductId]);
|
|
487
|
-
const
|
|
488
|
-
const enterpriseApiPlans = allPlans.filter((p) => isEnterprisePlan(p.name));
|
|
489
|
-
const individualPlans = individualAllPlans.filter(
|
|
462
|
+
const plans = allPlans.filter(
|
|
490
463
|
(plan) => billingCycle === "monthly" ? plan.duration === "monthly" : plan.duration === "yearly"
|
|
491
464
|
);
|
|
492
|
-
const enterpriseCards = enterpriseApiPlans.map((p) => {
|
|
493
|
-
if (p.priceRaw === 0 && p.name.toLowerCase().includes("enterprise")) {
|
|
494
|
-
return {
|
|
495
|
-
...p,
|
|
496
|
-
price: "Custom",
|
|
497
|
-
interval: "",
|
|
498
|
-
ctaText: "Contact Sales",
|
|
499
|
-
ctaLink: props.contactUrl || "/contact"
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
return p;
|
|
503
|
-
});
|
|
504
|
-
const hasApiEnterprisePlans = enterpriseCards.length > 0;
|
|
505
|
-
const defaultEnterpriseCard = {
|
|
506
|
-
name: "Enterprise",
|
|
507
|
-
subtitle: "For organizations that need more",
|
|
508
|
-
description: "For organizations that need more",
|
|
509
|
-
price: "Custom",
|
|
510
|
-
period: "",
|
|
511
|
-
interval: "",
|
|
512
|
-
button: "Contact Sales",
|
|
513
|
-
buttonLink: props.contactUrl || "/contact",
|
|
514
|
-
ctaText: "Contact Sales",
|
|
515
|
-
ctaLink: props.contactUrl || "/contact",
|
|
516
|
-
popular: false,
|
|
517
|
-
features: props.fallbackFeatures?.enterprise || [
|
|
518
|
-
"Unlimited everything",
|
|
519
|
-
"SSO & SAML",
|
|
520
|
-
"Audit logs",
|
|
521
|
-
"Dedicated support",
|
|
522
|
-
"Self-hosted option"
|
|
523
|
-
]
|
|
524
|
-
};
|
|
525
|
-
const resolvedEnterprisePlans = hasApiEnterprisePlans ? enterpriseCards : props.enterprisePlans ? props.enterprisePlans : [defaultEnterpriseCard];
|
|
526
|
-
const plans = props.showAudienceTabs && audience === "enterprise" ? [] : individualPlans;
|
|
527
465
|
if (loading) {
|
|
528
466
|
return /* @__PURE__ */ jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto px-4 sm:px-6", children: [
|
|
529
467
|
/* @__PURE__ */ jsxs("div", { className: "text-center mb-8 sm:mb-12", children: [
|
|
530
|
-
|
|
531
|
-
// Visually hidden but DOM-present heading so axe's heading-order
|
|
532
|
-
// rule still sees an h2 between the consumer's hero h1 and the
|
|
533
|
-
// h3 plan-card titles. See `getMetadataForPlan` for why a falsy
|
|
534
|
-
// sectionHeading is the canonical "no visible heading" signal.
|
|
535
|
-
/* @__PURE__ */ jsx("h2", { className: "sr-only", children: "Pricing" })
|
|
536
|
-
),
|
|
468
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }),
|
|
537
469
|
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm sm:text-base md:text-lg", children: "Loading pricing information..." })
|
|
538
470
|
] }),
|
|
539
471
|
/* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-3 gap-6 sm:gap-8", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxs(
|
|
@@ -554,205 +486,90 @@ function PricingSection(props) {
|
|
|
554
486
|
}
|
|
555
487
|
if (error && plans.length === 0) {
|
|
556
488
|
return /* @__PURE__ */ jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsx("div", { className: "container mx-auto px-4 sm:px-6", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
557
|
-
|
|
489
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-4", children: sectionHeading }),
|
|
558
490
|
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-8", children: error }),
|
|
559
491
|
/* @__PURE__ */ jsx(Button, { onClick: () => window.location.reload(), children: "Retry" })
|
|
560
492
|
] }) }) });
|
|
561
493
|
}
|
|
562
494
|
return /* @__PURE__ */ jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto px-4 sm:px-6", children: [
|
|
563
495
|
/* @__PURE__ */ jsxs("div", { className: "text-center mb-8 sm:mb-12", children: [
|
|
564
|
-
|
|
496
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }),
|
|
565
497
|
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm sm:text-base md:text-lg mb-6", children: sectionSubtitle }),
|
|
566
|
-
|
|
567
|
-
/* @__PURE__ */ jsx(
|
|
568
|
-
"button",
|
|
569
|
-
{
|
|
570
|
-
type: "button",
|
|
571
|
-
onClick: () => setAudience("individual"),
|
|
572
|
-
className: `px-6 sm:px-8 py-2.5 rounded-lg text-sm font-semibold transition-all ${audience === "individual" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
|
|
573
|
-
children: "Individual"
|
|
574
|
-
}
|
|
575
|
-
),
|
|
576
|
-
/* @__PURE__ */ jsx(
|
|
577
|
-
"button",
|
|
578
|
-
{
|
|
579
|
-
type: "button",
|
|
580
|
-
onClick: () => setAudience("enterprise"),
|
|
581
|
-
className: `px-6 sm:px-8 py-2.5 rounded-lg text-sm font-semibold transition-all ${audience === "enterprise" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
|
|
582
|
-
children: "Enterprise"
|
|
583
|
-
}
|
|
584
|
-
)
|
|
585
|
-
] }) }),
|
|
586
|
-
(audience === "individual" || !props.showAudienceTabs) && /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center bg-muted/60 p-1.5 rounded-xl", children: [
|
|
498
|
+
/* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-3 bg-muted p-1.5 rounded-lg", children: [
|
|
587
499
|
/* @__PURE__ */ jsx(
|
|
588
500
|
"button",
|
|
589
501
|
{
|
|
590
|
-
type: "button",
|
|
591
502
|
onClick: () => setBillingCycle("monthly"),
|
|
592
|
-
className: `px-
|
|
503
|
+
className: `px-6 py-2 rounded-md text-sm font-medium transition-all ${billingCycle === "monthly" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
|
|
593
504
|
children: "Monthly"
|
|
594
505
|
}
|
|
595
506
|
),
|
|
596
507
|
/* @__PURE__ */ jsx(
|
|
597
508
|
"button",
|
|
598
509
|
{
|
|
599
|
-
type: "button",
|
|
600
510
|
onClick: () => setBillingCycle("yearly"),
|
|
601
|
-
className: `px-
|
|
511
|
+
className: `px-6 py-2 rounded-md text-sm font-medium transition-all ${billingCycle === "yearly" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
|
|
602
512
|
children: "Yearly"
|
|
603
513
|
}
|
|
604
514
|
)
|
|
605
|
-
] })
|
|
606
|
-
] }),
|
|
607
|
-
props.showAudienceTabs && audience === "enterprise" && /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl text-center mb-8", children: [
|
|
608
|
-
/* @__PURE__ */ jsx("h3", { className: "text-xl sm:text-2xl font-bold text-foreground", children: props.enterpriseHeading || "Enterprise Solutions" }),
|
|
609
|
-
/* @__PURE__ */ jsx("p", { className: "mt-3 text-muted-foreground", children: props.enterpriseSubtitle || "Built for teams, agencies, and organizations that need advanced collaboration, security, support, and scale." })
|
|
515
|
+
] })
|
|
610
516
|
] }),
|
|
611
|
-
/* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch", children:
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
{
|
|
626
|
-
|
|
627
|
-
children:
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
note && /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm font-medium text-primary", children: note })
|
|
639
|
-
] }),
|
|
640
|
-
/* @__PURE__ */ jsx("ul", { className: "space-y-3 mb-8 mt-6 flex-1", children: features.map((feature) => /* @__PURE__ */ jsxs(
|
|
641
|
-
"li",
|
|
642
|
-
{
|
|
643
|
-
className: "text-sm flex items-start gap-2",
|
|
644
|
-
children: [
|
|
645
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
646
|
-
/* @__PURE__ */ jsx("span", { children: feature })
|
|
647
|
-
]
|
|
648
|
-
},
|
|
649
|
-
feature
|
|
650
|
-
)) }),
|
|
651
|
-
btnLink.startsWith("/") ? /* @__PURE__ */ jsx(
|
|
652
|
-
Button,
|
|
517
|
+
/* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch", children: plans.map((plan) => /* @__PURE__ */ jsxs(
|
|
518
|
+
"div",
|
|
519
|
+
{
|
|
520
|
+
className: `bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${plan.popular ? "border-2 border-primary shadow-xl ring-1 ring-primary/20" : "border hover:shadow-lg hover:border-primary/50"}`,
|
|
521
|
+
children: [
|
|
522
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center mb-6", children: [
|
|
523
|
+
plan.popular && /* @__PURE__ */ jsx("span", { className: "inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3", children: "Most Popular" }),
|
|
524
|
+
/* @__PURE__ */ jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: plan.name }),
|
|
525
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: plan.description })
|
|
526
|
+
] }),
|
|
527
|
+
/* @__PURE__ */ jsx("div", { className: "text-center mb-8", children: /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-center gap-1", children: [
|
|
528
|
+
/* @__PURE__ */ jsx("span", { className: "text-4xl sm:text-5xl font-bold", children: plan.price }),
|
|
529
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-lg", children: plan.interval })
|
|
530
|
+
] }) }),
|
|
531
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-3 mb-8 flex-1", children: plan.features.map((feature, index) => /* @__PURE__ */ jsxs("li", { className: "text-sm flex items-start gap-2", children: [
|
|
532
|
+
/* @__PURE__ */ jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
533
|
+
/* @__PURE__ */ jsx("span", { children: feature })
|
|
534
|
+
] }, index)) }),
|
|
535
|
+
plan.ctaLink.startsWith("/") ? /* @__PURE__ */ jsx(
|
|
536
|
+
Button,
|
|
537
|
+
{
|
|
538
|
+
className: "w-full h-11",
|
|
539
|
+
variant: plan.popular ? "default" : "outline",
|
|
540
|
+
size: "lg",
|
|
541
|
+
asChild: true,
|
|
542
|
+
children: /* @__PURE__ */ jsx(
|
|
543
|
+
"a",
|
|
653
544
|
{
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
asChild: true,
|
|
658
|
-
children: /* @__PURE__ */ jsx(
|
|
659
|
-
"a",
|
|
660
|
-
{
|
|
661
|
-
href: btnLink,
|
|
662
|
-
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
663
|
-
children: btnText
|
|
664
|
-
}
|
|
665
|
-
)
|
|
545
|
+
href: plan.ctaLink,
|
|
546
|
+
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
547
|
+
children: plan.ctaText
|
|
666
548
|
}
|
|
667
|
-
)
|
|
668
|
-
|
|
549
|
+
)
|
|
550
|
+
}
|
|
551
|
+
) : /* @__PURE__ */ jsx(
|
|
552
|
+
Button,
|
|
553
|
+
{
|
|
554
|
+
className: "w-full h-11",
|
|
555
|
+
variant: plan.popular ? "default" : "outline",
|
|
556
|
+
size: "lg",
|
|
557
|
+
asChild: true,
|
|
558
|
+
children: /* @__PURE__ */ jsx(
|
|
559
|
+
"a",
|
|
669
560
|
{
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
children: /* @__PURE__ */ jsx(
|
|
675
|
-
"a",
|
|
676
|
-
{
|
|
677
|
-
href: btnLink,
|
|
678
|
-
target: "_blank",
|
|
679
|
-
rel: "noopener noreferrer",
|
|
680
|
-
children: btnText
|
|
681
|
-
}
|
|
682
|
-
)
|
|
561
|
+
href: plan.ctaLink,
|
|
562
|
+
target: "_blank",
|
|
563
|
+
rel: "noopener noreferrer",
|
|
564
|
+
children: plan.ctaText
|
|
683
565
|
}
|
|
684
566
|
)
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
)
|
|
691
|
-
/* Individual API-fetched cards */
|
|
692
|
-
plans.map((plan) => /* @__PURE__ */ jsxs(
|
|
693
|
-
"div",
|
|
694
|
-
{
|
|
695
|
-
className: `bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${plan.popular ? "border-2 border-primary shadow-xl ring-1 ring-primary/20" : "border hover:shadow-lg hover:border-primary/50"}`,
|
|
696
|
-
children: [
|
|
697
|
-
/* @__PURE__ */ jsxs("div", { className: "text-center mb-6", children: [
|
|
698
|
-
plan.popular && /* @__PURE__ */ jsx("span", { className: "inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3", children: "Most Popular" }),
|
|
699
|
-
/* @__PURE__ */ jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: plan.name }),
|
|
700
|
-
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: plan.description })
|
|
701
|
-
] }),
|
|
702
|
-
/* @__PURE__ */ jsx("div", { className: "text-center mb-8", children: plan.price === "Custom" ? /* @__PURE__ */ jsx("span", { className: "text-3xl sm:text-4xl font-bold", children: "Custom" }) : /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-center gap-1", children: [
|
|
703
|
-
/* @__PURE__ */ jsx("span", { className: "text-4xl sm:text-5xl font-bold", children: plan.price }),
|
|
704
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-lg", children: plan.interval })
|
|
705
|
-
] }) }),
|
|
706
|
-
/* @__PURE__ */ jsx("ul", { className: "space-y-3 mb-8 flex-1", children: plan.features.map((feature, index) => /* @__PURE__ */ jsxs(
|
|
707
|
-
"li",
|
|
708
|
-
{
|
|
709
|
-
className: "text-sm flex items-start gap-2",
|
|
710
|
-
children: [
|
|
711
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
712
|
-
/* @__PURE__ */ jsx("span", { children: feature })
|
|
713
|
-
]
|
|
714
|
-
},
|
|
715
|
-
index
|
|
716
|
-
)) }),
|
|
717
|
-
plan.ctaLink.startsWith("/") ? /* @__PURE__ */ jsx(
|
|
718
|
-
Button,
|
|
719
|
-
{
|
|
720
|
-
className: "w-full h-11",
|
|
721
|
-
variant: plan.popular ? "default" : "outline",
|
|
722
|
-
size: "lg",
|
|
723
|
-
asChild: true,
|
|
724
|
-
children: /* @__PURE__ */ jsx(
|
|
725
|
-
"a",
|
|
726
|
-
{
|
|
727
|
-
href: plan.ctaLink,
|
|
728
|
-
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
729
|
-
children: plan.ctaText
|
|
730
|
-
}
|
|
731
|
-
)
|
|
732
|
-
}
|
|
733
|
-
) : /* @__PURE__ */ jsx(
|
|
734
|
-
Button,
|
|
735
|
-
{
|
|
736
|
-
className: "w-full h-11",
|
|
737
|
-
variant: plan.popular ? "default" : "outline",
|
|
738
|
-
size: "lg",
|
|
739
|
-
asChild: true,
|
|
740
|
-
children: /* @__PURE__ */ jsx(
|
|
741
|
-
"a",
|
|
742
|
-
{
|
|
743
|
-
href: plan.ctaLink,
|
|
744
|
-
target: "_blank",
|
|
745
|
-
rel: "noopener noreferrer",
|
|
746
|
-
children: plan.ctaText
|
|
747
|
-
}
|
|
748
|
-
)
|
|
749
|
-
}
|
|
750
|
-
)
|
|
751
|
-
]
|
|
752
|
-
},
|
|
753
|
-
plan.id
|
|
754
|
-
))
|
|
755
|
-
) })
|
|
567
|
+
}
|
|
568
|
+
)
|
|
569
|
+
]
|
|
570
|
+
},
|
|
571
|
+
plan.id
|
|
572
|
+
)) })
|
|
756
573
|
] }) });
|
|
757
574
|
}
|
|
758
575
|
function PricingPage(props) {
|