@bigz-app/booking-widget 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/booking-widget.js +2517 -343
  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 +2502 -342
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.esm.js +2502 -342
  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: "18px",
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,199 @@ 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
+ margin: 0,
9162
+ marginBottom: "12px",
9163
+ fontFamily: "var(--bw-font-family)",
9164
+ borderBottom: "2px solid var(--bw-highlight-color)",
9165
+ paddingBottom: "4px",
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
+ // Payment option: "deposit" or "full" - only relevant when deposit is available
9245
+ const [paymentOption, setPaymentOption] = React__default.useState("deposit");
9246
+ // Per-participant upsell selections: participantIndex -> array of upsell package IDs
9247
+ const [participantUpsells, setParticipantUpsells] = React__default.useState({});
8564
9248
  const form = useForm({
8565
9249
  resolver: bookingResolver,
8566
9250
  defaultValues: {
@@ -8574,18 +9258,64 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8574
9258
  },
8575
9259
  });
8576
9260
  const watchedParticipants = form.watch("participants");
9261
+ const watchedCustomerName = form.watch("customerName");
8577
9262
  const watchedCustomerEmail = form.watch("customerEmail");
8578
9263
  const customerNameError = form.formState.errors.customerName;
8579
9264
  const customerEmailError = form.formState.errors.customerEmail;
8580
9265
  const watchedAcceptTerms = form.watch("acceptTerms");
8581
- const { isValid: isFormValid } = form.formState;
8582
- // Calculate base total before any discounts
9266
+ // Initialize participant upsells from selectedUpsells when component mounts or participants change
9267
+ React__default.useEffect(() => {
9268
+ if (selectedUpsells.length > 0 && upsells.length > 0) {
9269
+ const globalUpsellIds = selectedUpsells.map(s => s.upsellPackageId);
9270
+ const newParticipantUpsells = {};
9271
+ // Pre-select the global upsells for all current participants
9272
+ watchedParticipants.forEach((_, index) => {
9273
+ // Keep existing selections if they exist, otherwise use global selections
9274
+ if (participantUpsells[index] === undefined) {
9275
+ newParticipantUpsells[index] = [...globalUpsellIds];
9276
+ }
9277
+ else {
9278
+ newParticipantUpsells[index] = participantUpsells[index];
9279
+ }
9280
+ });
9281
+ setParticipantUpsells(newParticipantUpsells);
9282
+ }
9283
+ }, [watchedParticipants.length, selectedUpsells, upsells.length]);
9284
+ // Toggle upsell for a specific participant
9285
+ const toggleParticipantUpsell = (participantIndex, upsellId) => {
9286
+ setParticipantUpsells(prev => {
9287
+ const currentUpsells = prev[participantIndex] || [];
9288
+ const hasUpsell = currentUpsells.includes(upsellId);
9289
+ return {
9290
+ ...prev,
9291
+ [participantIndex]: hasUpsell
9292
+ ? currentUpsells.filter(id => id !== upsellId)
9293
+ : [...currentUpsells, upsellId]
9294
+ };
9295
+ });
9296
+ };
8583
9297
  const calculateBaseTotal = React__default.useCallback(() => {
8584
9298
  if (!eventDetails)
8585
9299
  return 0;
8586
9300
  return eventDetails.price * watchedParticipants.filter((p) => p.name.trim()).length;
8587
9301
  }, [eventDetails, watchedParticipants]);
8588
- // Calculate total discount from all applied vouchers
9302
+ // Calculate upsells total based on per-participant selections
9303
+ const calculateUpsellsTotal = React__default.useCallback(() => {
9304
+ let total = 0;
9305
+ watchedParticipants.forEach((participant, index) => {
9306
+ // Only count upsells for participants with names
9307
+ if (participant.name.trim()) {
9308
+ const participantUpsellIds = participantUpsells[index] || [];
9309
+ participantUpsellIds.forEach(upsellId => {
9310
+ const upsell = upsells.find(u => u.id === upsellId);
9311
+ if (upsell) {
9312
+ total += upsell.price;
9313
+ }
9314
+ });
9315
+ }
9316
+ });
9317
+ return total;
9318
+ }, [participantUpsells, upsells, watchedParticipants]);
8589
9319
  const calculateTotalDiscount = React__default.useCallback(() => {
8590
9320
  return appliedVouchers.reduce((total, voucher) => {
8591
9321
  if (voucher.type === "discount") {
@@ -8597,12 +9327,12 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8597
9327
  return total;
8598
9328
  }, 0);
8599
9329
  }, [appliedVouchers]);
8600
- // Calculate total amount after discounts
8601
9330
  const calculateTotal = React__default.useCallback(() => {
8602
9331
  const baseTotal = calculateBaseTotal();
9332
+ const upsellsTotal = calculateUpsellsTotal();
8603
9333
  const totalDiscount = calculateTotalDiscount();
8604
- return Math.max(0, baseTotal - totalDiscount);
8605
- }, [calculateBaseTotal, calculateTotalDiscount]);
9334
+ return Math.max(0, baseTotal + upsellsTotal - totalDiscount);
9335
+ }, [calculateBaseTotal, calculateUpsellsTotal, calculateTotalDiscount]);
8606
9336
  const calculateDeposit = () => {
8607
9337
  if (!eventDetails || !eventDetails.deposit)
8608
9338
  return 0;
@@ -8610,16 +9340,39 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8610
9340
  return eventDetails.deposit * participantCount;
8611
9341
  };
8612
9342
  const baseTotal = calculateBaseTotal();
9343
+ const upsellsTotal = calculateUpsellsTotal();
8613
9344
  const totalDiscount = calculateTotalDiscount();
8614
9345
  const totalAmount = calculateTotal();
8615
9346
  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
9347
+ // Deposit stays fixed unless the discounted total is lower than the deposit
9348
+ // (discount applies to total price, not to the deposit itself)
9349
+ const hasDepositOption = depositAmount > 0 && depositAmount < totalAmount;
9350
+ const paymentAmount = hasDepositOption && paymentOption === "deposit"
9351
+ ? Math.min(depositAmount, totalAmount)
9352
+ : totalAmount;
9353
+ // Convert per-participant upsells to UpsellSelection[] format for API
9354
+ // Includes participantIndices to track which participants selected each upsell
9355
+ const aggregatedUpsellSelections = React__default.useCallback(() => {
9356
+ const upsellParticipantMap = {};
9357
+ watchedParticipants.forEach((participant, index) => {
9358
+ if (participant.name.trim()) {
9359
+ const participantUpsellIds = participantUpsells[index] || [];
9360
+ participantUpsellIds.forEach(upsellId => {
9361
+ if (!upsellParticipantMap[upsellId]) {
9362
+ upsellParticipantMap[upsellId] = [];
9363
+ }
9364
+ upsellParticipantMap[upsellId].push(index);
9365
+ });
9366
+ }
9367
+ });
9368
+ return Object.entries(upsellParticipantMap).map(([upsellPackageId, participantIndices]) => ({
9369
+ upsellPackageId: Number(upsellPackageId),
9370
+ quantity: participantIndices.length,
9371
+ participantIndices,
9372
+ }));
9373
+ }, [participantUpsells, watchedParticipants]);
8619
9374
  const appliedDiscountCode = appliedVouchers.find((v) => v.type === "discount");
8620
- // Get gift cards
8621
9375
  const appliedGiftCards = appliedVouchers.filter((v) => v.type === "giftCard");
8622
- // Voucher handlers
8623
9376
  const handleVoucherValidated = React__default.useCallback((voucher, _error) => {
8624
9377
  if (voucher) {
8625
9378
  setAppliedVouchers((prev) => [...prev, voucher]);
@@ -8628,13 +9381,20 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8628
9381
  const handleRemoveVoucher = React__default.useCallback((code) => {
8629
9382
  setAppliedVouchers((prev) => prev.filter((v) => v.code !== code));
8630
9383
  }, []);
8631
- // Check if form is ready for payment (schema valid + participant count within limit)
8632
9384
  const isReadyForPayment = () => {
8633
- const participantCount = watchedParticipants.filter((p) => p.name.trim()).length;
8634
- const participantsWithinLimit = participantCount <= (eventDetails?.availableSpots || 0);
8635
- return isFormValid && participantsWithinLimit && participantCount > 0;
9385
+ const participantsWithNames = watchedParticipants.filter((p) => p.name.trim()).length;
9386
+ const totalParticipantRows = watchedParticipants.length;
9387
+ const allParticipantsHaveNames = participantsWithNames === totalParticipantRows;
9388
+ const participantsWithinLimit = participantsWithNames <= (eventDetails?.availableSpots || 0);
9389
+ const hasValidCustomerName = watchedCustomerName && watchedCustomerName.trim().length >= 2;
9390
+ const hasValidCustomerEmail = watchedCustomerEmail && watchedCustomerEmail.trim().length > 0 && !customerEmailError;
9391
+ return allParticipantsHaveNames &&
9392
+ participantsWithinLimit &&
9393
+ participantsWithNames > 0 &&
9394
+ hasValidCustomerName &&
9395
+ hasValidCustomerEmail &&
9396
+ watchedAcceptTerms;
8636
9397
  };
8637
- // Re-validate vouchers when participant count changes (affects order value)
8638
9398
  React__default.useEffect(() => {
8639
9399
  if (appliedVouchers.length > 0) {
8640
9400
  const newBaseTotal = eventDetails?.price
@@ -8673,7 +9433,6 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8673
9433
  }));
8674
9434
  }
8675
9435
  }, [watchedParticipants, eventDetails]);
8676
- // Helper functions
8677
9436
  const addParticipant = () => {
8678
9437
  const currentParticipants = form.getValues("participants");
8679
9438
  const availableSpots = eventDetails?.availableSpots || 0;
@@ -8690,7 +9449,6 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8690
9449
  form.setValue("participants", currentParticipants.filter((_, i) => i !== index));
8691
9450
  }
8692
9451
  };
8693
- // Stripe appearance based on theme CSS variables
8694
9452
  const [stripeAppearance, setStripeAppearance] = React__default.useState(null);
8695
9453
  React__default.useEffect(() => {
8696
9454
  const container = document.querySelector(".booking-widget-container");
@@ -8726,10 +9484,79 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8726
9484
  onBackToEventTypes?.();
8727
9485
  }
8728
9486
  };
