@bigz-app/booking-widget 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/booking-widget.js +2436 -216
  2. package/dist/booking-widget.js.map +1 -1
  3. package/dist/components/PromoDialog.d.ts +0 -29
  4. package/dist/components/PromoDialog.d.ts.map +1 -1
  5. package/dist/components/Sidebar.d.ts +2 -1
  6. package/dist/components/Sidebar.d.ts.map +1 -1
  7. package/dist/components/UniversalBookingWidget.d.ts.map +1 -1
  8. package/dist/components/booking/BookingForm.d.ts +15 -1
  9. package/dist/components/booking/BookingForm.d.ts.map +1 -1
  10. package/dist/components/booking/BookingSuccessModal.d.ts.map +1 -1
  11. package/dist/components/booking/PaymentForm.d.ts +7 -1
  12. package/dist/components/booking/PaymentForm.d.ts.map +1 -1
  13. package/dist/components/booking/VoucherInput.d.ts.map +1 -1
  14. package/dist/components/events/EventInstanceSelection.d.ts.map +1 -1
  15. package/dist/components/events/EventTypeDetailsDialog.d.ts.map +1 -1
  16. package/dist/components/events/EventTypeSelection.d.ts.map +1 -1
  17. package/dist/components/events/ImageCarousel.d.ts.map +1 -1
  18. package/dist/components/events/NextEventsPreview.d.ts.map +1 -1
  19. package/dist/components/shared/Badge.d.ts +18 -0
  20. package/dist/components/shared/Badge.d.ts.map +1 -0
  21. package/dist/components/shared/Button.d.ts +1 -1
  22. package/dist/components/shared/Button.d.ts.map +1 -1
  23. package/dist/components/shared/EmptyState.d.ts +19 -0
  24. package/dist/components/shared/EmptyState.d.ts.map +1 -0
  25. package/dist/components/shared/ErrorBoundary.d.ts.map +1 -1
  26. package/dist/components/shared/FormGroup.d.ts +23 -0
  27. package/dist/components/shared/FormGroup.d.ts.map +1 -0
  28. package/dist/components/shared/Input.d.ts.map +1 -1
  29. package/dist/components/shared/SectionHeader.d.ts +15 -0
  30. package/dist/components/shared/SectionHeader.d.ts.map +1 -0
  31. package/dist/components/shared/Spinner.d.ts.map +1 -1
  32. package/dist/components/shared/index.d.ts +4 -0
  33. package/dist/components/shared/index.d.ts.map +1 -1
  34. package/dist/components/shared/skeletons/EventCardSkeleton.d.ts.map +1 -1
  35. package/dist/components/shared/skeletons/EventInstanceSkeleton.d.ts.map +1 -1
  36. package/dist/components/shared/skeletons/NextEventsSkeleton.d.ts.map +1 -1
  37. package/dist/components/upsells/UpsellCard.d.ts +10 -0
  38. package/dist/components/upsells/UpsellCard.d.ts.map +1 -0
  39. package/dist/components/upsells/UpsellsStep.d.ts +39 -0
  40. package/dist/components/upsells/UpsellsStep.d.ts.map +1 -0
  41. package/dist/components/upsells/index.d.ts +4 -0
  42. package/dist/components/upsells/index.d.ts.map +1 -0
  43. package/dist/index.cjs +2421 -215
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.esm.js +2421 -215
  46. package/dist/index.esm.js.map +1 -1
  47. package/dist/index.vanilla.d.ts.map +1 -1
  48. package/dist/styles/shared-styles.d.ts +71 -0
  49. package/dist/styles/shared-styles.d.ts.map +1 -0
  50. package/package.json +2 -3
package/dist/index.cjs CHANGED
@@ -3994,25 +3994,72 @@ var reactStripe_umdExports = reactStripe_umd.exports;
3994
3994
  * A reusable input component with focus states, labels, and error handling.
3995
3995
  * Uses forwardRef to support react-hook-form integration.
3996
3996
  */
3997
- const Input = React__default.forwardRef(({ label, error, helperText, leftIcon, rightIcon, fullWidth = false, className = "", containerClassName = "", id, ...props }, ref) => {
3997
+ const Input = React__default.forwardRef(({ label, error, helperText, leftIcon, rightIcon, fullWidth = false, className = "", containerClassName = "", id, style, ...props }, ref) => {
3998
3998
  const [isFocused, setIsFocused] = React__default.useState(false);
3999
- const containerClasses = `flex flex-col gap-1 ${fullWidth ? "w-full" : "w-auto"} ${containerClassName}`;
4000
- const inputWrapperClasses = "relative flex items-center";
4001
- const inputBaseClasses = "w-full py-3 rounded bg-surface text-text-primary text-base font-sans outline-none transition-all duration-200";
4002
- const inputPaddingClasses = leftIcon ? "pl-10 pr-3" : rightIcon ? "pl-3 pr-10" : "px-3";
4003
- const inputBorderClasses = error
4004
- ? "border border-solid border-error"
4005
- : isFocused
4006
- ? "border border-solid border-highlight shadow-[0_0_0_2px_var(--bw-highlight-color)]"
4007
- : "border border-solid border-border";
4008
- const iconClasses = "absolute flex items-center justify-center text-text-muted pointer-events-none";
4009
- return (jsxRuntime.jsxs("div", { className: containerClasses, children: [label && (jsxRuntime.jsx("label", { htmlFor: id, className: "text-base font-medium text-text-primary font-sans", children: label })), jsxRuntime.jsxs("div", { className: inputWrapperClasses, children: [leftIcon && jsxRuntime.jsx("span", { className: `${iconClasses} left-3`, children: leftIcon }), jsxRuntime.jsx("input", { ref: ref, id: id, className: `${inputBaseClasses} ${inputPaddingClasses} ${inputBorderClasses} ${className}`, onFocus: (e) => {
3999
+ const containerStyles = {
4000
+ display: "flex",
4001
+ flexDirection: "column",
4002
+ gap: "4px",
4003
+ width: fullWidth ? "100%" : "auto",
4004
+ };
4005
+ const inputWrapperStyles = {
4006
+ position: "relative",
4007
+ display: "flex",
4008
+ alignItems: "center",
4009
+ };
4010
+ const inputStyles = {
4011
+ width: "100%",
4012
+ padding: "12px",
4013
+ paddingLeft: leftIcon ? "40px" : "12px",
4014
+ paddingRight: rightIcon ? "40px" : "12px",
4015
+ backgroundColor: "var(--bw-surface-color)",
4016
+ color: "var(--bw-text-color)",
4017
+ fontSize: "16px",
4018
+ fontFamily: "var(--bw-font-family)",
4019
+ borderRadius: "var(--bw-border-radius)",
4020
+ outline: "none",
4021
+ transition: "all 0.2s ease",
4022
+ border: error
4023
+ ? "1px solid var(--bw-error-color)"
4024
+ : isFocused
4025
+ ? "1px solid var(--bw-highlight-color)"
4026
+ : "1px solid var(--bw-border-color)",
4027
+ boxShadow: isFocused && !error
4028
+ ? "0 0 0 2px var(--bw-highlight-color)"
4029
+ : "none",
4030
+ ...style,
4031
+ };
4032
+ const iconStyles = {
4033
+ position: "absolute",
4034
+ display: "flex",
4035
+ alignItems: "center",
4036
+ justifyContent: "center",
4037
+ color: "var(--bw-text-muted)",
4038
+ pointerEvents: "none",
4039
+ };
4040
+ return (jsxRuntime.jsxs("div", { className: containerClassName, style: containerStyles, children: [label && (jsxRuntime.jsx("label", { htmlFor: id, style: {
4041
+ fontSize: "16px",
4042
+ fontWeight: 500,
4043
+ color: "var(--bw-text-color)",
4044
+ fontFamily: "var(--bw-font-family)",
4045
+ }, children: label })), jsxRuntime.jsxs("div", { style: inputWrapperStyles, children: [leftIcon && (jsxRuntime.jsx("span", { style: { ...iconStyles, left: "12px" }, children: leftIcon })), jsxRuntime.jsx("input", { ref: ref, id: id, className: `bw-input ${error ? "bw-input-error" : ""} ${className}`, style: inputStyles, onFocus: (e) => {
4010
4046
  setIsFocused(true);
4011
4047
  props.onFocus?.(e);
4012
4048
  }, onBlur: (e) => {
4013
4049
  setIsFocused(false);
4014
4050
  props.onBlur?.(e);
4015
- }, ...props }), rightIcon && jsxRuntime.jsx("span", { className: `${iconClasses} right-3`, children: rightIcon })] }), error && jsxRuntime.jsx("p", { className: "text-error text-base mt-1 font-sans", children: error }), helperText && !error && (jsxRuntime.jsx("p", { className: "text-text-muted text-sm font-sans", children: helperText }))] }));
4051
+ }, ...props }), rightIcon && (jsxRuntime.jsx("span", { style: { ...iconStyles, right: "12px" }, children: rightIcon }))] }), error && (jsxRuntime.jsx("p", { style: {
4052
+ color: "var(--bw-error-color)",
4053
+ fontSize: "14px",
4054
+ marginTop: "4px",
4055
+ fontFamily: "var(--bw-font-family)",
4056
+ margin: 0,
4057
+ }, children: error })), helperText && !error && (jsxRuntime.jsx("p", { style: {
4058
+ color: "var(--bw-text-muted)",
4059
+ fontSize: "14px",
4060
+ fontFamily: "var(--bw-font-family)",
4061
+ margin: 0,
4062
+ }, children: helperText }))] }));
4016
4063
  });
4017
4064
  Input.displayName = "Input";
4018
4065
 
@@ -4020,10 +4067,16 @@ Input.displayName = "Input";
4020
4067
  * A simple dotted spinner component for loading states.
4021
4068
  * Uses the spin animation from animations.css
4022
4069
  */
4023
- const Spinner = ({ size = 16, borderColor = "var(--bw-highlight-color)", className = "", }) => (jsxRuntime.jsx("div", { className: `flex justify-center items-center ${className}`, children: jsxRuntime.jsx("div", { className: "rounded-full animate-spin", style: {
4070
+ const Spinner = ({ size = 16, borderColor = "var(--bw-highlight-color)", className = "", }) => (jsxRuntime.jsx("div", { className: `bw-spinner ${className}`, style: {
4071
+ display: "flex",
4072
+ justifyContent: "center",
4073
+ alignItems: "center",
4074
+ }, children: jsxRuntime.jsx("div", { className: "animate-spin", style: {
4024
4075
  width: `${size}px`,
4025
4076
  height: `${size}px`,
4026
4077
  border: `3px dotted ${borderColor}`,
4078
+ borderRadius: "50%",
4079
+ animation: "spin 1s linear infinite",
4027
4080
  } }) }));
4028
4081
  /**
4029
4082
  * A spinner function that returns a spinner element.
@@ -4219,13 +4272,173 @@ function DialogWrapper({ isOpen, onClose, children, maxWidth = "700px", classNam
4219
4272
  * Skeleton loading state for event type cards.
4220
4273
  * Matches the layout of EventTypeSelection cards.
4221
4274
  */
4222
- const EventCardSkeleton = ({ count = 4 }) => (jsxRuntime.jsx("div", { className: "p-0", children: jsxRuntime.jsx("div", { className: "flex flex-wrap justify-center gap-6", children: Array.from({ length: count }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer relative bg-surface border border-solid border-border rounded overflow-hidden shadow-md font-sans max-w-[500px] flex-[1_1_350px] flex flex-col", children: [jsxRuntime.jsx("div", { className: "absolute top-4 left-4 z-10", children: jsxRuntime.jsx("div", { className: "w-20 h-6 bg-white/20 rounded-sm" }) }), jsxRuntime.jsx("div", { className: "relative w-full h-[300px] bg-border" }), jsxRuntime.jsxs("div", { className: "p-4 px-6 flex-1", children: [jsxRuntime.jsx("div", { className: "w-3/5 h-3.5 bg-border rounded mb-2" }), jsxRuntime.jsx("div", { className: "w-4/5 h-6 bg-border rounded mb-3" }), jsxRuntime.jsxs("div", { className: "mb-4", children: [jsxRuntime.jsx("div", { className: "w-full h-3 bg-border rounded mb-2" }), jsxRuntime.jsx("div", { className: "w-[90%] h-3 bg-border rounded mb-2" }), jsxRuntime.jsx("div", { className: "w-[70%] h-3 bg-border rounded" })] }), jsxRuntime.jsxs("div", { className: "flex gap-4 mb-4", children: [jsxRuntime.jsx("div", { className: "w-20 h-4 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[100px] h-4 bg-border rounded" })] }), jsxRuntime.jsxs("div", { className: "flex justify-between items-center pt-3 border-t border-solid border-border", children: [jsxRuntime.jsx("div", { className: "w-[100px] h-7 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[120px] h-10 bg-highlight opacity-30 rounded" })] })] })] }, idx))) }) }));
4275
+ const EventCardSkeleton = ({ count = 4 }) => (jsxRuntime.jsx("div", { style: { padding: 0 }, children: jsxRuntime.jsx("div", { style: {
4276
+ display: "flex",
4277
+ flexWrap: "wrap",
4278
+ justifyContent: "center",
4279
+ gap: "24px",
4280
+ }, children: Array.from({ length: count }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer", style: {
4281
+ position: "relative",
4282
+ backgroundColor: "var(--bw-surface-color)",
4283
+ border: "1px solid var(--bw-border-color)",
4284
+ borderRadius: "var(--bw-border-radius)",
4285
+ overflow: "hidden",
4286
+ boxShadow: "var(--bw-shadow-md)",
4287
+ fontFamily: "var(--bw-font-family)",
4288
+ maxWidth: "500px",
4289
+ flex: "1 1 350px",
4290
+ display: "flex",
4291
+ flexDirection: "column",
4292
+ }, children: [jsxRuntime.jsx("div", { style: { position: "absolute", top: "16px", left: "16px", zIndex: 10 }, children: jsxRuntime.jsx("div", { style: {
4293
+ width: "80px",
4294
+ height: "24px",
4295
+ backgroundColor: "rgba(255, 255, 255, 0.2)",
4296
+ borderRadius: "var(--bw-border-radius-small)",
4297
+ } }) }), jsxRuntime.jsx("div", { style: {
4298
+ position: "relative",
4299
+ width: "100%",
4300
+ height: "300px",
4301
+ backgroundColor: "var(--bw-border-color)",
4302
+ } }), jsxRuntime.jsxs("div", { style: { padding: "16px 24px", flex: 1 }, children: [jsxRuntime.jsx("div", { style: {
4303
+ width: "60%",
4304
+ height: "14px",
4305
+ backgroundColor: "var(--bw-border-color)",
4306
+ borderRadius: "var(--bw-border-radius)",
4307
+ marginBottom: "8px",
4308
+ } }), jsxRuntime.jsx("div", { style: {
4309
+ width: "80%",
4310
+ height: "24px",
4311
+ backgroundColor: "var(--bw-border-color)",
4312
+ borderRadius: "var(--bw-border-radius)",
4313
+ marginBottom: "12px",
4314
+ } }), jsxRuntime.jsxs("div", { style: { marginBottom: "16px" }, children: [jsxRuntime.jsx("div", { style: {
4315
+ width: "100%",
4316
+ height: "12px",
4317
+ backgroundColor: "var(--bw-border-color)",
4318
+ borderRadius: "var(--bw-border-radius)",
4319
+ marginBottom: "8px",
4320
+ } }), jsxRuntime.jsx("div", { style: {
4321
+ width: "90%",
4322
+ height: "12px",
4323
+ backgroundColor: "var(--bw-border-color)",
4324
+ borderRadius: "var(--bw-border-radius)",
4325
+ marginBottom: "8px",
4326
+ } }), jsxRuntime.jsx("div", { style: {
4327
+ width: "70%",
4328
+ height: "12px",
4329
+ backgroundColor: "var(--bw-border-color)",
4330
+ borderRadius: "var(--bw-border-radius)",
4331
+ } })] }), jsxRuntime.jsxs("div", { style: { display: "flex", gap: "16px", marginBottom: "16px" }, children: [jsxRuntime.jsx("div", { style: {
4332
+ width: "80px",
4333
+ height: "16px",
4334
+ backgroundColor: "var(--bw-border-color)",
4335
+ borderRadius: "var(--bw-border-radius)",
4336
+ } }), jsxRuntime.jsx("div", { style: {
4337
+ width: "100px",
4338
+ height: "16px",
4339
+ backgroundColor: "var(--bw-border-color)",
4340
+ borderRadius: "var(--bw-border-radius)",
4341
+ } })] }), jsxRuntime.jsxs("div", { style: {
4342
+ display: "flex",
4343
+ justifyContent: "space-between",
4344
+ alignItems: "center",
4345
+ paddingTop: "12px",
4346
+ borderTop: "1px solid var(--bw-border-color)",
4347
+ }, children: [jsxRuntime.jsx("div", { style: {
4348
+ width: "100px",
4349
+ height: "28px",
4350
+ backgroundColor: "var(--bw-border-color)",
4351
+ borderRadius: "var(--bw-border-radius)",
4352
+ } }), jsxRuntime.jsx("div", { style: {
4353
+ width: "120px",
4354
+ height: "40px",
4355
+ backgroundColor: "var(--bw-highlight-color)",
4356
+ opacity: 0.3,
4357
+ borderRadius: "var(--bw-border-radius)",
4358
+ } })] })] })] }, idx))) }) }));
4223
4359
 
4224
4360
  /**
4225
4361
  * Skeleton loading state for the next events preview.
4226
4362
  * Shows a header and list of upcoming event placeholders.
4227
4363
  */
4228
- const NextEventsSkeleton = ({ count = 3 }) => (jsxRuntime.jsxs("div", { className: "max-w-[500px] mx-auto p-4 font-sans", children: [jsxRuntime.jsxs("div", { className: "mb-6 text-center", children: [jsxRuntime.jsx("div", { className: "skeleton-shimmer w-[280px] h-6 bg-border rounded mx-auto mb-2" }), jsxRuntime.jsx("div", { className: "skeleton-shimmer w-[320px] h-4 bg-border rounded mx-auto" })] }), jsxRuntime.jsx("div", { className: "flex flex-col gap-3 mb-6", children: Array.from({ length: count }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer bg-surface border border-solid border-border rounded p-2 px-2.5 font-sans", children: [jsxRuntime.jsxs("div", { className: "flex justify-between w-full items-start gap-3 mb-1", children: [jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("div", { className: "w-10 h-10 bg-border rounded-sm" }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [jsxRuntime.jsx("div", { className: "w-20 h-4 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[60px] h-3.5 bg-border rounded" })] })] }), jsxRuntime.jsxs("div", { className: "flex flex-col items-end gap-1", children: [jsxRuntime.jsx("div", { className: "w-[70px] h-5 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[50px] h-3.5 bg-border rounded" })] })] }), jsxRuntime.jsx("div", { className: "w-[70%] h-4 bg-border rounded mt-2" })] }, idx))) }), jsxRuntime.jsx("div", { className: "skeleton-shimmer w-full h-12 bg-highlight opacity-30 rounded" })] }));
4364
+ const NextEventsSkeleton = ({ count = 3 }) => (jsxRuntime.jsxs("div", { style: {
4365
+ maxWidth: "500px",
4366
+ margin: "0 auto",
4367
+ padding: "16px",
4368
+ fontFamily: "var(--bw-font-family)",
4369
+ }, children: [jsxRuntime.jsxs("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [jsxRuntime.jsx("div", { className: "skeleton-shimmer", style: {
4370
+ width: "280px",
4371
+ height: "24px",
4372
+ backgroundColor: "var(--bw-border-color)",
4373
+ borderRadius: "var(--bw-border-radius)",
4374
+ margin: "0 auto 8px auto",
4375
+ } }), jsxRuntime.jsx("div", { className: "skeleton-shimmer", style: {
4376
+ width: "320px",
4377
+ height: "16px",
4378
+ backgroundColor: "var(--bw-border-color)",
4379
+ borderRadius: "var(--bw-border-radius)",
4380
+ margin: "0 auto",
4381
+ } })] }), jsxRuntime.jsx("div", { style: {
4382
+ display: "flex",
4383
+ flexDirection: "column",
4384
+ gap: "12px",
4385
+ marginBottom: "24px",
4386
+ }, children: Array.from({ length: count }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer", style: {
4387
+ backgroundColor: "var(--bw-surface-color)",
4388
+ border: "1px solid var(--bw-border-color)",
4389
+ borderRadius: "var(--bw-border-radius)",
4390
+ padding: "8px 10px",
4391
+ fontFamily: "var(--bw-font-family)",
4392
+ }, children: [jsxRuntime.jsxs("div", { style: {
4393
+ display: "flex",
4394
+ justifyContent: "space-between",
4395
+ width: "100%",
4396
+ alignItems: "flex-start",
4397
+ gap: "12px",
4398
+ marginBottom: "4px",
4399
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
4400
+ width: "40px",
4401
+ height: "40px",
4402
+ backgroundColor: "var(--bw-border-color)",
4403
+ borderRadius: "var(--bw-border-radius-small)",
4404
+ } }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [jsxRuntime.jsx("div", { style: {
4405
+ width: "80px",
4406
+ height: "16px",
4407
+ backgroundColor: "var(--bw-border-color)",
4408
+ borderRadius: "var(--bw-border-radius)",
4409
+ } }), jsxRuntime.jsx("div", { style: {
4410
+ width: "60px",
4411
+ height: "14px",
4412
+ backgroundColor: "var(--bw-border-color)",
4413
+ borderRadius: "var(--bw-border-radius)",
4414
+ } })] })] }), jsxRuntime.jsxs("div", { style: {
4415
+ display: "flex",
4416
+ flexDirection: "column",
4417
+ alignItems: "flex-end",
4418
+ gap: "4px",
4419
+ }, children: [jsxRuntime.jsx("div", { style: {
4420
+ width: "70px",
4421
+ height: "20px",
4422
+ backgroundColor: "var(--bw-border-color)",
4423
+ borderRadius: "var(--bw-border-radius)",
4424
+ } }), jsxRuntime.jsx("div", { style: {
4425
+ width: "50px",
4426
+ height: "14px",
4427
+ backgroundColor: "var(--bw-border-color)",
4428
+ borderRadius: "var(--bw-border-radius)",
4429
+ } })] })] }), jsxRuntime.jsx("div", { style: {
4430
+ width: "70%",
4431
+ height: "16px",
4432
+ backgroundColor: "var(--bw-border-color)",
4433
+ borderRadius: "var(--bw-border-radius)",
4434
+ marginTop: "8px",
4435
+ } })] }, idx))) }), jsxRuntime.jsx("div", { className: "skeleton-shimmer", style: {
4436
+ width: "100%",
4437
+ height: "48px",
4438
+ backgroundColor: "var(--bw-highlight-color)",
4439
+ opacity: 0.3,
4440
+ borderRadius: "var(--bw-border-radius)",
4441
+ } })] }));
4229
4442
 
4230
4443
  // Clock icon - used for duration displays
4231
4444
  const IconClock = ({ size = 16, color = "#10b981", className, }) => (jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }), jsxRuntime.jsx("polyline", { points: "12 6 12 12 16 14" })] }));
@@ -4251,14 +4464,13 @@ const IconChevronLeft = ({ size = 20, color = "white", className, }) => (jsxRunt
4251
4464
  const IconChevronRight = ({ size = 20, color = "white", className, }) => (jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: jsxRuntime.jsx("polyline", { points: "9 18 15 12 9 6" }) }));
4252
4465
 
4253
4466
  // Component for bookings fully covered by gift cards (no Stripe payment needed)
4254
- function GiftCardOnlyBooking({ config, eventDetails, formData, discountCode, giftCards, onSuccess, onError, }) {
4467
+ function GiftCardOnlyBooking({ config, eventDetails, formData, discountCode, giftCards, onSuccess, onError, upsellSelections = [], }) {
4255
4468
  const [isLoading, setIsLoading] = React__default.useState(false);
4256
4469
  const [error, setError] = React__default.useState(null);
4257
4470
  const handleBooking = async () => {
4258
4471
  setIsLoading(true);
4259
4472
  setError(null);
4260
4473
  try {
4261
- // Create booking directly without Stripe payment
4262
4474
  const requestData = {
4263
4475
  eventInstanceId: config.eventInstanceId || eventDetails.id,
4264
4476
  organizationId: config.organizationId,
@@ -4270,6 +4482,7 @@ function GiftCardOnlyBooking({ config, eventDetails, formData, discountCode, gif
4270
4482
  customerPhone: formData.customerPhone?.trim(),
4271
4483
  comment: formData.comment?.trim(),
4272
4484
  paymentMethod: "gift_card",
4485
+ ...(upsellSelections.length > 0 && { upsellSelections }),
4273
4486
  };
4274
4487
  const response = await fetch(getApiUrl(config.apiBaseUrl, "/booking/create-gift-card-booking"), {
4275
4488
  method: "POST",
@@ -4298,7 +4511,56 @@ function GiftCardOnlyBooking({ config, eventDetails, formData, discountCode, gif
4298
4511
  }
4299
4512
  };
4300
4513
  const totalGiftCardAmount = giftCards.reduce((sum, gc) => sum + (gc.balanceToUse || gc.discountAmount || 0), 0);
4301
- return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [jsxRuntime.jsxs("div", { className: "bg-success/15 border border-solid border-success/40 rounded p-4", children: [jsxRuntime.jsx("div", { className: "flex items-center gap-2 mb-2 text-success font-sans font-semibold", children: "\uD83C\uDF81 Vollst\u00E4ndig durch Gutschein(e) gedeckt" }), jsxRuntime.jsxs("div", { className: "text-base text-text-muted font-sans", children: ["Gutschein-Guthaben: ", formatCurrency(totalGiftCardAmount)] })] }), error && (jsxRuntime.jsxs("div", { className: "bg-error/15 border border-solid border-error/40 rounded p-4 text-error text-base font-sans", children: ["\u26A0\uFE0F ", error] })), jsxRuntime.jsx("button", { type: "button", onClick: handleBooking, disabled: isLoading, className: `w-full px-6 py-3 bg-highlight text-white border-0 rounded text-base font-semibold font-sans transition-all duration-200 flex items-center justify-center gap-2 ${isLoading ? "cursor-not-allowed opacity-60" : "cursor-pointer"}`, children: isLoading ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin" }), "Buchung wird erstellt..."] })) : ("Mit Gutschein buchen") })] }));
4514
+ return (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [jsxRuntime.jsxs("div", { style: {
4515
+ backgroundColor: "rgba(var(--bw-success-color), 0.15)",
4516
+ border: "1px solid rgba(var(--bw-success-color), 0.4)",
4517
+ borderRadius: "var(--bw-border-radius)",
4518
+ padding: "16px",
4519
+ }, children: [jsxRuntime.jsx("div", { style: {
4520
+ display: "flex",
4521
+ alignItems: "center",
4522
+ gap: "8px",
4523
+ marginBottom: "8px",
4524
+ color: "var(--bw-success-color)",
4525
+ fontFamily: "var(--bw-font-family)",
4526
+ fontWeight: 600,
4527
+ }, children: "\uD83C\uDF81 Vollst\u00E4ndig durch Gutschein(e) gedeckt" }), jsxRuntime.jsxs("div", { style: {
4528
+ fontSize: "16px",
4529
+ color: "var(--bw-text-muted)",
4530
+ fontFamily: "var(--bw-font-family)",
4531
+ }, children: ["Gutschein-Guthaben: ", formatCurrency(totalGiftCardAmount)] })] }), error && (jsxRuntime.jsxs("div", { style: {
4532
+ backgroundColor: "rgba(var(--bw-error-color), 0.15)",
4533
+ border: "1px solid rgba(var(--bw-error-color), 0.4)",
4534
+ borderRadius: "var(--bw-border-radius)",
4535
+ padding: "16px",
4536
+ color: "var(--bw-error-color)",
4537
+ fontSize: "16px",
4538
+ fontFamily: "var(--bw-font-family)",
4539
+ }, children: ["\u26A0\uFE0F ", error] })), jsxRuntime.jsx("button", { type: "button", onClick: handleBooking, disabled: isLoading, style: {
4540
+ width: "100%",
4541
+ padding: "12px 24px",
4542
+ backgroundColor: "var(--bw-highlight-color)",
4543
+ color: "#ffffff",
4544
+ border: "none",
4545
+ borderRadius: "var(--bw-border-radius)",
4546
+ fontSize: "16px",
4547
+ fontWeight: 600,
4548
+ fontFamily: "var(--bw-font-family)",
4549
+ transition: "all 0.2s ease",
4550
+ display: "flex",
4551
+ alignItems: "center",
4552
+ justifyContent: "center",
4553
+ gap: "8px",
4554
+ cursor: isLoading ? "not-allowed" : "pointer",
4555
+ opacity: isLoading ? 0.6 : 1,
4556
+ }, children: isLoading ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { style: {
4557
+ width: "16px",
4558
+ height: "16px",
4559
+ border: "2px solid #ffffff",
4560
+ borderTopColor: "transparent",
4561
+ borderRadius: "50%",
4562
+ animation: "spin 1s linear infinite",
4563
+ } }), "Buchung wird erstellt..."] })) : ("Mit Gutschein buchen") })] }));
4302
4564
  }
4303
4565
  // Inner component that uses the Stripe hooks
4304
4566
  function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSuccess, onError, }) {
@@ -4314,7 +4576,6 @@ function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSucce
4314
4576
  setIsLoading(true);
4315
4577
  setPaymentError(null);
4316
4578
  try {
4317
- // Validate participant count before proceeding with payment
4318
4579
  const participantCount = formData.participants.filter((p) => p.name.trim()).length;
4319
4580
  const availableSpots = eventDetails.availableSpots || 0;
4320
4581
  if (participantCount > availableSpots) {
@@ -4325,7 +4586,6 @@ function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSucce
4325
4586
  setPaymentError("Mindestens ein Teilnehmer ist erforderlich.");
4326
4587
  return;
4327
4588
  }
4328
- // First, confirm the payment with Stripe
4329
4589
  const baseUrl = window !== undefined ? window.location.href : `${config.bookingSystemUrl}/booking-success`;
4330
4590
  const returnUrl = new URL(baseUrl);
4331
4591
  const confirmParams = {
@@ -4352,7 +4612,6 @@ function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSucce
4352
4612
  }
4353
4613
  return;
4354
4614
  }
4355
- // Payment succeeded, now create the booking
4356
4615
  if (paymentIntent && paymentIntent.status === "succeeded") {
4357
4616
  onSuccess({
4358
4617
  paymentIntent: paymentIntent,
@@ -4370,7 +4629,12 @@ function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSucce
4370
4629
  setIsLoading(false);
4371
4630
  }
4372
4631
  };
4373
- return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [jsxRuntime.jsx("div", { className: "bg-slate-700/30 border border-solid border-border rounded p-4", children: jsxRuntime.jsx(reactStripe_umdExports.PaymentElement, { options: {
4632
+ return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [jsxRuntime.jsx("div", { style: {
4633
+ backgroundColor: "rgba(71, 85, 105, 0.3)",
4634
+ border: "1px solid var(--bw-border-color)",
4635
+ borderRadius: "var(--bw-border-radius)",
4636
+ padding: "16px",
4637
+ }, children: jsxRuntime.jsx(reactStripe_umdExports.PaymentElement, { options: {
4374
4638
  layout: "accordion",
4375
4639
  defaultValues: {
4376
4640
  billingDetails: {
@@ -4379,22 +4643,46 @@ function PaymentFormInner({ config, eventDetails, formData, totalAmount, onSucce
4379
4643
  phone: formData.customerPhone,
4380
4644
  },
4381
4645
  },
4382
- } }) }), paymentError && (jsxRuntime.jsxs("div", { className: "bg-error/10 border border-solid border-error rounded p-4 text-error text-base font-sans", children: ["\u26A0\uFE0F ", paymentError] })), jsxRuntime.jsx("button", { type: "submit", disabled: !stripe || isLoading, className: `w-full px-6 py-3 bg-highlight text-surface border-0 rounded text-base font-semibold font-sans transition-all duration-200 flex items-center justify-center gap-2 ${isLoading ? "cursor-not-allowed opacity-60" : "cursor-pointer"}`, children: isLoading ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [spinner("var(--bw-surface-color)"), " Verarbeite Zahlung..."] })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: totalAmount <
4646
+ } }) }), paymentError && (jsxRuntime.jsxs("div", { style: {
4647
+ backgroundColor: "rgba(var(--bw-error-color), 0.1)",
4648
+ border: "1px solid var(--bw-error-color)",
4649
+ borderRadius: "var(--bw-border-radius)",
4650
+ padding: "16px",
4651
+ color: "var(--bw-error-color)",
4652
+ fontSize: "16px",
4653
+ fontFamily: "var(--bw-font-family)",
4654
+ }, children: ["\u26A0\uFE0F ", paymentError] })), jsxRuntime.jsx("button", { type: "submit", disabled: !stripe || isLoading, style: {
4655
+ width: "100%",
4656
+ padding: "12px 24px",
4657
+ backgroundColor: "var(--bw-highlight-color)",
4658
+ color: "var(--bw-surface-color)",
4659
+ border: "none",
4660
+ borderRadius: "var(--bw-border-radius)",
4661
+ fontSize: "16px",
4662
+ fontWeight: 600,
4663
+ fontFamily: "var(--bw-font-family)",
4664
+ transition: "all 0.2s ease",
4665
+ display: "flex",
4666
+ alignItems: "center",
4667
+ justifyContent: "center",
4668
+ gap: "8px",
4669
+ cursor: isLoading ? "not-allowed" : "pointer",
4670
+ opacity: isLoading ? 0.6 : 1,
4671
+ }, children: isLoading ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [spinner("var(--bw-surface-color)"), " Verarbeite Zahlung..."] })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: totalAmount <
4383
4672
  eventDetails.price * formData.participants.filter((p) => p.name.trim()).length
4384
4673
  ? "Anzahlen & buchen"
4385
4674
  : "Jetzt buchen" })) })] }));
