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