@bigz-app/booking-widget 1.1.4 → 1.1.6

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.
@@ -392,6 +392,7 @@
392
392
  "success.age": "{{age}} Jahre",
393
393
  "success.paymentSummary": "Zahlungsübersicht",
394
394
  "success.total": "Gesamtbetrag",
395
+ "success.discount": "Rabatt",
395
396
  "success.product": "Produkt",
396
397
  "success.contactInfo": "Kontaktdaten",
397
398
  "success.name": "Name:",
@@ -600,6 +601,7 @@
600
601
  "success.age": "{{age}} years",
601
602
  "success.paymentSummary": "Payment Summary",
602
603
  "success.total": "Total",
604
+ "success.discount": "Discount",
603
605
  "success.product": "Product",
604
606
  "success.contactInfo": "Contact Information",
605
607
  "success.name": "Name:",
@@ -808,6 +810,7 @@
808
810
  "success.age": "{{age}} años",
809
811
  "success.paymentSummary": "Resumen del pago",
810
812
  "success.total": "Total",
813
+ "success.discount": "Descuento",
811
814
  "success.product": "Producto",
812
815
  "success.contactInfo": "Datos de contacto",
813
816
  "success.name": "Nombre:",
@@ -1016,6 +1019,7 @@
1016
1019
  "success.age": "{{age}} anos",
1017
1020
  "success.paymentSummary": "Resumo do pagamento",
1018
1021
  "success.total": "Total",
1022
+ "success.discount": "Desconto",
1019
1023
  "success.product": "Produto",
1020
1024
  "success.contactInfo": "Dados de contacto",
1021
1025
  "success.name": "Nome:",
@@ -1224,6 +1228,7 @@
1224
1228
  "success.age": "{{age}} år",
1225
1229
  "success.paymentSummary": "Betalningssammanfattning",
1226
1230
  "success.total": "Totalt",
1231
+ "success.discount": "Rabatt",
1227
1232
  "success.product": "Produkt",
1228
1233
  "success.contactInfo": "Kontaktuppgifter",
1229
1234
  "success.name": "Namn:",
@@ -1350,7 +1355,7 @@
1350
1355
  const I18nContext = R$2(null);
1351
1356
  function I18nProvider({ configLocale, children }) {
1352
1357
  // Priority: configLocale (site owner) > persisted user choice > browser language > "de"
1353
- // If configLocale is set, the site owner has locked the language don't restore user choice.
1358
+ // If configLocale is set, the site owner has locked the language - don't restore user choice.
1354
1359
  const [overrideLocale, setOverrideLocale] = d$1(() => {
1355
1360
  if (configLocale)
1356
1361
  return null;
@@ -11127,6 +11132,13 @@
11127
11132
  return Object.assign({}, ...styles.filter(Boolean));
11128
11133
  }
11129
11134
 
11135
+ function getEffectivePrice(upsell, round) {
11136
+ const dp = upsell.discountPercent ?? 0;
11137
+ if (dp <= 0)
11138
+ return upsell.price;
11139
+ const raw = Math.round(upsell.price * (100 - dp) / 100);
11140
+ return round ? Math.floor(raw / 100) * 100 : raw;
11141
+ }
11130
11142
  // Local style aliases from shared styles
11131
11143
  const cardStyles = cardStyles$1.base;
11132
11144
  const sectionHeaderStyles = sectionStyles.header;
@@ -11137,6 +11149,7 @@
11137
11149
  const t$1 = useTranslations();
11138
11150
  const { locale } = useLocale();
11139
11151
  const timezone = useTimezone();
11152
+ const roundEnabled = systemConfig?.roundPricesEnabled !== false;
11140
11153
  const [appliedVouchers, setAppliedVouchers] = d$1([]);
11141
11154
  const paymentSectionRef = A$2(null);
11142
11155
  // Payment option: "deposit" or "full" - only relevant when deposit is available
@@ -11207,7 +11220,7 @@
11207
11220
  participantUpsellIds.forEach(upsellId => {
11208
11221
  const upsell = upsells.find(u => u.id === upsellId);
11209
11222
  if (upsell) {
11210
- total += upsell.price;
11223
+ total += getEffectivePrice(upsell, roundEnabled);
11211
11224
  }
11212
11225
  });
11213
11226
  }
@@ -11483,7 +11496,7 @@
11483
11496
  padding: 0,
11484
11497
  }, children: "\u00D7" })] }))] }), upsells.length > 0 && (u$2("div", { style: participantUpsellStyles.container, children: upsells.map((upsell) => {
11485
11498
  const isSelected = (participantUpsells[index] || []).includes(upsell.id);
11486
- return (u$2("label", { htmlFor: `upsell-${index}-${upsell.id}`, style: isSelected ? participantUpsellStyles.labelSelected : participantUpsellStyles.label, children: [u$2("input", { id: `upsell-${index}-${upsell.id}`, type: "checkbox", style: participantUpsellStyles.checkbox, checked: isSelected, onChange: () => toggleParticipantUpsell(index, upsell.id) }), u$2("span", { style: { fontWeight: 500 }, children: upsell.name }), u$2("span", { style: { fontSize: "12px", opacity: 0.8 }, children: ["(+", formatCurrency(upsell.price), ")"] })] }, upsell.id));
11499
+ return (u$2("label", { htmlFor: `upsell-${index}-${upsell.id}`, style: isSelected ? participantUpsellStyles.labelSelected : participantUpsellStyles.label, children: [u$2("input", { id: `upsell-${index}-${upsell.id}`, type: "checkbox", style: participantUpsellStyles.checkbox, checked: isSelected, onChange: () => toggleParticipantUpsell(index, upsell.id) }), u$2("span", { style: { fontWeight: 500 }, children: upsell.name }), u$2("span", { style: { fontSize: "12px", opacity: 0.8 }, children: ["(+", formatCurrency(getEffectivePrice(upsell, roundEnabled)), ")"] })] }, upsell.id));
11487
11500
  }) }))] }, index))), watchedParticipants.length < eventDetails.availableSpots ? (u$2("div", { style: {
11488
11501
  display: "flex",
11489
11502
  flexDirection: "column",
@@ -11515,7 +11528,7 @@
11515
11528
  const countWithUpsell = watchedParticipants.filter((p, idx) => p.name.trim() && (participantUpsells[idx] || []).includes(upsell.id)).length;
11516
11529
  if (countWithUpsell === 0)
11517
11530
  return null;
11518
- const upsellLineTotal = upsell.price * countWithUpsell;
11531
+ const upsellLineTotal = getEffectivePrice(upsell, roundEnabled) * countWithUpsell;
11519
11532
  return (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", fontSize: "13px" }, children: [u$2("span", { style: { color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+ ", upsell.name, " (", countWithUpsell, "\u00D7)"] }), u$2("span", { style: { color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(upsellLineTotal) })] }, upsell.id));