9487
+ const scrollToPayment = () => {
9488
+ paymentSectionRef.current?.scrollIntoView({ behavior: "smooth", block: "start" });
9489
+ };
9490
+ // Footer navigation
9491
+ 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
9492
  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`, {
9493
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Buchung nicht m\u00F6glich", children: jsxRuntime.jsx("div", { style: {
9494
+ display: "flex",
9495
+ alignItems: "center",
9496
+ justifyContent: "center",
9497
+ minHeight: "400px",
9498
+ textAlign: "center",
9499
+ padding: "16px",
9500
+ }, 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: {
9501
+ marginBottom: "8px",
9502
+ fontWeight: 600,
9503
+ fontSize: "18px",
9504
+ color: "var(--bw-text-muted)",
9505
+ fontFamily: "var(--bw-font-family)",
9506
+ }, 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." })] }) }) }));
9507
+ }
9508
+ 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: {
9509
+ display: "grid",
9510
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
9511
+ gap: "12px",
9512
+ fontSize: "14px",
9513
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9514
+ color: "var(--bw-text-muted)",
9515
+ fontFamily: "var(--bw-font-family)",
9516
+ display: "flex",
9517
+ alignItems: "center",
9518
+ gap: "4px",
9519
+ }, children: [jsxRuntime.jsx(IconCalendar, { size: 20, color: "var(--bw-highlight-color)" }), " Datum:"] }), jsxRuntime.jsxs("span", { style: {
9520
+ color: "var(--bw-text-color)",
9521
+ fontWeight: 500,
9522
+ fontFamily: "var(--bw-font-family)",
9523
+ }, 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: {
9524
+ color: "var(--bw-text-muted)",
9525
+ fontFamily: "var(--bw-font-family)",
9526
+ display: "flex",
9527
+ alignItems: "center",
9528
+ gap: "4px",
9529
+ }, children: [jsxRuntime.jsx(IconClock, { size: 20, color: "var(--bw-highlight-color)" }), " Dauer:"] }), jsxRuntime.jsxs("span", { style: {
9530
+ color: "var(--bw-text-color)",
9531
+ fontWeight: 500,
9532
+ fontFamily: "var(--bw-font-family)",
9533
+ }, children: [eventDetails.durationDays, " Tag", eventDetails.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [jsxRuntime.jsxs("span", { style: {
9534
+ color: "var(--bw-text-muted)",
9535
+ fontFamily: "var(--bw-font-family)",
9536
+ display: "flex",
9537
+ alignItems: "center",
9538
+ gap: "4px",
9539
+ }, children: [jsxRuntime.jsx(IconMoney, { size: 20, color: "var(--bw-highlight-color)" }), " Preis:"] }), jsxRuntime.jsxs("span", { style: {
9540
+ color: "var(--bw-text-color)",
9541
+ fontWeight: 500,
9542
+ fontFamily: "var(--bw-font-family)",
9543
+ }, 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: {
9544
+ display: "grid",
9545
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
9546
+ gap: "16px",
9547
+ }, 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: {
9548
+ fontSize: "14px",
9549
+ color: "var(--bw-text-muted)",
9550
+ fontFamily: "var(--bw-font-family)",
9551
+ maxWidth: "calc(100% - 32px)",
9552
+ overflowWrap: "break-word",
9553
+ cursor: "pointer",
9554
+ }, 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: {
9555
+ display: "flex",
9556
+ justifyContent: "space-between",
9557
+ alignItems: "center",
9558
+ marginBottom: "16px",
9559
+ }, children: jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles, marginBottom: 0 }, children: "Teilnehmer" }) }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [watchedParticipants.map((_, index) => (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", gap: "12px", alignItems: "center" }, children: [jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-name-${index}`, style: labelStyles, children: "Name *" }), jsxRuntime.jsx("input", { id: `participant-name-${index}`, ...form.register(`participants.${index}.name`), type: "text", style: inputStyles, placeholder: "Teilnehmername" }), form.formState.errors.participants?.[index]?.name && (jsxRuntime.jsx("p", { style: errorTextStyles, children: form.formState.errors.participants[index]?.name?.message }))] }), jsxRuntime.jsxs("div", { style: { width: "80px" }, children: [jsxRuntime.jsx("label", { htmlFor: `participant-age-${index}`, style: labelStyles, children: "Alter" }), jsxRuntime.jsx("input", { id: `participant-age-${index}`, ...form.register(`participants.${index}.age`, {
8733
9560
  setValueAs: (value) => {
8734
9561
  if (value === "" || value === null || value === undefined) {
8735
9562
  return undefined;
@@ -8737,44 +9564,205 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
8737
9564
  const num = Number(value);
8738
9565
  return Number.isNaN(num) ? undefined : num;
8739
9566
  },
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");
9567
+ }), 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: {
9568
+ color: "var(--bw-error-color)",
9569
+ backgroundColor: "var(--bw-surface-color)",
9570
+ border: "1px solid var(--bw-border-color)",
9571
+ borderRadius: "50%",
9572
+ width: "36px",
9573
+ height: "36px",
9574
+ display: "flex",
9575
+ alignItems: "center",
9576
+ justifyContent: "center",
9577
+ cursor: "pointer",
9578
+ transition: "all 0.2s ease",
9579
+ fontSize: "24px",
9580
+ fontWeight: 700,
9581
+ fontFamily: "var(--bw-font-family)",
9582
+ padding: 0,
9583
+ }, children: "\u00D7" })] }))] }), upsells.length > 0 && (jsxRuntime.jsx("div", { style: participantUpsellStyles.container, children: upsells.map((upsell) => {
9584
+ const isSelected = (participantUpsells[index] || []).includes(upsell.id);
9585
+ 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));
9586
+ }) }))] }, index))), watchedParticipants.length < eventDetails.availableSpots ? (jsxRuntime.jsx("div", { style: {
9587
+ display: "flex",
9588
+ flexDirection: "column",
9589
+ alignItems: "center",
9590
+ marginTop: "12px",
9591
+ }, children: jsxRuntime.jsxs("button", { type: "button", onClick: addParticipant, style: {
9592
+ color: "#ffffff",
9593
+ fontSize: "14px",
9594
+ fontWeight: 600,
9595
+ padding: "8px 16px",
9596
+ borderRadius: "var(--bw-border-radius)",
9597
+ backgroundColor: "var(--bw-highlight-color)",
9598
+ border: "1px solid var(--bw-highlight-color)",
9599
+ cursor: "pointer",
9600
+ transition: "all 0.2s ease",
9601
+ marginBottom: "4px",
9602
+ fontFamily: "var(--bw-font-family)",
9603
+ boxShadow: "0 2px 8px 0 var(--bw-highlight-color)",
9604
+ }, 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: {
9605
+ ...inputStyles,
9606
+ resize: "vertical",
9607
+ minHeight: "80px",
9608
+ } })] }), 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: {
9609
+ color: "var(--bw-text-color)",
9610
+ fontWeight: 500,
9611
+ fontFamily: "var(--bw-font-family)",
9612
+ }, 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: {
9613
+ color: "var(--bw-text-color)",
9614
+ fontWeight: 500,
9615
+ fontFamily: "var(--bw-font-family)",
9616
+ }, 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) => {
9617
+ // Count how many participants have this upsell selected
9618
+ const countWithUpsell = watchedParticipants.filter((p, idx) => p.name.trim() && (participantUpsells[idx] || []).includes(upsell.id)).length;
9619
+ if (countWithUpsell === 0)
9620
+ return null;
9621
+ const upsellLineTotal = upsell.price * countWithUpsell;
9622
+ 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));
9623
+ })] })), 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: {
9624
+ fontFamily: "var(--bw-font-family)",
9625
+ color: totalDiscount > 0 ? "var(--bw-text-muted)" : "var(--bw-text-muted)",
9626
+ textDecoration: totalDiscount > 0 ? "line-through" : "none",
9627
+ }, children: formatCurrency(baseTotal) })] }), appliedDiscountCode && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [jsxRuntime.jsxs("span", { style: {
9628
+ color: "var(--bw-success-color)",
9629
+ fontFamily: "var(--bw-font-family)",
9630
+ fontSize: "14px",
9631
+ }, 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: {
9632
+ color: "var(--bw-success-color)",
9633
+ fontFamily: "var(--bw-font-family)",
9634
+ fontSize: "14px",
9635
+ }, children: ["Gutschein (", giftCard.code, "):"] }), jsxRuntime.jsxs("span", { style: { color: "var(--bw-success-color)", fontFamily: "var(--bw-font-family)" }, children: ["-", formatCurrency(giftCard.balanceToUse || giftCard.discountAmount)] })] }, giftCard.code)))] })), jsxRuntime.jsxs("div", { style: {
9636
+ borderTop: "1px solid var(--bw-border-color)",
9637
+ paddingTop: "12px",
9638
+ }, children: [hasDepositOption && (jsxRuntime.jsxs("div", { style: {
9639
+ display: "flex",
9640
+ gap: "8px",
9641
+ marginBottom: "16px",
9642
+ }, children: [jsxRuntime.jsxs("button", { type: "button", onClick: () => setPaymentOption("deposit"), style: {
9643
+ flex: 1,
9644
+ padding: "12px",
9645
+ borderRadius: "var(--bw-border-radius)",
9646
+ border: paymentOption === "deposit"
9647
+ ? "2px solid var(--bw-highlight-color)"
9648
+ : "1px solid var(--bw-border-color)",
9649
+ backgroundColor: paymentOption === "deposit"
9650
+ ? "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)"
9651
+ : "var(--bw-surface-color)",
9652
+ cursor: "pointer",
9653
+ fontFamily: "var(--bw-font-family)",
9654
+ transition: "all 0.2s ease",
9655
+ }, children: [jsxRuntime.jsx("div", { style: {
9656
+ fontSize: "13px",
9657
+ color: "var(--bw-text-muted)",
9658
+ marginBottom: "4px",
9659
+ }, children: "Anzahlung" }), jsxRuntime.jsx("div", { style: {
9660
+ fontSize: "18px",
9661
+ fontWeight: 700,
9662
+ color: paymentOption === "deposit"
9663
+ ? "var(--bw-highlight-color)"
9664
+ : "var(--bw-text-color)",
9665
+ }, children: formatCurrency(depositAmount) })] }), jsxRuntime.jsxs("button", { type: "button", onClick: () => setPaymentOption("full"), style: {
9666
+ flex: 1,
9667
+ padding: "12px",
9668
+ borderRadius: "var(--bw-border-radius)",
9669
+ border: paymentOption === "full"
9670
+ ? "2px solid var(--bw-highlight-color)"
9671
+ : "1px solid var(--bw-border-color)",
9672
+ backgroundColor: paymentOption === "full"
9673
+ ? "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)"
9674
+ : "var(--bw-surface-color)",
9675
+ cursor: "pointer",
9676
+ fontFamily: "var(--bw-font-family)",
9677
+ transition: "all 0.2s ease",
9678
+ }, children: [jsxRuntime.jsx("div", { style: {
9679
+ fontSize: "13px",
9680
+ color: "var(--bw-text-muted)",
9681
+ marginBottom: "4px",
9682
+ }, children: "Vollst\u00E4ndig bezahlen" }), jsxRuntime.jsx("div", { style: {
9683
+ fontSize: "18px",
9684
+ fontWeight: 700,
9685
+ color: paymentOption === "full"
9686
+ ? "var(--bw-highlight-color)"
9687
+ : "var(--bw-text-color)",
9688
+ }, children: formatCurrency(totalAmount) })] })] })), hasDepositOption && paymentOption === "deposit" && (jsxRuntime.jsxs("div", { style: {
9689
+ display: "flex",
9690
+ justifyContent: "space-between",
9691
+ alignItems: "center",
9692
+ fontSize: "14px",
9693
+ marginBottom: "8px",
9694
+ }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "Gesamtbetrag:" }), jsxRuntime.jsx("span", { style: {
9695
+ color: "var(--bw-text-muted)",
9696
+ fontFamily: "var(--bw-font-family)",
9697
+ fontWeight: 500,
9698
+ }, children: formatCurrency(totalAmount) })] })), jsxRuntime.jsxs("div", { style: {
9699
+ display: "flex",
9700
+ justifyContent: "space-between",
9701
+ alignItems: "center",
9702
+ fontSize: "18px",
9703
+ fontWeight: 600,
9704
+ }, children: [jsxRuntime.jsx("span", { style: { color: "var(--bw-text-color)", fontFamily: "var(--bw-font-family)" }, children: hasDepositOption && paymentOption === "deposit"
9705
+ ? "Heute zu zahlen (Anzahlung):"
9706
+ : "Gesamtbetrag:" }), jsxRuntime.jsx("span", { style: {
9707
+ color: "var(--bw-highlight-color)",
9708
+ fontFamily: "var(--bw-font-family)",
9709
+ fontWeight: 700,
9710
+ }, children: formatCurrency(paymentAmount) })] }), hasDepositOption && paymentOption === "deposit" && (jsxRuntime.jsxs("div", { style: {
9711
+ fontSize: "12px",
9712
+ color: "var(--bw-text-muted)",
9713
+ fontFamily: "var(--bw-font-family)",
9714
+ marginTop: "8px",
9715
+ textAlign: "right",
9716
+ }, children: ["Restbetrag (", formatCurrency(totalAmount - depositAmount), ") vor Ort f\u00E4llig."] }))] })] })] }), jsxRuntime.jsx("div", { ref: paymentSectionRef, children: stripePromise &&
9717
+ (() => {
9718
+ if (!isReadyForPayment()) {
9719
+ const participantsWithNames = watchedParticipants.filter((p) => p.name.trim()).length;
9720
+ const totalParticipantRows = watchedParticipants.length;
9721
+ const participantsWithoutNames = totalParticipantRows - participantsWithNames;
9722
+ const missing = [];
9723
+ if (participantsWithNames === 0) {
9724
+ missing.push("mindestens einen Teilnehmer mit Namen");
9725
+ }
9726
+ else if (participantsWithoutNames > 0) {
9727
+ missing.push(`Namen für alle ${totalParticipantRows} Teilnehmer`);
9728
+ }
9729
+ if (participantsWithNames > (eventDetails?.availableSpots || 0)) {
9730
+ missing.push(`die Anzahl der Teilnehmer auf ${eventDetails?.availableSpots || 0} zu reduzieren`);
9731
+ }
9732
+ // Check for empty or invalid name (min 2 chars required)
9733
+ if (!watchedCustomerName || watchedCustomerName.trim().length < 2 || customerNameError) {
9734
+ missing.push("einen gültigen Kontaktnamen");
9735
+ }
9736
+ // Check for empty or invalid email
9737
+ if (!watchedCustomerEmail || watchedCustomerEmail.trim().length === 0 || customerEmailError) {
9738
+ missing.push("eine gültige E-Mail-Adresse");
9739
+ }
9740
+ if (!watchedAcceptTerms) {
9741
+ missing.push("die Akzeptanz der AGBs");
9742
+ }
9743
+ const message = missing.length > 0
9744
+ ? `Wir benötigen mindestens ${missing.join(", ")} um fortzufahren.`
9745
+ : "Bitte fülle alle Pflichtfelder aus, um fortzufahren.";
9746
+ return (jsxRuntime.jsx("div", { style: {
9747
+ ...cardStyles,
9748
+ borderColor: "var(--bw-warning-color)",
9749
+ color: "var(--bw-warning-color)",
9750
+ fontFamily: "var(--bw-font-family)",
9751
+ textAlign: "center",
9752
+ }, children: message }));
8762
9753
  }
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
- })()] })] })] }) }));
9754
+ return (jsxRuntime.jsxs("div", { style: cardStyles, children: [jsxRuntime.jsx("h2", { style: { ...sectionHeaderStyles }, children: "Zahlung" }), jsxRuntime.jsx(PaymentForm, { config: config, eventDetails: eventDetails, formData: form.getValues(), totalAmount: paymentAmount, discountCode: appliedDiscountCode
9755
+ ? {
9756
+ id: appliedDiscountCode.id,
9757
+ code: appliedDiscountCode.code,
9758
+ description: appliedDiscountCode.description || undefined,
9759
+ type: appliedDiscountCode.discountType || "percentage",
9760
+ value: appliedDiscountCode.discountValue || 0,
9761
+ discountAmount: appliedDiscountCode.discountAmount,
9762
+ newTotal: appliedDiscountCode.newTotal,
9763
+ }
9764
+ : null, giftCards: appliedGiftCards, onSuccess: onSuccess, onError: onError, systemConfig: systemConfig ?? null, stripePromise: stripePromise, stripeAppearance: stripeAppearance, upsellSelections: aggregatedUpsellSelections() })] }));
9765
+ })() })] })] })] }) }));
8778
9766
  }
8779
9767
 
