@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.
Files changed (91) hide show
  1. package/dist/analytics/index.js +0 -1
  2. package/dist/analytics/index.js.map +1 -1
  3. package/dist/analytics/index.mjs +0 -1
  4. package/dist/analytics/index.mjs.map +1 -1
  5. package/dist/client/index.d.mts +2 -5
  6. package/dist/client/index.d.ts +2 -5
  7. package/dist/client/index.js +2 -11
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/index.mjs +2 -11
  10. package/dist/client/index.mjs.map +1 -1
  11. package/dist/components/contact.d.mts +2 -77
  12. package/dist/components/contact.d.ts +2 -77
  13. package/dist/components/contact.js +9 -112
  14. package/dist/components/contact.js.map +1 -1
  15. package/dist/components/contact.mjs +10 -112
  16. package/dist/components/contact.mjs.map +1 -1
  17. package/dist/components/newsletter.js +6 -17
  18. package/dist/components/newsletter.js.map +1 -1
  19. package/dist/components/newsletter.mjs +6 -17
  20. package/dist/components/newsletter.mjs.map +1 -1
  21. package/dist/components/pricing.d.mts +0 -38
  22. package/dist/components/pricing.d.ts +0 -38
  23. package/dist/components/pricing.js +84 -267
  24. package/dist/components/pricing.js.map +1 -1
  25. package/dist/components/pricing.mjs +84 -267
  26. package/dist/components/pricing.mjs.map +1 -1
  27. package/dist/components/waitlist.js +2 -6
  28. package/dist/components/waitlist.js.map +1 -1
  29. package/dist/components/waitlist.mjs +2 -6
  30. package/dist/components/waitlist.mjs.map +1 -1
  31. package/dist/content/index.d.mts +9 -181
  32. package/dist/content/index.d.ts +9 -181
  33. package/dist/content/index.js +16 -2177
  34. package/dist/content/index.js.map +1 -1
  35. package/dist/content/index.mjs +6 -2141
  36. package/dist/content/index.mjs.map +1 -1
  37. package/dist/index.d.mts +5 -43
  38. package/dist/index.d.ts +5 -43
  39. package/dist/index.js +373 -3919
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +378 -3905
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/product/index.d.mts +0 -8
  44. package/dist/product/index.d.ts +0 -8
  45. package/dist/product/index.js +4 -24
  46. package/dist/product/index.js.map +1 -1
  47. package/dist/product/index.mjs +4 -24
  48. package/dist/product/index.mjs.map +1 -1
  49. package/package.json +3 -5
  50. package/dist/components/electron-download.d.mts +0 -32
  51. package/dist/components/electron-download.d.ts +0 -32
  52. package/dist/components/electron-download.js +0 -131
  53. package/dist/components/electron-download.js.map +0 -1
  54. package/dist/components/electron-download.mjs +0 -108
  55. package/dist/components/electron-download.mjs.map +0 -1
  56. package/dist/components/launch-countdown.d.mts +0 -15
  57. package/dist/components/launch-countdown.d.ts +0 -15
  58. package/dist/components/launch-countdown.js +0 -89
  59. package/dist/components/launch-countdown.js.map +0 -1
  60. package/dist/components/launch-countdown.mjs +0 -87
  61. package/dist/components/launch-countdown.mjs.map +0 -1
  62. package/dist/components/partners.d.mts +0 -88
  63. package/dist/components/partners.d.ts +0 -88
  64. package/dist/components/partners.js +0 -1169
  65. package/dist/components/partners.js.map +0 -1
  66. package/dist/components/partners.mjs +0 -1143
  67. package/dist/components/partners.mjs.map +0 -1
  68. package/dist/components/problems-solved.d.mts +0 -37
  69. package/dist/components/problems-solved.d.ts +0 -37
  70. package/dist/components/problems-solved.js +0 -157
  71. package/dist/components/problems-solved.js.map +0 -1
  72. package/dist/components/problems-solved.mjs +0 -135
  73. package/dist/components/problems-solved.mjs.map +0 -1
  74. package/dist/components/resource-links.d.mts +0 -28
  75. package/dist/components/resource-links.d.ts +0 -28
  76. package/dist/components/resource-links.js +0 -229
  77. package/dist/components/resource-links.js.map +0 -1
  78. package/dist/components/resource-links.mjs +0 -227
  79. package/dist/components/resource-links.mjs.map +0 -1
  80. package/dist/components/social-links.d.mts +0 -37
  81. package/dist/components/social-links.d.ts +0 -37
  82. package/dist/components/social-links.js +0 -268
  83. package/dist/components/social-links.js.map +0 -1
  84. package/dist/components/social-links.mjs +0 -266
  85. package/dist/components/social-links.mjs.map +0 -1
  86. package/dist/components/website-switcher.d.mts +0 -27
  87. package/dist/components/website-switcher.d.ts +0 -27
  88. package/dist/components/website-switcher.js +0 -168
  89. package/dist/components/website-switcher.js.map +0 -1
  90. package/dist/components/website-switcher.mjs +0 -146
  91. 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 GET_PLANS_QUERY = `
257
- query GetPublicPlans($productId: String!) {
258
- publicPlans(productId: $productId) {
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("free") || name.includes("basic") || name.includes("starter") || name.includes("hobby")) {
305
+ if (name.includes("basic") || name.includes("starter")) {
310
306
  return "basic";
311
- } else if (name.includes("pro") || name.includes("professional") || name.includes("premium") || name.includes("team")) {
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 humanizeQuotaName(name);
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 (typeof description === "string" && description) {
371
- if (type === "number" && typeof value === "number") {
372
- return `${value.toLocaleString()} ${description}`;
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
- return `${value.toLocaleString()} ${label}`;
367
+ const formattedValue = value.toLocaleString();
368
+ return `${name}: ${formattedValue} ${unit || ""}`.trim();
388
369
  }
389
- return label;
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 = metadata.features && metadata.features.length > 0 ? metadata.features : extractDisplayFeatures(
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(GET_PLANS_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?.publicPlans) {
439
+ if (!response.data?.getAllPlans) {
467
440
  throw new Error("No plans data received");
468
441
  }
469
- const cards = response.data.publicPlans.filter((plan) => plan.isActive).map((plan) => transformToDisplayCard(plan, props)).sort((a, b) => a.priceRaw - b.priceRaw);
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 individualAllPlans = allPlans.filter((p) => !isEnterprisePlan(p.name));
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
- sectionHeading ? /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }) : (
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
- sectionHeading ? /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-4", children: sectionHeading }) : /* @__PURE__ */ jsx("h2", { className: "sr-only", children: "Pricing" }),
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
- sectionHeading ? /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }) : /* @__PURE__ */ jsx("h2", { className: "sr-only", children: "Pricing" }),
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
- props.showAudienceTabs && /* @__PURE__ */ jsx("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center bg-muted p-1.5 rounded-xl", children: [
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-5 sm:px-6 py-2 rounded-lg text-sm font-medium transition-all ${billingCycle === "monthly" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
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-5 sm:px-6 py-2 rounded-lg text-sm font-medium transition-all ${billingCycle === "yearly" ? "bg-background shadow-sm text-foreground" : "text-muted-foreground hover:text-foreground"}`,
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: props.showAudienceTabs && audience === "enterprise" ? (
612
- /* Enterprise cards — from API, static prop, or built-in default */
613
- resolvedEnterprisePlans.map((ep) => {
614
- const subtitle = ep.subtitle || ep.description || "";
615
- const btnText = ep.button || ep.ctaText || "Get Started";
616
- const btnLink = ep.buttonLink || ep.ctaLink || props.appLoginUrl;
617
- const period = ep.period || ep.interval || "";
618
- const note = ep.note || "";
619
- const badge = ep.badge || "";
620
- const isPopular = ep.popular;
621
- const features = ep.features || [];
622
- const price = String(ep.price);
623
- return /* @__PURE__ */ jsxs(
624
- "div",
625
- {
626
- className: `bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${isPopular ? "border-2 border-primary shadow-xl ring-1 ring-primary/20" : "border hover:shadow-lg hover:border-primary/50"}`,
627
- children: [
628
- /* @__PURE__ */ jsxs("div", { className: "text-center mb-6", children: [
629
- isPopular && badge && /* @__PURE__ */ jsx("span", { className: "inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3", children: badge }),
630
- /* @__PURE__ */ jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: ep.name }),
631
- /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: subtitle })
632
- ] }),
633
- /* @__PURE__ */ jsxs("div", { className: "text-center mb-2", children: [
634
- 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: [
635
- /* @__PURE__ */ jsx("span", { className: "text-4xl sm:text-5xl font-extrabold", children: price }),
636
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-lg", children: period })
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
- className: "w-full h-11",
655
- variant: isPopular ? "default" : "outline",
656
- size: "lg",
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
- ) : /* @__PURE__ */ jsx(
668
- Button,
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
- className: "w-full h-11",
671
- variant: isPopular ? "default" : "outline",
672
- size: "lg",
673
- asChild: true,
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
- ep.name
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) {