4386
4675
  }
4387
4676
  // Main PaymentForm component that handles payment intent creation and Elements wrapper
4388
- function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode, giftCards, onSuccess, onError, systemConfig, stripePromise, stripeAppearance, }) {
4677
+ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode, giftCards, onSuccess, onError, systemConfig, stripePromise, stripeAppearance, upsellSelections = [], }) {
4389
4678
  const [clientSecret, setClientSecret] = React__default.useState(null);
4390
4679
  const [paymentIntentId, setPaymentIntentId] = React__default.useState(null);
4391
4680
  const [isCreatingPaymentIntent, setIsCreatingPaymentIntent] = React__default.useState(false);
4392
4681
  const [paymentError, setPaymentError] = React__default.useState(null);
4393
- // LocalStorage persistence (scoped by organization + event) for paymentIntentId only
4394
4682
  const storageKey = typeof window !== "undefined"
4395
4683
  ? `bw_pi_${config?.organizationId}_${config?.eventInstanceId || eventDetails?.id}`
4396
4684
  : "";
4397
- const PAYMENT_INTENT_TTL = 24 * 60 * 60 * 1000; // 24 hours
4685
+ const PAYMENT_INTENT_TTL = 24 * 60 * 60 * 1000;
4398
4686
  function loadPersistedPaymentIntent() {
4399
4687
  if (typeof window === "undefined" || !storageKey)
4400
4688
  return null;
@@ -4432,7 +4720,6 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4432
4720
  }
4433
4721
  catch { }
4434
4722
  }
4435
- // On mount (and when scope changes), restore persisted paymentIntentId
4436
4723
  React__default.useEffect(() => {
4437
4724
  if (!paymentIntentId) {
4438
4725
  const restored = loadPersistedPaymentIntent();
@@ -4441,20 +4728,16 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4441
4728
  }
4442
4729
  }
4443
4730
  }, [storageKey]);
4444
- // Persist whenever paymentIntentId changes
4445
4731
  React__default.useEffect(() => {
4446
4732
  if (paymentIntentId) {
4447
4733
  persistPaymentIntent(paymentIntentId);
4448
4734
  }
4449
4735
  }, [paymentIntentId]);
4450
- // Create payment intent when component mounts or when relevant data changes
4451
- // Note: Detailed validation is handled by BookingForm before this component renders
4452
4736
  React__default.useEffect(() => {
4453
4737
  const createPaymentIntent = async () => {
4454
4738
  if (!systemConfig || !eventDetails || !formData.participants?.length) {
4455
4739
  return;
4456
4740
  }
4457
- // Basic safety check - detailed validation already done in BookingForm
4458
4741
  const participantCount = formData.participants?.filter((p) => p.name?.trim()).length || 0;
4459
4742
  if (participantCount === 0 || !formData.customerEmail?.trim() || !formData.customerName?.trim()) {
4460
4743
  return;
@@ -4475,8 +4758,8 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4475
4758
  customerPhone: formData.customerPhone?.trim(),
4476
4759
  comment: formData.comment?.trim(),
4477
4760
  ...(paymentIntentId && { paymentIntentId }),
4761
+ ...(upsellSelections && upsellSelections.length > 0 && { upsellSelections }),
4478
4762
  };
4479
- // Validate required fields
4480
4763
  if (!requestData.eventInstanceId) {
4481
4764
  throw new Error("Event instance ID is required");
4482
4765
  }
@@ -4520,7 +4803,6 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4520
4803
  setIsCreatingPaymentIntent(false);
4521
4804
  }
4522
4805
  };
4523
- // Debounce the payment intent creation
4524
4806
  const timer = setTimeout(createPaymentIntent, 500);
4525
4807
  return () => clearTimeout(timer);
4526
4808
  }, [
@@ -4533,8 +4815,8 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4533
4815
  discountCode,
4534
4816
  giftCards,
4535
4817
  config,
4818
+ upsellSelections,
4536
4819
  ]);
4537
- // Calculate total gift card coverage
4538
4820
  const totalGiftCardAmount = giftCards.reduce((sum, gc) => sum + (gc.balanceToUse || gc.discountAmount || 0), 0);
4539
4821
  const baseTotal = eventDetails?.price
4540
4822
  ? eventDetails.price * (formData.participants?.filter((p) => p.name?.trim()).length || 0)
@@ -4542,19 +4824,33 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4542
4824
  const discountAmount = discountCode?.discountAmount || 0;
4543
4825
  const amountAfterDiscount = Math.max(0, baseTotal - discountAmount);
4544
4826
  const isFullyCoveredByGiftCards = totalGiftCardAmount >= amountAfterDiscount && amountAfterDiscount > 0;
4545
- // If gift cards fully cover the payment, show a simplified booking button
4546
4827
  if (isFullyCoveredByGiftCards && totalAmount <= 0) {
4547
- return (jsxRuntime.jsx(GiftCardOnlyBooking, { config: config, eventDetails: eventDetails, formData: formData, discountCode: discountCode, giftCards: giftCards, onSuccess: onSuccess, onError: onError }));
4828
+ return (jsxRuntime.jsx(GiftCardOnlyBooking, { config: config, eventDetails: eventDetails, formData: formData, discountCode: discountCode, giftCards: giftCards, onSuccess: onSuccess, onError: onError, upsellSelections: upsellSelections }));
4548
4829
  }
4549
- // Show loading state while creating payment intent
4550
4830
  if (isCreatingPaymentIntent || !clientSecret) {
4551
- return (jsxRuntime.jsxs("div", { className: "flex items-center justify-center p-4 gap-2", children: [spinner(), jsxRuntime.jsx("span", { className: "text-text-muted font-sans text-base", children: "Zahlungsm\u00F6glichkeiten werden geladen..." })] }));
4831
+ return (jsxRuntime.jsxs("div", { style: {
4832
+ display: "flex",
4833
+ alignItems: "center",
4834
+ justifyContent: "center",
4835
+ padding: "16px",
4836
+ gap: "8px",
4837
+ }, children: [spinner(), jsxRuntime.jsx("span", { style: {
4838
+ color: "var(--bw-text-muted)",
4839
+ fontFamily: "var(--bw-font-family)",
4840
+ fontSize: "16px",
4841
+ }, children: "Zahlungsm\u00F6glichkeiten werden geladen..." })] }));
4552
4842
  }
4553
- // Show error if payment intent creation failed
4554
4843
  if (paymentError) {
4555
- return (jsxRuntime.jsxs("div", { className: "bg-error/10 border border-solid border-error rounded p-4 text-error text-base font-sans", children: ["\u26A0\uFE0F ", paymentError] }));
4844
+ return (jsxRuntime.jsxs("div", { style: {
4845
+ backgroundColor: "rgba(var(--bw-error-color), 0.1)",
4846
+ border: "1px solid var(--bw-error-color)",
4847
+ borderRadius: "var(--bw-border-radius)",
4848
+ padding: "16px",
4849
+ color: "var(--bw-error-color)",
4850
+ fontSize: "16px",
4851
+ fontFamily: "var(--bw-font-family)",
4852
+ }, children: ["\u26A0\uFE0F ", paymentError] }));
4556
4853
  }
4557
- // Render the payment form with Elements wrapper
4558
4854
  return (
4559
4855
  // @ts-ignore
4560
4856
  jsxRuntime.jsx(reactStripe_umdExports.Elements, { stripe: stripePromise, options: {
@@ -4562,7 +4858,6 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4562
4858
  appearance: stripeAppearance || { theme: "stripe" },
4563
4859
  locale: (config.locale) || "de",
4564
4860
  }, children: jsxRuntime.jsx(PaymentFormInner, { config: config, eventDetails: eventDetails, formData: formData, totalAmount: totalAmount, onSuccess: (result) => {
4565
- // Clear persisted PI data on successful payment
4566
4861
  clearPersistedPaymentIntent();
4567
4862
  setPaymentIntentId(null);
4568
4863
  setClientSecret(null);
@@ -4571,7 +4866,7 @@ function PaymentForm({ config, eventDetails, formData, totalAmount, discountCode
4571
4866
  }
4572
4867
 
4573
4868
  const SidebarGlobal = Sidebar;
4574
- function Sidebar({ isOpen, onClose, title, children, width = "450px", }) {
4869
+ function Sidebar({ isOpen, onClose, title, children, width = "450px", footer, }) {
4575
4870
  const [isVisible, setIsVisible] = React__default.useState(false);
4576
4871
  const [isAnimating, setIsAnimating] = React__default.useState(false);
4577
4872
  const themedStyles = useStyles();
@@ -4644,36 +4939,135 @@ function Sidebar({ isOpen, onClose, title, children, width = "450px", }) {
4644
4939
  }, [isOpen, onClose]);
4645
4940
  if (!isVisible)
4646
4941
  return null;
4647
- const sidebarContent = (jsxRuntime.jsxs("div", { className: "fixed inset-0 z-[1000] font-sans", style: themedStyles, children: [jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm transition-opacity duration-250 ease-out", style: { opacity: isAnimating ? 1 : 0 }, onClick: onClose }), jsxRuntime.jsxs("div", { className: "sidebar-mobile absolute top-0 right-0 bottom-0 flex flex-col overflow-hidden bg-surface border-l border-solid border-border shadow-lg transition-transform duration-250 ease-[cubic-bezier(0.4,0,0.2,1)] will-change-transform", style: {
4942
+ const sidebarContent = (jsxRuntime.jsxs("div", { style: {
4943
+ ...themedStyles,
4944
+ position: "fixed",
4945
+ inset: 0,
4946
+ zIndex: 1000,
4947
+ fontFamily: "var(--bw-font-family)",
4948
+ }, children: [jsxRuntime.jsx("div", { style: {
4949
+ position: "absolute",
4950
+ inset: 0,
4951
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
4952
+ backdropFilter: "blur(4px)",
4953
+ transition: "opacity 0.25s ease-out",
4954
+ opacity: isAnimating ? 1 : 0,
4955
+ }, onClick: onClose }), jsxRuntime.jsxs("div", { className: "sidebar-mobile", style: {
4956
+ position: "absolute",
4957
+ top: 0,
4958
+ right: 0,
4959
+ bottom: 0,
4960
+ display: "flex",
4961
+ flexDirection: "column",
4962
+ overflow: "hidden",
4963
+ backgroundColor: "var(--bw-surface-color)",
4964
+ borderLeft: "1px solid var(--bw-border-color)",
4965
+ boxShadow: "var(--bw-shadow-lg)",
4966
+ transition: "transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)",
4967
+ willChange: "transform",
4648
4968
  width,
4649
4969
  maxWidth: "90vw",
4650
4970
  transform: isAnimating ? "translateX(0)" : "translateX(100%)",
4651
- }, children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between shrink-0 p-4 border-b border-solid border-border bg-background", children: [jsxRuntime.jsx("h2", { className: "m-0 font-semibold text-lg text-text-primary font-sans", children: title }), jsxRuntime.jsx("button", { onClick: onClose, className: "flex items-center justify-center cursor-pointer whitespace-nowrap px-4 py-2 rounded-sm bg-transparent border border-solid border-border text-text-muted text-base font-sans font-medium transition-all duration-200 hover:bg-border hover:text-text-primary", children: "\u2190 Zur\u00FCck" })] }), jsxRuntime.jsx("div", { className: "flex-1 overflow-auto bg-background", children: children })] })] }));
4971
+ }, children: [jsxRuntime.jsxs("div", { style: {
4972
+ display: "flex",
4973
+ alignItems: "center",
4974
+ justifyContent: "space-between",
4975
+ flexShrink: 0,
4976
+ padding: "12px 16px",
4977
+ borderBottom: "1px solid var(--bw-border-color)",
4978
+ backgroundColor: "var(--bw-background-color)",
4979
+ }, children: [jsxRuntime.jsx("h2", { style: {
4980
+ margin: 0,
4981
+ fontWeight: 600,
4982
+ fontSize: "16px",
4983
+ color: "var(--bw-text-color)",
4984
+ fontFamily: "var(--bw-font-family)",
4985
+ flex: 1,
4986
+ paddingRight: "12px",
4987
+ }, children: title }), jsxRuntime.jsx("button", { onClick: onClose, "aria-label": "Schlie\u00DFen", style: {
4988
+ display: "flex",
4989
+ alignItems: "center",
4990
+ justifyContent: "center",
4991
+ cursor: "pointer",
4992
+ width: "32px",
4993
+ height: "32px",
4994
+ borderRadius: "50%",
4995
+ backgroundColor: "transparent",
4996
+ border: "1px solid var(--bw-border-color)",
4997
+ color: "var(--bw-text-muted)",
4998
+ fontSize: "18px",
4999
+ fontFamily: "var(--bw-font-family)",
5000
+ fontWeight: 400,
5001
+ transition: "all 0.2s ease",
5002
+ flexShrink: 0,
5003
+ }, children: "\u00D7" })] }), jsxRuntime.jsx("div", { style: {
5004
+ flex: 1,
5005
+ overflow: "auto",
5006
+ backgroundColor: "var(--bw-background-color)",
5007
+ }, children: children }), footer && (jsxRuntime.jsx("div", { className: "bw-sidebar-footer", style: {
5008
+ flexShrink: 0,
5009
+ padding: "12px 16px",
5010
+ borderTop: "1px solid var(--bw-border-color)",
5011
+ backgroundColor: "var(--bw-surface-color)",
5012
+ display: "flex",
5013
+ gap: "12px",
5014
+ }, children: footer }))] })] }));
4652
5015
  return portalRootRef.current
4653
5016
  ? ReactDOM.createPortal(sidebarContent, portalRootRef.current)
4654
5017
  : null;
4655
5018
  }
4656
5019
  function Accordion({ title, priceInfo, children, isOpen, onToggle, }) {
4657
- return (jsxRuntime.jsxs("div", { className: "overflow-hidden bg-surface border border-solid border-border rounded", children: [jsxRuntime.jsxs("button", { type: "button", className: "accordion-trigger w-full flex justify-between items-center text-left cursor-pointer p-4 bg-transparent border-0 font-sans transition-colors duration-200 hover:bg-highlight/10", onClick: onToggle, children: [jsxRuntime.jsx("span", { className: "font-bold text-xl text-text-primary", children: title }), priceInfo && (jsxRuntime.jsx("div", { className: "ml-auto font-medium text-base text-highlight", children: priceInfo })), jsxRuntime.jsx("span", { className: "accordion-chevron ml-4 text-base transition-transform duration-200", style: {
5020
+ return (jsxRuntime.jsxs("div", { style: {
5021
+ overflow: "hidden",
5022
+ backgroundColor: "var(--bw-surface-color)",
5023
+ border: "1px solid var(--bw-border-color)",
5024
+ borderRadius: "var(--bw-border-radius)",
5025
+ }, children: [jsxRuntime.jsxs("button", { type: "button", className: "accordion-trigger", onClick: onToggle, style: {
5026
+ width: "100%",
5027
+ display: "flex",
5028
+ justifyContent: "space-between",
5029
+ alignItems: "center",
5030
+ textAlign: "left",
5031
+ cursor: "pointer",
5032
+ padding: "16px",
5033
+ backgroundColor: "transparent",
5034
+ border: "none",
5035
+ fontFamily: "var(--bw-font-family)",
5036
+ transition: "background-color 0.2s ease",
5037
+ }, children: [jsxRuntime.jsx("span", { style: {
5038
+ fontWeight: 700,
5039
+ fontSize: "20px",
5040
+ color: "var(--bw-text-color)",
5041
+ }, children: title }), priceInfo && (jsxRuntime.jsx("div", { style: {
5042
+ marginLeft: "auto",
5043
+ fontWeight: 500,
5044
+ fontSize: "16px",
5045
+ color: "var(--bw-highlight-color)",
5046
+ }, children: priceInfo })), jsxRuntime.jsx("span", { className: "accordion-chevron", style: {
5047
+ marginLeft: "16px",
5048
+ fontSize: "16px",
5049
+ transition: "transform 0.2s ease",
4658
5050
  transform: isOpen ? "rotate(180deg)" : "rotate(0deg)",
4659
- }, children: "\u25BC" })] }), isOpen && (jsxRuntime.jsx("div", { className: "px-4 pb-4 border-t border-solid border-border bg-background", children: children }))] }));
5051
+ }, children: "\u25BC" })] }), isOpen && (jsxRuntime.jsx("div", { style: {
5052
+ padding: "0 16px 16px 16px",
5053
+ borderTop: "1px solid var(--bw-border-color)",
5054
+ backgroundColor: "var(--bw-background-color)",
5055
+ }, children: children }))] }));
4660
5056
  }
4661
5057
 
4662
5058
  // Spinner icon (kept local as it has animation style)
4663
- const IconSpinner = ({ size = 16, color = "currentColor" }) => (jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "animate-spin", children: jsxRuntime.jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) }));
5059
+ const IconSpinner = ({ size = 16, color = "currentColor" }) => (jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", style: { animation: "spin 1s linear infinite" }, children: jsxRuntime.jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) }));
4664
5060
  function VoucherInput({ config, orderValue, eventInstanceId, customerEmail, onVoucherValidated, appliedVouchers, onRemoveVoucher, disabled = false, }) {
4665
5061
  const [inputValue, setInputValue] = React__default.useState("");
4666
5062
  const [isLoading, setIsLoading] = React__default.useState(false);
4667
5063
  const [error, setError] = React__default.useState(null);
4668
5064
  const [isExpanded, setIsExpanded] = React__default.useState(false);
4669
- // Check if a discount code is already applied (only one allowed)
4670
5065
  const hasDiscountCode = appliedVouchers.some((v) => v.type === "discount");
4671
5066
  const validateVoucher = React__default.useCallback(async (code) => {
4672
5067
  if (!code.trim()) {
4673
5068
  setError(null);
4674
5069
  return;
4675
5070
  }
4676
- // Check if code is already applied
4677
5071
  if (appliedVouchers.some((v) => v.code.toUpperCase() === code.toUpperCase())) {
4678
5072
  setError("Dieser Code wurde bereits angewendet");
4679
5073
  return;
@@ -4693,7 +5087,6 @@ function VoucherInput({ config, orderValue, eventInstanceId, customerEmail, onVo
4693
5087
  });
4694
5088
  const data = await response.json();
4695
5089
  if (data.valid && data.voucher) {
4696
- // Check if trying to add a second discount code
4697
5090
  if (data.voucher.type === "discount" && hasDiscountCode) {
4698
5091
  setError("Es kann nur ein Rabattcode verwendet werden");
4699
5092
  onVoucherValidated(null, "Es kann nur ein Rabattcode verwendet werden");
@@ -4738,18 +5131,122 @@ function VoucherInput({ config, orderValue, eventInstanceId, customerEmail, onVo
4738
5131
  }
4739
5132
  }
4740
5133
  };
4741
- return (jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border rounded overflow-hidden", children: [jsxRuntime.jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "w-full p-4 bg-transparent border-0 cursor-pointer flex items-center justify-between text-text-primary font-sans text-base font-medium", children: [jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [jsxRuntime.jsx(IconTicket, { size: 18, color: "var(--bw-highlight-color)" }), "Rabattcode oder Gutschein", appliedVouchers.length > 0 && (jsxRuntime.jsx("span", { className: "bg-highlight text-white px-2 py-0.5 rounded-full text-xs font-semibold", children: appliedVouchers.length }))] }), jsxRuntime.jsx("span", { className: "transition-transform duration-200", style: { transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)" }, children: "\u25BC" })] }), isExpanded && (jsxRuntime.jsxs("div", { className: "px-4 pb-4", children: [appliedVouchers.length > 0 && (jsxRuntime.jsx("div", { className: "mb-3", children: appliedVouchers.map((voucher) => (jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-3 py-2.5 bg-surface border border-solid border-border rounded mb-2", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [voucher.type === "discount" ? (jsxRuntime.jsx(IconTicket, { size: 18, color: "var(--bw-success-color)" })) : (jsxRuntime.jsx(IconGift, { size: 18, color: "var(--bw-success-color)" })), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { className: "font-sans text-base font-semibold text-text-primary flex items-center gap-1.5", children: [jsxRuntime.jsx("span", { className: "font-mono", children: voucher.code }), jsxRuntime.jsx(IconCheck, { size: 14, color: "var(--bw-success-color)" })] }), jsxRuntime.jsxs("div", { className: "font-sans text-xs text-success", children: [voucher.type === "discount"
5134
+ return (jsxRuntime.jsxs("div", { style: {
5135
+ backgroundColor: "var(--bw-surface-color)",
5136
+ border: "1px solid var(--bw-border-color)",
5137
+ borderRadius: "var(--bw-border-radius)",
5138
+ overflow: "hidden",
5139
+ }, children: [jsxRuntime.jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), style: {
5140
+ width: "100%",
5141
+ padding: "16px",
5142
+ backgroundColor: "transparent",
5143
+ border: "none",
5144
+ cursor: "pointer",
5145
+ display: "flex",
5146
+ alignItems: "center",
5147
+ justifyContent: "space-between",
5148
+ color: "var(--bw-text-color)",
5149
+ fontFamily: "var(--bw-font-family)",
5150
+ fontSize: "16px",
5151
+ fontWeight: 500,
5152
+ }, children: [jsxRuntime.jsxs("span", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [jsxRuntime.jsx(IconTicket, { size: 18, color: "var(--bw-highlight-color)" }), "Rabattcode oder Gutschein", appliedVouchers.length > 0 && (jsxRuntime.jsx("span", { style: {
5153
+ backgroundColor: "var(--bw-highlight-color)",
5154
+ color: "#ffffff",
5155
+ padding: "2px 8px",
5156
+ borderRadius: "9999px",
5157
+ fontSize: "12px",
5158
+ fontWeight: 600,
5159
+ }, children: appliedVouchers.length }))] }), jsxRuntime.jsx("span", { style: {
5160
+ transition: "transform 0.2s ease",
5161
+ transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)",
5162
+ }, children: "\u25BC" })] }), isExpanded && (jsxRuntime.jsxs("div", { style: { padding: "0 16px 16px 16px" }, children: [appliedVouchers.length > 0 && (jsxRuntime.jsx("div", { style: { marginBottom: "12px" }, children: appliedVouchers.map((voucher) => (jsxRuntime.jsxs("div", { style: {
5163
+ display: "flex",
5164
+ alignItems: "center",
5165
+ justifyContent: "space-between",
5166
+ padding: "10px 12px",
5167
+ backgroundColor: "var(--bw-surface-color)",
5168
+ border: "1px solid var(--bw-border-color)",
5169
+ borderRadius: "var(--bw-border-radius)",
5170
+ marginBottom: "8px",
5171
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [voucher.type === "discount" ? (jsxRuntime.jsx(IconTicket, { size: 18, color: "var(--bw-success-color)" })) : (jsxRuntime.jsx(IconGift, { size: 18, color: "var(--bw-success-color)" })), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { style: {
5172
+ fontFamily: "var(--bw-font-family)",
5173
+ fontSize: "16px",
5174
+ fontWeight: 600,
5175
+ color: "var(--bw-text-color)",
5176
+ display: "flex",
5177
+ alignItems: "center",
5178
+ gap: "6px",
5179
+ }, children: [jsxRuntime.jsx("span", { style: { fontFamily: "ui-monospace, monospace" }, children: voucher.code }), jsxRuntime.jsx(IconCheck, { size: 14, color: "var(--bw-success-color)" })] }), jsxRuntime.jsxs("div", { style: {
5180
+ fontFamily: "var(--bw-font-family)",
5181
+ fontSize: "12px",
5182
+ color: "var(--bw-success-color)",
5183
+ }, children: [voucher.type === "discount"
4742
5184
  ? `−${formatCurrency(voucher.discountAmount)} Rabatt`
4743
5185
  : `−${formatCurrency(voucher.balanceToUse || voucher.discountAmount)} Gutschein`, voucher.type === "giftCard" &&
4744
5186
  voucher.remainingBalance !== undefined &&
4745
- voucher.remainingBalance > 0 && (jsxRuntime.jsxs("span", { className: "text-text-muted ml-2", children: ["(Rest: ", formatCurrency(voucher.remainingBalance), ")"] }))] })] })] }), jsxRuntime.jsx("button", { type: "button", onClick: () => onRemoveVoucher(voucher.code), className: "bg-transparent border-0 p-1 cursor-pointer text-error flex items-center justify-center rounded-full transition-colors duration-200 hover:bg-error/10", title: "Entfernen", children: jsxRuntime.jsx(IconX, { size: 16 }) })] }, voucher.code))) })), jsxRuntime.jsxs("div", { className: "flex gap-2", children: [jsxRuntime.jsx("input", { type: "text", value: inputValue, onChange: (e) => {
5187
+ voucher.remainingBalance > 0 && (jsxRuntime.jsxs("span", { style: { color: "var(--bw-text-muted)", marginLeft: "8px" }, children: ["(Rest: ", formatCurrency(voucher.remainingBalance), ")"] }))] })] })] }), jsxRuntime.jsx("button", { type: "button", onClick: () => onRemoveVoucher(voucher.code), style: {
5188
+ backgroundColor: "transparent",
5189
+ border: "none",
5190
+ padding: "4px",
5191
+ cursor: "pointer",
5192
+ color: "var(--bw-error-color)",
5193
+ display: "flex",
5194
+ alignItems: "center",
5195
+ justifyContent: "center",
5196
+ borderRadius: "50%",
5197
+ transition: "background-color 0.2s ease",
5198
+ }, title: "Entfernen", children: jsxRuntime.jsx(IconX, { size: 16 }) })] }, voucher.code))) })), jsxRuntime.jsxs("div", { style: { display: "flex", gap: "8px" }, children: [jsxRuntime.jsx("input", { type: "text", value: inputValue, onChange: (e) => {
4746
5199
  setInputValue(e.target.value.toUpperCase());
4747
5200
  setError(null);
4748
5201
  }, onKeyDown: handleKeyDown, placeholder: hasDiscountCode
4749
5202
  ? "Gutscheincode eingeben..."
4750
- : "Rabatt- oder Gutscheincode eingeben...", className: "flex-1 px-3 py-2.5 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 uppercase focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)33]", disabled: disabled || isLoading }), jsxRuntime.jsx("button", { type: "button", onClick: handleSubmit, disabled: disabled || isLoading || !inputValue.trim(), className: `px-4 py-2.5 bg-highlight border-0 rounded text-white text-base font-sans font-semibold transition-all duration-200 flex items-center justify-center gap-1.5 min-w-[100px] ${disabled || isLoading
4751
- ? "cursor-not-allowed opacity-60"
4752
- : "cursor-pointer hover:brightness-110"}`, children: isLoading ? (jsxRuntime.jsx(IconSpinner, { size: 16, color: "#fff" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconCheck, { size: 16 }), "Einl\u00F6sen"] })) })] }), error && (jsxRuntime.jsxs("div", { className: "mt-2 px-3 py-2 bg-error/15 border border-solid border-error/40 rounded text-error text-base font-sans flex items-center gap-2", children: [jsxRuntime.jsx(IconX, { size: 16 }), error] })), hasDiscountCode && (jsxRuntime.jsx("div", { className: "mt-2 text-xs text-text-muted font-sans", children: "\uD83D\uDCA1 Es wurde bereits ein Rabattcode angewendet. Du kannst weitere Gutscheine hinzuf\u00FCgen." }))] }))] }));
5203
+ : "Rabatt- oder Gutscheincode eingeben...", style: {
5204
+ flex: 1,
5205
+ padding: "10px 12px",
5206
+ backgroundColor: "var(--bw-background-color)",
5207
+ border: "1px solid var(--bw-border-color)",
5208
+ borderRadius: "var(--bw-border-radius)",
5209
+ color: "var(--bw-text-color)",
5210
+ fontSize: "16px",
5211
+ fontFamily: "var(--bw-font-family)",
5212
+ outline: "none",
5213
+ transition: "all 0.2s ease",
5214
+ textTransform: "uppercase",
5215
+ }, disabled: disabled || isLoading }), jsxRuntime.jsx("button", { type: "button", onClick: handleSubmit, disabled: disabled || isLoading || !inputValue.trim(), style: {
5216
+ padding: "10px 16px",
5217
+ backgroundColor: "var(--bw-highlight-color)",
5218
+ border: "none",
5219
+ borderRadius: "var(--bw-border-radius)",
5220
+ color: "#ffffff",
5221
+ fontSize: "16px",
5222
+ fontFamily: "var(--bw-font-family)",
5223
+ fontWeight: 600,
5224
+ transition: "all 0.2s ease",
5225
+ display: "flex",
5226
+ alignItems: "center",
5227
+ justifyContent: "center",
5228
+ gap: "6px",
5229
+ minWidth: "100px",
5230
+ cursor: disabled || isLoading ? "not-allowed" : "pointer",
5231
+ opacity: disabled || isLoading ? 0.6 : 1,
5232
+ }, children: isLoading ? (jsxRuntime.jsx(IconSpinner, { size: 16, color: "#fff" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconCheck, { size: 16 }), "Einl\u00F6sen"] })) })] }), error && (jsxRuntime.jsxs("div", { style: {
5233
+ marginTop: "8px",
5234
+ padding: "8px 12px",
5235
+ backgroundColor: "rgba(var(--bw-error-color), 0.15)",
5236
+ border: "1px solid rgba(var(--bw-error-color), 0.4)",
5237
+ borderRadius: "var(--bw-border-radius)",
5238
+ color: "var(--bw-error-color)",
5239
+ fontSize: "16px",
5240
+ fontFamily: "var(--bw-font-family)",
5241
+ display: "flex",
5242
+ alignItems: "center",
5243
+ gap: "8px",
5244
+ }, children: [jsxRuntime.jsx(IconX, { size: 16 }), error] })), hasDiscountCode && (jsxRuntime.jsx("div", { style: {
5245
+ marginTop: "8px",
5246
+ fontSize: "12px",
5247
+ color: "var(--bw-text-muted)",
5248
+ fontFamily: "var(--bw-font-family)",
5249
+ }, children: "\uD83D\uDCA1 Es wurde bereits ein Rabattcode angewendet. Du kannst weitere Gutscheine hinzuf\u00FCgen." }))] }))] }));
4753
5250
  }
4754
5251
 
4755
5252
  var util;