8780
9768
  /**
@@ -8918,6 +9906,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
8918
9906
  order: data.order,
8919
9907
  payments: data.payments,
8920
9908
  orderItems: data.orderItems,
9909
+ purchases: data.purchases || [],
8921
9910
  stripePaymentIntent: data.stripePaymentIntent,
8922
9911
  });
8923
9912
  setEventDetails({
@@ -8926,7 +9915,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
8926
9915
  description: data.booking.eventInstance.eventType.description,
8927
9916
  startTime: data.booking.eventInstance.startTime,
8928
9917
  endTime: data.booking.eventInstance.endTime,
8929
- price: data.order.total / data.booking.participantCount,
9918
+ price: data.booking.eventInstance.price || 0, // Use actual event instance price
8930
9919
  });
8931
9920
  setFormData({
8932
9921
  customerEmail: data.booking.customerEmail,
@@ -9005,18 +9994,21 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9005
9994
  fontFamily: "var(--bw-font-family)",
9006
9995
  padding: "var(--bw-spacing-large)",
9007
9996
  maxWidth: "100%",
9008
- }, children: [jsxRuntime.jsxs("div", { className: "flex justify-between items-center print-hidden", style: {
9997
+ }, children: [jsxRuntime.jsxs("div", { className: "print-hidden", style: {
9009
9998
  marginBottom: "var(--bw-spacing-large)",
9010
9999
  display: "flex",
9011
10000
  alignItems: "center",
9012
10001
  justifyContent: "space-between",
9013
- }, children: [jsxRuntime.jsxs("h1", { className: "font-bold text-3xl flex items-center gap-2", style: {
10002
+ }, children: [jsxRuntime.jsxs("h1", { style: {
9014
10003
  color: "var(--bw-text-color)",
9015
10004
  fontFamily: "var(--bw-font-family)",
9016
10005
  marginBottom: "var(--bw-spacing-large)",
9017
10006
  display: "flex",
9018
10007
  alignItems: "center",
9019
10008
  gap: "var(--bw-spacing-small)",
10009
+ fontWeight: 700,
10010
+ fontSize: "24px",
10011
+ margin: 0,
9020
10012
  }, children: [jsxRuntime.jsx("div", { style: {
9021
10013
  width: "32px",
9022
10014
  height: "32px",
@@ -9052,24 +10044,26 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9052
10044
  color: "var(--bw-text-color)",
9053
10045
  margin: "0",
9054
10046
  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: {
10047
+ }, 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
10048
  display: "grid",
9057
10049
  gridTemplateColumns: "1fr 1fr",
9058
10050
  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: {
10051
+ }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", style: { marginBottom: "span 2" }, children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9060
10052
  color: "var(--bw-text-muted)",
9061
10053
  fontSize: "var(--bw-font-size-small)",
9062
10054
  fontFamily: "var(--bw-font-family)",
9063
- }, children: "Buchungs-ID" }), jsxRuntime.jsx("p", { className: "font-semibold print-detail-value", style: {
10055
+ fontWeight: 500,
10056
+ }, children: "Buchungs-ID" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9064
10057
  fontWeight: "600",
9065
10058
  color: "var(--bw-text-color)",
9066
10059
  fontFamily: "var(--bw-font-family)",
9067
10060
  fontSize: "var(--bw-font-size-medium)",
9068
10061
  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: {
10062
+ }, children: booking.bookingHash })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9070
10063
  color: "var(--bw-text-muted)",
9071
10064
  fontSize: "var(--bw-font-size-small)",
9072
10065
  fontFamily: "var(--bw-font-family)",
10066
+ fontWeight: 500,
9073
10067
  }, children: "Bezahl-Status" }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { className: "print-hidden", style: {
9074
10068
  backgroundColor: "var(--bw-success-color, #10B981)",
9075
10069
  color: "white",
@@ -9082,34 +10076,37 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9082
10076
  ? "erfolgreich"
9083
10077
  : paymentStatus === "canceled" || paymentStatus === "failed"
9084
10078
  ? "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: {
10079
+ : "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
10080
  color: "var(--bw-text-muted)",
9087
10081
  fontSize: "var(--bw-font-size-small)",
9088
10082
  fontFamily: "var(--bw-font-family)",
9089
- }, children: "Event" }), jsxRuntime.jsx("p", { className: "font-semibold print-detail-value", style: {
10083
+ fontWeight: 500,
10084
+ }, children: "Event" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9090
10085
  fontWeight: "600",
9091
10086
  color: "var(--bw-text-color)",
9092
10087
  fontFamily: "var(--bw-font-family)",
9093
10088
  fontSize: "var(--bw-font-size-large)",
9094
10089
  margin: "0 0 6px 0",
9095
- }, children: eventDetails.name })] }), jsxRuntime.jsxs("div", { className: "gap-4 grid grid-cols-2 print-detail-grid", style: {
10090
+ }, children: eventDetails.name })] }), jsxRuntime.jsxs("div", { className: "print-detail-grid", style: {
9096
10091
  display: "grid",
9097
10092
  gridTemplateColumns: "1fr 1fr",
9098
10093
  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: {
10094
+ }, children: [jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9100
10095
  color: "var(--bw-text-muted)",
9101
10096
  fontSize: "var(--bw-font-size-small)",
9102
10097
  fontFamily: "var(--bw-font-family)",
10098
+ fontWeight: 500,
9103
10099
  }, children: "Datum" }), jsxRuntime.jsx("p", { className: "print-detail-value", style: {
9104
10100
  fontWeight: "600",
9105
10101
  color: "var(--bw-text-color)",
9106
10102
  fontFamily: "var(--bw-font-family)",
9107
10103
  fontSize: "var(--bw-font-size-large)",
9108
10104
  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: {
10105
+ }, children: formatDate12(eventDetails.startTime) })] }), jsxRuntime.jsxs("div", { className: "print-detail-item", children: [jsxRuntime.jsx("div", { className: "print-detail-label", style: {
9110
10106
  color: "var(--bw-text-muted)",
9111
10107
  fontSize: "var(--bw-font-size-small)",
9112
10108
  fontFamily: "var(--bw-font-family)",
10109
+ fontWeight: 500,
9113
10110
  }, children: "Zeit" }), jsxRuntime.jsxs("p", { className: "print-detail-value", style: {
9114
10111
  fontWeight: "600",
9115
10112
  color: "var(--bw-text-color)",
@@ -9127,13 +10124,13 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9127
10124
  color: "var(--bw-text-color)",
9128
10125
  margin: "0",
9129
10126
  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: {
10127
+ }, 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
10128
  display: "flex",
9132
10129
  flexDirection: "column",
9133
10130
  gap: "var(--bw-spacing-small)",
9134
10131
  }, children: formData.participants
9135
10132
  .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: {
10133
+ .map((participant, index) => (jsxRuntime.jsx("div", { className: "print-participant", style: {
9137
10134
  display: "flex",
9138
10135
  justifyContent: "space-between",
9139
10136
  alignItems: "center",
@@ -9143,7 +10140,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9143
10140
  }, children: jsxRuntime.jsxs("div", { className: "print-participant-info", children: [jsxRuntime.jsx("div", { className: "print-participant-name", style: {
9144
10141
  color: "var(--bw-text-color)",
9145
10142
  fontFamily: "var(--bw-font-family)",
9146
- }, children: participant.name }), participant.age && (jsxRuntime.jsxs("div", { className: "text-muted-foreground text-sm print-participant-age", style: {
10143
+ }, children: participant.name }), participant.age && (jsxRuntime.jsxs("div", { className: "print-participant-age", style: {
9147
10144
  color: "var(--bw-text-muted)",
9148
10145
  fontSize: "var(--bw-font-size-small)",
9149
10146
  fontFamily: "var(--bw-font-family)",
@@ -9159,7 +10156,14 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9159
10156
  color: "var(--bw-text-color)",
9160
10157
  margin: "0",
9161
10158
  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: {
10159
+ }, 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: {
10160
+ display: "flex",
10161
+ justifyContent: "space-between",
10162
+ alignItems: "center",
10163
+ borderTop: "1px solid var(--bw-border-color)",
10164
+ paddingTop: "var(--bw-spacing-small)",
10165
+ marginTop: "var(--bw-spacing-small)"
10166
+ }, 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
10167
  backgroundColor: "var(--bw-surface-color)",
9164
10168
  border: `1px solid var(--bw-border-color)`,
9165
10169
  borderRadius: "var(--bw-border-radius)",
@@ -9171,7 +10175,7 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
9171
10175
  color: "var(--bw-text-color)",
9172
10176
  margin: "0",
9173
10177
  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: {
10178
+ }, 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
10179
  backgroundColor: "var(--bw-surface-color)",
9176
10180
  border: `1px solid var(--bw-border-color)`,
9177
10181
  borderRadius: "var(--bw-border-radius)",
@@ -9258,9 +10262,51 @@ function EventTypeDetailsDialog({ isOpen, onClose, eventType, onEventTypeSelect,
9258
10262
  onEventTypeSelect(eventType);
9259
10263
  onClose();
9260
10264
  };
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
10265
+ return (jsxRuntime.jsx(DialogWrapper, { isOpen: isOpen, onClose: onClose, maxWidth: "700px", children: jsxRuntime.jsxs("div", { style: { padding: "24px" }, children: [jsxRuntime.jsxs("div", { style: {
10266
+ marginBottom: "24px",
10267
+ padding: "16px",
10268
+ backgroundColor: "var(--bw-background-color)",
10269
+ borderRadius: "var(--bw-border-radius)",
10270
+ border: "1px solid var(--bw-border-color)",
10271
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { style: {
10272
+ fontSize: "14px",
10273
+ fontWeight: 600,
10274
+ color: "var(--bw-highlight-color)",
10275
+ marginBottom: "8px",
10276
+ fontFamily: "var(--bw-font-family)",
10277
+ }, children: eventType.category.name }), jsxRuntime.jsx("h2", { style: {
10278
+ fontSize: "28px",
10279
+ fontWeight: 700,
10280
+ color: "var(--bw-text-color)",
10281
+ marginBottom: "16px",
10282
+ lineHeight: 1.25,
10283
+ fontFamily: "var(--bw-font-family)",
10284
+ margin: "0 0 16px 0",
10285
+ }, 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: {
10286
+ listStyle: "none",
10287
+ padding: 0,
10288
+ margin: 0,
10289
+ display: "flex",
10290
+ flexDirection: "column",
10291
+ gap: "2px",
10292
+ }, children: eventType.highlights
9262
10293
  .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: {
10294
+ .map((highlight, index) => (jsxRuntime.jsxs("li", { style: {
10295
+ display: "flex",
10296
+ alignItems: "flex-start",
10297
+ gap: "10px",
10298
+ fontFamily: "var(--bw-font-family)",
10299
+ fontSize: "16px",
10300
+ lineHeight: 1.625,
10301
+ color: "var(--bw-text-color)",
10302
+ }, 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: {
10303
+ marginBottom: "24px",
10304
+ color: "var(--bw-text-muted)",
10305
+ fontSize: "16px",
10306
+ lineHeight: 1.625,
10307
+ fontFamily: "var(--bw-font-family)",
10308
+ padding: "0 20px",
10309
+ }, children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: {
9264
10310
  __html: `
9265
10311
  .markdown-content p {
9266
10312
  margin: 0 0 12px 0 !important;
@@ -9332,11 +10378,76 @@ function EventTypeDetailsDialog({ isOpen, onClose, eventType, onEventTypeSelect,
9332
10378
  text-decoration: none !important;
9333
10379
  }
9334
10380
  `,
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" }) }))] }) }));
10381
+ } }), jsxRuntime.jsx("div", { className: "markdown-content", children: Markdown({ children: preprocessMarkdown$1(eventType.description) }) })] })), jsxRuntime.jsxs("div", { style: {
10382
+ display: "flex",
10383
+ justifyContent: "space-between",
10384
+ alignItems: "center",
10385
+ marginTop: "32px",
10386
+ padding: "20px",
10387
+ backgroundColor: "var(--bw-background-color)",
10388
+ borderRadius: "var(--bw-border-radius)",
10389
+ border: "1px solid var(--bw-border-color)",
10390
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { style: {
10391
+ fontWeight: 700,
10392
+ color: "var(--bw-text-color)",
10393
+ fontFamily: "var(--bw-font-family)",
10394
+ textAlign: "left",
10395
+ }, children: eventType.groupedDurations && jsxRuntime.jsx("span", { children: eventType.groupedDurations }) }), jsxRuntime.jsx("div", { style: {
10396
+ fontSize: "clamp(1.72rem, 4vw, 32px)",
10397
+ fontWeight: 700,
10398
+ color: "var(--bw-text-color)",
10399
+ fontFamily: "var(--bw-font-family)",
10400
+ textAlign: "right",
10401
+ }, children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), isAvailable && (jsxRuntime.jsxs("button", { onClick: handleBookingClick, style: {
10402
+ backgroundColor: "var(--bw-highlight-color)",
10403
+ color: "#ffffff",
10404
+ padding: "14px 28px",
10405
+ border: "none",
10406
+ borderRadius: "var(--bw-border-radius)",
10407
+ fontSize: "16px",
10408
+ fontWeight: 600,
10409
+ fontFamily: "var(--bw-font-family)",
10410
+ display: "flex",
10411
+ alignItems: "center",
10412
+ gap: "8px",
10413
+ cursor: "pointer",
10414
+ transition: "all 0.2s ease",
10415
+ }, children: [jsxRuntime.jsx(IconWave, { size: 20, color: "white" }), "Jetzt buchen"] }))] }), !isAvailable && (jsxRuntime.jsx("div", { style: {
10416
+ position: "absolute",
10417
+ inset: 0,
10418
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
10419
+ backdropFilter: "blur(4px)",
10420
+ display: "flex",
10421
+ alignItems: "center",
10422
+ justifyContent: "center",
10423
+ borderRadius: "var(--bw-border-radius)",
10424
+ }, children: jsxRuntime.jsx("div", { style: {
10425
+ backgroundColor: "rgba(255, 255, 255, 0.9)",
10426
+ padding: "16px 32px",
10427
+ borderRadius: "var(--bw-border-radius)",
10428
+ color: "var(--bw-text-color)",
10429
+ fontWeight: 600,
10430
+ fontSize: "18px",
10431
+ fontFamily: "var(--bw-font-family)",
10432
+ boxShadow: "var(--bw-shadow-md)",
10433
+ }, children: "Ausgebucht" }) }))] }) }));
9336
10434
  }
9337
10435
 
9338
10436
  // 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" })] }) }));
10437
+ const EventImagePlaceholder = () => (jsxRuntime.jsx("div", { style: {
10438
+ width: "100%",
10439
+ height: "100%",
10440
+ background: "linear-gradient(to bottom right, rgba(var(--bw-highlight-color-rgb), 0.2), var(--bw-highlight-color))",
10441
+ display: "flex",
10442
+ alignItems: "center",
10443
+ justifyContent: "center",
10444
+ overflow: "hidden",
10445
+ position: "relative",
10446
+ }, children: jsxRuntime.jsxs("svg", { width: "60%", height: "60%", viewBox: "0 0 120 40", preserveAspectRatio: "xMidYMid meet", style: {
10447
+ position: "absolute",
10448
+ opacity: 0.18,
10449
+ filter: "blur(0.5px)",
10450
+ }, 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
10451
  // Image Carousel Component with smooth slide animations
9341
10452
  const ImageCarousel = ({ images, eventName }) => {
9342
10453
  const [currentIndex, setCurrentIndex] = React__default.useState(0);
@@ -9368,16 +10479,92 @@ const ImageCarousel = ({ images, eventName }) => {
9368
10479
  if (images.length === 0) {
9369
10480
  return jsxRuntime.jsx(EventImagePlaceholder, {});
9370
10481
  }
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: {
10482
+ return (jsxRuntime.jsxs("div", { style: {
10483
+ position: "relative",
10484
+ width: "100%",
10485
+ height: "100%",
10486
+ overflow: "hidden",
10487
+ borderRadius: "inherit",
10488
+ }, children: [jsxRuntime.jsx("div", { style: {
10489
+ display: "flex",
10490
+ height: "100%",
10491
+ transition: "transform 0.4s cubic-bezier(0.4, 0, 0.2, 1)",
9372
10492
  width: `${images.length * 100}%`,
9373
10493
  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" }))] }));
10494
+ }, children: images.map((image, index) => (jsxRuntime.jsx("div", { style: {
10495
+ height: "100%",
10496
+ flexShrink: 0,
10497
+ overflow: "hidden",
10498
+ position: "relative",
10499
+ borderRadius: "inherit",
10500
+ width: `${100 / images.length}%`,
10501
+ }, children: jsxRuntime.jsx("img", { src: image, alt: `${eventName} - Bild ${index + 1}`, style: {
10502
+ width: "100%",
10503
+ height: "100%",
10504
+ objectFit: "cover",
10505
+ display: "block",
10506
+ position: "absolute",
10507
+ top: 0,
10508
+ left: 0,
10509
+ borderRadius: "inherit",
10510
+ } }) }, index))) }), images.length > 1 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { onClick: prevImage, disabled: isTransitioning, style: {
10511
+ position: "absolute",
10512
+ left: "12px",
10513
+ top: "50%",
10514
+ transform: "translateY(-50%)",
10515
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
10516
+ border: "none",
10517
+ borderRadius: "50%",
10518
+ width: "40px",
10519
+ height: "40px",
10520
+ display: "flex",
10521
+ alignItems: "center",
10522
+ justifyContent: "center",
10523
+ transition: "all 0.2s ease",
10524
+ zIndex: 2,
10525
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10526
+ opacity: isTransitioning ? 0.5 : 1,
10527
+ }, children: jsxRuntime.jsx(IconChevronLeft, { size: 20, color: "white" }) }), jsxRuntime.jsx("button", { onClick: nextImage, disabled: isTransitioning, style: {
10528
+ position: "absolute",
10529
+ right: "12px",
10530
+ top: "50%",
10531
+ transform: "translateY(-50%)",
10532
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
10533
+ border: "none",
10534
+ borderRadius: "50%",
10535
+ width: "40px",
10536
+ height: "40px",
10537
+ display: "flex",
10538
+ alignItems: "center",
10539
+ justifyContent: "center",
10540
+ transition: "all 0.2s ease",
10541
+ zIndex: 2,
10542
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10543
+ opacity: isTransitioning ? 0.5 : 1,
10544
+ }, children: jsxRuntime.jsx(IconChevronRight, { size: 20, color: "white" }) })] })), images.length > 1 && (jsxRuntime.jsx("div", { style: {
10545
+ position: "absolute",
10546
+ bottom: "12px",
10547
+ left: "50%",
10548
+ transform: "translateX(-50%)",
10549
+ display: "flex",
10550
+ gap: "8px",
10551
+ zIndex: 2,
10552
+ }, children: images.map((_, index) => (jsxRuntime.jsx("button", { onClick: (e) => goToImage(index, e), disabled: isTransitioning, style: {
10553
+ height: "8px",
10554
+ border: "none",
10555
+ borderRadius: "var(--bw-border-radius)",
10556
+ transition: "all 0.3s ease",
10557
+ cursor: isTransitioning ? "not-allowed" : "pointer",
10558
+ opacity: isTransitioning ? 0.7 : 1,
10559
+ width: index === currentIndex ? "16px" : "8px",
10560
+ backgroundColor: index === currentIndex ? "#ffffff" : "rgba(255, 255, 255, 0.5)",
10561
+ } }, index))) })), isTransitioning && (jsxRuntime.jsx("div", { style: {
10562
+ position: "absolute",
10563
+ inset: 0,
10564
+ backgroundColor: "rgba(0, 0, 0, 0.1)",
10565
+ zIndex: 1,
10566
+ pointerEvents: "none",
10567
+ } }))] }));
9381
10568
  };
9382
10569
 
9383
10570
  // Helper function to preprocess markdown for underline support
@@ -9403,160 +10590,240 @@ function EventTypeSelection({ eventTypes, onEventTypeSelect, isLoading = false,
9403
10590
  if (isLoading) {
9404
10591
  return jsxRuntime.jsx(EventCardSkeleton, { count: skeletonCount });
9405
10592
  }
9406
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("style", { dangerouslySetInnerHTML: {
9407
- __html: `
9408
- @media (max-width: 600px) {
9409
- .event-type-list {
9410
- padding: 8px !important;
9411
- gap: 12px !important;
9412
- }
9413
- .event-type-card {
9414
- max-width: 100% !important;
9415
- flex: 1 1 100% !important;
9416
- padding: 0 !important;
9417
- }
9418
- .event-type-img {
9419
- height: 160px !important;
9420
- }
9421
- .event-type-title {
9422
- font-size: 1.1rem !important;
9423
- }
9424
- .event-type-desc {
9425
- font-size: 0.8rem !important;
9426
- min-height: 100px !important;
9427
- max-height: 100px !important;
9428
- }
9429
- .event-type-content {
9430
- padding: 16px 24px !important;
9431
- }
9432
- }
9433
-
9434
- /* Markdown content styling for event type cards */
9435
- .event-type-markdown {
9436
- overflow: visible !important;
9437
- }
9438
- .event-type-markdown p {
9439
- margin: 0 0 8px 0;
9440
- color: var(--bw-text-muted);
9441
- font-family: var(--bw-font-family);
9442
- line-height: 1.6;
9443
- }
9444
- .event-type-markdown p:last-child {
9445
- margin-bottom: 0;
9446
- }
9447
- .event-type-markdown h2 {
9448
- font-size: 18px !important;
9449
- font-weight: 700 !important;
9450
- color: var(--bw-text-color) !important;
9451
- margin: 12px 0 6px 0 !important;
9452
- line-height: 1.3 !important;
9453
- }
9454
- .event-type-markdown h3 {
9455
- font-size: 16px !important;
9456
- font-weight: 600 !important;
9457
- color: var(--bw-text-color) !important;
9458
- margin: 10px 0 4px 0 !important;
9459
- line-height: 1.3 !important;
9460
- }
9461
- .event-type-markdown strong {
9462
- font-weight: 600;
9463
- color: var(--bw-text-color);
9464
- }
9465
- .event-type-markdown em {
9466
- font-style: italic;
9467
- }
9468
- .event-type-markdown u {
9469
- text-decoration: underline;
9470
- }
9471
- .event-type-markdown ul {
9472
- margin: 6px 0 !important;
9473
- padding: 0 !important;
9474
- padding-left: 24px !important;
9475
- list-style: none !important;
9476
- position: relative !important;
9477
- }
9478
- .event-type-markdown ul li {
9479
- margin-bottom: 2px !important;
9480
- padding-left: 0 !important;
9481
- position: relative !important;
9482
- color: var(--bw-text-muted) !important;
9483
- font-family: var(--bw-font-family) !important;
9484
- }
9485
- .event-type-markdown ul li::before {
9486
- content: "•" !important;
9487
- color: var(--bw-text-color) !important;
9488
- position: absolute !important;
9489
- left: -16px !important;
9490
- top: 0 !important;
9491
- font-weight: bold !important;
9492
- }
9493
- .event-type-markdown ol {
9494
- margin: 6px 0 !important;
9495
- padding: 0 !important;
9496
- padding-left: 24px !important;
9497
- counter-reset: list-counter !important;
9498
- list-style: none !important;
9499
- position: relative !important;
9500
- }
9501
- .event-type-markdown ol li {
9502
- margin-bottom: 2px !important;
9503
- padding-left: 0 !important;
9504
- position: relative !important;
9505
- counter-increment: list-counter !important;
9506
- color: var(--bw-text-muted) !important;
9507
- font-family: var(--bw-font-family) !important;
9508
- }
9509
- .event-type-markdown ol li::before {
9510
- content: counter(list-counter) "." !important;
9511
- color: var(--bw-text-color) !important;
9512
- position: absolute !important;
9513
- left: -20px !important;
9514
- top: 0 !important;
9515
- font-weight: bold !important;
9516
- }
9517
- .event-type-markdown blockquote {
9518
- margin: 4px 0;
9519
- padding-left: 12px;
9520
- border-left: 2px solid var(--bw-border-color);
9521
- font-style: italic;
9522
- color: var(--bw-text-muted);
9523
- }
9524
- .event-type-markdown a {
9525
- color: var(--bw-highlight-color);
9526
- text-decoration: underline;
9527
- }
9528
- `,
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) => {
10593
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [eventTypes.length === 0 ? (jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
10594
+ backgroundColor: "var(--bw-surface-color)",
10595
+ border: "1px solid var(--bw-border-color)",
10596
+ borderRadius: "var(--bw-border-radius)",
10597
+ padding: "24px",
10598
+ textAlign: "center",
10599
+ fontFamily: "var(--bw-font-family)",
10600
+ minHeight: "400px",
10601
+ display: "flex",
10602
+ flexDirection: "column",
10603
+ alignItems: "center",
10604
+ justifyContent: "center",
10605
+ }, children: [jsxRuntime.jsx("div", { style: {
10606
+ width: "64px",
10607
+ height: "64px",
10608
+ backgroundColor: "var(--bw-highlight-color)",
10609
+ borderRadius: "50%",
10610
+ margin: "0 auto 16px auto",
10611
+ display: "flex",
10612
+ alignItems: "center",
10613
+ justifyContent: "center",
10614
+ fontSize: "32px",
10615
+ color: "#ffffff",
10616
+ opacity: 0.8,
10617
+ }, children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { style: {
10618
+ fontSize: "20px",
10619
+ fontWeight: 600,
10620
+ color: "var(--bw-text-color)",
10621
+ margin: "0 0 8px 0",
10622
+ fontFamily: "var(--bw-font-family)",
10623
+ }, children: "Keine Veranstaltungen verf\u00FCgbar" }), jsxRuntime.jsx("p", { style: {
10624
+ color: "var(--bw-text-muted)",
10625
+ fontSize: "16px",
10626
+ lineHeight: 1.6,
10627
+ margin: "0 0 24px 0",
10628
+ fontFamily: "var(--bw-font-family)",
10629
+ maxWidth: "400px",
10630
+ }, 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: {
10631
+ backgroundColor: "var(--bw-surface-color)",
10632
+ color: "var(--bw-highlight-color)",
10633
+ padding: "12px 24px",
10634
+ border: "1px solid var(--bw-highlight-color)",
10635
+ borderRadius: "var(--bw-border-radius)",
10636
+ fontSize: "16px",
10637
+ fontWeight: 600,
10638
+ cursor: "pointer",
10639
+ fontFamily: "var(--bw-font-family)",
10640
+ transition: "all 0.2s ease",
10641
+ display: "flex",
10642
+ alignItems: "center",
10643
+ gap: "8px",
10644
+ }, 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: {
10645
+ display: "grid",
10646
+ gridTemplateColumns: "repeat(auto-fill, minmax(350px, 1fr))",
10647
+ gap: "24px",
10648
+ gridAutoRows: "1fr",
10649
+ }, children: eventTypes.map((eventType) => {
9530
10650
  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
10651
+ return (jsxRuntime.jsxs("div", { className: "event-type-card", style: {
10652
+ position: "relative",
10653
+ backgroundColor: "var(--bw-surface-color)",
10654
+ border: "1px solid var(--bw-border-color)",
10655
+ borderRadius: "var(--bw-border-radius)",
10656
+ overflow: "hidden",
10657
+ transition: "all 0.3s ease",
10658
+ boxShadow: "var(--bw-shadow-md)",
10659
+ fontFamily: "var(--bw-font-family)",
10660
+ cursor: isAvailable ? "pointer" : "not-allowed",
10661
+ opacity: isAvailable ? 1 : 0.6,
10662
+ }, onClick: () => isAvailable && onEventTypeSelect(eventType), children: [jsxRuntime.jsx("div", { style: { position: "absolute", top: "16px", right: "16px", zIndex: 10 }, children: jsxRuntime.jsx("div", { style: {
10663
+ padding: "4px 8px",
10664
+ borderRadius: "var(--bw-border-radius-small)",
10665
+ fontSize: "12px",
10666
+ fontWeight: 600,
10667
+ color: "#ffffff",
10668
+ fontFamily: "var(--bw-font-family)",
10669
+ backgroundColor: isAvailable
10670
+ ? "var(--bw-success-color)"
10671
+ : "var(--bw-error-color)",
10672
+ }, children: isAvailable ? "freie Plätze" : "Ausgebucht" }) }), jsxRuntime.jsx("div", { style: { position: "absolute", top: "16px", left: "16px", zIndex: 10 }, children: jsxRuntime.jsx("div", { style: {
10673
+ fontSize: "13px",
10674
+ color: "var(--bw-surface-color)",
10675
+ fontWeight: 600,
10676
+ backgroundColor: "var(--bw-highlight-color)",
10677
+ padding: "2px 8px",
10678
+ borderRadius: "var(--bw-border-radius)",
10679
+ fontFamily: "var(--bw-font-family)",
10680
+ }, 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: {
10681
+ padding: "12px 18px",
10682
+ display: "flex",
10683
+ flexDirection: "column",
10684
+ justifyContent: "space-between",
10685
+ height: "400px",
10686
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { className: "event-type-title", style: {
10687
+ fontSize: "clamp(1.1rem, 2.5vw, 24px)",
10688
+ fontWeight: 700,
10689
+ color: "var(--bw-text-color)",
10690
+ lineHeight: 1.25,
10691
+ fontFamily: "var(--bw-font-family)",
10692
+ margin: "0 0 12px 0",
10693
+ }, 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: {
10694
+ fontFamily: "var(--bw-font-family)",
10695
+ fontSize: "14px",
10696
+ color: "var(--bw-text-muted)",
10697
+ }, children: eventType.nextAvailableDate
9534
10698
  ? `Freie Plätze ab ${formatDate(eventType.nextAvailableDate)}`
9535
- : "Keine Termine frei" })] }), jsxRuntime.jsx("div", { className: "cursor-pointer", onClick: (e) => {
10699
+ : "Keine Termine frei" })] }), jsxRuntime.jsx("div", { style: { cursor: "pointer" }, onClick: (e) => {
9536
10700
  e.stopPropagation();
9537
10701
  handleShowDetails(eventType);
9538
10702
  }, children: eventType.highlights && eventType.highlights.length > 0 ? (
9539
10703
  // 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",
10704
+ // Uses em-based sizing so it scales with font size
10705
+ // Fixed 5 rows * 1.5em line-height = 7.5em total
10706
+ jsxRuntime.jsx("div", { className: "event-type-highlights", style: {
10707
+ margin: "10px 0",
10708
+ height: "7.5em", // Fixed height in em units
10709
+ fontSize: "clamp(0.9rem, 2vw, 15px)",
10710
+ }, children: jsxRuntime.jsx("ul", { style: {
10711
+ listStyle: "none",
10712
+ padding: 0,
10713
+ margin: 0,
10714
+ display: "grid",
10715
+ // 5 rows of exactly 1.5em each (lineHeight)
10716
+ gridTemplateRows: "repeat(5, 1.5em)",
10717
+ gap: 0,
10718
+ overflow: "hidden",
9544
10719
  }, children: eventType.highlights
9545
10720
  .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: {
10721
+ .slice(0, 5)
10722
+ .map((highlight, index) => (jsxRuntime.jsxs("li", { style: {
10723
+ display: "flex",
10724
+ alignItems: "center",
10725
+ gap: "0.5em",
10726
+ fontFamily: "var(--bw-font-family)",
10727
+ lineHeight: 1.5,
10728
+ height: "1.5em",
10729
+ color: "var(--bw-text-muted)",
10730
+ overflow: "hidden",
10731
+ }, children: [jsxRuntime.jsx("div", { style: { flexShrink: 0, display: "flex", alignItems: "center" }, children: jsxRuntime.jsx(IconCheck, { size: 14, color: "var(--bw-success-color)" }) }), jsxRuntime.jsx("span", { style: {
10732
+ whiteSpace: "nowrap",
10733
+ overflow: "hidden",
10734
+ textOverflow: "ellipsis",
10735
+ flex: 1,
10736
+ }, children: highlight.trim() })] }, index))) }) })) : eventType.description ? (jsxRuntime.jsx("div", { className: "event-type-desc", style: {
10737
+ color: "var(--bw-text-muted)",
10738
+ fontSize: "clamp(0.9rem, 2vw, 15px)",
10739
+ lineHeight: 1.5,
10740
+ fontFamily: "var(--bw-font-family)",
10741
+ margin: "10px 0",
10742
+ height: "7.5em", // Same height as highlights
10743
+ overflow: "hidden",
10744
+ textAlign: "left",
10745
+ }, children: jsxRuntime.jsx("div", { className: "event-type-markdown", style: {
9547
10746
  display: "-webkit-box",
9548
10747
  WebkitLineClamp: 5,
9549
10748
  WebkitBoxOrient: "vertical",
9550
10749
  overflow: "hidden",
9551
10750
  }, children: Markdown({
9552
10751
  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
10752
+ }) }) })) : (jsxRuntime.jsx("div", { className: "event-type-desc", style: {
10753
+ margin: "10px 0",
10754
+ height: "7.5em", // Same height as highlights
10755
+ }, children: "\u00A0" })) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "event-type-price", style: {
10756
+ fontWeight: 700,
10757
+ color: "var(--bw-text-color)",
10758
+ fontFamily: "var(--bw-font-family)",
10759
+ textAlign: "right",
10760
+ }, children: eventType.groupedDurations.length > 1 ? (jsxRuntime.jsx("span", { children: eventType.groupedDurations })) : (jsxRuntime.jsx("span", { children: eventType.cheapestDurationPerDay % 60 === 0
9554
10761
  ? `${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 ||
10762
+ : `${eventType.cheapestDurationPerDay} Minuten` })) }), jsxRuntime.jsx("div", { className: "event-type-price", style: {
10763
+ fontSize: "clamp(1.72rem, 4vw, 32px)",
10764
+ fontWeight: 700,
10765
+ color: "var(--bw-text-color)",
10766
+ fontFamily: "var(--bw-font-family)",
10767
+ textAlign: "right",
10768
+ }, children: jsxRuntime.jsxs("span", { children: ["ab ", formatCurrency(eventType.minPrice)] }) })] }), jsxRuntime.jsxs("div", { style: {
10769
+ display: "flex",
10770
+ justifyContent: "flex-end",
10771
+ alignItems: "center",
10772
+ marginTop: "10px",
10773
+ gap: "12px",
10774
+ }, children: [(eventType.description ||
9556
10775
  (eventType.highlights && eventType.highlights.length > 0)) && (jsxRuntime.jsx("button", { onClick: (e) => {
9557
10776
  e.stopPropagation();
9558
10777
  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));
10778
+ }, style: {
10779
+ color: "var(--bw-highlight-color)",
10780
+ backgroundColor: "var(--bw-surface-color)",
10781
+ padding: "12px",
10782
+ borderRadius: "var(--bw-border-radius)",
10783
+ fontSize: "clamp(0.8rem, 2vw, 16px)",
10784
+ fontWeight: 600,
10785
+ fontFamily: "var(--bw-font-family)",
10786
+ display: "flex",
10787
+ alignItems: "center",
10788
+ gap: "8px",
10789
+ border: "2px solid var(--bw-highlight-color)",
10790
+ cursor: "pointer",
10791
+ opacity: 0.6,
10792
+ transition: "all 0.2s ease",
10793
+ }, children: "Mehr Details" })), isAvailable && (jsxRuntime.jsxs("div", { style: {
10794
+ backgroundColor: "var(--bw-highlight-color)",
10795
+ color: "var(--bw-surface-color)",
10796
+ padding: "12px 24px",
10797
+ borderRadius: "var(--bw-border-radius)",
10798
+ fontSize: "clamp(1rem, 2vw, 16px)",
10799
+ fontWeight: 600,
10800
+ fontFamily: "var(--bw-font-family)",
10801
+ display: "flex",
10802
+ alignItems: "center",
10803
+ justifyContent: "center",
10804
+ textAlign: "center",
10805
+ gap: "8px",
10806
+ border: "none",
10807
+ cursor: "pointer",
10808
+ transition: "all 0.2s ease",
10809
+ }, children: [jsxRuntime.jsx(IconWave, { size: 15, color: "var(--bw-surface-color)" }), " Jetzt buchen"] }))] })] })] }), !isAvailable && (jsxRuntime.jsx("div", { style: {
10810
+ position: "absolute",
10811
+ inset: 0,
10812
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
10813
+ backdropFilter: "blur(4px)",
10814
+ display: "flex",
10815
+ alignItems: "center",
10816
+ justifyContent: "center",
10817
+ }, children: jsxRuntime.jsx("div", { style: {
10818
+ backgroundColor: "rgba(255, 255, 255, 0.9)",
10819
+ padding: "12px 24px",
10820
+ borderRadius: "var(--bw-border-radius)",
10821
+ color: "var(--bw-text-color)",
10822
+ fontWeight: 600,
10823
+ fontSize: "16px",
10824
+ fontFamily: "var(--bw-font-family)",
10825
+ boxShadow: "var(--bw-shadow-md)",
10826
+ }, children: "Ausgebucht" }) }))] }, eventType.id));
9560
10827
  }) }) })), jsxRuntime.jsx(EventTypeDetailsDialog, { isOpen: detailsDialogOpen, onClose: handleCloseDetails, eventType: selectedEventTypeForDetails, onEventTypeSelect: onEventTypeSelect })] }));