11520
11533
  })] })), appliedVouchers.length > 0 && (u$2(k$3, { children: [u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: t$1("summary.subtotal") }), u$2("span", { style: {
11521
11534
  fontFamily: "var(--bw-font-family)",
@@ -11640,7 +11653,7 @@
11640
11653
  : t$1("payment.fillRequired");
11641
11654
  return (u$2("div", { style: {
11642
11655
  ...cardStyles,
11643
- borderColor: "var(--bw-warning-color)",
11656
+ border: "1px solid var(--bw-warning-color)",
11644
11657
  color: "var(--bw-warning-color)",
11645
11658
  fontFamily: "var(--bw-font-family)",
11646
11659
  textAlign: "center",
@@ -11809,6 +11822,7 @@
11809
11822
  payments: data.payments,
11810
11823
  orderItems: data.orderItems,
11811
11824
  purchases: data.purchases || [],
11825
+ discount: data.discount || null,
11812
11826
  stripePaymentIntent: data.stripePaymentIntent,
11813
11827
  });
11814
11828
  setEventDetails({
@@ -12058,7 +12072,7 @@
12058
12072
  color: "var(--bw-text-color)",
12059
12073
  margin: "0",
12060
12074
  fontFamily: "var(--bw-font-family)",
12061
- }, children: t("success.paymentSummary") }) }), u$2("div", { className: "print-only", children: u$2("div", { className: "print-section-title", children: t("success.paymentSummary") }) }), u$2("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [u$2("div", { className: "print-hidden", style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [eventDetails.name, " (", booking.participantCount, "x ", formatCurrency(eventDetails.price), ")"] }), u$2("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(eventDetails.price * booking.participantCount) })] }), bookingData.purchases && bookingData.purchases.length > 0 && (u$2(k$3, { children: bookingData.purchases.map((purchase) => (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [purchase.product?.name || t("success.product"), " (", purchase.quantity, "x ", formatCurrency(purchase.unitPrice), ")"] }), u$2("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(purchase.totalPrice) })] }, purchase.id))) })), u$2("div", { style: {
12075
+ }, children: t("success.paymentSummary") }) }), u$2("div", { className: "print-only", children: u$2("div", { className: "print-section-title", children: t("success.paymentSummary") }) }), u$2("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [u$2("div", { className: "print-hidden", style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [eventDetails.name, " (", booking.participantCount, "x ", formatCurrency(eventDetails.price), ")"] }), u$2("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(eventDetails.price * booking.participantCount) })] }), bookingData.discount && bookingData.discount.amount > 0 && (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-success-color, #10B981)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [t("success.discount"), " (", bookingData.discount.code, ")"] }), u$2("span", { style: { color: "var(--bw-success-color, #10B981)", fontFamily: "var(--bw-font-family)" }, children: ["-", formatCurrency(bookingData.discount.amount)] })] })), bookingData.purchases && bookingData.purchases.length > 0 && (u$2(k$3, { children: bookingData.purchases.map((purchase) => (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [u$2("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [purchase.product?.name || t("success.product"), " (", purchase.quantity, "x ", formatCurrency(purchase.unitPrice), ")"] }), u$2("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(purchase.totalPrice) })] }, purchase.id))) })), u$2("div", { style: {
12062
12076
  display: "flex",
12063
12077
  justifyContent: "space-between",
12064
12078
  alignItems: "center",
@@ -13390,52 +13404,24 @@
13390
13404
  backgroundImage: "https://images.unsplash.com/photo-1502680390469-be75c86b636f?w=600&q=80",
13391
13405
  primaryColor: "#0c4a6e",
13392
13406
  secondaryColor: "#0891b2",
13393
- icon: "🏄‍♂️",
13394
- decorations: ["🎄", "⭐"],
13395
- animation: {
13396
- floatDuration: 3,
13397
- sparkleEnabled: true,
13398
- snowfallEnabled: true,
13399
- },
13400
13407
  };
13401
13408
  case "summer":
13402
13409
  return {
13403
13410
  backgroundImage: "https://images.unsplash.com/photo-1507525428034-b723cf961d3e?w=600&q=80",
13404
13411
  primaryColor: "#059669",
13405
13412
  secondaryColor: "#10b981",
13406
- icon: "☀️",
13407
- decorations: ["🌴", "🏖️"],
13408
- animation: {
13409
- floatDuration: 2.5,
13410
- sparkleEnabled: true,
13411
- snowfallEnabled: false,
13412
- },
13413
13413
  };
13414
13414
  case "beach":
13415
13415
  return {
13416
13416
  backgroundImage: "https://images.unsplash.com/photo-1502680390469-be75c86b636f?w=600&q=80",
13417
13417
  primaryColor: "#0891b2",
13418
13418
  secondaryColor: "#06b6d4",
13419
- icon: "🏄‍♀️",
13420
- decorations: ["🌊", "🏄"],
13421
- animation: {
13422
- floatDuration: 3,
13423
- sparkleEnabled: false,
13424
- snowfallEnabled: false,
13425
- },
13426
13419
  };
13427
13420
  default:
13428
13421
  return {
13429
13422
  backgroundImage: undefined,
13430
13423
  primaryColor: "#0c4a6e",
13431
13424
  secondaryColor: "#0891b2",
13432
- icon: "🎁",
13433
- decorations: [],
13434
- animation: {
13435
- floatDuration: 3,
13436
- sparkleEnabled: false,
13437
- snowfallEnabled: false,
13438
- },
13439
13425
  };
13440
13426
  }
13441
13427
  };
@@ -13493,192 +13479,152 @@
13493
13479
  position: "fixed",
13494
13480
  inset: 0,
13495
13481
  zIndex: 60,
13496
- backgroundColor: "rgba(0, 20, 40, 0.85)",
13497
- backdropFilter: "blur(4px)",
13482
+ backgroundColor: "rgba(0, 20, 40, 0.8)",
13483
+ backdropFilter: "blur(6px)",
13498
13484
  transition: "opacity 0.3s ease-out",
13499
13485
  opacity: isVisible ? 1 : 0,
