1import { r as reactExports, j as jsxRuntimeExports, cd as formatPaddlePrice, t as PrimaryButton, L } from "./web-DMpKYKrj.js"; 2import { A as AppleLogo } from "./appleLogo-BQgcP_xw.js"; 3import { b as resolveActivePlanHandle, c as countPendingGrantsByPlanId, d as resolvePlanCtaLabel } from "./Plan-C0qlSs5_.js"; 4import { C as CloseButton } from "./CloseButton-CfIymuTD.js"; 5function DismissibleNotice({ 6 title, 7 description, 8 className 9}) { 10 const [dismissed, setDismissed] = reactExports.useState(false); 11 if (dismissed) return null; 12 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 13 "div", 14 { 15 className: ` 16 flex items-center justify-between gap-4 rounded-[24px] 17 bg-bonza-pale-t-7 py-3 pl-6 pr-2 18 19 ${className} 20 `, 21 children: [ 22 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex grow flex-col items-center gap-0.5 text-center", children: [ 23 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[15px]", children: title }),
24 description && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-bonza-pale-t-70", children: description }) 25 ] }), 26 /* @__PURE__ */ jsxRuntimeExports.jsx( 27 CloseButton, 28 { 29 closeCallback: () => setDismissed(true), 30 size: 30, 31 className: "shrink-0 p-1" 32 } 33 ) 34 ] 35 } 36 ); 37} 38function Tick(props) { 39 return /* @__PURE__ */ jsxRuntimeExports.jsx( 40 "svg", 41 { 42 viewBox: "0 0 18 14", 43 fill: "none", 44 xmlns: "http://www.w3.org/2000/svg", 45 ...props, 46 children: /* @__PURE__ */ jsxRuntimeExports.jsx( 47 "path", 48 { 49 d: "M1 7.79452L5.60274 12.3973L17 1", 50 stroke: "currentColor", 51 strokeWidth: "2", 52 strokeLinecap: "round", 53 strokeLinejoin: "round" 54 } 55 ) 56 } 57 ); 58} 59function PricingCard({ 60 plan, 61 planOverride, 62 billingCycle = "once", 63 purchaseCallback, 64 buttonText, 65 showMacOnly, 66 className, 67 trialKeyPoint, 68 current, 69 disablePurchase, 70 inactiveGrantCount 71}) { 72 var _a, _b, _c, _d, _e, _f, _g, _h, _i; 73 if (!plan && !planOverride) { 74 return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {}); 75 } 76 const forWhoTitle = (planOverride == null ? void 0 : planOverride.forWhoTitle) ?? ((_a = plan == null ? void 0 : plan.metadata) == null ? void 0 : _a.display_forWhoTitle); 77 const currencySymbol = "£"; 78 const colour = (planOverride == null ? void 0 : planOverride.colour) ?? ((_b = plan == null ? void 0 : plan.metadata) == null ? void 0 : _b.display_colour) ?? "#ffffff"; 79 const name = (planOverride == null ? void 0 : planOverride.name) ?? ((_c = plan == null ? void 0 : plan.metadata) == null ? void 0 : _c.display_name); 80 const priceObj = plan == null ? void 0 : plan.prices.find( 81 (price2) => { 82 var _a2; 83 return billingCycle !== "once" ? ((_a2 = price2.billing_cycle) == null ? void 0 : _a2.interval) === billingCycle : price2.billing_cycle === null; 84 } 85 ); 86 if (!priceObj && !(planOverride == null ? void 0 : planOverride.price)) { 87 console.error( 88 "No price found for", 89 plan == null ? void 0 : plan.handle, 90 "with billing cycle:", 91 billingCycle, 92 "\n" 93 ); 94 } 95 const priceAmount = priceObj ? Number(priceObj.unit_price.amount) / 100 : null; 96 const price = (planOverride == null ? void 0 : planOverride.price) ?? formatPaddlePrice(priceObj); 97 const title = (planOverride == null ? void 0 : planOverride.title) ?? ((_d = plan == null ? void 0 : plan.metadata) == null ? void 0 : _d.display_title); 98 const subTitle = (planOverride == null ? void 0 : planOverride.subTitle) ?? (((_e = priceObj == null ? void 0 : priceObj.custom_data) == null ? void 0 : _e.display_subtitle) || ((_f = plan == null ? void 0 : plan.metadata) == null ? void 0 : _f.display_subtitle) || (billingCycle === "month" ? "Per month, cancel anytime" : billingCycle === "year" ? `Per month, ${currencySymbol}${priceAmount} billed yearly` : null)); 99 const keyPointBlock = (planOverride == null ? void 0 : planOverride.keyPointBlock) ?? ((_g = plan == null ? void 0 : plan.metadata) == null ? void 0 : _g.display_key_block); 100 const keyPoints = (planOverride == null ? void 0 : planOverride.keyPoints) ?? ((_h = plan == null ? void 0 : plan.metadata) == null ? void 0 : _h.display_key_points); 101 const keyExclusions = (planOverride == null ? void 0 : planOverride.keyExclusions) ?? ((_i = plan == null ? void 0 : plan.metadata) == null ? void 0 : _i.display_key_exclusions); 102 const paddlePriceId = (priceObj == null ? void 0 : priceObj.paddle_price_id) ?? void 0; 103 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 104 "div", 105 { 106 className: ` 107 relative flex min-h-[527px] min-w-[285px] max-w-[330px] grow 108 flex-col items-stretch justify-between rounded-[40px] border 109 border-bonza-pale-t-7 bg-bonza-dark 110 111 ${className} 112 `, 113 children: [
114 /* @__PURE__ */ jsxRuntimeExports.jsx( 115 "div", 116 { 117 className: `mx-[40px] h-0.5`, 118 style: { backgroundColor: colour } 119 } 120 ), 121 /* @__PURE__ */ jsxRuntimeExports.jsxs( 122 "div", 123 { 124 className: ` 125 flex w-full grow flex-col items-stretch justify-start 126 gap-4 px-[0px] py-4 127 `, 128 children: [ 129 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col mt-4", children: [ 130 name && /* @__PURE__ */ jsxRuntimeExports.jsx( 131 "span", 132 { 133 className: `text-center text-[25px]`, 134 style: { color: colour }, 135 children: name 136 } 137 ), 138 forWhoTitle && /* @__PURE__ */ jsxRuntimeExports.jsx( 139 "span", 140 { 141 className: `text-center text-[15px] text-bonza-pale-t-70`, 142 children: forWhoTitle 143 } 144 ) 145 ] }),
146 /* @__PURE__ */ jsxRuntimeExports.jsxs( 147 "div", 148 { 149 className: ` 150 flex grow flex-col items-stretch justify-between 151 gap-8 152 `, 153 children: [ 154 /* @__PURE__ */ jsxRuntimeExports.jsxs( 155 "div", 156 { 157 className: ` 158 mx-4 flex min-h-[105px] flex-col items-center 159 justify-start gap-1 160 `, 161 children: [ 162 current && /* @__PURE__ */ jsxRuntimeExports.jsx( 163 "span", 164 { 165 className: ` 166 mb-2 rounded-full border px-4 py-1 167 text-[12px] text-bonza-pale 168 `, 169 style: { borderColor: colour }, 170 children: "Currently active" 171 } 172 ), 173 price && /* @__PURE__ */ jsxRuntimeExports.jsx( 174 "div", 175 { 176 className: ` 177 flex flex-col items-center 178 justify-center gap-0 179 `, 180 children: /* @__PURE__ */ jsxRuntimeExports.jsx( 181 "span", 182 { 183 className: ` 184 -mb-2 items-end text-nowrap p-0 185 text-center text-[40px] 186 leading-tight 187 `, 188 children: price.split(".").map( 189 (part, index) => index === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: part }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[25px]", children: [ 190 ".", 191 part 192 ] }) 193 ) 194 } 195 ) 196 } 197 ), 198 title && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `text-center text-[25px]`, children: title }), 199 subTitle && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col", children: subTitle.split("\n").map((string, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 200 "span", 201 { 202 className: ` 203 text-center text-[15px] 204 text-bonza-pale-t-70 205 `, 206 children: string 207 }, 208 index 209 )) }), 210 showMacOnly ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mt-4", children: [
211 /* @__PURE__ */ jsxRuntimeExports.jsx(AppleLogo, { className: "mb-1 size-4 min-w-6" }), 212 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[15px]", children: "Available for macOS" }) 213 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-4", children: [ 214 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mt-4", children: [ 215 /* @__PURE__ */ jsxRuntimeExports.jsx( 216 AppleLogo, 217 { 218 className: "mb-1 size-6 min-w-6" 219 } 220 ), 221 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[15px]", children: "macOS" }) 222 ] }), 223 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mt-4", children: [
224 /* @__PURE__ */ jsxRuntimeExports.jsxs( 225 "div", 226 { 227 className: "size-4 grid grid-cols-[1fr_1fr] gap-[1px]", 228 children: [ 229 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-bonza-pale" }), 230 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-bonza-pale" }), 231 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-bonza-pale" }), 232 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-bonza-pale" }) 233 ] 234 } 235 ), 236 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[15px]", children: "Windows" }) 237 ] }) 238 ] }) 239 ] 240 } 241 ),
242 /* @__PURE__ */ jsxRuntimeExports.jsxs( 243 "ul", 244 { 245 className: ` 246 text-decoration-none ml-8 mr-6 flex 247 max-w-[250px] grow flex-col items-stretch gap-2 248 self-center text-left 249 `, 250 children: [ 251 keyPointBlock && /* @__PURE__ */ jsxRuntimeExports.jsx("li", { className: "mb-2 text-center", children: keyPointBlock }), 252 trialKeyPoint && /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-center gap-4", children: [ 253 /* @__PURE__ */ jsxRuntimeExports.jsx( 254 Tick, 255 { 256 className: ` 257 size-5 min-w-5 text-bonza-pale 258 `, 259 style: { color: colour } 260 } 261 ),
262 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: trialKeyPoint }) 263 ] }), 264 keyPoints == null ? void 0 : keyPoints.map((item, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs( 265 "li", 266 { 267 className: "flex items-center gap-4", 268 children: [ 269 /* @__PURE__ */ jsxRuntimeExports.jsx( 270 Tick, 271 { 272 className: ` 273 size-5 min-w-5 text-bonza-pale 274 `, 275 style: { color: colour } 276 } 277 ), 278 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: item }) 279 ] 280 }, 281 index 282 )), 283 keyExclusions == null ? void 0 : keyExclusions.map((item, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs( 284 "li", 285 { 286 className: "flex items-center gap-4", 287 children: [
288 /* @__PURE__ */ jsxRuntimeExports.jsx( 289 Plus, 290 { 291 className: ` 292 size-4 min-w-4 text-bonza-pale 293 `, 294 style: { color: colour } 295 } 296 ), 297 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: item }) 298 ] 299 }, 300 index 301 )) 302 ] 303 } 304 ) 305 ] 306 } 307 ) 308 ] 309 } 310 ), 311 purchaseCallback && /* @__PURE__ */ jsxRuntimeExports.jsxs( 312 "div", 313 { 314 className: "flex flex-col items-center justify-center gap-2 py-8", 315 children: [
316 /* @__PURE__ */ jsxRuntimeExports.jsx( 317 PrimaryButton, 318 { 319 onClick: () => purchaseCallback(paddlePriceId), 320 disabled: disablePurchase ?? current, 321 className: "w-[205px] py-4 rounded-full", 322 children: buttonText ?? "Continue" 323 } 324 ), 325 !!inactiveGrantCount && /* @__PURE__ */ jsxRuntimeExports.jsx( 326 "span", 327 { 328 className: "text-center text-[13px] text-bonza-pale-t-70", 329 children: `You have ${inactiveGrantCount} inactive ${inactiveGrantCount === 1 ? "pass" : "passes"} for this plan` 330 } 331 ) 332 ] 333 } 334 ) 335 ] 336 } 337 ); 338} 339function formatPaygDuration(hours) { 340 if (!hours) return "Session pass"; 341 if (hours % 720 === 0) { 342 const months = hours / 720; 343 return `${months} month${months > 1 ? "s" : ""} access`; 344 } 345 if (hours % 168 === 0) { 346 const weeks = hours / 168; 347 return `${weeks} week${weeks > 1 ? "s" : ""} access`; 348 } 349 return `${hours} hour${hours > 1 ? "s" : ""} access`; 350} 351function formatTimeRemaining(expiresAt) { 352 if (!expiresAt) return void 0; 353 const hoursRemaining = Math.max( 354 0, 355 Math.round( 356 (new Date(expiresAt).getTime() - Date.now()) / (60 * 60 * 1e3) 357 ) 358 ); 359 if (!hoursRemaining) return void 0; 360 return formatPaygDuration(hoursRemaining).replace(/ access$/, ""); 361}
362function formatTrialKeyPoint(trialEligible, trialDays) { 363 if (!trialEligible || !trialDays) return void 0; 364 return `${trialDays}-day free trial`; 365} 366function Prices({ 367 plans, 368 user, 369 selectPlanCallback, 370 selectContactSalesCallback, 371 showGuestPlan, 372 className, 373 innerPadding = true, 374 trialEligible, 375 trialDays, 376 contactSalesSent, 377 currentPlan, 378 activePlanGrant, 379 planGrants 380}) { 381 const plansFormatted = reactExports.useMemo( 382 () => Object.fromEntries(plans.map((plan) => [plan.handle, plan])), 383 [plans] 384 ); 385 const [billingCycle, setBillingCycle] = reactExports.useState("year"); 386 const [currencyCode, setCurrencyCode] = reactExports.useState("GBP"); 387 const paygoPlan = plansFormatted.paygo; 388 const trialKeyPoint = formatTrialKeyPoint(trialEligible, trialDays); 389 const activePlanHandle = reactExports.useMemo( 390 () => resolveActivePlanHandle(currentPlan, activePlanGrant), 391 [currentPlan, activePlanGrant] 392 ); 393 const inactiveGrantCountByPlanId = reactExports.useMemo( 394 () => countPendingGrantsByPlanId(planGrants), 395 [planGrants] 396 ); 397 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 398 "div", 399 { 400 className: ` 401 flex w-full flex-col items-center justify-center 402 gap-8 403 404 ${className} 405 `, 406 children: [
407 /* @__PURE__ */ jsxRuntimeExports.jsxs( 408 "div", 409 { 410 className: ` 411 z-10 flex flex-row flex-nowrap text-nowrap 412 rounded-full bg-bonza-pale-t-7 p-1 text-[17px] 413 414 md:gap-2 md:p-2 md:text-[20px] 415 `, 416 children: [ 417 /* @__PURE__ */ jsxRuntimeExports.jsx( 418 L, 419 { 420 className: ` 421 z-20 rounded-full px-8 py-2 422 423 md:px-10 md:py-3 424 425 ${billingCycle === "month" ? `bg-bonza-primary` : ""} 426 `, 427 onClick: () => setBillingCycle("month"), 428 children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Monthly" }) 429 } 430 ), 431 /* @__PURE__ */ jsxRuntimeExports.jsx( 432 L, 433 { 434 className: ` 435 z-20 rounded-full py-2 pl-8 pr-4 436 437 md:py-3 438 439 ${billingCycle === "year" ? `bg-bonza-primary` : ""} 440 `, 441 onClick: () => setBillingCycle("year"), 442 children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
443 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Yearly" }), 444 /* @__PURE__ */ jsxRuntimeExports.jsx( 445 "div", 446 { 447 className: ` 448 my-1 rounded-full bg-bonza-primary px-3 449 text-[15px] 450 451 md:text-[20px] 452 453 ${billingCycle === "year" ? `text-bonza-primary` : ""} 454 `, 455 style: billingCycle === "year" ? { backgroundColor: "white" } : {}, 456 children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "2 months free" }) 457 } 458 ) 459 ] }) 460 } 461 ) 462 ] 463 } 464 ), 465 activePlanGrant && /* @__PURE__ */ jsxRuntimeExports.jsx( 466 DismissibleNotice, 467 { 468 title: "Time remaining on your current plan will be saved", 469 description: `You have ${formatTimeRemaining(activePlanGrant.expires_at) ?? "time"} left on your current plan, it will be saved and resume once your new plan ends.`, 470 className: "w-full" 471 } 472 ),
473 /* @__PURE__ */ jsxRuntimeExports.jsxs( 474 "div", 475 { 476 className: ` 477 ${innerPadding ? `px-main py-main` : ""} z-10 flex w-full grow flex-row 478 flex-wrap items-stretch justify-center gap-x-4 479 gap-y-8 480 `, 481 children: [ 482 showGuestPlan && /* @__PURE__ */ jsxRuntimeExports.jsx( 483 PricingCard, 484 { 485 planOverride: { 486 name: "Guest Account", 487 colour: "#ffffff", 488 price: "Guest", 489 subTitle: "Join your bandmates", 490 keyPoints: [ 491 "Join sessions", 492 "Access Bonza when invited to a session" 493 ], 494 keyExclusions: ["Create session"], 495 forWhoTitle: "Join sessions for free" 496 }, 497 purchaseCallback: selectPlanCallback, 498 buttonText: user ? "Download" : "Sign up", 499 showMacOnly: true, 500 className: "z-10" 501 } 502 ), 503 paygoPlan == null ? void 0 : paygoPlan.prices.map((price) => { 504 var _a; 505 return /* @__PURE__ */ jsxRuntimeExports.jsx( 506 PricingCard, 507 { 508 plan: { ...paygoPlan, prices: [price] }, 509 planOverride: { 510 subTitle: formatPaygDuration( 511 (_a = price.custom_data) == null ? void 0 : _a.payg_duration_hours 512 ) 513 }, 514 purchaseCallback: selectPlanCallback, 515 buttonText: user ? "Continue" : "Sign up", 516 showMacOnly: true, 517 className: "z-10", 518 inactiveGrantCount: inactiveGrantCountByPlanId[paygoPlan.id], 519 current: activePlanHandle === paygoPlan.handle, 520 disablePurchase: false 521 }, 522 price.paddle_price_id 523 ); 524 }),
525 plansFormatted.musician && /* @__PURE__ */ jsxRuntimeExports.jsx( 526 BillingCyclePricingCard, 527 { 528 plan: plansFormatted.musician, 529 selectedBillingCycle: billingCycle, 530 purchaseCallback: selectPlanCallback, 531 user, 532 trialEligible, 533 trialKeyPoint, 534 currentPlan, 535 activePlanHandle, 536 inactiveGrantCountByPlanId 537 } 538 ), 539 plansFormatted.artist && /* @__PURE__ */ jsxRuntimeExports.jsx( 540 BillingCyclePricingCard, 541 { 542 plan: plansFormatted.artist, 543 selectedBillingCycle: billingCycle, 544 purchaseCallback: selectPlanCallback, 545 user, 546 trialEligible, 547 trialKeyPoint, 548 currentPlan, 549 activePlanHandle, 550 inactiveGrantCountByPlanId 551 } 552 ), 553 plansFormatted.educator && /* @__PURE__ */ jsxRuntimeExports.jsx( 554 BillingCyclePricingCard, 555 { 556 plan: plansFormatted.educator, 557 selectedBillingCycle: billingCycle, 558 purchaseCallback: selectPlanCallback, 559 user, 560 trialEligible, 561 trialKeyPoint, 562 currentPlan, 563 activePlanHandle, 564 inactiveGrantCountByPlanId 565 } 566 ),
567 selectContactSalesCallback && /* @__PURE__ */ jsxRuntimeExports.jsx( 568 PricingCard, 569 { 570 planOverride: { 571 name: "Enterprise", 572 colour: "#E8564B", 573 price: `Let's talk`, 574 subTitle: contactSalesSent ? "Contact form sent" : "For institutes and studio partners", 575 keyPointBlock: "Our most scalable and secure solution, fully customizable to suit your needs.", 576 forWhoTitle: "For organisations" 577 }, 578 purchaseCallback: () => { 579 selectContactSalesCallback(); 580 }, 581 buttonText: contactSalesSent ? "Send another" : "Contact us" 582 } 583 ) 584 ] 585 } 586 ), 587 user && /* @__PURE__ */ jsxRuntimeExports.jsx( 588 SpecialOffers, 589 { 590 currencySymbol: "£", 591 selectPlanCallback, 592 user, 593 plan: plansFormatted.founder 594 } 595 ) 596 ] 597 } 598 ); 599} 600const BillingCyclePricingCard = ({ 601 plan, 602 selectedBillingCycle, 603 purchaseCallback, 604 user, 605 trialEligible, 606 trialKeyPoint, 607 currentPlan, 608 activePlanHandle, 609 inactiveGrantCountByPlanId 610}) => { 611 const isCardlessTrialOfThisPlan = (currentPlan == null ? void 0 : currentPlan.kind) === "trial" && currentPlan.handle === plan.handle; 612 const isActive = !isCardlessTrialOfThisPlan && !!activePlanHandle && activePlanHandle === plan.handle; 613 return /* @__PURE__ */ jsxRuntimeExports.jsx( 614 PricingCard, 615 { 616 plan, 617 billingCycle: selectedBillingCycle, 618 purchaseCallback, 619 buttonText: isCardlessTrialOfThisPlan ? "Add card" : resolvePlanCtaLabel(plan.handle, user, trialEligible), 620 showMacOnly: true, 621 trialKeyPoint, 622 current: isActive, 623 inactiveGrantCount: inactiveGrantCountByPlanId == null ? void 0 : inactiveGrantCountByPlanId[plan.id] 624 } 625 ); 626}; 627const SpecialOffers = ({ 628 currencySymbol, 629 selectPlanCallback, 630 user, 631 plan 632}) => { 633 if (!plan) return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {}); 634 const prices = plan.prices; 635 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 636 "div", 637 { 638 className: ` 639 relative relative flex h-full min-h-[100px] w-full flex-row 640 items-stretch justify-start rounded-[40px] border 641 border-bonza-pale-t-7 bg-bonza-dark 642 `, 643 children: [
644 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `my-[40px] w-1 bg-bonza-primary` }), 645 /* @__PURE__ */ jsxRuntimeExports.jsxs( 646 "div", 647 { 648 className: ` 649 px-main my-[40px] flex w-full flex-col items-center 650 justify-between gap-8 651 652 md:flex-row 653 `, 654 children: [ 655 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-start gap-4", children: [ 656 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-start gap-1", children: [ 657 /* @__PURE__ */ jsxRuntimeExports.jsx( 658 "span", 659 { 660 className: ` 661 rounded-full bg-bonza-primary px-3 text-[12px] 662 `, 663 children: "Beta users only" 664 } 665 ), 666 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[25px]", children: "Beta testers offer" }),
667 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[15px] text-bonza-pale-t-70", children: "Have you been a member of the beta testing program? Get a lifetime discount!" }) 668 ] }), 669 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `text-[19px]`, children: "Hurry! This offer expires on 31st March 2026" }) 670 ] }), 671 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-row items-stretch", children: prices.map((priceItem, index) => { 672 var _a, _b, _c, _d; 673 const priceAmount = priceItem ? Number(priceItem.unit_price.amount) / 100 : null; 674 const price = priceAmount ? `${currencySymbol}${priceAmount}` : null; 675 const subtitle = ((_a = priceItem == null ? void 0 : priceItem.custom_data) == null ? void 0 : _a.display_subtitle) || ((_b = plan == null ? void 0 : plan.metadata) == null ? void 0 : _b.display_subtitle) || (((_c = priceItem.billing_cycle) == null ? void 0 : _c.interval) === "month" ? "Per month\nlifetime discount" : ((_d = priceItem.billing_cycle) == null ? void 0 : _d.interval) === "year" ? `Per year 676lifetime discount` : null); 677 return /* @__PURE__ */ jsxRuntimeExports.jsx( 678 SpecialOfferItem, 679 { 680 price: price ?? void 0, 681 currencySymbol, 682 selectPlanCallback: () => selectPlanCallback( 683 priceItem.paddle_price_id 684 ), 685 subtitle: subtitle ?? void 0 686 }, 687 index 688 ); 689 }) }) 690 ] 691 } 692 ) 693 ] 694 } 695 ); 696}; 697const SpecialOfferItem = ({ 698 selectPlanCallback, 699 className, 700 price, 701 subtitle 702}) => /* @__PURE__ */ jsxRuntimeExports.jsxs( 703 "div", 704 { 705 className: ` 706 flex flex-col items-center justify-between gap-2 px-4 707 708 ${className} 709 `, 710 children: [
711 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `flex grow flex-col items-center justify-start`, children: [ 712 price && /* @__PURE__ */ jsxRuntimeExports.jsx( 713 "span", 714 { 715 className: ` 716 -mb-2 items-end p-0 text-center text-[40px] 717 leading-tight 718 `, 719 children: price 720 } 721 ), 722 subtitle && /* @__PURE__ */ jsxRuntimeExports.jsx( 723 "div", 724 { 725 className: ` 726 flex max-w-[250px] flex-col items-center justify-center 727 gap-1 text-center text-bonza-pale-t-70 728 `, 729 children: subtitle.split("\n").map((string, index) => /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "m-0 p-0", children: string }, index)) 730 } 731 ) 732 ] }), 733 /* @__PURE__ */ jsxRuntimeExports.jsx( 734 PrimaryButton, 735 { 736 onClick: () => { 737 selectPlanCallback(); 738 }, 739 children: "Continue" 740 } 741 ) 742 ] 743 } 744); 745function Plus(props) { 746 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 747 "svg", 748 { 749 viewBox: "0 0 17 16", 750 fill: "currentColor", 751 stroke: "currentColor", 752 xmlns: "http://www.w3.org/2000/svg", 753 ...props, 754 children: [
755 /* @__PURE__ */ jsxRuntimeExports.jsx( 756 "path", 757 { 758 d: "M1.91406 1.41406L15.0858 14.5858", 759 strokeWidth: "2", 760 strokeLinecap: "round", 761 strokeLinejoin: "round" 762 } 763 ), 764 /* @__PURE__ */ jsxRuntimeExports.jsx( 765 "path", 766 { 767 d: "M15.0858 1.41406L1.91406 14.5858", 768 strokeWidth: "2", 769 strokeLinecap: "round", 770 strokeLinejoin: "round" 771 } 772 ) 773 ] 774 } 775 ); 776} 777export { 778 Prices as P, 779 Tick as T, 780 PricingCard as a, 781 formatPaygDuration as b, 782 formatTimeRemaining as f 783}; 784//# sourceMappingURL=cross-IzlYNrKV.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.