@@ -8555,12 +9052,197 @@ function createBookingFormSchema() {
8555
9052
  // Pre-created schema instance
8556
9053
  createBookingFormSchema();
8557
9054
 
9055
+ /**
9056
+ * Shared inline styles for the booking widget.
9057
+ *
9058
+ * This module provides consistent styling across all components using inline styles.
9059
+ * We use inline styles because:
9060
+ * 1. The widget renders components in portals (outside the main DOM tree)
9061
+ * 2. CSS classes may not be available in all embedding contexts (iframes, shadow DOM)
9062
+ * 3. Inline styles with CSS variables provide theming while guaranteeing styles are applied
9063
+ *
9064
+ * Usage:
9065
+ * import { buttonStyles, cardStyles } from "../../styles/shared-styles";
9066
+ * <button style={buttonStyles.primary}>Click me</button>
9067
+ */
9068
+ // ============================================
9069
+ // BUTTONS
9070
+ // ============================================
9071
+ const buttonBase = {
9072
+ display: "inline-flex",
9073
+ alignItems: "center",
9074
+ justifyContent: "center",
9075
+ gap: "6px",
9076
+ padding: "12px 16px",
9077
+ borderRadius: "var(--bw-border-radius)",
9078
+ fontSize: "14px",
9079
+ fontWeight: 600,
9080
+ fontFamily: "var(--bw-font-family)",
9081
+ cursor: "pointer",
9082
+ transition: "all 0.2s ease",
9083
+ whiteSpace: "nowrap",
9084
+ border: "none",
9085
+ };
9086
+ const buttonStyles = {
9087
+ primary: {
9088
+ ...buttonBase,
9089
+ backgroundColor: "var(--bw-highlight-color)",
9090
+ color: "#ffffff",
9091
+ border: "none",
9092
+ },
9093
+ secondary: {
9094
+ ...buttonBase,
9095
+ backgroundColor: "transparent",
9096
+ color: "var(--bw-text-muted)",
9097
+ border: "1px solid var(--bw-border-color)",
9098
+ },
9099
+ // Full width modifier
9100
+ fullWidth: {
9101
+ width: "100%",
9102
+ flex: 1,
9103
+ },
9104
+ };
9105
+ // ============================================
9106
+ // CARDS
9107
+ // ============================================
9108
+ const cardStyles$1 = {
9109
+ base: {
9110
+ backgroundColor: "var(--bw-surface-color)",
9111
+ border: "1px solid var(--bw-border-color)",
9112
+ borderRadius: "var(--bw-border-radius)",
9113
+ padding: "20px",
9114
+ marginBottom: "20px",
9115
+ }};
9116
+ // ============================================
9117
+ // FORMS
9118
+ // ============================================
9119
+ const formStyles = {
9120
+ label: {
9121
+ display: "block",
9122
+ fontSize: "14px",
9123
+ fontWeight: 500,
9124
+ color: "var(--bw-text-muted)",
9125
+ marginBottom: "6px",
9126
+ fontFamily: "var(--bw-font-family)",
9127
+ },
9128
+ input: {
9129
+ width: "100%",
9130
+ padding: "8px 12px",
9131
+ backgroundColor: "var(--bw-background-color)",
9132
+ border: "1px solid var(--bw-border-color)",
9133
+ borderRadius: "var(--bw-border-radius)",
9134
+ color: "var(--bw-text-color)",
9135
+ fontSize: "16px", // Keep 16px for iOS zoom prevention
9136
+ fontFamily: "var(--bw-font-family)",
9137
+ outline: "none",
9138
+ transition: "all 0.2s ease",
9139
+ },
9140
+ checkbox: {
9141
+ width: "20px",
9142
+ height: "20px",
9143
+ border: "1px solid var(--bw-border-color)",
9144
+ accentColor: "var(--bw-highlight-color)",
9145
+ cursor: "pointer",
9146
+ },
9147
+ error: {
9148
+ color: "var(--bw-error-color)",
9149
+ fontSize: "13px",
9150
+ marginTop: "4px",
9151
+ fontFamily: "var(--bw-font-family)",
9152
+ }};
9153
+ // ============================================
9154
+ // SECTION HEADERS
9155
+ // ============================================
9156
+ const sectionStyles = {
9157
+ header: {
9158
+ fontSize: "16px",
9159
+ fontWeight: 600,
9160
+ color: "var(--bw-highlight-color)",
9161
+ marginBottom: "12px",
9162
+ fontFamily: "var(--bw-font-family)",
9163
+ borderBottom: "2px solid var(--bw-highlight-color)",
9164
+ paddingBottom: "4px",
9165
+ margin: 0,
9166
+ }};
9167
+ // ============================================
9168
+ // TEXT
9169
+ // ============================================
9170
+ const textStyles = {
9171
+ muted: {
9172
+ fontSize: "14px",
9173
+ color: "var(--bw-text-muted)",
9174
+ fontFamily: "var(--bw-font-family)",
9175
+ }};
9176
+ // ============================================
9177
+ // PARTICIPANT UPSELLS
9178
+ // ============================================
9179
+ const participantUpsellStyles = {
9180
+ container: {
9181
+ display: "flex",
9182
+ flexWrap: "wrap",
9183
+ gap: "8px",
9184
+ marginTop: "10px",
9185
+ paddingTop: "10px",
9186
+ borderTop: "1px dashed var(--bw-border-color)",
9187
+ },
9188
+ label: {
9189
+ display: "inline-flex",
9190
+ alignItems: "center",
9191
+ gap: "6px",
9192
+ padding: "6px 10px",
9193
+ backgroundColor: "var(--bw-background-color)",
9194
+ border: "1px solid var(--bw-border-color)",
9195
+ borderRadius: "var(--bw-border-radius-small, 8px)",
9196
+ fontSize: "13px",
9197
+ fontFamily: "var(--bw-font-family)",
9198
+ color: "var(--bw-text-muted)",
9199
+ cursor: "pointer",
9200
+ transition: "all 0.2s ease",
9201
+ },
9202
+ labelSelected: {
9203
+ display: "inline-flex",
9204
+ alignItems: "center",
9205
+ gap: "6px",
9206
+ padding: "6px 10px",
9207
+ backgroundColor: "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)",
9208
+ border: "1px solid var(--bw-highlight-color)",
9209
+ borderRadius: "var(--bw-border-radius-small, 8px)",
9210
+ fontSize: "13px",
9211
+ fontFamily: "var(--bw-font-family)",
9212
+ color: "var(--bw-highlight-color)",
9213
+ cursor: "pointer",
9214
+ transition: "all 0.2s ease",
9215
+ },
9216
+ checkbox: {
9217
+ width: "16px",
9218
+ height: "16px",
9219
+ accentColor: "var(--bw-highlight-color)",
9220
+ cursor: "pointer",
9221
+ },
9222
+ };
9223
+ // ============================================
9224
+ // HELPER FUNCTIONS
9225
+ // ============================================
9226
+ /**
9227
+ * Merge multiple style objects together
9228
+ */
9229
+ function mergeStyles(...styles) {
9230
+ return Object.assign({}, ...styles.filter(Boolean));
9231
+ }
9232
+
8558
9233
  // Pre-typed resolver - cast schema to any to avoid deep type instantiation in zodResolver
8559
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
8560
9234
  const bookingResolver = t(createBookingFormSchema());
8561
- function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError, onBackToEventInstances, onBackToEventTypes, selectedEventType, selectedEventInstance, isOpen, onClose, systemConfig, }) {
8562
- // New voucher system - supports multiple gift cards + one discount code
9235
+ // Local style aliases from shared styles
9236
+ const cardStyles = cardStyles$1.base;
9237
+ const sectionHeaderStyles = sectionStyles.header;
9238
+ const labelStyles = formStyles.label;
9239
+ const inputStyles = formStyles.input;
9240
+ const errorTextStyles = formStyles.error;
9241
+ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError, onBackToEventInstances, onBackToEventTypes, selectedEventType, selectedEventInstance, isOpen, onClose, systemConfig, selectedUpsells = [], upsells = [], }) {
8563
9242
  const [appliedVouchers, setAppliedVouchers] = React__default.useState([]);
9243
+ const paymentSectionRef = React__default.useRef(null);
9244
+ // Per-participant upsell selections: participantIndex -> array of upsell package IDs
9245
+ const [participantUpsells, setParticipantUpsells] = React__default.useState({});
8564
9246
  const form = useForm({
8565
9247
  resolver: bookingResolver,
8566
9248
  defaultValues: {
@@ -8579,13 +9261,59 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8579
9261
  const customerEmailError = form.formState.errors.customerEmail;
8580
9262
  const watchedAcceptTerms = form.watch("acceptTerms");
8581
9263
  const { isValid: isFormValid } = form.formState;
8582
- // Calculate base total before any discounts
9264
+ // Initialize participant upsells from selectedUpsells when component mounts or participants change
9265
+ React__default.useEffect(() => {
9266
+ if (selectedUpsells.length > 0 && upsells.length > 0) {
9267
+ const globalUpsellIds = selectedUpsells.map(s => s.upsellPackageId);
9268
+ const newParticipantUpsells = {};
9269
+ // Pre-select the global upsells for all current participants
9270
+ watchedParticipants.forEach((_, index) => {
9271
+ // Keep existing selections if they exist, otherwise use global selections
9272
+ if (participantUpsells[index] === undefined) {
9273
+ newParticipantUpsells[index] = [...globalUpsellIds];
9274
+ }
9275
+ else {
9276
+ newParticipantUpsells[index] = participantUpsells[index];
9277
+ }
9278
+ });
9279
+ setParticipantUpsells(newParticipantUpsells);
9280
+ }
9281
+ }, [watchedParticipants.length, selectedUpsells, upsells.length]);
9282
+ // Toggle upsell for a specific participant
9283
+ const toggleParticipantUpsell = (participantIndex, upsellId) => {
9284
+ setParticipantUpsells(prev => {
9285
+ const currentUpsells = prev[participantIndex] || [];
9286
+ const hasUpsell = currentUpsells.includes(upsellId);
9287
+ return {
9288
+ ...prev,
9289
+ [participantIndex]: hasUpsell
9290
+ ? currentUpsells.filter(id => id !== upsellId)
9291
+ : [...currentUpsells, upsellId]
9292
+ };
9293
+ });
9294
+ };
8583
9295
  const calculateBaseTotal = React__default.useCallback(() => {
8584
9296
  if (!eventDetails)
8585
9297
  return 0;
8586
9298
  return eventDetails.price * watchedParticipants.filter((p) => p.name.trim()).length;
8587
9299
  }, [eventDetails, watchedParticipants]);
8588
- // Calculate total discount from all applied vouchers
9300
+ // Calculate upsells total based on per-participant selections
9301
+ const calculateUpsellsTotal = React__default.useCallback(() => {
9302
+ let total = 0;
9303
+ watchedParticipants.forEach((participant, index) => {
9304
+ // Only count upsells for participants with names
9305
+ if (participant.name.trim()) {
9306
+ const participantUpsellIds = participantUpsells[index] || [];
9307
+ participantUpsellIds.forEach(upsellId => {
9308
+ const upsell = upsells.find(u => u.id === upsellId);
9309
+ if (upsell) {
9310
+ total += upsell.price;
9311
+ }
9312
+ });
9313
+ }
9314
+ });
9315
+ return total;
9316
+ }, [participantUpsells, upsells, watchedParticipants]);
8589
9317
  const calculateTotalDiscount = React__default.useCallback(() => {
8590
9318
  return appliedVouchers.reduce((total, voucher) => {
8591
9319
  if (voucher.type === "discount") {
@@ -8597,12 +9325,12 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8597
9325
  return total;
8598
9326
  }, 0);
8599
9327
  }, [appliedVouchers]);
8600
- // Calculate total amount after discounts
8601
9328
  const calculateTotal = React__default.useCallback(() => {
8602
9329
  const baseTotal = calculateBaseTotal();
9330
+ const upsellsTotal = calculateUpsellsTotal();
8603
9331
  const totalDiscount = calculateTotalDiscount();
8604
- return Math.max(0, baseTotal - totalDiscount);
8605
- }, [calculateBaseTotal, calculateTotalDiscount]);
9332
+ return Math.max(0, baseTotal + upsellsTotal - totalDiscount);
9333
+ }, [calculateBaseTotal, calculateUpsellsTotal, calculateTotalDiscount]);
8606
9334
  const calculateDeposit = () => {
8607
9335
  if (!eventDetails || !eventDetails.deposit)
8608
9336
  return 0;
@@ -8610,16 +9338,36 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8610
9338
  return eventDetails.deposit * participantCount;
8611
9339
  };
8612
9340
  const baseTotal = calculateBaseTotal();
9341
+ const upsellsTotal = calculateUpsellsTotal();
8613
9342
  const totalDiscount = calculateTotalDiscount();
8614
9343
  const totalAmount = calculateTotal();
8615
9344
  const depositAmount = calculateDeposit();
8616
- // If there's a deposit, we pay the deposit; otherwise we pay the total after discounts
8617
- const paymentAmount = depositAmount > 0 ? Math.max(0, depositAmount - totalDiscount) : totalAmount;
8618
- // Get discount code for legacy compatibility
9345
+ // Deposit stays fixed unless the discounted total is lower than the deposit
9346
+ // (discount applies to total price, not to the deposit itself)
9347
+ const paymentAmount = depositAmount > 0 ? Math.min(depositAmount, totalAmount) : totalAmount;
9348
+ // Convert per-participant upsells to UpsellSelection[] format for API
9349
+ // Includes participantIndices to track which participants selected each upsell
9350
+ const aggregatedUpsellSelections = React__default.useCallback(() => {
9351
+ const upsellParticipantMap = {};
9352
+ watchedParticipants.forEach((participant, index) => {
9353
+ if (participant.name.trim()) {
9354
+ const participantUpsellIds = participantUpsells[index] || [];
9355
+ participantUpsellIds.forEach(upsellId => {
9356
+ if (!upsellParticipantMap[upsellId]) {
9357
+ upsellParticipantMap[upsellId] = [];
9358
+ }
9359
+ upsellParticipantMap[upsellId].push(index);
9360
+ });
9361
+ }
9362
+ });
9363
+ return Object.entries(upsellParticipantMap).map(([upsellPackageId, participantIndices]) => ({
9364
+ upsellPackageId: Number(upsellPackageId),
9365
+ quantity: participantIndices.length,
9366
+ participantIndices,
9367
+ }));
9368
+ }, [participantUpsells, watchedParticipants]);
8619
9369
  const appliedDiscountCode = appliedVouchers.find((v) => v.type === "discount");
8620
- // Get gift cards
8621
9370
  const appliedGiftCards = appliedVouchers.filter((v) => v.type === "giftCard");
8622
- // Voucher handlers
8623
9371
  const handleVoucherValidated = React__default.useCallback((voucher, _error) => {
8624
9372
  if (voucher) {
8625
9373
  setAppliedVouchers((prev) => [...prev, voucher]);
@@ -8628,13 +9376,11 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8628
9376
  const handleRemoveVoucher = React__default.useCallback((code) => {
8629
9377
  setAppliedVouchers((prev) => prev.filter((v) => v.code !== code));
8630
9378
  }, []);
8631
- // Check if form is ready for payment (schema valid + participant count within limit)
8632
9379
  const isReadyForPayment = () => {
8633
9380
  const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
8634
9381
  const participantsWithinLimit = participantCount <= (eventDetails?.availableSpots || 0);
8635
9382
  return isFormValid && participantsWithinLimit && participantCount > 0;
8636
9383
  };
8637
- // Re-validate vouchers when participant count changes (affects order value)
8638
9384
  React__default.useEffect(() => {
8639
9385
  if (appliedVouchers.length > 0) {
8640
9386
  const newBaseTotal = eventDetails?.price
@@ -8673,7 +9419,6 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8673
9419
  }));
8674
9420
  }
8675
9421
  }, [watchedParticipants, eventDetails]);
8676
- // Helper functions
8677
9422
  const addParticipant = () => {
8678
9423
  const currentParticipants = form.getValues("participants");
8679
9424
  const availableSpots = eventDetails?.availableSpots || 0;
@@ -8690,7 +9435,6 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8690
9435
  form.setValue("participants", currentParticipants.filter((_, i) => i !== index));
8691
9436
  }
8692
9437
  };
8693
- // Stripe appearance based on theme CSS variables
8694
9438
  const [stripeAppearance, setStripeAppearance] = React__default.useState(null);
8695
9439
  React__default.useEffect(() => {
8696
9440
  const container = document.querySelector(".booking-widget-container");
@@ -8726,10 +9470,79 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8726
9470
  onBackToEventTypes?.();
8727
9471
  }
8728
9472
  };
9473
+ const scrollToPayment = () => {
9474
+ paymentSectionRef.current?.scrollIntoView({ behavior: "smooth", block: "start" });
9475
+ };
9476
+ // Footer navigation
9477
+ const footerContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: handleClose, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: "\u2190 Zur\u00FCck" }), jsxRuntime.jsx("button", { type: "button", onClick: scrollToPayment, style: mergeStyles(buttonStyles.primary, buttonStyles.fullWidth), children: "Zur Zahlung \u2193" })] }));
8729
9478
  if (!eventDetails.bookingOpen) {
8730
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Buchung nicht m\u00F6glich", children: jsxRuntime.jsx("div", { className: "flex items-center justify-center min-h-[400px] text-center p-4", children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "mx-auto mb-4 text-[48px]", children: jsxRuntime.jsx(IconWarning, { size: 48, color: "var(--bw-error-color)" }) }), jsxRuntime.jsx("h3", { className: "mb-2 font-semibold text-lg text-text-muted font-sans", children: "Buchung nicht m\u00F6glich" }), jsxRuntime.jsx("p", { className: "text-text-muted font-sans", children: "F\u00FCr diese Veranstaltung sind derzeit keine Buchungen m\u00F6glich." })] }) }) }));
8731
- }
8732
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `Buchung - ${eventDetails.name}`, children: jsxRuntime.jsxs("div", { className: "booking-widget-container p-4", children: [jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4 mb-6", children: [jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-highlight mb-3 font-sans border-b-2 border-highlight pb-1", children: "Event Details" }), jsxRuntime.jsxs("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] gap-3 text-base", children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsxs("span", { className: "text-text-muted font-sans flex items-center gap-1", children: [jsxRuntime.jsx(IconCalendar, { size: 20, color: "var(--bw-highlight-color)" }), " Datum:"] }), jsxRuntime.jsx("span", { className: "text-text-primary font-medium font-sans", children: formatEventDate(eventDetails.startTime) })] }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsxs("span", { className: "text-text-muted font-sans flex items-center gap-1", children: [jsxRuntime.jsx(IconCalendar, { size: 20, color: "var(--bw-highlight-color)" }), " Uhrzeit:"] }), jsxRuntime.jsx("span", { className: "text-text-primary font-medium font-sans", children: formatTime(eventDetails.startTime, "Europe/Berlin", "de") })] }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsxs("span", { className: "text-text-muted font-sans flex items-center gap-1", children: [jsxRuntime.jsx(IconClock, { size: 20, color: "var(--bw-highlight-color)" }), " Dauer:"] }), jsxRuntime.jsxs("span", { className: "text-text-primary font-medium font-sans", children: [eventDetails.durationDays, " Tag", eventDetails.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsxs("span", { className: "text-text-muted font-sans flex items-center gap-1", children: [jsxRuntime.jsx(IconMoney, { size: 20, color: "var(--bw-highlight-color)" }), " Preis:"] }), jsxRuntime.jsxs("span", { className: "text-text-primary font-medium font-sans", children: [formatCurrency(eventDetails.price), " pro Person"] })] })] })] }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4 mb-6", children: [jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-highlight mb-3 font-sans border-b-2 border-highlight pb-1", children: "Kontaktdaten" }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [jsxRuntime.jsxs("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] gap-4", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerName", className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "Name *" }), jsxRuntime.jsx("input", { id: "customerName", ...form.register("customerName"), type: "text", className: "w-full px-3 py-2 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)]", placeholder: "Dein vollst\u00E4ndiger Name" }), customerNameError && (jsxRuntime.jsx("p", { className: "text-error text-base mt-1 font-sans", children: customerNameError.message }))] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerEmail", className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "E-Mail *" }), jsxRuntime.jsx("input", { id: "customerEmail", ...form.register("customerEmail"), type: "email", className: "w-full px-3 py-2 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)]", placeholder: "deine@email.de" }), customerEmailError && (jsxRuntime.jsx("p", { className: "text-error text-base mt-1 font-sans", children: customerEmailError.message }))] })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerPhone", className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "Telefon (optional)" }), jsxRuntime.jsx("input", { id: "customerPhone", ...form.register("customerPhone"), type: "tel", className: "w-full px-3 py-2 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)]", placeholder: "+49 123 456789" })] })] })] }), jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4 mb-6", children: [jsxRuntime.jsx("div", { className: "flex justify-between items-center mb-4", children: jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-highlight m-0 font-sans border-b-2 border-highlight pb-1", children: "Teilnehmer" }) }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [watchedParticipants.map((_, index) => (jsxRuntime.jsxs("div", { className: "flex gap-3 items-center", children: [jsxRuntime.jsxs("div", { className: "flex-1", children: [jsxRuntime.jsx("label", { htmlFor: `participant-name-${index}`, className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "Name *" }), jsxRuntime.jsx("input", { id: `participant-name-${index}`, ...form.register(`participants.${index}.name`), type: "text", className: "w-full px-3 py-2 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)]", placeholder: "Teilnehmername" }), form.formState.errors.participants?.[index]?.name && (jsxRuntime.jsx("p", { className: "text-error text-base mt-1 font-sans", children: form.formState.errors.participants[index]?.name?.message }))] }), jsxRuntime.jsxs("div", { className: "w-20", children: [jsxRuntime.jsx("label", { htmlFor: `participant-age-${index}`, className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "Alter" }), jsxRuntime.jsx("input", { id: `participant-age-${index}`, ...form.register(`participants.${index}.age`, {
9479
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Buchung nicht m\u00F6glich", children: jsxRuntime.jsx("div", { style: {
9480
+ display: "flex",
9481
+ alignItems: "center",
9482
+ justifyContent: "center",
9483
+ minHeight: "400px",
9484
+ textAlign: "center",
9485
+ padding: "16px",
9486
+ }, children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { style: { margin: "0 auto 16px auto", fontSize: "48px" }, children: jsxRuntime.jsx(IconWarning, { size: 48, color: "var(--bw-error-color)" }) }), jsxRuntime.jsx("h3", { style: {
9487
+ marginBottom: "8px",
9488
+ fontWeight: 600,
9489
+ fontSize: "18px",
9490
+ color: "var(--bw-text-muted)",
9491
+ fontFamily: "var(--bw-font-family)",
9492
+ }, children: "Buchung nicht m\u00F6glich" }), jsxRuntime.jsx("p", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "F\u00FCr diese Veranstaltung sind derzeit keine Buchungen m\u00F6glich." })] }) }) }));
9493
+ }
9494
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `Buchung - ${eventDetails.name}`, footer: footerContent, children: jsxRuntime.jsxs("div", { className: "booking-widget-container", style: { padding: "16px" }, children: [jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: sectionHeaderStyles, children: "Event Details" }), jsxRuntime.jsxs("div", { style: {
9495
+ display: "grid",
9496
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
9497
+ gap: "12px",
9498
+ fontSize: "14px",
9499
+ }, children: [jsxRuntime.jsxs("div", { style: { marginTop: "10px", display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9500
+ color: "var(--bw-text-muted)",
9501
+ fontFamily: "var(--bw-font-family)",
9502
+ display: "flex",
9503
+ alignItems: "center",
9504
+ gap: "4px",
9505
+ }, children: [jsxRuntime.jsx(IconCalendar, { size: 20, color: "var(--bw-highlight-color)" }), " Datum:"] }), jsxRuntime.jsxs("span", { style: {
9506
+ color: "var(--bw-text-color)",
9507
+ fontWeight: 500,
9508
+ fontFamily: "var(--bw-font-family)",
9509
+ }, children: [formatEventDate(eventDetails.startTime), " \u2022 ", formatTime(eventDetails.startTime, "Europe/Berlin", "de")] })] }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9510
+ color: "var(--bw-text-muted)",
9511
+ fontFamily: "var(--bw-font-family)",
9512
+ display: "flex",
9513
+ alignItems: "center",
9514
+ gap: "4px",
9515
+ }, children: [jsxRuntime.jsx(IconClock, { size: 20, color: "var(--bw-highlight-color)" }), " Dauer:"] }), jsxRuntime.jsxs("span", { style: {
9516
+ color: "var(--bw-text-color)",
9517
+ fontWeight: 500,
9518
+ fontFamily: "var(--bw-font-family)",
9519
+ }, children: [eventDetails.durationDays, " Tag", eventDetails.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9520
+ color: "var(--bw-text-muted)",
9521
+ fontFamily: "var(--bw-font-family)",
9522
+ display: "flex",
9523
+ alignItems: "center",
9524
+ gap: "4px",
9525
+ }, children: [jsxRuntime.jsx(IconMoney, { size: 20, color: "var(--bw-highlight-color)" }), " Preis:"] }), jsxRuntime.jsxs("span", { style: {
9526
+ color: "var(--bw-text-color)",
9527
+ fontWeight: 500,
9528
+ fontFamily: "var(--bw-font-family)",
9529
+ }, children: [formatCurrency(eventDetails.price), " pro Person"] })] })] })] }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "24px" }, children: [jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: sectionHeaderStyles, children: "Kontaktdaten" }), jsxRuntime.jsxs("div", { style: { marginTop: "10px", display: "flex", flexDirection: "column", gap: "16px" }, children: [jsxRuntime.jsxs("div", { style: {
9530
+ display: "grid",
9531
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
9532
+ gap: "16px",
9533
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerName", style: labelStyles, children: "Name *" }), jsxRuntime.jsx("input", { id: "customerName", ...form.register("customerName"), type: "text", style: inputStyles, placeholder: "Dein vollst\u00E4ndiger Name" }), customerNameError && (jsxRuntime.jsx("p", { style: errorTextStyles, children: customerNameError.message }))] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerEmail", style: labelStyles, children: "E-Mail *" }), jsxRuntime.jsx("input", { id: "customerEmail", ...form.register("customerEmail"), type: "email", style: inputStyles, placeholder: "deine@email.de" }), customerEmailError && (jsxRuntime.jsx("p", { style: errorTextStyles, children: customerEmailError.message }))] })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { htmlFor: "customerPhone", style: labelStyles, children: "Telefon (optional)" }), jsxRuntime.jsx("input", { id: "customerPhone", ...form.register("customerPhone"), type: "tel", style: inputStyles, placeholder: "+49 123 456789" })] }), jsxRuntime.jsxs("div", { style: { marginTop: "10px", border: "1px solid var(--bw-border-color)", padding: "16px", borderRadius: "var(--bw-border-radius)" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("input", { id: "acceptTerms", ...form.register("acceptTerms"), type: "checkbox", style: formStyles.checkbox }), jsxRuntime.jsxs("label", { htmlFor: "acceptTerms", style: {
9534
+ fontSize: "14px",
9535
+ color: "var(--bw-text-muted)",
9536
+ fontFamily: "var(--bw-font-family)",
9537
+ maxWidth: "calc(100% - 32px)",
9538
+ overflowWrap: "break-word",
9539
+ cursor: "pointer",
9540
+ }, children: ["Ich akzeptiere die", " ", jsxRuntime.jsx("a", { href: eventDetails.agbUrl || "/terms", style: { color: "var(--bw-highlight-color)", textDecoration: "none" }, target: "_blank", rel: "noopener noreferrer", children: "AGBs" }), "*"] })] }), form.formState.errors.acceptTerms && (jsxRuntime.jsx("p", { style: { ...errorTextStyles, marginTop: "8px" }, children: form.formState.errors.acceptTerms.message }))] })] })] }), jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("div", { style: {
9541
+ display: "flex",
9542
+ justifyContent: "space-between",
9543
+ alignItems: "center",
9544
+ 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`, {
8733
9546
  setValueAs: (value) => {
8734
9547
  if (value === "" || value === null || value === undefined) {
8735
9548
  return undefined;
@@ -8737,44 +9550,138 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8737
9550
  const num = Number(value);
8738
9551
  return Number.isNaN(num) ? undefined : num;
8739
9552
  },
8740
- }), type: "number", min: "0", max: "120", className: "w-full px-3 py-2 bg-background border border-solid border-border rounded text-text-primary text-base font-sans outline-none transition-all duration-200 focus:border-highlight focus:shadow-[0_0_0_2px_var(--bw-highlight-color)]", placeholder: "25" })] }), watchedParticipants.length > 1 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { className: "block text-base font-medium text-text-muted mb-2 font-sans", children: "\u00A0" }), jsxRuntime.jsx("button", { type: "button", onClick: () => removeParticipant(index), className: "text-error bg-surface border border-solid border-border rounded-full w-9 h-9 flex items-center justify-center cursor-pointer transition-all duration-200 text-2xl font-bold font-sans p-0 hover:bg-border", children: "\u00D7" })] }))] }, index))), watchedParticipants.length < eventDetails.availableSpots ? (jsxRuntime.jsx("div", { className: "flex flex-col items-center mt-3", children: jsxRuntime.jsx("button", { type: "button", onClick: addParticipant, className: "text-white text-base font-semibold px-4 py-2 rounded bg-highlight border border-solid border-highlight cursor-pointer transition-all duration-200 mb-1 font-sans shadow-[0_2px_8px_0_var(--bw-highlight-color)] hover:brightness-110", children: "+ Teilnehmer hinzuf\u00FCgen" }) })) : (jsxRuntime.jsxs("p", { className: "text-error text-base font-sans", children: ["Maximal ", eventDetails.availableSpots, " Pl\u00E4tze verf\u00FCgbar."] }))] })] }), jsxRuntime.jsx(VoucherInput, { config: config, orderValue: baseTotal, eventInstanceId: eventDetails?.id, customerEmail: watchedCustomerEmail, onVoucherValidated: handleVoucherValidated, appliedVouchers: appliedVouchers, onRemoveVoucher: handleRemoveVoucher, disabled: !eventDetails }), jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4", children: [jsxRuntime.jsx("label", { htmlFor: "booking-comment", className: "block text-base font-medium text-text-primary mb-2 font-sans", children: "Kommentar (optional)" }), jsxRuntime.jsx("textarea", { id: "booking-comment", ...form.register("comment"), placeholder: "Zus\u00E4tzliche Anmerkungen zur Buchung...", rows: 3, className: "w-full p-3 border border-solid border-border rounded text-base font-sans bg-background text-text-primary resize-y min-h-[80px] outline-none transition-colors duration-200 focus:border-highlight" })] }), jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx("input", { id: "acceptTerms", ...form.register("acceptTerms"), type: "checkbox", className: "mt-1 w-5 h-5 border border-solid border-border accent-highlight cursor-pointer", style: {
8741
- appearance: "checkbox",
8742
- WebkitAppearance: "checkbox",
8743
- } }), jsxRuntime.jsxs("label", { htmlFor: "acceptTerms", className: "text-base text-text-muted font-sans max-w-[calc(100%-32px)] break-words", children: ["Ich akzeptiere die", " ", jsxRuntime.jsx("a", { href: eventDetails.agbUrl || "/terms", className: "text-highlight no-underline", target: "_blank", rel: "noopener noreferrer", children: "AGBs" }), "*"] })] }), form.formState.errors.acceptTerms && (jsxRuntime.jsx("p", { className: "text-error text-base mt-2 font-sans", children: form.formState.errors.acceptTerms.message }))] })] }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4", children: [jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-highlight mb-4 font-sans border-b-2 border-highlight pb-1", children: "Buchungszusammenfassung" }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsx("span", { className: "text-text-muted font-sans", children: "Anzahl Teilnehmer:" }), jsxRuntime.jsx("span", { className: "text-text-primary font-medium font-sans", children: watchedParticipants.filter((p) => p.name.trim()).length })] }), jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsx("span", { className: "text-text-muted font-sans", children: "Preis pro Person:" }), jsxRuntime.jsx("span", { className: "text-text-primary font-medium font-sans", children: formatCurrency(eventDetails.price) })] }), depositAmount > 0 && (jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsx("span", { className: "text-text-muted font-sans", children: "Anzahlung pro Person:" }), jsxRuntime.jsx("span", { className: "text-text-primary font-medium font-sans", children: formatCurrency(eventDetails.deposit || 0) })] })), appliedVouchers.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsx("span", { className: "text-text-muted font-sans", children: "Zwischensumme:" }), jsxRuntime.jsx("span", { className: `font-sans ${totalDiscount > 0 ? "text-text-muted line-through" : "text-text-muted"}`, children: formatCurrency(baseTotal) })] }), appliedDiscountCode && (jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsxs("span", { className: "text-success font-sans text-base", children: ["Rabatt (", appliedDiscountCode.code, "):"] }), jsxRuntime.jsxs("span", { className: "text-success font-sans", children: ["-", formatCurrency(appliedDiscountCode.discountAmount)] })] })), appliedGiftCards.map((giftCard) => (jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [jsxRuntime.jsxs("span", { className: "text-success font-sans text-base", children: ["Gutschein (", giftCard.code, "):"] }), jsxRuntime.jsxs("span", { className: "text-success font-sans", children: ["-", formatCurrency(giftCard.balanceToUse || giftCard.discountAmount)] })] }, giftCard.code)))] })), jsxRuntime.jsxs("div", { className: "border-t border-solid border-border pt-3", children: [depositAmount > 0 && (jsxRuntime.jsxs("div", { className: "flex justify-between items-center text-base mb-2", children: [jsxRuntime.jsx("span", { className: "text-text-muted font-sans", children: "Gesamtbetrag:" }), jsxRuntime.jsx("span", { className: "text-text-muted font-sans font-medium", children: formatCurrency(totalAmount) })] })), jsxRuntime.jsxs("div", { className: "flex justify-between items-center text-lg font-semibold", children: [jsxRuntime.jsx("span", { className: "text-text-primary font-sans", children: depositAmount > 0 ? "Heute zu zahlen (Anzahlung):" : "Gesamtbetrag:" }), jsxRuntime.jsx("span", { className: "text-highlight font-sans font-bold", children: formatCurrency(paymentAmount) })] })] })] })] }), stripePromise &&
8744
- (() => {
8745
- if (!isReadyForPayment()) {
8746
- const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
8747
- const missing = [];
8748
- if (participantCount === 0) {
8749
- missing.push("einen Teilnehmer");
8750
- }
8751
- if (participantCount > (eventDetails?.availableSpots || 0)) {
8752
- missing.push(`die Anzahl der Teilnehmer auf ${eventDetails?.availableSpots || 0} zu reduzieren`);
8753
- }
8754
- if (customerNameError) {
8755
- missing.push("einen gültigen Namen (mindestens 2 Zeichen)");
8756
- }
8757
- if (customerEmailError) {
8758
- missing.push("eine gültige E-Mail-Adresse");
8759
- }
8760
- if (!watchedAcceptTerms) {
8761
- missing.push("die Akzeptanz der Allgemeinen Geschäftsbedingungen");
9553
+ }), type: "number", min: "0", max: "120", style: inputStyles, placeholder: "25" })] }), watchedParticipants.length > 1 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { style: { ...labelStyles, visibility: "hidden" }, children: "\u00A0" }), jsxRuntime.jsx("button", { type: "button", onClick: () => removeParticipant(index), style: {
9554
+ color: "var(--bw-error-color)",
9555
+ backgroundColor: "var(--bw-surface-color)",
9556
+ border: "1px solid var(--bw-border-color)",
9557
+ borderRadius: "50%",
9558
+ width: "36px",
9559
+ height: "36px",
9560
+ display: "flex",
9561
+ alignItems: "center",
9562
+ justifyContent: "center",
9563
+ cursor: "pointer",
9564
+ transition: "all 0.2s ease",
9565
+ fontSize: "24px",
9566
+ fontWeight: 700,
9567
+ fontFamily: "var(--bw-font-family)",
9568
+ padding: 0,
9569
+ }, children: "\u00D7" })] }))] }), upsells.length > 0 && (jsxRuntime.jsx("div", { style: participantUpsellStyles.container, children: upsells.map((upsell) => {
9570
+ const isSelected = (participantUpsells[index] || []).includes(upsell.id);
9571
+ return (jsxRuntime.jsxs("label", { htmlFor: `upsell-${index}-${upsell.id}`, style: isSelected ? participantUpsellStyles.labelSelected : participantUpsellStyles.label, children: [jsxRuntime.jsx("input", { id: `upsell-${index}-${upsell.id}`, type: "checkbox", style: participantUpsellStyles.checkbox, checked: isSelected, onChange: () => toggleParticipantUpsell(index, upsell.id) }), jsxRuntime.jsx("span", { style: { fontWeight: 500 }, children: upsell.name }), jsxRuntime.jsxs("span", { style: { fontSize: "12px", opacity: 0.8 }, children: ["(+", formatCurrency(upsell.price), ")"] })] }, upsell.id));
9572
+ }) }))] }, index))), watchedParticipants.length < eventDetails.availableSpots ? (jsxRuntime.jsx("div", { style: {
9573
+ display: "flex",
9574
+ flexDirection: "column",
9575
+ alignItems: "center",
9576
+ marginTop: "12px",
9577
+ }, children: jsxRuntime.jsxs("button", { type: "button", onClick: addParticipant, style: {
9578
+ color: "#ffffff",
9579
+ fontSize: "14px",
9580
+ fontWeight: 600,
9581
+ padding: "8px 16px",
9582
+ borderRadius: "var(--bw-border-radius)",
9583
+ backgroundColor: "var(--bw-highlight-color)",
9584
+ border: "1px solid var(--bw-highlight-color)",
9585
+ cursor: "pointer",
9586
+ transition: "all 0.2s ease",
9587
+ marginBottom: "4px",
9588
+ fontFamily: "var(--bw-font-family)",
9589
+ boxShadow: "0 2px 8px 0 var(--bw-highlight-color)",
9590
+ }, children: [watchedParticipants.length + 1, ". Teilnehmer hinzuf\u00FCgen"] }) })) : (jsxRuntime.jsxs("p", { style: { ...errorTextStyles, margin: 0 }, children: ["Maximal ", eventDetails.availableSpots, " Pl\u00E4tze verf\u00FCgbar."] }))] })] }), jsxRuntime.jsx(VoucherInput, { config: config, orderValue: baseTotal, eventInstanceId: eventDetails?.id, customerEmail: watchedCustomerEmail, onVoucherValidated: handleVoucherValidated, appliedVouchers: appliedVouchers, onRemoveVoucher: handleRemoveVoucher, disabled: !eventDetails }), jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("label", { htmlFor: "booking-comment", style: labelStyles, children: "Kommentar (optional)" }), jsxRuntime.jsx("textarea", { id: "booking-comment", ...form.register("comment"), placeholder: "Zus\u00E4tzliche Anmerkungen zur Buchung...", rows: 3, style: {
9591
+ ...inputStyles,
9592
+ resize: "vertical",
9593
+ minHeight: "80px",
9594
+ } })] }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "24px" }, children: [jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles, marginBottom: "16px" }, children: "Buchungszusammenfassung" }), jsxRuntime.jsxs("div", { style: { marginTop: "10px", display: "flex", flexDirection: "column", gap: "12px" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Preis:" }), jsxRuntime.jsxs("div", { style: {
9595
+ color: "var(--bw-text-color)",
9596
+ fontWeight: 500,
9597
+ fontFamily: "var(--bw-font-family)",
9598
+ }, children: [jsxRuntime.jsxs("span", { style: { fontWeight: 200 }, children: [watchedParticipants.length > 1 ? watchedParticipants.filter((p) => p.name.trim()).length : 1, " x "] }), " ", formatCurrency(eventDetails.price)] })] }), depositAmount > 0 && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Anzahlung:" }), jsxRuntime.jsxs("span", { style: {
9599
+ color: "var(--bw-text-color)",
9600
+ fontWeight: 500,
9601
+ fontFamily: "var(--bw-font-family)",
9602
+ }, children: [jsxRuntime.jsxs("span", { style: { fontWeight: 200 }, children: [watchedParticipants.filter((p) => p.name.trim()).length, " x"] }), " ", formatCurrency(eventDetails.deposit || 0)] })] })), upsellsTotal > 0 && (jsxRuntime.jsxs("div", { style: { marginTop: "8px", paddingTop: "8px", borderTop: "1px dashed var(--bw-border-color)" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "13px", display: "block", marginBottom: "4px" }, children: "Extras:" }), upsells.map((upsell) => {
9603
+ // Count how many participants have this upsell selected
9604
+ const countWithUpsell = watchedParticipants.filter((p, idx) => p.name.trim() && (participantUpsells[idx] || []).includes(upsell.id)).length;
9605
+ if (countWithUpsell === 0)
9606
+ return null;
9607
+ const upsellLineTotal = upsell.price * countWithUpsell;
9608
+ return (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", fontSize: "13px" }, children: [jsxRuntime.jsxs("span", { style: { color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+ ", upsell.name, " (", countWithUpsell, "\u00D7)"] }), jsxRuntime.jsx("span", { style: { color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(upsellLineTotal) })] }, upsell.id));
9609
+ })] })), appliedVouchers.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Zwischensumme:" }), jsxRuntime.jsx("span", { style: {
9610
+ fontFamily: "var(--bw-font-family)",
9611
+ color: totalDiscount > 0 ? "var(--bw-text-muted)" : "var(--bw-text-muted)",
9612
+ textDecoration: totalDiscount > 0 ? "line-through" : "none",
9613
+ }, children: formatCurrency(baseTotal) })] }), appliedDiscountCode && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsxs("span", { style: {
9614
+ color: "var(--bw-success-color)",
9615
+ fontFamily: "var(--bw-font-family)",
9616
+ fontSize: "14px",
9617
+ }, children: ["Rabatt (", appliedDiscountCode.code, "):"] }), jsxRuntime.jsxs("span", { style: { color: "var(--bw-success-color)", fontFamily: "var(--bw-font-family)" }, children: ["-", formatCurrency(appliedDiscountCode.discountAmount)] })] })), appliedGiftCards.map((giftCard) => (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsxs("span", { style: {
9618
+ color: "var(--bw-success-color)",
9619
+ fontFamily: "var(--bw-font-family)",
9620
+ fontSize: "14px",
9621
+ }, 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
+ borderTop: "1px solid var(--bw-border-color)",
9623
+ paddingTop: "12px",
9624
+ }, children: [depositAmount > 0 && (jsxRuntime.jsxs("div", { style: {
9625
+ display: "flex",
9626
+ justifyContent: "space-between",
9627
+ alignItems: "center",
9628
+ fontSize: "14px",
9629
+ marginBottom: "8px",
9630
+ }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Gesamtbetrag:" }), jsxRuntime.jsx("span", { style: {
9631
+ color: "var(--bw-text-muted)",
9632
+ fontFamily: "var(--bw-font-family)",
9633
+ fontWeight: 500,
9634
+ }, children: formatCurrency(totalAmount) })] })), jsxRuntime.jsxs("div", { style: {
9635
+ display: "flex",
9636
+ justifyContent: "space-between",
9637
+ alignItems: "center",
9638
+ fontSize: "18px",
9639
+ 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: {
9641
+ color: "var(--bw-highlight-color)",
9642
+ fontFamily: "var(--bw-font-family)",
9643
+ fontWeight: 700,
9644
+ }, children: formatCurrency(paymentAmount) })] })] })] })] }), jsxRuntime.jsx("div", { ref: paymentSectionRef, children: stripePromise &&
9645
+ (() => {
9646
+ if (!isReadyForPayment()) {
9647
+ const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
9648
+ const missing = [];
9649
+ if (participantCount === 0) {
9650
+ missing.push("einen Teilnehmer");
9651
+ }
9652
+ if (participantCount > (eventDetails?.availableSpots || 0)) {
9653
+ missing.push(`die Anzahl der Teilnehmer auf ${eventDetails?.availableSpots || 0} zu reduzieren`);
9654
+ }
9655
+ if (customerNameError) {
9656
+ missing.push("einen gültigen Namen (mindestens 2 Zeichen)");
9657
+ }
9658
+ if (customerEmailError) {
9659
+ missing.push("eine gültige E-Mail-Adresse");
9660
+ }
9661
+ if (!watchedAcceptTerms) {
9662
+ missing.push("die Akzeptanz der Allgemeinen Geschäftsbedingungen");
9663
+ }
9664
+ const message = `Bitte gib mindestens ${missing.join(", ")} an, um fortzufahren.`;
9665
+ return (jsxRuntime.jsx("div", { style: {
9666
+ ...cardStyles,
9667
+ borderColor: "var(--bw-warning-color)",
9668
+ color: "var(--bw-warning-color)",
9669
+ fontFamily: "var(--bw-font-family)",
9670
+ textAlign: "center",
9671
+ }, children: message }));
8762
9672
  }
8763
- const message = `Bitte gib mindestens ${missing.join(", ")} an, um fortzufahren.`;
8764
- return (jsxRuntime.jsx("div", { className: "bg-surface border border-solid border-border rounded p-4 text-text-muted font-sans text-center", children: message }));
8765
- }
8766
- return (jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border backdrop-blur-sm rounded p-4", children: [jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-highlight mb-4 font-sans border-b-2 border-highlight pb-1", children: "Zahlung" }), jsxRuntime.jsx(PaymentForm, { config: config, eventDetails: eventDetails, formData: form.getValues(), totalAmount: paymentAmount, discountCode: appliedDiscountCode
8767
- ? {
8768
- id: appliedDiscountCode.id,
8769
- code: appliedDiscountCode.code,
8770
- description: appliedDiscountCode.description || undefined,
8771
- type: appliedDiscountCode.discountType || "percentage",
8772
- value: appliedDiscountCode.discountValue || 0,
8773
- discountAmount: appliedDiscountCode.discountAmount,
8774
- newTotal: appliedDiscountCode.newTotal,
8775
- }
8776
- : null, giftCards: appliedGiftCards, onSuccess: onSuccess, onError: onError, systemConfig: systemConfig ?? null, stripePromise: stripePromise, stripeAppearance: stripeAppearance })] }));
8777
- })()] })] })] }) }));
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
9674
+ ? {
9675
+ id: appliedDiscountCode.id,
9676
+ code: appliedDiscountCode.code,
9677
+ description: appliedDiscountCode.description || undefined,
9678
+ type: appliedDiscountCode.discountType || "percentage",
9679
+ value: appliedDiscountCode.discountValue || 0,
9680
+ discountAmount: appliedDiscountCode.discountAmount,
9681
+ newTotal: appliedDiscountCode.newTotal,
9682
+ }
9683
+ : null, giftCards: appliedGiftCards, onSuccess: onSuccess, onError: onError, systemConfig: systemConfig ?? null, stripePromise: stripePromise, stripeAppearance: stripeAppearance, upsellSelections: aggregatedUpsellSelections() })] }));
9684
+ })() })] })] })] }) }));
8778
9685
  }
8779
9686
 
8780
9687
  /**
@@ -8918,6 +9825,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
8918
9825
  order: data.order,
8919
9826
  payments: data.payments,
8920
9827
  orderItems: data.orderItems,
9828
+ purchases: data.purchases || [],
8921
9829
  stripePaymentIntent: data.stripePaymentIntent,
8922
9830
  });
8923
9831
  setEventDetails({
@@ -8926,7 +9834,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
8926
9834
  description: data.booking.eventInstance.eventType.description,
8927
9835
  startTime: data.booking.eventInstance.startTime,
8928
9836
  endTime: data.booking.eventInstance.endTime,
8929
- price: data.order.total / data.booking.participantCount,
9837
+ price: data.booking.eventInstance.price || 0, // Use actual event instance price
8930
9838
  });
8931
9839
  setFormData({
8932
9840
  customerEmail: data.booking.customerEmail,
@@ -9005,18 +9913,21 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9005
9913
  fontFamily: "var(--bw-font-family)",
9006
9914
  padding: "var(--bw-spacing-large)",
9007
9915
  maxWidth: "100%",
9008
- }, children: [jsxRuntime.jsxs("div", { className: "flex justify-between items-center print-hidden", style: {
9916
+ }, children: [jsxRuntime.jsxs("div", { className: "print-hidden", style: {
9009
9917
  marginBottom: "var(--bw-spacing-large)",
9010
9918
  display: "flex",
9011
9919
  alignItems: "center",
9012
9920
  justifyContent: "space-between",
9013
- }, children: [jsxRuntime.jsxs("h1", { className: "font-bold text-3xl flex items-center gap-2", style: {
9921
+ }, children: [jsxRuntime.jsxs("h1", { style: {
9014
9922
  color: "var(--bw-text-color)",
9015
9923
  fontFamily: "var(--bw-font-family)",
9016
9924
  marginBottom: "var(--bw-spacing-large)",
9017
9925
  display: "flex",
9018
9926
  alignItems: "center",
9019
9927
  gap: "var(--bw-spacing-small)",
9928
+ fontWeight: 700,
9929
+ fontSize: "24px",
9930
+ margin: 0,
9020
9931
  }, children: [jsxRuntime.jsx("div", { style: {
9021
9932
  width: "32px",
9022
9933
  height: "32px",
@@ -9052,24 +9963,26 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9052
9963
  color: "var(--bw-text-color)",
9053
9964
  margin: "0",
9054
9965
  fontFamily: "var(--bw-font-family)",
9055
- }, children: "Buchungsdetails" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Buchungsdetails" }) }), jsxRuntime.jsxs("div", { className: "space-y-4 print-only:space-y-2 print-only:p-0", children: [jsxRuntime.jsxs("div", { className: "gap-4 grid grid-cols-2 print-detail-grid", style: {
9966
+ }, children: "Buchungsdetails" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Buchungsdetails" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [jsxRuntime.jsxs("div", { className: "print-detail-grid", style: {
9056
9967
  display: "grid",
9057
9968
  gridTemplateColumns: "1fr 1fr",
9058
9969
  gap: "var(--bw-spacing)",
9059
- }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", style: { marginBottom: "span 2" }, children: [jsxRuntime.jsx("div", { className: "font-medium text-muted-foreground text-sm print-detail-label", style: {
9970
+ }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", style: { marginBottom: "span 2" }, children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9060
9971
  color: "var(--bw-text-muted)",
9061
9972
  fontSize: "var(--bw-font-size-small)",
9062
9973
  fontFamily: "var(--bw-font-family)",
9063
- }, children: "Buchungs-ID" }), jsxRuntime.jsx("p", { className: "font-semibold print-detail-value", style: {
9974
+ fontWeight: 500,
9975
+ }, children: "Buchungs-ID" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9064
9976
  fontWeight: "600",
9065
9977
  color: "var(--bw-text-color)",
9066
9978
  fontFamily: "var(--bw-font-family)",
9067
9979
  fontSize: "var(--bw-font-size-medium)",
9068
9980
  margin: "0px 0px 6px 0",
9069
- }, children: booking.bookingHash })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "font-medium text-muted-foreground text-sm print-detail-label", style: {
9981
+ }, children: booking.bookingHash })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9070
9982
  color: "var(--bw-text-muted)",
9071
9983
  fontSize: "var(--bw-font-size-small)",
9072
9984
  fontFamily: "var(--bw-font-family)",
9985
+ fontWeight: 500,
9073
9986
  }, children: "Bezahl-Status" }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { className: "print-hidden", style: {
9074
9987
  backgroundColor: "var(--bw-success-color, #10B981)",
9075
9988
  color: "white",
@@ -9082,34 +9995,37 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9082
9995
  ? "erfolgreich"
9083
9996
  : paymentStatus === "canceled" || paymentStatus === "failed"
9084
9997
  ? "fehlgeschlagen"
9085
- : "in Bearbeitung" }), jsxRuntime.jsx("span", { className: "print-only print-status-badge print-status-paid", children: "Bezahlt" })] })] })] }), jsxRuntime.jsxs("div", { className: "print-detail-item print-only:col-span-2", children: [jsxRuntime.jsx("div", { className: "font-medium text-muted-foreground text-sm print-detail-label", style: {
9998
+ : "in Bearbeitung" }), jsxRuntime.jsx("span", { className: "print-only print-status-badge print-status-paid", children: "Bezahlt" })] })] })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9086
9999
  color: "var(--bw-text-muted)",
9087
10000
  fontSize: "var(--bw-font-size-small)",
9088
10001
  fontFamily: "var(--bw-font-family)",
9089
- }, children: "Event" }), jsxRuntime.jsx("p", { className: "font-semibold print-detail-value", style: {
10002
+ fontWeight: 500,
10003
+ }, children: "Event" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9090
10004
  fontWeight: "600",
9091
10005
  color: "var(--bw-text-color)",
9092
10006
  fontFamily: "var(--bw-font-family)",
9093
10007
  fontSize: "var(--bw-font-size-large)",
9094
10008
  margin: "0 0 6px 0",
9095
- }, children: eventDetails.name })] }), jsxRuntime.jsxs("div", { className: "gap-4 grid grid-cols-2 print-detail-grid", style: {
10009
+ }, children: eventDetails.name })] }), jsxRuntime.jsxs("div", { className: "print-detail-grid", style: {
9096
10010
  display: "grid",
9097
10011
  gridTemplateColumns: "1fr 1fr",
9098
10012
  gap: "var(--bw-spacing)",
9099
- }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "font-medium text-muted-foreground text-sm print-detail-label", style: {
10013
+ }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9100
10014
  color: "var(--bw-text-muted)",
9101
10015
  fontSize: "var(--bw-font-size-small)",
9102
10016
  fontFamily: "var(--bw-font-family)",
10017
+ fontWeight: 500,
9103
10018
  }, children: "Datum" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9104
10019
  fontWeight: "600",
9105
10020
  color: "var(--bw-text-color)",
9106
10021
  fontFamily: "var(--bw-font-family)",
9107
10022
  fontSize: "var(--bw-font-size-large)",
9108
10023
  margin: "0 0 6px 0",
9109
- }, children: formatDate12(eventDetails.startTime) })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "font-medium text-muted-foreground text-sm print-detail-label", style: {
10024
+ }, children: formatDate12(eventDetails.startTime) })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9110
10025
  color: "var(--bw-text-muted)",
9111
10026
  fontSize: "var(--bw-font-size-small)",
9112
10027
  fontFamily: "var(--bw-font-family)",
10028
+ fontWeight: 500,
9113
10029
  }, children: "Zeit" }), jsxRuntime.jsxs("p", { className: "print-detail-value", style: {
9114
10030
  fontWeight: "600",
9115
10031
  color: "var(--bw-text-color)",
@@ -9127,13 +10043,13 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9127
10043
  color: "var(--bw-text-color)",
9128
10044
  margin: "0",
9129
10045
  fontFamily: "var(--bw-font-family)",
9130
- }, children: ["Teilnehmer (", formData.participants.length, ")"] }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsxs("div", { className: "print-section-title", children: ["Teilnehmer (", formData.participants.length, ")"] }) }), jsxRuntime.jsx("div", { className: "print-only:p-0", children: jsxRuntime.jsx("div", { className: "space-y-3 print-only:space-y-1", style: {
10046
+ }, children: ["Teilnehmer (", formData.participants.length, ")"] }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsxs("div", { className: "print-section-title", children: ["Teilnehmer (", formData.participants.length, ")"] }) }), jsxRuntime.jsx("div", { children: jsxRuntime.jsx("div", { style: {
9131
10047
  display: "flex",
9132
10048
  flexDirection: "column",
9133
10049
  gap: "var(--bw-spacing-small)",
9134
10050
  }, children: formData.participants
9135
10051
  .filter((p) => p.name.trim())
9136
- .map((participant, index) => (jsxRuntime.jsx("div", { className: "flex justify-between items-center bg-muted p-3 rounded-lg print-participant", style: {
10052
+ .map((participant, index) => (jsxRuntime.jsx("div", { className: "print-participant", style: {
9137
10053
  display: "flex",
9138
10054
  justifyContent: "space-between",
9139
10055
  alignItems: "center",
@@ -9143,7 +10059,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9143
10059
  }, children: jsxRuntime.jsxs("div", { className: "print-participant-info", children: [jsxRuntime.jsx("div", { className: "print-participant-name", style: {
9144
10060
  color: "var(--bw-text-color)",
9145
10061
  fontFamily: "var(--bw-font-family)",
9146
- }, children: participant.name }), participant.age && (jsxRuntime.jsxs("div", { className: "text-muted-foreground text-sm print-participant-age", style: {
10062
+ }, children: participant.name }), participant.age && (jsxRuntime.jsxs("div", { className: "print-participant-age", style: {
9147
10063
  color: "var(--bw-text-muted)",
9148
10064
  fontSize: "var(--bw-font-size-small)",
9149
10065
  fontFamily: "var(--bw-font-family)",
@@ -9159,7 +10075,14 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9159
10075
  color: "var(--bw-text-color)",
9160
10076
  margin: "0",
9161
10077
  fontFamily: "var(--bw-font-family)",
9162
- }, children: "Zahlungs\u00FCbersicht" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Zahlungs\u00FCbersicht" }) }), jsxRuntime.jsxs("div", { className: "space-y-2 print-only:p-0 print-only:space-y-1", children: [jsxRuntime.jsxs("div", { className: "print-payment-summary print-only", children: [jsxRuntime.jsxs("div", { className: "print-payment-row", children: [jsxRuntime.jsx("span", { children: "Gesamtbetrag" }), jsxRuntime.jsx("span", { children: formatCurrency(booking.total) })] }), jsxRuntime.jsxs("div", { className: "print-payment-row", children: [jsxRuntime.jsx("span", { children: "Bezahlt" }), jsxRuntime.jsx("span", { children: formatCurrency(booking.total) })] })] }), jsxRuntime.jsxs("div", { className: "print-hidden space-y-2", style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: "Gesamtbetrag" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(booking.total) })] }), jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: "Bezahlt" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(booking.total) })] })] })] })] }), jsxRuntime.jsxs("div", { className: "print-booking-card", style: {
10078
+ }, children: "Zahlungs\u00FCbersicht" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Zahlungs\u00FCbersicht" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [jsxRuntime.jsxs("div", { className: "print-hidden", style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsxs("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), ")"] }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(eventDetails.price * booking.participantCount) })] }), bookingData.purchases && bookingData.purchases.length > 0 && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: bookingData.purchases.map((purchase) => (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsxs("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)", fontSize: "var(--bw-font-size-small)" }, children: [purchase.product?.name || "Produkt", " (", purchase.quantity, "x ", formatCurrency(purchase.unitPrice), ")"] }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formatCurrency(purchase.totalPrice) })] }, purchase.id))) })), jsxRuntime.jsxs("div", { style: {
10079
+ display: "flex",
10080
+ justifyContent: "space-between",
10081
+ alignItems: "center",
10082
+ borderTop: "1px solid var(--bw-border-color)",
10083
+ paddingTop: "var(--bw-spacing-small)",
10084
+ marginTop: "var(--bw-spacing-small)"
10085
+ }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)", fontWeight: "600" }, children: "Gesamtbetrag" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)", fontWeight: "700" }, children: formatCurrency(bookingData.order.total) })] })] }), jsxRuntime.jsx("div", { className: "print-payment-summary print-only", children: jsxRuntime.jsxs("div", { className: "print-payment-row", children: [jsxRuntime.jsx("span", { children: "Gesamtbetrag" }), jsxRuntime.jsx("span", { children: formatCurrency(bookingData.order.total) })] }) })] })] }), jsxRuntime.jsxs("div", { className: "print-booking-card", style: {
9163
10086
  backgroundColor: "var(--bw-surface-color)",
9164
10087
  border: `1px solid var(--bw-border-color)`,
9165
10088
  borderRadius: "var(--bw-border-radius)",
@@ -9171,7 +10094,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9171
10094
  color: "var(--bw-text-color)",
9172
10095
  margin: "0",
9173
10096
  fontFamily: "var(--bw-font-family)",
9174
- }, children: "Kontaktdaten" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Kontaktdaten" }) }), jsxRuntime.jsxs("div", { className: "space-y-2 print-only:p-0 print-only:space-y-1", style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Name:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerName })] }), jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "E-Mail:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerEmail })] }), formData.customerPhone && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Telefon:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerPhone })] }))] })] }), jsxRuntime.jsx("div", { className: "print-booking-card", style: {
10097
+ }, children: "Kontaktdaten" }) }), jsxRuntime.jsx("div", { className: "print-only", children: jsxRuntime.jsx("div", { className: "print-section-title", children: "Kontaktdaten" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "var(--bw-spacing-small)" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Name:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerName })] }), jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "E-Mail:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerEmail })] }), formData.customerPhone && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Telefon:" }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: formData.customerPhone })] }))] })] }), jsxRuntime.jsx("div", { className: "print-booking-card", style: {
9175
10098
  backgroundColor: "var(--bw-surface-color)",
9176
10099
  border: `1px solid var(--bw-border-color)`,
9177
10100
  borderRadius: "var(--bw-border-radius)",
@@ -9258,9 +10181,51 @@ function EventTypeDetailsDialog({ isOpen, onClose, eventType, onEventTypeSelect,
9258
10181
  onEventTypeSelect(eventType);
9259
10182
  onClose();
9260
10183
  };
9261
- return (jsxRuntime.jsx(DialogWrapper, { isOpen: isOpen, onClose: onClose, maxWidth: "700px", children: jsxRuntime.jsxs("div", { className: "p-6", children: [jsxRuntime.jsxs("div", { className: "mb-6 p-4 bg-background rounded border border-solid border-border", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "text-sm font-semibold text-highlight mb-2 font-sans", children: eventType.category.name }), jsxRuntime.jsx("h2", { className: "text-[28px] font-bold text-text-primary mb-4 leading-tight font-sans m-0", children: eventType.name })] }), eventType.highlights && eventType.highlights.length > 0 && (jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: jsxRuntime.jsx("div", { className: "mb-6", children: jsxRuntime.jsx("ul", { className: "list-none p-0 m-0 flex flex-col gap-0.5", children: eventType.highlights
10184
+ return (jsxRuntime.jsx(DialogWrapper, { isOpen: isOpen, onClose: onClose, maxWidth: "700px", children: jsxRuntime.jsxs("div", { style: { padding: "24px" }, children: [jsxRuntime.jsxs("div", { style: {
10185
+ marginBottom: "24px",
10186
+ padding: "16px",
10187
+ backgroundColor: "var(--bw-background-color)",
10188
+ borderRadius: "var(--bw-border-radius)",
10189
+ border: "1px solid var(--bw-border-color)",
10190
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { style: {
10191
+ fontSize: "14px",
10192
+ fontWeight: 600,
10193
+ color: "var(--bw-highlight-color)",
10194
+ marginBottom: "8px",
10195
+ fontFamily: "var(--bw-font-family)",
10196
+ }, children: eventType.category.name }), jsxRuntime.jsx("h2", { style: {
10197
+ fontSize: "28px",
10198
+ fontWeight: 700,
10199
+ color: "var(--bw-text-color)",
10200
+ marginBottom: "16px",
10201
+ lineHeight: 1.25,
10202
+ fontFamily: "var(--bw-font-family)",
10203
+ margin: "0 0 16px 0",
10204
+ }, children: eventType.name })] }), eventType.highlights && eventType.highlights.length > 0 && (jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: jsxRuntime.jsx("div", { style: { marginBottom: "24px" }, children: jsxRuntime.jsx("ul", { style: {
10205
+ listStyle: "none",
10206
+ padding: 0,
10207
+ margin: 0,
10208
+ display: "flex",
10209
+ flexDirection: "column",
10210
+ gap: "2px",
10211
+ }, children: eventType.highlights
9262
10212
  .filter((highlight) => highlight.trim())
9263
- .map((highlight, index) => (jsxRuntime.jsxs("li", { className: "flex items-start gap-2.5 font-sans text-base leading-relaxed text-text-primary", children: [jsxRuntime.jsx("div", { className: "mt-1 shrink-0", children: jsxRuntime.jsx(IconCheck, { size: 16, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { children: highlight.trim() })] }, index))) }) }) }))] }), eventType.description && (jsxRuntime.jsxs("div", { className: "mb-6 text-text-muted text-base leading-relaxed font-sans px-5", children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: {
10213
+ .map((highlight, index) => (jsxRuntime.jsxs("li", { style: {
10214
+ display: "flex",
10215
+ alignItems: "flex-start",
10216
+ gap: "10px",
10217
+ fontFamily: "var(--bw-font-family)",
10218
+ fontSize: "16px",
10219
+ lineHeight: 1.625,
10220
+ color: "var(--bw-text-color)",
10221
+ }, children: [jsxRuntime.jsx("div", { style: { marginTop: "4px", flexShrink: 0 }, children: jsxRuntime.jsx(IconCheck, { size: 16, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { children: highlight.trim() })] }, index))) }) }) }))] }), eventType.description && (jsxRuntime.jsxs("div", { style: {
10222
+ marginBottom: "24px",
10223
+ color: "var(--bw-text-muted)",
10224
+ fontSize: "16px",
10225
+ lineHeight: 1.625,
10226
+ fontFamily: "var(--bw-font-family)",
10227
+ padding: "0 20px",
10228
+ }, children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: {
9264
10229
  __html: `
9265
10230
  .markdown-content p {
9266
10231
  margin: 0 0 12px 0 !important;
@@ -9332,11 +10297,76 @@ function EventTypeDetailsDialog({ isOpen, onClose, eventType, onEventTypeSelect,
9332
10297
  text-decoration: none !important;
9333
10298
  }
9334
10299
  `,
9335
- } }), jsxRuntime.jsx("div", { className: "markdown-content", children: Markdown({ children: preprocessMarkdown$1(eventType.description) }) })] })), jsxRuntime.jsxs("div", { className: "flex justify-between items-center mt-8 p-5 bg-background rounded border border-solid border-border", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "font-bold text-text-primary font-sans text-left", children: eventType.groupedDurations && jsxRuntime.jsx("span", { children: eventType.groupedDurations }) }), jsxRuntime.jsx("div", { className: "text-[clamp(1.72rem,4vw,32px)] font-bold text-text-primary font-sans text-right", children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), isAvailable && (jsxRuntime.jsxs("button", { onClick: handleBookingClick, className: "bg-highlight text-white px-7 py-3.5 border-0 rounded text-base font-semibold font-sans flex items-center gap-2 cursor-pointer transition-all duration-200 hover:opacity-90 hover:-translate-y-0.5", children: [jsxRuntime.jsx(IconWave, { size: 20, color: "white" }), "Jetzt buchen"] }))] }), !isAvailable && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center rounded", children: jsxRuntime.jsx("div", { className: "bg-white/90 px-8 py-4 rounded text-text-primary font-semibold text-lg font-sans shadow-md", children: "Ausgebucht" }) }))] }) }));
10300
+ } }), jsxRuntime.jsx("div", { className: "markdown-content", children: Markdown({ children: preprocessMarkdown$1(eventType.description) }) })] })), jsxRuntime.jsxs("div", { style: {
10301
+ display: "flex",
10302
+ justifyContent: "space-between",
10303
+ alignItems: "center",
10304
+ marginTop: "32px",
10305
+ padding: "20px",
10306
+ backgroundColor: "var(--bw-background-color)",
10307
+ borderRadius: "var(--bw-border-radius)",
10308
+ border: "1px solid var(--bw-border-color)",
10309
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { style: {
10310
+ fontWeight: 700,
10311
+ color: "var(--bw-text-color)",
10312
+ fontFamily: "var(--bw-font-family)",
10313
+ textAlign: "left",
10314
+ }, children: eventType.groupedDurations && jsxRuntime.jsx("span", { children: eventType.groupedDurations }) }), jsxRuntime.jsx("div", { style: {
10315
+ fontSize: "clamp(1.72rem, 4vw, 32px)",
10316
+ fontWeight: 700,
10317
+ color: "var(--bw-text-color)",
10318
+ fontFamily: "var(--bw-font-family)",
10319
+ textAlign: "right",
10320
+ }, children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), isAvailable && (jsxRuntime.jsxs("button", { onClick: handleBookingClick, style: {
10321
+ backgroundColor: "var(--bw-highlight-color)",
10322
+ color: "#ffffff",
10323
+ padding: "14px 28px",
10324
+ border: "none",
10325
+ borderRadius: "var(--bw-border-radius)",
10326
+ fontSize: "16px",
10327
+ fontWeight: 600,
10328
+ fontFamily: "var(--bw-font-family)",
10329
+ display: "flex",
10330
+ alignItems: "center",
10331
+ gap: "8px",
10332
+ cursor: "pointer",
10333
+ transition: "all 0.2s ease",
10334
+ }, children: [jsxRuntime.jsx(IconWave, { size: 20, color: "white" }), "Jetzt buchen"] }))] }), !isAvailable && (jsxRuntime.jsx("div", { style: {
10335
+ position: "absolute",
10336
+ inset: 0,
10337
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
10338
+ backdropFilter: "blur(4px)",
10339
+ display: "flex",
10340
+ alignItems: "center",
10341
+ justifyContent: "center",
10342
+ borderRadius: "var(--bw-border-radius)",
10343
+ }, children: jsxRuntime.jsx("div", { style: {
10344
+ backgroundColor: "rgba(255, 255, 255, 0.9)",
10345
+ padding: "16px 32px",
10346
+ borderRadius: "var(--bw-border-radius)",
10347
+ color: "var(--bw-text-color)",
10348
+ fontWeight: 600,
10349
+ fontSize: "18px",
10350
+ fontFamily: "var(--bw-font-family)",
10351
+ boxShadow: "var(--bw-shadow-md)",
10352
+ }, children: "Ausgebucht" }) }))] }) }));
9336
10353
  }
9337
10354
 
9338
10355
  // A placeholder SVG for events without an image.
9339
- const EventImagePlaceholder = () => (jsxRuntime.jsx("div", { className: "w-full h-full bg-gradient-to-br from-highlight/20 to-highlight flex items-center justify-center overflow-hidden relative", children: jsxRuntime.jsxs("svg", { width: "60%", height: "60%", viewBox: "0 0 120 40", preserveAspectRatio: "xMidYMid meet", className: "absolute opacity-[0.18] blur-[0.5px]", children: [jsxRuntime.jsx("path", { d: "M0 30 Q 15 10, 30 30 T 60 30 T 90 30 T 120 30", stroke: "white", strokeWidth: "4", fill: "none", strokeLinecap: "round" }), jsxRuntime.jsx("circle", { cx: "20", cy: "25", r: "3", fill: "white", opacity: "0.7" }), jsxRuntime.jsx("circle", { cx: "100", cy: "28", r: "2", fill: "white", opacity: "0.5" })] }) }));
10356
+ const EventImagePlaceholder = () => (jsxRuntime.jsx("div", { style: {
10357
+ width: "100%",
10358
+ height: "100%",
10359
+ background: "linear-gradient(to bottom right, rgba(var(--bw-highlight-color-rgb), 0.2), var(--bw-highlight-color))",
10360
+ display: "flex",
10361
+ alignItems: "center",
10362
+ justifyContent: "center",
10363
+ overflow: "hidden",
10364
+ position: "relative",
10365
+ }, children: jsxRuntime.jsxs("svg", { width: "60%", height: "60%", viewBox: "0 0 120 40", preserveAspectRatio: "xMidYMid meet", style: {
10366
+ position: "absolute",
10367
+ opacity: 0.18,
10368
+ filter: "blur(0.5px)",
10369
+ }, children: [jsxRuntime.jsx("path", { d: "M0 30 Q 15 10, 30 30 T 60 30 T 90 30 T 120 30", stroke: "white", strokeWidth: "4", fill: "none", strokeLinecap: "round" }), jsxRuntime.jsx("circle", { cx: "20", cy: "25", r: "3", fill: "white", opacity: "0.7" }), jsxRuntime.jsx("circle", { cx: "100", cy: "28", r: "2", fill: "white", opacity: "0.5" })] }) }));
9340
10370
  // Image Carousel Component with smooth slide animations
9341
10371
  const ImageCarousel = ({ images, eventName }) => {
9342
10372
  const [currentIndex, setCurrentIndex] = React__default.useState(0);
@@ -9368,16 +10398,92 @@ const ImageCarousel = ({ images, eventName }) => {
9368
10398
  if (images.length === 0) {
9369
10399
  return jsxRuntime.jsx(EventImagePlaceholder, {});
9370
10400
  }
9371
- return (jsxRuntime.jsxs("div", { className: "relative w-full h-full overflow-hidden rounded-[inherit]", children: [jsxRuntime.jsx("div", { className: "flex h-full transition-transform duration-400 ease-[cubic-bezier(0.4,0,0.2,1)]", style: {
10401
+ return (jsxRuntime.jsxs("div", { style: {
10402
+ position: "relative",
10403
+ width: "100%",
10404
+ height: "100%",
10405
+ overflow: "hidden",
10406
+ borderRadius: "inherit",
10407
+ }, children: [jsxRuntime.jsx("div", { style: {
10408
+ display: "flex",
10409
+ height: "100%",
10410
+ transition: "transform 0.4s cubic-bezier(0.4, 0, 0.2, 1)",
9372
10411
  width: `${images.length * 100}%`,
9373
10412
  transform: `translateX(-${(currentIndex * 100) / images.length}%)`,
9374
- }, children: images.map((image, index) => (jsxRuntime.jsx("div", { className: "h-full shrink-0 overflow-hidden relative rounded-[inherit]", style: { width: `${100 / images.length}%` }, children: jsxRuntime.jsx("img", { src: image, alt: `${eventName} - Bild ${index + 1}`, className: "w-full h-full object-cover block absolute top-0 left-0 rounded-[inherit]" }) }, index))) }), images.length > 1 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { onClick: prevImage, disabled: isTransitioning, className: `absolute left-3 top-1/2 -translate-y-1/2 bg-black/50 border-0 rounded-full w-10 h-10 flex items-center justify-center transition-all duration-200 z-[2] ${isTransitioning
9375
- ? "cursor-not-allowed opacity-50"
9376
- : "cursor-pointer hover:bg-black/70 hover:scale-110"}`, children: jsxRuntime.jsx(IconChevronLeft, { size: 20, color: "white" }) }), jsxRuntime.jsx("button", { onClick: nextImage, disabled: isTransitioning, className: `absolute right-3 top-1/2 -translate-y-1/2 bg-black/50 border-0 rounded-full w-10 h-10 flex items-center justify-center transition-all duration-200 z-[2] ${isTransitioning
9377
- ? "cursor-not-allowed opacity-50"
9378
- : "cursor-pointer hover:bg-black/70 hover:scale-110"}`, children: jsxRuntime.jsx(IconChevronRight, { size: 20, color: "white" }) })] })), images.length > 1 && (jsxRuntime.jsx("div", { className: "absolute bottom-3 left-1/2 -translate-x-1/2 flex gap-2 z-[2]", children: images.map((_, index) => (jsxRuntime.jsx("button", { onClick: (e) => goToImage(index, e), disabled: isTransitioning, className: `h-2 border-0 rounded transition-all duration-300 ${isTransitioning ? "cursor-not-allowed opacity-70" : "cursor-pointer"} ${index === currentIndex
9379
- ? "w-4 bg-white"
9380
- : "w-2 bg-white/50 hover:bg-white/80 hover:scale-125"}` }, index))) })), isTransitioning && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/10 z-[1] pointer-events-none" }))] }));
10413
+ }, children: images.map((image, index) => (jsxRuntime.jsx("div", { style: {
10414
+ height: "100%",
10415
+ flexShrink: 0,
10416
+ overflow: "hidden",
10417
+ position: "relative",
10418
+ borderRadius: "inherit",
10419
+ width: `${100 / images.length}%`,
10420
+ }, children: jsxRuntime.jsx("img", { src: image, alt: `${eventName} - Bild ${index + 1}`, style: {
10421
+ width: "100%",
10422
+ height: "100%",
10423
+ objectFit: "cover",
10424
+ display: "block",
10425
+ position: "absolute",
10426
+ top: 0,
10427
+ left: 0,
10428
+ borderRadius: "inherit",
10429
+ } }) }, index))) }), images.length > 1 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { onClick: prevImage, disabled: isTransitioning, style: {
10430
+ position: "absolute",
10431
+ left: "12px",
10432
+ top: "50%",
10433
+ transform: "translateY(-50%)",
10434
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
10435
+ border: "none",
10436
+ borderRadius: "50%",
10437
+ width: "40px",
10438
+ height: "40px",
10439
+ display: "flex",
10440
+ alignItems: "center",
10441
+ justifyContent: "center",
10442
+ transition: "all 0.2s ease",
10443
+ zIndex: 2,
10444
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10445
+ opacity: isTransitioning ? 0.5 : 1,
10446
+ }, children: jsxRuntime.jsx(IconChevronLeft, { size: 20, color: "white" }) }), jsxRuntime.jsx("button", { onClick: nextImage, disabled: isTransitioning, style: {
10447
+ position: "absolute",
10448
+ right: "12px",
10449
+ top: "50%",
10450
+ transform: "translateY(-50%)",
10451
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
10452
+ border: "none",
10453
+ borderRadius: "50%",
10454
+ width: "40px",
10455
+ height: "40px",
10456
+ display: "flex",
10457
+ alignItems: "center",
10458
+ justifyContent: "center",
10459
+ transition: "all 0.2s ease",
10460
+ zIndex: 2,
10461
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10462
+ opacity: isTransitioning ? 0.5 : 1,
10463
+ }, children: jsxRuntime.jsx(IconChevronRight, { size: 20, color: "white" }) })] })), images.length > 1 && (jsxRuntime.jsx("div", { style: {
10464
+ position: "absolute",
10465
+ bottom: "12px",
10466
+ left: "50%",
10467
+ transform: "translateX(-50%)",
10468
+ display: "flex",
10469
+ gap: "8px",
10470
+ zIndex: 2,
10471
+ }, children: images.map((_, index) => (jsxRuntime.jsx("button", { onClick: (e) => goToImage(index, e), disabled: isTransitioning, style: {
10472
+ height: "8px",
10473
+ border: "none",
10474
+ borderRadius: "var(--bw-border-radius)",
10475
+ transition: "all 0.3s ease",
10476
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10477
+ opacity: isTransitioning ? 0.7 : 1,
10478
+ width: index === currentIndex ? "16px" : "8px",
10479
+ backgroundColor: index === currentIndex ? "#ffffff" : "rgba(255, 255, 255, 0.5)",
10480
+ } }, index))) })), isTransitioning && (jsxRuntime.jsx("div", { style: {
10481
+ position: "absolute",
10482
+ inset: 0,
10483
+ backgroundColor: "rgba(0, 0, 0, 0.1)",
10484
+ zIndex: 1,
10485
+ pointerEvents: "none",
10486
+ } }))] }));
9381
10487
  };
9382
10488
 
9383
10489
  // Helper function to preprocess markdown for underline support
@@ -9526,37 +10632,247 @@ function EventTypeSelection({ eventTypes, onEventTypeSelect, isLoading = false,
9526
10632
  text-decoration: underline;
9527
10633
  }
9528
10634
  `,
9529
- } }), eventTypes.length === 0 ? (jsxRuntime.jsx("div", { className: "max-w-[600px] mx-auto p-6", children: jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-border rounded p-6 text-center font-sans min-h-[400px] flex flex-col items-center justify-center", children: [jsxRuntime.jsx("div", { className: "w-16 h-16 bg-highlight rounded-full mx-auto mb-4 flex items-center justify-center text-[32px] text-white opacity-80", children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { className: "text-xl font-semibold text-text-primary m-0 mb-2 font-sans", children: "Keine Veranstaltungen verf\u00FCgbar" }), jsxRuntime.jsx("p", { className: "text-text-muted text-base leading-relaxed m-0 mb-6 font-sans max-w-[400px]", children: "Derzeit sind keine Veranstaltungen in dieser Kategorie verf\u00FCgbar. Bitte schaue sp\u00E4ter noch einmal vorbei oder kontaktiere uns direkt." }), jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), className: "bg-surface text-highlight px-6 py-3 border border-solid border-highlight rounded text-base font-semibold cursor-pointer font-sans transition-all duration-200 flex items-center gap-2 hover:bg-highlight hover:text-white hover:-translate-y-0.5", children: [jsxRuntime.jsx("span", { className: "text-base", children: "\uD83D\uDD04" }), "Seite neu laden"] })] }) })) : (jsxRuntime.jsx("div", { className: "event-type-list p-0", children: jsxRuntime.jsx("div", { className: "grid grid-cols-[repeat(auto-fill,minmax(350px,1fr))] gap-6 auto-rows-fr", children: eventTypes.map((eventType) => {
10635
+ } }), eventTypes.length === 0 ? (jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
10636
+ backgroundColor: "var(--bw-surface-color)",
10637
+ border: "1px solid var(--bw-border-color)",
10638
+ borderRadius: "var(--bw-border-radius)",
10639
+ padding: "24px",
10640
+ textAlign: "center",
10641
+ fontFamily: "var(--bw-font-family)",
10642
+ minHeight: "400px",
10643
+ display: "flex",
10644
+ flexDirection: "column",
10645
+ alignItems: "center",
10646
+ justifyContent: "center",
10647
+ }, children: [jsxRuntime.jsx("div", { style: {
10648
+ width: "64px",
10649
+ height: "64px",
10650
+ backgroundColor: "var(--bw-highlight-color)",
10651
+ borderRadius: "50%",
10652
+ margin: "0 auto 16px auto",
10653
+ display: "flex",
10654
+ alignItems: "center",
10655
+ justifyContent: "center",
10656
+ fontSize: "32px",
10657
+ color: "#ffffff",
10658
+ opacity: 0.8,
10659
+ }, children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { style: {
10660
+ fontSize: "20px",
10661
+ fontWeight: 600,
10662
+ color: "var(--bw-text-color)",
10663
+ margin: "0 0 8px 0",
10664
+ fontFamily: "var(--bw-font-family)",
10665
+ }, children: "Keine Veranstaltungen verf\u00FCgbar" }), jsxRuntime.jsx("p", { style: {
10666
+ color: "var(--bw-text-muted)",
10667
+ fontSize: "16px",
10668
+ lineHeight: 1.6,
10669
+ margin: "0 0 24px 0",
10670
+ fontFamily: "var(--bw-font-family)",
10671
+ maxWidth: "400px",
10672
+ }, children: "Derzeit sind keine Veranstaltungen in dieser Kategorie verf\u00FCgbar. Bitte schaue sp\u00E4ter noch einmal vorbei oder kontaktiere uns direkt." }), jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), style: {
10673
+ backgroundColor: "var(--bw-surface-color)",
10674
+ color: "var(--bw-highlight-color)",
10675
+ padding: "12px 24px",
10676
+ border: "1px solid var(--bw-highlight-color)",
10677
+ borderRadius: "var(--bw-border-radius)",
10678
+ fontSize: "16px",
10679
+ fontWeight: 600,
10680
+ cursor: "pointer",
10681
+ fontFamily: "var(--bw-font-family)",
10682
+ transition: "all 0.2s ease",
10683
+ display: "flex",
10684
+ alignItems: "center",
10685
+ gap: "8px",
10686
+ }, children: [jsxRuntime.jsx("span", { style: { fontSize: "16px" }, children: "\uD83D\uDD04" }), "Seite neu laden"] })] }) })) : (jsxRuntime.jsx("div", { className: "event-type-list", style: { padding: 0 }, children: jsxRuntime.jsx("div", { style: {
10687
+ display: "grid",
10688
+ gridTemplateColumns: "repeat(auto-fill, minmax(350px, 1fr))",
10689
+ gap: "24px",
10690
+ gridAutoRows: "1fr",
10691
+ }, children: eventTypes.map((eventType) => {
9530
10692
  const isAvailable = eventType.hasAvailableInstances;
9531
- return (jsxRuntime.jsxs("div", { className: `event-type-card relative bg-surface border border-solid border-border rounded overflow-hidden transition-all duration-300 shadow-md font-sans ${isAvailable
9532
- ? "cursor-pointer opacity-100 hover:shadow-lg"
9533
- : "cursor-not-allowed opacity-60"}`, onClick: () => isAvailable && onEventTypeSelect(eventType), children: [jsxRuntime.jsx("div", { className: "absolute top-4 right-4 z-10", children: jsxRuntime.jsx("div", { className: `px-2 py-1 rounded-sm text-xs font-semibold text-white font-sans ${isAvailable ? "bg-success" : "bg-error"}`, children: isAvailable ? "freie Plätze" : "Ausgebucht" }) }), jsxRuntime.jsx("div", { className: "absolute top-4 left-4 z-10", children: jsxRuntime.jsx("div", { className: "text-[13px] text-surface font-semibold bg-highlight px-2 py-0.5 rounded font-sans", children: eventType.category.name }) }), jsxRuntime.jsx("div", { className: "event-type-img relative w-full h-[300px]", children: jsxRuntime.jsx(ImageCarousel, { images: eventType.images, eventName: eventType.name }) }), jsxRuntime.jsxs("div", { className: "event-type-content p-3 px-[18px] flex flex-col justify-between h-[400px]", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { className: "event-type-title text-[clamp(1.1rem,2.5vw,24px)] font-bold text-text-primary leading-tight font-sans m-0 mb-3", children: eventType.name }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [jsxRuntime.jsx(IconCalendar, { size: 17, color: "var(--bw-text-color)" }), jsxRuntime.jsx("span", { className: "font-sans text-sm text-text-muted", children: eventType.nextAvailableDate
10693
+ return (jsxRuntime.jsxs("div", { className: "event-type-card", style: {
10694
+ position: "relative",
10695
+ backgroundColor: "var(--bw-surface-color)",
10696
+ border: "1px solid var(--bw-border-color)",
10697
+ borderRadius: "var(--bw-border-radius)",
10698
+ overflow: "hidden",
10699
+ transition: "all 0.3s ease",
10700
+ boxShadow: "var(--bw-shadow-md)",
10701
+ fontFamily: "var(--bw-font-family)",
10702
+ cursor: isAvailable ? "pointer" : "not-allowed",
10703
+ opacity: isAvailable ? 1 : 0.6,
10704
+ }, onClick: () => isAvailable && onEventTypeSelect(eventType), children: [jsxRuntime.jsx("div", { style: { position: "absolute", top: "16px", right: "16px", zIndex: 10 }, children: jsxRuntime.jsx("div", { style: {
10705
+ padding: "4px 8px",
10706
+ borderRadius: "var(--bw-border-radius-small)",
10707
+ fontSize: "12px",
10708
+ fontWeight: 600,
10709
+ color: "#ffffff",
10710
+ fontFamily: "var(--bw-font-family)",
10711
+ backgroundColor: isAvailable
10712
+ ? "var(--bw-success-color)"
10713
+ : "var(--bw-error-color)",
10714
+ }, children: isAvailable ? "freie Plätze" : "Ausgebucht" }) }), jsxRuntime.jsx("div", { style: { position: "absolute", top: "16px", left: "16px", zIndex: 10 }, children: jsxRuntime.jsx("div", { style: {
10715
+ fontSize: "13px",
10716
+ color: "var(--bw-surface-color)",
10717
+ fontWeight: 600,
10718
+ backgroundColor: "var(--bw-highlight-color)",
10719
+ padding: "2px 8px",
10720
+ borderRadius: "var(--bw-border-radius)",
10721
+ fontFamily: "var(--bw-font-family)",
10722
+ }, children: eventType.category.name }) }), jsxRuntime.jsx("div", { className: "event-type-img", style: { position: "relative", width: "100%", height: "300px" }, children: jsxRuntime.jsx(ImageCarousel, { images: eventType.images, eventName: eventType.name }) }), jsxRuntime.jsxs("div", { className: "event-type-content", style: {
10723
+ padding: "12px 18px",
10724
+ display: "flex",
10725
+ flexDirection: "column",
10726
+ justifyContent: "space-between",
10727
+ height: "400px",
10728
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { className: "event-type-title", style: {
10729
+ fontSize: "clamp(1.1rem, 2.5vw, 24px)",
10730
+ fontWeight: 700,
10731
+ color: "var(--bw-text-color)",
10732
+ lineHeight: 1.25,
10733
+ fontFamily: "var(--bw-font-family)",
10734
+ margin: "0 0 12px 0",
10735
+ }, children: eventType.name }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [jsxRuntime.jsx(IconCalendar, { size: 17, color: "var(--bw-text-color)" }), jsxRuntime.jsx("span", { style: {
10736
+ fontFamily: "var(--bw-font-family)",
10737
+ fontSize: "14px",
10738
+ color: "var(--bw-text-muted)",
10739
+ }, children: eventType.nextAvailableDate
9534
10740
  ? `Freie Plätze ab ${formatDate(eventType.nextAvailableDate)}`
9535
- : "Keine Termine frei" })] }), jsxRuntime.jsx("div", { className: "cursor-pointer", onClick: (e) => {
10741
+ : "Keine Termine frei" })] }), jsxRuntime.jsx("div", { style: { cursor: "pointer" }, onClick: (e) => {
9536
10742
  e.stopPropagation();
9537
10743
  handleShowDetails(eventType);
9538
10744
  }, children: eventType.highlights && eventType.highlights.length > 0 ? (
9539
10745
  // Show highlights as list
9540
- jsxRuntime.jsx("div", { className: "event-type-highlights my-2.5 min-h-[128px] text-[clamp(0.95rem,2vw,16px)]", children: jsxRuntime.jsx("ul", { className: "list-none p-0 m-0 flex-col gap-0.5 relative max-h-[128px]", style: {
9541
- display: "-webkit-box",
9542
- WebkitLineClamp: 5,
9543
- WebkitBoxOrient: "vertical",
10746
+ jsxRuntime.jsx("div", { className: "event-type-highlights", style: {
10747
+ margin: "10px 0",
10748
+ minHeight: "128px",
10749
+ fontSize: "clamp(0.95rem, 2vw, 16px)",
10750
+ }, children: jsxRuntime.jsx("ul", { style: {
10751
+ listStyle: "none",
10752
+ padding: 0,
10753
+ margin: 0,
10754
+ display: "flex",
10755
+ flexDirection: "column",
10756
+ gap: "2px",
10757
+ position: "relative",
10758
+ maxHeight: "128px",
10759
+ overflow: "hidden",
9544
10760
  }, children: eventType.highlights
9545
10761
  .filter((highlight) => highlight.trim())
9546
- .map((highlight, index) => (jsxRuntime.jsxs("li", { className: "flex items-start gap-2 font-sans leading-[1.55] text-text-muted relative max-w-full", children: [jsxRuntime.jsx("div", { className: "mt-1 shrink-0", children: jsxRuntime.jsx(IconCheck, { size: 16, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { className: "text-ellipsis overflow-hidden whitespace-nowrap flex-1", children: highlight.trim() })] }, index))) }) })) : eventType.description ? (jsxRuntime.jsx("div", { className: "event-type-desc text-text-muted text-[clamp(0.95rem,2vw,16px)] leading-relaxed font-sans my-2.5 min-h-[128px] max-h-[128px] overflow-hidden text-left", children: jsxRuntime.jsx("div", { className: "event-type-markdown", style: {
10762
+ .slice(0, 5)
10763
+ .map((highlight, index) => (jsxRuntime.jsxs("li", { style: {
10764
+ display: "flex",
10765
+ alignItems: "flex-start",
10766
+ gap: "8px",
10767
+ fontFamily: "var(--bw-font-family)",
10768
+ lineHeight: 1.55,
10769
+ 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",
10775
+ whiteSpace: "nowrap",
10776
+ flex: 1,
10777
+ }, children: highlight.trim() })] }, index))) }) })) : eventType.description ? (jsxRuntime.jsx("div", { className: "event-type-desc", style: {
10778
+ color: "var(--bw-text-muted)",
10779
+ fontSize: "clamp(0.95rem, 2vw, 16px)",
10780
+ lineHeight: 1.625,
10781
+ fontFamily: "var(--bw-font-family)",
10782
+ margin: "10px 0",
10783
+ minHeight: "128px",
10784
+ maxHeight: "128px",
10785
+ overflow: "hidden",
10786
+ textAlign: "left",
10787
+ }, children: jsxRuntime.jsx("div", { className: "event-type-markdown", style: {
9547
10788
  display: "-webkit-box",
9548
10789
  WebkitLineClamp: 5,
9549
10790
  WebkitBoxOrient: "vertical",
9550
10791
  overflow: "hidden",
9551
10792
  }, children: Markdown({
9552
10793
  children: preprocessMarkdown(eventType.description),
9553
- }) }) })) : (jsxRuntime.jsx("div", { className: "event-type-desc text-text-muted text-[clamp(0.95rem,2vw,16px)] leading-relaxed font-sans my-2.5 min-h-[128px] max-h-[128px] overflow-hidden text-left", children: "\u00A0" })) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "event-type-price font-bold text-text-primary font-sans text-right", children: eventType.groupedDurations.length > 1 ? (jsxRuntime.jsx("span", { children: eventType.groupedDurations })) : (jsxRuntime.jsx("span", { children: eventType.cheapestDurationPerDay % 60 === 0
10794
+ }) }) })) : (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
+ margin: "10px 0",
10800
+ minHeight: "128px",
10801
+ maxHeight: "128px",
10802
+ overflow: "hidden",
10803
+ textAlign: "left",
10804
+ }, children: "\u00A0" })) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "event-type-price", style: {
10805
+ fontWeight: 700,
10806
+ color: "var(--bw-text-color)",
10807
+ fontFamily: "var(--bw-font-family)",
10808
+ textAlign: "right",
10809
+ }, children: eventType.groupedDurations.length > 1 ? (jsxRuntime.jsx("span", { children: eventType.groupedDurations })) : (jsxRuntime.jsx("span", { children: eventType.cheapestDurationPerDay % 60 === 0
9554
10810
  ? `${eventType.cheapestDurationPerDay / 60} Stunde${eventType.cheapestDurationPerDay / 60 > 1 ? "n" : ""}`
9555
- : `${eventType.cheapestDurationPerDay} Minuten` })) }), jsxRuntime.jsx("div", { className: "event-type-price text-[clamp(1.72rem,4vw,32px)] font-bold text-text-primary font-sans text-right", children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), jsxRuntime.jsxs("div", { className: "flex justify-end items-center mt-2.5 gap-3", children: [(eventType.description ||
10811
+ : `${eventType.cheapestDurationPerDay} Minuten` })) }), jsxRuntime.jsx("div", { className: "event-type-price", style: {
10812
+ fontSize: "clamp(1.72rem, 4vw, 32px)",
10813
+ fontWeight: 700,
10814
+ color: "var(--bw-text-color)",
10815
+ fontFamily: "var(--bw-font-family)",
10816
+ textAlign: "right",
10817
+ }, children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), jsxRuntime.jsxs("div", { style: {
10818
+ display: "flex",
10819
+ justifyContent: "flex-end",
10820
+ alignItems: "center",
10821
+ marginTop: "10px",
10822
+ gap: "12px",
10823
+ }, children: [(eventType.description ||
9556
10824
  (eventType.highlights && eventType.highlights.length > 0)) && (jsxRuntime.jsx("button", { onClick: (e) => {
9557
10825
  e.stopPropagation();
9558
10826
  handleShowDetails(eventType);
9559
- }, className: "text-highlight bg-surface px-3 py-3 rounded text-[clamp(0.8rem,2vw,16px)] font-semibold font-sans flex items-center gap-2 border-2 border-solid border-highlight cursor-pointer opacity-60 transition-all duration-200 hover:opacity-100 hover:-translate-y-0.5", children: "Mehr Details" })), isAvailable && (jsxRuntime.jsxs("div", { className: "bg-highlight text-surface px-6 py-3 rounded text-[clamp(1rem,2vw,16px)] font-semibold font-sans flex items-center justify-center text-center gap-2 border-0 cursor-pointer transition-all duration-200 hover:opacity-80 hover:-translate-y-0.5", children: [jsxRuntime.jsx(IconWave, { size: 15, color: "var(--bw-surface-color)" }), " Jetzt buchen"] }))] })] })] }), !isAvailable && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center", children: jsxRuntime.jsx("div", { className: "bg-white/90 px-6 py-3 rounded text-text-primary font-semibold text-base font-sans shadow-md", children: "Ausgebucht" }) }))] }, eventType.id));
10827
+ }, style: {
10828
+ color: "var(--bw-highlight-color)",
10829
+ backgroundColor: "var(--bw-surface-color)",
10830
+ padding: "12px",
10831
+ borderRadius: "var(--bw-border-radius)",
10832
+ fontSize: "clamp(0.8rem, 2vw, 16px)",
10833
+ fontWeight: 600,
10834
+ fontFamily: "var(--bw-font-family)",
10835
+ display: "flex",
10836
+ alignItems: "center",
10837
+ gap: "8px",
10838
+ border: "2px solid var(--bw-highlight-color)",
10839
+ cursor: "pointer",
10840
+ opacity: 0.6,
10841
+ transition: "all 0.2s ease",
10842
+ }, children: "Mehr Details" })), isAvailable && (jsxRuntime.jsxs("div", { style: {
10843
+ backgroundColor: "var(--bw-highlight-color)",
10844
+ color: "var(--bw-surface-color)",
10845
+ padding: "12px 24px",
10846
+ borderRadius: "var(--bw-border-radius)",
10847
+ fontSize: "clamp(1rem, 2vw, 16px)",
10848
+ fontWeight: 600,
10849
+ fontFamily: "var(--bw-font-family)",
10850
+ display: "flex",
10851
+ alignItems: "center",
10852
+ justifyContent: "center",
10853
+ textAlign: "center",
10854
+ gap: "8px",
10855
+ border: "none",
10856
+ cursor: "pointer",
10857
+ transition: "all 0.2s ease",
10858
+ }, children: [jsxRuntime.jsx(IconWave, { size: 15, color: "var(--bw-surface-color)" }), " Jetzt buchen"] }))] })] })] }), !isAvailable && (jsxRuntime.jsx("div", { style: {
10859
+ position: "absolute",
10860
+ inset: 0,
10861
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
10862
+ backdropFilter: "blur(4px)",
10863
+ display: "flex",
10864
+ alignItems: "center",
10865
+ justifyContent: "center",
10866
+ }, children: jsxRuntime.jsx("div", { style: {
10867
+ backgroundColor: "rgba(255, 255, 255, 0.9)",
10868
+ padding: "12px 24px",
10869
+ borderRadius: "var(--bw-border-radius)",
10870
+ color: "var(--bw-text-color)",
10871
+ fontWeight: 600,
10872
+ fontSize: "16px",
10873
+ fontFamily: "var(--bw-font-family)",
10874
+ boxShadow: "var(--bw-shadow-md)",
10875
+ }, children: "Ausgebucht" }) }))] }, eventType.id));
9560
10876
  }) }) })), jsxRuntime.jsx(EventTypeDetailsDialog, { isOpen: detailsDialogOpen, onClose: handleCloseDetails, eventType: selectedEventTypeForDetails, onEventTypeSelect: onEventTypeSelect })] }));