13500
13486
  } }), u$2("div", { style: {
13501
13487
  position: "fixed",
13502
13488
  zIndex: 61,
13503
- width: "92%",
13504
- maxWidth: "440px",
13489
+ width: "90%",
13490
+ maxWidth: "400px",
13505
13491
  transition: "all 0.3s",
13506
13492
  top: "50%",
13507
13493
  left: "50%",
13508
- transform: `translate(-50%, -50%) scale(${isVisible ? 1 : 0.9})`,
13494
+ transform: `translate(-50%, -50%) scale(${isVisible ? 1 : 0.95})`,
13509
13495
  opacity: isVisible ? 1 : 0,
13510
- transitionTimingFunction: "cubic-bezier(0.34, 1.56, 0.64, 1)",
13496
+ transitionTimingFunction: "cubic-bezier(0.16, 1, 0.3, 1)",
13511
13497
  }, children: u$2("div", { style: {
13512
13498
  position: "relative",
13513
13499
  overflow: "hidden",
13514
- borderRadius: "28px",
13515
- boxShadow: "0 25px 60px -12px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.1), inset 0 1px 0 rgba(255,255,255,0.2)",
13500
+ borderRadius: "20px",
13501
+ boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.08)",
13516
13502
  background: `linear-gradient(165deg, ${themeConfig.primaryColor} 0%, ${themeConfig.primaryColor} 40%, ${themeConfig.secondaryColor} 100%)`,
13517
- }, children: [themeConfig.animation?.snowfallEnabled &&
13518
- Array.from({ length: 15 }).map((_, i) => (u$2("div", { style: {
13519
- position: "absolute",
13520
- pointerEvents: "none",
13521
- zIndex: 1,
13522
- color: "white",
13523
- opacity: 0,
13524
- left: `${5 + Math.random() * 90}%`,
13525
- top: "-10px",
13526
- fontSize: `${10 + Math.random() * 14}px`,
13527
- animation: `promo-snow ${4 + Math.random() * 3}s linear infinite`,
13528
- animationDelay: `${Math.random() * 4}s`,
13529
- }, children: "\u2744" }, i))), u$2("div", { style: {
13503
+ }, children: [themeConfig.backgroundImage && (u$2("div", { style: {
13530
13504
  position: "relative",
13531
- display: "flex",
13532
- alignItems: "center",
13533
- justifyContent: "center",
13505
+ height: "120px",
13534
13506
  overflow: "hidden",
13535
- height: "180px",
13536
- background: `linear-gradient(180deg, rgba(0,0,0,0) 0%, ${themeConfig.primaryColor}cc 100%)`,
13537
- }, children: [themeConfig.backgroundImage && (u$2("img", { src: themeConfig.backgroundImage, alt: "Background", style: {
13507
+ }, children: [u$2("img", { src: themeConfig.backgroundImage, alt: "", style: {
13538
13508
  position: "absolute",
13539
13509
  inset: 0,
13540
13510
  width: "100%",
13541
13511
  height: "100%",
13542
13512
  objectFit: "cover",
13543
- opacity: 0.6,
13544
- } })), u$2("div", { style: {
13513
+ opacity: 0.5,
13514
+ } }), u$2("div", { style: {
13545
13515
  position: "absolute",
13546
13516
  inset: 0,
13547
- background: `linear-gradient(180deg, ${themeConfig.primaryColor}4d 0%, ${themeConfig.primaryColor}e6 100%)`,
13548
- } }), u$2("div", { style: {
13549
- position: "relative",
13550
- zIndex: 2,
13551
- fontSize: "64px",
13552
- filter: "drop-shadow(0 8px 16px rgba(0,0,0,0.4))",
13553
- animation: `promo-float ${themeConfig.animation?.floatDuration || 3}s ease-in-out infinite`,
13554
- }, children: themeConfig.icon }), themeConfig.decorations &&
13555
- themeConfig.decorations.map((decoration, i) => (u$2("div", { style: {
13556
- position: "absolute",
13557
- top: i === 0 ? "16px" : "20px",
13558
- left: i === 0 ? "20px" : "auto",
13559
- right: i === 1 ? "20px" : "auto",
13560
- fontSize: i === 0 ? "28px" : "24px",
13561
- animation: themeConfig.animation?.sparkleEnabled
13562
- ? `promo-sparkle 2s ease-in-out infinite ${i * 0.5}s`
13563
- : undefined,
13564
- }, children: decoration }, i)))] }), u$2("button", { onClick: handleClose, style: {
13517
+ background: `linear-gradient(180deg, ${themeConfig.primaryColor}33 0%, ${themeConfig.primaryColor}ee 100%)`,
13518
+ } })] })), u$2("button", { onClick: handleClose, style: {
13565
13519
  position: "absolute",
13566
- top: "16px",
13567
- right: "16px",
13520
+ top: "12px",
13521
+ right: "12px",
13568
13522
  display: "flex",
13569
13523
  alignItems: "center",
13570
13524
  justifyContent: "center",
13571
13525
  cursor: "pointer",
13572
13526
  zIndex: 10,
13573
- width: "36px",
13574
- height: "36px",
13527
+ width: "32px",
13528
+ height: "32px",
13575
13529
  borderRadius: "50%",
13576
13530
  border: "none",
13577
- backgroundColor: "rgba(0, 0, 0, 0.3)",
13531
+ backgroundColor: "rgba(0, 0, 0, 0.25)",
13578
13532
  backdropFilter: "blur(4px)",
13579
- color: "white",
13580
- fontSize: "22px",
13533
+ color: "rgba(255,255,255,0.8)",
13534
+ fontSize: "18px",
13581
13535
  lineHeight: 1,
13582
- transition: "all 0.15s ease",
13536
+ transition: "background-color 0.15s ease",
13583
13537
  }, children: "\u00D7" }), u$2("div", { style: {
13584
13538
  position: "relative",
13585
13539
  textAlign: "center",
13586
13540
  zIndex: 2,
13587
- padding: "28px 28px 32px 28px",
13541
+ padding: "20px 24px 24px",
13588
13542
  }, children: [u$2("h2", { style: {
13589
- fontWeight: 800,
13590
- fontSize: "26px",
13543
+ fontWeight: 700,
13544
+ fontSize: "20px",
13591
13545
  color: "white",
13592
- marginBottom: "6px",
13593
- letterSpacing: "-0.025em",
13594
- filter: "drop-shadow(0 2px 8px rgba(0,0,0,0.3))",
13546
+ letterSpacing: "-0.02em",
13547
+ lineHeight: 1.25,
13595
13548
  margin: "0 0 6px 0",
13596
13549
  }, children: config.title }), u$2("p", { style: {
13597
- fontSize: "17px",
13598
- color: "rgba(255, 255, 255, 0.9)",
13599
- marginBottom: "20px",
13550
+ fontSize: "14px",
13551
+ color: "rgba(255, 255, 255, 0.85)",
13600
13552
  lineHeight: 1.5,
13601
- margin: "0 0 20px 0",
13602
- }, children: [config.subtitle, config.discountAmount && (u$2(k$3, { children: [u$2("br", {}), u$2("strong", { style: { color: themeConfig.secondaryColor }, children: [config.discountAmount, " ", t("promo.discount")] })] }))] }), config.discountCode && (u$2("div", { style: {
13603
- marginBottom: "20px",
13604
- backgroundColor: "white",
13605
- borderRadius: "16px",
13606
- padding: "18px 20px",
13607
- boxShadow: "0 8px 24px rgba(0,0,0,0.15), inset 0 -2px 0 rgba(0,0,0,0.05)",
13553
+ margin: "0 0 16px 0",
13554
+ }, children: [config.subtitle, config.discountAmount && (u$2(k$3, { children: [" - ", u$2("strong", { style: { color: "white" }, children: [config.discountAmount, " ", t("promo.discount")] })] }))] }), config.discountCode && (u$2("div", { style: {
13555
+ marginBottom: "16px",
13556
+ backgroundColor: "rgba(255,255,255,0.12)",
13557
+ borderRadius: "12px",
13558
+ padding: "12px 16px",
13559
+ border: "1px solid rgba(255,255,255,0.1)",
13608
13560
  }, children: [u$2("p", { style: {
13609
13561
  textTransform: "uppercase",
13610
- fontWeight: 600,
13611
- fontSize: "11px",
13562
+ fontWeight: 500,
13563
+ fontSize: "10px",
13612
13564
  letterSpacing: "1.5px",
13613
- color: "#64748b",
13614
- marginBottom: "10px",
13615
- margin: "0 0 10px 0",
13565
+ color: "rgba(255,255,255,0.6)",
13566
+ margin: "0 0 8px 0",
13616
13567
  }, children: t("promo.giftCode") }), u$2("div", { style: {
13617
13568
  display: "flex",
13618
13569
  alignItems: "center",
13619
13570
  justifyContent: "center",
13620
- gap: "12px",
13621
- }, children: [u$2("div", { style: {
13622
- padding: "10px 20px",
13623
- borderRadius: "10px",
13624
- background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
13625
- boxShadow: `0 4px 12px ${themeConfig.secondaryColor}4d`,
13626
- }, children: u$2("span", { style: {
13627
- fontWeight: 900,
13628
- fontSize: "28px",
13629
- color: "white",
13630
- letterSpacing: "6px",
13631
- filter: "drop-shadow(0 2px 4px rgba(0,0,0,0.2))",
13632
- }, children: discountCode }) }), u$2("button", { onClick: handleCopyCode, style: {
13571
+ gap: "10px",
13572
+ }, children: [u$2("span", { style: {
13573
+ fontWeight: 800,
13574
+ fontSize: "22px",
13575
+ color: "white",
13576
+ letterSpacing: "4px",
13577
+ fontFamily: "monospace, monospace",
13578
+ }, children: discountCode }), u$2("button", { onClick: handleCopyCode, style: {
13633
13579
  display: "flex",
13634
13580
  alignItems: "center",
13635
13581
  cursor: "pointer",
13636
13582
  whiteSpace: "nowrap",
13637
- padding: "12px 16px",
13638
- borderRadius: "10px",
13639
- border: "2px solid",
13640
- borderColor: copied ? "#22c55e" : "#e2e8f0",
13641
- backgroundColor: copied ? "#dcfce7" : "#f8fafc",
13642
- color: copied ? "#15803d" : "#475569",
13643
- fontSize: "13px",
13583
+ padding: "6px 12px",
13584
+ borderRadius: "8px",
13585
+ border: "1px solid rgba(255,255,255,0.2)",
13586
+ backgroundColor: copied
13587
+ ? "rgba(34, 197, 94, 0.2)"
13588
+ : "rgba(255,255,255,0.1)",
13589
+ color: copied ? "#86efac" : "rgba(255,255,255,0.8)",
13590
+ fontSize: "12px",
13644
13591
  fontWeight: 600,
13645
13592
  transition: "all 0.15s ease",
13646
- gap: "6px",
13647
- }, children: copied ? (u$2(k$3, { children: ["\u2713 ", t("promo.copied")] })) : (u$2(k$3, { children: [u$2("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [u$2("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), u$2("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), t("promo.copy")] })) })] })] })), config.activities && config.activities.length > 0 && (u$2("div", { style: {
13593
+ gap: "4px",
13594
+ }, children: copied ? (u$2(k$3, { children: ["\u2713 ", t("promo.copied")] })) : (u$2(k$3, { children: [u$2("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [u$2("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), u$2("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), t("promo.copy")] })) })] })] })), config.activities && config.activities.length > 0 && (u$2("div", { style: {
13648
13595
  display: "flex",
13649
13596
  justifyContent: "center",
13650
- gap: "8px",
13651
- marginBottom: "20px",
13597
+ gap: "6px",
13598
+ marginBottom: "16px",
13652
13599
  flexWrap: "wrap",
13653
13600
  }, children: config.activities.map((activity) => (u$2("span", { style: {
13654
13601
  fontWeight: 500,
13655
- backgroundColor: "rgba(255, 255, 255, 0.15)",
13656
- backdropFilter: "blur(4px)",
13657
- padding: "6px 12px",
13658
- borderRadius: "20px",
13659
- fontSize: "13px",
13660
- color: "white",
13602
+ backgroundColor: "rgba(255, 255, 255, 0.1)",
13603
+ padding: "4px 10px",
13604
+ borderRadius: "16px",
13605
+ fontSize: "12px",
13606
+ color: "rgba(255,255,255,0.85)",
13607
+ border: "1px solid rgba(255,255,255,0.08)",
13661
13608
  }, children: activity }, activity))) })), u$2("button", { onClick: handleCtaClick, style: {
13662
13609
  width: "100%",
13663
13610
  display: "flex",
13664
13611
  alignItems: "center",
13665
13612
  justifyContent: "center",
13666
13613
  cursor: "pointer",
13667
- fontWeight: 700,
13668
- padding: "18px 24px",
13669
- borderRadius: "14px",
13614
+ fontWeight: 600,
13615
+ padding: "14px 20px",
13616
+ borderRadius: "12px",
13670
13617
  border: "none",
13671
- color: "white",
13672
- fontSize: "18px",
13618
+ color: themeConfig.primaryColor,
13619
+ fontSize: "15px",
13673
13620
  transition: "all 0.15s ease",
13674
- gap: "10px",
13675
- background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
13676
- boxShadow: `0 8px 24px ${themeConfig.secondaryColor}66, inset 0 1px 0 rgba(255,255,255,0.2)`,
13677
- }, children: [config.ctaText, u$2("span", { children: "\u2192" })] }), config.validityText && (u$2("p", { style: {
13678
- marginTop: "16px",
13679
- fontSize: "12px",
13680
- color: "rgba(255, 255, 255, 0.6)",
13681
- margin: "16px 0 0 0",
13621
+ gap: "8px",
13622
+ background: "white",
13623
+ boxShadow: "0 4px 12px rgba(0,0,0,0.15)",
13624
+ }, children: [config.ctaText, u$2("span", { style: { fontSize: "14px" }, children: "\u2192" })] }), config.validityText && (u$2("p", { style: {
13625
+ fontSize: "11px",
13626
+ color: "rgba(255, 255, 255, 0.5)",
13627
+ margin: "12px 0 0 0",
13682
13628
  }, children: config.validityText }))] })] }) })] }));
13683
13629
  return $$1(dialogContent, portalContainer);
13684
13630
  }
@@ -13690,7 +13636,9 @@
13690
13636
  flexDirection: "column",
13691
13637
  padding: "16px",
13692
13638
  backgroundColor: "var(--bw-surface-color)",
13693
- border: "2px solid var(--bw-border-color)",
13639
+ borderWidth: "2px",
13640
+ borderStyle: "solid",
13641
+ borderColor: "var(--bw-border-color)",
13694
13642
  borderRadius: "var(--bw-border-radius)",
13695
13643
  cursor: "pointer",
13696
13644
  transition: "all 0.2s ease",
@@ -13715,7 +13663,9 @@
13715
13663
  const checkboxInnerStyles = {
13716
13664
  width: "24px",
13717
13665
  height: "24px",
13718
- border: "2px solid var(--bw-border-color)",
13666
+ borderWidth: "2px",
13667
+ borderStyle: "solid",
13668
+ borderColor: "var(--bw-border-color)",
13719
13669
  borderRadius: "6px",
13720
13670
  display: "flex",
13721
13671
  alignItems: "center",
@@ -13841,10 +13791,11 @@
13841
13791
  return t("upsells.reason.notEnoughSpots", { eventTypeName: reason.eventTypeName });
13842
13792
  }
13843
13793
  }
13844
- function UpsellCard({ upsell, isSelected, participantCount, onSelect, }) {
13794
+ function UpsellCard({ upsell, isSelected, participantCount, onSelect, roundPricesEnabled = true, }) {
13845
13795
  const t = useTranslations();
13846
13796
  const { locale } = useLocale();
13847
- const totalPrice = upsell.price * participantCount;
13797
+ const effectivePrice = getEffectiveUpsellPrice(upsell, roundPricesEnabled);
13798
+ const totalPrice = effectivePrice * participantCount;
13848
13799
  const isDisabled = !upsell.available;
13849
13800
  const getCardStyles = () => {
13850
13801
  if (isDisabled)
@@ -13862,12 +13813,19 @@
13862
13813
  weekday: "short",
13863
13814
  day: "numeric",
13864
13815
  month: "short",
13865
- })] }), u$2("span", { style: { color: "var(--bw-text-muted)" }, children: t("upsells.spotsFree", { count: upsell.suggestedEventInstance.availableSpots }) })] }))] }), u$2("div", { style: priceContainerStyles, children: [u$2("span", { style: pricePerPersonStyles, children: [formatCurrency(upsell.price), "/", t("common.perPerson")] }), participantCount > 1 && (u$2("span", { style: priceTotalStyles, children: ["= ", formatCurrency(totalPrice)] }))] }), isDisabled && (u$2("div", { style: unavailableOverlayStyles, children: u$2("span", { children: upsell.unavailableReason
13816
+ })] }), u$2("span", { style: { color: "var(--bw-text-muted)" }, children: t("upsells.spotsFree", { count: upsell.suggestedEventInstance.availableSpots }) })] }))] }), u$2("div", { style: priceContainerStyles, children: [u$2("span", { style: pricePerPersonStyles, children: [formatCurrency(effectivePrice), "/", t("common.perPerson")] }), participantCount > 1 && (u$2("span", { style: priceTotalStyles, children: ["= ", formatCurrency(totalPrice)] }))] }), isDisabled && (u$2("div", { style: unavailableOverlayStyles, children: u$2("span", { children: upsell.unavailableReason
13866
13817
  ? formatUnavailableReason(upsell.unavailableReason, t)
13867
13818
  : t("upsells.notAvailable") }) }))] }));