9561
10828
  }
9562
10829
 
@@ -9658,7 +10925,19 @@ const getPriceDisplayInfo = (price, yearPrices) => {
9658
10925
  // Allocation Badge Component
9659
10926
  const AllocationBadge = ({ availableSpots, maxParticipants, }) => {
9660
10927
  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: {
10928
+ return (jsxRuntime.jsx("div", { style: {
10929
+ display: "flex",
10930
+ marginRight: "auto",
10931
+ marginTop: "-24px",
10932
+ marginBottom: "4px",
10933
+ borderRadius: "var(--bw-border-radius-small)",
10934
+ fontFamily: "var(--bw-font-family)",
10935
+ zIndex: 50,
10936
+ whiteSpace: "nowrap",
10937
+ width: "fit-content",
10938
+ fontSize: "11px",
10939
+ fontWeight: 700,
10940
+ padding: "2px 8px",
9662
10941
  backgroundColor: badgeInfo?.backgroundColor || "transparent",
9663
10942
  color: badgeInfo?.textColor || "transparent",
9664
10943
  }, children: badgeInfo?.text || " - " }));
@@ -9666,7 +10945,19 @@ const AllocationBadge = ({ availableSpots, maxParticipants, }) => {
9666
10945
  // Price Badge Component (for special prices)
9667
10946
  const SpecialPriceBadge = ({ price, yearPrices }) => {
9668
10947
  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: {
10948
+ return (jsxRuntime.jsx("div", { style: {
10949
+ display: "flex",
10950
+ marginLeft: "auto",
10951
+ marginTop: "-20px",
10952
+ marginBottom: "4px",
10953
+ borderRadius: "var(--bw-border-radius-small)",
10954
+ fontFamily: "var(--bw-font-family)",
10955
+ zIndex: 50,
10956
+ whiteSpace: "nowrap",
10957
+ width: "fit-content",
10958
+ fontSize: "11px",
10959
+ fontWeight: 700,
10960
+ padding: "2px 8px",
9670
10961
  backgroundColor: badgeInfo?.backgroundColor || "transparent",
9671
10962
  color: badgeInfo?.textColor || "transparent",
9672
10963
  }, children: badgeInfo?.text || " - " }));
@@ -9674,7 +10965,14 @@ const SpecialPriceBadge = ({ price, yearPrices }) => {
9674
10965
  // Price Display Component (with special price styling)
9675
10966
  const PriceDisplay = ({ price, yearPrices }) => {
9676
10967
  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: {
10968
+ return (jsxRuntime.jsx("span", { style: {
10969
+ display: "inline-flex",
10970
+ alignItems: "center",
10971
+ fontSize: "16px",
10972
+ fontWeight: 600,
10973
+ padding: "2px 8px",
10974
+ borderRadius: "var(--bw-border-radius-small)",
10975
+ fontFamily: "var(--bw-font-family)",
9678
10976
  backgroundColor: displayInfo ? displayInfo.backgroundColor : "var(--bw-background-color)",
9679
10977
  color: displayInfo ? displayInfo.textColor : "var(--bw-text-color)",
9680
10978
  border: displayInfo ? "none" : "1px solid var(--bw-border-color)",
@@ -9741,17 +11039,117 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
9741
11039
  onClose();
9742
11040
  onBackToEventTypes();
9743
11041
  };
11042
+ const footerNav = (jsxRuntime.jsx("button", { type: "button", onClick: handleClose, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: "\u2190 Zur\u00FCck" }));
9744
11043
  // Show loading state first if we're loading event instances
9745
11044
  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))) }) }) }));
11045
+ 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: {
11046
+ backgroundColor: "var(--bw-surface-color)",
11047
+ border: "1px solid var(--bw-border-color)",
11048
+ borderRadius: "var(--bw-border-radius)",
11049
+ overflow: "hidden",
11050
+ }, children: [jsxRuntime.jsxs("div", { style: {
11051
+ display: "flex",
11052
+ justifyContent: "space-between",
11053
+ alignItems: "center",
11054
+ padding: "16px 20px",
11055
+ cursor: "pointer",
11056
+ borderBottom: "1px solid var(--bw-border-color)",
11057
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11058
+ width: "80px",
11059
+ height: "20px",
11060
+ backgroundColor: "var(--bw-border-color)",
11061
+ borderRadius: "var(--bw-border-radius-small)",
11062
+ } }), jsxRuntime.jsx("div", { style: {
11063
+ width: "16px",
11064
+ height: "16px",
11065
+ backgroundColor: "var(--bw-border-color)",
11066
+ borderRadius: "var(--bw-border-radius-small)",
11067
+ } })] }), jsxRuntime.jsx("div", { style: {
11068
+ width: "70px",
11069
+ height: "16px",
11070
+ backgroundColor: "var(--bw-highlight-color)",
11071
+ opacity: 0.3,
11072
+ borderRadius: "var(--bw-border-radius-small)",
11073
+ } })] }), jsxRuntime.jsx("div", { style: {
11074
+ display: "flex",
11075
+ flexDirection: "column",
11076
+ gap: "12px",
11077
+ paddingTop: "12px",
11078
+ padding: "12px 20px 20px 20px",
11079
+ }, children: Array.from({ length: 2 }).map((_, eventIdx) => (jsxRuntime.jsxs("div", { style: {
11080
+ position: "relative",
11081
+ border: "1px solid var(--bw-border-color)",
11082
+ backgroundColor: "var(--bw-surface-color)",
11083
+ borderRadius: "var(--bw-border-radius)",
11084
+ padding: "16px 20px",
11085
+ fontFamily: "var(--bw-font-family)",
11086
+ }, children: [jsxRuntime.jsxs("div", { style: {
11087
+ display: "flex",
11088
+ justifyContent: "space-between",
11089
+ width: "100%",
11090
+ alignItems: "flex-start",
11091
+ gap: "12px",
11092
+ marginBottom: "4px",
11093
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11094
+ width: "40px",
11095
+ height: "40px",
11096
+ backgroundColor: "var(--bw-background-color)",
11097
+ border: "1px solid var(--bw-border-color)",
11098
+ borderTopWidth: "4px",
11099
+ borderRadius: "var(--bw-border-radius-small)",
11100
+ } }), jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [jsxRuntime.jsx("div", { style: {
11101
+ width: "80px",
11102
+ height: "16px",
11103
+ backgroundColor: "var(--bw-border-color)",
11104
+ borderRadius: "var(--bw-border-radius)",
11105
+ } }), jsxRuntime.jsx("div", { style: {
11106
+ width: "60px",
11107
+ height: "14px",
11108
+ backgroundColor: "var(--bw-border-color)",
11109
+ borderRadius: "var(--bw-border-radius)",
11110
+ } })] })] }), jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", alignItems: "flex-end" }, children: jsxRuntime.jsx("div", { style: {
11111
+ width: "70px",
11112
+ height: "20px",
11113
+ backgroundColor: "var(--bw-highlight-color)",
11114
+ opacity: 0.3,
11115
+ borderRadius: "var(--bw-border-radius)",
11116
+ } }) })] }), jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [jsxRuntime.jsx("div", { style: {
11117
+ width: "120px",
11118
+ height: "16px",
11119
+ backgroundColor: "var(--bw-border-color)",
11120
+ borderRadius: "var(--bw-border-radius)",
11121
+ } }), jsxRuntime.jsx("div", { style: {
11122
+ width: "50px",
11123
+ height: "20px",
11124
+ backgroundColor: "var(--bw-border-color)",
11125
+ borderRadius: "16px",
11126
+ } })] })] }, eventIdx))) })] }, idx))) }) }) }));
9747
11127
  }
