@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
|
@@ -274,9 +274,9 @@ var Button = React__namespace.forwardRef(
|
|
|
274
274
|
}
|
|
275
275
|
);
|
|
276
276
|
Button.displayName = "Button";
|
|
277
|
-
var
|
|
278
|
-
query
|
|
279
|
-
|
|
277
|
+
var GET_ALL_PLANS_QUERY = `
|
|
278
|
+
query GetAllPlans {
|
|
279
|
+
getAllPlans {
|
|
280
280
|
id
|
|
281
281
|
name
|
|
282
282
|
price
|
|
@@ -321,15 +321,11 @@ function formatInterval(duration, billingIntervals) {
|
|
|
321
321
|
const intervals = billingIntervals || defaultIntervals;
|
|
322
322
|
return intervals[duration] || `/${duration}`;
|
|
323
323
|
}
|
|
324
|
-
function isEnterprisePlan(planName) {
|
|
325
|
-
const name = planName.toLowerCase();
|
|
326
|
-
return name.includes("team") || name.includes("business") || name.includes("enterprise");
|
|
327
|
-
}
|
|
328
324
|
function detectPlanTier(planName) {
|
|
329
325
|
const name = planName.toLowerCase();
|
|
330
|
-
if (name.includes("
|
|
326
|
+
if (name.includes("basic") || name.includes("starter")) {
|
|
331
327
|
return "basic";
|
|
332
|
-
} else if (name.includes("pro") || name.includes("professional") || name.includes("premium")
|
|
328
|
+
} else if (name.includes("pro") || name.includes("professional") || name.includes("premium")) {
|
|
333
329
|
return "professional";
|
|
334
330
|
} else if (name.includes("enterprise") || name.includes("business")) {
|
|
335
331
|
return "enterprise";
|
|
@@ -349,8 +345,7 @@ function getMetadataForPlan(planName, planMetadata) {
|
|
|
349
345
|
defaultDescription: meta.defaultDescription || "Choose this plan",
|
|
350
346
|
popular: meta.popular ?? false,
|
|
351
347
|
ctaText: meta.ctaText || "Get Started",
|
|
352
|
-
ctaType: meta.ctaType || "signup"
|
|
353
|
-
features: meta.features
|
|
348
|
+
ctaType: meta.ctaType || "signup"
|
|
354
349
|
};
|
|
355
350
|
}
|
|
356
351
|
const tier = detectPlanTier(planName);
|
|
@@ -373,54 +368,37 @@ function getMetadataForPlan(planName, planMetadata) {
|
|
|
373
368
|
ctaType: "signup"
|
|
374
369
|
};
|
|
375
370
|
}
|
|
376
|
-
function humanizeQuotaName(name) {
|
|
377
|
-
const parts = name.split(".");
|
|
378
|
-
const resource = parts.length >= 3 ? parts[parts.length - 2] : parts[parts.length - 1];
|
|
379
|
-
return resource.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
380
|
-
}
|
|
381
371
|
function transformQuotaToFeature(quota) {
|
|
382
372
|
const { name, limits } = quota;
|
|
383
373
|
if (!limits || typeof limits !== "object") {
|
|
384
|
-
return
|
|
374
|
+
return name;
|
|
385
375
|
}
|
|
386
376
|
const limitsObj = limits;
|
|
387
377
|
const value = limitsObj.value;
|
|
388
378
|
const unit = limitsObj.unit;
|
|
389
379
|
const type = limitsObj.type;
|
|
390
380
|
const description = limitsObj.description;
|
|
391
|
-
if (
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
return description;
|
|
396
|
-
}
|
|
397
|
-
if (typeof unit === "string" && unit) {
|
|
398
|
-
if (typeof value === "number") {
|
|
399
|
-
return `${value.toLocaleString()} ${unit}`;
|
|
400
|
-
}
|
|
401
|
-
return `${unit}`;
|
|
402
|
-
}
|
|
403
|
-
const label = humanizeQuotaName(name);
|
|
404
|
-
if (type === "boolean") {
|
|
405
|
-
return label;
|
|
381
|
+
if (type === "number" && typeof value === "number") {
|
|
382
|
+
const formattedValue = value.toLocaleString();
|
|
383
|
+
return `${formattedValue} ${unit || ""}${description ? " - " + description : ""}`.trim();
|
|
384
|
+
} else if (type === "boolean") {
|
|
385
|
+
return typeof description === "string" && description || name;
|
|
406
386
|
}
|
|
407
387
|
if (typeof value === "number") {
|
|
408
|
-
|
|
388
|
+
const formattedValue = value.toLocaleString();
|
|
389
|
+
return `${name}: ${formattedValue} ${unit || ""}`.trim();
|
|
409
390
|
}
|
|
410
|
-
return
|
|
391
|
+
return name;
|
|
411
392
|
}
|
|
412
393
|
function extractDisplayFeatures(features, planName, fallbackFeatures) {
|
|
413
|
-
const tier = detectPlanTier(planName);
|
|
414
|
-
if (tier) {
|
|
415
|
-
const tierFeatures = getFallbackFeaturesForTier(tier, fallbackFeatures);
|
|
416
|
-
if (tierFeatures.length > 0) {
|
|
417
|
-
return tierFeatures;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
394
|
const quotaFeatures = features.filter((f) => f.quota).map((f) => transformQuotaToFeature(f.quota));
|
|
421
395
|
if (quotaFeatures.length > 0) {
|
|
422
396
|
return quotaFeatures;
|
|
423
397
|
}
|
|
398
|
+
const tier = detectPlanTier(planName);
|
|
399
|
+
if (tier) {
|
|
400
|
+
return getFallbackFeaturesForTier(tier, fallbackFeatures);
|
|
401
|
+
}
|
|
424
402
|
return [];
|
|
425
403
|
}
|
|
426
404
|
function transformToDisplayCard(plan, props) {
|
|
@@ -431,7 +409,7 @@ function transformToDisplayCard(plan, props) {
|
|
|
431
409
|
props.currencies
|
|
432
410
|
);
|
|
433
411
|
const interval = formatInterval(plan.duration, props.billingIntervals);
|
|
434
|
-
const features =
|
|
412
|
+
const features = extractDisplayFeatures(
|
|
435
413
|
plan.features,
|
|
436
414
|
plan.name,
|
|
437
415
|
props.fallbackFeatures
|
|
@@ -469,25 +447,22 @@ function PricingSection(props) {
|
|
|
469
447
|
const [billingCycle, setBillingCycle] = React.useState(
|
|
470
448
|
"monthly"
|
|
471
449
|
);
|
|
472
|
-
const [audience, setAudience] = React.useState(
|
|
473
|
-
"individual"
|
|
474
|
-
);
|
|
475
450
|
React.useEffect(() => {
|
|
476
451
|
let cancelled = false;
|
|
477
452
|
async function loadPlans() {
|
|
478
453
|
try {
|
|
479
454
|
setLoading(true);
|
|
480
|
-
const response = await client.query(
|
|
481
|
-
productId: resolvedProductId
|
|
482
|
-
});
|
|
455
|
+
const response = await client.query(GET_ALL_PLANS_QUERY);
|
|
483
456
|
if (cancelled) return;
|
|
484
457
|
if (response.errors && response.errors.length > 0) {
|
|
485
458
|
throw new Error(response.errors[0].message);
|
|
486
459
|
}
|
|
487
|
-
if (!response.data?.
|
|
460
|
+
if (!response.data?.getAllPlans) {
|
|
488
461
|
throw new Error("No plans data received");
|
|
489
462
|
}
|
|
490
|
-
const cards = response.data.
|
|
463
|
+
const cards = response.data.getAllPlans.filter(
|
|
464
|
+
(plan) => plan.isActive && (!resolvedProductId || plan.productID === resolvedProductId)
|
|
465
|
+
).map((plan) => transformToDisplayCard(plan, props)).sort((a, b) => a.priceRaw - b.priceRaw);
|
|
491
466
|
setAllPlans(cards);
|
|
492
467
|
setError(null);
|
|
493
468
|
} catch (err) {
|
|
@@ -505,56 +480,13 @@ function PricingSection(props) {
|
|
|
505
480
|
cancelled = true;
|
|
506
481
|
};
|
|
507
482
|
}, [client, resolvedProductId]);
|
|
508
|
-
const
|
|
509
|
-
const enterpriseApiPlans = allPlans.filter((p) => isEnterprisePlan(p.name));
|
|
510
|
-
const individualPlans = individualAllPlans.filter(
|
|
483
|
+
const plans = allPlans.filter(
|
|
511
484
|
(plan) => billingCycle === "monthly" ? plan.duration === "monthly" : plan.duration === "yearly"
|
|
512
485
|
);
|
|
513
|
-
const enterpriseCards = enterpriseApiPlans.map((p) => {
|
|
514
|
-
if (p.priceRaw === 0 && p.name.toLowerCase().includes("enterprise")) {
|
|
515
|
-
return {
|
|
516
|
-
...p,
|
|
517
|
-
price: "Custom",
|
|
518
|
-
interval: "",
|
|
519
|
-
ctaText: "Contact Sales",
|
|
520
|
-
ctaLink: props.contactUrl || "/contact"
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
return p;
|
|
524
|
-
});
|
|
525
|
-
const hasApiEnterprisePlans = enterpriseCards.length > 0;
|
|
526
|
-
const defaultEnterpriseCard = {
|
|
527
|
-
name: "Enterprise",
|
|
528
|
-
subtitle: "For organizations that need more",
|
|
529
|
-
description: "For organizations that need more",
|
|
530
|
-
price: "Custom",
|
|
531
|
-
period: "",
|
|
532
|
-
interval: "",
|
|
533
|
-
button: "Contact Sales",
|
|
534
|
-
buttonLink: props.contactUrl || "/contact",
|
|
535
|
-
ctaText: "Contact Sales",
|
|
536
|
-
ctaLink: props.contactUrl || "/contact",
|
|
537
|
-
popular: false,
|
|
538
|
-
features: props.fallbackFeatures?.enterprise || [
|
|
539
|
-
"Unlimited everything",
|
|
540
|
-
"SSO & SAML",
|
|
541
|
-
"Audit logs",
|
|
542
|
-
"Dedicated support",
|
|
543
|
-
"Self-hosted option"
|
|
544
|
-
]
|
|
545
|
-
};
|
|
546
|
-
const resolvedEnterprisePlans = hasApiEnterprisePlans ? enterpriseCards : props.enterprisePlans ? props.enterprisePlans : [defaultEnterpriseCard];
|
|
547
|
-
const plans = props.showAudienceTabs && audience === "enterprise" ? [] : individualPlans;
|
|
548
486
|
if (loading) {
|
|
549
487
|
return /* @__PURE__ */ jsxRuntime.jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "container mx-auto px-4 sm:px-6", children: [
|
|
550
488
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-8 sm:mb-12", children: [
|
|
551
|
-
|
|
552
|
-
// Visually hidden but DOM-present heading so axe's heading-order
|
|
553
|
-
// rule still sees an h2 between the consumer's hero h1 and the
|
|
554
|
-
// h3 plan-card titles. See `getMetadataForPlan` for why a falsy
|
|
555
|
-
// sectionHeading is the canonical "no visible heading" signal.
|
|
556
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "sr-only", children: "Pricing" })
|
|
557
|
-
),
|
|
489
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }),
|
|
558
490
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base md:text-lg", children: "Loading pricing information..." })
|
|
559
491
|
] }),
|
|
560
492
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-3 gap-6 sm:gap-8", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -575,205 +507,90 @@ function PricingSection(props) {
|
|
|
575
507
|
}
|
|
576
508
|
if (error && plans.length === 0) {
|
|
577
509
|
return /* @__PURE__ */ jsxRuntime.jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 sm:px-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
578
|
-
|
|
510
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-4", children: sectionHeading }),
|
|
579
511
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-8", children: error }),
|
|
580
512
|
/* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: () => window.location.reload(), children: "Retry" })
|
|
581
513
|
] }) }) });
|
|
582
514
|
}
|
|
583
515
|
return /* @__PURE__ */ jsxRuntime.jsx("section", { id, className: `py-12 sm:py-16 md:py-20 ${className}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "container mx-auto px-4 sm:px-6", children: [
|
|
584
516
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-8 sm:mb-12", children: [
|
|
585
|
-
|
|
517
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }),
|
|
586
518
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base md:text-lg mb-6", children: sectionSubtitle }),
|
|
587
|
-
|
|
519
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-3 bg-muted p-1.5 rounded-lg", children: [
|
|
588
520
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
589
521
|
"button",
|
|
590
522
|
{
|
|
591
|
-
type: "button",
|
|
592
|
-
onClick: () => setAudience("individual"),
|
|
593
|
-
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"}`,
|
|
594
|
-
children: "Individual"
|
|
595
|
-
}
|
|
596
|
-
),
|
|
597
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
598
|
-
"button",
|
|
599
|
-
{
|
|
600
|
-
type: "button",
|
|
601
|
-
onClick: () => setAudience("enterprise"),
|
|
602
|
-
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"}`,
|
|
603
|
-
children: "Enterprise"
|
|
604
|
-
}
|
|
605
|
-
)
|
|
606
|
-
] }) }),
|
|
607
|
-
(audience === "individual" || !props.showAudienceTabs) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center bg-muted/60 p-1.5 rounded-xl", children: [
|
|
608
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
609
|
-
"button",
|
|
610
|
-
{
|
|
611
|
-
type: "button",
|
|
612
523
|
onClick: () => setBillingCycle("monthly"),
|
|
613
|
-
className: `px-
|
|
524
|
+
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"}`,
|
|
614
525
|
children: "Monthly"
|
|
615
526
|
}
|
|
616
527
|
),
|
|
617
528
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
618
529
|
"button",
|
|
619
530
|
{
|
|
620
|
-
type: "button",
|
|
621
531
|
onClick: () => setBillingCycle("yearly"),
|
|
622
|
-
className: `px-
|
|
532
|
+
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"}`,
|
|
623
533
|
children: "Yearly"
|
|
624
534
|
}
|
|
625
535
|
)
|
|
626
|
-
] })
|
|
627
|
-
] }),
|
|
628
|
-
props.showAudienceTabs && audience === "enterprise" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-3xl text-center mb-8", children: [
|
|
629
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl sm:text-2xl font-bold text-foreground", children: props.enterpriseHeading || "Enterprise Solutions" }),
|
|
630
|
-
/* @__PURE__ */ jsxRuntime.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." })
|
|
536
|
+
] })
|
|
631
537
|
] }),
|
|
632
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch", children:
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
{
|
|
647
|
-
|
|
648
|
-
children:
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm font-medium text-primary", children: note })
|
|
660
|
-
] }),
|
|
661
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-3 mb-8 mt-6 flex-1", children: features.map((feature) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
662
|
-
"li",
|
|
663
|
-
{
|
|
664
|
-
className: "text-sm flex items-start gap-2",
|
|
665
|
-
children: [
|
|
666
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
667
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: feature })
|
|
668
|
-
]
|
|
669
|
-
},
|
|
670
|
-
feature
|
|
671
|
-
)) }),
|
|
672
|
-
btnLink.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
673
|
-
Button,
|
|
538
|
+
/* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsxs(
|
|
539
|
+
"div",
|
|
540
|
+
{
|
|
541
|
+
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"}`,
|
|
542
|
+
children: [
|
|
543
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-6", children: [
|
|
544
|
+
plan.popular && /* @__PURE__ */ jsxRuntime.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" }),
|
|
545
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: plan.name }),
|
|
546
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm", children: plan.description })
|
|
547
|
+
] }),
|
|
548
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center mb-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline justify-center gap-1", children: [
|
|
549
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-4xl sm:text-5xl font-bold", children: plan.price }),
|
|
550
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-lg", children: plan.interval })
|
|
551
|
+
] }) }),
|
|
552
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-3 mb-8 flex-1", children: plan.features.map((feature, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "text-sm flex items-start gap-2", children: [
|
|
553
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
554
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: feature })
|
|
555
|
+
] }, index)) }),
|
|
556
|
+
plan.ctaLink.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
557
|
+
Button,
|
|
558
|
+
{
|
|
559
|
+
className: "w-full h-11",
|
|
560
|
+
variant: plan.popular ? "default" : "outline",
|
|
561
|
+
size: "lg",
|
|
562
|
+
asChild: true,
|
|
563
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
564
|
+
"a",
|
|
674
565
|
{
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
asChild: true,
|
|
679
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
680
|
-
"a",
|
|
681
|
-
{
|
|
682
|
-
href: btnLink,
|
|
683
|
-
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
684
|
-
children: btnText
|
|
685
|
-
}
|
|
686
|
-
)
|
|
566
|
+
href: plan.ctaLink,
|
|
567
|
+
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
568
|
+
children: plan.ctaText
|
|
687
569
|
}
|
|
688
|
-
)
|
|
689
|
-
|
|
570
|
+
)
|
|
571
|
+
}
|
|
572
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
573
|
+
Button,
|
|
574
|
+
{
|
|
575
|
+
className: "w-full h-11",
|
|
576
|
+
variant: plan.popular ? "default" : "outline",
|
|
577
|
+
size: "lg",
|
|
578
|
+
asChild: true,
|
|
579
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
580
|
+
"a",
|
|
690
581
|
{
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
696
|
-
"a",
|
|
697
|
-
{
|
|
698
|
-
href: btnLink,
|
|
699
|
-
target: "_blank",
|
|
700
|
-
rel: "noopener noreferrer",
|
|
701
|
-
children: btnText
|
|
702
|
-
}
|
|
703
|
-
)
|
|
582
|
+
href: plan.ctaLink,
|
|
583
|
+
target: "_blank",
|
|
584
|
+
rel: "noopener noreferrer",
|
|
585
|
+
children: plan.ctaText
|
|
704
586
|
}
|
|
705
587
|
)
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
)
|
|
712
|
-
/* Individual API-fetched cards */
|
|
713
|
-
plans.map((plan) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
714
|
-
"div",
|
|
715
|
-
{
|
|
716
|
-
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"}`,
|
|
717
|
-
children: [
|
|
718
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-6", children: [
|
|
719
|
-
plan.popular && /* @__PURE__ */ jsxRuntime.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" }),
|
|
720
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: plan.name }),
|
|
721
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm", children: plan.description })
|
|
722
|
-
] }),
|
|
723
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center mb-8", children: plan.price === "Custom" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-3xl sm:text-4xl font-bold", children: "Custom" }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline justify-center gap-1", children: [
|
|
724
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-4xl sm:text-5xl font-bold", children: plan.price }),
|
|
725
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-lg", children: plan.interval })
|
|
726
|
-
] }) }),
|
|
727
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-3 mb-8 flex-1", children: plan.features.map((feature, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
728
|
-
"li",
|
|
729
|
-
{
|
|
730
|
-
className: "text-sm flex items-start gap-2",
|
|
731
|
-
children: [
|
|
732
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary mt-0.5 flex-shrink-0", children: "\u2713" }),
|
|
733
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: feature })
|
|
734
|
-
]
|
|
735
|
-
},
|
|
736
|
-
index
|
|
737
|
-
)) }),
|
|
738
|
-
plan.ctaLink.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
739
|
-
Button,
|
|
740
|
-
{
|
|
741
|
-
className: "w-full h-11",
|
|
742
|
-
variant: plan.popular ? "default" : "outline",
|
|
743
|
-
size: "lg",
|
|
744
|
-
asChild: true,
|
|
745
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
746
|
-
"a",
|
|
747
|
-
{
|
|
748
|
-
href: plan.ctaLink,
|
|
749
|
-
onClick: () => window.scrollTo({ top: 0, behavior: "smooth" }),
|
|
750
|
-
children: plan.ctaText
|
|
751
|
-
}
|
|
752
|
-
)
|
|
753
|
-
}
|
|
754
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
755
|
-
Button,
|
|
756
|
-
{
|
|
757
|
-
className: "w-full h-11",
|
|
758
|
-
variant: plan.popular ? "default" : "outline",
|
|
759
|
-
size: "lg",
|
|
760
|
-
asChild: true,
|
|
761
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
762
|
-
"a",
|
|
763
|
-
{
|
|
764
|
-
href: plan.ctaLink,
|
|
765
|
-
target: "_blank",
|
|
766
|
-
rel: "noopener noreferrer",
|
|
767
|
-
children: plan.ctaText
|
|
768
|
-
}
|
|
769
|
-
)
|
|
770
|
-
}
|
|
771
|
-
)
|
|
772
|
-
]
|
|
773
|
-
},
|
|
774
|
-
plan.id
|
|
775
|
-
))
|
|
776
|
-
) })
|
|
588
|
+
}
|
|
589
|
+
)
|
|
590
|
+
]
|
|
591
|
+
},
|
|
592
|
+
plan.id
|
|
593
|
+
)) })
|
|
777
594
|
] }) });
|
|
778
595
|
}
|
|
779
596
|
function PricingPage(props) {
|