13868
13819
  }
13869
13820
 
13870
- function UpsellsStep({ upsells, selectedUpsells, participantCount, isLoading, isOpen, onClose, onSelect, onContinue, onBack, }) {
13821
+ function getEffectiveUpsellPrice(upsell, round = true) {
13822
+ const dp = upsell.discountPercent ?? 0;
13823
+ if (dp <= 0)
13824
+ return upsell.price;
13825
+ const raw = Math.round(upsell.price * (100 - dp) / 100);
13826
+ return round ? Math.floor(raw / 100) * 100 : raw;
13827
+ }
13828
+ function UpsellsStep({ upsells, selectedUpsells, participantCount, isLoading, isOpen, onClose, onSelect, onContinue, onBack, roundPricesEnabled = true, }) {
13871
13829
  const t = useTranslations();
13872
13830
  const selectUpsell = (upsellId) => {
13873
13831
  const exists = selectedUpsells.find((s) => s.upsellPackageId === upsellId);
@@ -13886,7 +13844,7 @@
13886
13844
  return selectedUpsells.reduce((total, selection) => {
13887
13845
  const upsell = upsells.find((u) => u.id === selection.upsellPackageId);
13888
13846
  if (upsell) {
13889
- return total + upsell.price * selection.quantity;
13847
+ return total + getEffectiveUpsellPrice(upsell, roundPricesEnabled) * selection.quantity;
13890
13848
  }
13891
13849
  return total;
13892
13850
  }, 0);
@@ -13894,7 +13852,7 @@
13894
13852
  const selectedTotal = calculateTotal();
13895
13853
  const selectedCount = selectedUpsells.length;
13896
13854
  const footerContent = (u$2(k$3, { children: [u$2("button", { type: "button", onClick: onBack, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: t("common.back") }), u$2("button", { type: "button", onClick: onContinue, style: mergeStyles(buttonStyles.primary, buttonStyles.fullWidth), children: selectedCount === 0 ? t("button.continueWithout") : t("button.continue") })] }));
13897
- return (u$2(Sidebar, { isOpen: isOpen, onClose: onClose, title: t("upsells.title"), footer: footerContent, children: u$2("div", { style: { display: "flex", flexDirection: "column", height: "100%", padding: "16px 16px" }, children: [isLoading && (u$2("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "12px", padding: "40px 20px", ...textStyles.muted }, children: [spinner(), u$2("span", { children: t("upsells.loading") })] })), !isLoading && upsells.length === 0 && (u$2("div", { style: { textAlign: "center", padding: "40px 20px", ...textStyles.muted }, children: u$2("p", { children: t("upsells.noExtras") }) })), !isLoading && upsells.length > 0 && (u$2("div", { style: { display: "flex", flexDirection: "column", gap: "12px", flex: 1, overflowY: "auto", paddingBottom: "16px" }, children: upsells.map((upsell) => (u$2(UpsellCard, { upsell: upsell, isSelected: isSelected(upsell.id), participantCount: participantCount, onSelect: () => selectUpsell(upsell.id) }, upsell.id))) })), selectedCount > 0 && (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: "16px", paddingBottom: "16px", paddingTop: "16px", borderTop: "1px solid var(--bw-border-color)", fontSize: "14px" }, children: [u$2("span", { style: textStyles.muted, children: selectedCount === 1 ? t("upsells.selected", { count: selectedCount }) : t("upsells.selectedPlural", { count: selectedCount }) }), u$2("span", { style: { fontWeight: 600, color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+", formatCurrency(selectedTotal)] })] }))] }) }));
13855
+ return (u$2(Sidebar, { isOpen: isOpen, onClose: onClose, title: t("upsells.title"), footer: footerContent, children: u$2("div", { style: { display: "flex", flexDirection: "column", height: "100%", padding: "16px 16px" }, children: [isLoading && (u$2("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "12px", padding: "40px 20px", ...textStyles.muted }, children: [spinner(), u$2("span", { children: t("upsells.loading") })] })), !isLoading && upsells.length === 0 && (u$2("div", { style: { textAlign: "center", padding: "40px 20px", ...textStyles.muted }, children: u$2("p", { children: t("upsells.noExtras") }) })), !isLoading && upsells.length > 0 && (u$2("div", { style: { display: "flex", flexDirection: "column", gap: "12px", flex: 1, overflowY: "auto", paddingBottom: "16px" }, children: upsells.map((upsell) => (u$2(UpsellCard, { upsell: upsell, isSelected: isSelected(upsell.id), participantCount: participantCount, onSelect: () => selectUpsell(upsell.id), roundPricesEnabled: roundPricesEnabled }, upsell.id))) })), selectedCount > 0 && (u$2("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: "16px", paddingBottom: "16px", paddingTop: "16px", borderTop: "1px solid var(--bw-border-color)", fontSize: "14px" }, children: [u$2("span", { style: textStyles.muted, children: selectedCount === 1 ? t("upsells.selected", { count: selectedCount }) : t("upsells.selectedPlural", { count: selectedCount }) }), u$2("span", { style: { fontWeight: 600, color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+", formatCurrency(selectedTotal)] })] }))] }) }));
13898
13856
  }
13899
13857
 
13900
13858
  // Main widget component
@@ -14154,6 +14112,7 @@
14154
14112
  connectedAccountId: data.connectedAccountId,
14155
14113
  mollieProfileId: data.mollieProfileId,
14156
14114
  mollieTestmode: data.mollieTestmode,
14115
+ roundPricesEnabled: data.roundPricesEnabled ?? true,
14157
14116
  });
14158
14117
  }
14159
14118
  if (data.stripePublishableKey) {
@@ -14212,6 +14171,7 @@
14212
14171
  connectedAccountId: data.connectedAccountId,
14213
14172
  mollieProfileId: data.mollieProfileId,
14214
14173
  mollieTestmode: data.mollieTestmode,
14174
+ roundPricesEnabled: data.roundPricesEnabled ?? true,
14215
14175
  });
14216
14176
  if (!stripePromise && data.stripePublishableKey) {
14217
14177
  const stripeOptions = {
@@ -14360,6 +14320,8 @@
14360
14320
  const handleBookingSuccess = (result) => {
14361
14321
  setIsSuccess(true);
14362
14322
  setSuccessPaymentIntentId(result.paymentIntent.id);
14323
+ setSidebarOpen(false);
14324
+ setShouldRenderBookingForm(false);
14363
14325
  config.onSuccess?.(result);
14364
14326
  };
14365
14327
  const handleBookingError = (errorMessage) => {
@@ -14616,7 +14578,7 @@
14616
14578
  setShouldRenderInstanceSelection(true);
14617
14579
  }
14618
14580
  }, children: config.buttonText ||
14619
- (isDirectInstanceMode ? t("button.bookNow") : t("button.selectDate")) }), shouldRenderInstanceSelection && (u$2(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: () => setSidebarOpen(false), isOpen: sidebarOpen && currentStep === "eventInstances", onClose: () => setSidebarOpen(false), isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (u$2(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack })), shouldRenderBookingForm && eventDetails && (u$2(BookingForm, { config: config, eventDetails: eventDetails, stripePromise: stripePromise, onSuccess: handleBookingSuccess, onError: handleBookingError, onBackToEventInstances: () => setCurrentStep(isDirectInstanceMode ? "eventTypes" : "eventInstances"), onBackToEventTypes: () => setSidebarOpen(false), selectedEventType: selectedEventType, selectedEventInstance: selectedEventInstance, isOpen: currentStep === "booking" && !!eventDetails, onClose: () => setCurrentStep(isDirectInstanceMode ? "eventTypes" : "eventInstances"), systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), u$2(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
14581
+ (isDirectInstanceMode ? t("button.bookNow") : t("button.selectDate")) }), shouldRenderInstanceSelection && (u$2(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: () => setSidebarOpen(false), isOpen: sidebarOpen && currentStep === "eventInstances", onClose: () => setSidebarOpen(false), isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (u$2(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack, roundPricesEnabled: systemConfig?.roundPricesEnabled !== false })), shouldRenderBookingForm && eventDetails && (u$2(BookingForm, { config: config, eventDetails: eventDetails, stripePromise: stripePromise, onSuccess: handleBookingSuccess, onError: handleBookingError, onBackToEventInstances: () => setCurrentStep(isDirectInstanceMode ? "eventTypes" : "eventInstances"), onBackToEventTypes: () => setSidebarOpen(false), selectedEventType: selectedEventType, selectedEventInstance: selectedEventInstance, isOpen: currentStep === "booking" && !!eventDetails, onClose: () => setCurrentStep(isDirectInstanceMode ? "eventTypes" : "eventInstances"), systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), u$2(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
14620
14582
  setIsSuccess(false);
14621
14583
  setCurrentStep("eventTypes");
14622
14584
  setSidebarOpen(false);
@@ -14663,7 +14625,7 @@
14663
14625
  };
14664
14626
  };
14665
14627
  const backHandlers = getBackHandlers();
14666
- return (u$2(StyleProvider, { config: config, children: [u$2("div", { ref: setWidgetContainerRef, children: [cardsView, shouldRenderInstanceSelection && (u$2(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: handleBackToEventTypes, isOpen: currentStep === "eventInstances", onClose: handleBackToEventTypes, isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (u$2(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack })), shouldRenderBookingForm && eventDetails && (u$2(BookingForm, { config: config, eventDetails: eventDetails, stripePromise: stripePromise, onSuccess: handleBookingSuccess, onError: handleBookingError, onBackToEventInstances: backHandlers.onBackToEventInstances, onBackToEventTypes: backHandlers.onBackToEventTypes, selectedEventType: selectedEventType, selectedEventInstance: selectedEventInstance, isOpen: currentStep === "booking" && !!eventDetails, onClose: backHandlers.onClose, systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), u$2(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
14628
+ return (u$2(StyleProvider, { config: config, children: [u$2("div", { ref: setWidgetContainerRef, children: [cardsView, shouldRenderInstanceSelection && (u$2(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: handleBackToEventTypes, isOpen: currentStep === "eventInstances", onClose: handleBackToEventTypes, isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (u$2(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack, roundPricesEnabled: systemConfig?.roundPricesEnabled !== false })), shouldRenderBookingForm && eventDetails && (u$2(BookingForm, { config: config, eventDetails: eventDetails, stripePromise: stripePromise, onSuccess: handleBookingSuccess, onError: handleBookingError, onBackToEventInstances: backHandlers.onBackToEventInstances, onBackToEventTypes: backHandlers.onBackToEventTypes, selectedEventType: selectedEventType, selectedEventInstance: selectedEventInstance, isOpen: currentStep === "booking" && !!eventDetails, onClose: backHandlers.onClose, systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), u$2(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
14667
14629
  setIsSuccess(false);
14668
14630
  setCurrentStep("eventTypes");
14669
14631
  setSuccessPaymentIntentId(null);
@@ -14724,7 +14686,7 @@
14724
14686
  }
14725
14687
  }
14726
14688
 
14727
- var css_248z = ".booking-widget-container{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;color:var(--bw-text-color,#1e293b);direction:ltr;display:block;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;position:relative;text-align:left}.booking-widget-container *,.booking-widget-container :after,.booking-widget-container :before{box-sizing:border-box;margin:0;padding:0}.booking-widget-container input,.booking-widget-container select,.booking-widget-container textarea{font-family:inherit;font-size:inherit;line-height:inherit}.booking-widget-container button{background:none;border:none;cursor:pointer;font-family:inherit;font-size:inherit}.booking-widget-container a{color:inherit;text-decoration:none}.booking-widget-container img{display:block;height:auto;max-width:100%;vertical-align:middle}.booking-widget-container ol,.booking-widget-container ul{list-style:none}.booking-widget-container h1,.booking-widget-container h2,.booking-widget-container h3,.booking-widget-container h4,.booking-widget-container h5,.booking-widget-container h6{font-size:inherit;font-weight:inherit}#booking-widget-portal{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);direction:ltr;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;text-align:left}#booking-widget-portal *,#booking-widget-portal :after,#booking-widget-portal :before{box-sizing:border-box}#booking-widget-portal-root{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);line-height:1.5}:root{--bw-highlight-color:#00b1aa;--bw-highlight-color-rgb:0,177,170;--bw-background-color:#f8fdfe;--bw-surface-color:#fff;--bw-text-color:#0e7490;--bw-text-muted:rgba(14,116,144,.7);--bw-border-color:#bae6fd;--bw-success-color:#38bdf8;--bw-warning-color:#fbbf24;--bw-error-color:#f43f5e;--bw-border-radius:18px;--bw-border-radius-small:calc(var(--bw-border-radius)*0.8);--bw-spacing:16px;--bw-spacing-large:24px;--bw-font-family:\"Inter\",system-ui,sans-serif;--bw-font-size:14px;--bw-font-size-large:18px;--bw-font-size-small:12px;--bw-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--bw-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--bw-highlight-muted:rgba(0,177,170,.1);--bw-highlight-subtle:rgba(0,177,170,.05);--bw-text-subtle:rgba(14,116,144,.4)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes shimmer{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}@keyframes promo-wave{0%,to{transform:translateX(0) translateY(0)}25%{transform:translateX(5px) translateY(-3px)}50%{transform:translateX(0) translateY(-5px)}75%{transform:translateX(-5px) translateY(-3px)}}@keyframes promo-float{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes promo-shimmer{0%{background-position:-200%}to{background-position:200%}}@keyframes promo-sparkle{0%,to{opacity:.3;transform:scale(1)}50%{opacity:1;transform:scale(1.2)}}@keyframes promo-snow{0%{opacity:0;transform:translateY(-10px) rotate(0deg)}10%{opacity:1}90%{opacity:1}to{opacity:0;transform:translateY(350px) rotate(1turn)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes slide-in-right{0%{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}@keyframes slide-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.animate-spin{animation:spin 1s linear infinite}.animate-shimmer{animation:shimmer 2s infinite}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-fade-in{animation:fade-in .2s ease-out}.animate-slide-in-up{animation:slide-in-up .3s ease-out}.animate-scale-in{animation:scale-in .2s ease-out}.skeleton-shimmer{overflow:hidden;position:relative}.skeleton-shimmer:after{animation:shimmer 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.3),transparent);content:\"\";height:100%;left:0;position:absolute;top:0;width:100%}@media (max-width:768px){.sidebar-mobile{border-radius:0!important;max-width:100%!important;width:100%!important}}@media (max-width:600px){.event-type-list{gap:12px!important;padding:8px!important}.event-type-card{flex:1 1 100%!important;max-width:100%!important;padding:0!important}.event-type-img{height:160px!important}.event-type-title{font-size:1.1rem!important}.event-type-desc{font-size:.8rem!important;max-height:100px!important;min-height:100px!important}.event-type-content{padding:16px 24px!important}}.event-type-markdown{overflow:visible!important}.event-type-markdown p{color:var(--bw-text-muted);font-family:var(--bw-font-family);line-height:1.6;margin:0 0 8px}.event-type-markdown p:last-child{margin-bottom:0}.event-type-markdown h2{font-size:18px!important;font-weight:700!important;margin:12px 0 6px!important}.event-type-markdown h2,.event-type-markdown h3{color:var(--bw-text-color)!important;line-height:1.3!important}.event-type-markdown h3{font-size:16px!important;font-weight:600!important;margin:10px 0 4px!important}.event-type-markdown strong{color:var(--bw-text-color);font-weight:600}.event-type-markdown em{font-style:italic}.event-type-markdown u{text-decoration:underline}.event-type-markdown ul{list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ul li{color:var(--bw-text-muted)!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ul li:before{color:var(--bw-text-color)!important;content:\"•\"!important;font-weight:700!important;left:-16px!important;position:absolute!important;top:0!important}.event-type-markdown ol{counter-reset:list-counter!important;list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ol li{color:var(--bw-text-muted)!important;counter-increment:list-counter!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ol li:before{color:var(--bw-text-color)!important;content:counter(list-counter) \".\"!important;font-weight:700!important;left:-20px!important;position:absolute!important;top:0!important}.event-type-markdown blockquote{border-left:2px solid var(--bw-border-color);color:var(--bw-text-muted);font-style:italic;margin:4px 0;padding-left:12px}.event-type-markdown a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{color:var(--bw-text-color);font-weight:600;margin-bottom:.5em}.markdown-content h1{font-size:1.5em}.markdown-content h2{font-size:1.25em}.markdown-content h3{font-size:1.1em}.markdown-content p{line-height:1.6;margin-bottom:1em}.markdown-content ol,.markdown-content ul{margin-bottom:1em;padding-left:1.5em}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content li{margin-bottom:.25em}.markdown-content a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content a:hover{opacity:.8}.markdown-content strong{font-weight:600}.markdown-content em{font-style:italic}.markdown-content code{background:var(--bw-highlight-subtle);border-radius:4px;font-family:monospace;font-size:.9em;padding:.125em .25em}.markdown-content blockquote{border-left:3px solid var(--bw-highlight-color);color:var(--bw-text-muted);margin:1em 0;padding-left:1em}.print-only{display:none}.print-hidden{display:block}@media print{.print-only{display:block}.print-hidden{display:none!important}.print-booking-header{border-bottom:2px solid #000;display:block;margin-bottom:24px;padding-bottom:16px;text-align:center}.print-booking-header h1{font-size:24px;margin:0 0 8px}.print-booking-header .subtitle{color:#666;font-size:14px}.print-booking-card{border:1px solid #ccc;border-radius:8px;margin-bottom:16px;padding:16px;page-break-inside:avoid}.print-section-title{border-bottom:1px solid #ddd;display:block;font-size:16px;font-weight:600;margin-bottom:12px;padding-bottom:8px}.print-detail-grid{display:grid;gap:12px;grid-template-columns:1fr 1fr}.print-detail-item{margin-bottom:8px}.print-detail-label{color:#666;font-size:12px;margin-bottom:4px}.print-detail-value{font-size:14px;font-weight:600}.print-status-badge{border-radius:9999px;display:inline-block;font-size:12px;font-weight:600;padding:4px 12px}.print-status-paid{background-color:#dcfce7;color:#166534;display:inline-block}.print-participant{align-items:center;background-color:#f9fafb;border-radius:4px;display:flex;justify-content:space-between;margin-bottom:8px;padding:8px}.print-participant-name{font-weight:600}.print-participant-age{color:#666;font-size:12px}.print-payment-summary{display:block}.print-payment-row{border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:4px 0}.print-payment-row:last-child{border-bottom:none;font-weight:600}.print-footer{border-top:1px solid #ddd;color:#666;display:block;font-size:12px;margin-top:24px;padding-top:16px;text-align:center}.print-footer p{margin:4px 0}}";
14689
+ var css_248z = ".booking-widget-container{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;color:var(--bw-text-color,#1e293b);direction:ltr;display:block;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;position:relative;text-align:left}.booking-widget-container *,.booking-widget-container :after,.booking-widget-container :before{box-sizing:border-box;margin:0;padding:0}.booking-widget-container input,.booking-widget-container select,.booking-widget-container textarea{font-family:inherit;font-size:inherit;line-height:inherit}.booking-widget-container button{background:none;border:none;cursor:pointer;font-family:inherit;font-size:inherit}.booking-widget-container a{color:inherit;text-decoration:none}.booking-widget-container img{display:block;height:auto;max-width:100%;vertical-align:middle}.booking-widget-container ol,.booking-widget-container ul{list-style:none}.booking-widget-container h1,.booking-widget-container h2,.booking-widget-container h3,.booking-widget-container h4,.booking-widget-container h5,.booking-widget-container h6{font-size:inherit;font-weight:inherit}#booking-widget-portal{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);direction:ltr;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;text-align:left}#booking-widget-portal *,#booking-widget-portal :after,#booking-widget-portal :before{box-sizing:border-box}#booking-widget-portal-root{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);line-height:1.5}:root{--bw-highlight-color:#00b1aa;--bw-highlight-color-rgb:0,177,170;--bw-background-color:#f8fdfe;--bw-surface-color:#fff;--bw-text-color:#0e7490;--bw-text-muted:rgba(14,116,144,.7);--bw-border-color:#bae6fd;--bw-success-color:#38bdf8;--bw-warning-color:#fbbf24;--bw-error-color:#f43f5e;--bw-border-radius:18px;--bw-border-radius-small:calc(var(--bw-border-radius)*0.8);--bw-spacing:16px;--bw-spacing-large:24px;--bw-font-family:\"Inter\",system-ui,sans-serif;--bw-font-size:14px;--bw-font-size-large:18px;--bw-font-size-small:12px;--bw-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--bw-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--bw-highlight-muted:rgba(0,177,170,.1);--bw-highlight-subtle:rgba(0,177,170,.05);--bw-text-subtle:rgba(14,116,144,.4)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes shimmer{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes slide-in-right{0%{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}@keyframes slide-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.animate-spin{animation:spin 1s linear infinite}.animate-shimmer{animation:shimmer 2s infinite}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-fade-in{animation:fade-in .2s ease-out}.animate-slide-in-up{animation:slide-in-up .3s ease-out}.animate-scale-in{animation:scale-in .2s ease-out}.skeleton-shimmer{overflow:hidden;position:relative}.skeleton-shimmer:after{animation:shimmer 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.3),transparent);content:\"\";height:100%;left:0;position:absolute;top:0;width:100%}@media (max-width:768px){.sidebar-mobile{border-radius:0!important;max-width:100%!important;width:100%!important}}@media (max-width:600px){.event-type-list{gap:12px!important;padding:8px!important}.event-type-card{flex:1 1 100%!important;max-width:100%!important;padding:0!important}.event-type-img{height:160px!important}.event-type-title{font-size:1.1rem!important}.event-type-desc{font-size:.8rem!important;max-height:100px!important;min-height:100px!important}.event-type-content{padding:16px 24px!important}}.event-type-markdown{overflow:visible!important}.event-type-markdown p{color:var(--bw-text-muted);font-family:var(--bw-font-family);line-height:1.6;margin:0 0 8px}.event-type-markdown p:last-child{margin-bottom:0}.event-type-markdown h2{font-size:18px!important;font-weight:700!important;margin:12px 0 6px!important}.event-type-markdown h2,.event-type-markdown h3{color:var(--bw-text-color)!important;line-height:1.3!important}.event-type-markdown h3{font-size:16px!important;font-weight:600!important;margin:10px 0 4px!important}.event-type-markdown strong{color:var(--bw-text-color);font-weight:600}.event-type-markdown em{font-style:italic}.event-type-markdown u{text-decoration:underline}.event-type-markdown ul{list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ul li{color:var(--bw-text-muted)!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ul li:before{color:var(--bw-text-color)!important;content:\"•\"!important;font-weight:700!important;left:-16px!important;position:absolute!important;top:0!important}.event-type-markdown ol{counter-reset:list-counter!important;list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ol li{color:var(--bw-text-muted)!important;counter-increment:list-counter!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ol li:before{color:var(--bw-text-color)!important;content:counter(list-counter) \".\"!important;font-weight:700!important;left:-20px!important;position:absolute!important;top:0!important}.event-type-markdown blockquote{border-left:2px solid var(--bw-border-color);color:var(--bw-text-muted);font-style:italic;margin:4px 0;padding-left:12px}.event-type-markdown a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{color:var(--bw-text-color);font-weight:600;margin-bottom:.5em}.markdown-content h1{font-size:1.5em}.markdown-content h2{font-size:1.25em}.markdown-content h3{font-size:1.1em}.markdown-content p{line-height:1.6;margin-bottom:1em}.markdown-content ol,.markdown-content ul{margin-bottom:1em;padding-left:1.5em}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content li{margin-bottom:.25em}.markdown-content a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content a:hover{opacity:.8}.markdown-content strong{font-weight:600}.markdown-content em{font-style:italic}.markdown-content code{background:var(--bw-highlight-subtle);border-radius:4px;font-family:monospace;font-size:.9em;padding:.125em .25em}.markdown-content blockquote{border-left:3px solid var(--bw-highlight-color);color:var(--bw-text-muted);margin:1em 0;padding-left:1em}.print-only{display:none}.print-hidden{display:block}@media print{.print-only{display:block}.print-hidden{display:none!important}.print-booking-header{border-bottom:2px solid #000;display:block;margin-bottom:24px;padding-bottom:16px;text-align:center}.print-booking-header h1{font-size:24px;margin:0 0 8px}.print-booking-header .subtitle{color:#666;font-size:14px}.print-booking-card{border:1px solid #ccc;border-radius:8px;margin-bottom:16px;padding:16px;page-break-inside:avoid}.print-section-title{border-bottom:1px solid #ddd;display:block;font-size:16px;font-weight:600;margin-bottom:12px;padding-bottom:8px}.print-detail-grid{display:grid;gap:12px;grid-template-columns:1fr 1fr}.print-detail-item{margin-bottom:8px}.print-detail-label{color:#666;font-size:12px;margin-bottom:4px}.print-detail-value{font-size:14px;font-weight:600}.print-status-badge{border-radius:9999px;display:inline-block;font-size:12px;font-weight:600;padding:4px 12px}.print-status-paid{background-color:#dcfce7;color:#166534;display:inline-block}.print-participant{align-items:center;background-color:#f9fafb;border-radius:4px;display:flex;justify-content:space-between;margin-bottom:8px;padding:8px}.print-participant-name{font-weight:600}.print-participant-age{color:#666;font-size:12px}.print-payment-summary{display:block}.print-payment-row{border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:4px 0}.print-payment-row:last-child{border-bottom:none;font-weight:600}.print-footer{border-top:1px solid #ddd;color:#666;display:block;font-size:12px;margin-top:24px;padding-top:16px;text-align:center}.print-footer p{margin:4px 0}}";
14728
14690
  styleInject(css_248z);
14729
14691
 
14730
14692
  // Export init function for vanilla JS usage with Preact