@bigz-app/booking-widget 1.1.0 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -5036,7 +5036,7 @@ function Accordion({ title, priceInfo, children, isOpen, onToggle, }) {
5036
5036
  transition: "background-color 0.2s ease",
5037
5037
  }, children: [jsxRuntime.jsx("span", { style: {
5038
5038
  fontWeight: 700,
5039
- fontSize: "20px",
5039
+ fontSize: "18px",
5040
5040
  color: "var(--bw-text-color)",
5041
5041
  }, children: title }), priceInfo && (jsxRuntime.jsx("div", { style: {
5042
5042
  marginLeft: "auto",
@@ -9158,11 +9158,11 @@ const sectionStyles = {
9158
9158
  fontSize: "16px",
9159
9159
  fontWeight: 600,
9160
9160
  color: "var(--bw-highlight-color)",
9161
+ margin: 0,
9161
9162
  marginBottom: "12px",
9162
9163
  fontFamily: "var(--bw-font-family)",
9163
9164
  borderBottom: "2px solid var(--bw-highlight-color)",
9164
9165
  paddingBottom: "4px",
9165
- margin: 0,
9166
9166
  }};
9167
9167
  // ============================================
9168
9168
  // TEXT
@@ -9241,6 +9241,8 @@ const errorTextStyles = formStyles.error;
9241
9241
  function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError, onBackToEventInstances, onBackToEventTypes, selectedEventType, selectedEventInstance, isOpen, onClose, systemConfig, selectedUpsells = [], upsells = [], }) {
9242
9242
  const [appliedVouchers, setAppliedVouchers] = React__default.useState([]);
9243
9243
  const paymentSectionRef = React__default.useRef(null);
9244
+ // Payment option: "deposit" or "full" - only relevant when deposit is available
9245
+ const [paymentOption, setPaymentOption] = React__default.useState("deposit");
9244
9246
  // Per-participant upsell selections: participantIndex -> array of upsell package IDs
9245
9247
  const [participantUpsells, setParticipantUpsells] = React__default.useState({});
9246
9248
  const form = useForm({
@@ -9256,11 +9258,11 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9256
9258
  },
9257
9259
  });
9258
9260
  const watchedParticipants = form.watch("participants");
9261
+ const watchedCustomerName = form.watch("customerName");
9259
9262
  const watchedCustomerEmail = form.watch("customerEmail");
9260
9263
  const customerNameError = form.formState.errors.customerName;
9261
9264
  const customerEmailError = form.formState.errors.customerEmail;
9262
9265
  const watchedAcceptTerms = form.watch("acceptTerms");
9263
- const { isValid: isFormValid } = form.formState;
9264
9266
  // Initialize participant upsells from selectedUpsells when component mounts or participants change
9265
9267
  React__default.useEffect(() => {
9266
9268
  if (selectedUpsells.length > 0 && upsells.length > 0) {
@@ -9344,7 +9346,10 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9344
9346
  const depositAmount = calculateDeposit();
9345
9347
  // Deposit stays fixed unless the discounted total is lower than the deposit
9346
9348
  // (discount applies to total price, not to the deposit itself)
9347
- const paymentAmount = depositAmount > 0 ? Math.min(depositAmount, totalAmount) : totalAmount;
9349
+ const hasDepositOption = depositAmount > 0 && depositAmount < totalAmount;
9350
+ const paymentAmount = hasDepositOption && paymentOption === "deposit"
9351
+ ? Math.min(depositAmount, totalAmount)
9352
+ : totalAmount;
9348
9353
  // Convert per-participant upsells to UpsellSelection[] format for API
9349
9354
  // Includes participantIndices to track which participants selected each upsell
9350
9355
  const aggregatedUpsellSelections = React__default.useCallback(() => {
@@ -9377,9 +9382,18 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9377
9382
  setAppliedVouchers((prev) => prev.filter((v) => v.code !== code));
9378
9383
  }, []);
9379
9384
  const isReadyForPayment = () => {
9380
- const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
9381
- const participantsWithinLimit = participantCount <= (eventDetails?.availableSpots || 0);
9382
- return isFormValid && participantsWithinLimit && participantCount > 0;
9385
+ const participantsWithNames = watchedParticipants.filter((p) => p.name.trim()).length;
9386
+ const totalParticipantRows = watchedParticipants.length;
9387
+ const allParticipantsHaveNames = participantsWithNames === totalParticipantRows;
9388
+ const participantsWithinLimit = participantsWithNames <= (eventDetails?.availableSpots || 0);
9389
+ const hasValidCustomerName = watchedCustomerName && watchedCustomerName.trim().length >= 2;
9390
+ const hasValidCustomerEmail = watchedCustomerEmail && watchedCustomerEmail.trim().length > 0 && !customerEmailError;
9391
+ return allParticipantsHaveNames &&
9392
+ participantsWithinLimit &&
9393
+ participantsWithNames > 0 &&
9394
+ hasValidCustomerName &&
9395
+ hasValidCustomerEmail &&
9396
+ watchedAcceptTerms;
9383
9397
  };
9384
9398
  React__default.useEffect(() => {
9385
9399
  if (appliedVouchers.length > 0) {
@@ -9496,7 +9510,7 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9496
9510
  gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
9497
9511
  gap: "12px",
9498
9512
  fontSize: "14px",
9499
- }, children: [jsxRuntime.jsxs("div", { style: { marginTop: "10px", display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9513
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9500
9514
  color: "var(--bw-text-muted)",
9501
9515
  fontFamily: "var(--bw-font-family)",
9502
9516
  display: "flex",
@@ -9542,7 +9556,7 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9542
9556
  justifyContent: "space-between",
9543
9557
  alignItems: "center",
9544
9558
  marginBottom: "16px",
9545
- }, children: jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles, margin: 0 }, children: "Teilnehmer" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [watchedParticipants.map((_, index) => (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", alignItems: "center" }, children: [jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-name-${index}`, style: labelStyles, children: "Name *" }), jsxRuntime.jsx("input", { id: `participant-name-${index}`, ...form.register(`participants.${index}.name`), type: "text", style: inputStyles, placeholder: "Teilnehmername" }), form.formState.errors.participants?.[index]?.name && (jsxRuntime.jsx("p", { style: errorTextStyles, children: form.formState.errors.participants[index]?.name?.message }))] }), jsxRuntime.jsxs("div", { style: { width: "80px" }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-age-${index}`, style: labelStyles, children: "Alter" }), jsxRuntime.jsx("input", { id: `participant-age-${index}`, ...form.register(`participants.${index}.age`, {
9559
+ }, children: jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles, marginBottom: 0 }, children: "Teilnehmer" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [watchedParticipants.map((_, index) => (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", alignItems: "center" }, children: [jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-name-${index}`, style: labelStyles, children: "Name *" }), jsxRuntime.jsx("input", { id: `participant-name-${index}`, ...form.register(`participants.${index}.name`), type: "text", style: inputStyles, placeholder: "Teilnehmername" }), form.formState.errors.participants?.[index]?.name && (jsxRuntime.jsx("p", { style: errorTextStyles, children: form.formState.errors.participants[index]?.name?.message }))] }), jsxRuntime.jsxs("div", { style: { width: "80px" }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-age-${index}`, style: labelStyles, children: "Alter" }), jsxRuntime.jsx("input", { id: `participant-age-${index}`, ...form.register(`participants.${index}.age`, {
9546
9560
  setValueAs: (value) => {
9547
9561
  if (value === "" || value === null || value === undefined) {
9548
9562
  return undefined;
@@ -9621,7 +9635,57 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9621
9635
  }, children: ["Gutschein (", giftCard.code, "):"] }), jsxRuntime.jsxs("span", { style: { color: "var(--bw-success-color)", fontFamily: "var(--bw-font-family)" }, children: ["-", formatCurrency(giftCard.balanceToUse || giftCard.discountAmount)] })] }, giftCard.code)))] })), jsxRuntime.jsxs("div", { style: {
9622
9636
  borderTop: "1px solid var(--bw-border-color)",
9623
9637
  paddingTop: "12px",
9624
- }, children: [depositAmount > 0 && (jsxRuntime.jsxs("div", { style: {
9638
+ }, children: [hasDepositOption && (jsxRuntime.jsxs("div", { style: {
9639
+ display: "flex",
9640
+ gap: "8px",
9641
+ marginBottom: "16px",
9642
+ }, children: [jsxRuntime.jsxs("button", { type: "button", onClick: () => setPaymentOption("deposit"), style: {
9643
+ flex: 1,
9644
+ padding: "12px",
9645
+ borderRadius: "var(--bw-border-radius)",
9646
+ border: paymentOption === "deposit"
9647
+ ? "2px solid var(--bw-highlight-color)"
9648
+ : "1px solid var(--bw-border-color)",
9649
+ backgroundColor: paymentOption === "deposit"
9650
+ ? "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)"
9651
+ : "var(--bw-surface-color)",
9652
+ cursor: "pointer",
9653
+ fontFamily: "var(--bw-font-family)",
9654
+ transition: "all 0.2s ease",
9655
+ }, children: [jsxRuntime.jsx("div", { style: {
9656
+ fontSize: "13px",
9657
+ color: "var(--bw-text-muted)",
9658
+ marginBottom: "4px",
9659
+ }, children: "Anzahlung" }), jsxRuntime.jsx("div", { style: {
9660
+ fontSize: "18px",
9661
+ fontWeight: 700,
9662
+ color: paymentOption === "deposit"
9663
+ ? "var(--bw-highlight-color)"
9664
+ : "var(--bw-text-color)",
9665
+ }, children: formatCurrency(depositAmount) })] }), jsxRuntime.jsxs("button", { type: "button", onClick: () => setPaymentOption("full"), style: {
9666
+ flex: 1,
9667
+ padding: "12px",
9668
+ borderRadius: "var(--bw-border-radius)",
9669
+ border: paymentOption === "full"
9670
+ ? "2px solid var(--bw-highlight-color)"
9671
+ : "1px solid var(--bw-border-color)",
9672
+ backgroundColor: paymentOption === "full"
9673
+ ? "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)"
9674
+ : "var(--bw-surface-color)",
9675
+ cursor: "pointer",
9676
+ fontFamily: "var(--bw-font-family)",
9677
+ transition: "all 0.2s ease",
9678
+ }, children: [jsxRuntime.jsx("div", { style: {
9679
+ fontSize: "13px",
9680
+ color: "var(--bw-text-muted)",
9681
+ marginBottom: "4px",
9682
+ }, children: "Vollst\u00E4ndig bezahlen" }), jsxRuntime.jsx("div", { style: {
9683
+ fontSize: "18px",
9684
+ fontWeight: 700,
9685
+ color: paymentOption === "full"
9686
+ ? "var(--bw-highlight-color)"
9687
+ : "var(--bw-text-color)",
9688
+ }, children: formatCurrency(totalAmount) })] })] })), hasDepositOption && paymentOption === "deposit" && (jsxRuntime.jsxs("div", { style: {
9625
9689
  display: "flex",
9626
9690
  justifyContent: "space-between",
9627
9691
  alignItems: "center",
@@ -9637,31 +9701,48 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9637
9701
  alignItems: "center",
9638
9702
  fontSize: "18px",
9639
9703
  fontWeight: 600,
9640
- }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: depositAmount > 0 ? "Heute zu zahlen (Anzahlung):" : "Gesamtbetrag:" }), jsxRuntime.jsx("span", { style: {
9704
+ }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: hasDepositOption && paymentOption === "deposit"
9705
+ ? "Heute zu zahlen (Anzahlung):"
9706
+ : "Gesamtbetrag:" }), jsxRuntime.jsx("span", { style: {
9641
9707
  color: "var(--bw-highlight-color)",
9642
9708
  fontFamily: "var(--bw-font-family)",
9643
9709
  fontWeight: 700,
9644
- }, children: formatCurrency(paymentAmount) })] })] })] })] }), jsxRuntime.jsx("div", { ref: paymentSectionRef, children: stripePromise &&
9710
+ }, children: formatCurrency(paymentAmount) })] }), hasDepositOption && paymentOption === "deposit" && (jsxRuntime.jsxs("div", { style: {
9711
+ fontSize: "12px",
9712
+ color: "var(--bw-text-muted)",
9713
+ fontFamily: "var(--bw-font-family)",
9714
+ marginTop: "8px",
9715
+ textAlign: "right",
9716
+ }, children: ["Restbetrag (", formatCurrency(totalAmount - depositAmount), ") vor Ort f\u00E4llig."] }))] })] })] }), jsxRuntime.jsx("div", { ref: paymentSectionRef, children: stripePromise &&
9645
9717
  (() => {
9646
9718
  if (!isReadyForPayment()) {
9647
- const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
9719
+ const participantsWithNames = watchedParticipants.filter((p) => p.name.trim()).length;
9720
+ const totalParticipantRows = watchedParticipants.length;
9721
+ const participantsWithoutNames = totalParticipantRows - participantsWithNames;
9648
9722
  const missing = [];
9649
- if (participantCount === 0) {
9650
- missing.push("einen Teilnehmer");
9723
+ if (participantsWithNames === 0) {
9724
+ missing.push("mindestens einen Teilnehmer mit Namen");
9651
9725
  }
9652
- if (participantCount > (eventDetails?.availableSpots || 0)) {
9726
+ else if (participantsWithoutNames > 0) {
9727
+ missing.push(`Namen für alle ${totalParticipantRows} Teilnehmer`);
9728
+ }
9729
+ if (participantsWithNames > (eventDetails?.availableSpots || 0)) {
9653
9730
  missing.push(`die Anzahl der Teilnehmer auf ${eventDetails?.availableSpots || 0} zu reduzieren`);
9654
9731
  }
9655
- if (customerNameError) {
9656
- missing.push("einen gültigen Namen (mindestens 2 Zeichen)");
9732
+ // Check for empty or invalid name (min 2 chars required)
9733
+ if (!watchedCustomerName || watchedCustomerName.trim().length < 2 || customerNameError) {
9734
+ missing.push("einen gültigen Kontaktnamen");
9657
9735
  }
9658
- if (customerEmailError) {
9736
+ // Check for empty or invalid email
9737
+ if (!watchedCustomerEmail || watchedCustomerEmail.trim().length === 0 || customerEmailError) {
9659
9738
  missing.push("eine gültige E-Mail-Adresse");
9660
9739
  }
9661
9740
  if (!watchedAcceptTerms) {
9662
- missing.push("die Akzeptanz der Allgemeinen Geschäftsbedingungen");
9741
+ missing.push("die Akzeptanz der AGBs");
9663
9742
  }
9664
- const message = `Bitte gib mindestens ${missing.join(", ")} an, um fortzufahren.`;
9743
+ const message = missing.length > 0
9744
+ ? `Wir benötigen mindestens ${missing.join(", ")} um fortzufahren.`
9745
+ : "Bitte fülle alle Pflichtfelder aus, um fortzufahren.";
9665
9746
  return (jsxRuntime.jsx("div", { style: {
9666
9747
  ...cardStyles,
9667
9748
  borderColor: "var(--bw-warning-color)",
@@ -9670,7 +9751,7 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
9670
9751
  textAlign: "center",
9671
9752
  }, children: message }));
9672
9753
  }
9673
- return (jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles, marginBottom: "16px" }, children: "Zahlung" }), jsxRuntime.jsx(PaymentForm, { config: config, eventDetails: eventDetails, formData: form.getValues(), totalAmount: paymentAmount, discountCode: appliedDiscountCode
9754
+ return (jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles }, children: "Zahlung" }), jsxRuntime.jsx(PaymentForm, { config: config, eventDetails: eventDetails, formData: form.getValues(), totalAmount: paymentAmount, discountCode: appliedDiscountCode
9674
9755
  ? {
9675
9756
  id: appliedDiscountCode.id,
9676
9757
  code: appliedDiscountCode.code,
@@ -10509,130 +10590,7 @@ function EventTypeSelection({ eventTypes, onEventTypeSelect, isLoading = false,
10509
10590
  if (isLoading) {
10510
10591
  return jsxRuntime.jsx(EventCardSkeleton, { count: skeletonCount });
10511
10592
  }
10512
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: {
10513
- __html: `
10514
- @media (max-width: 600px) {
10515
- .event-type-list {
10516
- padding: 8px !important;
10517
- gap: 12px !important;
10518
- }
10519
- .event-type-card {
10520
- max-width: 100% !important;
10521
- flex: 1 1 100% !important;
10522
- padding: 0 !important;
10523
- }
10524
- .event-type-img {
10525
- height: 160px !important;
10526
- }
10527
- .event-type-title {
10528
- font-size: 1.1rem !important;
10529
- }
10530
- .event-type-desc {
10531
- font-size: 0.8rem !important;
10532
- min-height: 100px !important;
10533
- max-height: 100px !important;
10534
- }
10535
- .event-type-content {
10536
- padding: 16px 24px !important;
10537
- }
10538
- }
10539
-
10540
- /* Markdown content styling for event type cards */
10541
- .event-type-markdown {
10542
- overflow: visible !important;
10543
- }
10544
- .event-type-markdown p {
10545
- margin: 0 0 8px 0;
10546
- color: var(--bw-text-muted);
10547
- font-family: var(--bw-font-family);
10548
- line-height: 1.6;
10549
- }
10550
- .event-type-markdown p:last-child {
10551
- margin-bottom: 0;
10552
- }
10553
- .event-type-markdown h2 {
10554
- font-size: 18px !important;
10555
- font-weight: 700 !important;
10556
- color: var(--bw-text-color) !important;
10557
- margin: 12px 0 6px 0 !important;
10558
- line-height: 1.3 !important;
10559
- }
10560
- .event-type-markdown h3 {
10561
- font-size: 16px !important;
10562
- font-weight: 600 !important;
10563
- color: var(--bw-text-color) !important;
10564
- margin: 10px 0 4px 0 !important;
10565
- line-height: 1.3 !important;
10566
- }
10567
- .event-type-markdown strong {
10568
- font-weight: 600;
10569
- color: var(--bw-text-color);
10570
- }
10571
- .event-type-markdown em {
10572
- font-style: italic;
10573
- }
10574
- .event-type-markdown u {
10575
- text-decoration: underline;
10576
- }
10577
- .event-type-markdown ul {
10578
- margin: 6px 0 !important;
10579
- padding: 0 !important;
10580
- padding-left: 24px !important;
10581
- list-style: none !important;
10582
- position: relative !important;
10583
- }
10584
- .event-type-markdown ul li {
10585
- margin-bottom: 2px !important;
10586
- padding-left: 0 !important;
10587
- position: relative !important;
10588
- color: var(--bw-text-muted) !important;
10589
- font-family: var(--bw-font-family) !important;
10590
- }
10591
- .event-type-markdown ul li::before {
10592
- content: "•" !important;
10593
- color: var(--bw-text-color) !important;
10594
- position: absolute !important;
10595
- left: -16px !important;
10596
- top: 0 !important;
10597
- font-weight: bold !important;
10598
- }
10599
- .event-type-markdown ol {
10600
- margin: 6px 0 !important;
10601
- padding: 0 !important;
10602
- padding-left: 24px !important;
10603
- counter-reset: list-counter !important;
10604
- list-style: none !important;
10605
- position: relative !important;
10606
- }
10607
- .event-type-markdown ol li {
10608
- margin-bottom: 2px !important;
10609
- padding-left: 0 !important;
10610
- position: relative !important;
10611
- counter-increment: list-counter !important;
10612
- color: var(--bw-text-muted) !important;
10613
- font-family: var(--bw-font-family) !important;
10614
- }
10615
- .event-type-markdown ol li::before {
10616
- content: counter(list-counter) "." !important;
10617
- color: var(--bw-text-color) !important;
10618
- position: absolute !important;
10619
- left: -20px !important;
10620
- top: 0 !important;
10621
- font-weight: bold !important;
10622
- }
10623
- .event-type-markdown blockquote {
10624
- margin: 4px 0;
10625
- padding-left: 12px;
10626
- border-left: 2px solid var(--bw-border-color);
10627
- font-style: italic;
10628
- color: var(--bw-text-muted);
10629
- }
10630
- .event-type-markdown a {
10631
- color: var(--bw-highlight-color);
10632
- text-decoration: underline;
10633
- }
10634
- `,
10635
- } }), eventTypes.length === 0 ? (jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
10593
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [eventTypes.length === 0 ? (jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
10636
10594
  backgroundColor: "var(--bw-surface-color)",
10637
10595
  border: "1px solid var(--bw-border-color)",
10638
10596
  borderRadius: "var(--bw-border-radius)",
@@ -10743,45 +10701,45 @@ function EventTypeSelection({ eventTypes, onEventTypeSelect, isLoading = false,
10743
10701
  handleShowDetails(eventType);
10744
10702
  }, children: eventType.highlights && eventType.highlights.length > 0 ? (
10745
10703
  // Show highlights as list
10704
+ // Uses em-based sizing so it scales with font size
10705
+ // Fixed 5 rows * 1.5em line-height = 7.5em total
10746
10706
  jsxRuntime.jsx("div", { className: "event-type-highlights", style: {
10747
10707
  margin: "10px 0",
10748
- minHeight: "128px",
10749
- fontSize: "clamp(0.95rem, 2vw, 16px)",
10708
+ height: "7.5em", // Fixed height in em units
10709
+ fontSize: "clamp(0.9rem, 2vw, 15px)",
10750
10710
  }, children: jsxRuntime.jsx("ul", { style: {
10751
10711
  listStyle: "none",
10752
10712
  padding: 0,
10753
10713
  margin: 0,
10754
- display: "flex",
10755
- flexDirection: "column",
10756
- gap: "2px",
10757
- position: "relative",
10758
- maxHeight: "128px",
10714
+ display: "grid",
10715
+ // 5 rows of exactly 1.5em each (lineHeight)
10716
+ gridTemplateRows: "repeat(5, 1.5em)",
10717
+ gap: 0,
10759
10718
  overflow: "hidden",
10760
10719
  }, children: eventType.highlights
10761
10720
  .filter((highlight) => highlight.trim())
10762
10721
  .slice(0, 5)
10763
10722
  .map((highlight, index) => (jsxRuntime.jsxs("li", { style: {
10764
10723
  display: "flex",
10765
- alignItems: "flex-start",
10766
- gap: "8px",
10724
+ alignItems: "center",
10725
+ gap: "0.5em",
10767
10726
  fontFamily: "var(--bw-font-family)",
10768
- lineHeight: 1.55,
10727
+ lineHeight: 1.5,
10728
+ height: "1.5em",
10769
10729
  color: "var(--bw-text-muted)",
10770
- position: "relative",
10771
- maxWidth: "100%",
10772
- }, children: [jsxRuntime.jsx("div", { style: { marginTop: "4px", flexShrink: 0 }, children: jsxRuntime.jsx(IconCheck, { size: 16, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { style: {
10773
- textOverflow: "ellipsis",
10774
- overflow: "hidden",
10730
+ overflow: "hidden",
10731
+ }, children: [jsxRuntime.jsx("div", { style: { flexShrink: 0, display: "flex", alignItems: "center" }, children: jsxRuntime.jsx(IconCheck, { size: 14, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { style: {
10775
10732
  whiteSpace: "nowrap",
10733
+ overflow: "hidden",
10734
+ textOverflow: "ellipsis",
10776
10735
  flex: 1,
10777
10736
  }, children: highlight.trim() })] }, index))) }) })) : eventType.description ? (jsxRuntime.jsx("div", { className: "event-type-desc", style: {
10778
10737
  color: "var(--bw-text-muted)",
10779
- fontSize: "clamp(0.95rem, 2vw, 16px)",
10780
- lineHeight: 1.625,
10738
+ fontSize: "clamp(0.9rem, 2vw, 15px)",
10739
+ lineHeight: 1.5,
10781
10740
  fontFamily: "var(--bw-font-family)",
10782
10741
  margin: "10px 0",
10783
- minHeight: "128px",
10784
- maxHeight: "128px",
10742
+ height: "7.5em", // Same height as highlights
10785
10743
  overflow: "hidden",
10786
10744
  textAlign: "left",
10787
10745
  }, children: jsxRuntime.jsx("div", { className: "event-type-markdown", style: {
@@ -10792,15 +10750,8 @@ function EventTypeSelection({ eventTypes, onEventTypeSelect, isLoading = false,
10792
10750
  }, children: Markdown({
10793
10751
  children: preprocessMarkdown(eventType.description),
10794
10752
  }) }) })) : (jsxRuntime.jsx("div", { className: "event-type-desc", style: {
10795
- color: "var(--bw-text-muted)",
10796
- fontSize: "clamp(0.95rem, 2vw, 16px)",
10797
- lineHeight: 1.625,
10798
- fontFamily: "var(--bw-font-family)",
10799
10753
  margin: "10px 0",
10800
- minHeight: "128px",
10801
- maxHeight: "128px",
10802
- overflow: "hidden",
10803
- textAlign: "left",
10754
+ height: "7.5em", // Same height as highlights
10804
10755
  }, children: "\u00A0" })) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "event-type-price", style: {
10805
10756
  fontWeight: 700,
10806
10757
  color: "var(--bw-text-color)",
@@ -11191,7 +11142,7 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
11191
11142
  fontFamily: "var(--bw-font-family)",
11192
11143
  }, children: "Keine verf\u00FCgbaren Termine" }), jsxRuntime.jsx("p", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "F\u00FCr diesen Event-Typ sind derzeit keine Termine verf\u00FCgbar." })] }) }) }));
11193
11144
  }
11194
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name}`, footer: footerNav, children: jsxRuntime.jsx("div", { style: { padding: "24px" }, children: jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "20px" }, children: monthYearGroups.map(({ key, label, events, minPrice, year }, idx) => {
11145
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name}`, footer: footerNav, children: jsxRuntime.jsx("div", { style: { padding: "20px 10px" }, children: jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: monthYearGroups.map(({ key, label, events, minPrice, year }, idx) => {
11195
11146
  const monthPriceDisplayInfo = getMonthPriceDisplayInfo(minPrice);
11196
11147
  return (jsxRuntime.jsxs(React__default.Fragment, { children: [idx > 0 && monthYearGroups[idx - 1].year !== year && (jsxRuntime.jsx("div", { style: { height: "1px", backgroundColor: "var(--bw-border-color)", margin: "4px 0" } })), jsxRuntime.jsx(Accordion, { title: label, priceInfo: jsxRuntime.jsx("div", { style: {
11197
11148
  fontSize: "16px",
@@ -11219,7 +11170,7 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
11219
11170
  border: "1px solid var(--bw-border-color)",
11220
11171
  backgroundColor: "var(--bw-surface-color)",
11221
11172
  borderRadius: "var(--bw-border-radius)",
11222
- padding: "16px 20px",
11173
+ padding: "16px 10px",
11223
11174
  transition: "all 0.2s ease",
11224
11175
  fontFamily: "var(--bw-font-family)",
11225
11176
  opacity: isDisabled ? 0.3 : 1,
@@ -11281,6 +11232,8 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
11281
11232
  marginLeft: "6px",
11282
11233
  backgroundColor: "rgba(0, 0, 0, 0.05)",
11283
11234
  whiteSpace: "nowrap",
11235
+ padding: "2px 6px",
11236
+ borderRadius: "var(--bw-border-radius-small)",
11284
11237
  }, children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsx("div", { style: {
11285
11238
  textAlign: "right",
11286
11239
  display: "flex",
@@ -11846,6 +11799,7 @@ const checkboxContainerStyles = {
11846
11799
  position: "absolute",
11847
11800
  top: "12px",
11848
11801
  right: "12px",
11802
+ zIndex: 1,
11849
11803
  };
11850
11804
  const checkboxInnerStyles = {
11851
11805
  width: "24px",
@@ -11898,7 +11852,7 @@ const descriptionStyles = {
11898
11852
  margin: "0 0 10px 0",
11899
11853
  lineHeight: 1.4,
11900
11854
  display: "-webkit-box",
11901
- WebkitLineClamp: 2,
11855
+ WebkitLineClamp: 5,
11902
11856
  WebkitBoxOrient: "vertical",
11903
11857
  overflow: "hidden",
11904
11858
  fontFamily: "var(--bw-font-family)",
@@ -12012,7 +11966,7 @@ function UpsellsStep({ upsells, selectedUpsells, participantCount, isLoading, is
12012
11966
  const selectedTotal = calculateTotal();
12013
11967
  const selectedCount = selectedUpsells.length;
12014
11968
  const footerContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: onBack, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: "\u2190 Zur\u00FCck" }), jsxRuntime.jsx("button", { type: "button", onClick: onContinue, style: mergeStyles(buttonStyles.primary, buttonStyles.fullWidth), children: selectedCount === 0 ? "Weiter ohne Extras" : `Weiter` })] }));
12015
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: onClose, title: "Extras hinzuf\u00FCgen", footer: footerContent, children: jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", height: "100%", padding: "0 16px" }, children: [jsxRuntime.jsx("p", { style: { ...textStyles.muted, fontSize: "14px", marginBottom: "20px", textAlign: "center" }, children: "Optionale Zusatzleistungen f\u00FCr deine Buchung" }), isLoading && (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "12px", padding: "40px 20px", ...textStyles.muted }, children: [spinner(), jsxRuntime.jsx("span", { children: "Lade verf\u00FCgbare Extras..." })] })), !isLoading && upsells.length === 0 && (jsxRuntime.jsx("div", { style: { textAlign: "center", padding: "40px 20px", ...textStyles.muted }, children: jsxRuntime.jsx("p", { children: "Keine Extras f\u00FCr diese Buchung verf\u00FCgbar." }) })), !isLoading && upsells.length > 0 && (jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "12px", flex: 1, overflowY: "auto", paddingBottom: "16px" }, children: upsells.map((upsell) => (jsxRuntime.jsx(UpsellCard, { upsell: upsell, isSelected: isSelected(upsell.id), participantCount: participantCount, onSelect: () => selectUpsell(upsell.id) }, upsell.id))) })), selectedCount > 0 && (jsxRuntime.jsxs("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: [jsxRuntime.jsxs("span", { style: textStyles.muted, children: [selectedCount, " ", selectedCount === 1 ? "Extra" : "Extras", " ausgew\u00E4hlt"] }), jsxRuntime.jsxs("span", { style: { fontWeight: 600, color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+", formatCurrency(selectedTotal)] })] }))] }) }));
11969
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: onClose, title: "Extras hinzuf\u00FCgen", footer: footerContent, children: jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", height: "100%", padding: "16px 16px" }, children: [isLoading && (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "12px", padding: "40px 20px", ...textStyles.muted }, children: [spinner(), jsxRuntime.jsx("span", { children: "Lade verf\u00FCgbare Extras..." })] })), !isLoading && upsells.length === 0 && (jsxRuntime.jsx("div", { style: { textAlign: "center", padding: "40px 20px", ...textStyles.muted }, children: jsxRuntime.jsx("p", { children: "Keine Extras f\u00FCr diese Buchung verf\u00FCgbar." }) })), !isLoading && upsells.length > 0 && (jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "12px", flex: 1, overflowY: "auto", paddingBottom: "16px" }, children: upsells.map((upsell) => (jsxRuntime.jsx(UpsellCard, { upsell: upsell, isSelected: isSelected(upsell.id), participantCount: participantCount, onSelect: () => selectUpsell(upsell.id) }, upsell.id))) })), selectedCount > 0 && (jsxRuntime.jsxs("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: [jsxRuntime.jsxs("span", { style: textStyles.muted, children: [selectedCount, " ", selectedCount === 1 ? "Extra" : "Extras", " ausgew\u00E4hlt"] }), jsxRuntime.jsxs("span", { style: { fontWeight: 600, color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+", formatCurrency(selectedTotal)] })] }))] }) }));
12016
11970
  }
12017
11971
 
12018
11972
  // Main widget component
@@ -12136,15 +12090,12 @@ function UniversalBookingWidget({ config: baseConfig }) {
12136
12090
  setShouldRenderBookingForm(true);
12137
12091
  }
12138
12092
  }, [currentStep, shouldRenderInstanceSelection, shouldRenderBookingForm]);
12139
- // Promo dialog: show Xmas promo once per user during holiday season
12093
+ // Promo dialog: show promo once per session when enabled
12140
12094
  React__default.useEffect(() => {
12141
- const now = new Date();
12142
- const month = now.getMonth();
12143
- const isHolidaySeason = month === 11 || month === 0;
12144
- if (!isHolidaySeason) {
12095
+ if (!config.promo?.enabled) {
12145
12096
  return;
12146
12097
  }
12147
- const promoId = "xmas-2024";
12098
+ const promoId = config.promo.discountCode || "default";
12148
12099
  const storageKey = `bigz-promo-${promoId}-shown`;
12149
12100
  const globalFlagKey = `__bigzPromoShown_${promoId}`;
12150
12101
  const alreadyShown = localStorage.getItem(storageKey) === "true";
@@ -12154,19 +12105,19 @@ function UniversalBookingWidget({ config: baseConfig }) {
12154
12105
  }
12155
12106
  window[globalFlagKey] = true;
12156
12107
  const timer = setTimeout(() => {
12157
- if (config.promo?.enabled) {
12158
- setShowPromoDialog(true);
12159
- }
12108
+ setShowPromoDialog(true);
12160
12109
  }, 1000);
12161
12110
  return () => clearTimeout(timer);
12162
- }, []);
12111
+ }, [config.promo?.enabled, config.promo?.discountCode]);
12163
12112
  const handlePromoDialogClose = () => {
12164
12113
  setShowPromoDialog(false);
12165
- localStorage.setItem("bigz-promo-xmas-2024-shown", "true");
12114
+ const promoId = config.promo?.discountCode || "default";
12115
+ localStorage.setItem(`bigz-promo-${promoId}-shown`, "true");
12166
12116
  };
12167
12117
  const handlePromoCtaClick = () => {
12168
12118
  setShowPromoDialog(false);
12169
- localStorage.setItem("bigz-promo-xmas-2024-shown", "true");
12119
+ const promoId = config.promo?.discountCode || "default";
12120
+ localStorage.setItem(`bigz-promo-${promoId}-shown`, "true");
12170
12121
  if (widgetContainerRef) {
12171
12122
  widgetContainerRef.scrollIntoView({ behavior: "smooth", block: "start" });
12172
12123
  }
@@ -12785,7 +12736,7 @@ function styleInject(css, ref) {
12785
12736
  }
12786
12737
  }
12787
12738
 
12788
- 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)}.bw-flex{display:flex}.bw-inline-flex{display:inline-flex}.bw-flex-col{flex-direction:column}.bw-flex-row{flex-direction:row}.bw-flex-wrap{flex-wrap:wrap}.bw-flex-1{flex:1 1 0%}.bw-shrink-0{flex-shrink:0}.bw-items-start{align-items:flex-start}.bw-items-center{align-items:center}.bw-items-end{align-items:flex-end}.bw-justify-start{justify-content:flex-start}.bw-justify-center{justify-content:center}.bw-justify-end{justify-content:flex-end}.bw-justify-between{justify-content:space-between}.bw-grid{display:grid}.bw-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.bw-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.bw-auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.bw-gap-0{gap:0}.bw-gap-0\\.5{gap:2px}.bw-gap-1{gap:4px}.bw-gap-1\\.5{gap:6px}.bw-gap-2{gap:8px}.bw-gap-2\\.5{gap:10px}.bw-gap-3{gap:12px}.bw-gap-4{gap:16px}.bw-gap-5{gap:20px}.bw-gap-6{gap:24px}.bw-w-full{width:100%}.bw-w-auto{width:auto}.bw-w-fit{width:-moz-fit-content;width:fit-content}.bw-h-full{height:100%}.bw-h-auto{height:auto}.bw-min-h-0{min-height:0}.bw-p-0{padding:0}.bw-p-1{padding:4px}.bw-p-2{padding:8px}.bw-p-3{padding:12px}.bw-p-4{padding:16px}.bw-p-5{padding:20px}.bw-p-6{padding:24px}.bw-px-1{padding-left:4px;padding-right:4px}.bw-px-2{padding-left:8px;padding-right:8px}.bw-px-2\\.5{padding-left:10px;padding-right:10px}.bw-px-3{padding-left:12px;padding-right:12px}.bw-px-4{padding-left:16px;padding-right:16px}.bw-px-5{padding-left:20px;padding-right:20px}.bw-px-6{padding-left:24px;padding-right:24px}.bw-px-7{padding-left:28px;padding-right:28px}.bw-px-8{padding-left:32px;padding-right:32px}.bw-py-0\\.5{padding-bottom:2px;padding-top:2px}.bw-py-1{padding-bottom:4px;padding-top:4px}.bw-py-1\\.5{padding-bottom:6px;padding-top:6px}.bw-py-2{padding-bottom:8px;padding-top:8px}.bw-py-2\\.5{padding-bottom:10px;padding-top:10px}.bw-py-3{padding-bottom:12px;padding-top:12px}.bw-py-3\\.5{padding-bottom:14px;padding-top:14px}.bw-py-4{padding-bottom:16px;padding-top:16px}.bw-pt-1{padding-top:4px}.bw-pt-3{padding-top:12px}.bw-pb-1{padding-bottom:4px}.bw-pb-4{padding-bottom:16px}.bw-pb-5{padding-bottom:20px}.bw-pb-8{padding-bottom:32px}.bw-m-0{margin:0}.bw-m-auto{margin:auto}.bw-mx-auto{margin-left:auto;margin-right:auto}.bw-my-1{margin-bottom:4px;margin-top:4px}.bw-my-2{margin-bottom:8px;margin-top:8px}.bw-my-2\\.5{margin-bottom:10px;margin-top:10px}.bw-mt-0\\.5{margin-top:2px}.bw-mt-1{margin-top:4px}.bw-mt-2{margin-top:8px}.bw-mt-2\\.5{margin-top:10px}.bw-mt-3{margin-top:12px}.bw-mt-4{margin-top:16px}.bw-mt-6{margin-top:24px}.bw-mt-8{margin-top:32px}.bw-mb-0\\.5{margin-bottom:2px}.bw-mb-1{margin-bottom:4px}.bw-mb-1\\.5{margin-bottom:6px}.bw-mb-2{margin-bottom:8px}.bw-mb-2\\.5{margin-bottom:10px}.bw-mb-3{margin-bottom:12px}.bw-mb-4{margin-bottom:16px}.bw-mb-5{margin-bottom:20px}.bw-mb-6{margin-bottom:24px}.bw-ml-auto{margin-left:auto}.bw-ml-1\\.5{margin-left:6px}.bw-ml-2{margin-left:8px}.bw-ml-4{margin-left:16px}.bw-mr-auto{margin-right:auto}.-bw-mt-5{margin-top:-20px}.-bw-mt-6{margin-top:-24px}.bw-text-xs{font-size:12px}.bw-text-sm{font-size:14px}.bw-text-base{font-size:16px}.bw-text-lg{font-size:18px}.bw-text-xl{font-size:20px}.bw-text-2xl{font-size:24px}.bw-text-3xl{font-size:30px}.bw-font-normal{font-weight:400}.bw-font-medium{font-weight:500}.bw-font-semibold{font-weight:600}.bw-font-bold{font-weight:700}.bw-font-extrabold{font-weight:800}.bw-font-sans{font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif)}.bw-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.bw-text-left{text-align:left}.bw-text-center{text-align:center}.bw-text-right{text-align:right}.bw-leading-none{line-height:1}.bw-leading-tight{line-height:1.25}.bw-leading-snug{line-height:1.375}.bw-leading-normal{line-height:1.5}.bw-leading-relaxed{line-height:1.625}.bw-uppercase{text-transform:uppercase}.bw-lowercase{text-transform:lowercase}.bw-capitalize{text-transform:capitalize}.bw-whitespace-nowrap{white-space:nowrap}.bw-whitespace-pre-wrap{white-space:pre-wrap}.bw-break-words{overflow-wrap:break-word}.bw-truncate{overflow:hidden;white-space:nowrap}.bw-text-ellipsis,.bw-truncate{text-overflow:ellipsis}.bw-overflow-hidden{overflow:hidden}.bw-text-primary{color:var(--bw-text-color)}.bw-text-muted{color:var(--bw-text-muted)}.bw-text-highlight{color:var(--bw-highlight-color)}.bw-text-success{color:var(--bw-success-color)}.bw-text-warning{color:var(--bw-warning-color)}.bw-text-error{color:var(--bw-error-color)}.bw-text-white{color:#fff}.bw-text-surface{color:var(--bw-surface-color)}.bw-bg-transparent{background-color:transparent}.bw-bg-surface{background-color:var(--bw-surface-color)}.bw-bg-background{background-color:var(--bw-background-color)}.bw-bg-highlight{background-color:var(--bw-highlight-color)}.bw-bg-success{background-color:var(--bw-success-color)}.bw-bg-warning{background-color:var(--bw-warning-color)}.bw-bg-error{background-color:var(--bw-error-color)}.bw-bg-white{background-color:#fff}.bw-bg-border{background-color:var(--bw-border-color)}.bw-border{border-style:solid;border-width:1px}.bw-border-0{border-width:0}.bw-border-2{border-style:solid;border-width:2px}.bw-border-t{border-top-style:solid;border-top-width:1px}.bw-border-t-2{border-top-style:solid;border-top-width:2px}.bw-border-t-4{border-top-style:solid;border-top-width:4px}.bw-border-b{border-bottom-style:solid;border-bottom-width:1px}.bw-border-l{border-left-style:solid;border-left-width:1px}.bw-border-solid{border-style:solid}.bw-border-color{border-color:var(--bw-border-color)}.bw-border-highlight{border-color:var(--bw-highlight-color)}.bw-border-error{border-color:var(--bw-error-color)}.bw-border-success{border-color:var(--bw-success-color)}.bw-rounded{border-radius:var(--bw-border-radius)}.bw-rounded-sm{border-radius:var(--bw-border-radius-small)}.bw-rounded-lg{border-radius:calc(var(--bw-border-radius)*1.2)}.bw-rounded-full{border-radius:9999px}.bw-rounded-none{border-radius:0}.bw-shadow-md{box-shadow:var(--bw-shadow-md)}.bw-shadow-lg{box-shadow:var(--bw-shadow-lg)}.bw-shadow-none{box-shadow:none}.bw-relative{position:relative}.bw-absolute{position:absolute}.bw-fixed{position:fixed}.bw-inset-0{bottom:0;left:0;right:0;top:0}.bw-top-0{top:0}.bw-top-4{top:16px}.bw-right-0{right:0}.bw-right-3{right:12px}.bw-right-4{right:16px}.bw-bottom-0{bottom:0}.bw-bottom-3{bottom:12px}.bw-left-0{left:0}.bw-left-3{left:12px}.bw-left-4{left:16px}.bw-z-1{z-index:1}.bw-z-2{z-index:2}.bw-z-10{z-index:10}.bw-z-50{z-index:50}.bw-hidden{display:none}.bw-block{display:block}.bw-inline{display:inline}.bw-invisible{visibility:hidden}.bw-visible{visibility:visible}.bw-opacity-0{opacity:0}.bw-opacity-30{opacity:.3}.bw-opacity-50{opacity:.5}.bw-opacity-60{opacity:.6}.bw-opacity-70{opacity:.7}.bw-opacity-80{opacity:.8}.bw-opacity-100{opacity:1}.bw-cursor-pointer{cursor:pointer}.bw-cursor-not-allowed{cursor:not-allowed}.bw-cursor-default{cursor:default}.bw-translate-x-0{transform:translateX(0)}.bw-translate-y-0{transform:translateY(0)}.-bw-translate-x-1\\/2{transform:translateX(-50%)}.-bw-translate-y-1\\/2{transform:translateY(-50%)}.bw-transition-all{transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.bw-transition-colors{transition-duration:.2s;transition-property:color,background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.bw-transition-opacity{transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.bw-transition-transform{transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.bw-duration-150{transition-duration:.15s}.bw-duration-200{transition-duration:.2s}.bw-duration-250{transition-duration:.25s}.bw-duration-300{transition-duration:.3s}.bw-duration-400{transition-duration:.4s}.bw-overflow-auto{overflow:auto}.bw-overflow-scroll{overflow:scroll}.bw-overflow-x-auto{overflow-x:auto}.bw-overflow-y-auto{overflow-y:auto}.bw-pointer-events-none{pointer-events:none}.bw-pointer-events-auto{pointer-events:auto}.bw-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bw-select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bw-backdrop-blur-sm{backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.bw-backdrop-blur{backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.bw-object-cover{-o-object-fit:cover;object-fit:cover}.bw-object-contain{-o-object-fit:contain;object-fit:contain}.bw-grayscale{filter:grayscale(100%)}.bw-grayscale-40{filter:grayscale(40%)}.bw-will-change-transform{will-change:transform}.bw-sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.bw-max-w-full{max-width:100%}.bw-max-w-500{max-width:500px}.bw-max-w-600{max-width:600px}.bw-min-h-120{min-height:120px}.bw-min-h-300{min-height:300px}.bw-min-h-400{min-height:400px}.print-only{display:none}.print-hidden{display:block}.print-booking-header{display:none}.print-section-title{display:none}.print-detail-grid{display:grid;gap:16px;grid-template-columns:1fr 1fr}.print-status-badge,.print-status-paid{display:none}.print-payment-summary{display:none}.print-payment-row{display:flex;justify-content:space-between}.print-footer{display:none}@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}}@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}.bw-btn{align-items:center;border:none;border-radius:var(--bw-border-radius);cursor:pointer;display:inline-flex;font-family:var(--bw-font-family);font-weight:600;gap:8px;justify-content:center;transition:all .2s ease;white-space:nowrap}.bw-btn:focus{box-shadow:0 0 0 2px var(--bw-highlight-color),0 0 0 4px rgba(var(--bw-highlight-color-rgb),.2);outline:none}.bw-btn:disabled{cursor:not-allowed;opacity:.5}.bw-btn-primary{background-color:var(--bw-highlight-color);border:none;color:#fff}.bw-btn-primary:hover:not(:disabled){filter:brightness(1.1)}.bw-btn-primary:active:not(:disabled){filter:brightness(.95)}.bw-btn-secondary{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);color:var(--bw-text-color)}.bw-btn-secondary:hover:not(:disabled){filter:brightness(.95)}.bw-btn-ghost{background-color:transparent;border:none;color:var(--bw-text-color)}.bw-btn-ghost:hover:not(:disabled){background-color:rgba(var(--bw-highlight-color-rgb),.1)}.bw-btn-outline{background-color:transparent;border:1px solid var(--bw-highlight-color);color:var(--bw-highlight-color)}.bw-btn-outline:hover:not(:disabled){background-color:var(--bw-highlight-color);color:#fff}.bw-btn-sm{font-size:14px;padding:8px 16px}.bw-btn-md{font-size:16px;padding:12px 24px}.bw-btn-lg{font-size:18px;padding:16px 32px}.bw-btn-full{width:100%}.bw-card{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);overflow:hidden}.bw-card-interactive{cursor:pointer;transition:transform .2s ease,box-shadow .2s ease}.bw-card-interactive:hover{box-shadow:var(--bw-shadow-lg);transform:translateY(-2px)}.bw-card-header{background-color:var(--bw-background-color);border-bottom:1px solid var(--bw-border-color);padding:16px}.bw-card-body{padding:16px}.bw-card-footer{border-top:1px solid var(--bw-border-color);padding:16px}.bw-input{background-color:var(--bw-background-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);color:var(--bw-text-color);font-family:var(--bw-font-family);font-size:16px;outline:none;padding:12px;transition:border-color .2s ease,box-shadow .2s ease;width:100%}.bw-input:focus{border-color:var(--bw-highlight-color);box-shadow:0 0 0 2px rgba(var(--bw-highlight-color-rgb),.2)}.bw-input-error{border-color:var(--bw-error-color)}.bw-input-error:focus{box-shadow:0 0 0 2px rgba(var(--bw-error-color),.2)}.bw-label{color:var(--bw-text-muted);display:block;font-family:var(--bw-font-family);font-size:16px;font-weight:500;margin-bottom:8px}.bw-form-group{display:flex;flex-direction:column;gap:4px}.bw-form-error{color:var(--bw-error-color);margin-top:4px}.bw-form-error,.bw-form-helper{font-family:var(--bw-font-family);font-size:14px}.bw-form-helper{color:var(--bw-text-muted)}.bw-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bw-surface-color);background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath fill='%236b7280' d='m2 4 4 4 4-4'/%3E%3C/svg%3E\");background-position:right 12px center;background-repeat:no-repeat;cursor:pointer}.bw-select,.bw-textarea{border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);color:var(--bw-text-color);font-family:var(--bw-font-family);font-size:16px;padding:12px;width:100%}.bw-textarea{background-color:var(--bw-background-color);min-height:80px;outline:none;resize:vertical;transition:border-color .2s ease}.bw-textarea:focus{border-color:var(--bw-highlight-color)}.bw-checkbox{accent-color:var(--bw-highlight-color);-moz-appearance:checkbox;appearance:checkbox;-webkit-appearance:checkbox;border:1px solid var(--bw-border-color);cursor:pointer;height:20px;width:20px}.bw-badge{align-items:center;border-radius:var(--bw-border-radius-small);display:inline-flex;font-family:var(--bw-font-family);font-size:12px;font-weight:600;padding:2px 8px;white-space:nowrap}.bw-badge-success{background-color:var(--bw-success-color);color:#fff}.bw-badge-error{background-color:var(--bw-error-color);color:#fff}.bw-badge-warning{background-color:var(--bw-warning-color);color:#fff}.bw-badge-highlight{background-color:var(--bw-highlight-color);color:#fff}.bw-badge-muted{background-color:var(--bw-border-color);color:var(--bw-text-muted)}.bw-modal-backdrop{backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);background-color:rgba(0,0,0,.5);inset:0;position:fixed}.bw-modal-content{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);font-family:var(--bw-font-family);max-height:90vh;max-width:100%;overflow:auto;position:relative}.bw-modal-header{align-items:center;border-bottom:1px solid var(--bw-border-color);display:flex;justify-content:space-between;padding:16px}.bw-modal-body{padding:16px}.bw-modal-footer{border-top:1px solid var(--bw-border-color);display:flex;gap:12px;justify-content:flex-end;padding:16px}.bw-modal-close{align-items:center;background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);color:var(--bw-text-muted);cursor:pointer;display:flex;font-size:24px;height:32px;justify-content:center;transition:background-color .2s ease;width:32px}.bw-modal-close:hover{background-color:var(--bw-border-color)}.bw-sidebar{background-color:var(--bw-surface-color);border-left:1px solid var(--bw-border-color);bottom:0;box-shadow:var(--bw-shadow-lg);display:flex;flex-direction:column;overflow:hidden;position:fixed;right:0;top:0;transition:transform .25s cubic-bezier(.4,0,.2,1);will-change:transform}.bw-sidebar-header{align-items:center;background-color:var(--bw-background-color);border-bottom:1px solid var(--bw-border-color);display:flex;flex-shrink:0;justify-content:space-between;padding:16px}.bw-sidebar-title{color:var(--bw-text-color);font-family:var(--bw-font-family);font-size:18px;font-weight:600;margin:0}.bw-sidebar-content{background-color:var(--bw-background-color);flex:1;overflow:auto}@media (max-width:768px){.sidebar-mobile{border-radius:0!important;max-width:100%!important;width:100%!important}}.bw-accordion{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);overflow:hidden}.bw-accordion-trigger{align-items:center;background-color:transparent;border:none;cursor:pointer;display:flex;font-family:var(--bw-font-family);justify-content:space-between;padding:16px;text-align:left;transition:background-color .2s ease;width:100%}.bw-accordion-trigger:hover{background-color:rgba(var(--bw-highlight-color-rgb),.1)}.bw-accordion-content{background-color:var(--bw-background-color);border-top:1px solid var(--bw-border-color);padding:0 16px 16px}.bw-accordion-chevron{font-size:16px;margin-left:16px;transition:transform .2s ease}.bw-accordion-trigger[data-state=open] .bw-accordion-chevron{transform:rotate(180deg)}.bw-spinner{align-items:center;display:flex;justify-content:center}.bw-spinner-icon{animation:spin 1s linear infinite;border-radius:50%}.bw-skeleton{background-color:var(--bw-border-color);border-radius:var(--bw-border-radius-small)}.bw-skeleton,.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%}.bw-empty-state{flex-direction:column;min-height:300px;padding:24px;text-align:center}.bw-empty-state,.bw-empty-state-icon{align-items:center;display:flex;justify-content:center}.bw-empty-state-icon{background-color:var(--bw-highlight-color);border-radius:50%;color:#fff;font-size:32px;height:64px;margin-bottom:16px;opacity:.8;width:64px}.bw-empty-state-title{color:var(--bw-text-color);font-family:var(--bw-font-family);font-size:20px;font-weight:600;margin:0 0 8px}.bw-empty-state-message{color:var(--bw-text-muted);font-family:var(--bw-font-family);font-size:16px;line-height:1.6;margin:0 0 24px;max-width:400px}.bw-section-header{border-bottom:2px solid var(--bw-highlight-color);color:var(--bw-highlight-color);font-size:18px;font-weight:600;margin-bottom:12px;padding-bottom:4px}.bw-alert,.bw-section-header{font-family:var(--bw-font-family)}.bw-alert{border-radius:var(--bw-border-radius);padding:16px}.bw-alert-success{background-color:rgba(var(--bw-success-color),.15);border:1px solid rgba(var(--bw-success-color),.4);color:var(--bw-success-color)}.bw-alert-error{background-color:rgba(var(--bw-error-color),.1);border:1px solid var(--bw-error-color);color:var(--bw-error-color)}.bw-alert-warning{background-color:rgba(var(--bw-warning-color),.15);border:1px solid rgba(var(--bw-warning-color),.4);color:var(--bw-warning-color)}.custom-scrollbar::-webkit-scrollbar{height:6px;width:6px}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}.custom-scrollbar::-webkit-scrollbar-thumb{background:var(--bw-border-color);border-radius:3px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--bw-text-muted)}.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}.next-events-skeleton{overflow:hidden;position:relative}.next-events-skeleton:after{animation:shimmer 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.4),transparent);content:\"\";height:100%;left:0;position:absolute;top:0;width:100%}.stripe-element{background:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius-small);padding:12px;transition:border-color .2s ease,box-shadow .2s ease}.stripe-element:focus-within{border-color:var(--bw-highlight-color);box-shadow:0 0 0 3px var(--bw-highlight-muted)}.backdrop{backdrop-filter:blur(4px);background-color:rgba(0,0,0,.5);inset:0;position:fixed}.bw-event-card{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);box-shadow:var(--bw-shadow-md);font-family:var(--bw-font-family);overflow:hidden;position:relative;transition:all .3s ease}.bw-event-card.bw-available{cursor:pointer;opacity:1}.bw-event-card.bw-available:hover{box-shadow:var(--bw-shadow-lg)}.bw-event-card.bw-unavailable{cursor:not-allowed;opacity:.6}.bw-event-card-image{height:300px;position:relative;width:100%}.bw-event-card-content{display:flex;flex-direction:column;height:400px;justify-content:space-between;padding:12px 18px}.bw-instance-card{background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);font-family:var(--bw-font-family);padding:16px 20px;position:relative;transition:all .2s ease}.bw-instance-card.bw-available{cursor:pointer}.bw-instance-card.bw-available:hover{background-color:rgba(var(--bw-highlight-color-rgb),.1);transform:scale(1.02)}.bw-instance-card.bw-unavailable{cursor:not-allowed;filter:grayscale(40%);opacity:.3}.bw-date-box{align-items:center;background-color:var(--bw-background-color);border-top-width:1px;border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius-small);border-top:4px solid var(--bw-border-color);display:flex;font-size:16px;height:40px;justify-content:center;transition:all .2s ease;width:40px}.bw-date-box,.bw-price{color:var(--bw-text-color);font-weight:700}.bw-price{font-family:var(--bw-font-family)}.bw-price-large{font-size:clamp(1.72rem,4vw,32px)}.bw-price-highlight{color:var(--bw-highlight-color)}.bw-loading-overlay{align-items:center;background-color:rgba(15,23,42,.8);border-radius:var(--bw-border-radius);display:flex;inset:0;justify-content:center;position:absolute}.bw-voucher-applied{align-items:center;background-color:var(--bw-surface-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius);display:flex;justify-content:space-between;margin-bottom:8px;padding:10px 12px}.bw-voucher-code{color:var(--bw-text-color);font-family:ui-monospace,monospace;font-weight:600}.bw-voucher-discount{color:var(--bw-success-color);font-size:12px}.bw-promo-backdrop{backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);background-color:rgba(0,20,40,.85);inset:0;position:fixed;transition:opacity .3s ease;z-index:60}.bw-promo-dialog{left:50%;max-width:440px;position:fixed;top:50%;transform:translate(-50%,-50%);transition:all .3s cubic-bezier(.34,1.56,.64,1);width:92%;z-index:61}.bw-promo-content{border-radius:28px;box-shadow:0 25px 60px -12px rgba(0,0,0,.5),0 0 0 1px hsla(0,0%,100%,.1),inset 0 1px 0 hsla(0,0%,100%,.2);overflow:hidden;position:relative}.bw-promo-close{align-items:center;backdrop-filter:blur(4px);background-color:rgba(0,0,0,.3);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;font-size:22px;height:36px;justify-content:center;line-height:1;position:absolute;right:16px;top:16px;transition:all .15s ease;width:36px;z-index:10}.bw-promo-close:hover{background-color:rgba(0,0,0,.5);transform:scale(1.1)}@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}}.bw-upsells-step{display:flex;flex-direction:column;height:100%;padding:0 16px}.bw-upsells-description{color:var(--bw-text-muted);font-size:14px;margin-bottom:20px;text-align:center}.bw-upsells-loading{align-items:center;display:flex;flex-direction:column;gap:12px;justify-content:center}.bw-upsells-empty,.bw-upsells-loading{color:var(--bw-text-muted);padding:40px 20px}.bw-upsells-empty{text-align:center}.bw-upsells-grid{display:flex;flex:1;flex-direction:column;gap:12px;overflow-y:auto;padding-bottom:16px}.bw-upsells-footer{border-top:1px solid var(--bw-border-color);margin-top:auto;padding-top:16px}.bw-upsells-summary{align-items:center;display:flex;font-size:14px;justify-content:space-between;margin-bottom:12px}.bw-upsells-summary-label{color:var(--bw-text-muted)}.bw-upsells-summary-price{color:var(--bw-highlight-color);font-weight:600}.bw-upsells-actions{margin-bottom:12px}.bw-upsells-skip-btn{background-color:var(--bw-highlight-color);border:none;border-radius:var(--bw-border-radius);color:#fff;cursor:pointer;font-size:16px;font-weight:600;padding:14px 24px;transition:all .2s ease;width:100%}.bw-upsells-skip-btn:hover{filter:brightness(1.1)}.bw-upsells-back-btn{background-color:transparent;border:none;color:var(--bw-text-muted);cursor:pointer;font-size:14px;padding:10px 16px;transition:color .2s ease;width:100%}.bw-upsells-back-btn:hover{color:var(--bw-text-color)}.bw-upsell-card{background-color:var(--bw-surface-color);border:2px solid var(--bw-border-color);border-radius:var(--bw-border-radius);cursor:pointer;display:flex;flex-direction:column;padding:16px;position:relative;transition:all .2s ease}.bw-upsell-card:hover:not(.bw-upsell-card--disabled){border-color:var(--bw-highlight-color);box-shadow:0 2px 8px rgba(var(--bw-highlight-color-rgb),.15)}.bw-upsell-card--selected{background-color:rgba(var(--bw-highlight-color-rgb),.08);border-color:var(--bw-highlight-color)}.bw-upsell-card--disabled{cursor:not-allowed;opacity:.6}.bw-upsell-checkbox{position:absolute;right:12px;top:12px}.bw-upsell-checkbox-inner{align-items:center;background-color:var(--bw-surface-color);border:2px solid var(--bw-border-color);border-radius:6px;display:flex;height:24px;justify-content:center;transition:all .2s ease;width:24px}.bw-upsell-checkbox-inner--checked{background-color:var(--bw-highlight-color);border-color:var(--bw-highlight-color);color:#fff}.bw-upsell-checkbox-inner svg{height:14px;width:14px}.bw-upsell-image-container{background-color:var(--bw-background-color);border-radius:calc(var(--bw-border-radius) - 4px);height:120px;margin-bottom:12px;overflow:hidden;width:100%}.bw-upsell-image{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.bw-upsell-image-placeholder{align-items:center;color:var(--bw-text-muted);display:flex;height:100%;justify-content:center;width:100%}.bw-upsell-image-placeholder svg{height:40px;opacity:.4;width:40px}.bw-upsell-content{flex:1}.bw-upsell-name{color:var(--bw-text-color);font-size:16px;font-weight:600;margin:0 0 6px;padding-right:36px}.bw-upsell-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--bw-text-muted);display:-webkit-box;font-size:13px;line-height:1.4;margin:0 0 10px;overflow:hidden}.bw-upsell-items{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.bw-upsell-item{align-items:center;background-color:var(--bw-background-color);border-radius:4px;color:var(--bw-text-muted);display:inline-flex;font-size:12px;gap:4px;padding:4px 8px}.bw-upsell-event-info{align-items:center;background-color:rgba(var(--bw-highlight-color-rgb),.1);border-radius:6px;display:flex;font-size:12px;gap:12px;margin-bottom:10px;padding:8px 10px}.bw-upsell-event-date{color:var(--bw-text-color);font-weight:500}.bw-upsell-event-spots{color:var(--bw-text-muted)}.bw-upsell-price-container{align-items:flex-end;border-top:1px solid var(--bw-border-color);display:flex;flex-direction:column;margin-top:8px;padding-top:8px}.bw-upsell-price-per-person{color:var(--bw-highlight-color);font-size:15px;font-weight:600}.bw-upsell-price-total{color:var(--bw-text-muted);font-size:12px}.bw-upsell-unavailable{align-items:center;background-color:rgba(var(--bw-background-color-rgb),.85);border-radius:var(--bw-border-radius);color:var(--bw-text-muted);display:flex;font-size:13px;inset:0;justify-content:center;padding:16px;position:absolute;text-align:center}.bw-sidebar-footer{background-color:var(--bw-surface-color);border-top:1px solid var(--bw-border-color);display:flex;gap:12px;padding:12px 16px}.bw-footer-btn{align-items:center;border:none;border-radius:var(--bw-border-radius);cursor:pointer;display:inline-flex;flex:1;font-family:var(--bw-font-family);font-size:14px;font-weight:600;gap:6px;justify-content:center;padding:12px 16px;transition:all .2s ease;white-space:nowrap}.bw-footer-btn:disabled{cursor:not-allowed;opacity:.5}.bw-footer-btn-primary{background-color:var(--bw-highlight-color);color:#fff}.bw-footer-btn-primary:hover:not(:disabled){filter:brightness(1.1)}.bw-footer-btn-secondary{background-color:transparent;border:1px solid var(--bw-border-color);color:var(--bw-text-muted)}.bw-footer-btn-secondary:hover:not(:disabled){background-color:var(--bw-background-color);color:var(--bw-text-color)}.bw-participant-upsells{border-top:1px dashed var(--bw-border-color);display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;padding-top:10px}.bw-participant-upsell-label{align-items:center;background-color:var(--bw-background-color);border:1px solid var(--bw-border-color);border-radius:var(--bw-border-radius-small);color:var(--bw-text-muted);cursor:pointer;display:inline-flex;font-family:var(--bw-font-family);font-size:13px;gap:6px;padding:6px 10px;transition:all .2s ease}.bw-participant-upsell-label:hover{border-color:var(--bw-highlight-color)}.bw-participant-upsell-label--selected{background-color:rgba(var(--bw-highlight-color-rgb),.1);border-color:var(--bw-highlight-color);color:var(--bw-highlight-color)}.bw-participant-upsell-checkbox{accent-color:var(--bw-highlight-color);cursor:pointer;height:16px;width:16px}.bw-participant-upsell-name{font-weight:500}.bw-participant-upsell-price{font-size:12px;opacity:.8}";
12739
+ 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}}";
12789
12740
  styleInject(css_248z);
12790
12741
 
12791
12742
  // Export init function for vanilla JS usage