9561
10877
  }
9562
10878
 
@@ -9658,7 +10974,19 @@ const getPriceDisplayInfo = (price, yearPrices) => {
9658
10974
  // Allocation Badge Component
9659
10975
  const AllocationBadge = ({ availableSpots, maxParticipants, }) => {
9660
10976
  const badgeInfo = getAllocationBadgeInfo(availableSpots, maxParticipants);
9661
- return (jsxRuntime.jsx("div", { className: "flex mr-auto -mt-6 mb-1 rounded-sm font-sans z-50 whitespace-nowrap w-fit text-[11px] font-bold px-2 py-0.5", style: {
10977
+ return (jsxRuntime.jsx("div", { style: {
10978
+ display: "flex",
10979
+ marginRight: "auto",
10980
+ marginTop: "-24px",
10981
+ marginBottom: "4px",
10982
+ borderRadius: "var(--bw-border-radius-small)",
10983
+ fontFamily: "var(--bw-font-family)",
10984
+ zIndex: 50,
10985
+ whiteSpace: "nowrap",
10986
+ width: "fit-content",
10987
+ fontSize: "11px",
10988
+ fontWeight: 700,
10989
+ padding: "2px 8px",
9662
10990
  backgroundColor: badgeInfo?.backgroundColor || "transparent",
9663
10991
  color: badgeInfo?.textColor || "transparent",
9664
10992
  }, children: badgeInfo?.text || " - " }));
@@ -9666,7 +10994,19 @@ const AllocationBadge = ({ availableSpots, maxParticipants, }) => {
9666
10994
  // Price Badge Component (for special prices)
9667
10995
  const SpecialPriceBadge = ({ price, yearPrices }) => {
9668
10996
  const badgeInfo = getPriceBadgeInfo(price, yearPrices);
9669
- return (jsxRuntime.jsx("div", { className: "flex ml-auto -mt-5 mb-1 rounded-sm font-sans z-50 whitespace-nowrap w-fit text-[11px] font-bold px-2 py-0.5", style: {
10997
+ return (jsxRuntime.jsx("div", { style: {
10998
+ display: "flex",
10999
+ marginLeft: "auto",
11000
+ marginTop: "-20px",
11001
+ marginBottom: "4px",
11002
+ borderRadius: "var(--bw-border-radius-small)",
11003
+ fontFamily: "var(--bw-font-family)",
11004
+ zIndex: 50,
11005
+ whiteSpace: "nowrap",
11006
+ width: "fit-content",
11007
+ fontSize: "11px",
11008
+ fontWeight: 700,
11009
+ padding: "2px 8px",
9670
11010
  backgroundColor: badgeInfo?.backgroundColor || "transparent",
9671
11011
  color: badgeInfo?.textColor || "transparent",
9672
11012
  }, children: badgeInfo?.text || " - " }));
@@ -9674,7 +11014,14 @@ const SpecialPriceBadge = ({ price, yearPrices }) => {
9674
11014
  // Price Display Component (with special price styling)
9675
11015
  const PriceDisplay = ({ price, yearPrices }) => {
9676
11016
  const displayInfo = getPriceDisplayInfo(price, yearPrices);
9677
- return (jsxRuntime.jsx("span", { className: "inline-flex items-center text-base font-semibold px-2 py-0.5 rounded-sm font-sans", style: {
11017
+ return (jsxRuntime.jsx("span", { style: {
11018
+ display: "inline-flex",
11019
+ alignItems: "center",
11020
+ fontSize: "16px",
11021
+ fontWeight: 600,
11022
+ padding: "2px 8px",
11023
+ borderRadius: "var(--bw-border-radius-small)",
11024
+ fontFamily: "var(--bw-font-family)",
9678
11025
  backgroundColor: displayInfo ? displayInfo.backgroundColor : "var(--bw-background-color)",
9679
11026
  color: displayInfo ? displayInfo.textColor : "var(--bw-text-color)",
9680
11027
  border: displayInfo ? "none" : "1px solid var(--bw-border-color)",
@@ -9741,17 +11088,117 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
9741
11088
  onClose();
9742
11089
  onBackToEventTypes();
9743
11090
  };
11091
+ const footerNav = (jsxRuntime.jsx("button", { type: "button", onClick: handleClose, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: "\u2190 Zur\u00FCck" }));
9744
11092
  // Show loading state first if we're loading event instances
9745
11093
  if (isLoadingEventInstances) {
9746
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name} Terminauswahl`, children: jsxRuntime.jsx("div", { className: "p-6", children: jsxRuntime.jsx("div", { className: "flex flex-col gap-5", children: Array.from({ length: 3 }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer bg-surface border border-solid border-border rounded overflow-hidden", children: [jsxRuntime.jsxs("div", { className: "flex justify-between items-center p-4 px-5 cursor-pointer border-b border-solid border-border", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx("div", { className: "w-20 h-5 bg-border rounded-sm" }), jsxRuntime.jsx("div", { className: "w-4 h-4 bg-border rounded-sm" })] }), jsxRuntime.jsx("div", { className: "w-[70px] h-4 bg-highlight opacity-30 rounded-sm" })] }), jsxRuntime.jsx("div", { className: "flex flex-col gap-3 pt-3 p-3 px-5 pb-5", children: Array.from({ length: 2 }).map((_, eventIdx) => (jsxRuntime.jsxs("div", { className: "relative border border-solid border-border bg-surface rounded p-4 px-5 font-sans", children: [jsxRuntime.jsxs("div", { className: "flex justify-between w-full items-start gap-3 mb-1", children: [jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("div", { className: "w-10 h-10 bg-background border border-solid border-border border-t-4 rounded-sm" }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [jsxRuntime.jsx("div", { className: "w-20 h-4 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[60px] h-3.5 bg-border rounded" })] })] }), jsxRuntime.jsx("div", { className: "flex flex-col items-end", children: jsxRuntime.jsx("div", { className: "w-[70px] h-5 bg-highlight opacity-30 rounded" }) })] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [jsxRuntime.jsx("div", { className: "w-[120px] h-4 bg-border rounded" }), jsxRuntime.jsx("div", { className: "w-[50px] h-5 bg-border rounded-lg" })] })] }, eventIdx))) })] }, idx))) }) }) }));
11094
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name} Terminauswahl`, footer: footerNav, children: jsxRuntime.jsx("div", { style: { padding: "24px" }, children: jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "20px" }, children: Array.from({ length: 3 }).map((_, idx) => (jsxRuntime.jsxs("div", { className: "skeleton-shimmer", style: {
11095
+ backgroundColor: "var(--bw-surface-color)",
11096
+ border: "1px solid var(--bw-border-color)",
11097
+ borderRadius: "var(--bw-border-radius)",
11098
+ overflow: "hidden",
11099
+ }, children: [jsxRuntime.jsxs("div", { style: {
11100
+ display: "flex",
11101
+ justifyContent: "space-between",
11102
+ alignItems: "center",
11103
+ padding: "16px 20px",
11104
+ cursor: "pointer",
11105
+ borderBottom: "1px solid var(--bw-border-color)",
11106
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11107
+ width: "80px",
11108
+ height: "20px",
11109
+ backgroundColor: "var(--bw-border-color)",
11110
+ borderRadius: "var(--bw-border-radius-small)",
11111
+ } }), jsxRuntime.jsx("div", { style: {
11112
+ width: "16px",
11113
+ height: "16px",
11114
+ backgroundColor: "var(--bw-border-color)",
11115
+ borderRadius: "var(--bw-border-radius-small)",
11116
+ } })] }), jsxRuntime.jsx("div", { style: {
11117
+ width: "70px",
11118
+ height: "16px",
11119
+ backgroundColor: "var(--bw-highlight-color)",
11120
+ opacity: 0.3,
11121
+ borderRadius: "var(--bw-border-radius-small)",
11122
+ } })] }), jsxRuntime.jsx("div", { style: {
11123
+ display: "flex",
11124
+ flexDirection: "column",
11125
+ gap: "12px",
11126
+ paddingTop: "12px",
11127
+ padding: "12px 20px 20px 20px",
11128
+ }, children: Array.from({ length: 2 }).map((_, eventIdx) => (jsxRuntime.jsxs("div", { style: {
11129
+ position: "relative",
11130
+ border: "1px solid var(--bw-border-color)",
11131
+ backgroundColor: "var(--bw-surface-color)",
11132
+ borderRadius: "var(--bw-border-radius)",
11133
+ padding: "16px 20px",
11134
+ fontFamily: "var(--bw-font-family)",
11135
+ }, children: [jsxRuntime.jsxs("div", { style: {
11136
+ display: "flex",
11137
+ justifyContent: "space-between",
11138
+ width: "100%",
11139
+ alignItems: "flex-start",
11140
+ gap: "12px",
11141
+ marginBottom: "4px",
11142
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11143
+ width: "40px",
11144
+ height: "40px",
11145
+ backgroundColor: "var(--bw-background-color)",
11146
+ border: "1px solid var(--bw-border-color)",
11147
+ borderTopWidth: "4px",
11148
+ borderRadius: "var(--bw-border-radius-small)",
11149
+ } }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [jsxRuntime.jsx("div", { style: {
11150
+ width: "80px",
11151
+ height: "16px",
11152
+ backgroundColor: "var(--bw-border-color)",
11153
+ borderRadius: "var(--bw-border-radius)",
11154
+ } }), jsxRuntime.jsx("div", { style: {
11155
+ width: "60px",
11156
+ height: "14px",
11157
+ backgroundColor: "var(--bw-border-color)",
11158
+ borderRadius: "var(--bw-border-radius)",
11159
+ } })] })] }), jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", alignItems: "flex-end" }, children: jsxRuntime.jsx("div", { style: {
11160
+ width: "70px",
11161
+ height: "20px",
11162
+ backgroundColor: "var(--bw-highlight-color)",
11163
+ opacity: 0.3,
11164
+ borderRadius: "var(--bw-border-radius)",
11165
+ } }) })] }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [jsxRuntime.jsx("div", { style: {
11166
+ width: "120px",
11167
+ height: "16px",
11168
+ backgroundColor: "var(--bw-border-color)",
11169
+ borderRadius: "var(--bw-border-radius)",
11170
+ } }), jsxRuntime.jsx("div", { style: {
11171
+ width: "50px",
11172
+ height: "20px",
11173
+ backgroundColor: "var(--bw-border-color)",
11174
+ borderRadius: "16px",
11175
+ } })] })] }, eventIdx))) })] }, idx))) }) }) }));
9747
11176
  }
