require("./chunk-9hOWP6kD.cjs");
const require_WidgetInteractionContext = require("./WidgetInteractionContext-DUJhDVnC.cjs");
const require_registries = require("./registries-DgzzKX8_.cjs");
const require_purify_es = require("./purify.es-ESRydCt8.cjs");
const require_MediaRenderer = require("./MediaRenderer-BI_FoJAZ.cjs");
let react = require("react");
let react_jsx_runtime = require("react/jsx-runtime");
//#region ../widgets/src/widgets/CarouselWidget.tsx
const VIDEO_CONTROLS_HEIGHT = 44;
const HEADER_SIZE_MAP = {
	xs: "text-base sm:text-lg",
	sm: "text-lg sm:text-xl",
	md: "text-xl sm:text-2xl",
	lg: "text-2xl sm:text-3xl",
	xl: "text-3xl sm:text-[32px]",
	"2xl": "text-[32px] sm:text-[40px]"
};
const BODY_SIZE_MAP = {
	xs: "text-[12px]",
	sm: "text-[13px]",
	md: "text-[14px]",
	lg: "text-[15px]",
	xl: "text-[16px]",
	"2xl": "text-[18px]"
};
function useCarouselController({ slideCount, enableAutoScroll, autoScrollInterval }) {
	const [currentIndex, setCurrentIndex] = (0, react.useState)(0);
	const [isHovered, setIsHovered] = (0, react.useState)(false);
	const [isFocused, setIsFocused] = (0, react.useState)(false);
	const hasSlides = slideCount > 0;
	const isPaused = isHovered || isFocused;
	const goToNext = (0, react.useCallback)(() => {
		if (!hasSlides) return;
		setCurrentIndex((prev) => prev === slideCount - 1 ? 0 : prev + 1);
	}, [hasSlides, slideCount]);
	const goToPrevious = (0, react.useCallback)(() => {
		if (!hasSlides) return;
		setCurrentIndex((prev) => prev === 0 ? slideCount - 1 : prev - 1);
	}, [hasSlides, slideCount]);
	const goToSlide = (0, react.useCallback)((index) => {
		if (!hasSlides) return;
		if (index >= 0 && index < slideCount) setCurrentIndex(index);
	}, [hasSlides, slideCount]);
	(0, react.useEffect)(() => {
		if (!enableAutoScroll || !hasSlides || isPaused) return;
		const intervalId = setInterval(goToNext, autoScrollInterval);
		return () => clearInterval(intervalId);
	}, [
		enableAutoScroll,
		autoScrollInterval,
		hasSlides,
		isPaused,
		goToNext
	]);
	(0, react.useEffect)(() => {
		if (currentIndex >= slideCount && slideCount > 0) setCurrentIndex(0);
	}, [slideCount, currentIndex]);
	return {
		currentIndex,
		hasSlides,
		isPaused,
		goToNext,
		goToPrevious,
		goToSlide,
		handleMouseEnter: (0, react.useCallback)(() => setIsHovered(true), []),
		handleMouseLeave: (0, react.useCallback)(() => setIsHovered(false), []),
		handleFocus: (0, react.useCallback)(() => setIsFocused(true), []),
		handleBlur: (0, react.useCallback)((e) => {
			if (!e.currentTarget.contains(e.relatedTarget)) setIsFocused(false);
		}, [])
	};
}
function CarouselWidget({ slides = [], autoScrollInterval = 6500, enableAutoScroll = false, carouselHeight = "400px", align = {
	vertical: "bottom",
	horizontal: "left"
}, overlayIntensity = 70, borderRadius = "xl", borderWidth = "none", borderColor = "muted", padding = 8, textWidth = "620px", headerSize = "xl", headerColor = "background", textSize = "md", textColor = "background", showButton = true, buttonColor = "background", buttonSize = "default", overlayEnabled = true, overlayType = "gradient", editorialFrame = true, frameColor = "foreground", className, ...props }) {
	const totalSlides = slides.length;
	const { currentIndex, hasSlides, isPaused, goToNext, goToPrevious, goToSlide, handleMouseEnter, handleMouseLeave, handleFocus, handleBlur } = useCarouselController({
		slideCount: totalSlides,
		enableAutoScroll,
		autoScrollInterval
	});
	const { onItemClick } = require_WidgetInteractionContext.useWidgetInteraction();
	const verticalClass = align.vertical === "top" ? "items-start" : align.vertical === "center" ? "items-center" : "items-end";
	const horizontalClass = align.horizontal === "center" ? "justify-center text-center mx-auto" : align.horizontal === "right" ? "justify-end ml-auto text-right" : "justify-start text-left";
	const frameShadowStyle = editorialFrame ? { boxShadow: `0 1px 2px color-mix(in oklch, var(--color-foreground) 4%, transparent), 0 30px 60px -30px color-mix(in oklch, var(--color-foreground) 40%, transparent)` } : void 0;
	const frameBg = editorialFrame ? `bg-${frameColor}` : "";
	const isActiveSlideVideo = slides[currentIndex]?.content.type === "VideoWidget";
	if (!hasSlides) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
		className: `relative w-full overflow-hidden rounded-${borderRadius} ${require_registries.borderWidthClasses[borderWidth]} ${borderWidth !== "none" ? require_registries.borderColorClasses[borderColor] : ""} ${frameBg} ${className ?? ""}`,
		style: {
			minHeight: carouselHeight,
			...frameShadowStyle
		},
		...props,
		children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
			className: "bg-muted/20 flex h-full w-full items-center justify-center",
			style: { minHeight: carouselHeight },
			children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
				className: "text-muted-foreground flex flex-col items-center gap-2",
				children: [
					/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
						className: "text-4xl",
						children: "🎠"
					}),
					/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
						className: "text-sm",
						children: "No slides added"
					}),
					/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
						className: "text-muted-foreground/70 text-xs",
						children: "Add slides to create a carousel"
					})
				]
			})
		})
	});
	return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
		className: `relative isolate w-full overflow-hidden rounded-${borderRadius} ${require_registries.borderWidthClasses[borderWidth]} ${borderWidth !== "none" ? require_registries.borderColorClasses[borderColor] : ""} ${frameBg} ${className ?? ""}`,
		style: {
			minHeight: carouselHeight,
			...frameShadowStyle
		},
		onMouseEnter: handleMouseEnter,
		onMouseLeave: handleMouseLeave,
		onFocus: handleFocus,
		onBlur: handleBlur,
		...props,
		children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
			className: "relative w-full",
			style: {
				minHeight: carouselHeight,
				height: carouselHeight
			},
			children: [slides.map((slide, index) => {
				const isActive = index === currentIndex;
				const isVideoSlide = slide.content.type === "VideoWidget";
				const parsedOverlayIntensity = Number(String(overlayIntensity).replace("%", ""));
				const overlayOpacity = (Number.isFinite(parsedOverlayIntensity) ? Math.min(100, Math.max(0, parsedOverlayIntensity)) : 70) / 100;
				const isInteractive = !!onItemClick && isActive && !isVideoSlide;
				const interactionProps = isInteractive ? {
					role: "button",
					tabIndex: 0,
					onClick: () => onItemClick(slide),
					onKeyDown: (e) => {
						if (e.key === "Enter" || e.key === " ") {
							e.preventDefault();
							onItemClick(slide);
						}
					}
				} : {};
				return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
					className: `absolute inset-0 transition-opacity duration-700 ease-out${isInteractive ? " cursor-pointer focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:outline-none focus-visible:ring-inset" : ""}`,
					style: {
						opacity: isActive ? 1 : 0,
						pointerEvents: isActive ? "auto" : "none"
					},
					"aria-hidden": !isActive,
					...interactionProps,
					children: [isVideoSlide ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
						className: "absolute inset-0 h-full w-full",
						children: isActive && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MediaRenderer.MediaRenderer, { ...require_MediaRenderer.getMediaPropsFromWidgetSchema(slide.content) })
					}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
						/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
							className: "absolute inset-0 h-full w-full",
							style: {
								transform: isActive ? "scale(1)" : "scale(1.04)",
								animation: isActive ? "fluidCarouselKenBurns 900ms ease-out both" : void 0
							},
							children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MediaRenderer.MediaRenderer, { ...require_MediaRenderer.getMediaPropsFromWidgetSchema(slide.content) })
						}),
						overlayEnabled && editorialFrame && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
							className: `pointer-events-none absolute inset-0 bg-gradient-to-t from-${frameColor} via-${frameColor}/65 to-${frameColor}/10`,
							style: { opacity: overlayOpacity }
						}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
							className: `pointer-events-none absolute inset-0 bg-gradient-to-r from-${frameColor}/80 via-transparent to-transparent`,
							style: { opacity: Math.min(1, overlayOpacity + .1) }
						})] }),
						overlayEnabled && !editorialFrame && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
							className: `pointer-events-none absolute inset-0 ${overlayType === "gradient" ? "bg-gradient-to-t from-black to-transparent" : "bg-black"}`,
							style: { opacity: overlayOpacity }
						})
					] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
						className: `pointer-events-none absolute inset-0 flex px-6 sm:px-10 ${verticalClass} ${align.horizontal === "center" ? "justify-center" : align.horizontal === "right" ? "justify-end" : "justify-start"}`,
						style: {
							paddingTop: padding * 4,
							paddingBottom: padding * 4 + (totalSlides > 1 ? 24 + (isVideoSlide ? VIDEO_CONTROLS_HEIGHT : 0) : 0)
						},
						children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
							className: `${isActive && !isVideoSlide ? "pointer-events-auto" : "pointer-events-none"} flex w-full flex-col gap-3 ${horizontalClass}`,
							style: {
								maxWidth: textWidth,
								animation: isActive ? "fluidCarouselTextRise 450ms ease-out both" : void 0,
								animationDelay: isActive ? "120ms" : void 0
							},
							children: [
								(slide.eyebrow || slide.tag || slide.meta) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
									className: `flex flex-wrap items-center gap-2 ${align.horizontal === "center" ? "justify-center" : align.horizontal === "right" ? "justify-end" : "justify-start"}`,
									children: [
										slide.tag && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
											className: `rounded-full bg-${slide.tagColor ?? "background"} text-${slide.tagColor ?? "background"}-foreground px-2.5 py-1 text-[10px] font-bold tracking-[0.14em] uppercase`,
											style: slide.tagColor === "background" || slide.tagColor === "foreground" || !slide.tagColor ? tagFallbackStyle(slide.tagColor, frameColor) : void 0,
											children: slide.tag
										}),
										slide.eyebrow && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
											className: `text-${headerColor}/70 text-[10px] font-bold tracking-[0.16em] uppercase`,
											children: slide.eyebrow
										}),
										slide.meta && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
											className: `text-${headerColor}/60 text-[10px] font-bold tracking-[0.16em] uppercase`,
											children: slide.meta
										})
									]
								}),
								slide.title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
									className: `text-${headerColor} font-bold ${HEADER_SIZE_MAP[headerSize]} leading-[1.12] tracking-[-0.018em]`,
									children: slide.title
								}),
								slide.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
									className: `text-${textColor}/70 ${BODY_SIZE_MAP[textSize]} leading-[1.55]`,
									dangerouslySetInnerHTML: { __html: require_purify_es.purify.sanitize(slide.description, {
										ALLOWED_TAGS: [
											"br",
											"strong",
											"em",
											"b",
											"i",
											"ul",
											"ol",
											"li",
											"p"
										],
										ALLOWED_ATTR: []
									}) }
								}),
								(() => {
									const showPrimary = slide.buttonEnabled && showButton && Boolean(slide.buttonText) && Boolean(slide.buttonLink);
									const showSecondary = Boolean(slide.secondaryButtonText) && Boolean(slide.secondaryButtonLink);
									if (!showPrimary && !showSecondary) return null;
									return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
										className: `mt-3 flex flex-wrap items-center gap-3 ${align.horizontal === "center" ? "justify-center" : align.horizontal === "right" ? "justify-end" : "justify-start"}`,
										children: [showPrimary && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
											href: slide.buttonLink,
											onClick: (e) => e.stopPropagation(),
											className: `inline-flex items-center gap-1.5 rounded-full bg-${buttonColor} text-${buttonColor}-foreground px-5 py-2.5 text-[13px] font-bold transition-transform hover:scale-[1.02] ${buttonSizeClass(buttonSize)}`,
											style: { boxShadow: `0 8px 22px -8px color-mix(in oklch, var(--color-foreground) 35%, transparent)` },
											children: [slide.buttonText, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
												"aria-hidden": "true",
												className: "text-[14px]",
												children: "→"
											})]
										}), showSecondary && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
											href: slide.secondaryButtonLink,
											onClick: (e) => e.stopPropagation(),
											className: `inline-flex items-center gap-1 text-${headerColor}/80 hover:text-${headerColor} text-[12px] font-bold transition-colors`,
											children: [slide.secondaryButtonText, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
												"aria-hidden": "true",
												children: "→"
											})]
										})]
									});
								})()
							]
						}, `content-${currentIndex}`)
					})]
				}, slide.id);
			}), totalSlides > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
				className: "pointer-events-none absolute inset-0 z-20",
				children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
					className: "pointer-events-auto absolute top-6 right-6 flex items-center gap-1.5",
					children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
						type: "button",
						onClick: goToPrevious,
						"aria-label": "Previous slide",
						className: `flex size-10 items-center justify-center rounded-full bg-${headerColor}/10 text-${headerColor} ring-1 ring-${headerColor}/15 backdrop-blur-sm transition-colors hover:bg-${headerColor}/20`,
						children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronLeftIcon, {})
					}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
						type: "button",
						onClick: goToNext,
						"aria-label": "Next slide",
						className: `flex size-10 items-center justify-center rounded-full bg-${headerColor} text-${headerColor}-foreground transition-transform hover:scale-[1.04]`,
						style: {
							boxShadow: `0 4px 14px -4px color-mix(in oklch, var(--color-${headerColor}) 45%, transparent)`,
							...nextButtonFallbackStyle(headerColor, frameColor)
						},
						children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronRightIcon, {})
					})]
				}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
					className: `pointer-events-auto absolute inset-x-0 flex items-center gap-1 px-6 pb-2 sm:px-10`,
					style: {
						bottom: isActiveSlideVideo ? VIDEO_CONTROLS_HEIGHT : 0,
						transition: "bottom 200ms ease-out"
					},
					children: slides.map((_, i) => {
						const state = i < currentIndex ? "done" : i === currentIndex ? "active" : "upcoming";
						return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
							type: "button",
							onClick: () => goToSlide(i),
							"aria-label": `Go to slide ${i + 1}`,
							"aria-current": state === "active" ? "true" : "false",
							className: "group flex-1 py-2",
							children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
								className: `block h-[2px] w-full overflow-hidden rounded-full bg-${headerColor}/20`,
								children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
									className: `block h-full rounded-full bg-${headerColor}`,
									style: progressFillStyle(state, enableAutoScroll, autoScrollInterval, isPaused)
								}, `fill-${i}-${currentIndex}`)
							})
						}, `progress-${i}`);
					})
				})]
			})]
		})
	});
}
function progressFillStyle(state, autoScroll, duration, paused) {
	if (state === "done") return { width: "100%" };
	if (state === "upcoming") return { width: "0%" };
	if (autoScroll) return {
		width: "0%",
		animation: `fluidCarouselProgressFill ${duration}ms linear forwards`,
		animationPlayState: paused ? "paused" : "running"
	};
	return { width: "100%" };
}
function tagFallbackStyle(tagColor, frameColor) {
	if (!tagColor || tagColor === "background") return { color: `var(--color-${frameColor})` };
	if (tagColor === "foreground") return { color: `var(--color-background)` };
}
function nextButtonFallbackStyle(headerColor, frameColor) {
	if (headerColor === "background") return { color: `var(--color-${frameColor})` };
	if (headerColor === "foreground") return { color: `var(--color-background)` };
}
function buttonSizeClass(size) {
	if (size === "sm") return "px-4 py-1.5 text-[12px]";
	if (size === "lg") return "px-6 py-3 text-[14px]";
	if (size === "xl") return "px-7 py-3.5 text-[15px]";
	return "";
}
function ChevronLeftIcon() {
	return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
		width: "16",
		height: "16",
		viewBox: "0 0 24 24",
		fill: "none",
		stroke: "currentColor",
		strokeWidth: "2.5",
		strokeLinecap: "round",
		strokeLinejoin: "round",
		"aria-hidden": "true",
		children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M15 18l-6-6 6-6" })
	});
}
function ChevronRightIcon() {
	return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
		width: "16",
		height: "16",
		viewBox: "0 0 24 24",
		fill: "none",
		stroke: "currentColor",
		strokeWidth: "2.5",
		strokeLinecap: "round",
		strokeLinejoin: "round",
		"aria-hidden": "true",
		children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M9 18l6-6-6-6" })
	});
}
const carouselWidgetPropertySchema = {
	widgetType: "CarouselWidget",
	displayName: "Carousel",
	tabsConfig: [
		{
			id: "styling",
			label: "Styling"
		},
		{
			id: "behavior",
			label: "Behavior"
		},
		{
			id: "data",
			label: "Data"
		}
	],
	dataSourceTargetProps: ["slides"],
	fields: [
		{
			key: "editorialFrame",
			label: "Editorial Frame",
			type: "boolean",
			description: "Premium dark canvas with layered shadow and gradient stack. Turn off for a classic transparent carousel.",
			defaultValue: true,
			tab: "styling",
			group: "Frame"
		},
		require_registries.getColorField({
			defaultValue: "foreground",
			key: "frameColor",
			label: "Frame Color",
			description: "Surface color of the carousel canvas. Drives the frame and gradient overlay.",
			tab: "styling",
			group: "Frame",
			requiresKeyToBeTrue: "editorialFrame"
		}),
		require_registries.getFontSizeField({
			defaultValue: "xl",
			key: "headerSize",
			label: "Header Font Size",
			description: "Font size for the slide header",
			tab: "styling",
			group: "Text Styling"
		}),
		require_registries.getColorField({
			defaultValue: "background",
			key: "headerColor",
			label: "Header Color",
			description: "Headline color. Also drives eyebrow, controls and progress bar.",
			tab: "styling",
			group: "Text Styling"
		}),
		{
			key: "separator",
			type: "separator",
			label: "Separator",
			tab: "styling",
			group: "Text Styling"
		},
		require_registries.getFontSizeField({
			defaultValue: "md",
			key: "textSize",
			label: "Text Font Size",
			description: "Font size for the slide text",
			tab: "styling",
			group: "Text Styling"
		}),
		require_registries.getColorField({
			defaultValue: "background",
			key: "textColor",
			label: "Text Color",
			description: "Color variant for the slide text",
			tab: "styling",
			group: "Text Styling"
		}),
		{
			key: "align",
			label: "Alignment",
			type: "alignment",
			description: "Alignment of the carousel content",
			defaultValue: {
				vertical: "bottom",
				horizontal: "left"
			},
			options: {
				verticalEnabled: true,
				horizontalEnabled: true
			},
			tab: "styling",
			group: "Layout"
		},
		{
			key: "textWidth",
			label: "Content Width",
			type: "cssUnit",
			description: "Maximum width for slide content",
			defaultValue: "620px",
			allowedUnits: [
				"px",
				"rem",
				"%"
			],
			defaultUnit: "px",
			minByUnit: {
				px: 50,
				rem: 3,
				"%": 10
			},
			maxByUnit: {
				px: 1200,
				rem: 75,
				"%": 100
			},
			stepByUnit: {
				px: 10,
				rem: 1,
				"%": 1
			},
			tab: "styling",
			group: "Layout"
		},
		require_registries.getHeightField({
			key: "carouselHeight",
			label: "Carousel Height",
			description: "Height of the carousel",
			defaultValue: "400px",
			tab: "styling",
			group: "Design"
		}),
		{
			key: "separator2",
			type: "separator",
			label: "Separator",
			tab: "styling",
			group: "Design"
		},
		require_registries.getBorderRadiusField({
			defaultValue: "xl",
			key: "borderRadius",
			label: "Border Radius",
			description: "Rounded corners for the carousel",
			tab: "styling",
			group: "Design"
		}),
		require_registries.getBorderWidthField({
			key: "borderWidth",
			label: "Border Width",
			description: "Border width for the carousel container",
			defaultValue: "none",
			tab: "styling",
			group: "Design"
		}),
		require_registries.getBorderColorField({
			key: "borderColor",
			label: "Border Color",
			description: "Border color for the carousel container",
			defaultValue: "muted",
			tab: "styling",
			group: "Design"
		}),
		require_registries.getPaddingField({
			defaultValue: 8,
			key: "padding",
			label: "Padding",
			description: "Inner padding around slide content",
			tab: "styling",
			group: "Design"
		}),
		{
			key: "overlayEnabled",
			label: "Enable Overlay",
			type: "boolean",
			description: "Add background overlay to slide content",
			defaultValue: true,
			tab: "styling",
			group: "Design"
		},
		{
			key: "overlayType",
			label: "Overlay Type",
			type: "buttonGroup",
			description: "Overlay style (only applies when editorial frame is off)",
			defaultValue: "gradient",
			options: [{
				label: "Solid",
				value: "solid"
			}, {
				label: "Gradient",
				value: "gradient"
			}],
			tab: "styling",
			group: "Design",
			requiresKeyToBeTrue: "overlayEnabled"
		},
		{
			key: "overlayIntensity",
			label: "Overlay Intensity",
			type: "slider",
			description: "Opacity of the overlay (0-100)",
			min: 0,
			max: 100,
			step: 5,
			defaultValue: 70,
			unit: "%",
			tab: "styling",
			group: "Design",
			requiresKeyToBeTrue: "overlayEnabled"
		},
		{
			key: "showButton",
			label: "Show Primary Button",
			type: "boolean",
			description: "Global show/hide for all slide CTAs. Per-slide button content is set on each item under the Data tab (custom sources only).",
			defaultValue: true,
			tab: "styling",
			group: "Design"
		},
		require_registries.getColorField({
			defaultValue: "background",
			key: "buttonColor",
			label: "Button Color",
			description: "Color variant for the slide button",
			tab: "styling",
			group: "Design",
			requiresKeyToBeTrue: "showButton"
		}),
		require_registries.getButtonSizeField({
			defaultValue: "default",
			key: "buttonSize",
			label: "Button Size",
			description: "Size of the slide button",
			tab: "styling",
			group: "Design",
			requiresKeyToBeTrue: "showButton"
		}),
		{
			key: "enableAutoScroll",
			label: "Enable Auto-Scroll",
			type: "boolean",
			description: "Automatically advance to the next slide. Progress bar fills at this rate and pauses on hover.",
			defaultValue: false,
			tab: "behavior",
			group: "Auto-Scroll"
		},
		{
			key: "autoScrollInterval",
			label: "Auto-Scroll Interval (ms)",
			type: "number",
			description: "Time between automatic slide transitions",
			min: 1e3,
			max: 15e3,
			step: 500,
			defaultValue: 6500,
			tab: "behavior",
			group: "Auto-Scroll",
			requiresKeyToBeTrue: "enableAutoScroll"
		},
		{
			key: "dataSource",
			label: "Data Source",
			type: "dataSource",
			description: "",
			tab: "data",
			group: "Data Configuration"
		}
	],
	itemConfigSchema: {
		description: "Configure settings for this slide",
		fields: [
			{
				key: "eyebrow",
				label: "Eyebrow",
				type: "text",
				description: "Short label above the title (e.g. 'From Fluid · Newsroom')"
			},
			{
				key: "tag",
				label: "Tag / Category",
				type: "text",
				description: "Short pill label (e.g. 'Policy', 'New release')"
			},
			{
				key: "tagColor",
				label: "Tag Color",
				type: "colorSelect",
				description: "Background color of the tag pill",
				defaultValue: "background"
			},
			{
				key: "meta",
				label: "Meta",
				type: "text",
				description: "Meta line (e.g. 'Apr 12 · 4 min read')"
			},
			{
				key: "separator_slide_1",
				type: "separator",
				label: "Separator"
			},
			{
				key: "title",
				label: "Title",
				type: "text",
				description: "Override the item's title for this slide"
			},
			{
				key: "description",
				label: "Description",
				type: "textarea",
				description: "Override the item's description for this slide",
				rows: 3
			},
			{
				key: "separator_slide_2",
				type: "separator",
				label: "Separator"
			},
			{
				key: "buttonEnabled",
				label: "Show Primary Button",
				type: "boolean",
				description: "Show the primary CTA on this slide",
				defaultValue: false
			},
			{
				key: "buttonText",
				label: "Button Text",
				type: "text",
				description: "Text for the primary button",
				requiresKeyToBeTrue: "buttonEnabled"
			},
			{
				key: "buttonLink",
				label: "Button Link",
				type: "text",
				description: "URL for the primary button",
				requiresKeyToBeTrue: "buttonEnabled"
			},
			{
				key: "secondaryButtonText",
				label: "Secondary Link Text",
				type: "text",
				description: "Optional text-only secondary link (renders with an arrow)"
			},
			{
				key: "secondaryButtonLink",
				label: "Secondary Link URL",
				type: "text",
				description: "URL for the secondary link"
			}
		]
	}
};
//#endregion
Object.defineProperty(exports, "CarouselWidget", {
	enumerable: true,
	get: function() {
		return CarouselWidget;
	}
});
Object.defineProperty(exports, "carouselWidgetPropertySchema", {
	enumerable: true,
	get: function() {
		return carouselWidgetPropertySchema;
	}
});

//# sourceMappingURL=CarouselWidget-osrUhPQT.cjs.map