9748
11128
  // Show empty state only if not loading and no event instances
9749
11129
  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." })] }) }) }));
11130
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: "Keine verf\u00FCgbaren Termine", footer: footerNav, children: jsxRuntime.jsx("div", { style: {
11131
+ display: "flex",
11132
+ alignItems: "center",
11133
+ justifyContent: "center",
11134
+ minHeight: "400px",
11135
+ textAlign: "center",
11136
+ padding: "16px",
11137
+ }, children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h3", { style: {
11138
+ marginBottom: "8px",
11139
+ fontWeight: 600,
11140
+ fontSize: "18px",
11141
+ color: "var(--bw-text-muted)",
11142
+ fontFamily: "var(--bw-font-family)",
11143
+ }, children: "Keine verf\u00FCgbaren Termine" }), jsxRuntime.jsx("p", { style: { color: "var(--bw-text-muted)", fontFamily: "var(--bw-font-family)" }, children: "F\u00FCr diesen Event-Typ sind derzeit keine Termine verf\u00FCgbar." })] }) }) }));
9751
11144
  }
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) => {
11145
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: handleClose, title: `${selectedEventType?.name}`, footer: footerNav, children: jsxRuntime.jsx("div", { style: { padding: "20px 10px" }, children: jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: monthYearGroups.map(({ key, label, events, minPrice, year }, idx) => {
9753
11146
  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: {
11147
+ return (jsxRuntime.jsxs(React__default.Fragment, { children: [idx > 0 && monthYearGroups[idx - 1].year !== year && (jsxRuntime.jsx("div", { style: { height: "1px", backgroundColor: "var(--bw-border-color)", margin: "4px 0" } })), jsxRuntime.jsx(Accordion, { title: label, priceInfo: jsxRuntime.jsx("div", { style: {
11148
+ fontSize: "16px",
11149
+ fontWeight: 500,
11150
+ marginLeft: "auto",
11151
+ padding: "4px 8px",
11152
+ borderRadius: "var(--bw-border-radius-small)",
9755
11153
  backgroundColor: monthPriceDisplayInfo
9756
11154
  ? monthPriceDisplayInfo.backgroundColor
9757
11155
  : "#14532d",
@@ -9761,21 +11159,97 @@ function EventInstanceSelection({ eventInstances, selectedEventType, onEventInst
9761
11159
  boxShadow: monthPriceDisplayInfo
9762
11160
  ? "0 2px 4px rgba(0, 0, 0, 0.2)"
9763
11161
  : 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) => {
11162
+ }, 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
11163
  const availableSpots = event.maxParticipants - event.participantCount;
9766
11164
  const isFullyBooked = availableSpots === 0;
9767
11165
  const startDate = new Date(event.startTime);
9768
11166
  const isPastEvent = today.toISOString() >= startDate.toISOString();
9769
11167
  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: () => {
11168
+ return (jsxRuntime.jsxs("div", { style: {
11169
+ position: "relative",
11170
+ border: "1px solid var(--bw-border-color)",
11171
+ backgroundColor: "var(--bw-surface-color)",
11172
+ borderRadius: "var(--bw-border-radius)",
11173
+ padding: "16px 10px",
11174
+ transition: "all 0.2s ease",
11175
+ fontFamily: "var(--bw-font-family)",
11176
+ opacity: isDisabled ? 0.3 : 1,
11177
+ filter: isDisabled ? "grayscale(40%)" : "none",
11178
+ cursor: isDisabled ? "not-allowed" : "pointer",
11179
+ }, onClick: () => {
9773
11180
  if (!isDisabled) {
9774
11181
  handleEventInstanceSelect(event);
9775
11182
  }
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));
11183
+ }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { style: {
11184
+ position: "absolute",
11185
+ inset: 0,
11186
+ backgroundColor: "rgba(15, 23, 42, 0.8)",
11187
+ borderRadius: "var(--bw-border-radius)",
11188
+ display: "flex",
11189
+ alignItems: "center",
11190
+ justifyContent: "center",
11191
+ }, children: jsxRuntime.jsx("div", { style: {
11192
+ width: "32px",
11193
+ height: "32px",
11194
+ color: "var(--bw-highlight-color)",
11195
+ opacity: 0.8,
11196
+ fontSize: "32px",
11197
+ }, children: spinner() }) })), jsxRuntime.jsx(SpecialPriceBadge, { price: event.price, yearPrices: yearPrices }), jsxRuntime.jsx(AllocationBadge, { availableSpots: availableSpots, maxParticipants: event.maxParticipants }), jsxRuntime.jsxs("div", { style: {
11198
+ display: "flex",
11199
+ justifyContent: "space-between",
11200
+ width: "100%",
11201
+ alignItems: "flex-start",
11202
+ gap: "12px",
11203
+ marginBottom: "4px",
11204
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11205
+ fontSize: "16px",
11206
+ transition: "all 0.2s ease",
11207
+ borderRadius: "var(--bw-border-radius-small)",
11208
+ borderTop: "4px solid var(--bw-border-color)",
11209
+ border: "1px solid var(--bw-border-color)",
11210
+ width: "40px",
11211
+ height: "40px",
11212
+ display: "flex",
11213
+ alignItems: "center",
11214
+ justifyContent: "center",
11215
+ fontWeight: 700,
11216
+ color: "var(--bw-text-color)",
11217
+ backgroundColor: "var(--bw-background-color)",
11218
+ }, children: startDate.getDate() }), jsxRuntime.jsxs("div", { style: {
11219
+ fontSize: "16px",
11220
+ color: "var(--bw-text-color)",
11221
+ display: "flex",
11222
+ flexDirection: "column",
11223
+ alignItems: "flex-start",
11224
+ justifyContent: "flex-start",
11225
+ lineHeight: 1.25,
11226
+ }, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { style: { fontWeight: 600, marginBottom: "2px" }, children: formatWeekday(event.startTime) }), formatWeekday(event.startTime) !==
11227
+ 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) ===
11228
+ 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: {
11229
+ fontSize: "12px",
11230
+ fontWeight: 400,
11231
+ color: "var(--bw-text-muted)",
11232
+ marginLeft: "6px",
11233
+ backgroundColor: "rgba(0, 0, 0, 0.05)",
11234
+ whiteSpace: "nowrap",
11235
+ padding: "2px 6px",
11236
+ borderRadius: "var(--bw-border-radius-small)",
11237
+ }, children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), jsxRuntime.jsx("div", { style: {
11238
+ textAlign: "right",
11239
+ display: "flex",
11240
+ flexDirection: "column",
11241
+ alignItems: "flex-end",
11242
+ }, children: jsxRuntime.jsx(PriceDisplay, { price: event.price, yearPrices: yearPrices }) })] }), event.name !== selectedEventType?.name && (jsxRuntime.jsx("h4", { style: {
11243
+ fontSize: "16px",
11244
+ fontWeight: 600,
11245
+ color: "var(--bw-text-color)",
11246
+ lineHeight: 1.25,
11247
+ margin: "0 0 2px 0",
11248
+ display: "flex",
11249
+ alignItems: "center",
11250
+ gap: "8px",
11251
+ maxWidth: "230px",
11252
+ }, children: event.name }))] }, event.id));
9779
11253
  }) }) })] }, key));
9780
11254
  }) }) }) }));
9781
11255
  }