9748
11177
  // Show empty state only if not loading and no event instances
9749
11178
  if (eventInstances.length === 0) {
9750
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Keine verf\u00FCgbaren Termine", children: jsxRuntime.jsx("div", { className: "flex items-center justify-center min-h-[400px] text-center p-4", children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h3", { className: "mb-2 font-semibold text-lg text-text-muted font-sans", children: "Keine verf\u00FCgbaren Termine" }), jsxRuntime.jsx("p", { className: "text-text-muted font-sans", children: "F\u00FCr diesen Event-Typ sind derzeit keine Termine verf\u00FCgbar." })] }) }) }));
11179
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Keine verf\u00FCgbaren Termine", footer: footerNav, children: jsxRuntime.jsx("div", { style: {
11180
+ display: "flex",
11181
+ alignItems: "center",
11182
+ justifyContent: "center",
11183
+ minHeight: "400px",
11184
+ textAlign: "center",
11185
+ padding: "16px",
11186
+ }, children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h3", { style: {
11187
+ marginBottom: "8px",
11188
+ fontWeight: 600,
11189
+ fontSize: "18px",
11190
+ color: "var(--bw-text-muted)",
11191
+ fontFamily: "var(--bw-font-family)",
11192
+ }, 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." })] }) }) }));
9751
11193
  }
