@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
@@ -274,9 +274,9 @@ var Button = React__namespace.forwardRef(
274
274
  }
275
275
  );
276
276
  Button.displayName = "Button";
277
- var GET_PLANS_QUERY = `
278
- query GetPublicPlans($productId: String!) {
279
- publicPlans(productId: $productId) {
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("free") || name.includes("basic") || name.includes("starter") || name.includes("hobby")) {
326
+ if (name.includes("basic") || name.includes("starter")) {
331
327
  return "basic";
332
- } else if (name.includes("pro") || name.includes("professional") || name.includes("premium") || name.includes("team")) {
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 humanizeQuotaName(name);
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 (typeof description === "string" && description) {
392
- if (type === "number" && typeof value === "number") {
393
- return `${value.toLocaleString()} ${description}`;
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
- return `${value.toLocaleString()} ${label}`;
388
+ const formattedValue = value.toLocaleString();
389
+ return `${name}: ${formattedValue} ${unit || ""}`.trim();
409
390
  }
410
- return label;
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 = metadata.features && metadata.features.length > 0 ? metadata.features : extractDisplayFeatures(
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(GET_PLANS_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?.publicPlans) {
460
+ if (!response.data?.getAllPlans) {
488
461
  throw new Error("No plans data received");
489
462
  }
490
- const cards = response.data.publicPlans.filter((plan) => plan.isActive).map((plan) => transformToDisplayCard(plan, props)).sort((a, b) => a.priceRaw - b.priceRaw);
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 individualAllPlans = allPlans.filter((p) => !isEnterprisePlan(p.name));
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
- sectionHeading ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }) : (
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
- sectionHeading ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-4", children: sectionHeading }) : /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "sr-only", children: "Pricing" }),
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
- sectionHeading ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4", children: sectionHeading }) : /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "sr-only", children: "Pricing" }),
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
- props.showAudienceTabs && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center bg-muted p-1.5 rounded-xl", children: [
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-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"}`,
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-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"}`,
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: props.showAudienceTabs && audience === "enterprise" ? (
633
- /* Enterprise cards — from API, static prop, or built-in default */
634
- resolvedEnterprisePlans.map((ep) => {
635
- const subtitle = ep.subtitle || ep.description || "";
636
- const btnText = ep.button || ep.ctaText || "Get Started";
637
- const btnLink = ep.buttonLink || ep.ctaLink || props.appLoginUrl;
638
- const period = ep.period || ep.interval || "";
639
- const note = ep.note || "";
640
- const badge = ep.badge || "";
641
- const isPopular = ep.popular;
642
- const features = ep.features || [];
643
- const price = String(ep.price);
644
- return /* @__PURE__ */ jsxRuntime.jsxs(
645
- "div",
646
- {
647
- 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"}`,
648
- children: [
649
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-6", children: [
650
- isPopular && badge && /* @__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: badge }),
651
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl sm:text-2xl font-bold mb-2", children: ep.name }),
652
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm", children: subtitle })
653
- ] }),
654
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-2", children: [
655
- 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: [
656
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-4xl sm:text-5xl font-extrabold", children: price }),
657
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-lg", children: period })
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
- className: "w-full h-11",
676
- variant: isPopular ? "default" : "outline",
677
- size: "lg",
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
- ) : /* @__PURE__ */ jsxRuntime.jsx(
689
- Button,
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
- className: "w-full h-11",
692
- variant: isPopular ? "default" : "outline",
693
- size: "lg",
694
- asChild: true,
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
- ep.name
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) {