@@ -9791,9 +11265,76 @@ function NextEventsPreview({ events, onEventSelect, onShowAll, showAllButtonText
9791
11265
  return jsxRuntime.jsx(NextEventsSkeleton, { count: 3 });
9792
11266
  }
9793
11267
  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) => {
11268
+ return (jsxRuntime.jsx("div", { style: { maxWidth: "500px", margin: "0 auto", padding: "16px" }, children: jsxRuntime.jsxs("div", { style: {
11269
+ display: "flex",
11270
+ flexDirection: "column",
11271
+ alignItems: "center",
11272
+ justifyContent: "center",
11273
+ textAlign: "center",
11274
+ backgroundColor: "var(--bw-surface-color)",
11275
+ border: "1px solid var(--bw-border-color)",
11276
+ borderRadius: "var(--bw-border-radius)",
11277
+ padding: "24px",
11278
+ fontFamily: "var(--bw-font-family)",
11279
+ minHeight: "300px",
11280
+ }, children: [jsxRuntime.jsx("div", { style: {
11281
+ display: "flex",
11282
+ alignItems: "center",
11283
+ justifyContent: "center",
11284
+ borderRadius: "50%",
11285
+ width: "64px",
11286
+ height: "64px",
11287
+ backgroundColor: "var(--bw-highlight-color)",
11288
+ marginBottom: "16px",
11289
+ fontSize: "32px",
11290
+ color: "#ffffff",
11291
+ opacity: 0.8,
11292
+ }, children: "\uD83D\uDCC5" }), jsxRuntime.jsx("h3", { style: {
11293
+ fontWeight: 600,
11294
+ margin: "0 0 8px 0",
11295
+ fontSize: "20px",
11296
+ color: "var(--bw-text-color)",
11297
+ fontFamily: "var(--bw-font-family)",
11298
+ }, children: "Keine bevorstehenden Termine" }), jsxRuntime.jsx("p", { style: {
11299
+ margin: "0 0 24px 0",
11300
+ color: "var(--bw-text-muted)",
11301
+ fontSize: "16px",
11302
+ lineHeight: 1.6,
11303
+ fontFamily: "var(--bw-font-family)",
11304
+ maxWidth: "400px",
11305
+ }, 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: {
11306
+ display: "flex",
11307
+ alignItems: "center",
11308
+ cursor: "pointer",
11309
+ backgroundColor: "var(--bw-surface-color)",
11310
+ color: "var(--bw-highlight-color)",
11311
+ padding: "12px 24px",
11312
+ border: "1px solid var(--bw-highlight-color)",
11313
+ borderRadius: "var(--bw-border-radius)",
11314
+ fontSize: "16px",
11315
+ fontWeight: 600,
11316
+ fontFamily: "var(--bw-font-family)",
11317
+ transition: "all 0.2s ease",
11318
+ gap: "8px",
11319
+ }, children: [jsxRuntime.jsx("span", { style: { fontSize: "16px" }, children: "\uD83D\uDD04" }), "Seite neu laden"] })] }) }));
11320
+ }
11321
+ return (jsxRuntime.jsxs("div", { style: {
11322
+ maxWidth: "500px",
11323
+ margin: "0 auto",
11324
+ padding: "16px",
11325
+ fontFamily: "var(--bw-font-family)",
11326
+ }, children: [jsxRuntime.jsxs("div", { style: { textAlign: "center", marginBottom: "24px" }, children: [jsxRuntime.jsx("h2", { style: {
11327
+ fontWeight: 600,
11328
+ margin: "0 0 8px 0",
11329
+ fontSize: "18px",
11330
+ color: "var(--bw-text-color)",
11331
+ fontFamily: "var(--bw-font-family)",
11332
+ }, children: "N\u00E4chste verf\u00FCgbare Termine" }), jsxRuntime.jsx("p", { style: {
11333
+ margin: 0,
11334
+ fontSize: "16px",
11335
+ color: "var(--bw-text-muted)",
11336
+ fontFamily: "var(--bw-font-family)",
11337
+ }, 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
11338
  const availableSpots = event.maxParticipants - event.participantCount;
9798
11339
  const isFullyBooked = availableSpots === 0;
9799
11340
  const startDate = new Date(event.startTime);
@@ -9815,26 +11356,123 @@ function NextEventsPreview({ events, onEventSelect, onShowAll, showAllButtonText
9815
11356
  return "var(--bw-highlight-color)";
9816
11357
  };
9817
11358
  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: () => {
11359
+ return (jsxRuntime.jsxs("div", { style: {
11360
+ position: "relative",
11361
+ backgroundColor: "var(--bw-surface-color)",
11362
+ borderRadius: "var(--bw-border-radius)",
11363
+ padding: "8px 10px",
11364
+ transition: "all 0.2s ease",
11365
+ border: `1px solid ${getAvailabilityColor()}`,
11366
+ fontFamily: "var(--bw-font-family)",
11367
+ opacity: isDisabled ? 0.3 : 1,
11368
+ filter: isDisabled ? "grayscale(100%)" : "none",
11369
+ cursor: isDisabled ? "not-allowed" : "pointer",
11370
+ }, onClick: () => {
9821
11371
  if (!isDisabled) {
9822
11372
  handleEventSelect(event.id);
9823
11373
  }
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(),
11374
+ }, children: [selectedEventInstanceId === event.id && isLoadingEventDetails && (jsxRuntime.jsx("div", { style: {
11375
+ position: "absolute",
11376
+ inset: 0,
11377
+ display: "flex",
11378
+ alignItems: "center",
11379
+ justifyContent: "center",
11380
+ backgroundColor: "rgba(15, 23, 42, 0.8)",
11381
+ borderRadius: "var(--bw-border-radius)",
11382
+ }, children: jsxRuntime.jsx("div", { style: {
11383
+ width: "32px",
11384
+ height: "32px",
11385
+ color: "var(--bw-highlight-color)",
11386
+ fontSize: "32px",
11387
+ animation: "spin 1s linear infinite",
11388
+ }, children: "\u27F3" }) })), jsxRuntime.jsxs("div", { style: {
11389
+ display: "flex",
11390
+ justifyContent: "space-between",
11391
+ width: "100%",
11392
+ alignItems: "flex-start",
11393
+ gap: "12px",
11394
+ marginBottom: "4px",
11395
+ }, children: [jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" }, children: [jsxRuntime.jsx("div", { style: {
11396
+ display: "flex",
11397
+ alignItems: "center",
11398
+ justifyContent: "center",
11399
+ fontWeight: 700,
11400
+ fontSize: "16px",
11401
+ borderRadius: "var(--bw-border-radius-small)",
11402
+ width: "40px",
11403
+ height: "40px",
11404
+ color: "var(--bw-text-color)",
11405
+ backgroundColor: "var(--bw-background-color)",
11406
+ border: "1px solid var(--bw-border-color)",
9826
11407
  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: {
11408
+ borderTopColor: getAvailabilityColor(),
11409
+ transition: "all 0.2s ease",
11410
+ }, children: startDate.getDate() }), jsxRuntime.jsxs("div", { style: {
11411
+ display: "flex",
11412
+ flexDirection: "column",
11413
+ alignItems: "flex-start",
11414
+ justifyContent: "flex-start",
11415
+ fontSize: "16px",
11416
+ color: "var(--bw-text-color)",
11417
+ lineHeight: 1.25,
11418
+ }, 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: {
11419
+ display: "flex",
11420
+ flexDirection: "column",
11421
+ alignItems: "flex-end",
11422
+ textAlign: "right",
11423
+ }, children: [jsxRuntime.jsx("div", { style: {
11424
+ fontWeight: 700,
11425
+ color: "var(--bw-highlight-color)",
11426
+ fontSize: "18px",
11427
+ }, 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: {
11428
+ display: "flex",
11429
+ alignItems: "center",
11430
+ fontWeight: 600,
11431
+ margin: "0 0 2px 0",
11432
+ fontSize: "16px",
11433
+ color: "var(--bw-text-color)",
11434
+ lineHeight: 1.25,
11435
+ gap: "8px",
11436
+ }, children: [event.name, jsxRuntime.jsxs("span", { style: {
11437
+ fontSize: "12px",
11438
+ fontWeight: 400,
11439
+ color: "var(--bw-text-muted)",
11440
+ marginLeft: "6px",
11441
+ backgroundColor: "rgba(0, 0, 0, 0.05)",
11442
+ borderRadius: "16px",
11443
+ padding: "2px 8px",
11444
+ }, children: [event.durationDays, " Tag", event.durationDays > 1 ? "e" : ""] })] }), event.notes && (jsxRuntime.jsx("p", { style: {
11445
+ margin: "8px 0 0 0",
11446
+ fontSize: "12px",
11447
+ color: "var(--bw-text-muted)",
11448
+ overflow: "hidden",
11449
+ lineHeight: 1.375,
9828
11450
  display: "-webkit-box",
9829
11451
  WebkitBoxOrient: "vertical",
9830
11452
  WebkitLineClamp: 2,
9831
11453
  }, 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) }) }))] }));
11454
+ }) }), showAllButton && (jsxRuntime.jsx("div", { style: { textAlign: "center" }, children: jsxRuntime.jsx("button", { type: "button", disabled: isLoadingShowAll, style: {
11455
+ position: "relative",
11456
+ backgroundColor: "var(--bw-surface-color)",
11457
+ color: "var(--bw-highlight-color)",
11458
+ border: "1px solid var(--bw-highlight-color)",
11459
+ padding: "12px 24px",
11460
+ borderRadius: "var(--bw-border-radius)",
11461
+ fontSize: "16px",
11462
+ fontWeight: 500,
11463
+ fontFamily: "var(--bw-font-family)",
11464
+ transition: "all 0.2s ease",
11465
+ cursor: isLoadingShowAll ? "not-allowed" : "pointer",
11466
+ opacity: isLoadingShowAll ? 0.7 : 1,
11467
+ }, onClick: onShowAll, children: isLoadingShowAll ? (jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [jsxRuntime.jsx("div", { style: {
11468
+ width: "16px",
11469
+ height: "16px",
11470
+ color: "var(--bw-highlight-color)",
11471
+ fontSize: "16px",
11472
+ animation: "spin 1s linear infinite",
11473
+ }, children: "\u27F3" }), "L\u00E4dt..."] })) : (showAllButtonText) }) }))] }));
9835
11474
  }
9836
11475
 
9837
- // Theme configurations
9838
11476
  const getThemeConfig = (theme = "generic") => {
9839
11477
  switch (theme) {
9840
11478
  case "christmas":
@@ -9895,23 +11533,19 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9895
11533
  const [copied, setCopied] = React__default.useState(false);
9896
11534
  const [isVisible, setIsVisible] = React__default.useState(false);
9897
11535
  const [portalContainer, setPortalContainer] = React__default.useState(null);
9898
- // Get theme config
9899
11536
  const themeConfig = getThemeConfig(config.theme);
9900
- // Use config values with fallbacks
9901
11537
  const discountCode = config.discountCode || "DISCOUNT";
9902
- // Create portal container on mount to escape stacking context issues
9903
11538
  React__default.useEffect(() => {
9904
11539
  const container = document.createElement("div");
9905
11540
  container.id = "bigz-promo-dialog-portal";
9906
11541
  container.style.position = "relative";
9907
- container.style.zIndex = "2147483647"; // Maximum z-index value
11542
+ container.style.zIndex = "2147483647";
9908
11543
  document.body.appendChild(container);
9909
11544
  setPortalContainer(container);
9910
11545
  return () => {
9911
11546
  document.body.removeChild(container);
9912
11547
  };
9913
11548
  }, []);
9914
- // Animate in on mount
9915
11549
  React__default.useEffect(() => {
9916
11550
  const timer = setTimeout(() => setIsVisible(true), 50);
9917
11551
  return () => clearTimeout(timer);
@@ -9923,7 +11557,6 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9923
11557
  setTimeout(() => setCopied(false), 2000);
9924
11558
  }
9925
11559
  catch {
9926
- // Fallback for older browsers
9927
11560
  const textArea = document.createElement("textarea");
9928
11561
  textArea.value = discountCode;
9929
11562
  document.body.appendChild(textArea);
@@ -9942,33 +11575,74 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9942
11575
  setIsVisible(false);
9943
11576
  setTimeout(onCtaClick, 200);
9944
11577
  };
9945
- // Don't render until portal container is ready
9946
11578
  if (!portalContainer) {
9947
11579
  return null;
9948
11580
  }
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: {
11581
+ const dialogContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { onClick: handleClose, style: {
11582
+ position: "fixed",
11583
+ inset: 0,
11584
+ zIndex: 60,
11585
+ backgroundColor: "rgba(0, 20, 40, 0.85)",
11586
+ backdropFilter: "blur(4px)",
11587
+ transition: "opacity 0.3s ease-out",
11588
+ opacity: isVisible ? 1 : 0,
11589
+ } }), jsxRuntime.jsx("div", { style: {
11590
+ position: "fixed",
11591
+ zIndex: 61,
11592
+ width: "92%",
11593
+ maxWidth: "440px",
11594
+ transition: "all 0.3s",
9950
11595
  top: "50%",
9951
11596
  left: "50%",
9952
11597
  transform: `translate(-50%, -50%) scale(${isVisible ? 1 : 0.9})`,
9953
11598
  opacity: isVisible ? 1 : 0,
9954
11599
  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: {
11600
+ }, children: jsxRuntime.jsxs("div", { style: {
11601
+ position: "relative",
11602
+ overflow: "hidden",
11603
+ borderRadius: "28px",
11604
+ 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
11605
  background: `linear-gradient(165deg, ${themeConfig.primaryColor} 0%, ${themeConfig.primaryColor} 40%, ${themeConfig.secondaryColor} 100%)`,
9957
11606
  }, 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: {
11607
+ Array.from({ length: 15 }).map((_, i) => (jsxRuntime.jsx("div", { style: {
11608
+ position: "absolute",
11609
+ pointerEvents: "none",
11610
+ zIndex: 1,
11611
+ color: "white",
11612
+ opacity: 0,
9959
11613
  left: `${5 + Math.random() * 90}%`,
9960
11614
  top: "-10px",
9961
11615
  fontSize: `${10 + Math.random() * 14}px`,
9962
11616
  animation: `promo-snow ${4 + Math.random() * 3}s linear infinite`,
9963
11617
  animationDelay: `${Math.random() * 4}s`,
9964
- }, children: "\u2744" }, i))), jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center overflow-hidden h-[180px]", style: {
11618
+ }, children: "\u2744" }, i))), jsxRuntime.jsxs("div", { style: {
11619
+ position: "relative",
11620
+ display: "flex",
11621
+ alignItems: "center",
11622
+ justifyContent: "center",
11623
+ overflow: "hidden",
11624
+ height: "180px",
9965
11625
  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: {
11626
+ }, children: [themeConfig.backgroundImage && (jsxRuntime.jsx("img", { src: themeConfig.backgroundImage, alt: "Background", style: {
11627
+ position: "absolute",
11628
+ inset: 0,
11629
+ width: "100%",
11630
+ height: "100%",
11631
+ objectFit: "cover",
11632
+ opacity: 0.6,
11633
+ } })), jsxRuntime.jsx("div", { style: {
11634
+ position: "absolute",
11635
+ inset: 0,
9967
11636
  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: {
11637
+ } }), jsxRuntime.jsx("div", { style: {
11638
+ position: "relative",
11639
+ zIndex: 2,
11640
+ fontSize: "64px",
11641
+ filter: "drop-shadow(0 8px 16px rgba(0,0,0,0.4))",
9969
11642
  animation: `promo-float ${themeConfig.animation?.floatDuration || 3}s ease-in-out infinite`,
9970
11643
  }, children: themeConfig.icon }), themeConfig.decorations &&
9971
- themeConfig.decorations.map((decoration, i) => (jsxRuntime.jsx("div", { className: "absolute", style: {
11644
+ themeConfig.decorations.map((decoration, i) => (jsxRuntime.jsx("div", { style: {
11645
+ position: "absolute",
9972
11646
  top: i === 0 ? "16px" : "20px",
9973
11647
  left: i === 0 ? "20px" : "auto",
9974
11648
  right: i === 1 ? "20px" : "auto",
@@ -9976,23 +11650,325 @@ function PromoDialog({ config, onClose, onCtaClick }) {
9976
11650
  animation: themeConfig.animation?.sparkleEnabled
9977
11651
  ? `promo-sparkle 2s ease-in-out infinite ${i * 0.5}s`
9978
11652
  : 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: {
11653
+ }, children: decoration }, i)))] }), jsxRuntime.jsx("button", { onClick: handleClose, style: {
11654
+ position: "absolute",
11655
+ top: "16px",
11656
+ right: "16px",
11657
+ display: "flex",
11658
+ alignItems: "center",
11659
+ justifyContent: "center",
11660
+ cursor: "pointer",
11661
+ zIndex: 10,
11662
+ width: "36px",
11663
+ height: "36px",
11664
+ borderRadius: "50%",
11665
+ border: "none",
11666
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
11667
+ backdropFilter: "blur(4px)",
11668
+ color: "white",
11669
+ fontSize: "22px",
11670
+ lineHeight: 1,
11671
+ transition: "all 0.15s ease",
11672
+ }, children: "\u00D7" }), jsxRuntime.jsxs("div", { style: {
11673
+ position: "relative",
11674
+ textAlign: "center",
11675
+ zIndex: 2,
11676
+ padding: "28px 28px 32px 28px",
11677
+ }, children: [jsxRuntime.jsx("h2", { style: {
11678
+ fontWeight: 800,
11679
+ fontSize: "26px",
11680
+ color: "white",
11681
+ marginBottom: "6px",
11682
+ letterSpacing: "-0.025em",
11683
+ filter: "drop-shadow(0 2px 8px rgba(0,0,0,0.3))",
11684
+ margin: "0 0 6px 0",
11685
+ }, children: config.title }), jsxRuntime.jsxs("p", { style: {
11686
+ fontSize: "17px",
11687
+ color: "rgba(255, 255, 255, 0.9)",
11688
+ marginBottom: "20px",
11689
+ lineHeight: 1.5,
11690
+ margin: "0 0 20px 0",
11691
+ }, 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: {
11692
+ marginBottom: "20px",
11693
+ backgroundColor: "white",
11694
+ borderRadius: "16px",
11695
+ padding: "18px 20px",
11696
+ boxShadow: "0 8px 24px rgba(0,0,0,0.15), inset 0 -2px 0 rgba(0,0,0,0.05)",
11697
+ }, children: [jsxRuntime.jsx("p", { style: {
11698
+ textTransform: "uppercase",
11699
+ fontWeight: 600,
11700
+ fontSize: "11px",
11701
+ letterSpacing: "1.5px",
11702
+ color: "#64748b",
11703
+ marginBottom: "10px",
11704
+ margin: "0 0 10px 0",
11705
+ }, children: "Dein Geschenk-Code" }), jsxRuntime.jsxs("div", { style: {
11706
+ display: "flex",
11707
+ alignItems: "center",
11708
+ justifyContent: "center",
11709
+ gap: "12px",
11710
+ }, children: [jsxRuntime.jsx("div", { style: {
11711
+ padding: "10px 20px",
11712
+ borderRadius: "10px",
9980
11713
  background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
9981
11714
  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: {
11715
+ }, children: jsxRuntime.jsx("span", { style: {
11716
+ fontWeight: 900,
11717
+ fontSize: "28px",
11718
+ color: "white",
11719
+ letterSpacing: "6px",
11720
+ filter: "drop-shadow(0 2px 4px rgba(0,0,0,0.2))",
11721
+ }, children: discountCode }) }), jsxRuntime.jsx("button", { onClick: handleCopyCode, style: {
11722
+ display: "flex",
11723
+ alignItems: "center",
11724
+ cursor: "pointer",
11725
+ whiteSpace: "nowrap",
11726
+ padding: "12px 16px",
11727
+ borderRadius: "10px",
11728
+ border: "2px solid",
11729
+ borderColor: copied ? "#22c55e" : "#e2e8f0",
11730
+ backgroundColor: copied ? "#dcfce7" : "#f8fafc",
11731
+ color: copied ? "#15803d" : "#475569",
11732
+ fontSize: "13px",
11733
+ fontWeight: 600,
11734
+ transition: "all 0.15s ease",
11735
+ gap: "6px",
11736
+ }, 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: {
11737
+ display: "flex",
11738
+ justifyContent: "center",
11739
+ gap: "8px",
11740
+ marginBottom: "20px",
11741
+ flexWrap: "wrap",
11742
+ }, children: config.activities.map((activity) => (jsxRuntime.jsx("span", { style: {
11743
+ fontWeight: 500,
11744
+ backgroundColor: "rgba(255, 255, 255, 0.15)",
11745
+ backdropFilter: "blur(4px)",
11746
+ padding: "6px 12px",
11747
+ borderRadius: "20px",
11748
+ fontSize: "13px",
11749
+ color: "white",
11750
+ }, children: activity }, activity))) })), jsxRuntime.jsxs("button", { onClick: handleCtaClick, style: {
11751
+ width: "100%",
11752
+ display: "flex",
11753
+ alignItems: "center",
11754
+ justifyContent: "center",
11755
+ cursor: "pointer",
11756
+ fontWeight: 700,
11757
+ padding: "18px 24px",
11758
+ borderRadius: "14px",
11759
+ border: "none",
11760
+ color: "white",
11761
+ fontSize: "18px",
11762
+ transition: "all 0.15s ease",
11763
+ gap: "10px",
9985
11764
  background: `linear-gradient(135deg, ${themeConfig.secondaryColor} 0%, ${themeConfig.primaryColor} 100%)`,
9986
11765
  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
11766
+ }, children: [config.ctaText, jsxRuntime.jsx("span", { children: "\u2192" })] }), config.validityText && (jsxRuntime.jsx("p", { style: {
11767
+ marginTop: "16px",
11768
+ fontSize: "12px",
11769
+ color: "rgba(255, 255, 255, 0.6)",
11770
+ margin: "16px 0 0 0",
11771
+ }, children: config.validityText }))] })] }) })] }));
9993
11772
  return ReactDOM.createPortal(dialogContent, portalContainer);
9994
11773
  }
9995
11774
 
11775
+ // Upsell card styles
11776
+ const cardBaseStyles = {
11777
+ position: "relative",
11778
+ display: "flex",
11779
+ flexDirection: "column",
11780
+ padding: "16px",
11781
+ backgroundColor: "var(--bw-surface-color)",
11782
+ border: "2px solid var(--bw-border-color)",
11783
+ borderRadius: "var(--bw-border-radius)",
11784
+ cursor: "pointer",
11785
+ transition: "all 0.2s ease",
11786
+ fontFamily: "var(--bw-font-family)",
11787
+ };
11788
+ const cardSelectedStyles = {
11789
+ ...cardBaseStyles,
11790
+ borderColor: "var(--bw-highlight-color)",
11791
+ backgroundColor: "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.08)",
11792
+ };
11793
+ const cardDisabledStyles = {
11794
+ ...cardBaseStyles,
11795
+ opacity: 0.6,
11796
+ cursor: "not-allowed",
11797
+ };
11798
+ const checkboxContainerStyles = {
11799
+ position: "absolute",
11800
+ top: "12px",
11801
+ right: "12px",
11802
+ zIndex: 1,
11803
+ };
11804
+ const checkboxInnerStyles = {
11805
+ width: "24px",
11806
+ height: "24px",
11807
+ border: "2px solid var(--bw-border-color)",
11808
+ borderRadius: "6px",
11809
+ display: "flex",
11810
+ alignItems: "center",
11811
+ justifyContent: "center",
11812
+ backgroundColor: "var(--bw-surface-color)",
11813
+ transition: "all 0.2s ease",
11814
+ };
11815
+ const checkboxSelectedStyles = {
11816
+ ...checkboxInnerStyles,
11817
+ borderColor: "var(--bw-highlight-color)",
11818
+ backgroundColor: "var(--bw-highlight-color)",
11819
+ };
11820
+ const imageContainerStyles = {
11821
+ width: "100%",
11822
+ height: "120px",
11823
+ marginBottom: "12px",
11824
+ borderRadius: "calc(var(--bw-border-radius) - 4px)",
11825
+ overflow: "hidden",
11826
+ backgroundColor: "var(--bw-background-color)",
11827
+ };
11828
+ const imageStyles = {
11829
+ width: "100%",
11830
+ height: "100%",
11831
+ objectFit: "cover",
11832
+ };
11833
+ const imagePlaceholderStyles = {
11834
+ width: "100%",
11835
+ height: "100%",
11836
+ display: "flex",
11837
+ alignItems: "center",
11838
+ justifyContent: "center",
11839
+ color: "var(--bw-text-muted)",
11840
+ };
11841
+ const nameStyles = {
11842
+ fontSize: "16px",
11843
+ fontWeight: 600,
11844
+ color: "var(--bw-text-color)",
11845
+ margin: "0 0 6px 0",
11846
+ paddingRight: "36px",
11847
+ fontFamily: "var(--bw-font-family)",
11848
+ };
11849
+ const descriptionStyles = {
11850
+ fontSize: "13px",
11851
+ color: "var(--bw-text-muted)",
11852
+ margin: "0 0 10px 0",
11853
+ lineHeight: 1.4,
11854
+ display: "-webkit-box",
11855
+ WebkitLineClamp: 5,
11856
+ WebkitBoxOrient: "vertical",
11857
+ overflow: "hidden",
11858
+ fontFamily: "var(--bw-font-family)",
11859
+ };
11860
+ const itemsContainerStyles = {
11861
+ display: "flex",
11862
+ flexWrap: "wrap",
11863
+ gap: "6px",
11864
+ marginBottom: "10px",
11865
+ };
11866
+ const itemStyles = {
11867
+ display: "inline-flex",
11868
+ alignItems: "center",
11869
+ gap: "4px",
11870
+ padding: "4px 8px",
11871
+ backgroundColor: "var(--bw-background-color)",
11872
+ borderRadius: "4px",
11873
+ fontSize: "12px",
11874
+ color: "var(--bw-text-muted)",
11875
+ fontFamily: "var(--bw-font-family)",
11876
+ };
11877
+ const eventInfoStyles = {
11878
+ display: "flex",
11879
+ alignItems: "center",
11880
+ gap: "12px",
11881
+ padding: "8px 10px",
11882
+ backgroundColor: "rgba(var(--bw-highlight-color-rgb, 0, 177, 170), 0.1)",
11883
+ borderRadius: "6px",
11884
+ fontSize: "12px",
11885
+ marginBottom: "10px",
11886
+ fontFamily: "var(--bw-font-family)",
11887
+ };
11888
+ const priceContainerStyles = {
11889
+ display: "flex",
11890
+ flexDirection: "column",
11891
+ alignItems: "flex-end",
11892
+ marginTop: "8px",
11893
+ paddingTop: "8px",
11894
+ borderTop: "1px solid var(--bw-border-color)",
11895
+ };
11896
+ const pricePerPersonStyles = {
11897
+ fontSize: "15px",
11898
+ fontWeight: 600,
11899
+ color: "var(--bw-highlight-color)",
11900
+ fontFamily: "var(--bw-font-family)",
11901
+ };
11902
+ const priceTotalStyles = {
11903
+ fontSize: "12px",
11904
+ color: "var(--bw-text-muted)",
11905
+ fontFamily: "var(--bw-font-family)",
11906
+ };
11907
+ const unavailableOverlayStyles = {
11908
+ position: "absolute",
11909
+ inset: 0,
11910
+ display: "flex",
11911
+ alignItems: "center",
11912
+ justifyContent: "center",
11913
+ backgroundColor: "rgba(var(--bw-background-color-rgb, 248, 253, 254), 0.85)",
11914
+ borderRadius: "var(--bw-border-radius)",
11915
+ fontSize: "13px",
11916
+ color: "var(--bw-text-muted)",
11917
+ textAlign: "center",
11918
+ padding: "16px",
11919
+ fontFamily: "var(--bw-font-family)",
11920
+ };
11921
+ function UpsellCard({ upsell, isSelected, participantCount, onSelect, }) {
11922
+ const totalPrice = upsell.price * participantCount;
11923
+ const isDisabled = !upsell.available;
11924
+ const getCardStyles = () => {
11925
+ if (isDisabled)
11926
+ return cardDisabledStyles;
11927
+ if (isSelected)
11928
+ return cardSelectedStyles;
11929
+ return cardBaseStyles;
11930
+ };
11931
+ return (jsxRuntime.jsxs("div", { style: getCardStyles(), onClick: !isDisabled ? onSelect : undefined, role: "checkbox", "aria-checked": isSelected, tabIndex: isDisabled ? -1 : 0, onKeyDown: (e) => {
11932
+ if (!isDisabled && (e.key === "Enter" || e.key === " ")) {
11933
+ e.preventDefault();
11934
+ onSelect();
11935
+ }
11936
+ }, 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", {
11937
+ weekday: "short",
11938
+ day: "numeric",
11939
+ month: "short",
11940
+ })] }), 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" }) }))] }));
11941
+ }
11942
+
11943
+ function UpsellsStep({ upsells, selectedUpsells, participantCount, isLoading, isOpen, onClose, onSelect, onContinue, onBack, }) {
11944
+ const selectUpsell = (upsellId) => {
11945
+ const exists = selectedUpsells.find((s) => s.upsellPackageId === upsellId);
11946
+ if (exists) {
11947
+ // Deselect - remove this upsell from selection
11948
+ onSelect(selectedUpsells.filter((s) => s.upsellPackageId !== upsellId));
11949
+ }
11950
+ else {
11951
+ // Add this upsell to selection (checkbox behavior - allows multiple)
11952
+ onSelect([...selectedUpsells, { upsellPackageId: upsellId, quantity: participantCount }]);
11953
+ }
11954
+ };
11955
+ const isSelected = (upsellId) => selectedUpsells.some((s) => s.upsellPackageId === upsellId);
11956
+ // Calculate total for selected upsells
11957
+ const calculateTotal = () => {
11958
+ return selectedUpsells.reduce((total, selection) => {
11959
+ const upsell = upsells.find((u) => u.id === selection.upsellPackageId);
11960
+ if (upsell) {
11961
+ return total + upsell.price * selection.quantity;
11962
+ }
11963
+ return total;
11964
+ }, 0);
11965
+ };
11966
+ const selectedTotal = calculateTotal();
11967
+ const selectedCount = selectedUpsells.length;
11968
+ const footerContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: onBack, style: mergeStyles(buttonStyles.secondary, buttonStyles.fullWidth), children: "\u2190 Zur\u00FCck" }), jsxRuntime.jsx("button", { type: "button", onClick: onContinue, style: mergeStyles(buttonStyles.primary, buttonStyles.fullWidth), children: selectedCount === 0 ? "Weiter ohne Extras" : `Weiter` })] }));
11969
+ return (jsxRuntime.jsx(Sidebar, { isOpen: isOpen, onClose: onClose, title: "Extras hinzuf\u00FCgen", footer: footerContent, children: jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", height: "100%", padding: "16px 16px" }, children: [isLoading && (jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "12px", padding: "40px 20px", ...textStyles.muted }, children: [spinner(), jsxRuntime.jsx("span", { children: "Lade verf\u00FCgbare Extras..." })] })), !isLoading && upsells.length === 0 && (jsxRuntime.jsx("div", { style: { textAlign: "center", padding: "40px 20px", ...textStyles.muted }, children: jsxRuntime.jsx("p", { children: "Keine Extras f\u00FCr diese Buchung verf\u00FCgbar." }) })), !isLoading && upsells.length > 0 && (jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "12px", flex: 1, overflowY: "auto", paddingBottom: "16px" }, children: upsells.map((upsell) => (jsxRuntime.jsx(UpsellCard, { upsell: upsell, isSelected: isSelected(upsell.id), participantCount: participantCount, onSelect: () => selectUpsell(upsell.id) }, upsell.id))) })), selectedCount > 0 && (jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: "16px", paddingBottom: "16px", paddingTop: "16px", borderTop: "1px solid var(--bw-border-color)", fontSize: "14px" }, children: [jsxRuntime.jsxs("span", { style: textStyles.muted, children: [selectedCount, " ", selectedCount === 1 ? "Extra" : "Extras", " ausgew\u00E4hlt"] }), jsxRuntime.jsxs("span", { style: { fontWeight: 600, color: "var(--bw-highlight-color)", fontFamily: "var(--bw-font-family)" }, children: ["+", formatCurrency(selectedTotal)] })] }))] }) }));
11970
+ }
11971
+
9996
11972
  // Main widget component
9997
11973
  function UniversalBookingWidget({ config: baseConfig }) {
9998
11974
  // Apply URL parameter inference
@@ -10014,6 +11990,11 @@ function UniversalBookingWidget({ config: baseConfig }) {
10014
11990
  const [selectedEventType, setSelectedEventType] = React__default.useState(null);
10015
11991
  const [eventInstances, setEventInstances] = React__default.useState([]);
10016
11992
  const [selectedEventInstance, setSelectedEventInstance] = React__default.useState(null);
11993
+ // Upsells state
11994
+ const [upsells, setUpsells] = React__default.useState([]);
11995
+ const [selectedUpsells, setSelectedUpsells] = React__default.useState([]);
11996
+ const [isLoadingUpsells, setIsLoadingUpsells] = React__default.useState(false);
11997
+ const [tempParticipantCount, setTempParticipantCount] = React__default.useState(1); // Used during upsell step
10017
11998
  // State for upcoming events (next-events view mode)
10018
11999
  const [upcomingEvents, setUpcomingEvents] = React__default.useState([]);
10019
12000
  const [showingPreview, setShowingPreview] = React__default.useState(true);
@@ -10033,6 +12014,7 @@ function UniversalBookingWidget({ config: baseConfig }) {
10033
12014
  const [systemConfig, setSystemConfig] = React__default.useState(null);
10034
12015
  // PERFORMANCE OPTIMIZATION: Lazy component loading
10035
12016
  const [shouldRenderInstanceSelection, setShouldRenderInstanceSelection] = React__default.useState(false);
12017
+ const [shouldRenderUpsells, setShouldRenderUpsells] = React__default.useState(false);
10036
12018
  const [shouldRenderBookingForm, setShouldRenderBookingForm] = React__default.useState(false);
10037
12019
  // Promo dialog state
10038
12020
  const [showPromoDialog, setShowPromoDialog] = React__default.useState(false);
@@ -10307,15 +12289,42 @@ function UniversalBookingWidget({ config: baseConfig }) {
10307
12289
  setError("Fehler beim Laden der Veranstaltungsdetails");
10308
12290
  }
10309
12291
  };
12292
+ // Load available upsells for the selected event instance
12293
+ const loadUpsells = async (eventTypeId, eventInstanceId, participantCount) => {
12294
+ try {
12295
+ const response = await fetch(getApiUrl(config.apiBaseUrl, "/booking/upsells"), {
12296
+ method: "POST",
12297
+ headers: createApiHeaders(config),
12298
+ body: JSON.stringify({
12299
+ organizationId: config.organizationId,
12300
+ eventTypeId,
12301
+ eventInstanceId,
12302
+ participantCount,
12303
+ }),
12304
+ });
12305
+ const data = await response.json();
12306
+ if (response.ok) {
12307
+ return data.upsells || [];
12308
+ }
12309
+ else {
12310
+ console.error("Upsells API error:", data.error);
12311
+ return [];
12312
+ }
12313
+ }
12314
+ catch (err) {
12315
+ console.error("Upsells fetch error:", err);
12316
+ return [];
12317
+ }
12318
+ };
10310
12319
  // Validate configuration
10311
12320
  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." })] }) }));
12321
+ 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
12322
  }
10314
12323
  if (!config.eventInstanceId &&
10315
12324
  !config.categoryId &&
10316
12325
  !config.eventTypeIds &&
10317
12326
  !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." })] }) }));
12327
+ 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
12328
  }
10320
12329
  // Event type selection handlers
10321
12330
  const handleEventTypeSelect = async (eventType) => {
@@ -10333,6 +12342,32 @@ function UniversalBookingWidget({ config: baseConfig }) {
10333
12342
  // Event instance selection handlers
10334
12343
  const handleEventInstanceSelect = async (eventInstance) => {
10335
12344
  setSelectedEventInstance(eventInstance);
12345
+ // Set default participant count for upsell calculations
12346
+ const defaultParticipantCount = 1;
12347
+ setTempParticipantCount(defaultParticipantCount);
12348
+ // Check for available upsells
12349
+ if (selectedEventType) {
12350
+ setIsLoadingUpsells(true);
12351
+ setShouldRenderUpsells(true);
12352
+ try {
12353
+ const availableUpsells = await loadUpsells(selectedEventType.id, eventInstance.id, defaultParticipantCount);
12354
+ if (availableUpsells.length > 0) {
12355
+ // Show upsells step
12356
+ setUpsells(availableUpsells);
12357
+ setSelectedUpsells([]);
12358
+ setCurrentStep("upsells");
12359
+ setIsLoadingUpsells(false);
12360
+ return; // Don't proceed to booking yet
12361
+ }
12362
+ }
12363
+ catch (err) {
12364
+ console.error("Error loading upsells:", err);
12365
+ }
12366
+ finally {
12367
+ setIsLoadingUpsells(false);
12368
+ }
12369
+ }
12370
+ // No upsells available, go directly to booking
10336
12371
  setCurrentStep("booking");
10337
12372
  setShouldRenderBookingForm(true);
10338
12373
  setIsLoadingEventDetails(true);
@@ -10363,6 +12398,30 @@ function UniversalBookingWidget({ config: baseConfig }) {
10363
12398
  setError(errorMessage);
10364
12399
  config.onError?.(errorMessage);
10365
12400
  };
12401
+ // Upsells handlers
12402
+ const handleUpsellsSelect = (selections) => {
12403
+ setSelectedUpsells(selections);
12404
+ };
12405
+ const handleUpsellsContinue = async () => {
12406
+ // Move to booking step
12407
+ setCurrentStep("booking");
12408
+ setShouldRenderBookingForm(true);
12409
+ setIsLoadingEventDetails(true);
12410
+ try {
12411
+ if (selectedEventInstance) {
12412
+ await loadEventDetails(selectedEventInstance.id);
12413
+ }
12414
+ }
12415
+ finally {
12416
+ setIsLoadingEventDetails(false);
12417
+ }
12418
+ };
12419
+ const handleUpsellsBack = () => {
12420
+ // Go back to event instance selection
12421
+ setCurrentStep("eventInstances");
12422
+ setSelectedUpsells([]);
12423
+ setUpsells([]);
12424
+ };
10366
12425
  const handleUpcomingEventSelect = async (eventInstanceId) => {
10367
12426
  const upcomingEvent = upcomingEvents.find((event) => event.id === eventInstanceId);
10368
12427
  if (upcomingEvent) {
@@ -10432,7 +12491,83 @@ function UniversalBookingWidget({ config: baseConfig }) {
10432
12491
  };
10433
12492
  // Error state
10434
12493
  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." })] }) }) }));
12494
+ return (jsxRuntime.jsx(StyleProvider, { config: config, children: jsxRuntime.jsx("div", { style: { maxWidth: "600px", margin: "0 auto", padding: "24px" }, children: jsxRuntime.jsxs("div", { style: {
12495
+ backgroundColor: "var(--bw-surface-color)",
12496
+ border: "1px solid var(--bw-error-color)",
12497
+ borderRadius: "var(--bw-border-radius)",
12498
+ padding: "24px",
12499
+ textAlign: "center",
12500
+ fontFamily: "var(--bw-font-family)",
12501
+ }, children: [jsxRuntime.jsx("div", { style: {
12502
+ width: "64px",
12503
+ height: "64px",
12504
+ backgroundColor: "var(--bw-error-color)",
12505
+ borderRadius: "50%",
12506
+ margin: "0 auto 16px auto",
12507
+ display: "flex",
12508
+ alignItems: "center",
12509
+ justifyContent: "center",
12510
+ fontSize: "32px",
12511
+ color: "white",
12512
+ }, children: "\u26A0\uFE0F" }), jsxRuntime.jsx("h2", { style: {
12513
+ fontSize: "20px",
12514
+ fontWeight: 600,
12515
+ color: "var(--bw-text-color)",
12516
+ margin: "0 0 8px 0",
12517
+ fontFamily: "var(--bw-font-family)",
12518
+ }, children: "Buchungen vor\u00FCbergehend nicht verf\u00FCgbar" }), jsxRuntime.jsx("p", { style: {
12519
+ color: "var(--bw-text-muted)",
12520
+ fontSize: "16px",
12521
+ lineHeight: 1.5,
12522
+ margin: "0 0 24px 0",
12523
+ fontFamily: "var(--bw-font-family)",
12524
+ }, children: "Es gab ein Problem beim Laden der verf\u00FCgbaren Termine. Bitte versuche es in einem Moment erneut." }), jsxRuntime.jsxs("details", { style: {
12525
+ marginBottom: "24px",
12526
+ textAlign: "left",
12527
+ backgroundColor: "var(--bw-background-color)",
12528
+ borderRadius: "var(--bw-border-radius-small)",
12529
+ padding: "4px",
12530
+ border: "1px solid var(--bw-border-color)",
12531
+ }, children: [jsxRuntime.jsx("summary", { style: {
12532
+ cursor: "pointer",
12533
+ fontWeight: 500,
12534
+ color: "var(--bw-text-muted)",
12535
+ fontSize: "14px",
12536
+ fontFamily: "var(--bw-font-family)",
12537
+ marginBottom: "8px",
12538
+ }, children: "Technische Details anzeigen" }), jsxRuntime.jsx("code", { style: {
12539
+ display: "block",
12540
+ fontSize: "14px",
12541
+ color: "var(--bw-text-muted)",
12542
+ fontFamily: "ui-monospace, monospace",
12543
+ wordBreak: "break-word",
12544
+ whiteSpace: "pre-wrap",
12545
+ }, children: error })] }), jsxRuntime.jsx("div", { style: {
12546
+ display: "flex",
12547
+ gap: "16px",
12548
+ justifyContent: "center",
12549
+ flexWrap: "wrap",
12550
+ }, children: jsxRuntime.jsxs("button", { onClick: () => window.location.reload(), style: {
12551
+ backgroundColor: "var(--bw-highlight-color)",
12552
+ color: "white",
12553
+ padding: "12px 24px",
12554
+ border: "none",
12555
+ borderRadius: "var(--bw-border-radius)",
12556
+ fontSize: "16px",
12557
+ fontWeight: 600,
12558
+ cursor: "pointer",
12559
+ fontFamily: "var(--bw-font-family)",
12560
+ transition: "all 0.2s ease",
12561
+ display: "flex",
12562
+ alignItems: "center",
12563
+ gap: "8px",
12564
+ }, children: [jsxRuntime.jsx("span", { style: { fontSize: "16px" }, children: "\uD83D\uDD04" }), "Seite neu laden"] }) }), jsxRuntime.jsx("p", { style: {
12565
+ color: "var(--bw-text-muted)",
12566
+ fontSize: "14px",
12567
+ marginTop: "24px",
12568
+ margin: "24px 0 0 0",
12569
+ fontFamily: "var(--bw-font-family)",
12570
+ }, children: "Falls das Problem weiterhin besteht, kontaktiere bitte den Support." })] }) }) }));
10436
12571
  }
10437
12572
  // Main view based on view mode
10438
12573
  if (viewMode === "next-events" && showingPreview) {
@@ -10448,13 +12583,16 @@ function UniversalBookingWidget({ config: baseConfig }) {
10448
12583
  setCurrentStep("eventTypes");
10449
12584
  setShowingPreview(true);
10450
12585
  setEventDetails(null);
10451
- }, systemConfig: systemConfig })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
12586
+ }, systemConfig: systemConfig, selectedUpsells: selectedUpsells, upsells: upsells })), jsxRuntime.jsx(BookingSuccessModal, { isOpen: isSuccess, onClose: () => {
10452
12587
  setIsSuccess(false);
10453
12588
  setCurrentStep("eventTypes");
10454
12589
  setShowingPreview(true);
10455
12590
  setSuccessPaymentIntentId(null);
10456
12591
  setShouldRenderInstanceSelection(false);
12592
+ setShouldRenderUpsells(false);
10457
12593
  setShouldRenderBookingForm(false);
12594
+ setSelectedUpsells([]);
12595
+ setUpsells([]);
10458
12596
  const url = new URL(window.location.href);
10459
12597
  url.searchParams.delete("payment_intent");
10460
12598
  url.searchParams.delete("payment_intent_client_secret");
@@ -10484,7 +12622,23 @@ function UniversalBookingWidget({ config: baseConfig }) {
10484
12622
  }, config: config, onError: setError, paymentIntentId: successPaymentIntentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
10485
12623
  }
10486
12624
  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: () => {
12625
+ return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, style: {
12626
+ display: "flex",
12627
+ justifyContent: "center",
12628
+ alignItems: "center",
12629
+ minHeight: "120px",
12630
+ }, children: [jsxRuntime.jsx("button", { type: "button", style: {
12631
+ backgroundColor: "var(--bw-highlight-color)",
12632
+ color: "white",
12633
+ padding: "16px 32px",
12634
+ border: "none",
12635
+ borderRadius: "var(--bw-border-radius)",
12636
+ fontSize: "18px",
12637
+ fontWeight: 600,
12638
+ fontFamily: "var(--bw-font-family)",
12639
+ boxShadow: "var(--bw-shadow-md)",
12640
+ cursor: "pointer",
12641
+ }, onClick: () => {
10488
12642
  if (isDirectInstanceMode) {
10489
12643
  setCurrentStep("booking");
10490
12644
  setShouldRenderBookingForm(true);
@@ -10494,13 +12648,16 @@ function UniversalBookingWidget({ config: baseConfig }) {
10494
12648
  setShouldRenderInstanceSelection(true);
10495
12649
  }
10496
12650
  }, 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: () => {
12651
+ (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
12652
  setIsSuccess(false);
10499
12653
  setCurrentStep("eventTypes");
10500
12654
  setSidebarOpen(false);
10501
12655
  setSuccessPaymentIntentId(null);
10502
12656
  setShouldRenderInstanceSelection(false);
12657
+ setShouldRenderUpsells(false);
10503
12658
  setShouldRenderBookingForm(false);
12659
+ setSelectedUpsells([]);
12660
+ setUpsells([]);
10504
12661
  const url = new URL(window.location.href);
10505
12662
  url.searchParams.delete("payment_intent");
10506
12663
  url.searchParams.delete("payment_intent_client_secret");
@@ -10538,12 +12695,15 @@ function UniversalBookingWidget({ config: baseConfig }) {
10538
12695
  };
10539
12696
  };
10540
12697
  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: () => {
12698
+ 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
12699
  setIsSuccess(false);
10543
12700
  setCurrentStep("eventTypes");
10544
12701
  setSuccessPaymentIntentId(null);
10545
12702
  setShouldRenderInstanceSelection(false);
12703
+ setShouldRenderUpsells(false);
10546
12704
  setShouldRenderBookingForm(false);
12705
+ setSelectedUpsells([]);
12706
+ setUpsells([]);
10547
12707
  const url = new URL(window.location.href);
10548
12708
  url.searchParams.delete("payment_intent");
10549
12709
  url.searchParams.delete("payment_intent_client_secret");
@@ -10579,7 +12739,7 @@ function styleInject(css, ref) {
10579
12739
  }
10580
12740
  }
10581
12741
 
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}}}";
12742
+ var css_248z = ".booking-widget-container{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;color:var(--bw-text-color,#1e293b);direction:ltr;display:block;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;position:relative;text-align:left}.booking-widget-container *,.booking-widget-container :after,.booking-widget-container :before{box-sizing:border-box;margin:0;padding:0}.booking-widget-container input,.booking-widget-container select,.booking-widget-container textarea{font-family:inherit;font-size:inherit;line-height:inherit}.booking-widget-container button{background:none;border:none;cursor:pointer;font-family:inherit;font-size:inherit}.booking-widget-container a{color:inherit;text-decoration:none}.booking-widget-container img{display:block;height:auto;max-width:100%;vertical-align:middle}.booking-widget-container ol,.booking-widget-container ul{list-style:none}.booking-widget-container h1,.booking-widget-container h2,.booking-widget-container h3,.booking-widget-container h4,.booking-widget-container h5,.booking-widget-container h6{font-size:inherit;font-weight:inherit}#booking-widget-portal{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);direction:ltr;font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);isolation:isolate;line-height:1.5;text-align:left}#booking-widget-portal *,#booking-widget-portal :after,#booking-widget-portal :before{box-sizing:border-box}#booking-widget-portal-root{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--bw-text-color,#1e293b);font-family:var(--bw-font-family,system-ui,-apple-system,sans-serif);font-size:var(--bw-font-size,14px);line-height:1.5}:root{--bw-highlight-color:#00b1aa;--bw-highlight-color-rgb:0,177,170;--bw-background-color:#f8fdfe;--bw-surface-color:#fff;--bw-text-color:#0e7490;--bw-text-muted:rgba(14,116,144,.7);--bw-border-color:#bae6fd;--bw-success-color:#38bdf8;--bw-warning-color:#fbbf24;--bw-error-color:#f43f5e;--bw-border-radius:18px;--bw-border-radius-small:calc(var(--bw-border-radius)*0.8);--bw-spacing:16px;--bw-spacing-large:24px;--bw-font-family:\"Inter\",system-ui,sans-serif;--bw-font-size:14px;--bw-font-size-large:18px;--bw-font-size-small:12px;--bw-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--bw-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--bw-highlight-muted:rgba(0,177,170,.1);--bw-highlight-subtle:rgba(0,177,170,.05);--bw-text-subtle:rgba(14,116,144,.4)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes shimmer{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}@keyframes promo-wave{0%,to{transform:translateX(0) translateY(0)}25%{transform:translateX(5px) translateY(-3px)}50%{transform:translateX(0) translateY(-5px)}75%{transform:translateX(-5px) translateY(-3px)}}@keyframes promo-float{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes promo-shimmer{0%{background-position:-200%}to{background-position:200%}}@keyframes promo-sparkle{0%,to{opacity:.3;transform:scale(1)}50%{opacity:1;transform:scale(1.2)}}@keyframes promo-snow{0%{opacity:0;transform:translateY(-10px) rotate(0deg)}10%{opacity:1}90%{opacity:1}to{opacity:0;transform:translateY(350px) rotate(1turn)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes slide-in-right{0%{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}@keyframes slide-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.animate-spin{animation:spin 1s linear infinite}.animate-shimmer{animation:shimmer 2s infinite}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-fade-in{animation:fade-in .2s ease-out}.animate-slide-in-up{animation:slide-in-up .3s ease-out}.animate-scale-in{animation:scale-in .2s ease-out}.skeleton-shimmer{overflow:hidden;position:relative}.skeleton-shimmer:after{animation:shimmer 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.3),transparent);content:\"\";height:100%;left:0;position:absolute;top:0;width:100%}@media (max-width:768px){.sidebar-mobile{border-radius:0!important;max-width:100%!important;width:100%!important}}@media (max-width:600px){.event-type-list{gap:12px!important;padding:8px!important}.event-type-card{flex:1 1 100%!important;max-width:100%!important;padding:0!important}.event-type-img{height:160px!important}.event-type-title{font-size:1.1rem!important}.event-type-desc{font-size:.8rem!important;max-height:100px!important;min-height:100px!important}.event-type-content{padding:16px 24px!important}}.event-type-markdown{overflow:visible!important}.event-type-markdown p{color:var(--bw-text-muted);font-family:var(--bw-font-family);line-height:1.6;margin:0 0 8px}.event-type-markdown p:last-child{margin-bottom:0}.event-type-markdown h2{font-size:18px!important;font-weight:700!important;margin:12px 0 6px!important}.event-type-markdown h2,.event-type-markdown h3{color:var(--bw-text-color)!important;line-height:1.3!important}.event-type-markdown h3{font-size:16px!important;font-weight:600!important;margin:10px 0 4px!important}.event-type-markdown strong{color:var(--bw-text-color);font-weight:600}.event-type-markdown em{font-style:italic}.event-type-markdown u{text-decoration:underline}.event-type-markdown ul{list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ul li{color:var(--bw-text-muted)!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ul li:before{color:var(--bw-text-color)!important;content:\"•\"!important;font-weight:700!important;left:-16px!important;position:absolute!important;top:0!important}.event-type-markdown ol{counter-reset:list-counter!important;list-style:none!important;margin:6px 0!important;padding:0 0 0 24px!important;position:relative!important}.event-type-markdown ol li{color:var(--bw-text-muted)!important;counter-increment:list-counter!important;font-family:var(--bw-font-family)!important;margin-bottom:2px!important;padding-left:0!important;position:relative!important}.event-type-markdown ol li:before{color:var(--bw-text-color)!important;content:counter(list-counter) \".\"!important;font-weight:700!important;left:-20px!important;position:absolute!important;top:0!important}.event-type-markdown blockquote{border-left:2px solid var(--bw-border-color);color:var(--bw-text-muted);font-style:italic;margin:4px 0;padding-left:12px}.event-type-markdown a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{color:var(--bw-text-color);font-weight:600;margin-bottom:.5em}.markdown-content h1{font-size:1.5em}.markdown-content h2{font-size:1.25em}.markdown-content h3{font-size:1.1em}.markdown-content p{line-height:1.6;margin-bottom:1em}.markdown-content ol,.markdown-content ul{margin-bottom:1em;padding-left:1.5em}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content li{margin-bottom:.25em}.markdown-content a{color:var(--bw-highlight-color);text-decoration:underline}.markdown-content a:hover{opacity:.8}.markdown-content strong{font-weight:600}.markdown-content em{font-style:italic}.markdown-content code{background:var(--bw-highlight-subtle);border-radius:4px;font-family:monospace;font-size:.9em;padding:.125em .25em}.markdown-content blockquote{border-left:3px solid var(--bw-highlight-color);color:var(--bw-text-muted);margin:1em 0;padding-left:1em}.print-only{display:none}.print-hidden{display:block}@media print{.print-only{display:block}.print-hidden{display:none!important}.print-booking-header{border-bottom:2px solid #000;display:block;margin-bottom:24px;padding-bottom:16px;text-align:center}.print-booking-header h1{font-size:24px;margin:0 0 8px}.print-booking-header .subtitle{color:#666;font-size:14px}.print-booking-card{border:1px solid #ccc;border-radius:8px;margin-bottom:16px;padding:16px;page-break-inside:avoid}.print-section-title{border-bottom:1px solid #ddd;display:block;font-size:16px;font-weight:600;margin-bottom:12px;padding-bottom:8px}.print-detail-grid{display:grid;gap:12px;grid-template-columns:1fr 1fr}.print-detail-item{margin-bottom:8px}.print-detail-label{color:#666;font-size:12px;margin-bottom:4px}.print-detail-value{font-size:14px;font-weight:600}.print-status-badge{border-radius:9999px;display:inline-block;font-size:12px;font-weight:600;padding:4px 12px}.print-status-paid{background-color:#dcfce7;color:#166534;display:inline-block}.print-participant{align-items:center;background-color:#f9fafb;border-radius:4px;display:flex;justify-content:space-between;margin-bottom:8px;padding:8px}.print-participant-name{font-weight:600}.print-participant-age{color:#666;font-size:12px}.print-payment-summary{display:block}.print-payment-row{border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:4px 0}.print-payment-row:last-child{border-bottom:none;font-weight:600}.print-footer{border-top:1px solid #ddd;color:#666;display:block;font-size:12px;margin-top:24px;padding-top:16px;text-align:center}.print-footer p{margin:4px 0}}";
10583
12743
  styleInject(css_248z);
10584
12744
 
10585
12745
  // Export init function for vanilla JS usage