9752
- return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name}`, children: jsxRuntime.jsx("div", { className: "p-6", children: jsxRuntime.jsx("div", { className: "flex flex-col gap-5", children: monthYearGroups.map(({ key, label, events, minPrice, year }, idx) => {
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) => {
9753
11195
  const monthPriceDisplayInfo = getMonthPriceDisplayInfo(minPrice);
9754
- return (jsxRuntime.jsxs(React__default.Fragment, { children: [idx > 0 && monthYearGroups[idx - 1].year !== year && (jsxRuntime.jsx("div", { className: "h-px bg-border my-1" })), jsxRuntime.jsx(Accordion, { title: label, priceInfo: jsxRuntime.jsx("div", { className: "text-base font-medium ml-auto px-2 py-1 rounded-sm", style: {
11196
+ 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
+ fontSize: "16px",
11198
+ fontWeight: 500,
11199
+ marginLeft: "auto",
11200
+ padding: "4px 8px",
11201
+ borderRadius: "var(--bw-border-radius-small)",
9755
11202
  backgroundColor: monthPriceDisplayInfo
9756
11203
  ? monthPriceDisplayInfo.backgroundColor
9757
11204
  : "#14532d",
@@ -9761,21 +11208,95 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
9761
11208
  boxShadow: monthPriceDisplayInfo
9762
11209
  ? "0 2px 4px rgba(0, 0, 0, 0.2)"
9763
11210
  : undefined,
9764
- }, children: `ab ${formatCurrency(minPrice)}` }), isOpen: openGroups.has(key), onToggle: () => toggleGroup(key), children: jsxRuntime.jsx("div", { className: "flex flex-col gap-3 pt-3", children: events.map((event) => {
11211
+ }, children: `ab ${formatCurrency(minPrice)}` }), isOpen: openGroups.has(key), onToggle: () => toggleGroup(key), children: jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "12px", paddingTop: "12px" }, children: events.map((event) => {
9765
11212
  const availableSpots = event.maxParticipants - event.participantCount;
9766
11213
  const isFullyBooked = availableSpots === 0;
9767
11214
  const startDate = new Date(event.startTime);
9768
11215
  const isPastEvent = today.toISOString() >= startDate.toISOString();
9769
11216
  const isDisabled = isFullyBooked || isPastEvent || !event.bookingOpen;
9770
- return (jsxRuntime.jsxs("div", { className: `relative border border-solid border-border bg-surface rounded p-4 px-5 transition-all duration-200 font-sans ${isDisabled
9771
- ? "opacity-30 grayscale-[40%] cursor-not-allowed"
9772
- : "cursor-pointer hover:scale-[1.02] hover:bg-highlight/10"}`, onClick: () => {
11217
+ return (jsxRuntime.jsxs("div", { style: {
11218
+ position: "relative",
11219
+ border: "1px solid var(--bw-border-color)",
11220
+ backgroundColor: "var(--bw-surface-color)",
11221
+ borderRadius: "var(--bw-border-radius)",
11222
+ padding: "16px 20px",
11223
+ transition: "all 0.2s ease",
11224
+ fontFamily: "var(--bw-font-family)",
11225
+ opacity: isDisabled ? 0.3 : 1,
11226
+ filter: isDisabled ? "grayscale(40%)" : "none",
11227
+ cursor: isDisabled ? "not-allowed" : "pointer",
11228
+ }, onClick: () => {
9773
11229
  if (!isDisabled) {
9774
11230
  handleEventInstanceSelect(event);
9775
11231
  }
9776
- }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-slate-900/80 rounded flex items-center justify-center", children: jsxRuntime.jsx("div", { className: "w-8 h-8 text-highlight/80 text-[32px]", children: spinner() }) })), jsxRuntime.jsx(SpecialPriceBadge, { price: event.price, yearPrices: yearPrices }), jsxRuntime.jsx(AllocationBadge, { availableSpots: availableSpots, maxParticipants: event.maxParticipants }), jsxRuntime.jsxs("div", { className: "flex justify-between w-full items-start gap-3 mb-1", children: [jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("div", { className: "text-base transition-all duration-200 rounded-sm border-t-4 border border-solid border-border w-10 h-10 flex items-center justify-center font-bold text-text-primary bg-background", children: startDate.getDate() }), jsxRuntime.jsxs("div", { className: "text-base text-text-primary flex flex-col items-start justify-start leading-tight", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { className: "font-semibold mb-0.5", children: formatWeekday(event.startTime) }), formatWeekday(event.startTime) !==
9777
- formatWeekday(event.endTime) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "text-text-muted text-sm", children: " - " }), jsxRuntime.jsx("span", { className: "font-semibold mb-0.5", children: formatWeekday(event.endTime) })] }))] }), jsxRuntime.jsx("div", { children: formatWeekday(event.startTime) ===
9778
- formatWeekday(event.endTime) ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "text-text-muted text-sm", children: formatTime(event.startTime) }), jsxRuntime.jsx("span", { className: "text-text-muted text-sm", children: " - " }), jsxRuntime.jsx("span", { className: "text-text-muted text-sm", children: formatTime(event.endTime) })] })) : (jsxRuntime.jsxs("span", { className: "text-text-muted text-sm", children: [formatTime(event.startTime), " Uhr"] })) })] }), jsxRuntime.jsxs("span", { className: "text-xs font-normal text-text-muted ml-1.5 bg-black/5 whitespace-nowrap", children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsx("div", { className: "text-right flex flex-col items-end", children: jsxRuntime.jsx(PriceDisplay, { price: event.price, yearPrices: yearPrices }) })] }), event.name !== selectedEventType?.name && (jsxRuntime.jsx("h4", { className: "text-base font-semibold text-text-primary leading-tight m-0 mb-0.5 flex items-center gap-2 max-w-[230px]", children: event.name }))] }, event.id));
11232
+ }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { style: {
11233
+ position: "absolute",
11234
+ inset: 0,
11235
+ backgroundColor: "rgba(15, 23, 42, 0.8)",
11236
+ borderRadius: "var(--bw-border-radius)",
11237
+ display: "flex",
11238
+ alignItems: "center",
11239
+ justifyContent: "center",
11240
+ }, children: jsxRuntime.jsx("div", { style: {
11241
+ width: "32px",
11242
+ height: "32px",
11243
+ color: "var(--bw-highlight-color)",
11244
+ opacity: 0.8,
11245
+ fontSize: "32px",
11246
+ }, children: spinner() }) })), jsxRuntime.jsx(SpecialPriceBadge, { price: event.price, yearPrices: yearPrices }), jsxRuntime.jsx(AllocationBadge, { availableSpots: availableSpots, maxParticipants: event.maxParticipants }), jsxRuntime.jsxs("div", { style: {
11247
+ display: "flex",
11248
+ justifyContent: "space-between",
11249
+ width: "100%",
11250
+ alignItems: "flex-start",
11251
+ gap: "12px",
11252
+ marginBottom: "4px",
11253
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11254
+ fontSize: "16px",
11255
+ transition: "all 0.2s ease",
11256
+ borderRadius: "var(--bw-border-radius-small)",
11257
+ borderTop: "4px solid var(--bw-border-color)",
11258
+ border: "1px solid var(--bw-border-color)",
11259
+ width: "40px",
11260
+ height: "40px",
11261
+ display: "flex",
11262
+ alignItems: "center",
11263
+ justifyContent: "center",
11264
+ fontWeight: 700,
11265
+ color: "var(--bw-text-color)",
11266
+ backgroundColor: "var(--bw-background-color)",
11267
+ }, children: startDate.getDate() }), jsxRuntime.jsxs("div", { style: {
11268
+ fontSize: "16px",
11269
+ color: "var(--bw-text-color)",
11270
+ display: "flex",
11271
+ flexDirection: "column",
11272
+ alignItems: "flex-start",
11273
+ justifyContent: "flex-start",
11274
+ lineHeight: 1.25,
11275
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { style: { fontWeight: 600, marginBottom: "2px" }, children: formatWeekday(event.startTime) }), formatWeekday(event.startTime) !==
11276
+ formatWeekday(event.endTime) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: " - " }), jsxRuntime.jsx("span", { style: { fontWeight: 600, marginBottom: "2px" }, children: formatWeekday(event.endTime) })] }))] }), jsxRuntime.jsx("div", { children: formatWeekday(event.startTime) ===
11277
+ formatWeekday(event.endTime) ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: formatTime(event.startTime) }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: " - " }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: formatTime(event.endTime) })] })) : (jsxRuntime.jsxs("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: [formatTime(event.startTime), " Uhr"] })) })] }), jsxRuntime.jsxs("span", { style: {
11278
+ fontSize: "12px",
11279
+ fontWeight: 400,
11280
+ color: "var(--bw-text-muted)",
11281
+ marginLeft: "6px",
11282
+ backgroundColor: "rgba(0, 0, 0, 0.05)",
11283
+ whiteSpace: "nowrap",
11284
+ }, children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsx("div", { style: {
11285
+ textAlign: "right",
11286
+ display: "flex",
11287
+ flexDirection: "column",
11288
+ alignItems: "flex-end",
11289
+ }, children: jsxRuntime.jsx(PriceDisplay, { price: event.price, yearPrices: yearPrices }) })] }), event.name !== selectedEventType?.name && (jsxRuntime.jsx("h4", { style: {
11290
+ fontSize: "16px",
11291
+ fontWeight: 600,
11292
+ color: "var(--bw-text-color)",
11293
+ lineHeight: 1.25,
11294
+ margin: "0 0 2px 0",
11295
+ display: "flex",
11296
+ alignItems: "center",
11297
+ gap: "8px",
11298
+ maxWidth: "230px",
11299
+ }, children: event.name }))] }, event.id));
9779
11300
  }) }) })] }, key));
9780
11301
  }) }) }) }));
9781
11302
  }
@@ -9791,9 +11312,76 @@ function NextEventsPreview({ events, onEventSelect, onShowAll, showAllButtonText
9791
11312
  return jsxRuntime.jsx(NextEventsSkeleton, { count: 3 });
9792
11313
  }
9793
11314
  if (events.length === 0) {
9794
- return (jsxRuntime.jsx("div", { className: "mx-auto max-w-[500px] p-4", children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center text-center bg-surface border border-solid border-border rounded p-6 font-sans min-h-[300px]", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center rounded-full w-16 h-16 bg-highlight mx-auto mb-4 text-[32px] text-white opacity-80", children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { className: "font-semibold m-0 text-xl text-text-primary mb-2 font-sans", children: "Keine bevorstehenden Termine" }), jsxRuntime.jsx("p", { className: "m-0 text-text-muted text-base leading-relaxed mb-6 font-sans max-w-[400px]", children: "Aktuell sind keine Termine verf\u00FCgbar. Bitte schaue sp\u00E4ter noch einmal vorbei oder kontaktiere uns direkt." }), jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), className: "flex items-center cursor-pointer bg-surface text-highlight px-6 py-3 border border-solid border-highlight rounded text-base font-semibold font-sans transition-all duration-200 gap-2 hover:bg-highlight hover:text-white hover:-translate-y-0.5", children: [jsxRuntime.jsx("span", { className: "text-base", children: "\uD83D\uDD04" }), "Seite neu laden"] })] }) }));
9795
- }
9796
- return (jsxRuntime.jsxs("div", { className: "mx-auto max-w-[500px] p-4 font-sans", children: [jsxRuntime.jsxs("div", { className: "text-center mb-6", children: [jsxRuntime.jsx("h2", { className: "font-semibold m-0 mb-2 text-lg text-text-primary font-sans", children: "N\u00E4chste verf\u00FCgbare Termine" }), jsxRuntime.jsx("p", { className: "m-0 text-base text-text-muted font-sans", children: "W\u00E4hle einen Termin aus oder zeige alle verf\u00FCgbaren Termine an" })] }), jsxRuntime.jsx("div", { className: "flex flex-col gap-3 mb-6", children: events.map((event) => {
11315
+ return (jsxRuntime.jsx("div", { style: { maxWidth: "500px", margin: "0 auto", padding: "16px" }, children: jsxRuntime.jsxs("div", { style: {
11316
+ display: "flex",
11317
+ flexDirection: "column",
11318
+ alignItems: "center",
11319
+ justifyContent: "center",
11320
+ textAlign: "center",
11321
+ backgroundColor: "var(--bw-surface-color)",
11322
+ border: "1px solid var(--bw-border-color)",
11323
+ borderRadius: "var(--bw-border-radius)",
11324
+ padding: "24px",
11325
+ fontFamily: "var(--bw-font-family)",
11326
+ minHeight: "300px",
11327
+ }, children: [jsxRuntime.jsx("div", { style: {
11328
+ display: "flex",
11329
+ alignItems: "center",
11330
+ justifyContent: "center",
11331
+ borderRadius: "50%",
11332
+ width: "64px",
11333
+ height: "64px",
11334
+ backgroundColor: "var(--bw-highlight-color)",
11335
+ marginBottom: "16px",
11336
+ fontSize: "32px",
11337
+ color: "#ffffff",
11338
+ opacity: 0.8,
11339
+ }, children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { style: {
11340
+ fontWeight: 600,
11341
+ margin: "0 0 8px 0",
11342
+ fontSize: "20px",
11343
+ color: "var(--bw-text-color)",
11344
+ fontFamily: "var(--bw-font-family)",
11345
+ }, children: "Keine bevorstehenden Termine" }), jsxRuntime.jsx("p", { style: {
11346
+ margin: "0 0 24px 0",
11347
+ color: "var(--bw-text-muted)",
11348
+ fontSize: "16px",
11349
+ lineHeight: 1.6,
11350
+ fontFamily: "var(--bw-font-family)",
11351
+ maxWidth: "400px",
11352
+ }, children: "Aktuell sind keine Termine verf\u00FCgbar. Bitte schaue sp\u00E4ter noch einmal vorbei oder kontaktiere uns direkt." }), jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), style: {
11353
+ display: "flex",
11354
+ alignItems: "center",
11355
+ cursor: "pointer",
11356
+ backgroundColor: "var(--bw-surface-color)",
11357
+ color: "var(--bw-highlight-color)",
11358
+ padding: "12px 24px",
11359
+ border: "1px solid var(--bw-highlight-color)",
11360
+ borderRadius: "var(--bw-border-radius)",
11361
+ fontSize: "16px",
11362
+ fontWeight: 600,
11363
+ fontFamily: "var(--bw-font-family)",
11364
+ transition: "all 0.2s ease",
11365
+ gap: "8px",
11366
+ }, children: [jsxRuntime.jsx("span", { style: { fontSize: "16px" }, children: "\uD83D\uDD04" }), "Seite neu laden"] })] }) }));
11367
+ }
11368
+ return (jsxRuntime.jsxs("div", { style: {
11369
+ maxWidth: "500px",
11370
+ margin: "0 auto",
11371
+ padding: "16px",
11372
+ fontFamily: "var(--bw-font-family)",
11373
+ }, children: [jsxRuntime.jsxs("div", { style: { textAlign: "center", marginBottom: "24px" }, children: [jsxRuntime.jsx("h2", { style: {
11374
+ fontWeight: 600,
11375
+ margin: "0 0 8px 0",
11376
+ fontSize: "18px",
11377
+ color: "var(--bw-text-color)",
11378
+ fontFamily: "var(--bw-font-family)",
11379
+ }, children: "N\u00E4chste verf\u00FCgbare Termine" }), jsxRuntime.jsx("p", { style: {
11380
+ margin: 0,
11381
+ fontSize: "16px",
11382
+ color: "var(--bw-text-muted)",
11383
+ fontFamily: "var(--bw-font-family)",
11384
+ }, children: "W\u00E4hle einen Termin aus oder zeige alle verf\u00FCgbaren Termine an" })] }), jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "12px", marginBottom: "24px" }, children: events.map((event) => {
9797
11385
  const availableSpots = event.maxParticipants - event.participantCount;
9798
11386
  const isFullyBooked = availableSpots === 0;
9799
11387
  const startDate = new Date(event.startTime);
@@ -9815,26 +11403,123 @@ function NextEventsPreview({ events, onEventSelect, onShowAll, showAllButtonText
9815
11403
  return "var(--bw-highlight-color)";
9816
11404
  };
9817
11405
  const isDisabled = isFullyBooked || isPastEvent || !event.bookingOpen;
9818
- return (jsxRuntime.jsxs("div", { className: `relative bg-surface rounded p-2 px-2.5 transition-all duration-200 border border-solid font-sans ${isDisabled
9819
- ? "opacity-30 grayscale cursor-not-allowed"
9820
- : "cursor-pointer hover:scale-[1.02] hover:bg-black/5"}`, style: { borderColor: getAvailabilityColor() }, onClick: () => {
11406
+ return (jsxRuntime.jsxs("div", { style: {
11407
+ position: "relative",
11408
+ backgroundColor: "var(--bw-surface-color)",
11409
+ borderRadius: "var(--bw-border-radius)",
11410
+ padding: "8px 10px",
11411
+ transition: "all 0.2s ease",
11412
+ border: `1px solid ${getAvailabilityColor()}`,
11413
+ fontFamily: "var(--bw-font-family)",
11414
+ opacity: isDisabled ? 0.3 : 1,
11415
+ filter: isDisabled ? "grayscale(100%)" : "none",
11416
+ cursor: isDisabled ? "not-allowed" : "pointer",
11417
+ }, onClick: () => {
9821
11418
  if (!isDisabled) {
9822
11419
  handleEventSelect(event.id);
9823
11420
  }
9824
- }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-slate-900/80 rounded", children: jsxRuntime.jsx("div", { className: "animate-spin w-8 h-8 text-highlight/80 text-[32px]", children: "\u27F3" }) })), jsxRuntime.jsxs("div", { className: "flex justify-between w-full items-start gap-3 mb-1", children: [jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center font-bold text-base rounded-sm w-10 h-10 text-text-primary bg-background border border-solid transition-all duration-200", style: {
9825
- borderColor: getAvailabilityColor(),
11421
+ }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { style: {
11422
+ position: "absolute",
11423
+ inset: 0,
11424
+ display: "flex",
11425
+ alignItems: "center",
11426
+ justifyContent: "center",
11427
+ backgroundColor: "rgba(15, 23, 42, 0.8)",
11428
+ borderRadius: "var(--bw-border-radius)",
11429
+ }, children: jsxRuntime.jsx("div", { style: {
11430
+ width: "32px",
11431
+ height: "32px",
11432
+ color: "var(--bw-highlight-color)",
11433
+ fontSize: "32px",
11434
+ animation: "spin 1s linear infinite",
11435
+ }, children: "\u27F3" }) })), jsxRuntime.jsxs("div", { style: {
11436
+ display: "flex",
11437
+ justifyContent: "space-between",
11438
+ width: "100%",
11439
+ alignItems: "flex-start",
11440
+ gap: "12px",
11441
+ marginBottom: "4px",
11442
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11443
+ display: "flex",
11444
+ alignItems: "center",
11445
+ justifyContent: "center",
11446
+ fontWeight: 700,
11447
+ fontSize: "16px",
11448
+ borderRadius: "var(--bw-border-radius-small)",
11449
+ width: "40px",
11450
+ height: "40px",
11451
+ color: "var(--bw-text-color)",
11452
+ backgroundColor: "var(--bw-background-color)",
11453
+ border: "1px solid var(--bw-border-color)",
9826
11454
  borderTopWidth: "4px",
9827
- }, children: startDate.getDate() }), jsxRuntime.jsxs("div", { className: "flex flex-col items-start justify-start text-base text-text-primary leading-tight", children: [jsxRuntime.jsx("span", { className: "font-semibold mb-0.5", children: formatWeekday(event.startTime) }), jsxRuntime.jsx("span", { className: "text-text-muted text-sm", children: formatTime(event.startTime) })] })] }), jsxRuntime.jsxs("div", { className: "flex flex-col items-end text-right", children: [jsxRuntime.jsx("div", { className: "font-bold text-highlight text-lg", children: event.price !== null ? formatCurrency(event.price) : "Preis auf Anfrage" }), event.deposit && event.deposit > 0 && (jsxRuntime.jsxs("div", { className: "text-xs text-text-muted", children: ["ab ", formatCurrency(event.deposit)] }))] })] }), jsxRuntime.jsxs("h4", { className: "flex items-center font-semibold m-0 text-base text-text-primary leading-tight mb-0.5 gap-2", children: [event.name, jsxRuntime.jsxs("span", { className: "text-xs font-normal text-text-muted ml-1.5 bg-black/5 rounded-lg px-2 py-0.5", children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), event.notes && (jsxRuntime.jsx("p", { className: "m-0 text-xs text-text-muted mt-2 overflow-hidden leading-snug", style: {
11455
+ borderTopColor: getAvailabilityColor(),
11456
+ transition: "all 0.2s ease",
11457
+ }, children: startDate.getDate() }), jsxRuntime.jsxs("div", { style: {
11458
+ display: "flex",
11459
+ flexDirection: "column",
11460
+ alignItems: "flex-start",
11461
+ justifyContent: "flex-start",
11462
+ fontSize: "16px",
11463
+ color: "var(--bw-text-color)",
11464
+ lineHeight: 1.25,
11465
+ }, children: [jsxRuntime.jsx("span", { style: { fontWeight: 600, marginBottom: "2px" }, children: formatWeekday(event.startTime) }), jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontSize: "14px" }, children: formatTime(event.startTime) })] })] }), jsxRuntime.jsxs("div", { style: {
11466
+ display: "flex",
11467
+ flexDirection: "column",
11468
+ alignItems: "flex-end",
11469
+ textAlign: "right",
11470
+ }, children: [jsxRuntime.jsx("div", { style: {
11471
+ fontWeight: 700,
11472
+ color: "var(--bw-highlight-color)",
11473
+ fontSize: "18px",
11474
+ }, children: event.price !== null ? formatCurrency(event.price) : "Preis auf Anfrage" }), event.deposit && event.deposit > 0 && (jsxRuntime.jsxs("div", { style: { fontSize: "12px", color: "var(--bw-text-muted)" }, children: ["ab ", formatCurrency(event.deposit)] }))] })] }), jsxRuntime.jsxs("h4", { style: {
11475
+ display: "flex",
11476
+ alignItems: "center",
11477
+ fontWeight: 600,
11478
+ margin: "0 0 2px 0",
11479
+ fontSize: "16px",
11480
+ color: "var(--bw-text-color)",
11481
+ lineHeight: 1.25,
11482
+ gap: "8px",
11483
+ }, children: [event.name, jsxRuntime.jsxs("span", { style: {
11484
+ fontSize: "12px",
11485
+ fontWeight: 400,
11486
+ color: "var(--bw-text-muted)",
11487
+ marginLeft: "6px",
11488
+ backgroundColor: "rgba(0, 0, 0, 0.05)",
11489
+ borderRadius: "16px",
11490
+ padding: "2px 8px",
11491
+ }, children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), event.notes && (jsxRuntime.jsx("p", { style: {
11492
+ margin: "8px 0 0 0",
11493
+ fontSize: "12px",
11494
+ color: "var(--bw-text-muted)",
11495
+ overflow: "hidden",
11496
+ lineHeight: 1.375,
9828
11497
  display: "-webkit-box",
9829
11498
  WebkitBoxOrient: "vertical",
9830
11499
  WebkitLineClamp: 2,
9831
11500
  }, children: event.notes }))] }, event.id));
9832
- }) }), showAllButton && (jsxRuntime.jsx("div", { className: "text-center", children: jsxRuntime.jsx("button", { type: "button", disabled: isLoadingShowAll, className: `relative bg-surface text-highlight border border-solid border-highlight px-6 py-3 rounded text-base font-medium font-sans transition-all duration-200 ${isLoadingShowAll
9833
- ? "cursor-not-allowed opacity-70"
9834
- : "cursor-pointer hover:bg-highlight hover:text-white"}`, onClick: onShowAll, children: isLoadingShowAll ? (jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("div", { className: "animate-spin w-4 h-4 text-highlight text-base", children: "\u27F3" }), "L\u00E4dt..."] })) : (showAllButtonText) }) }))] }));
11501
+ }) }), showAllButton && (jsxRuntime.jsx("div", { style: { textAlign: "center" }, children: jsxRuntime.jsx("button", { type: "button", disabled: isLoadingShowAll, style: {
11502
+ position: "relative",
11503
+ backgroundColor: "var(--bw-surface-color)",
11504
+ color: "var(--bw-highlight-color)",
11505
+ border: "1px solid var(--bw-highlight-color)",
11506
+ padding: "12px 24px",
11507
+ borderRadius: "var(--bw-border-radius)",
11508
+ fontSize: "16px",
11509
+ fontWeight: 500,
11510
+ fontFamily: "var(--bw-font-family)",
11511
+ transition: "all 0.2s ease",
11512
+ cursor: isLoadingShowAll ? "not-allowed" : "pointer",
11513
+ opacity: isLoadingShowAll ? 0.7 : 1,
11514
+ }, onClick: onShowAll, children: isLoadingShowAll ? (jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [jsxRuntime.jsx("div", { style: {
11515
+ width: "16px",
11516
+ height: "16px",
11517
+ color: "var(--bw-highlight-color)",
11518
+ fontSize: "16px",
11519
+ animation: "spin 1s linear infinite",
11520
+ }, children: "\u27F3" }), "L\u00E4dt..."] })) : (showAllButtonText) }) }))] }));
9835
11521
  }
9836
11522
 
9837
- // Theme configurations
9838
11523
  const getThemeConfig = (theme = "generic") => {
9839
11524
  switch (theme) {
9840
11525
  case "christmas":
@@ -9895,23 +11580,19 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9895
11580
  const [copied, setCopied] = React__default.useState(false);
9896
11581
  const [isVisible, setIsVisible] = React__default.useState(false);
9897
11582
  const [portalContainer, setPortalContainer] = React__default.useState(null);
9898
- // Get theme config
9899
11583
  const themeConfig = getThemeConfig(config.theme);
9900
- // Use config values with fallbacks
9901
11584
  const discountCode = config.discountCode || "DISCOUNT";
9902
- // Create portal container on mount to escape stacking context issues
9903
11585
  React__default.useEffect(() => {
9904
11586
  const container = document.createElement("div");
9905
11587
  container.id = "bigz-promo-dialog-portal";
9906
11588
  container.style.position = "relative";
9907
- container.style.zIndex = "2147483647"; // Maximum z-index value
11589
+ container.style.zIndex = "2147483647";
9908
11590
  document.body.appendChild(container);
9909
11591
  setPortalContainer(container);
9910
11592
  return () => {
9911
11593
  document.body.removeChild(container);
9912
11594
  };
9913
11595
  }, []);
9914
- // Animate in on mount
9915
11596
  React__default.useEffect(() => {
9916
11597
  const timer = setTimeout(() => setIsVisible(true), 50);
9917
11598
  return () => clearTimeout(timer);
@@ -9923,7 +11604,6 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9923
11604
  setTimeout(() => setCopied(false), 2000);
9924
11605
  }
9925
11606
  catch {
9926
- // Fallback for older browsers
9927
11607
  const textArea = document.createElement("textarea");
9928
11608
  textArea.value = discountCode;
9929
11609
  document.body.appendChild(textArea);
@@ -9942,33 +11622,74 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9942
11622
  setIsVisible(false);
9943
11623
  setTimeout(onCtaClick, 200);
9944
11624
  };
9945
- // Don't render until portal container is ready
9946
11625
  if (!portalContainer) {
9947
11626
  return null;
9948
11627
  }
9949
- const dialogContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { onClick: handleClose, className: "fixed inset-0 z-[60] bg-[rgba(0,20,40,0.85)] backdrop-blur-sm transition-opacity duration-300 ease-out", style: { opacity: isVisible ? 1 : 0 } }), jsxRuntime.jsx("div", { className: "fixed z-[61] w-[92%] max-w-[440px] transition-all duration-300", style: {
11628
+ const dialogContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { onClick: handleClose, style: {
11629
+ position: "fixed",
11630
+ inset: 0,
11631
+ zIndex: 60,
11632
+ backgroundColor: "rgba(0, 20, 40, 0.85)",
11633
+ backdropFilter: "blur(4px)",
11634
+ transition: "opacity 0.3s ease-out",
11635
+ opacity: isVisible ? 1 : 0,
11636
+ } }), jsxRuntime.jsx("div", { style: {
11637
+ position: "fixed",
11638
+ zIndex: 61,
11639
+ width: "92%",
11640
+ maxWidth: "440px",
11641
+ transition: "all 0.3s",
9950
11642
  top: "50%",
9951
11643
  left: "50%",
9952
11644
  transform: `translate(-50%, -50%) scale(${isVisible ? 1 : 0.9})`,
9953
11645
  opacity: isVisible ? 1 : 0,
9954
11646
  transitionTimingFunction: "cubic-bezier(0.34, 1.56, 0.64, 1)",
9955
- }, children: jsxRuntime.jsxs("div", { className: "relative overflow-hidden rounded-[28px] shadow-[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)]", style: {
11647
+ }, children: jsxRuntime.jsxs("div", { style: {
11648
+ position: "relative",
11649
+ overflow: "hidden",
11650
+ borderRadius: "28px",
11651
+ 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)",
9956
11652
  background: `linear-gradient(165deg, ${themeConfig.primaryColor} 0%, ${themeConfig.primaryColor} 40%, ${themeConfig.secondaryColor} 100%)`,
9957
11653
  }, children: [themeConfig.animation?.snowfallEnabled &&
9958
- Array.from({ length: 15 }).map((_, i) => (jsxRuntime.jsx("div", { className: "absolute pointer-events-none z-[1] text-white opacity-0", style: {
11654
+ Array.from({ length: 15 }).map((_, i) => (jsxRuntime.jsx("div", { style: {
11655
+ position: "absolute",
11656
+ pointerEvents: "none",
11657
+ zIndex: 1,
11658
+ color: "white",
11659
+ opacity: 0,
9959
11660
  left: `${5 + Math.random() * 90}%`,
9960
11661
  top: "-10px",
9961
11662
  fontSize: `${10 + Math.random() * 14}px`,
9962
11663
  animation: `promo-snow ${4 + Math.random() * 3}s linear infinite`,
9963
11664
  animationDelay: `${Math.random() * 4}s`,
9964
- }, children: "\u2744" }, i))), jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center overflow-hidden h-[180px]", style: {
11665
+ }, children: "\u2744" }, i))), jsxRuntime.jsxs("div", { style: {
11666
+ position: "relative",
11667
+ display: "flex",
11668
+ alignItems: "center",
11669
+ justifyContent: "center",
11670
+ overflow: "hidden",
11671
+ height: "180px",
9965
11672
  background: `linear-gradient(180deg, rgba(0,0,0,0) 0%, ${themeConfig.primaryColor}cc 100%)`,
9966
- }, children: [themeConfig.backgroundImage && (jsxRuntime.jsx("img", { src: themeConfig.backgroundImage, alt: "Background", className: "absolute inset-0 w-full h-full object-cover opacity-60" })), jsxRuntime.jsx("div", { className: "absolute inset-0", style: {
11673
+ }, children: [themeConfig.backgroundImage && (jsxRuntime.jsx("img", { src: themeConfig.backgroundImage, alt: "Background", style: {
11674
+ position: "absolute",
11675
+ inset: 0,
11676
+ width: "100%",
11677
+ height: "100%",
11678
+ objectFit: "cover",
11679
+ opacity: 0.6,
11680
+ } })), jsxRuntime.jsx("div", { style: {
11681
+ position: "absolute",
11682
+ inset: 0,
9967
11683
  background: `linear-gradient(180deg, ${themeConfig.primaryColor}4d 0%, ${themeConfig.primaryColor}e6 100%)`,
9968
- } }), jsxRuntime.jsx("div", { className: "relative z-[2] text-[64px] drop-shadow-[0_8px_16px_rgba(0,0,0,0.4)]", style: {
11684
+ } }), jsxRuntime.jsx("div", { style: {
11685
+ position: "relative",
11686
+ zIndex: 2,
11687
+ fontSize: "64px",
11688
+ filter: "drop-shadow(0 8px 16px rgba(0,0,0,0.4))",
9969
11689
  animation: `promo-float ${themeConfig.animation?.floatDuration || 3}s ease-in-out infinite`,
9970
11690
  }, children: themeConfig.icon }), themeConfig.decorations &&
9971
- themeConfig.decorations.map((decoration, i) => (jsxRuntime.jsx("div", { className: "absolute", style: {
11691
+ themeConfig.decorations.map((decoration, i) => (jsxRuntime.jsx("div", { style: {
11692
+ position: "absolute",
9972
11693
  top: i === 0 ? "16px" : "20px",
9973
11694
  left: i === 0 ? "20px" : "auto",
9974
11695
  right: i === 1 ? "20px" : "auto",
@@ -9976,23 +11697,324 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9976
11697
  animation: themeConfig.animation?.sparkleEnabled
9977
11698
  ? `promo-sparkle 2s ease-in-out infinite ${i * 0.5}s`
9978
11699
  : undefined,
9979
- }, children: decoration }, i)))] }), jsxRuntime.jsx("button", { onClick: handleClose, className: "absolute top-4 right-4 flex items-center justify-center cursor-pointer z-10 w-9 h-9 rounded-full border-0 bg-black/30 backdrop-blur-sm text-white text-[22px] leading-none transition-all duration-150 hover:bg-black/50 hover:scale-110", children: "\u00D7" }), jsxRuntime.jsxs("div", { className: "relative text-center z-[2] px-7 pt-7 pb-8", children: [jsxRuntime.jsx("h2", { className: "font-extrabold text-[26px] text-white mb-1.5 tracking-tight drop-shadow-[0_2px_8px_rgba(0,0,0,0.3)]", children: config.title }), jsxRuntime.jsxs("p", { className: "text-[17px] text-white/90 mb-5 leading-relaxed", children: [config.subtitle, config.discountAmount && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("br", {}), jsxRuntime.jsxs("strong", { style: { color: themeConfig.secondaryColor }, children: [config.discountAmount, " Rabatt"] }), " ", "auf alle Kurse!"] }))] }), config.discountCode && (jsxRuntime.jsxs("div", { className: "mb-5 bg-white rounded-2xl p-[18px_20px] shadow-[0_8px_24px_rgba(0,0,0,0.15),inset_0_-2px_0_rgba(0,0,0,0.05)]", children: [jsxRuntime.jsx("p", { className: "uppercase font-semibold text-[11px] tracking-[1.5px] text-slate-500 mb-2.5", children: "Dein Geschenk-Code" }), jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-3", children: [jsxRuntime.jsx("div", { className: "px-5 py-2.5 rounded-[10px]", style: {
11700
+ }, children: decoration }, i)))] }), jsxRuntime.jsx("button", { onClick: handleClose, style: {
11701
+ position: "absolute",
11702
+ top: "16px",
11703
+ right: "16px",
11704
+ display: "flex",
11705
+ alignItems: "center",
11706
+ justifyContent: "center",
11707
+ cursor: "pointer",
11708
+ zIndex: 10,
11709
+ width: "36px",
11710
+ height: "36px",
11711
+ borderRadius: "50%",
11712
+ border: "none",
11713
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
11714
+ backdropFilter: "blur(4px)",
11715
+ color: "white",
11716
+ fontSize: "22px",
11717
+ lineHeight: 1,
11718
+ transition: "all 0.15s ease",
11719
+ }, children: "\u00D7" }), jsxRuntime.jsxs("div", { style: {
11720
+ position: "relative",
11721
+ textAlign: "center",
11722
+ zIndex: 2,
11723
+ padding: "28px 28px 32px 28px",
11724
+ }, children: [jsxRuntime.jsx("h2", { style: {
11725
+ fontWeight: 800,
11726
+ fontSize: "26px",
11727
+ color: "white",
11728
+ marginBottom: "6px",
11729
+ letterSpacing: "-0.025em",
11730
+ filter: "drop-shadow(0 2px 8px rgba(0,0,0,0.3))",
11731
+ margin: "0 0 6px 0",
11732
+ }, children: config.title }), jsxRuntime.jsxs("p", { style: {
11733
+ fontSize: "17px",
11734
+ color: "rgba(255, 255, 255, 0.9)",
11735
+ marginBottom: "20px",
11736
+ lineHeight: 1.5,
11737
+ margin: "0 0 20px 0",
11738
+ }, children: [config.subtitle, config.discountAmount && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("br", {}), jsxRuntime.jsxs("strong", { style: { color: themeConfig.secondaryColor }, children: [config.discountAmount, " Rabatt"] }), " ", "auf alle Kurse!"] }))] }), config.discountCode && (jsxRuntime.jsxs("div", { style: {
11739
+ marginBottom: "20px",
11740
+ backgroundColor: "white",
11741
+ borderRadius: "16px",
11742
+ padding: "18px 20px",
11743
+ boxShadow: "0 8px 24px rgba(0,0,0,0.15), inset 0 -2px 0 rgba(0,0,0,0.05)",
11744
+ }, children: [jsxRuntime.jsx("p", { style: {
11745
+ textTransform: "uppercase",
11746
+ fontWeight: 600,
11747
+ fontSize: "11px",
11748
+ letterSpacing: "1.5px",
11749
+ color: "#64748b",
11750
+ marginBottom: "10px",
11751
+ margin: "0 0 10px 0",
11752
+ }, children: "Dein Geschenk-Code" }), jsxRuntime.jsxs("div", { style: {
11753
+ display: "flex",
11754
+ alignItems: "center",
11755
+ justifyContent: "center",
11756
+ gap: "12px",
11757
+ }, children: [jsxRuntime.jsx("div", { style: {
11758
+ padding: "10px 20px",
11759
+ borderRadius: "10px",
9980
11760
  background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
9981
11761
  boxShadow: `0 4px 12px ${themeConfig.secondaryColor}4d`,
9982
- }, children: jsxRuntime.jsx("span", { className: "font-black text-[28px] text-white tracking-[6px] drop-shadow-[0_2px_4px_rgba(0,0,0,0.2)]", children: discountCode }) }), jsxRuntime.jsx("button", { onClick: handleCopyCode, className: `flex items-center cursor-pointer whitespace-nowrap px-4 py-3 rounded-[10px] border-2 border-solid text-[13px] font-semibold transition-all duration-150 gap-1.5 ${copied
9983
- ? "border-green-500 bg-green-100 text-green-700"
9984
- : "border-slate-200 bg-slate-50 text-slate-600 hover:border-slate-300"}`, children: copied ? (jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u2713 Kopiert!" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [jsxRuntime.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), jsxRuntime.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), "Kopieren"] })) })] })] })), config.activities && config.activities.length > 0 && (jsxRuntime.jsx("div", { className: "flex justify-center gap-2 mb-5 flex-wrap", children: config.activities.map((activity) => (jsxRuntime.jsx("span", { className: "font-medium bg-white/15 backdrop-blur-sm px-3 py-1.5 rounded-[20px] text-[13px] text-white", children: activity }, activity))) })), jsxRuntime.jsxs("button", { onClick: handleCtaClick, className: "w-full flex items-center justify-center cursor-pointer font-bold px-6 py-[18px] rounded-[14px] border-0 text-white text-[18px] transition-all duration-150 gap-2.5 hover:-translate-y-0.5", style: {
11762
+ }, children: jsxRuntime.jsx("span", { style: {
11763
+ fontWeight: 900,
11764
+ fontSize: "28px",
11765
+ color: "white",
11766
+ letterSpacing: "6px",
11767
+ filter: "drop-shadow(0 2px 4px rgba(0,0,0,0.2))",
11768
+ }, children: discountCode }) }), jsxRuntime.jsx("button", { onClick: handleCopyCode, style: {
11769
+ display: "flex",
11770
+ alignItems: "center",
11771
+ cursor: "pointer",
11772
+ whiteSpace: "nowrap",
11773
+ padding: "12px 16px",
11774
+ borderRadius: "10px",
11775
+ border: "2px solid",
11776
+ borderColor: copied ? "#22c55e" : "#e2e8f0",
11777
+ backgroundColor: copied ? "#dcfce7" : "#f8fafc",
11778
+ color: copied ? "#15803d" : "#475569",
11779
+ fontSize: "13px",
11780
+ fontWeight: 600,
11781
+ transition: "all 0.15s ease",
11782
+ gap: "6px",
11783
+ }, children: copied ? (jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u2713 Kopiert!" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [jsxRuntime.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), jsxRuntime.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), "Kopieren"] })) })] })] })), config.activities && config.activities.length > 0 && (jsxRuntime.jsx("div", { style: {
11784
+ display: "flex",
11785
+ justifyContent: "center",
11786
+ gap: "8px",
11787
+ marginBottom: "20px",
11788
+ flexWrap: "wrap",
11789
+ }, children: config.activities.map((activity) => (jsxRuntime.jsx("span", { style: {
11790
+ fontWeight: 500,
11791
+ backgroundColor: "rgba(255, 255, 255, 0.15)",
11792
+ backdropFilter: "blur(4px)",
11793
+ padding: "6px 12px",
11794
+ borderRadius: "20px",
11795
+ fontSize: "13px",
11796
+ color: "white",
11797
+ }, children: activity }, activity))) })), jsxRuntime.jsxs("button", { onClick: handleCtaClick, style: {
11798
+ width: "100%",
11799
+ display: "flex",
11800
+ alignItems: "center",
11801
+ justifyContent: "center",
11802
+ cursor: "pointer",
11803
+ fontWeight: 700,
11804
+ padding: "18px 24px",
11805
+ borderRadius: "14px",
11806
+ border: "none",
11807
+ color: "white",
11808
+ fontSize: "18px",
11809
+ transition: "all 0.15s ease",
11810
+ gap: "10px",
9985
11811
  background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
9986
11812
  boxShadow: `0 8px 24px ${themeConfig.secondaryColor}66, inset 0 1px 0 rgba(255,255,255,0.2)`,
9987
- }, onMouseEnter: (e) => {
9988
- e.currentTarget.style.boxShadow = `0 12px 28px ${themeConfig.secondaryColor}80, inset 0 1px 0 rgba(255,255,255,0.2)`;
9989
- }, onMouseLeave: (e) => {
9990
- e.currentTarget.style.boxShadow = `0 8px 24px ${themeConfig.secondaryColor}66, inset 0 1px 0 rgba(255,255,255,0.2)`;
9991
- }, children: [config.ctaText, jsxRuntime.jsx("span", { children: "\u2192" })] }), config.validityText && (jsxRuntime.jsx("p", { className: "mt-4 text-xs text-white/60", children: config.validityText }))] })] }) })] }));
9992
- // Use portal to render at document body level, escaping any stacking context
11813
+ }, children: [config.ctaText, jsxRuntime.jsx("span", { children: "\u2192" })] }), config.validityText && (jsxRuntime.jsx("p", { style: {
11814
+ marginTop: "16px",
11815
+ fontSize: "12px",
11816
+ color: "rgba(255, 255, 255, 0.6)",
11817
+ margin: "16px 0 0 0",
11818
+ }, children: config.validityText }))] })] }) })] }));
9993
11819
  return ReactDOM.createPortal(dialogContent, portalContainer);
9994
11820
  }
9995
11821
 
11822
+ // Upsell card styles
11823
+ const cardBaseStyles = {
11824
+ position: "relative",
11825
+ display: "flex",
11826
+ flexDirection: "column",
11827
+ padding: "16px",
11828
+ backgroundColor: "var(--bw-surface-color)",
11829
+ border: "2px solid var(--bw-border-color)",
11830
+ borderRadius: "var(--bw-border-radius)",
11831
+ cursor: "pointer",
11832
+ transition: "all 0.2s ease",
11833
+ fontFamily: "var(--bw-font-family)",
11834
+ };
11835
+ const cardSelectedStyles = {
11836
+ ...cardBaseStyles,
11837
+ borderColor: "var(--bw-highlight-color)",
11838
+ backgroundColor: "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.08)",
11839
+ };
11840
+ const cardDisabledStyles = {
11841
+ ...cardBaseStyles,
11842
+ opacity: 0.6,
11843
+ cursor: "not-allowed",
11844
+ };
11845
+ const checkboxContainerStyles = {
11846
+ position: "absolute",
11847
+ top: "12px",
11848
+ right: "12px",
11849
+ };
11850
+ const checkboxInnerStyles = {
11851
+ width: "24px",
11852
+ height: "24px",
11853
+ border: "2px solid var(--bw-border-color)",
11854
+ borderRadius: "6px",
11855
+ display: "flex",
11856
+ alignItems: "center",
11857
+ justifyContent: "center",
11858
+ backgroundColor: "var(--bw-surface-color)",
11859
+ transition: "all 0.2s ease",
11860
+ };
11861
+ const checkboxSelectedStyles = {
11862
+ ...checkboxInnerStyles,
11863
+ borderColor: "var(--bw-highlight-color)",
11864
+ backgroundColor: "var(--bw-highlight-color)",
11865
+ };
11866
+ const imageContainerStyles = {
11867
+ width: "100%",
11868
+ height: "120px",
11869
+ marginBottom: "12px",
11870
+ borderRadius: "calc(var(--bw-border-radius) - 4px)",
11871
+ overflow: "hidden",
11872
+ backgroundColor: "var(--bw-background-color)",
11873
+ };
11874
+ const imageStyles = {
11875
+ width: "100%",
11876
+ height: "100%",
11877
+ objectFit: "cover",
11878
+ };
11879
+ const imagePlaceholderStyles = {
11880
+ width: "100%",
11881
+ height: "100%",
11882
+ display: "flex",
11883
+ alignItems: "center",
11884
+ justifyContent: "center",
11885
+ color: "var(--bw-text-muted)",
11886
+ };
11887
+ const nameStyles = {
11888
+ fontSize: "16px",
11889
+ fontWeight: 600,
11890
+ color: "var(--bw-text-color)",
11891
+ margin: "0 0 6px 0",
11892
+ paddingRight: "36px",
11893
+ fontFamily: "var(--bw-font-family)",
11894
+ };
11895
+ const descriptionStyles = {
11896
+ fontSize: "13px",
11897
+ color: "var(--bw-text-muted)",
11898
+ margin: "0 0 10px 0",
11899
+ lineHeight: 1.4,
11900
+ display: "-webkit-box",
11901
+ WebkitLineClamp: 2,
11902
+ WebkitBoxOrient: "vertical",
11903
+ overflow: "hidden",
11904
+ fontFamily: "var(--bw-font-family)",
11905
+ };
11906
+ const itemsContainerStyles = {
11907
+ display: "flex",
11908
+ flexWrap: "wrap",
11909
+ gap: "6px",
11910
+ marginBottom: "10px",
11911
+ };
11912
+ const itemStyles = {
11913
+ display: "inline-flex",
11914
+ alignItems: "center",
11915
+ gap: "4px",
11916
+ padding: "4px 8px",
11917
+ backgroundColor: "var(--bw-background-color)",
11918
+ borderRadius: "4px",
11919
+ fontSize: "12px",
11920
+ color: "var(--bw-text-muted)",
11921
+ fontFamily: "var(--bw-font-family)",
11922
+ };
11923
+ const eventInfoStyles = {
11924
+ display: "flex",
11925
+ alignItems: "center",
11926
+ gap: "12px",
11927
+ padding: "8px 10px",
11928
+ backgroundColor: "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)",
11929
+ borderRadius: "6px",
11930
+ fontSize: "12px",
11931
+ marginBottom: "10px",
11932
+ fontFamily: "var(--bw-font-family)",
11933
+ };
11934
+ const priceContainerStyles = {
11935
+ display: "flex",
11936
+ flexDirection: "column",
11937
+ alignItems: "flex-end",
11938
+ marginTop: "8px",
11939
+ paddingTop: "8px",
11940
+ borderTop: "1px solid var(--bw-border-color)",
11941
+ };
11942
+ const pricePerPersonStyles = {
11943
+ fontSize: "15px",
11944
+ fontWeight: 600,
11945
+ color: "var(--bw-highlight-color)",
11946
+ fontFamily: "var(--bw-font-family)",
11947
+ };
11948
+ const priceTotalStyles = {
11949
+ fontSize: "12px",
11950
+ color: "var(--bw-text-muted)",
11951
+ fontFamily: "var(--bw-font-family)",
11952
+ };
11953
+ const unavailableOverlayStyles = {
11954
+ position: "absolute",
11955
+ inset: 0,
11956
+ display: "flex",
11957
+ alignItems: "center",
11958
+ justifyContent: "center",
11959
+ backgroundColor: "rgba(var(--bw-background-color-rgb, 248, 253, 254), 0.85)",
11960
+ borderRadius: "var(--bw-border-radius)",
11961
+ fontSize: "13px",
11962
+ color: "var(--bw-text-muted)",
11963
+ textAlign: "center",
11964
+ padding: "16px",
11965
+ fontFamily: "var(--bw-font-family)",
11966
+ };
11967
+ function UpsellCard({ upsell, isSelected, participantCount, onSelect, }) {
11968
+ const totalPrice = upsell.price * participantCount;
11969
+ const isDisabled = !upsell.available;
11970
+ const getCardStyles = () => {
11971
+ if (isDisabled)
11972
+ return cardDisabledStyles;
11973
+ if (isSelected)
11974
+ return cardSelectedStyles;
11975
+ return cardBaseStyles;
11976
+ };
11977
+ return (jsxRuntime.jsxs("div", { style: getCardStyles(), onClick: !isDisabled ? onSelect : undefined, role: "checkbox", "aria-checked": isSelected, tabIndex: isDisabled ? -1 : 0, onKeyDown: (e) => {
11978
+ if (!isDisabled && (e.key === "Enter" || e.key === " ")) {
11979
+ e.preventDefault();
11980
+ onSelect();
11981
+ }
11982
+ }, children: [jsxRuntime.jsx("div", { style: checkboxContainerStyles, children: jsxRuntime.jsx("div", { style: isSelected ? checkboxSelectedStyles : checkboxInnerStyles, children: isSelected && (jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "white", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", style: { width: "16px", height: "16px" }, children: jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) })) }) }), jsxRuntime.jsx("div", { style: imageContainerStyles, children: upsell.image ? (jsxRuntime.jsx("img", { src: upsell.image, alt: upsell.name, style: imageStyles })) : (jsxRuntime.jsx("div", { style: imagePlaceholderStyles, children: jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", style: { width: "40px", height: "40px", opacity: 0.4 }, children: jsxRuntime.jsx("path", { d: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" }) }) })) }), jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [jsxRuntime.jsx("h4", { style: nameStyles, children: upsell.name }), upsell.description && (jsxRuntime.jsx("p", { style: descriptionStyles, children: upsell.description })), upsell.items.length > 0 && (jsxRuntime.jsx("div", { style: itemsContainerStyles, children: upsell.items.map((item, index) => (jsxRuntime.jsxs("span", { style: itemStyles, children: [item.type === "product" ? "📦" : "🎫", " ", item.name, item.quantity > 1 && ` (${item.quantity}x)`] }, index))) })), upsell.suggestedEventInstance && (jsxRuntime.jsxs("div", { style: eventInfoStyles, children: [jsxRuntime.jsxs("span", { style: { color: "var(--bw-text-color)", fontWeight: 500 }, children: ["\uD83D\uDCC5 ", new Date(upsell.suggestedEventInstance.date).toLocaleDateString("de-DE", {
11983
+ weekday: "short",
11984
+ day: "numeric",
11985
+ month: "short",
11986
+ })] }), jsxRuntime.jsxs("span", { style: { color: "var(--bw-text-muted)" }, children: [upsell.suggestedEventInstance.availableSpots, " Pl\u00E4tze frei"] })] }))] }), jsxRuntime.jsxs("div", { style: priceContainerStyles, children: [jsxRuntime.jsxs("span", { style: pricePerPersonStyles, children: [formatCurrency(upsell.price), "/Person"] }), participantCount > 1 && (jsxRuntime.jsxs("span", { style: priceTotalStyles, children: ["= ", formatCurrency(totalPrice)] }))] }), isDisabled && (jsxRuntime.jsx("div", { style: unavailableOverlayStyles, children: jsxRuntime.jsx("span", { children: upsell.unavailableReason || "Nicht verfügbar" }) }))] }));
11987
+ }
11988
+
11989
+ function UpsellsStep({ upsells, selectedUpsells, participantCount, isLoading, isOpen, onClose, onSelect, onContinue, onBack, }) {
11990
+ const selectUpsell = (upsellId) => {
11991
+ const exists = selectedUpsells.find((s) => s.upsellPackageId === upsellId);
11992
+ if (exists) {
11993
+ // Deselect - remove this upsell from selection
11994
+ onSelect(selectedUpsells.filter((s) => s.upsellPackageId !== upsellId));
11995
+ }
11996
+ else {
11997
+ // Add this upsell to selection (checkbox behavior - allows multiple)
11998
+ onSelect([...selectedUpsells, { upsellPackageId: upsellId, quantity: participantCount }]);
11999
+ }
12000
+ };
12001
+ const isSelected = (upsellId) => selectedUpsells.some((s) => s.upsellPackageId === upsellId);
12002
+ // Calculate total for selected upsells
12003
+ const calculateTotal = () => {
12004
+ return selectedUpsells.reduce((total, selection) => {
12005
+ const upsell = upsells.find((u) => u.id === selection.upsellPackageId);
12006
+ if (upsell) {
12007
+ return total + upsell.price * selection.quantity;
12008
+ }
12009
+ return total;
12010
+ }, 0);
12011
+ };
12012
+ const selectedTotal = calculateTotal();
12013
+ const selectedCount = selectedUpsells.length;
12014
+ 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)] })] }))] }) }));
12016
+ }
12017
+
9996
12018
  // Main widget component
9997
12019
  function UniversalBookingWidget({ config: baseConfig }) {
9998
12020
  // Apply URL parameter inference
@@ -10014,6 +12036,11 @@ function UniversalBookingWidget({ config: baseConfig }) {
10014
12036
  const [selectedEventType, setSelectedEventType] = React__default.useState(null);
10015
12037
  const [eventInstances, setEventInstances] = React__default.useState([]);
10016
12038
  const [selectedEventInstance, setSelectedEventInstance] = React__default.useState(null);
12039
+ // Upsells state
12040
+ const [upsells, setUpsells] = React__default.useState([]);
12041
+ const [selectedUpsells, setSelectedUpsells] = React__default.useState([]);
12042
+ const [isLoadingUpsells, setIsLoadingUpsells] = React__default.useState(false);
12043
+ const [tempParticipantCount, setTempParticipantCount] = React__default.useState(1); // Used during upsell step
10017
12044
  // State for upcoming events (next-events view mode)
10018
12045
  const [upcomingEvents, setUpcomingEvents] = React__default.useState([]);
10019
12046
  const [showingPreview, setShowingPreview] = React__default.useState(true);
@@ -10033,6 +12060,7 @@ function UniversalBookingWidget({ config: baseConfig }) {
10033
12060
  const [systemConfig, setSystemConfig] = React__default.useState(null);
10034
12061
  // PERFORMANCE OPTIMIZATION: Lazy component loading
10035
12062
  const [shouldRenderInstanceSelection, setShouldRenderInstanceSelection] = React__default.useState(false);
12063
+ const [shouldRenderUpsells, setShouldRenderUpsells] = React__default.useState(false);
10036
12064
  const [shouldRenderBookingForm, setShouldRenderBookingForm] = React__default.useState(false);
10037
12065
  // Promo dialog state
10038
12066
  const [showPromoDialog, setShowPromoDialog] = React__default.useState(false);
@@ -10307,15 +12335,42 @@ function UniversalBookingWidget({ config: baseConfig }) {
10307
12335
  setError("Fehler beim Laden der Veranstaltungsdetails");
10308
12336
  }
10309
12337
  };
12338
+ // Load available upsells for the selected event instance
12339
+ const loadUpsells = async (eventTypeId, eventInstanceId, participantCount) => {
12340
+ try {
12341
+ const response = await fetch(getApiUrl(config.apiBaseUrl, "/booking/upsells"), {
12342
+ method: "POST",
12343
+ headers: createApiHeaders(config),
12344
+ body: JSON.stringify({
12345
+ organizationId: config.organizationId,
12346
+ eventTypeId,
12347
+ eventInstanceId,
12348
+ participantCount,
12349
+ }),
12350
+ });
12351
+ const data = await response.json();
12352
+ if (response.ok) {
12353
+ return data.upsells || [];
12354
+ }
12355
+ else {
12356
+ console.error("Upsells API error:", data.error);
12357
+ return [];
12358
+ }
12359
+ }
12360
+ catch (err) {
12361
+ console.error("Upsells fetch error:", err);
12362
+ return [];
12363
+ }
12364
+ };
10310
12365
  // Validate configuration
10311
12366
  if (!config.organizationId) {
10312
- return (jsxRuntime.jsx("div", { className: "max-w-2xl mx-auto p-6", children: jsxRuntime.jsxs("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4", children: [jsxRuntime.jsx("h2", { className: "text-red-800 font-semibold", children: "Konfigurationsfehler" }), jsxRuntime.jsx("p", { className: "text-red-600", children: "organizationId muss in der Konfiguration angegeben werden." })] }) }));
12367
+ return (jsxRuntime.jsx("div", { style: { maxWidth: "672px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: { backgroundColor: "#fef2f2", border: "1px solid #fecaca", borderRadius: "var(--bw-border-radius)", padding: "16px" }, children: [jsxRuntime.jsx("h2", { style: { color: "#991b1b", fontWeight: 600, fontFamily: "var(--bw-font-family)", margin: "0 0 8px 0" }, children: "Konfigurationsfehler" }), jsxRuntime.jsx("p", { style: { color: "#dc2626", fontFamily: "var(--bw-font-family)", margin: 0 }, children: "organizationId muss in der Konfiguration angegeben werden." })] }) }));
10313
12368
  }
10314
12369
  if (!config.eventInstanceId &&
10315
12370
  !config.categoryId &&
10316
12371
  !config.eventTypeIds &&
10317
12372
  !config.eventTypeId) {
10318
- return (jsxRuntime.jsx("div", { className: "max-w-2xl mx-auto p-6", children: jsxRuntime.jsxs("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4", children: [jsxRuntime.jsx("h2", { className: "text-red-800 font-semibold", children: "Konfigurationsfehler" }), jsxRuntime.jsx("p", { className: "text-red-600", children: "Es muss eine der folgenden Optionen angegeben werden: eventInstanceId, categoryId, eventTypeIds oder eventTypeId." })] }) }));
12373
+ return (jsxRuntime.jsx("div", { style: { maxWidth: "672px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: { backgroundColor: "#fef2f2", border: "1px solid #fecaca", borderRadius: "var(--bw-border-radius)", padding: "16px" }, children: [jsxRuntime.jsx("h2", { style: { color: "#991b1b", fontWeight: 600, fontFamily: "var(--bw-font-family)", margin: "0 0 8px 0" }, children: "Konfigurationsfehler" }), jsxRuntime.jsx("p", { style: { color: "#dc2626", fontFamily: "var(--bw-font-family)", margin: 0 }, children: "Es muss eine der folgenden Optionen angegeben werden: eventInstanceId, categoryId, eventTypeIds oder eventTypeId." })] }) }));
10319
12374
  }
10320
12375
  // Event type selection handlers
10321
12376
  const handleEventTypeSelect = async (eventType) => {
@@ -10333,6 +12388,32 @@ function UniversalBookingWidget({ config: baseConfig }) {
10333
12388
  // Event instance selection handlers
10334
12389
  const handleEventInstanceSelect = async (eventInstance) => {
10335
12390
  setSelectedEventInstance(eventInstance);
12391
+ // Set default participant count for upsell calculations
12392
+ const defaultParticipantCount = 1;
12393
+ setTempParticipantCount(defaultParticipantCount);
12394
+ // Check for available upsells
12395
+ if (selectedEventType) {
12396
+ setIsLoadingUpsells(true);
12397
+ setShouldRenderUpsells(true);
12398
+ try {
12399
+ const availableUpsells = await loadUpsells(selectedEventType.id, eventInstance.id, defaultParticipantCount);
12400
+ if (availableUpsells.length > 0) {
12401
+ // Show upsells step
12402
+ setUpsells(availableUpsells);
12403
+ setSelectedUpsells([]);
12404
+ setCurrentStep("upsells");
12405
+ setIsLoadingUpsells(false);
12406
+ return; // Don't proceed to booking yet
12407
+ }
12408
+ }
12409
+ catch (err) {
12410
+ console.error("Error loading upsells:", err);
12411
+ }
12412
+ finally {
12413
+ setIsLoadingUpsells(false);
12414
+ }
12415
+ }
12416
+ // No upsells available, go directly to booking
10336
12417
  setCurrentStep("booking");
10337
12418
  setShouldRenderBookingForm(true);
10338
12419
  setIsLoadingEventDetails(true);
@@ -10363,6 +12444,30 @@ function UniversalBookingWidget({ config: baseConfig }) {
10363
12444
  setError(errorMessage);
10364
12445
  config.onError?.(errorMessage);
10365
12446
  };
12447
+ // Upsells handlers
12448
+ const handleUpsellsSelect = (selections) => {
12449
+ setSelectedUpsells(selections);
12450
+ };
12451
+ const handleUpsellsContinue = async () => {
12452
+ // Move to booking step
12453
+ setCurrentStep("booking");
12454
+ setShouldRenderBookingForm(true);
12455
+ setIsLoadingEventDetails(true);
12456
+ try {
12457
+ if (selectedEventInstance) {
12458
+ await loadEventDetails(selectedEventInstance.id);
12459
+ }
12460
+ }
12461
+ finally {
12462
+ setIsLoadingEventDetails(false);
12463
+ }
12464
+ };
12465
+ const handleUpsellsBack = () => {
12466
+ // Go back to event instance selection
12467
+ setCurrentStep("eventInstances");
12468
+ setSelectedUpsells([]);
12469
+ setUpsells([]);
12470
+ };
10366
12471
  const handleUpcomingEventSelect = async (eventInstanceId) => {
10367
12472
  const upcomingEvent = upcomingEvents.find((event) => event.id === eventInstanceId);
10368
12473
  if (upcomingEvent) {
@@ -10432,7 +12537,83 @@ function UniversalBookingWidget({ config: baseConfig }) {
10432
12537
  };
10433
12538
  // Error state
10434
12539
  if (error) {
10435
- return (jsxRuntime.jsx(StyleProvider, { config: config, children: jsxRuntime.jsx("div", { className: "max-w-[600px] mx-auto p-6", children: jsxRuntime.jsxs("div", { className: "bg-surface border border-solid border-error rounded p-6 text-center font-sans", children: [jsxRuntime.jsx("div", { className: "w-16 h-16 bg-error rounded-full mx-auto mb-4 flex items-center justify-center text-[32px] text-white", children: "\u26A0\uFE0F" }), jsxRuntime.jsx("h2", { className: "text-xl font-semibold text-text-primary m-0 mb-2 font-sans", children: "Buchungen vor\u00FCbergehend nicht verf\u00FCgbar" }), jsxRuntime.jsx("p", { className: "text-text-muted text-base leading-relaxed m-0 mb-6 font-sans", children: "Es gab ein Problem beim Laden der verf\u00FCgbaren Termine. Bitte versuche es in einem Moment erneut." }), jsxRuntime.jsxs("details", { className: "mb-6 text-left bg-background rounded-sm p-1 border border-solid border-border", children: [jsxRuntime.jsx("summary", { className: "cursor-pointer font-medium text-text-muted text-sm font-sans mb-2", children: "Technische Details anzeigen" }), jsxRuntime.jsx("code", { className: "block text-sm text-text-muted font-mono break-words whitespace-pre-wrap", children: error })] }), jsxRuntime.jsx("div", { className: "flex gap-4 justify-center flex-wrap", children: jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), className: "bg-highlight text-white px-6 py-3 border-0 rounded text-base font-semibold cursor-pointer font-sans transition-all duration-200 flex items-center gap-2 hover:opacity-90 hover:-translate-y-0.5", children: [jsxRuntime.jsx("span", { className: "text-base", children: "\uD83D\uDD04" }), "Seite neu laden"] }) }), jsxRuntime.jsx("p", { className: "text-text-muted text-sm mt-6 m-0 font-sans", children: "Falls das Problem weiterhin besteht, kontaktiere bitte den Support." })] }) }) }));
12540
+ return (jsxRuntime.jsx(StyleProvider, { config: config, children: jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
12541
+ backgroundColor: "var(--bw-surface-color)",
12542
+ border: "1px solid var(--bw-error-color)",
12543
+ borderRadius: "var(--bw-border-radius)",
12544
+ padding: "24px",
12545
+ textAlign: "center",
12546
+ fontFamily: "var(--bw-font-family)",
12547
+ }, children: [jsxRuntime.jsx("div", { style: {
12548
+ width: "64px",
12549
+ height: "64px",
12550
+ backgroundColor: "var(--bw-error-color)",
12551
+ borderRadius: "50%",
12552
+ margin: "0 auto 16px auto",
12553
+ display: "flex",
12554
+ alignItems: "center",
12555
+ justifyContent: "center",
12556
+ fontSize: "32px",
12557
+ color: "white",
12558
+ }, children: "\u26A0\uFE0F" }), jsxRuntime.jsx("h2", { style: {
12559
+ fontSize: "20px",
12560
+ fontWeight: 600,
12561
+ color: "var(--bw-text-color)",
12562
+ margin: "0 0 8px 0",
12563
+ fontFamily: "var(--bw-font-family)",
12564
+ }, children: "Buchungen vor\u00FCbergehend nicht verf\u00FCgbar" }), jsxRuntime.jsx("p", { style: {
12565
+ color: "var(--bw-text-muted)",
12566
+ fontSize: "16px",
12567
+ lineHeight: 1.5,
12568
+ margin: "0 0 24px 0",
12569
+ fontFamily: "var(--bw-font-family)",
12570
+ }, children: "Es gab ein Problem beim Laden der verf\u00FCgbaren Termine. Bitte versuche es in einem Moment erneut." }), jsxRuntime.jsxs("details", { style: {
12571
+ marginBottom: "24px",
12572
+ textAlign: "left",
12573
+ backgroundColor: "var(--bw-background-color)",
12574
+ borderRadius: "var(--bw-border-radius-small)",
12575
+ padding: "4px",
12576
+ border: "1px solid var(--bw-border-color)",
12577
+ }, children: [jsxRuntime.jsx("summary", { style: {
12578
+ cursor: "pointer",
12579
+ fontWeight: 500,
12580
+ color: "var(--bw-text-muted)",
12581
+ fontSize: "14px",
12582
+ fontFamily: "var(--bw-font-family)",
12583
+ marginBottom: "8px",
12584
+ }, children: "Technische Details anzeigen" }), jsxRuntime.jsx("code", { style: {
12585
+ display: "block",
12586
+ fontSize: "14px",
12587
+ color: "var(--bw-text-muted)",
12588
+ fontFamily: "ui-monospace, monospace",
12589
+ wordBreak: "break-word",
12590
+ whiteSpace: "pre-wrap",
12591
+ }, children: error })] }), jsxRuntime.jsx("div", { style: {
12592
+ display: "flex",
12593
+ gap: "16px",
12594
+ justifyContent: "center",
12595
+ flexWrap: "wrap",
12596
+ }, children: jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), style: {
12597
+ backgroundColor: "var(--bw-highlight-color)",
12598
+ color: "white",
12599
+ padding: "12px 24px",
12600
+ border: "none",
12601
+ borderRadius: "var(--bw-border-radius)",
12602
+ fontSize: "16px",
12603
+ fontWeight: 600,
12604
+ cursor: "pointer",
12605
+ fontFamily: "var(--bw-font-family)",
12606
+ transition: "all 0.2s ease",
12607
+ display: "flex",
12608
+ alignItems: "center",
12609
+ gap: "8px",
12610
+ }, children: [jsxRuntime.jsx("span", { style: { fontSize: "16px" }, children: "\uD83D\uDD04" }), "Seite neu laden"] }) }), jsxRuntime.jsx("p", { style: {
12611
+ color: "var(--bw-text-muted)",
12612
+ fontSize: "14px",
12613
+ marginTop: "24px",
12614
+ margin: "24px 0 0 0",
12615
+ fontFamily: "var(--bw-font-family)",
12616
+ }, children: "Falls das Problem weiterhin besteht, kontaktiere bitte den Support." })] }) }) }));
10436
12617
  }
10437
12618
  // Main view based on view mode
10438
12619
  if (viewMode === "next-events" && showingPreview) {
@@ -10448,13 +12629,16 @@ function UniversalBookingWidget({ config: baseConfig }) {
10448
12629
  setCurrentStep("eventTypes");
10449
12630
  setShowingPreview(true);
10450
12631
  setEventDetails(null);
10451
- }, systemConfig: systemConfig })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
12632
+ }, systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
10452
12633
  setIsSuccess(false);
10453
12634
  setCurrentStep("eventTypes");
10454
12635
  setShowingPreview(true);
10455
12636
  setSuccessPaymentIntentId(null);
10456
12637
  setShouldRenderInstanceSelection(false);
12638
+ setShouldRenderUpsells(false);
10457
12639
  setShouldRenderBookingForm(false);
12640
+ setSelectedUpsells([]);
12641
+ setUpsells([]);
10458
12642
  const url = new URL(window.location.href);
10459
12643
  url.searchParams.delete("payment_intent");
10460
12644
  url.searchParams.delete("payment_intent_client_secret");
@@ -10484,7 +12668,23 @@ function UniversalBookingWidget({ config: baseConfig }) {
10484
12668
  }, config: config, onError: setError, paymentIntentId: successPaymentIntentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
10485
12669
  }
10486
12670
  if (viewMode === "button" && (isSingleEventTypeMode || isDirectInstanceMode)) {
10487
- return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, className: "flex justify-center items-center min-h-[120px]", children: [jsxRuntime.jsx("button", { type: "button", className: "bg-highlight text-white px-8 py-4 border-0 rounded text-lg font-semibold font-sans shadow-md cursor-pointer", onClick: () => {
12671
+ return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, style: {
12672
+ display: "flex",
12673
+ justifyContent: "center",
12674
+ alignItems: "center",
12675
+ minHeight: "120px",
12676
+ }, children: [jsxRuntime.jsx("button", { type: "button", style: {
12677
+ backgroundColor: "var(--bw-highlight-color)",
12678
+ color: "white",
12679
+ padding: "16px 32px",
12680
+ border: "none",
12681
+ borderRadius: "var(--bw-border-radius)",
12682
+ fontSize: "18px",
12683
+ fontWeight: 600,
12684
+ fontFamily: "var(--bw-font-family)",
12685
+ boxShadow: "var(--bw-shadow-md)",
12686
+ cursor: "pointer",
12687
+ }, onClick: () => {
10488
12688
  if (isDirectInstanceMode) {
10489
12689
  setCurrentStep("booking");
10490
12690
  setShouldRenderBookingForm(true);
@@ -10494,13 +12694,16 @@ function UniversalBookingWidget({ config: baseConfig }) {
10494
12694
  setShouldRenderInstanceSelection(true);
10495
12695
  }
10496
12696
  }, children: config.buttonText ||
10497
- (isDirectInstanceMode ? "Jetzt buchen" : "Jetzt Termin auswählen") }), shouldRenderInstanceSelection && (jsxRuntime.jsx(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: () => setSidebarOpen(false), isOpen: sidebarOpen, onClose: () => setSidebarOpen(false), isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderBookingForm && eventDetails && (jsxRuntime.jsx(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 })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
12697
+ (isDirectInstanceMode ? "Jetzt buchen" : "Jetzt Termin auswählen") }), shouldRenderInstanceSelection && (jsxRuntime.jsx(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: () => setSidebarOpen(false), isOpen: sidebarOpen && currentStep === "eventInstances", onClose: () => setSidebarOpen(false), isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (jsxRuntime.jsx(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack })), shouldRenderBookingForm && eventDetails && (jsxRuntime.jsx(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 })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
10498
12698
  setIsSuccess(false);
10499
12699
  setCurrentStep("eventTypes");
10500
12700
  setSidebarOpen(false);
10501
12701
  setSuccessPaymentIntentId(null);
10502
12702
  setShouldRenderInstanceSelection(false);
12703
+ setShouldRenderUpsells(false);
10503
12704
  setShouldRenderBookingForm(false);
12705
+ setSelectedUpsells([]);
12706
+ setUpsells([]);
10504
12707
  const url = new URL(window.location.href);
10505
12708
  url.searchParams.delete("payment_intent");
10506
12709
  url.searchParams.delete("payment_intent_client_secret");
@@ -10538,12 +12741,15 @@ function UniversalBookingWidget({ config: baseConfig }) {
10538
12741
  };
10539
12742
  };
10540
12743
  const backHandlers = getBackHandlers();
10541
- return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, children: [cardsView, shouldRenderInstanceSelection && (jsxRuntime.jsx(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: handleBackToEventTypes, isOpen: currentStep === "eventInstances", onClose: handleBackToEventTypes, isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderBookingForm && eventDetails && (jsxRuntime.jsx(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 })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
12744
+ return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, children: [cardsView, shouldRenderInstanceSelection && (jsxRuntime.jsx(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: handleBackToEventTypes, isOpen: currentStep === "eventInstances", onClose: handleBackToEventTypes, isLoadingEventInstances: isLoadingEventInstances, isLoadingEventDetails: isLoadingEventDetails })), shouldRenderUpsells && (jsxRuntime.jsx(UpsellsStep, { upsells: upsells, selectedUpsells: selectedUpsells, participantCount: tempParticipantCount, isLoading: isLoadingUpsells, isOpen: currentStep === "upsells", onClose: () => setCurrentStep("eventInstances"), onSelect: handleUpsellsSelect, onContinue: handleUpsellsContinue, onBack: handleUpsellsBack })), shouldRenderBookingForm && eventDetails && (jsxRuntime.jsx(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 })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
10542
12745
  setIsSuccess(false);
10543
12746
  setCurrentStep("eventTypes");
10544
12747
  setSuccessPaymentIntentId(null);
10545
12748
  setShouldRenderInstanceSelection(false);
12749
+ setShouldRenderUpsells(false);
10546
12750
  setShouldRenderBookingForm(false);
12751
+ setSelectedUpsells([]);
12752
+ setUpsells([]);
10547
12753
  const url = new URL(window.location.href);
10548
12754
  url.searchParams.delete("payment_intent");
10549
12755
  url.searchParams.delete("payment_intent_client_secret");
@@ -10579,7 +12785,7 @@ function styleInject(css, ref) {
10579
12785
  }
10580
12786
  }
10581
12787
 
10582
- var css_248z = "/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:var(--bw-font-family,Inter),system-ui,sans-serif;--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--color-red-50:oklch(97.1% 0.013 17.38);--color-red-100:oklch(93.6% 0.032 17.717);--color-red-200:oklch(88.5% 0.062 18.334);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-800:oklch(44.4% 0.177 26.899);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-500:oklch(72.3% 0.219 149.579);--color-green-700:oklch(52.7% 0.154 150.069);--color-slate-50:oklch(98.4% 0.003 247.858);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-500:oklch(55.4% 0.046 257.417);--color-slate-600:oklch(44.6% 0.043 257.281);--color-slate-700:oklch(37.2% 0.044 257.287);--color-slate-900:oklch(20.8% 0.042 265.755);--color-gray-600:oklch(44.6% 0.03 256.802);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--container-2xl:42rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:var(--bw-font-size-small,12px);--text-sm--line-height:1.42857;--text-base:var(--bw-font-size,14px);--text-base--line-height:1.5;--text-lg:var(--bw-font-size-large,18px);--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--text-2xl:1.5rem;--text-2xl--line-height:1.33333;--text-3xl:1.875rem;--text-3xl--line-height:1.2;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-0.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:var(--bw-border-radius-small,14px);--radius-lg:0.5rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,0.2,1);--ease-in-out:cubic-bezier(0.4,0,0.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:var(--bw-border-radius,18px);--color-surface:var(--bw-surface-color,#fff);--color-background:var(--bw-background-color,#f8fdfe);--color-highlight:var(--bw-highlight-color,#00b1aa);--color-text-primary:var(--bw-text-color,#0e7490);--color-text-muted:var(--bw-text-muted,rgba(14,116,144,.7));--color-border:var(--bw-border-color,#bae6fd);--color-success:var(--bw-success-color,#38bdf8);--color-warning:var(--bw-warning-color,#fbbf24);--color-error:var(--bw-error-color,#f43f5e)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:var(--default-font-feature-settings,normal);-webkit-tap-highlight-color:transparent;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:var(--default-mono-font-feature-settings,normal);font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{font-feature-settings:inherit;background-color:transparent;border-radius:0;color:inherit;font:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.top-4{top:calc(var(--spacing)*4)}.right-0{right:calc(var(--spacing)*0)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-3{bottom:calc(var(--spacing)*3)}.left-0{left:calc(var(--spacing)*0)}.left-1\\/2{left:50%}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.z-10{z-index:10}.z-50{z-index:50}.z-\\[1\\]{z-index:1}.z-\\[2\\]{z-index:2}.z-\\[60\\]{z-index:60}.z-\\[61\\]{z-index:61}.z-\\[1000\\]{z-index:1000}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2\\.5{margin-block:calc(var(--spacing)*2.5)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.-mt-6{margin-top:calc(var(--spacing)*-6)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mr-auto{margin-right:auto}.mb-0\\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-2\\.5{margin-bottom:calc(var(--spacing)*2.5)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.list-item{display:list-item}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-\\[180px\\]{height:180px}.h-\\[300px\\]{height:300px}.h-\\[400px\\]{height:400px}.h-full{height:100%}.h-px{height:1px}.max-h-\\[128px\\]{max-height:128px}.min-h-\\[80px\\]{min-height:80px}.min-h-\\[120px\\]{min-height:120px}.min-h-\\[128px\\]{min-height:128px}.min-h-\\[300px\\]{min-height:300px}.min-h-\\[400px\\]{min-height:400px}.w-2{width:calc(var(--spacing)*2)}.w-3\\/5{width:60%}.w-4{width:calc(var(--spacing)*4)}.w-4\\/5{width:80%}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-\\[50px\\]{width:50px}.w-\\[60px\\]{width:60px}.w-\\[70\\%\\]{width:70%}.w-\\[70px\\]{width:70px}.w-\\[90\\%\\]{width:90%}.w-\\[92\\%\\]{width:92%}.w-\\[100px\\]{width:100px}.w-\\[120px\\]{width:120px}.w-\\[280px\\]{width:280px}.w-\\[320px\\]{width:320px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[230px\\]{max-width:230px}.max-w-\\[400px\\]{max-width:400px}.max-w-\\[440px\\]{max-width:440px}.max-w-\\[500px\\]{max-width:500px}.max-w-\\[600px\\]{max-width:600px}.max-w-\\[calc\\(100\\%-32px\\)\\]{max-width:calc(100% - 32px)}.max-w-full{max-width:100%}.min-w-\\[100px\\]{min-width:100px}.flex-1{flex:1}.flex-\\[1_1_350px\\]{flex:1 1 350px}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:-50%}.-translate-x-1\\/2,.-translate-y-1\\/2{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:-50%}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.list-none{list-style-type:none}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\\[repeat\\(auto-fill\\,minmax\\(350px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fill,minmax(350px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(200px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:var(--radius)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[10px\\]{border-radius:10px}.rounded-\\[14px\\]{border-radius:14px}.rounded-\\[20px\\]{border-radius:20px}.rounded-\\[28px\\]{border-radius:28px}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.border-current{border-color:currentcolor}.border-error,.border-error\\/40{border-color:var(--color-error);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-error) 40%,transparent)}}.border-green-500{border-color:var(--color-green-500)}.border-highlight{border-color:var(--color-highlight)}.border-red-200{border-color:var(--color-red-200)}.border-slate-200{border-color:var(--color-slate-200)}.border-success\\/40{border-color:var(--color-success);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-success) 40%,transparent)}}.border-white{border-color:var(--color-white)}.border-t-transparent{border-top-color:transparent}.bg-\\[rgba\\(0\\,20\\,40\\,0\\.85\\)\\]{background-color:rgba(0,20,40,.85)}.bg-background{background-color:var(--color-background)}.bg-black\\/5{background-color:color-mix(in srgb,#000 5%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 5%,transparent)}}.bg-black\\/10{background-color:color-mix(in srgb,#000 10%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\\/30{background-color:color-mix(in srgb,#000 30%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\\/50{background-color:color-mix(in srgb,#000 50%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--color-border)}.bg-error,.bg-error\\/10,.bg-error\\/15{background-color:var(--color-error);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-error) 15%,transparent)}}.bg-green-100{background-color:var(--color-green-100)}.bg-highlight{background-color:var(--color-highlight)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-700\\/30{background-color:color-mix(in srgb,oklch(37.2% .044 257.287) 30%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-slate-700) 30%,transparent)}}.bg-slate-900\\/80{background-color:color-mix(in srgb,oklch(20.8% .042 265.755) 80%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.bg-success,.bg-success\\/15{background-color:var(--color-success);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-success) 15%,transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-white\\/15{background-color:color-mix(in srgb,#fff 15%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\\/20{background-color:color-mix(in srgb,#fff 20%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.bg-white\\/50{background-color:color-mix(in srgb,#fff 50%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.bg-white\\/90{background-color:color-mix(in srgb,#fff 90%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-highlight\\/20{--tw-gradient-from:var(--color-highlight);@supports (color:color-mix(in lab,red,red)){--tw-gradient-from:color-mix(in oklab,var(--color-highlight) 20%,transparent)}--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-highlight{--tw-gradient-to:var(--color-highlight);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-\\[18px_20px\\]{padding:18px 20px}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-7{padding-inline:calc(var(--spacing)*7)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-\\[18px\\]{padding-inline:18px}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-\\[18px\\]{padding-block:18px}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-7{padding-top:calc(var(--spacing)*7)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[11px\\]{font-size:11px}.text-\\[13px\\]{font-size:13px}.text-\\[17px\\]{font-size:17px}.text-\\[18px\\]{font-size:18px}.text-\\[22px\\]{font-size:22px}.text-\\[26px\\]{font-size:26px}.text-\\[28px\\]{font-size:28px}.text-\\[32px\\]{font-size:32px}.text-\\[48px\\]{font-size:48px}.text-\\[64px\\]{font-size:64px}.text-\\[clamp\\(0\\.8rem\\,2vw\\,16px\\)\\]{font-size:clamp(.8rem,2vw,16px)}.text-\\[clamp\\(0\\.95rem\\,2vw\\,16px\\)\\]{font-size:clamp(.95rem,2vw,16px)}.text-\\[clamp\\(1\\.1rem\\,2\\.5vw\\,24px\\)\\]{font-size:clamp(1.1rem,2.5vw,24px)}.text-\\[clamp\\(1\\.72rem\\,4vw\\,32px\\)\\]{font-size:clamp(1.72rem,4vw,32px)}.text-\\[clamp\\(1rem\\,2vw\\,16px\\)\\]{font-size:clamp(1rem,2vw,16px)}.leading-\\[1\\.55\\]{--tw-leading:1.55;line-height:1.55}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\\[1\\.5px\\]{--tw-tracking:1.5px;letter-spacing:1.5px}.tracking-\\[6px\\]{--tw-tracking:6px;letter-spacing:6px}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-error{color:var(--color-error)}.text-gray-600{color:var(--color-gray-600)}.text-green-700{color:var(--color-green-700)}.text-highlight,.text-highlight\\/80{color:var(--color-highlight);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-highlight) 80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-success{color:var(--color-success)}.text-surface{color:var(--color-surface)}.text-text-muted{color:var(--color-text-muted)}.text-text-primary{color:var(--color-text-primary)}.text-white{color:var(--color-white)}.text-white\\/60{color:color-mix(in srgb,#fff 60%,transparent);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\\/90{color:color-mix(in srgb,#fff 90%,transparent);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.accent-highlight{accent-color:var(--color-highlight)}.opacity-0{opacity:0}.opacity-30{opacity:30%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-70{opacity:70%}.opacity-80{opacity:80%}.opacity-100{opacity:100%}.opacity-\\[0\\.18\\]{opacity:.18}.shadow-\\[0_0_0_2px_var\\(--bw-highlight-color\\)\\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--bw-highlight-color))}.shadow-\\[0_0_0_2px_var\\(--bw-highlight-color\\)\\],.shadow-\\[0_2px_8px_0_var\\(--bw-highlight-color\\)\\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_2px_8px_0_var\\(--bw-highlight-color\\)\\]{--tw-shadow:0 2px 8px 0 var(--tw-shadow-color,var(--bw-highlight-color))}.shadow-\\[0_8px_24px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,inset_0_-2px_0_rgba\\(0\\,0\\,0\\,0\\.05\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,rgba(0,0,0,.15)),inset 0 -2px 0 var(--tw-shadow-color,rgba(0,0,0,.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[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\\)\\]{--tw-shadow:0 25px 60px -12px var(--tw-shadow-color,rgba(0,0,0,.5)),0 0 0 1px var(--tw-shadow-color,hsla(0,0%,100%,.1)),inset 0 1px 0 var(--tw-shadow-color,hsla(0,0%,100%,.2));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--bw-shadow-lg,0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05))}.shadow-lg,.shadow-md{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:var(--bw-shadow-md,0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06))}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-\\[0\\.5px\\]{--tw-blur:blur(0.5px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\\[0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.2\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 4px var(--tw-drop-shadow-color,rgba(0,0,0,.2)));--tw-drop-shadow:var(--tw-drop-shadow-size)}.drop-shadow-\\[0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.2\\)\\],.drop-shadow-\\[0_2px_8px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\\[0_2px_8px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-drop-shadow-size:drop-shadow(0 2px 8px var(--tw-drop-shadow-color,rgba(0,0,0,.3)));--tw-drop-shadow:var(--tw-drop-shadow-size)}.drop-shadow-\\[0_8px_16px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\]{--tw-drop-shadow-size:drop-shadow(0 8px 16px var(--tw-drop-shadow-color,rgba(0,0,0,.4)));--tw-drop-shadow:var(--tw-drop-shadow-size)}.drop-shadow-\\[0_8px_16px_rgba\\(0\\,0\\,0\\,0\\.4\\)\\],.grayscale{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale-\\[40\\%\\]{--tw-grayscale:grayscale(40%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-all{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-opacity{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-150{--tw-duration:150ms;transition-duration:.15s}.duration-200{--tw-duration:200ms;transition-duration:.2s}.duration-250{--tw-duration:250ms;transition-duration:.25s}.duration-300{--tw-duration:300ms;transition-duration:.3s}.duration-400{--tw-duration:400ms;transition-duration:.4s}.ease-\\[cubic-bezier\\(0\\.4\\,0\\,0\\.2\\,1\\)\\]{--tw-ease:cubic-bezier(0.4,0,0.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.hover\\:-translate-y-0\\.5{&:hover{@media (hover:hover){--tw-translate-y:calc(var(--spacing)*-0.5);translate:var(--tw-translate-x) var(--tw-translate-y)}}}.hover\\:scale-110{&:hover{@media (hover:hover){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\\:scale-125{&:hover{@media (hover:hover){--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\\:scale-\\[1\\.02\\]{&:hover{@media (hover:hover){scale:1.02}}}.hover\\:border-slate-300{&:hover{@media (hover:hover){border-color:var(--color-slate-300)}}}.hover\\:bg-black\\/5{&:hover{@media (hover:hover){background-color:color-mix(in srgb,#000 5%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 5%,transparent)}}}}.hover\\:bg-black\\/50{&:hover{@media (hover:hover){background-color:color-mix(in srgb,#000 50%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}}}.hover\\:bg-black\\/70{&:hover{@media (hover:hover){background-color:color-mix(in srgb,#000 70%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}}}.hover\\:bg-border{&:hover{@media (hover:hover){background-color:var(--color-border)}}}.hover\\:bg-error\\/10{&:hover{@media (hover:hover){background-color:var(--color-error);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-error) 10%,transparent)}}}}.hover\\:bg-highlight{&:hover{@media (hover:hover){background-color:var(--color-highlight)}}}.hover\\:bg-highlight\\/10{&:hover{@media (hover:hover){background-color:var(--color-highlight);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-highlight) 10%,transparent)}}}}.hover\\:bg-white\\/80{&:hover{@media (hover:hover){background-color:color-mix(in srgb,#fff 80%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}}}.hover\\:text-text-primary{&:hover{@media (hover:hover){color:var(--color-text-primary)}}}.hover\\:text-white{&:hover{@media (hover:hover){color:var(--color-white)}}}.hover\\:opacity-80{&:hover{@media (hover:hover){opacity:80%}}}.hover\\:opacity-90{&:hover{@media (hover:hover){opacity:90%}}}.hover\\:opacity-100{&:hover{@media (hover:hover){opacity:100%}}}.hover\\:shadow-lg{&:hover{@media (hover:hover){--tw-shadow:var(--bw-shadow-lg,0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}}.hover\\:brightness-95{&:hover{@media (hover:hover){--tw-brightness:brightness(95%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}}.hover\\:brightness-110{&:hover{@media (hover:hover){--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}}.focus\\:border-highlight{&:focus{border-color:var(--color-highlight)}}.focus\\:shadow-\\[0_0_0_2px_var\\(--bw-highlight-color\\)33\\]{&:focus{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--bw-highlight-color)33);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:shadow-\\[0_0_0_2px_var\\(--bw-highlight-color\\)\\]{&:focus{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--bw-highlight-color));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:ring-2{&:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:ring-highlight{&:focus{--tw-ring-color:var(--color-highlight)}}.focus\\:ring-offset-2{&:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}}.focus\\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}}@layer base{.booking-widget-container{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 *,.booking-widget-container :after,.booking-widget-container :before{box-sizing:border-box}.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{cursor:pointer;font-family:inherit;font-size:inherit}.booking-widget-container a{color:inherit}.booking-widget-container img{height:auto;max-width:100%;vertical-align:middle}#booking-widget-portal{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}}@layer utilities{.print-only{display:none}.print-hidden{display:block}@media print{.print-only{display:block}.print-hidden{display:none}}}: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 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)}}.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}}.input-focus:focus{border-color:var(--bw-highlight-color);box-shadow:0 0 0 3px var(--bw-highlight-muted);outline:none}.btn-primary{background-color:var(--bw-highlight-color);color:#fff;transition:filter .2s ease}.btn-primary:hover{filter:brightness(1.1)}.btn-primary:active{filter:brightness(.95)}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.card-interactive{transition:transform .2s ease,box-shadow .2s ease}.card-interactive:hover{box-shadow:var(--bw-shadow-lg);transform:translateY(-2px)}.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}.accordion-content{overflow:hidden;transition:max-height .3s ease-out}.accordion-trigger{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.accordion-trigger[data-state=open] .accordion-chevron{transform:rotate(180deg)}.accordion-chevron{transition:transform .2s ease}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:\"*\";inherits:false}@property --tw-gradient-from{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:\"*\";inherits:false}@property --tw-gradient-via-stops{syntax:\"*\";inherits:false}@property --tw-gradient-from-position{syntax:\"<length-percentage>\";inherits:false;initial-value:0}@property --tw-gradient-via-position{syntax:\"<length-percentage>\";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:\"<length-percentage>\";inherits:false;initial-value:100%}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}";
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}";
10583
12789
  styleInject(css_248z);
10584
12790
 
10585
12791
  // Export init function for vanilla JS usage