@nuskin/marketing-components 1.51.0 → 1.52.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/text/CsText.tsx","../src/hooks/useRouteReplacer.tsx","../src/utils/route-utils.ts","../src/hooks/use-toggle-font-color/useMainContrast.tsx","../src/hooks/use-toggle-font-color/useToggleFontColor.ts","../src/image/CsImage.tsx","../src/image/CsImage.styled.tsx","../src/marketing-banner/constants.ts","../src/typography/Typography.styled.tsx","../src/typography/Typography.tsx","../src/marketing-banner/components/BannerText.styled.tsx","../src/marketing-banner/styles/theme.ts","../src/marketing-banner/styles/mixins.ts","../src/marketing-banner/components/BannerText.tsx","../src/bynder-media/BynderMedia.tsx","../src/bynder-media/utils.ts","../src/bynder-media/BynderMedia.styled.tsx","../src/marketing-banner/hooks/useCarousel.ts","../src/marketing-banner/hooks/useReducedMotion.ts","../src/marketing-banner/utils/utils.ts","../src/button/Button.tsx","../src/button/Button.styled.tsx","../src/button/helpers.ts","../src/utils/common.ts","../src/button/ButtonWrapper.tsx","../src/marketing-banner/MarketingBanner.styled.tsx","../src/marketing-banner/MarketingBanner.tsx","../src/spacing-divider/SpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/SpacingDivider.tsx","../src/carousel/Carousel.tsx","../src/carousel/shared.tsx","../src/carousel/CarouselLayout.styled.tsx","../src/utils/deviceConstants.ts","../src/carousel/types.ts","../src/utils/viewportLayoutUtils.ts","../src/carousel/utils.ts","../src/carousel/hooks/useCarouselLayout.ts","../src/carousel/hooks/useCarouselResize.ts","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/column-control/ColumnControl.tsx","../src/content-card/ContentCard.styled.ts","../src/content-card/utils/helpers.ts","../src/content-card/constants.ts","../src/table-rich-text/TableRichText.tsx","../src/table-rich-text/TableRichText.styled.tsx","../src/utils/richTextUtils.ts","../src/content-card/ContentCard.tsx","../src/hero-banner/constants.ts","../src/hero-banner/components/TypographyFields.tsx","../src/hero-banner/HeroBanner.styled.tsx","../src/hero-banner/helpers.ts","../src/hero-banner/HeroBanner.tsx","../src/rich-text/RichText.tsx","../src/rich-text/RichText.styled.tsx","../src/faq/Faq.tsx","../src/faq/Faq.styled.tsx","../src/faq/utils/helpers.ts","../src/faq/constants.ts","../src/faq/components/FaqAnswer.tsx","../src/faq/components/FaqItem.tsx"],"names":["useMemo","styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","DEFAULT_REGION","DEFAULT_LANGUAGE","getRegionAndLanguageFromSearch","search","startsWith","params","URLSearchParams","get","getRegionAndLanguageFromPath","pathname","parts","split","filter","Boolean","length","getRegionAndLanguageFromLocation","window","location","useTheme","ColorUtils","getGenomeColor","useToggleFontColor","toggleValue","theme","useToggleFontColor_default","jsx","useRegionLanguage","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","o","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","error","console","resolveBackgroundColor","value","trimmed","CsText","full_width","container_background_color","text_editor","font_color","$","fontColor","regionLang","backgroundColor","updatedHtml","children","dangerouslySetInnerHTML","__html","CsText_default","NsImage","StyledCsImageWrapper","image_alignment","display","justifyContent","left","right","center","maxWidth","objectFit","objectPosition","PLACEHOLDER_IMAGE_SRC","encodeURIComponent","allowedImageProps","CsImage","props","align","image","parent$","isEditing","rest","selectedImage","fileMeta","contentstackAsset","parsed","entry","selected","files","err","warn","resolvedSrc","resolvedAlt","resolvedWidth","resolvedHeight","imageType","fileSource","altText","width","height","title","filename","imageProps","src","alt","key","containerClassForNSImage","className","CsImage_default","DEFAULT_BANNER_CONFIG","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","DEFAULT_CAROUSEL_CONFIG","rotationInterval","DEFAULT_ROTATION_INTERVAL","PLACEHOLDER_VALUES","header","subtitle","typographyVariants","h1","desktop","fontSize","lineHeight","mobile","fontFamily","h2","h3","disclaimer","boxquote","commonTextStyles","variantToElement","TypographyStyled","variant","variantStyle","fontFamilyValue","fontWeight","isBoxquote","Typography","inputText","dataTestId","elementType","as","Typography_default","BREAKPOINTS","tablet","wide","SPACING","headerMargin","titleMargin","subtitleMargin","bodyMargin","textGap","desktopPadding","mobilePadding","carouselGap","ctaPaddingDesktop","ctaPaddingTablet","ctaPaddingWide","DIMENSIONS","bannerHeightDesktop","bannerHeightMobile","textMaxWidth","indicatorSize","indicatorBorder","COLORS","textWhite","textDark","textGray","ctaDark","ctaBorder","fallbackBg","indicatorActive","indicatorInactive","TEXT_COLOR_MAP","white","dark","TRANSITIONS","fast","default","slow","Z_INDEX","background","media","gradient","content","controls","MEDIA_QUERIES","mobileAndBelow","desktopAndUp","css","centerOnMobile","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","textAlignment","HeaderTextWrapper","TitleWrapper","SubtitleWrapper","BodyTextWrapper","jsxs","getDisplayText","placeholderValue","showPlaceholder","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","header_text","body_text","React","getMediaUrl","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParams","searchParams","getAll","isFit","some","io","hasFillWithDimensions","includes","has","skipAspectRatio","updatedIoParams","push","origin","addDefaultTransform","extractFocusPointFromUrl","focuspoint","parseFloat","x","y","isNaN","Math","round","parseObjectPosition","normalized","toLowerCase","extractBynderMedia","mediaJson","firstImage","mediaUrl","endsWith","isResponsive","focusPoint","result","imageFit","fit","desktopUrl","mobileUrl","MediaContainer","StyledImage","img","StyledVideo","video","PictureElement","picture","SourceElement","source","BynderMedia","bynder_media","useState","mediaInfo","setMediaInfo","hasError","setHasError","useEffect","extracted","handleMediaError","mediaAlt","onError","autoPlay","muted","loop","playsInline","srcSet","loading","useCallback","useReducedMotion","prefersReducedMotion","setPrefersReducedMotion","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","initialIndex","validInitialIndex","min","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","hasCTA","banner","cta_button","buttons","isCarouselMode","Array","isArray","banners","hasMedia","NsIcon","NsIconVariants","NsButton","ROUNDED_BORDER_RADIUS","REL_NOOPENER_NOREFERRER","DISABLED_STATE_STRING","DEFAULT_VARIANT","DEFAULT_SIZE","DEFAULT_ALIGNMENT","DEFAULT_ICON_POSITION","DEFAULT_BUTTON_TYPE","DEFAULT_PLACEHOLDER_TEXT","DEFAULT_TARGET","BUTTON_TYPE_ROUNDED","BUTTON_TYPE_SQUARE","BORDER_COLOR_TRANSPARENT","resolveTarget","target","resolveDisabled","disabled","iconAliasMap","arrow","resolveIconName","iconName","variantDefaults","primary","bg","hover","pressed","disabledBg","disabledText","focusRing","secondary","border","hoverText","underlineColor","widthBySize","large","medium","small","DEFAULT_BUTTON_WIDTH","getButtonWidth","size","iconSizeByButtonSize","DEFAULT_ICON_SIZE","getIconSize","BUTTON_GAP","BUTTON_MIN_WIDTH","DESKTOP_BREAKPOINT","TABLET_BREAKPOINT","MOBILE_BREAKPOINT","DESKTOP_FONT_WEIGHT","TABLET_MOBILE_FONT_WEIGHT","FOCUS_OUTLINE_WIDTH","FONT_FAMILY_LORA","JUSTIFY_CONTENT_CENTER","JUSTIFY_CONTENT_FLEX_END","JUSTIFY_CONTENT_FLEX_START","getJustifyContent","noForward$","ButtonContainer","verticalAlignment","StyledButton","shouldForwardProp","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$hoverText","$underlineColor","$buttonWidth","$maxButtonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","hasLocalePrefix","path","test","isProtocolRelativeUrl","isAbsoluteHttpUrl","isPlainDomain","replaceLocalePlaceholders","country","replaceAll","buildNuSkinUrl","current","localizedBase","normalizedOrigin","protocol","host","hash","needsLocaleRewrite","currentHost","isMainWebsiteHost","hasPlaceholders","resolveNuSkinUrl","fallback","resolveExternalOrAbsoluteUrl","trimmedUrl","isNuSkinDomain","buildLocalizedRelativeUrl","hadTrailingSlash","relativeUrl","convertToLocalizedUrl","inputUrl","globalThis","resolvedUrl","Fragment","Button","open_in_new_tab","button_size","vertical_alignment","buttonType","buttontype","icon","iconposition","iconPosition","button_state","resolvedVariant","resolvedSize","resolvedAlignment","resolvedVerticalAlignment","resolvedIconPosition","resolvedButtonType","hrefProp","variantDefault","buttonWidth","maxButtonWidth","resolvedTarget","resolvedDisabled","buttonBorder","isLinkVariant","IconName","isValidNsIcon","iconSize","renderIcon","iconColor","name","colorOverride","getLabelText","labelTitle","$variant","rel","Button_default","getButtonProps","button","buttonProps","Buttons","Object","keys","ButtonWrapper_default","BannerContainer","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","$isNested","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","ButtonWrapper","CarouselControls","Indicator","active","getEditTags","getButtonParentEditTags","blockEditTags","buttons__0","renderBanner","isNested","showMedia","showCTA","baseTestId","resolvedTextColor","text_color","show_gradient","content_position","gradientColor","gradientDirection","gradient_depth","bynderEditTags","buttonParentEditTags","MarketingBannerComponent","rotation_interval","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","onClick","THICKNESS_PX","thin","thick","ultra","StyledSpacingContainer","vertical_padding","divider_alignment","v","none","flexDirection","alignItems","paddingTop","paddingBottom","StyledDividerLine","divider_style","divider_thickness_px","divider_color","divider_gradient","divider_width_percent","base","max","backgroundImage","backgroundSize","dashLength","gapLength","maskImage","WebkitMaskImage","dotSize","spacing","radius","maskSize","WebkitMaskSize","maskRepeat","WebkitMaskRepeat","maskPosition","WebkitMaskPosition","borderBottomStyle","borderBottomWidth","borderBottomColor","isValidHex","hexToRgb","hex","r","parseInt","slice","g","b","gradientPresetCss","preset","baseHex","rgb","DEFAULT_HEX","SpacingDivider","divider_thickness","divider_gradient_preset","final_divider_color","SpacingDivider_default","SliderImport","DEVICE_SIZES","ULTRA_SMALL","EXTRA_SMALL","SMALL","MEDIUM","LARGE","EXTRA_LARGE","ULTRA_LARGE","SUPER_LARGE","MAX_SLIDE_HEIGHT_PX","GAP_PRESET_VALUES","getGapPx","gap","MIN_SLIDE_WIDTH_PX","MIN_EMPTY_PLACEHOLDER_HEIGHT_PX","getArrowButtonPosition","fullVal","nonFullVal","CarouselContainer","columnHeight","maxColumnHeight","dotsInside","textAlign","padding","boxSizing","overflow","minHeight","margin","marginLeft","flexShrink","maxHeight","bottom","listStyle","li","borderRadius","textIndent","cursor","transition","SlideSection","useFlexLayout","stackedVerticalGap","stackedItemHeight","stackedItemMaxHeight","slideWidth","flexBasis","isVariableWidth","flex","minWidth","SlideInner","SlideContentInner","ArrowButton","top","transform","zIndex","verticalAlign","outline","outlineOffset","opacity","InnerWrapper","containerType","EmptyPlaceholderWrapper","EmptyPlaceholder","emptyBlockParentClass","slides","slides__parent","getPresetColumns","unwrapComponent","mod","candidate","isVariableWidthPreset","windowWidth","getVariableSlideWidth","gapPx","containerWidthPx","baseWidth","pos","smallPx","largePx","getSlidesToShowByViewport","presetColumns","buildCarouselResponsiveSettings","shouldShowDots","toShowSmall","toShowMedium","toShowLarge","breakpoint","settings","slidesToShow","slidesToScroll","swipeToSlide","arrows","dots","variableWidth","Slider","getSlideKey","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","addSlideEditTags","slide","currentFlexBasis","style","useRef","useCarouselResize","slideCount","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","useCarouselLayout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","emptyPlaceholderText","emptyPlaceholderTextProp","effectiveFullWidth","containerRef","setContainerWidthPx","updateContainerWidth","el","getComputedStyle","pl","Number","paddingLeft","pr","paddingRight","offsetWidth","ResizeObserver","ro","observe","disconnect","targetSlidesToShow","effectiveAutoplayEnabled","effectiveShowPagination","showArrowsOnDesktop","isStackedViewport","isTabletGridViewport","containerHeight","sliderRef","slickPrev","slickNext","containerClassName","isVariablePresetDesktop","effectiveSlidesToShow","placeholderSlotsToShow","responsiveSettings","slidesLength","sliderSettings","infinite","speed","autoplay","autoplaySpeed","pauseOnHover","swipe","draggable","beforeChange","_","next","responsive","renderSlides","hasSlides","createElement","Carousel","dotsPosition","carouselProps","renderEmptySlot","slotIndex","ref","from","offset","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","ColumnControlContainer","TabletGridContainer","flexWrap","columns","getGridDimensions","layout","rows","rawCols","rawRows","parsedCols","parsedRows","isFinite","getMaxChildrenForLayout","maxByLayout","ColumnControl","emptyTextProp","effectiveGridLayout","maxChildren","visibleSlides","slidesCount","renderSlot","hasSlide","id","ColumnControl_default","Card","article","$maxHeight","$mediaHeight","$mediaMaxHeight","$inlineMedia","Content","RichTextWrapper","CtaWrapper","$isCardCta","ContentInner","sanitizeHtml","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","getEffectiveCta","cta","normalizeContentAlignment","normalizeCtaStyle","raw","getCtaState","ctaStyleNormalized","effectiveCta","hasCtaHref","hasCtaLabel","isCardLink","showButton","cardTarget","getMediaLayout","isInlineMedia","mediaHeightValue","mediaMaxHeightValue","contentCardBodyVisiblePlainText","allowedTags","allowedAttributes","getContentCardBodyHtml","placeholderBody","plain","localeCompare","sensitivity","TableRichTextWrapper","TableRichTextInner","DOMPurify","getAlignItems","localizeAndValidateLinks","inputHtml","removeAttribute","localized","sanitize","ALLOWED_TAGS","ALLOWED_ATTR","allowedAttrs","forbidAttrs","FORBID_ATTR","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","wrapTablesForScroll","TableRichText","container_alignment","container_vertical_alignment","container_width","restProps","rewrittenHtml","sanitizedHtml","fontColorBoolean","TableRichText_default","CardTextBlock","editTags","bodyHtml","displayTitle","displaySubtitle","richTextHtml","CardCtaBlock","show","isCardCta","nestedButtonParent","buttonParent$","ContentCard","cta_style","card_cta_group","button_cta_group","content_alignment","background_color","border_radius","max_height","normalizedStyle","activeCta","cardAs","cardLinkProps","ContentCard_default","PLACEHOLDER_BRAND_CAPTION","ARIA_LABEL_HERO_BANNER","normalizedText","getTypographyFields","brandcaption","placeholder","editTagKey","TypographyFields","fields","field","editAttributes","displayValue","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","getGradientColor","gradientDirectionMap","getGradientDirection","MediaLayer","GRADIENT_OPACITIES","getGradientBackground","Overlay","HERO_CTA_WRAPPER_CLASS","HeroBanner","class_name","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","HeroBanner_default","RichTextInner","RichText","RichText_default","FaqOuter","FaqSection","$containerBackgroundColor","$fontColor","FaqContent","$sectionWidth","FaqTitleWrapper","marginBottom","FaqList","FaqItemContainer","EASE_OUT","EASE_SPRING","FaqQuestionButton","FaqQuestionText","FaqChevronIcon","isOpen","FaqAnswerPanel","gridTemplateRows","FaqAnswerInner","visibility","transitionDelay","FaqAnswerContent","FaqEmptyPlaceholder","font","PLACEHOLDER_QUESTION","PLACEHOLDER_ANSWER","DEFAULT_TEST_ID","EMPTY_ITEMS_PLACEHOLDER","FAQ_SECTION_WIDTH_OPTIONS","faqAnswerVisiblePlainText","getFaqAnswerHtml","answer","placeholderAnswer","hasAnswerContent","item","answer_content","hasVisibleFaqContent","question","getVisibleFaqItems","items","sourceItems","normalizeFaqSectionWidth","resolveContainerBackgroundColor","getFaqItemKey","uid","_metadata","FaqAnswer","renderAnswer","answerTestId","wrapAnswer","customContent","answerHtml","FaqAnswer_default","ChevronDownIcon","viewBox","fill","xmlns","focusable","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","FaqItem","onToggle","onHeaderKeyDown","headerRef","itemEditTags","displayQuestion","hasAnswer","panelId","headerId","questionLabel","FaqItem_default","FaqInternal","faq_section_title","faq_items","faq_section_width","allow_multiple_faqs_open","expand_all_faqs","ariaLabel","visibleItems","headerRefs","resolvedContainerBackground","resolvedFontColor","resolvedSectionWidth","itemsForRender","shouldExpandAllFaqs","Set","openIndices","setOpenIndices","toggleItem","previous","delete","add","focusHeader","targetIndex","focus","handleHeaderKeyDown","setHeaderRef","element","listEditTags","faq_items__parent","sectionLabel","Faq","Faq_default"],"mappings":"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","sourcesContent":["import { ReactElement, useMemo } from 'react';\nimport styled from '@emotion/styled';\nimport { useToggleFontColor } from '../hooks';\nimport { getRegionAndLanguageFromLocation, RegionLanguageQuery, replaceRegionAndLanguage } from '../utils/route-utils';\n\ninterface CsTextProps {\n readonly full_width?: boolean;\n readonly container_background_color?: unknown;\n readonly alignment?: 'left' | 'center' | 'right';\n readonly text_editor: string;\n readonly font_color?: boolean;\n readonly $?: {\n text_editor?: Record<string, unknown>;\n };\n}\n\n// Get region + language once\nconst useRegionLanguage = () => {\n return useMemo(() => getRegionAndLanguageFromLocation(), []);\n};\n\n// Replace region and language in a single URL\nconst rewriteUrl = (url: string, replacer?: RegionLanguageQuery): string => {\n if (!replacer || !url) return url;\n return replaceRegionAndLanguage(url, replacer);\n};\n\n// Rewrite all <a> links inside CMS HTML\nexport const rewriteLinks = (html: string, replacer?: RegionLanguageQuery): string => {\n if (typeof window === 'undefined' || !html || !replacer) return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n doc.querySelectorAll('a').forEach((link) => {\n const href = link.getAttribute('href');\n if (!href) return;\n link.setAttribute('href', rewriteUrl(href, replacer));\n });\n\n return doc.body.innerHTML;\n};\n\n// Styled container for CMS text\nconst Container = styled.div<{\n fullWidth: boolean;\n bgColor: string;\n alignment: string;\n color: string;\n}>`\n width: ${({ fullWidth }) => (fullWidth ? '100%' : 'auto')};\n background-color: ${({ bgColor }) => bgColor};\n text-align: ${({ alignment }) => alignment};\n color: ${({ color }) => color};\n padding: 16px 32px;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: 'Lora', serif;\n }\n\n h1 {\n font-size: 42px;\n line-height: 48px;\n }\n h2 {\n font-size: 36px;\n line-height: 42px;\n }\n h3 {\n font-size: 32px;\n line-height: 38px;\n }\n h4 {\n font-size: 26px;\n line-height: 34px;\n }\n h5 {\n font-size: 22px;\n line-height: 28px;\n }\n h6 {\n font-size: 18px;\n line-height: 24px;\n }\n\n p {\n margin: 0;\n padding: 0;\n }\n`;\n\n// Safely resolve CMS background color (CMS color object shape)\nconst extractColorFromObject = (obj: unknown): string | null => {\n if (typeof obj !== 'object' || obj === null) return null;\n const o = obj as { brandColor?: { colorObj?: { light?: unknown } }; color?: unknown };\n const color = o?.brandColor?.colorObj?.light ?? o?.color;\n return typeof color === 'string' && color.trim() ? color : null;\n};\n\nconst parseJsonColor = (jsonString: string): string | null => {\n try {\n const parsed = JSON.parse(jsonString);\n const color = parsed?.brandColor?.colorObj?.light;\n return typeof color === 'string' && color.trim() ? color : null;\n } catch (error) {\n console.error(error);\n return null;\n }\n};\n\nexport const resolveBackgroundColor = (value: unknown): string => {\n // null, undefined, false, 0, '' → transparent\n if (!value) return 'transparent';\n\n // CMS object\n if (typeof value === 'object') {\n const color = extractColorFromObject(value);\n return color ?? 'transparent';\n }\n\n // CMS string\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return 'transparent';\n\n // JSON string\n if (trimmed.startsWith('{')) {\n const color = parseJsonColor(trimmed);\n return color ?? 'transparent';\n }\n\n // Normal CSS color\n return trimmed;\n }\n\n // numbers, booleans, etc\n return 'transparent';\n};\n\nconst CsText = ({\n full_width = false,\n container_background_color,\n alignment = 'left',\n text_editor,\n font_color = false,\n $\n}: CsTextProps): ReactElement | null => {\n const fontColor = useToggleFontColor(font_color);\n const regionLang = useRegionLanguage();\n\n const backgroundColor = useMemo(\n () => resolveBackgroundColor(container_background_color),\n [container_background_color]\n );\n\n const updatedHtml = useMemo(() => rewriteLinks(text_editor, regionLang), [text_editor, regionLang]);\n\n if (!text_editor) return null;\n\n return (\n <Container\n fullWidth={full_width}\n bgColor={backgroundColor}\n alignment={alignment}\n color={fontColor}\n >\n <div\n dangerouslySetInnerHTML={{ __html: updatedHtml }}\n {...$?.text_editor}\n />\n </Container>\n );\n};\n\nexport default CsText;\n","import { useMemo } from 'react';\nimport { getRegionAndLanguageFromLocation, replaceRegionAndLanguage, RegionLanguageQuery } from '../utils/route-utils';\n\n/**\n * Simply use this hook to update the region and language in the url\n * Note: urlToParse should have {%region} or {%language} or {%rREGION} or {%LANGUAGE}\n * @param urlToParse url to be parsed\n * @returns urlToParse after conditionally replacing the region and language\n */\nconst useRouteReplacer = (urlToParse?: string): { url?: string } => {\n const replacer: RegionLanguageQuery | undefined = useMemo(() => getRegionAndLanguageFromLocation(), []);\n\n const url = useMemo(() => {\n if (!urlToParse || !replacer) return undefined;\n return replaceRegionAndLanguage(urlToParse, replacer);\n }, [urlToParse, replacer]);\n\n return { url };\n};\n\nexport default useRouteReplacer;\n","const languageReplaceExpression = '{%language}';\nconst languageReplaceExpressionUppercase = '{%LANGUAGE}';\nconst regionReplaceExpression = '{%region}';\nconst regionReplaceExpressionUppercase = '{%REGION}';\n\nexport type RegionLanguageQuery = {\n region?: string;\n language?: string;\n slug?: string;\n};\n\n/**\n * Replace {%region}, {%language} placeholders in text\n */\nexport const replaceRegionAndLanguage = (text: string, replacer: RegionLanguageQuery = {}): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n if (replacer.region) {\n text = text.replace(regionReplaceExpression, replacer.region);\n text = text.replace(regionReplaceExpressionUppercase, replacer.region.toUpperCase());\n }\n\n if (replacer.language) {\n text = text.replace(languageReplaceExpression, replacer.language);\n text = text.replace(languageReplaceExpressionUppercase, replacer.language.toUpperCase());\n }\n\n return text;\n};\n\n/**\n * Replace dynamic pathname segments like [region], [language]\n */\nexport const replacePathnameWithQueryParams = (pathname: string, queryParams: RegionLanguageQuery): string => {\n if (!pathname || typeof pathname !== 'string') {\n return '';\n }\n\n let formattedUrl = pathname;\n\n if (queryParams.region) {\n formattedUrl = formattedUrl.replace('[region]', queryParams.region);\n }\n\n if (queryParams.language) {\n formattedUrl = formattedUrl.replace('[language]', queryParams.language);\n }\n\n if (queryParams.slug) {\n formattedUrl = formattedUrl.replace('[[...slug]]', queryParams.slug);\n }\n\n return formattedUrl;\n};\n\n/**\n * Extract region & language from a query object\n */\nexport const getRegionAndLanguageFromQuery = (\n query?: Record<string, string | string[] | undefined>\n): RegionLanguageQuery | undefined => {\n if (!query) return undefined;\n\n const region = Array.isArray(query.region) ? query.region[0] : query.region;\n\n const language = Array.isArray(query.language) ? query.language[0] : query.language;\n\n if ([region, language].some(Boolean)) {\n return { region, language };\n }\n\n return undefined;\n};\n\n/**\n * ✅ Next.js Router replacement\n * Reads from browser URL safely\n */\nconst DEFAULT_REGION = 'us';\nconst DEFAULT_LANGUAGE = 'en';\n\nfunction getRegionAndLanguageFromSearch(search?: string | null): RegionLanguageQuery | undefined {\n if (!search?.startsWith?.('?')) {\n return undefined;\n }\n\n const params = new URLSearchParams(search);\n const region = params.get('region');\n const language = params.get('language');\n\n if (!region && !language) {\n return undefined;\n }\n\n return {\n region: region ?? DEFAULT_REGION,\n language: language ?? DEFAULT_LANGUAGE\n };\n}\n\nfunction getRegionAndLanguageFromPath(pathname?: string | null): RegionLanguageQuery | undefined {\n if (!pathname) {\n return undefined;\n }\n\n const parts = pathname.split('/').filter(Boolean);\n if (parts.length < 2) {\n return undefined;\n }\n\n const [region, language] = parts;\n if (region?.length === 2 && language?.length === 2) {\n return { region, language };\n }\n\n return undefined;\n}\n\nexport const getRegionAndLanguageFromLocation = (): RegionLanguageQuery => {\n // ---------- SSR ----------\n if (typeof window === 'undefined' || !window.location) {\n return { region: DEFAULT_REGION, language: DEFAULT_LANGUAGE };\n }\n\n const { search, pathname } = window.location;\n\n // Try query params first, then path, then defaults\n return (\n getRegionAndLanguageFromSearch(search) ??\n getRegionAndLanguageFromPath(pathname) ?? {\n region: DEFAULT_REGION,\n language: DEFAULT_LANGUAGE\n }\n );\n};\n","import { useMemo } from 'react';\n\nimport { useTheme } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\n/**\n * @returns {main:#FFFFFF, contrast:#252525} when passed true\n */\nconst useMainContrast = (toggleValue: boolean = false): { main: string; contrast: string } => {\n const theme = useTheme();\n\n return useMemo(() => {\n const main = getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark');\n const contrast = getGenomeColor(theme, 'N10', toggleValue ? 'dark' : 'light');\n return { main, contrast };\n }, [toggleValue, theme]);\n};\n\nexport default useMainContrast;\n","import { useTheme } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport { useMemo } from 'react';\n\nconst { getGenomeColor } = ColorUtils;\n/**\n * Used to fetch the appropriate theme color for primary and contrast.\n * Usually black or similar, and white for contrast.\n * @param toggleValue the CS toggle value between black and white font color.\n * @returns hex value of the color.\n */\nconst useToggleFontColor = (toggleValue: boolean = false): string => {\n const theme = useTheme();\n\n return useMemo(() => getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark'), [toggleValue, theme]);\n};\n\nexport default useToggleFontColor;\n","import { NsImage } from '@nuskin/foundation-ui-components';\nimport { StyledCsImageWrapper } from './CsImage.styled';\nimport type { ContentstackAsset, CsImageProps, ImageFile, ImageFileMeta, NsImageProps } from './types';\n\n// Inline SVG data URL used as a safe placeholder when the main image is unavailable\nexport const PLACEHOLDER_IMAGE_SRC =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 300\" role=\"img\" aria-label=\"Image not available\">\n <defs>\n <linearGradient id=\"csImagePlaceholderGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#f3f4f6\" />\n <stop offset=\"100%\" stop-color=\"#e5e7eb\" />\n </linearGradient>\n </defs>\n <rect width=\"400\" height=\"300\" fill=\"url(#csImagePlaceholderGradient)\" />\n <g stroke=\"#d1d5db\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n <rect x=\"60\" y=\"60\" width=\"280\" height=\"180\" rx=\"12\" />\n <path d=\"M120 200 L180 140 L230 185 L260 160 L320 210\" />\n <circle cx=\"160\" cy=\"120\" r=\"20\" />\n </g>\n </svg>`\n );\n\nconst allowedImageProps: (keyof NsImageProps)[] = [\n 'alt',\n 'className',\n 'fill',\n 'height',\n 'id',\n 'src',\n 'variant',\n 'width'\n];\n\nconst CsImage = (props: CsImageProps) => {\n // parent$ and isEditing are accepted from the CMS API for consistency with other components but are not\n // passed to NsImage; we destructure them only to keep them out of ...rest.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- CMS props consumed here to exclude from rest\n const { image_alignment: align = 'center', image, parent$, isEditing, $, ...rest } = props;\n\n let selectedImage: ImageFile | null = null;\n let fileMeta: Record<string, ImageFileMeta> | null = null;\n let contentstackAsset: ContentstackAsset | null = null;\n\n try {\n const parsed = typeof image === 'string' ? JSON.parse(image) : image;\n\n // Try Bynder format first: { image: [{ selected, files }] }\n const entry = parsed?.image?.[0];\n if ((entry?.selected ?? entry?.files) != null) {\n selectedImage = entry?.selected;\n fileMeta = entry?.files;\n } else if (parsed?.url) {\n // Fallback: Contentstack native asset format\n contentstackAsset = parsed;\n }\n } catch (err) {\n console.warn('[CsImage] Failed to parse image prop:', err);\n }\n\n let resolvedSrc = PLACEHOLDER_IMAGE_SRC;\n let resolvedAlt = 'Image not available';\n let resolvedWidth: number | string = '100%';\n let resolvedHeight: number | string = '100%';\n\n // Bynder format\n if ((selectedImage ?? fileMeta) != null) {\n const imageType = selectedImage?.imageType ?? 'transformBaseUrl';\n const fileSource = fileMeta?.[imageType];\n\n if (fileSource?.url) {\n resolvedSrc = fileSource.url;\n resolvedAlt = selectedImage?.altText ?? 'Image';\n resolvedWidth = selectedImage?.width ?? '100%';\n resolvedHeight = selectedImage?.height ?? '100%';\n }\n }\n // Contentstack asset fallback\n else if (contentstackAsset?.url) {\n resolvedSrc = contentstackAsset.url;\n resolvedAlt = contentstackAsset.title || contentstackAsset.filename || 'Image';\n // Contentstack assets don't provide width/height in metadata, keep defaults\n }\n\n const imageProps: NsImageProps = {\n src: resolvedSrc,\n alt: resolvedAlt,\n width: resolvedWidth,\n height: resolvedHeight\n };\n\n // Add any other valid props from rest\n allowedImageProps.forEach((key) => {\n if (rest[key] !== undefined) {\n (imageProps as Record<string, unknown>)[key] = rest[key];\n }\n });\n\n const containerClassForNSImage = rest?.full_width ? 'container !p-0' : '';\n\n return (\n <StyledCsImageWrapper\n image_alignment={align}\n width={imageProps.width}\n height={imageProps.height}\n className={containerClassForNSImage}\n >\n <NsImage\n {...imageProps}\n {...($?.image ?? {})}\n />\n </StyledCsImageWrapper>\n );\n};\n\nexport default CsImage;\n","import { styled } from '@nuskin/foundation-theme';\nimport type { CsImageProps } from './types';\n\nexport const StyledCsImageWrapper = styled('div')<\n Pick<CsImageProps, 'image_alignment'> & { width?: string | number; height?: string | number }\n>(({ image_alignment = 'center' }) => ({\n display: 'flex',\n justifyContent: {\n left: 'flex-start',\n right: 'flex-end',\n center: 'center'\n }[image_alignment],\n '& img': {\n maxWidth: 'fit-content',\n objectFit: 'contain',\n objectPosition: 'center'\n }\n}));\n","/**\n * Default Configurations\n * Marketing Banner Component\n */\n\nexport const DEFAULT_BANNER_CONFIG = {\n position: 'left' as const,\n textColor: 'white' as const,\n showGradient: false,\n gradientDepth: 'md' as const,\n mediaType: 'image' as const,\n ctaVariant: 'dark' as const\n};\n\nexport const DEFAULT_CAROUSEL_CONFIG = {\n rotationInterval: 5000\n};\n\nexport const DEFAULT_ROTATION_INTERVAL = 5000;\n\nexport const PLACEHOLDER_VALUES = {\n header: 'Enter Header',\n title: 'Enter Title',\n subtitle: 'Enter Subtitle',\n body: 'Enter Body Text'\n} as const;\n","import styled from '@emotion/styled';\nimport { TypographyStyledProps } from './types';\n\nexport const typographyVariants = {\n h1: {\n desktop: { fontSize: '44px', lineHeight: '50px' },\n mobile: { fontSize: '38px', lineHeight: '44px' },\n fontFamily: 'Lora'\n },\n h2: {\n desktop: { fontSize: '26px', lineHeight: '34px' },\n mobile: { fontSize: '24px', lineHeight: '30px' },\n fontFamily: 'Lora'\n },\n h3: {\n desktop: { fontSize: '22px', lineHeight: '28px' },\n mobile: { fontSize: '20px', lineHeight: '26px' },\n fontFamily: 'Lora'\n },\n body: {\n desktop: { fontSize: '16px', lineHeight: '22px' },\n mobile: { fontSize: '16px', lineHeight: '22px' },\n fontFamily: 'Inter'\n },\n disclaimer: {\n desktop: { fontSize: '12px', lineHeight: '16px' },\n mobile: { fontSize: '12px', lineHeight: '16px' },\n fontFamily: 'Inter'\n },\n boxquote: {\n desktop: { fontSize: '16px', lineHeight: '22px' },\n mobile: { fontSize: '16px', lineHeight: '22px' },\n fontFamily: 'Inter'\n }\n};\n\n/**\n * Common text element styles for rich content\n * Includes styling for paragraphs, links, lists, and text formatting\n * Can be imported and used in other styled components\n */\nexport const commonTextStyles = `\n p {\n margin: 0;\n padding: 0;\n font-size: 16px;\n line-height: 22px;\n font-family: 'Inter', sans-serif;\n }\n\n @media (max-width: 768px) {\n p {\n font-size: 16px;\n line-height: 22px;\n }\n }\n\n strong, b {\n font-weight: 600;\n }\n\n em, i {\n font-style: italic;\n }\n\n a {\n color: #008ab0;\n text-decoration: underline;\n\n &:hover {\n opacity: 0.8;\n }\n }\n\n ul, ol {\n margin: 16px 0;\n padding-left: 24px;\n }\n\n li {\n margin: 8px 0;\n }\n`;\n\nexport const variantToElement: Record<string, string> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n body: 'p',\n disclaimer: 'p',\n boxquote: 'p'\n};\n\nexport const TypographyStyled = styled.div<TypographyStyledProps>`\n ${({ variant, color = '#1D1D1B' }) => {\n if (!variant) {\n return `\n color: ${color};\n margin: 0;\n padding: 0;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n ${commonTextStyles}\n `;\n }\n\n const variantStyle = typographyVariants[variant];\n if (!variantStyle) return '';\n\n const fontFamilyValue = variantStyle.fontFamily === 'Lora' ? \"'Lora', serif\" : \"'Inter', sans-serif\";\n const fontWeight = (variantStyle as { fontWeight?: string }).fontWeight ?? '400';\n const isBoxquote = (variant as string) === 'boxquote';\n\n return `\n /* Desktop styles */\n font-size: ${variantStyle.desktop.fontSize};\n line-height: ${variantStyle.desktop.lineHeight};\n font-family: ${fontFamilyValue};\n color: ${color};\n margin: 0;\n padding: 0;\n font-weight: ${fontWeight};\n ${\n isBoxquote\n ? `\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\n }\n `\n : ''\n }\n\n /* Mobile/Tablet styles */\n @media (max-width: 768px) {\n font-size: ${variantStyle.mobile.fontSize};\n line-height: ${variantStyle.mobile.lineHeight};\n }\n\n /* ADA Compliance */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n /* Common text element styles */\n ${commonTextStyles}\n `;\n }}\n`;\n","import type { ElementType } from 'react';\nimport { TypographyStyled, variantToElement } from './Typography.styled';\nimport { TypographyProps } from './types';\n\n/**\n * Centralized Typography Component\n *\n * Supports multiple variants with responsive font sizes for desktop and mobile/tablet.\n * Includes ADA compliance features like semantic HTML and ARIA attributes.\n *\n * @param variant - Typography variant\n * @param inputText - Text content to display\n * @param color - Text color (hex code, default: #1D1D1B)\n * @param className - Additional CSS class\n * @param role - ARIA role for accessibility\n * @param ariaLabel - ARIA label for screen readers\n * @param ariaDescribedBy - ARIA described-by attribute\n * @param dataTestId - Data attribute for testing\n */\nexport const Typography = ({\n variant,\n inputText,\n color = '#1D1D1B',\n className = '',\n dataTestId,\n ...props\n}: TypographyProps) => {\n const elementType = variant ? variantToElement[variant] || 'div' : 'div';\n\n return (\n <TypographyStyled\n as={elementType as ElementType}\n variant={variant}\n color={color}\n className={className}\n data-testid={dataTestId}\n {...props}\n >\n {inputText}\n </TypographyStyled>\n );\n};\n\nexport default Typography;\n","import styled from '@emotion/styled';\nimport type { TextAlignment } from '../types';\nimport { SPACING } from '../styles/theme';\nimport { centerOnMobile } from '../styles/mixins';\n\nexport const TextContainer = styled.div<{\n textAlignment: TextAlignment;\n}>`\n text-align: ${({ textAlignment }) => textAlignment};\n max-width: 90vw;\n overflow-wrap: break-word;\n ${centerOnMobile}\n`;\n\nexport const HeaderTextWrapper = styled.div`\n margin: ${SPACING.headerMargin};\n letter-spacing: 0.05em;\n`;\n\nexport const TitleWrapper = styled.div`\n margin: ${SPACING.titleMargin};\n`;\n\nexport const SubtitleWrapper = styled.div`\n margin: ${SPACING.subtitleMargin};\n`;\n\nexport const BodyTextWrapper = styled.div`\n margin: ${SPACING.bodyMargin};\n`;\n","/**\n * Marketing Banner Theme Constants\n * Centralized design tokens for all components\n */\n\nexport const BREAKPOINTS = {\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n wide: 1440\n} as const;\n\nexport const FONT_STACKS = {\n lora: \"'Lora', Georgia, 'Times New Roman', serif\",\n inter: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\"\n} as const;\n\nexport const FONT_SIZES = {\n header: {\n mobile: '12px',\n tablet: '14px',\n desktop: '14px',\n wide: '16px'\n },\n title: {\n mobile: '24px',\n tablet: '32px',\n desktop: '40px',\n wide: '48px'\n },\n subtitle: {\n mobile: '16px',\n tablet: '18px',\n desktop: '20px',\n wide: '22px'\n },\n body: {\n mobile: '14px',\n tablet: '16px',\n desktop: '18px',\n wide: '20px'\n },\n cta: {\n mobile: '18px',\n tablet: '22px',\n wide: '24px'\n }\n} as const;\n\nexport const SPACING = {\n // Text component spacing\n headerMargin: '0 0 0.25rem 0',\n titleMargin: '0 0 0.75rem 0',\n subtitleMargin: '0 0 0.5rem 0',\n bodyMargin: '0 0 0.5rem 0',\n\n // Layout spacing\n textGap: '0',\n desktopPadding: '3rem',\n mobilePadding: '2rem',\n carouselGap: '0.75rem',\n\n // CTA spacing\n ctaPaddingDesktop: '16px 32px',\n ctaPaddingTablet: '12px 28px',\n ctaPaddingWide: '18px 36px'\n} as const;\n\nexport const DIMENSIONS = {\n // Banner height\n bannerHeightDesktop: '600px',\n bannerHeightMobile: '400px',\n\n // Text container\n textMaxWidth: '600px',\n\n // Carousel indicators\n indicatorSize: '12px',\n indicatorBorder: '2px'\n} as const;\n\nexport const COLORS = {\n // Text colors\n textWhite: '#ffffff',\n textDark: '#1D1D1B',\n textGray: '#666',\n\n // CTA colors\n ctaDark: '#888888',\n ctaBorder: '#888888',\n\n // Media fallback\n fallbackBg: '#f0f0f0',\n\n // Indicator colors\n indicatorBorder: 'rgba(255, 255, 255, 0.9)',\n indicatorActive: 'rgba(200, 200, 200, 0.9)',\n indicatorInactive: 'transparent'\n} as const;\n\nexport const TEXT_COLOR_MAP = {\n white: COLORS.textWhite,\n dark: COLORS.textDark\n} as const;\n\nexport const TRANSITIONS = {\n fast: '0.1s ease',\n default: '0.3s ease',\n slow: '0.6s cubic-bezier(0.4, 0, 0.2, 1)'\n} as const;\n\nexport const Z_INDEX = {\n background: 0,\n media: 0,\n gradient: 1,\n content: 2,\n controls: 3\n} as const;\n\nexport const MEDIA_QUERIES = {\n tablet: `@media (min-width: ${BREAKPOINTS.tablet + 1}px) and (max-width: ${BREAKPOINTS.desktop - 1}px)`,\n desktop: `@media (min-width: ${BREAKPOINTS.desktop}px) and (max-width: ${BREAKPOINTS.wide - 1}px)`,\n wide: `@media (min-width: ${BREAKPOINTS.wide}px)`,\n mobileAndBelow: `@media (max-width: ${BREAKPOINTS.tablet}px)`,\n desktopAndUp: `@media (min-width: ${BREAKPOINTS.desktop}px)`\n} as const;\n","/**\n * Marketing Banner Styled Component Mixins\n * Reusable CSS patterns and helper functions\n */\n\nimport { css } from '@emotion/react';\nimport { MEDIA_QUERIES, TRANSITIONS } from './theme';\n\n/**\n * Responsive font sizing\n * Applies font-size at different breakpoints\n */\nexport const responsiveFontSize = (sizes: Record<string, string>) => css`\n font-size: ${sizes.mobile};\n\n ${MEDIA_QUERIES.tablet} {\n font-size: ${sizes.tablet || sizes.mobile};\n }\n ${MEDIA_QUERIES.desktop} {\n font-size: ${sizes.desktop || sizes.tablet || sizes.mobile};\n }\n ${MEDIA_QUERIES.wide} {\n font-size: ${sizes.wide || sizes.desktop || sizes.tablet || sizes.mobile};\n }\n`;\n\n/**\n * Center text on mobile, preserve positioning on desktop\n */\nexport const centerOnMobile = css`\n ${MEDIA_QUERIES.mobileAndBelow} {\n text-align: center;\n }\n`;\n\n/**\n * Smooth transitions for interactive elements\n */\nexport const smoothTransition = (\n properties: string[] = ['background-color', 'color', 'border-color', 'transform', 'text-decoration']\n) => css`\n transition: ${properties.map((prop) => `${prop} ${TRANSITIONS.default}`).join(', ')};\n`;\n\n/**\n * Focus outline styling for accessibility\n */\nexport const focusOutline = (color: string) => css`\n &:focus-visible {\n outline: 2px solid ${color};\n outline-offset: 4px;\n }\n`;\n\n/**\n * Absolute fill (cover parent completely)\n */\nexport const absoluteFill = css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`;\n\n/**\n * Absolute positioning with dimensions\n */\nexport const absoluteFullSize = css`\n ${absoluteFill}\n width: 100%;\n height: 100%;\n`;\n\n/**\n * Center positioning (horizontal only)\n */\nexport const centerHorizontal = css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`;\n\n/**\n * Flex center alignment\n */\nexport const flexCenter = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n/**\n * Removes all margins and padding\n */\nexport const resetSpacing = css`\n margin: 0;\n padding: 0;\n`;\n\n/**\n * CTA hover state with transform\n */\nexport const ctaHoverState = (backgroundColor: string, borderColor: string, textColor: string) => css`\n &:hover {\n background-color: ${backgroundColor};\n color: ${textColor};\n border-color: ${borderColor};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n`;\n\n/**\n * Gradient overlay mixin\n */\nexport const gradientOverlay = (direction: string, startOpacity: number, endOpacity: number, baseColor: string) => css`\n background: linear-gradient(${direction}, rgba(${baseColor}, ${startOpacity}), rgba(${baseColor}, ${endOpacity}));\n`;\n\n/**\n * Radial gradient overlay mixin\n */\nexport const radialGradientOverlay = (startOpacity: number, endOpacity: number, baseColor: string) => css`\n background: radial-gradient(circle, rgba(${baseColor}, ${startOpacity}), rgba(${baseColor}, ${endOpacity}));\n`;\n","/**\n * BannerText Sub-Component\n * Renders text content (header, title, subtitle, bodyText) using the Typography component\n */\n\nimport React from 'react';\nimport type { BannerTextProps } from '../types';\nimport { PLACEHOLDER_VALUES } from '../constants';\nimport { Typography } from '../../typography';\nimport { TextContainer, HeaderTextWrapper, TitleWrapper, SubtitleWrapper, BodyTextWrapper } from './BannerText.styled';\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean,\n showPlaceholder?: boolean\n): string | undefined {\n if (isEditing === true) {\n if (!text) {\n return showPlaceholder ? placeholderValue : undefined;\n }\n return text;\n }\n if (isEditing === false && text === placeholderValue) {\n return undefined;\n }\n return text;\n}\n\nexport function BannerText({\n headerText,\n title,\n subtitle,\n bodyText,\n textColor = '#ffffff',\n textAlignment = 'left',\n testId,\n $,\n isEditing\n}: Readonly<BannerTextProps>): React.ReactElement | null {\n const header = getDisplayText(headerText, PLACEHOLDER_VALUES.header, isEditing);\n const titleDisplay = getDisplayText(title, PLACEHOLDER_VALUES.title, isEditing, true);\n const subtitleDisplay = getDisplayText(subtitle, PLACEHOLDER_VALUES.subtitle, isEditing);\n const body = getDisplayText(bodyText, PLACEHOLDER_VALUES.body, isEditing);\n\n if (!header && !titleDisplay && !subtitleDisplay && !body) {\n return null;\n }\n\n return (\n <TextContainer\n textAlignment={textAlignment}\n data-testid={testId}\n >\n {header && (\n <HeaderTextWrapper>\n <Typography\n variant=\"disclaimer\"\n inputText={header}\n color={textColor}\n aria-label={header}\n {...($?.header_text ?? {})}\n />\n </HeaderTextWrapper>\n )}\n {titleDisplay && (\n <TitleWrapper>\n <Typography\n variant=\"h2\"\n inputText={titleDisplay}\n color={textColor}\n aria-label={titleDisplay}\n {...($?.title ?? {})}\n />\n </TitleWrapper>\n )}\n {subtitleDisplay && (\n <SubtitleWrapper>\n <Typography\n variant=\"h3\"\n inputText={subtitleDisplay}\n color={textColor}\n aria-label={subtitleDisplay}\n {...($?.subtitle ?? {})}\n />\n </SubtitleWrapper>\n )}\n {body && (\n <BodyTextWrapper>\n <Typography\n variant=\"body\"\n inputText={body}\n color={textColor}\n aria-label={body}\n {...($?.body_text ?? {})}\n />\n </BodyTextWrapper>\n )}\n </TextContainer>\n );\n}\n","import React from 'react';\nimport { extractBynderMedia } from './utils';\nimport { MediaContainer, StyledImage, StyledVideo, PictureElement, SourceElement } from './BynderMedia.styled';\nimport type { BynderMediaProps } from './types';\n\nexport function BynderMedia({ bynder_media, $ }: Readonly<BynderMediaProps>): React.ReactElement | null {\n const [mediaInfo, setMediaInfo] = React.useState<ReturnType<typeof extractBynderMedia>>(\n extractBynderMedia(bynder_media)\n );\n const [hasError, setHasError] = React.useState(false);\n\n React.useEffect(() => {\n const extracted = extractBynderMedia(bynder_media);\n setMediaInfo(extracted);\n setHasError(!extracted);\n }, [bynder_media]);\n\n const handleMediaError = () => {\n setHasError(true);\n };\n\n if (!mediaInfo || hasError) {\n return null;\n }\n\n const mediaType = mediaInfo.type;\n const mediaAlt = mediaInfo.alt;\n const isResponsive = mediaInfo.isResponsive ?? false;\n const desktopUrl = mediaInfo.desktopUrl;\n const mobileUrl = mediaInfo.mobileUrl;\n const mediaUrl = mediaInfo.url;\n const imageFit = mediaInfo.imageFit ?? 'cover';\n const focusPoint = mediaInfo.focusPoint;\n const objectPosition = mediaInfo.objectPosition;\n const bgColor = mediaInfo.bgColor;\n\n if (mediaType === 'video') {\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <StyledVideo\n src={mediaUrl}\n onError={handleMediaError}\n autoPlay\n muted\n loop\n playsInline\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </MediaContainer>\n );\n }\n\n // Responsive image with picture element\n if (isResponsive && mobileUrl && desktopUrl) {\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <PictureElement>\n <SourceElement\n media=\"(max-width: 768px)\"\n srcSet={mobileUrl}\n />\n <SourceElement\n media=\"(min-width: 769px)\"\n srcSet={desktopUrl}\n />\n <StyledImage\n src={desktopUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </PictureElement>\n </MediaContainer>\n );\n }\n\n // Standard image\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <StyledImage\n src={mediaUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </MediaContainer>\n );\n}\n","import { BynderImageDataType, BynderMediaExtracted, BynderMediaType } from './types';\n\nexport function getMediaUrl(\n selected: BynderImageDataType['selected'],\n isPublic: boolean,\n previewUrls: BynderImageDataType['previewUrls']\n): string {\n const { url = '', type: fileType = '' } = selected ?? {};\n if (fileType === 'VIDEO') {\n if (isPublic) {\n return url;\n } else {\n return previewUrls?.[0] ?? '';\n }\n }\n return url;\n}\n\nfunction generateResponsiveUrl(baseUrl: string, aspectRatio: string): string {\n try {\n const url = new URL(baseUrl);\n const ioParams = url.searchParams.getAll('io');\n\n if (!ioParams.length) return baseUrl;\n\n const isFit = ioParams.some((io) => io.startsWith('transform:fit'));\n const hasFillWithDimensions = ioParams.some((io) => {\n if (!io.includes('transform:fill')) return false;\n return (\n (io.includes('width:') && io.includes('height:')) ||\n (url.searchParams.has('width') && url.searchParams.has('height'))\n );\n });\n\n const skipAspectRatio = isFit || hasFillWithDimensions;\n\n const updatedIoParams = ioParams.map((io) => {\n if (!skipAspectRatio && io.includes('transform:fill')) {\n return `${io},aspectratio:${aspectRatio}`;\n }\n return io;\n });\n\n const params: string[] = [];\n updatedIoParams.forEach((io) => params.push(`io=${io}`));\n params.push('quality=95');\n\n url.searchParams.forEach((value, key) => {\n if (key !== 'io') {\n params.push(`${key}=${value}`);\n }\n });\n\n return `${url.origin}${url.pathname}?${params.join('&')}`;\n } catch (error) {\n console.warn('Failed to generate responsive URL:', error);\n return baseUrl;\n }\n}\n\nfunction addDefaultTransform(baseUrl: string): string {\n // Basic type and emptiness validation before attempting URL parsing\n if (typeof baseUrl !== 'string') {\n console.error('addDefaultTransform: expected string URL, got', baseUrl);\n return '';\n }\n\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n console.error('addDefaultTransform: received empty URL string');\n return baseUrl;\n }\n\n // Only attempt to parse absolute or protocol-relative URLs. Anything else is treated\n // as misconfigured input and returned unchanged after logging.\n const looksAbsolute = trimmed.startsWith('http://') || trimmed.startsWith('https://') || trimmed.startsWith('//');\n\n if (!looksAbsolute) {\n console.error('addDefaultTransform: URL is not absolute', trimmed);\n return baseUrl;\n }\n\n try {\n const url = new URL(trimmed);\n if (!url.searchParams.has('io')) {\n return `${trimmed}?io=transform:fill&quality=95`;\n }\n return trimmed;\n } catch (error) {\n console.error(error);\n return baseUrl;\n }\n}\n\nfunction extractFocusPointFromUrl(url: string): { x: number; y: number } | undefined {\n try {\n const urlObj = new URL(url);\n const focuspoint = urlObj.searchParams.get('focuspoint');\n\n if (focuspoint) {\n const [x, y] = focuspoint.split(',').map(parseFloat);\n if (!isNaN(x) && !isNaN(y)) {\n return {\n x: Math.round(x * 100),\n y: Math.round(y * 100)\n };\n }\n }\n } catch (error) {\n console.warn('Failed to extract focus point from URL:', error);\n }\n return undefined;\n}\n\nfunction parseObjectPosition(position?: string): string {\n if (!position) return 'center';\n\n const normalized = position?.trim()?.toLowerCase();\n\n if (normalized === 'center' || normalized === 'center center') return 'center';\n if (\n normalized.includes('left') ||\n normalized.includes('right') ||\n normalized.includes('top') ||\n normalized.includes('bottom')\n ) {\n return normalized;\n }\n\n return 'center';\n}\n\nexport function extractBynderMedia(mediaJson?: string): BynderMediaExtracted | null {\n if (!mediaJson) {\n return null;\n }\n try {\n const parsed = JSON.parse(mediaJson);\n const firstImage = parsed?.image?.[0];\n const selected = firstImage?.selected;\n\n const mediaUrl = getMediaUrl(selected, firstImage?.isPublic, firstImage?.previewUrls);\n\n let mediaType: BynderMediaType = 'image';\n if (selected?.type === 'VIDEO') {\n mediaType = 'video';\n } else if (selected?.type === 'IMAGE' && mediaUrl?.toLowerCase().endsWith('.gif')) {\n mediaType = 'gif';\n }\n\n const isResponsive = selected?.imageType === 'customTransformation' || selected?.imageType === 'defaultPreset';\n\n const focusPoint = extractFocusPointFromUrl(mediaUrl);\n\n const objectPosition = parseObjectPosition(selected?.position);\n\n const bgColor = selected?.bgColor ?? undefined;\n\n const result: BynderMediaExtracted = {\n url: mediaUrl,\n type: mediaType,\n alt: selected?.altText ?? '',\n imageFit: selected?.fit ?? 'cover',\n focusPoint,\n objectPosition,\n bgColor\n };\n\n if (isResponsive && mediaType === 'image') {\n result.isResponsive = true;\n result.desktopUrl = generateResponsiveUrl(mediaUrl, '16x9');\n result.mobileUrl = generateResponsiveUrl(mediaUrl, '3x4');\n result.url = result.desktopUrl;\n } else if (mediaType === 'image') {\n result.url = addDefaultTransform(mediaUrl);\n }\n\n return result;\n } catch (error) {\n console.warn('Failed to parse bynder_media JSON:', error);\n return null;\n }\n}\n","import styled from '@emotion/styled';\n\nexport const MediaContainer = styled.div<{ bgColor?: string }>`\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: block;\n background-color: ${({ bgColor }) => bgColor ?? 'transparent'};\n`;\n\nexport const StyledImage = styled.img<{\n objectFit?: string;\n focusPoint?: { x: number; y: number };\n objectPosition?: string;\n}>`\n width: 100%;\n height: 100%;\n object-fit: ${({ objectFit }) => objectFit ?? 'cover'};\n object-position: ${({ focusPoint, objectPosition }) => {\n if (focusPoint) {\n return `${focusPoint.x}% ${focusPoint.y}%`;\n }\n return objectPosition ?? 'center';\n }};\n display: block;\n`;\n\nexport const StyledVideo = styled.video<{\n objectFit?: string;\n focusPoint?: { x: number; y: number };\n objectPosition?: string;\n}>`\n width: 100%;\n height: 100%;\n object-fit: ${({ objectFit }) => objectFit ?? 'cover'};\n object-position: ${({ focusPoint, objectPosition }) => {\n if (focusPoint) {\n return `${focusPoint.x}% ${focusPoint.y}%`;\n }\n return objectPosition ?? 'center';\n }};\n display: block;\n`;\n\nexport const PictureElement = styled.picture`\n width: 100%;\n height: 100%;\n display: block;\n`;\n\nexport const SourceElement = styled.source`\n display: block;\n`;\n","/**\n * useCarousel Hook\n * Manages carousel state and keyboard navigation\n */\n\nimport { useCallback, useEffect, useState, KeyboardEvent } from 'react';\nimport type { UseCarouselReturn } from '../types';\nimport { useReducedMotion } from './useReducedMotion';\n\ninterface UseCarouselOptions {\n totalSlides: number;\n autoRotate?: boolean;\n rotationInterval?: number;\n initialIndex?: number;\n}\n\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const { totalSlides, autoRotate = false, rotationInterval = 5000, initialIndex = 0 } = options;\n\n const validInitialIndex = totalSlides > 0 ? Math.min(initialIndex, totalSlides - 1) : 0;\n const [currentIndex, setCurrentIndex] = useState(validInitialIndex);\n const [isPaused, setIsPaused] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n\n const goToNext = useCallback(() => {\n if (totalSlides === 0) return;\n setCurrentIndex((prev) => (prev + 1) % totalSlides);\n }, [totalSlides]);\n\n const goToPrevious = useCallback(() => {\n if (totalSlides === 0) return;\n setCurrentIndex((prev) => (prev - 1 + totalSlides) % totalSlides);\n }, [totalSlides]);\n\n const goToSlide = useCallback(\n (index: number) => {\n if (index >= 0 && index < totalSlides) {\n setCurrentIndex(index);\n }\n },\n [totalSlides]\n );\n\n const pause = useCallback(() => {\n setIsPaused(true);\n }, []);\n\n const resume = useCallback(() => {\n setIsPaused(false);\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n goToPrevious();\n break;\n case 'ArrowRight':\n event.preventDefault();\n goToNext();\n break;\n case 'Home':\n event.preventDefault();\n goToSlide(0);\n break;\n case 'End':\n event.preventDefault();\n goToSlide(totalSlides - 1);\n break;\n }\n },\n [goToNext, goToPrevious, goToSlide, totalSlides]\n );\n\n useEffect(() => {\n if (currentIndex >= totalSlides && totalSlides > 0) {\n setCurrentIndex(totalSlides - 1);\n }\n }, [totalSlides, currentIndex]);\n\n // Auto-rotation effect\n useEffect(() => {\n if (!autoRotate || isPaused || prefersReducedMotion || totalSlides === 0) return;\n\n const intervalId = setInterval(goToNext, rotationInterval);\n return () => clearInterval(intervalId);\n }, [autoRotate, isPaused, prefersReducedMotion, rotationInterval, goToNext, totalSlides]);\n\n return {\n currentIndex,\n isPaused,\n totalSlides,\n goToNext,\n goToPrevious,\n goToSlide,\n pause,\n resume,\n handleKeyDown\n };\n}\n","/**\n * useReducedMotion Hook\n * Detects user's prefers-reduced-motion preference\n */\n\nimport { useEffect, useState } from 'react';\n\nexport function useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n // SSR-safe: Check if window is available\n if (typeof window === 'undefined' || !window.matchMedia) {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (event: MediaQueryListEvent) => {\n setPrefersReducedMotion(event.matches);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n","import { ButtonsBlock } from '../../button/types';\nimport { MarketingBannerProps, BannerData } from '../types';\n\nexport function hasCTA(banner: BannerData): boolean {\n return Boolean((banner?.cta_button as ButtonsBlock)?.buttons?.length);\n}\n\nexport function isCarouselMode(props: MarketingBannerProps): boolean {\n return Array.isArray(props?.banners) && props?.banners?.length > 1;\n}\n\nexport function hasMedia(banner: BannerData): boolean {\n return Boolean(banner?.bynder_media);\n}\n","import React from 'react';\nimport { NsIcon, NsIconVariants } from '@nuskin/foundation-ui-components';\nimport { ButtonContainer, StyledButton, StyledLabelText, StyledIconWrapper } from './Button.styled';\nimport {\n getButtonWidth,\n getIconSize,\n resolveDisabled,\n resolveIconName,\n resolveTarget,\n variantDefaults,\n REL_NOOPENER_NOREFERRER,\n DEFAULT_VARIANT,\n DEFAULT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_ICON_POSITION,\n DEFAULT_BUTTON_TYPE,\n DEFAULT_PLACEHOLDER_TEXT,\n DEFAULT_TARGET,\n BUTTON_TYPE_ROUNDED,\n BUTTON_TYPE_SQUARE,\n BORDER_COLOR_TRANSPARENT\n} from './helpers';\nimport { convertToLocalizedUrl } from '../utils/common';\nimport { ButtonProps, ButtonType } from './types';\n\nconst Button: React.FC<ButtonProps> = ({\n title,\n url,\n open_in_new_tab: target = DEFAULT_TARGET,\n variant,\n button_size: size,\n alignment,\n vertical_alignment,\n buttontype: buttonType = DEFAULT_BUTTON_TYPE,\n icon,\n iconposition: iconPosition,\n button_state: disabled,\n isEditing,\n $,\n parent$\n}) => {\n const resolvedVariant = variant ?? DEFAULT_VARIANT;\n const resolvedSize = size ?? DEFAULT_SIZE;\n const resolvedAlignment = alignment ?? DEFAULT_ALIGNMENT;\n const resolvedVerticalAlignment = vertical_alignment ?? 'top';\n const resolvedIconPosition = iconPosition ?? DEFAULT_ICON_POSITION;\n\n const resolvedButtonType: ButtonType =\n buttonType === BUTTON_TYPE_ROUNDED ? BUTTON_TYPE_ROUNDED : BUTTON_TYPE_SQUARE;\n\n const hrefProp = convertToLocalizedUrl(url);\n\n const variantDefault =\n variantDefaults[resolvedVariant as keyof typeof variantDefaults] ?? variantDefaults[DEFAULT_VARIANT];\n const buttonWidth = getButtonWidth(resolvedSize);\n const maxButtonWidth = getButtonWidth('large');\n const resolvedTarget = resolveTarget(target);\n const resolvedDisabled = resolveDisabled(disabled);\n const buttonBorder = ('border' in variantDefault ? variantDefault.border : undefined) ?? BORDER_COLOR_TRANSPARENT;\n\n const isLinkVariant = resolvedVariant === 'link';\n\n const IconName = resolveIconName(icon);\n const isValidNsIcon = typeof IconName === 'string' && IconName in NsIconVariants;\n const iconSize = getIconSize(resolvedSize);\n\n const renderIcon = (position: 'left' | 'right') => {\n if (!IconName || !isValidNsIcon || resolvedIconPosition !== position) return null;\n\n const iconColor = resolvedDisabled ? variantDefault.disabledText : variantDefault.text;\n\n return (\n <StyledIconWrapper\n position={position}\n data-button-icon\n >\n <NsIcon\n name={IconName}\n size={iconSize}\n colorOverride={iconColor}\n {...($?.icon ?? {})}\n />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n const labelTitle = title;\n\n if (labelTitle === '') {\n return DEFAULT_PLACEHOLDER_TEXT;\n }\n if (!isEditing && labelTitle !== DEFAULT_PLACEHOLDER_TEXT) {\n return labelTitle;\n }\n return labelTitle;\n };\n\n return (\n <ButtonContainer\n alignment={resolvedAlignment}\n verticalAlignment={resolvedVerticalAlignment}\n >\n <StyledButton\n $variant={resolvedVariant}\n $buttonWidth={buttonWidth}\n $buttonType={resolvedButtonType}\n $bg={variantDefault.bg}\n $hover={variantDefault.hover}\n $pressed={variantDefault.pressed}\n $text={variantDefault.text}\n $border={buttonBorder}\n $disabledBg={variantDefault.disabledBg}\n $disabledText={variantDefault.disabledText}\n $focusRing={variantDefault.focusRing}\n $maxButtonWidth={maxButtonWidth}\n $hoverText={\n 'hoverText' in variantDefault ? (variantDefault as { hoverText?: string }).hoverText : undefined\n }\n $underlineColor={\n 'underlineColor' in variantDefault\n ? (variantDefault as { underlineColor?: string }).underlineColor\n : undefined\n }\n href={hrefProp}\n data-variant={resolvedVariant}\n {...(resolvedTarget === '_blank' ? { target: '_blank', rel: REL_NOOPENER_NOREFERRER } : {})}\n aria-disabled={resolvedDisabled}\n disabled={resolvedDisabled}\n {...(parent$ ?? {})}\n >\n {isLinkVariant ? (\n <span data-link-content>\n {renderIcon('left')}\n <StyledLabelText\n data-button-label\n {...($?.title ?? {})}\n >\n {getLabelText()}\n </StyledLabelText>\n {renderIcon('right')}\n </span>\n ) : (\n <>\n {renderIcon('left')}\n <StyledLabelText {...($?.title ?? {})}>{getLabelText()}</StyledLabelText>\n {renderIcon('right')}\n </>\n )}\n </StyledButton>\n </ButtonContainer>\n );\n};\n\nexport default Button;\n","import { NsButton } from '@nuskin/foundation-ui-components';\nimport { styled } from '@nuskin/foundation-theme';\nimport type { ButtonAlignment, ButtonVariant, VerticalAlignment } from './types';\nimport { ROUNDED_BORDER_RADIUS, ICON_MARGIN, BUTTON_TYPE_ROUNDED } from './helpers';\n\nconst BUTTON_GAP = '2px';\nconst BUTTON_MIN_WIDTH = '70px';\nconst DESKTOP_BREAKPOINT = '769px';\nconst TABLET_BREAKPOINT = '768px';\nconst MOBILE_BREAKPOINT = '425px';\nconst DESKTOP_FONT_WEIGHT = 500;\nconst TABLET_MOBILE_FONT_WEIGHT = 400;\nconst FOCUS_OUTLINE_WIDTH = '2px';\nconst FONT_FAMILY_LORA = 'Lora, sans-serif';\nconst BORDER_COLOR_TRANSPARENT = 'transparent';\nconst JUSTIFY_CONTENT_CENTER = 'center';\nconst JUSTIFY_CONTENT_FLEX_END = 'flex-end';\nconst JUSTIFY_CONTENT_FLEX_START = 'flex-start';\n\nconst getJustifyContent = (alignment: ButtonAlignment | VerticalAlignment): string => {\n if (alignment === 'center') return JUSTIFY_CONTENT_CENTER;\n if (alignment === 'right' || alignment === 'bottom') return JUSTIFY_CONTENT_FLEX_END;\n return JUSTIFY_CONTENT_FLEX_START;\n};\n\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\nexport const ButtonContainer = styled('div')<{ alignment: ButtonAlignment; verticalAlignment: VerticalAlignment }>`\n display: flex;\n justify-content: ${(props) => getJustifyContent(props.alignment)};\n align-items: ${(props) => getJustifyContent(props.verticalAlignment)};\n width: 100%;\n height: 100%;\n`;\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $buttonWidth: string;\n $maxButtonWidth?: string;\n $buttonType: 'square' | 'rounded';\n $bg: string;\n $hover: string;\n $pressed: string;\n $text: string;\n $border: string;\n $disabledBg: string;\n $disabledText: string;\n $focusRing: string;\n $hoverText?: string;\n $underlineColor?: string;\n href?: string;\n}\n\nexport const StyledButton = styled(NsButton, { shouldForwardProp: noForward$ })<StyledButtonProps>`\n --btn-bg: ${(props) => props.$bg};\n --btn-hover: ${(props) => props.$hover};\n --btn-pressed: ${(props) => props.$pressed};\n --btn-color: ${(props) => props.$text};\n --btn-border: ${(props) => props.$border};\n --btn-disabled-bg: ${(props) => props.$disabledBg};\n --btn-disabled-color: ${(props) => props.$disabledText};\n --btn-focus: ${(props) => props.$focusRing};\n --btn-hover-text: ${(props) => props.$hoverText ?? props.$text};\n --btn-underline: ${(props) => props.$underlineColor ?? 'transparent'};\n\n &&&:link:not(:disabled):not([aria-disabled='true']),\n &&&:visited:not(:disabled):not([aria-disabled='true']) {\n color: var(--btn-color);\n text-decoration: none;\n }\n\n && {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${BUTTON_GAP};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${FONT_FAMILY_LORA};\n font-size: 14px;\n padding: 8px 10px;\n min-width: ${(props) => props.$buttonWidth ?? BUTTON_MIN_WIDTH};\n width: auto;\n max-width: ${(props) => props.$maxButtonWidth ?? props.$buttonWidth ?? BUTTON_MIN_WIDTH};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n ${(props) => props.$buttonType === BUTTON_TYPE_ROUNDED && `border-radius: ${ROUNDED_BORDER_RADIUS};`}\n }\n\n @media (min-width: ${DESKTOP_BREAKPOINT}) {\n && {\n font-weight: ${DESKTOP_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${TABLET_BREAKPOINT}) {\n && {\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${MOBILE_BREAKPOINT}) {\n && {\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n width: ${(props) => (props.$buttonWidth === '400px' ? '100%' : 'auto')};\n max-width: ${(props) => (props.$buttonWidth === '400px' ? '100%' : props.$maxButtonWidth)};\n min-width: ${(props) => (props.$buttonWidth === '400px' ? '0' : (props.$buttonWidth ?? BUTTON_MIN_WIDTH))};\n }\n }\n\n &&:hover {\n background: var(--btn-hover);\n }\n\n &&:active {\n background: var(--btn-pressed);\n }\n\n &&:focus {\n border: 1px solid var(--btn-border);\n }\n\n &&:not(:disabled):hover {\n background: var(--btn-hover);\n border-color: var(--btn-border);\n }\n\n &&:not(:disabled):active {\n background: var(--btn-pressed);\n border-color: var(--btn-border);\n }\n\n &&:focus-visible {\n outline: ${FOCUS_OUTLINE_WIDTH} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${BORDER_COLOR_TRANSPARENT};\n }\n\n &&:disabled:focus-visible {\n box-shadow: none;\n }\n\n &&[aria-disabled='true'],\n &&:disabled {\n pointer-events: none;\n cursor: not-allowed;\n background: var(--btn-disabled-bg);\n color: var(--btn-disabled-color);\n border-color: var(--btn-border);\n box-shadow: none;\n }\n\n &&&&:link[aria-disabled='true'],\n &&&&:link:disabled,\n &&&&:visited[aria-disabled='true'],\n &&&&:visited:disabled {\n color: var(--btn-disabled-color);\n text-decoration: none;\n }\n\n &&[data-variant='secondary'][aria-disabled='true'],\n &&[data-variant='secondary']:disabled {\n border-color: var(--btn-border);\n }\n\n &&[data-variant='link'] {\n border: none;\n border-radius: 0;\n padding: 0px;\n background: transparent;\n }\n\n &&[data-variant='link'] [data-link-content] {\n display: inline-flex;\n align-items: center;\n gap: ${BUTTON_GAP};\n border-bottom: 1px solid var(--btn-underline);\n }\n\n &&[data-variant='link']:hover {\n background: transparent;\n }\n\n &&[data-variant='link']:hover:not(:active) [data-link-content] {\n border-bottom-color: var(--btn-hover-text);\n }\n\n &&[data-variant='link']:hover [data-button-label],\n &&[data-variant='link']:hover [data-button-icon] {\n color: var(--btn-hover-text);\n }\n\n &&[data-variant='link']:hover [data-button-icon] svg path {\n fill: currentColor;\n }\n\n &&[data-variant='link']:hover [data-button-icon] svg polyline {\n stroke: currentColor;\n }\n\n &&[data-variant='link']:focus-visible {\n outline: none;\n }\n\n &&[data-variant='link']:focus-visible [data-link-content],\n &&[data-variant='link']:focus [data-link-content],\n &&[data-variant='link']:active [data-link-content] {\n border-bottom: none;\n }\n\n &&[data-variant='link']:active {\n background: transparent;\n }\n\n &&[data-variant='link']:active [data-link-content] {\n border-bottom-color: transparent;\n }\n &&[data-variant='link']:active [data-button-label],\n &&[data-variant='link']:active [data-button-icon] {\n color: var(--btn-color);\n }\n\n &&[data-variant='link']:active [data-button-icon] svg path {\n fill: currentColor;\n }\n\n &&[data-variant='link'][aria-disabled='true'],\n &&[data-variant='link']:disabled {\n background: transparent;\n }\n &&[data-variant='link'][aria-disabled='true'] [data-link-content],\n &&[data-variant='link']:disabled [data-link-content] {\n border-bottom-color: var(--btn-disabled-color);\n }\n &&[data-variant='link'][aria-disabled='true'] [data-button-label],\n &&[data-variant='link']:disabled [data-button-label],\n &&[data-variant='link'][aria-disabled='true'] [data-button-icon],\n &&[data-variant='link']:disabled [data-button-icon] {\n color: var(--btn-disabled-color);\n }\n &&[data-variant='link'][aria-disabled='true'] [data-button-icon] svg,\n &&[data-variant='link']:disabled [data-button-icon] svg {\n color: var(--btn-disabled-color);\n fill: currentColor;\n }\n`;\n\nexport const StyledLabelText = styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`;\n\ninterface StyledIconWrapperProps {\n position: 'left' | 'right';\n}\n\nconst ICON_MARGIN_PX = `${ICON_MARGIN}px`;\n\nexport const StyledIconWrapper = styled.span<StyledIconWrapperProps>`\n flex-shrink: 0;\n ${(props) => props.position === 'left' && `margin-right: ${ICON_MARGIN_PX};`}\n ${(props) => props.position === 'right' && `margin-left: ${ICON_MARGIN_PX};`}\n`;\n","import type { ButtonSize, LinkTarget } from './types';\n\nexport const ROUNDED_BORDER_RADIUS = '25px';\nexport const ICON_MARGIN = 2;\nexport const FLEX_SHRINK_ZERO = 0;\nexport const REL_NOOPENER_NOREFERRER = 'noopener noreferrer';\nexport const CSS_WORD_BREAK = 'break-word';\nexport const PROTOCOL_HTTP = 'http:';\nexport const PROTOCOL_HTTPS = 'https:';\nexport const DISABLED_STATE_STRING = 'disabled';\nexport const DEFAULT_VARIANT = 'primary';\nexport const DEFAULT_SIZE = 'small';\nexport const DEFAULT_ALIGNMENT = 'left';\nexport const DEFAULT_ICON_POSITION = 'left';\nexport const DEFAULT_BUTTON_TYPE = 'square';\nexport const DEFAULT_PLACEHOLDER_TEXT = 'Enter Title';\nexport const DEFAULT_TARGET = 'No';\nexport const BUTTON_TYPE_ROUNDED = 'rounded';\nexport const BUTTON_TYPE_SQUARE = 'square';\nexport const BORDER_COLOR_TRANSPARENT = 'transparent';\n\nexport function resolveTarget(target?: 'Yes' | 'No' | null): LinkTarget | undefined {\n if (target === 'Yes') {\n return '_blank';\n }\n return '_self';\n}\n\nexport function resolveDisabled(disabled?: boolean | string | null): boolean {\n if (disabled == null) {\n return false;\n }\n if (typeof disabled === 'string') {\n return disabled === DISABLED_STATE_STRING;\n }\n return disabled;\n}\n\nconst iconAliasMap: Record<string, string> = {\n arrow: 'arrowRight'\n};\n\nexport function resolveIconName(iconName?: string): string | undefined {\n if (!iconName) return undefined;\n return iconAliasMap[iconName] ?? iconName;\n}\n\nexport const variantDefaults = {\n primary: {\n bg: '#1f1f1f',\n hover: '#3a3530',\n pressed: '#000000',\n text: '#ffffff',\n disabledBg: '#e6e6e6',\n disabledText: '#9e9e9e',\n focusRing: '#4f84b4'\n },\n secondary: {\n bg: '#ffffff',\n hover: '#f2f2f2',\n pressed: '#e6e6e6',\n text: '#000000',\n border: '#626262',\n disabledBg: '#f2f2f2',\n disabledText: '#b0b0b0',\n focusRing: '#4f84b4'\n },\n link: {\n bg: 'transparent',\n hover: 'transparent',\n pressed: 'transparent',\n text: '#000000',\n border: 'transparent',\n disabledBg: 'transparent',\n disabledText: '#9e9e9e',\n focusRing: '#000000',\n hoverText: '#626262',\n underlineColor: '#000000'\n }\n} as const;\n\nconst widthBySize: Record<ButtonSize, string> = {\n large: '400px',\n medium: '250px',\n small: '130px'\n};\n\nconst DEFAULT_BUTTON_WIDTH = '130px';\n\nexport function getButtonWidth(size: string): string {\n return widthBySize[size] ?? DEFAULT_BUTTON_WIDTH;\n}\n\nconst iconSizeByButtonSize: Record<ButtonSize, ButtonSize> = {\n small: 'small',\n medium: 'medium',\n large: 'medium'\n};\n\nconst DEFAULT_ICON_SIZE: ButtonSize = 'medium';\n\nexport function getIconSize(size: string): ButtonSize {\n return iconSizeByButtonSize[size] ?? DEFAULT_ICON_SIZE;\n}\n","const hasLocalePrefix = (path: string): boolean => /^\\/[a-z]{2}\\/[a-z]{2}(\\/|$)/i.test(path);\nconst isProtocolRelativeUrl = (value: string): boolean => /^\\/\\/[^/]/.test(value);\nconst isAbsoluteHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\nconst isPlainDomain = (value: string): boolean =>\n /^(?:www\\.)?[a-z0-9-]+\\.[a-z]{2,}(\\/.*)?$/i.test(value) && !value.startsWith('/');\n\nfunction replaceLocalePlaceholders(value: string, country: string, language: string): string {\n return value\n .replaceAll(/\\{%\\s*region\\s*}/gi, country)\n .replaceAll(/\\{%\\s*language\\s*}/gi, language)\n .replaceAll(/%7B%\\s*region\\s*%7D/gi, country)\n .replaceAll(/%7B%\\s*language\\s*%7D/gi, language);\n}\n\nfunction buildNuSkinUrl(params: {\n url: URL;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n}): string {\n const { url, current, localizedBase, country, language } = params;\n const normalizedOrigin = `${current.protocol}//${current.host}`;\n const pathname = replaceLocalePlaceholders(url.pathname, country, language);\n if (hasLocalePrefix(pathname)) {\n return `${normalizedOrigin}${pathname}${url.search}${url.hash}`;\n }\n return `${localizedBase}${pathname}${url.search}${url.hash}`;\n}\n\nfunction needsLocaleRewrite(url: URL, currentHost: string): boolean {\n const isMainWebsiteHost = url.host === currentHost || url.host === 'nuskin.com' || url.host === 'www.nuskin.com';\n const hasPlaceholders = /\\{%\\s*(region|language)\\s*\\}/i.test(url.pathname);\n return isMainWebsiteHost || hasLocalePrefix(url.pathname) || hasPlaceholders;\n}\n\nfunction resolveNuSkinUrl(params: {\n url: URL;\n fallback: string;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n}): string {\n const { url, fallback, current, localizedBase, country, language } = params;\n\n return needsLocaleRewrite(url, current.host)\n ? buildNuSkinUrl({ url, current, localizedBase, country, language })\n : fallback;\n}\n\nfunction resolveExternalOrAbsoluteUrl(params: {\n trimmedUrl: string;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n isNuSkinDomain: (host: string) => boolean;\n}): string | undefined {\n const { trimmedUrl, current, localizedBase, country, language, isNuSkinDomain } = params;\n\n if (isProtocolRelativeUrl(trimmedUrl)) {\n const url = new URL(`https:${trimmedUrl}`);\n const fallback = `https:${trimmedUrl}`;\n return isNuSkinDomain(url.host)\n ? resolveNuSkinUrl({ url, fallback, current, localizedBase, country, language })\n : fallback;\n }\n\n if (isAbsoluteHttpUrl(trimmedUrl)) {\n const url = new URL(trimmedUrl);\n return isNuSkinDomain(url.host)\n ? resolveNuSkinUrl({ url, fallback: trimmedUrl, current, localizedBase, country, language })\n : trimmedUrl;\n }\n\n if (isPlainDomain(trimmedUrl)) {\n return `https://${trimmedUrl}`;\n }\n\n return undefined;\n}\n\nfunction buildLocalizedRelativeUrl(params: {\n trimmedUrl: string;\n country: string;\n language: string;\n localizedBase: string;\n}): string {\n const { trimmedUrl, country, language, localizedBase } = params;\n const hadTrailingSlash = trimmedUrl.endsWith('/');\n let relativeUrl = trimmedUrl.replace(/^\\.[a-z]{2,}/i, '');\n relativeUrl = replaceLocalePlaceholders(relativeUrl, country, language);\n if (hasLocalePrefix(relativeUrl)) {\n relativeUrl = relativeUrl.replace(/^\\/[a-z]{2}\\/[a-z]{2}/i, '');\n }\n relativeUrl = relativeUrl.replace(/^\\/+/, '/');\n if (!relativeUrl.startsWith('/')) {\n relativeUrl = `/${relativeUrl}`;\n }\n\n if (relativeUrl === '/' || relativeUrl === '') {\n return hadTrailingSlash ? `${localizedBase}/` : localizedBase;\n }\n\n return `${localizedBase}${relativeUrl}`;\n}\n\nexport const convertToLocalizedUrl = (inputUrl?: string): string | undefined => {\n if (!inputUrl) return inputUrl;\n const trimmedUrl = inputUrl.trim();\n\n if (globalThis.window?.location == null) {\n return trimmedUrl;\n }\n\n const current = new URL(globalThis.window.location.href);\n const [, country, language] = current.pathname.split('/');\n if (!country || !language) return trimmedUrl;\n\n const localizedBase = `${current.protocol}//${current.host}/${country}/${language}`;\n const isNuSkinDomain = (host: string): boolean =>\n host === current.host || host.endsWith('.nuskin.com') || host === 'nuskin.com';\n\n const resolvedUrl = resolveExternalOrAbsoluteUrl({\n trimmedUrl,\n current,\n localizedBase,\n country,\n language,\n isNuSkinDomain\n });\n if (resolvedUrl !== undefined) {\n return resolvedUrl;\n }\n\n return buildLocalizedRelativeUrl({ trimmedUrl, country, language, localizedBase });\n};\n","import React from 'react';\nimport Button from './Button';\nimport { ButtonProps, ButtonBlockProp } from './types';\n\nexport type ButtonWrapperProps = {\n readonly parent$?: Record<string, unknown>;\n readonly alignment?: ButtonProps['alignment'];\n readonly isEditing?: boolean;\n} & Partial<ButtonBlockProp>;\n\nfunction getButtonProps(button: ButtonBlockProp | null | undefined): { buttonProps: ButtonProps | null } {\n if (!button) return { buttonProps: null };\n const hasButtons = 'buttons' in button && Array.isArray(button.buttons);\n if (hasButtons) {\n const buttons = button.buttons;\n const entry: ButtonProps | undefined = buttons?.[0];\n const buttonProps = entry ?? null;\n return { buttonProps };\n }\n return { buttonProps: button as ButtonProps };\n}\n\nconst Buttons: React.FC<ButtonWrapperProps> = (props) => {\n const { parent$ = {}, alignment, isEditing = false, ...button } = props;\n const { buttonProps } = getButtonProps(Object.keys(button).length > 0 ? (button as ButtonBlockProp) : null);\n if (!buttonProps || (!buttonProps.title && !isEditing)) return null;\n return (\n <Button\n {...buttonProps}\n alignment={alignment ?? buttonProps.alignment}\n parent$={parent$}\n isEditing={isEditing}\n />\n );\n};\n\nexport default Buttons;\n","/**\n * MarketingBanner Styled Components\n * All styling for the Marketing Banner component\n */\n\nimport styled from '@emotion/styled';\nimport type { GradientDirection, GradientDepth } from './types';\nimport { DIMENSIONS, SPACING, COLORS, Z_INDEX, TRANSITIONS, MEDIA_QUERIES } from './styles/theme';\nimport {\n absoluteFill,\n centerHorizontal,\n gradientOverlay,\n radialGradientOverlay,\n smoothTransition\n} from './styles/mixins';\n\nexport const BannerContainer = styled.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`;\n\nexport const CarouselWrapper = styled.div`\n position: relative;\n width: 100%;\n`;\n\nexport const CarouselTrack = styled.div<{ currentIndex: number; totalSlides: number }>`\n display: flex;\n transition: transform ${TRANSITIONS.slow};\n transform: translateX(-${({ currentIndex }) => currentIndex * 100}%);\n`;\n\nexport const BannerSlide = styled.div`\n min-width: 100%;\n position: relative;\n`;\n\nexport const BannerContent = styled.div<{ hasMedia: boolean; $isNested?: boolean }>`\n position: relative;\n min-height: ${({ hasMedia, $isNested }) => {\n if (!hasMedia) return 'auto';\n if ($isNested) return DIMENSIONS.bannerHeightMobile;\n return DIMENSIONS.bannerHeightDesktop;\n }};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${MEDIA_QUERIES.mobileAndBelow} {\n min-height: ${({ hasMedia }) => (hasMedia ? DIMENSIONS.bannerHeightMobile : 'auto')};\n }\n`;\n\nexport const MediaWrapper = styled.div`\n ${absoluteFill}\n z-index: ${Z_INDEX.media};\n`;\n\nexport const TextContentWrapper = styled.div<{\n position?: 'left' | 'center' | 'right';\n}>`\n position: relative;\n z-index: ${Z_INDEX.content};\n display: flex;\n flex-direction: column;\n gap: ${SPACING.textGap};\n justify-content: center;\n padding: ${SPACING.desktopPadding};\n max-width: ${DIMENSIONS.textMaxWidth};\n width: auto;\n\n /* Base positioning from props (applies to desktop/tablet) */\n ${({ position = 'left' }) => {\n if (position === 'center') {\n return `\n margin: 0 auto;\n align-items: center;\n text-align: center;\n `;\n }\n if (position === 'right') {\n return `\n margin-left: auto;\n margin-right: 0;\n align-items: flex-end;\n text-align: right;\n `;\n }\n return `\n margin-right: auto;\n align-items: flex-start;\n text-align: left;\n `;\n }}\n\n /* Mobile: Override to always center content */\n ${MEDIA_QUERIES.mobileAndBelow} {\n padding: ${SPACING.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n overflow: hidden;\n }\n`;\n\nexport const GradientOverlay = styled.div<{\n direction: GradientDirection;\n depth: GradientDepth;\n color: 'black' | 'white';\n}>`\n ${absoluteFill}\n z-index: ${Z_INDEX.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({ direction, depth, color }) => {\n const opacities = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n };\n const { start, end } = opacities[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n\n if (direction === 'leftToRight') {\n return gradientOverlay('to right', start, end, baseColor);\n }\n if (direction === 'rightToLeft') {\n return gradientOverlay('to left', start, end, baseColor);\n }\n if (direction === 'radial') {\n return radialGradientOverlay(start, end, baseColor);\n }\n return '';\n }}\n\n /* Mobile: Override to always use radial gradient */\n ${MEDIA_QUERIES.mobileAndBelow} {\n ${({ depth, color }) => {\n const opacities = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n };\n const { start, end } = opacities[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n return radialGradientOverlay(start, end, baseColor);\n }}\n }\n`;\n\nexport const ButtonWrapper = styled.div`\n /* Mobile: Always center the button */\n display: flex;\n justify-content: center;\n max-width: min(520px, 90vw);\n\n /* Desktop: Follow parent alignment from TextContentWrapper */\n ${MEDIA_QUERIES.tablet} {\n justify-content: inherit;\n }\n\n ${MEDIA_QUERIES.desktop} {\n justify-content: inherit;\n }\n`;\n\nexport const CarouselControls = styled.div`\n position: absolute;\n bottom: ${SPACING.carouselGap};\n ${centerHorizontal}\n z-index: ${Z_INDEX.controls};\n display: flex;\n gap: ${SPACING.carouselGap};\n align-items: center;\n\n ${MEDIA_QUERIES.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`;\n\nexport const Indicator = styled.button<{ active: boolean }>`\n width: ${DIMENSIONS.indicatorSize};\n height: ${DIMENSIONS.indicatorSize};\n border-radius: 50%;\n border: ${DIMENSIONS.indicatorBorder} solid ${COLORS.indicatorBorder};\n background-color: ${({ active }) => (active ? COLORS.indicatorActive : COLORS.indicatorInactive)};\n cursor: pointer;\n padding: 0;\n box-shadow:\n 0 0 0 1px rgba(0, 0, 0, 0.35),\n 0 1px 3px rgba(0, 0, 0, 0.25);\n ${smoothTransition(['all'])}\n\n &:hover {\n background-color: ${COLORS.indicatorActive};\n transform: scale(1.15);\n }\n`;\n","/**\n * MarketingBanner Component\n * Main component with single banner and automatic carousel mode\n */\n\nimport React from 'react';\nimport { BannerText } from './components';\nimport { BynderMedia } from '../bynder-media';\nimport { useCarousel } from './hooks';\nimport { hasCTA, hasMedia, isCarouselMode } from './utils/utils';\nimport type { MarketingBannerProps, BannerData } from './types';\nimport { TEXT_COLOR_MAP } from './styles/theme';\nimport { Buttons as Button } from '../button';\nimport {\n BannerContainer,\n CarouselWrapper,\n CarouselTrack,\n BannerSlide,\n BannerContent,\n MediaWrapper,\n TextContentWrapper,\n GradientOverlay,\n ButtonWrapper,\n CarouselControls,\n Indicator\n} from './MarketingBanner.styled';\n\nconst getEditTags = (value: unknown): Record<string, unknown> | undefined => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n};\n\nconst getButtonParentEditTags = (banner: BannerData): Record<string, unknown> => {\n const blockEditTags =\n banner.cta_button && 'buttons' in banner.cta_button ? banner.cta_button.$?.buttons__0 : undefined;\n return getEditTags(blockEditTags) ?? getEditTags(banner.$?.cta_button) ?? {};\n};\n\nconst renderBanner = (banner: BannerData, isEditing: boolean, index: number, isNested?: boolean) => {\n const showMedia = hasMedia(banner);\n const showCTA = hasCTA(banner);\n\n const baseTestId = 'marketing-banner';\n const resolvedTextColor = TEXT_COLOR_MAP[banner.text_color ?? 'white'];\n\n const showGradient = banner.gradient?.show_gradient === true;\n const position = banner.content_position ?? banner.position ?? 'left';\n\n // Derive gradient color from text color (inverse)\n const gradientColor = banner.text_color === 'dark' ? 'white' : 'black';\n\n // Derive gradient direction from position\n let gradientDirection: 'leftToRight' | 'rightToLeft' | 'radial';\n if (position === 'left') {\n gradientDirection = 'leftToRight';\n } else if (position === 'right') {\n gradientDirection = 'rightToLeft';\n } else {\n gradientDirection = 'radial';\n }\n\n // Determine text alignment based on position\n let textAlignment: 'left' | 'center' | 'right';\n if (position === 'center') {\n textAlignment = 'center';\n } else if (position === 'right') {\n textAlignment = 'right';\n } else {\n textAlignment = 'left';\n }\n\n const gradientDepth = banner.gradient?.gradient_depth ?? 'md';\n const bynderEditTags = getEditTags(banner.$?.bynder_media);\n const buttonParentEditTags = getButtonParentEditTags(banner);\n\n return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent\n hasMedia={showMedia}\n $isNested={isNested}\n >\n {showMedia && (\n <MediaWrapper>\n <BynderMedia\n bynder_media={banner.bynder_media}\n $={bynderEditTags}\n />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay\n direction={gradientDirection}\n depth={gradientDepth}\n color={gradientColor}\n />\n )}\n\n <TextContentWrapper position={position}>\n <BannerText\n headerText={banner.header_text}\n title={banner.title}\n subtitle={banner.subtitle}\n bodyText={banner.body_text}\n textColor={resolvedTextColor}\n textAlignment={textAlignment}\n testId={`${baseTestId}-${index}-text`}\n $={banner.$}\n isEditing={isEditing}\n />\n\n {showCTA && (\n <ButtonWrapper>\n <Button\n {...banner?.cta_button}\n alignment={textAlignment}\n parent$={buttonParentEditTags}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </TextContentWrapper>\n </BannerContent>\n </BannerSlide>\n );\n};\n\nexport default function MarketingBannerComponent(props: Readonly<MarketingBannerProps>): React.ReactElement {\n const { banners, rotation_interval, isEditing = false, isNested = false } = props;\n\n const isCarousel = isCarouselMode(props);\n\n const carousel = useCarousel({\n totalSlides: banners.length,\n autoRotate: isCarousel,\n rotationInterval: rotation_interval ?? 5000,\n initialIndex: 0\n });\n\n return (\n <BannerContainer\n data-testid={'marketing-banner'}\n onKeyDown={isCarousel ? carousel.handleKeyDown : undefined}\n onMouseEnter={isCarousel ? carousel.pause : undefined}\n onMouseLeave={isCarousel ? carousel.resume : undefined}\n >\n <CarouselWrapper>\n <CarouselTrack\n currentIndex={carousel.currentIndex}\n totalSlides={banners.length}\n >\n {banners.map((banner, index) => renderBanner(banner, isEditing, index, isNested))}\n </CarouselTrack>\n </CarouselWrapper>\n\n {isCarousel && (\n <CarouselControls>\n {banners.map((banner, index) => (\n <Indicator\n key={`${'banner'}-indicator-${index}-${banner.title ?? ''}`}\n active={index === carousel.currentIndex}\n onClick={() => carousel.goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </CarouselControls>\n )}\n </BannerContainer>\n );\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport type { StyledSpacingProps, StyledDividerProps } from './types';\nimport { BREAKPOINTS } from './types';\n\nexport const StyledSpacingContainer = styled('div')<StyledSpacingProps>(({ vertical_padding, divider_alignment }) => {\n const verticalScaleMap = {\n none: { mobile: 0, tablet: 0, desktop: 0, ultra: 0 },\n small: { mobile: 8, tablet: 8, desktop: 8, ultra: 12 },\n medium: { mobile: 12, tablet: 12, desktop: 16, ultra: 20 },\n large: { mobile: 16, tablet: 16, desktop: 24, ultra: 32 }\n } as const;\n\n const v = verticalScaleMap[vertical_padding];\n\n const alignItemsMap = {\n center: 'center',\n right: 'flex-end',\n left: 'flex-start'\n } as const;\n const alignItems = alignItemsMap[divider_alignment ?? 'left'];\n\n return {\n display: 'flex',\n flexDirection: 'column',\n alignItems,\n\n paddingTop: `${v.mobile}px`,\n paddingBottom: `${v.mobile}px`,\n\n [`@media ${BREAKPOINTS.tablet}`]: {\n paddingTop: `${v.tablet}px`,\n paddingBottom: `${v.tablet}px`\n },\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n paddingTop: `${v.desktop}px`,\n paddingBottom: `${v.desktop}px`\n },\n\n [`@media ${BREAKPOINTS.ultra}`]: {\n paddingTop: `${v.ultra}px`,\n paddingBottom: `${v.ultra}px`\n }\n };\n});\n\nexport const StyledDividerLine = styled('div')<StyledDividerProps>(({\n divider_style,\n divider_thickness_px,\n divider_color,\n divider_gradient,\n divider_width_percent\n}) => {\n const base: Record<string, string | number> = {\n width: `${Math.max(0, Math.min(100, divider_width_percent))}%`\n };\n\n if (divider_gradient && divider_style !== 'none') {\n base.height = `${divider_thickness_px}px`;\n base.backgroundImage = divider_gradient ?? '';\n base.backgroundSize = '100% 100%';\n\n if (divider_style === 'dashed') {\n const dashLength = Math.max(12, divider_thickness_px * 4);\n const gapLength = Math.max(6, divider_thickness_px * 2);\n base.maskImage =\n `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n base.WebkitMaskImage =\n `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n } else if (divider_style === 'dotted') {\n const dotSize = Math.max(2, divider_thickness_px);\n const spacing = Math.max(8, dotSize * 3);\n const radius = dotSize / 2;\n\n base.maskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` + `black 99%, transparent 100%)`;\n base.WebkitMaskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` + `black 99%, transparent 100%)`;\n base.maskSize = `${spacing}px ${divider_thickness_px}px`;\n base.WebkitMaskSize = `${spacing}px ${divider_thickness_px}px`;\n base.maskRepeat = 'repeat-x';\n base.WebkitMaskRepeat = 'repeat-x';\n base.maskPosition = '0 center';\n base.WebkitMaskPosition = '0 center';\n }\n } else if (divider_style === 'none') {\n base.height = `${divider_thickness_px}px`;\n base.backgroundImage = divider_gradient ?? '';\n } else {\n base.borderBottomStyle = divider_style;\n base.borderBottomWidth = `${divider_thickness_px}px`;\n base.borderBottomColor = divider_color;\n base.height = 0;\n }\n\n return base;\n});\n","export type PaddingScale = 'none' | 'small' | 'medium' | 'large';\nexport type DividerStyle = 'solid' | 'dashed' | 'dotted' | 'none';\nexport type DividerThickness = 'thin' | 'medium' | 'thick';\nexport type BreakpointName = 'mobile' | 'tablet' | 'desktop' | 'ultra';\n\nexport interface SpacingDividerProps {\n vertical_padding?: PaddingScale;\n divider_style?: DividerStyle;\n divider_thickness?: DividerThickness;\n divider_color?: string;\n divider_gradient_preset?: 'none' | 'soft' | 'bold' | 'faint';\n divider_width_percent?: number;\n divider_alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StyledSpacingProps {\n vertical_padding: PaddingScale;\n divider_alignment: 'left' | 'center' | 'right';\n}\n\nexport interface StyledDividerProps {\n divider_style: DividerStyle;\n divider_thickness_px: number;\n divider_color: string;\n divider_gradient?: string;\n divider_width_percent: number;\n}\n\nexport const THICKNESS_PX: Record<DividerThickness, number> = {\n thin: 1,\n medium: 2,\n thick: 4\n};\n\nexport const BREAKPOINTS: Record<BreakpointName, string> = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px) and (max-width: 1439px)',\n ultra: '(min-width: 1440px)'\n};\n","/**\n * Validates if a string is a valid hex color\n * @param value - The string to validate\n * @returns true if valid hex color, false otherwise\n */\nexport const isValidHex = (value?: string): boolean => {\n if (!value) return false;\n return /^#([A-Fa-f0-9]{6})$/.test(value);\n};\n\n/**\n * Converts hex color to RGB object\n * @param hex - The hex color string (e.g., '#FF0000')\n * @returns RGB object or undefined if invalid hex\n */\nconst hexToRgb = (hex?: string): { r: number; g: number; b: number } | undefined => {\n if (!hex || !/^#([A-Fa-f0-9]{6})$/.test(hex)) return undefined;\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return { r, g, b };\n};\n\n/**\n * Generates CSS gradient string based on preset and base color\n * @param preset - The gradient preset type\n * @param baseHex - The base hex color for the gradient\n * @returns CSS gradient string or undefined\n */\nexport const gradientPresetCss = (\n preset?: 'none' | 'soft' | 'bold' | 'faint',\n baseHex?: string\n): string | undefined => {\n if (!preset || preset === 'none') return undefined;\n const rgb = hexToRgb(baseHex) ?? { r: 0, g: 0, b: 0 };\n switch (preset) {\n case 'soft':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.3), rgba(${rgb.r},${rgb.g},${rgb.b},0.8))`;\n case 'bold':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.6), rgba(${rgb.r},${rgb.g},${rgb.b},1.0))`;\n case 'faint':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.4), rgba(${rgb.r},${rgb.g},${rgb.b},0.4))`;\n default:\n return undefined;\n }\n};\n","import React from 'react';\nimport { StyledSpacingContainer, StyledDividerLine } from './SpacingDivider.styled';\nimport type { SpacingDividerProps } from './types';\nimport { THICKNESS_PX } from './types';\nimport { isValidHex, gradientPresetCss } from './utils/utils';\n\nconst DEFAULT_HEX = '#000000';\n\nconst SpacingDivider = (props: SpacingDividerProps): React.ReactElement | null => {\n const {\n vertical_padding = 'small',\n divider_style = 'solid',\n divider_thickness = 'thin',\n divider_color,\n divider_gradient_preset = 'none',\n divider_width_percent = 100,\n divider_alignment = 'left'\n } = props;\n\n const divider_thickness_px = THICKNESS_PX[divider_thickness];\n const final_divider_color = isValidHex(divider_color) ? divider_color! : DEFAULT_HEX;\n const divider_gradient = gradientPresetCss(divider_gradient_preset, final_divider_color);\n\n return (\n <StyledSpacingContainer\n vertical_padding={vertical_padding}\n divider_alignment={divider_alignment}\n >\n {divider_style !== 'none' && (\n <StyledDividerLine\n divider_style={divider_style}\n divider_thickness_px={divider_thickness_px}\n divider_color={final_divider_color}\n divider_gradient={divider_gradient}\n divider_width_percent={divider_width_percent ?? 100}\n aria-hidden=\"true\"\n />\n )}\n </StyledSpacingContainer>\n );\n};\n\nexport default SpacingDivider;\n","import React, { useEffect } from 'react';\n\nimport { CarouselContainer, InnerWrapper, Slider, ArrowButton, EmptyPlaceholder } from './shared';\nimport { useCarouselLayout } from './hooks/useCarouselLayout';\n\nimport type { CarouselProps } from './types';\n\n/** Carousel layout: slider with arrows and dots. Uses shared hook and UI with carousel container. */\nexport function Carousel<T = unknown>(props: CarouselProps<T>) {\n const { dotsPosition, isEditing } = props;\n const carouselProps = { ...props };\n\n useEffect(() => {\n import('slick-carousel/slick/slick.css');\n import('slick-carousel/slick/slick-theme.css');\n }, []);\n\n const {\n gapPx,\n containerHeight,\n stackedItemHeight,\n stackedItemMaxHeight,\n isVariableWidth,\n containerClassName,\n effectiveFullWidth,\n parent$,\n $,\n emptyBlockParentClass,\n emptyPlaceholderText,\n sliderRef,\n sliderSettings,\n carouselKey,\n renderSlides,\n hasSlides,\n showArrowsOnDesktop,\n slidesToShow,\n placeholderSlotsToShow,\n slidesLength,\n isVariablePresetDesktop,\n getSlideWidth,\n goToPrevious,\n goToNext,\n containerRef\n } = useCarouselLayout(carouselProps);\n\n const renderEmptySlot = (slotIndex: number) => (\n <section\n key={`empty-slide-${slotIndex}`}\n aria-roledescription=\"slide\"\n aria-label={`Empty slide ${slotIndex + 1} of ${placeholderSlotsToShow}`}\n style={\n isVariablePresetDesktop\n ? {\n width: getSlideWidth(slotIndex)\n }\n : undefined\n }\n >\n <EmptyPlaceholder\n emptyBlockParentClass={emptyBlockParentClass}\n text={emptyPlaceholderText}\n totalSlides={slidesLength}\n $={$}\n />\n </section>\n );\n\n return (\n <CarouselContainer\n ref={containerRef}\n gap={gapPx}\n height={containerHeight}\n columnHeight={stackedItemHeight}\n maxColumnHeight={stackedItemMaxHeight}\n isVariableWidth={isVariableWidth}\n className={containerClassName}\n aria-label=\"Carousel Control\"\n fullWidth={effectiveFullWidth}\n dotsInside={dotsPosition !== 'outside'}\n {...(parent$ ?? {})}\n >\n <InnerWrapper>\n <div\n {...($?.['slides'] ?? {})}\n {...($?.['slides__parent'] ?? {})}\n {...{ 'data-add-direction': 'horizontal' }}\n >\n <Slider\n ref={sliderRef}\n {...sliderSettings}\n key={carouselKey}\n >\n {hasSlides && renderSlides()}\n {isEditing &&\n (hasSlides\n ? slidesLength < placeholderSlotsToShow &&\n Array.from({ length: placeholderSlotsToShow - slidesLength }).map((_, offset) =>\n renderEmptySlot(slidesLength + offset)\n )\n : Array.from({ length: placeholderSlotsToShow }).map((_, index) =>\n renderEmptySlot(index)\n ))}\n </Slider>\n </div>\n\n {showArrowsOnDesktop && slidesLength > slidesToShow && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={goToPrevious}\n aria-label=\"Previous slide\"\n fullWidth={effectiveFullWidth}\n >\n ‹\n </ArrowButton>\n <ArrowButton\n direction=\"next\"\n onClick={goToNext}\n aria-label=\"Next slide\"\n fullWidth={effectiveFullWidth}\n >\n ›\n </ArrowButton>\n </>\n )}\n </InnerWrapper>\n </CarouselContainer>\n );\n}\n\nexport default Carousel;\n","import React from 'react';\n\nimport SliderImport from 'react-slick';\nimport * as Styled from './CarouselLayout.styled';\n\nimport { unwrapComponent } from './utils';\n\nconst Slider = unwrapComponent(SliderImport);\nconst CarouselContainer = unwrapComponent(Styled.CarouselContainer);\nconst ArrowButton = unwrapComponent(Styled.ArrowButton);\nconst InnerWrapper = unwrapComponent(Styled.InnerWrapper);\nconst SlideSection = unwrapComponent(Styled.SlideSection);\nconst SlideInner = unwrapComponent(Styled.SlideInner);\nconst SlideContentInner = unwrapComponent(Styled.SlideContentInner);\nconst EmptyPlaceholder = unwrapComponent(Styled.EmptyPlaceholder);\n\nexport {\n Slider,\n CarouselContainer,\n ArrowButton,\n InnerWrapper,\n SlideSection,\n SlideInner,\n SlideContentInner,\n EmptyPlaceholder\n};\n\nexport interface SliderRefInstance {\n slickPrev: () => void;\n slickNext: () => void;\n}\n\nexport function getSlideKey(index: number): string {\n return `slide-${index}`;\n}\n\nexport function renderSlidesContent<T>(params: {\n slidesForRender: T[];\n renderSlide: (slide: T, index: number) => React.ReactNode;\n presetColumns: number;\n gap: number;\n isVariableWidth: boolean;\n getSlideWidth: (index: number) => string;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n useFlexLayout?: boolean;\n $?: Record<string, unknown>;\n}) {\n const {\n slidesForRender,\n renderSlide,\n presetColumns,\n gap,\n isVariableWidth,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout = false,\n $ = {}\n } = params;\n\n const addSlideEditTags = {\n ...($?.['slides'] ?? undefined),\n ...($?.['slides__parent'] ?? undefined),\n 'data-add-direction': 'horizontal'\n };\n\n const flexBasis = presetColumns === 1 ? '100%' : `calc((100% - ${(presetColumns - 1) * gap}px) / ${presetColumns})`;\n\n return slidesForRender.map((slide, index) => {\n const slideWidth = !useFlexLayout && isVariableWidth ? getSlideWidth(index) : undefined;\n const currentFlexBasis = useFlexLayout && isVariableWidth ? getSlideWidth(index) : flexBasis;\n\n return (\n <SlideSection\n key={getSlideKey(index)}\n aria-roledescription=\"slide\"\n aria-label={`Slide ${index + 1} of ${slidesForRender.length}`}\n useFlexLayout={useFlexLayout}\n stackedVerticalGap={stackedVerticalGap}\n stackedItemHeight={stackedItemHeight}\n stackedItemMaxHeight={stackedItemMaxHeight}\n slideWidth={slideWidth}\n flexBasis={currentFlexBasis}\n isVariableWidth={isVariableWidth}\n /**\n * react-slick (variableWidth) reads width from the direct child element's inline style.\n * Without this, widths can be ignored and extra slides may \"peek\" into view.\n */\n style={slideWidth ? { width: slideWidth } : undefined}\n {...addSlideEditTags}\n {...($?.[`slides__${index}`] ?? {})}\n >\n <SlideInner\n stackedItemHeight={stackedItemHeight}\n stackedItemMaxHeight={stackedItemMaxHeight}\n >\n <SlideContentInner>{renderSlide(slide, index)}</SlideContentInner>\n </SlideInner>\n </SlideSection>\n );\n });\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, MIN_EMPTY_PLACEHOLDER_HEIGHT_PX, MIN_SLIDE_WIDTH_PX } from './types';\n\nfunction getArrowButtonPosition(\n fullWidth: boolean | undefined,\n direction: 'prev' | 'next',\n fullVal: number,\n nonFullVal: number\n): { left?: number; right?: number } {\n if (fullWidth) {\n return direction === 'prev' ? { left: 16 } : { right: 16 };\n }\n return direction === 'prev' ? { left: nonFullVal } : { right: nonFullVal };\n}\n\nexport const CarouselContainer = styled('section')<{\n gap: number;\n height: string;\n columnHeight: string;\n maxColumnHeight?: number;\n isVariableWidth: boolean;\n fullWidth?: boolean;\n dotsInside?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth, dotsInside = true }) => ({\n position: 'relative',\n width: '100%',\n textAlign: 'left',\n padding: '0 80px 50px',\n height,\n boxSizing: 'border-box',\n\n ...(fullWidth && {\n padding: '0'\n }),\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n padding: '0 40px 50px',\n ...(fullWidth && {\n padding: '0'\n })\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n padding: '0 20px 40px',\n ...(fullWidth && {\n padding: '0'\n })\n },\n\n '.slick-slider': {\n position: 'relative',\n display: 'block',\n height: '100%'\n },\n\n '.slick-list': {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n boxSizing: 'border-box',\n ...(columnHeight === 'auto' && { minHeight: 280 }),\n margin: `0 -${gap / 2}px`,\n padding: '1px 0'\n },\n\n '.slick-track': {\n display: 'flex',\n height: '100%',\n justifyContent: 'flex-start',\n boxSizing: 'border-box',\n margin: 0,\n marginLeft: 0\n },\n\n '.slick-slide': {\n flexShrink: 0,\n padding: `0 ${gap / 2}px`,\n height: columnHeight === 'auto' ? 'auto' : columnHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n ...(maxColumnHeight != null && { maxHeight: `${maxColumnHeight}px` }),\n\n '& > div': {\n height: '100%',\n width: '100%',\n\n '& > div': {\n height: '100%',\n width: '100%'\n }\n }\n },\n\n '.slick-dots': {\n position: dotsInside ? 'absolute' : 'static',\n bottom: dotsInside ? 0 : 'auto',\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: dotsInside ? 0 : '16px 0 0',\n width: '100%',\n left: 0,\n\n li: {\n margin: 0,\n width: 12,\n height: 12,\n\n button: {\n width: 12,\n height: 12,\n padding: 0,\n borderRadius: '50%',\n border: 'none',\n background: '#ccc',\n textIndent: -9999,\n cursor: 'pointer',\n transition: 'background 0.2s ease, transform 0.2s ease',\n\n '&:before': {\n display: 'none'\n }\n },\n\n '&.slick-active button': {\n background: '#4A90E2'\n }\n }\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n '.slick-dots': {\n bottom: dotsInside ? 8 : 'auto',\n gap: 6,\n\n li: {\n width: 10,\n height: 10,\n\n button: {\n width: 10,\n height: 10\n }\n }\n }\n }\n}));\n\nexport const SlideSection = styled('section')<{\n useFlexLayout: boolean;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n slideWidth?: string;\n flexBasis?: string;\n isVariableWidth: boolean;\n}>(\n ({\n useFlexLayout,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n slideWidth,\n flexBasis,\n isVariableWidth\n }) => ({\n maxWidth: 'none',\n margin: useFlexLayout ? 0 : `0 0 ${stackedVerticalGap}px`,\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n ...(stackedItemMaxHeight != null && { maxHeight: stackedItemMaxHeight }),\n width: slideWidth,\n flex: useFlexLayout && flexBasis ? `0 0 ${flexBasis}` : undefined,\n flexShrink: 0,\n boxSizing: useFlexLayout ? 'border-box' : undefined,\n minWidth: isVariableWidth ? 0 : MIN_SLIDE_WIDTH_PX,\n position: 'relative'\n })\n);\n\nexport const SlideInner = styled('div')<{\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n}>(({ stackedItemHeight }) => ({\n width: '100%',\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n textAlign: 'left',\n overflow: 'hidden',\n minWidth: 0,\n position: 'relative'\n}));\n\nexport const SlideContentInner = styled('div')({\n maxWidth: '100%',\n width: '100%',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n});\n\nexport const ArrowButton = styled('button')<{\n direction: 'prev' | 'next';\n fullWidth?: boolean;\n}>(({ direction, fullWidth }) => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'rgba(0, 0, 0, 0.5)',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n width: 48,\n height: 48,\n padding: 0,\n margin: 0,\n cursor: 'pointer',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 0.2s ease',\n fontSize: 24,\n lineHeight: 1,\n verticalAlign: 'middle',\n ...getArrowButtonPosition(fullWidth, direction, 8, -60),\n\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.7)'\n },\n\n '&:focus': {\n outline: '2px solid #4A90E2',\n outlineOffset: 2\n },\n\n '&:disabled': {\n opacity: 0.3,\n cursor: 'not-allowed'\n },\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n width: 40,\n height: 40,\n ...getArrowButtonPosition(fullWidth, direction, 4, -45)\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n width: 32,\n height: 32,\n fontSize: 20,\n ...getArrowButtonPosition(fullWidth, direction, 2, -35)\n }\n}));\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%',\n containerType: 'inline-size'\n});\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: `${MIN_EMPTY_PLACEHOLDER_HEIGHT_PX}px`,\n border: '1px dashed #ccc',\n boxSizing: 'border-box'\n});\n\ntype EmptyPlaceholderProps = {\n readonly emptyBlockParentClass?: string;\n readonly text?: string;\n readonly totalSlides?: number;\n readonly $?: Record<string, unknown>;\n};\n\nexport const EmptyPlaceholder = ({\n emptyBlockParentClass,\n text = 'Add items',\n totalSlides = 0,\n $ = {}\n}: EmptyPlaceholderProps) => (\n <EmptyPlaceholderWrapper\n className={totalSlides === 0 ? emptyBlockParentClass : undefined}\n {...(totalSlides === 0 ? ($?.slides ?? {}) : {})}\n {...(totalSlides === 0 ? ($?.['slides__parent'] ?? {}) : {})}\n {...($?.[`slides__${totalSlides - 1}`] ?? {})}\n data-add-direction=\"horizontal\"\n >\n {text}\n </EmptyPlaceholderWrapper>\n);\n","/** Shared breakpoints and layout constants for column-control and carousel. */\nexport const DEVICE_SIZES = {\n ULTRA_SMALL: 320,\n EXTRA_SMALL: 480,\n SMALL: 600,\n MEDIUM: 768,\n LARGE: 992,\n EXTRA_LARGE: 1200,\n ULTRA_LARGE: 1440,\n SUPER_LARGE: 1920\n} as const;\n\n/** Max height of a slide/card when height is content-driven. */\nexport const MAX_SLIDE_HEIGHT_PX = 750;\n","import React from 'react';\n\n/** Gap between columns/slides: preset name → px (none: 0, small: 8, medium: 12, large: 16) */\nexport type GapPreset = 'none' | 'small' | 'medium' | 'large';\n\nexport const GAP_PRESET_VALUES: Record<GapPreset, number> = {\n none: 0,\n small: 8,\n medium: 12,\n large: 16\n};\n\n/** Resolve gap to pixels. Accepts preset name or legacy number (for backward compatibility). */\nexport function getGapPx(gap?: GapPreset | number): number {\n if (gap === undefined) return GAP_PRESET_VALUES.large;\n if (typeof gap === 'number') return gap;\n return GAP_PRESET_VALUES[gap];\n}\n\nexport type CarouselPreset =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'two-small-one-large'\n | 'four-equal';\n\nexport type Alignment = 'left' | 'center' | 'right';\n\n/** Render callback: consumer renders each slide from their data. */\nexport type CarouselRenderSlide<T = unknown> = (slide: T, index: number) => React.ReactNode;\n\nexport type CarouselProps<T = unknown> = Readonly<{\n /** Slide data (CMS/consumer shape). Rendered via renderSlide. */\n slides: T[];\n /** Called to render each slide. Receives slide data and index. */\n renderSlide: CarouselRenderSlide<T>;\n preset?: CarouselPreset;\n /** Convenience props that override autoplay.enabled */\n autoplayEnabled?: boolean;\n /** Autoplay interval in seconds (e.g. 3 = 3s). Passed to slider as ms internally. */\n autoplayDuration?: number;\n /** Convenience props that override navigation.showArrows */\n showArrows?: boolean;\n /** Convenience props that override navigation.showPagination */\n showPagination?: boolean;\n onSlideChange?: (index: number) => void;\n className?: string;\n slickSettings?: Record<string, unknown>;\n /** Spacing between columns/slides: 'none'|'small'|'medium'|'large' (0,8,12,16px) or legacy number */\n gap?: GapPreset | number;\n height?: string;\n fullWidth?: boolean;\n emptyBlockParentClass?: string;\n /** Override empty placeholder label. Defaults: \"Add items to the column control\" (grid) or \"Add items to the carousel\" (carousel). */\n emptyPlaceholderText?: string;\n /** Position of slider dots: 'inside' overlays within the slider; 'outside' places them below as part of the height. Defaults to 'inside'. */\n dotsPosition?: 'inside' | 'outside';\n isEditing?: boolean;\n parent$?: Record<string, unknown>;\n $?: Record<string, unknown>;\n}>;\n\nexport interface CarouselSlideProps {\n children: React.ReactNode;\n isActive: boolean;\n preset: CarouselPreset;\n alignment: Alignment;\n index: number;\n slideCount: number;\n}\n\nexport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX } from '../utils/deviceConstants';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\nexport type DeviceSize = keyof typeof DEVICE_SIZES;\nexport const MIN_SLIDE_WIDTH_PX = 280;\nexport const MIN_SLIDE_HEIGHT_PX = 320;\nexport const MIN_EMPTY_PLACEHOLDER_HEIGHT_PX = 220;\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 4;\n","/** Preset name used by both column-control and carousel. */\ntype PresetName =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'two-small-one-large'\n | 'four-equal';\n\nexport function getPresetColumns(preset: PresetName | undefined): number {\n switch (preset) {\n case 'single-full':\n return 1;\n case 'two-equal':\n case 'two-small-large':\n return 2;\n case 'three-equal':\n case 'two-small-one-large':\n return 3;\n case 'four-equal':\n return 4;\n default:\n return 1;\n }\n}\n","import type { CarouselProps } from './types';\nimport { DEVICE_SIZES } from './types';\nexport { getPresetColumns } from '../utils/viewportLayoutUtils';\n\nexport function unwrapComponent<T>(mod: T): T {\n if (!mod || typeof mod === 'function') return mod;\n if (typeof mod === 'object' && mod !== null) {\n const candidate = (mod as { default?: unknown }).default;\n if (candidate) return candidate as T;\n }\n return mod;\n}\n\nexport function isVariableWidthPreset(preset: CarouselProps['preset'], windowWidth: number): boolean {\n if (windowWidth < DEVICE_SIZES.LARGE) return false;\n return preset === 'two-small-large' || preset === 'two-small-one-large';\n}\n\nexport function getVariableSlideWidth(\n preset: CarouselProps['preset'],\n index: number,\n windowWidth: number,\n gapPx: number,\n containerWidthPx: number\n): string {\n if (windowWidth < DEVICE_SIZES.LARGE) return 'auto';\n\n // Use measured container width; fallback to window width if not yet measured\n const avail = containerWidthPx > 0 ? containerWidthPx : windowWidth;\n\n // Base width needs to account for gaps to fill container after negative margins.\n const baseWidth = avail + gapPx;\n\n if (preset === 'two-small-large') {\n const pos = ((index % 2) + 2) % 2;\n const smallPx = Math.round(baseWidth / 3);\n const largePx = baseWidth - smallPx;\n return pos === 0 ? `${smallPx}px` : `${largePx}px`;\n }\n\n if (preset === 'two-small-one-large') {\n const pos = ((index % 3) + 3) % 3;\n const smallPx = Math.round(baseWidth * 0.25);\n const largePx = baseWidth - smallPx * 2;\n return pos === 1 ? `${largePx}px` : `${smallPx}px`;\n }\n\n return 'auto';\n}\n\nexport function getSlidesToShowByViewport(windowWidth: number, presetColumns: number): number {\n if (windowWidth >= DEVICE_SIZES.EXTRA_LARGE) return Math.min(presetColumns, 4);\n if (windowWidth >= DEVICE_SIZES.LARGE) return Math.min(presetColumns, 3);\n if (windowWidth >= DEVICE_SIZES.SMALL) return Math.min(presetColumns, 2);\n return 1;\n}\n\nexport function buildCarouselResponsiveSettings(params: {\n presetColumns: number;\n slidesLength: number;\n isEditing: boolean;\n shouldShowDots: boolean;\n isVariableWidth: boolean;\n}) {\n const { presetColumns, shouldShowDots, isVariableWidth } = params;\n\n const toShowSmall = 1;\n const toShowMedium = Math.min(presetColumns, 2);\n const toShowLarge = Math.min(presetColumns, 3);\n\n return [\n {\n breakpoint: DEVICE_SIZES.SMALL,\n settings: {\n slidesToShow: toShowSmall,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.MEDIUM,\n settings: {\n slidesToShow: toShowMedium,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.LARGE,\n settings: {\n slidesToShow: toShowLarge,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: isVariableWidth\n }\n }\n ];\n}\n","import { useRef, useMemo, useState, useEffect, useCallback } from 'react';\n\nimport {\n getPresetColumns,\n getSlidesToShowByViewport,\n isVariableWidthPreset,\n getVariableSlideWidth,\n buildCarouselResponsiveSettings\n} from '../utils';\nimport { renderSlidesContent } from '../shared';\nimport { useCarouselResize } from '../hooks/useCarouselResize';\n\nimport type { CarouselProps } from '../types';\nimport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX, getGapPx } from '../types';\nimport type { SliderRefInstance } from '../shared';\n\n/** Shared hook for carousel layout behavior. */\nexport function useCarouselLayout<T>(props: CarouselProps<T>) {\n const {\n slides,\n renderSlide,\n preset = 'single-full',\n autoplayEnabled = false,\n autoplayDuration = 3,\n showPagination = true,\n onSlideChange,\n className,\n slickSettings,\n gap = 'medium',\n height,\n fullWidth,\n isEditing = false,\n emptyBlockParentClass,\n emptyPlaceholderText: emptyPlaceholderTextProp,\n parent$,\n $\n } = props;\n\n const gapPx = getGapPx(gap);\n const emptyPlaceholderText = emptyPlaceholderTextProp ?? 'Add items to the carousel';\n const effectiveFullWidth = fullWidth ?? false;\n\n const { windowWidth, carouselKey } = useCarouselResize(preset, slides.length);\n\n // Measure container width in px for react-slick to handle variableWidth correctly.\n const containerRef = useRef<HTMLElement | null>(null);\n const [containerWidthPx, setContainerWidthPx] = useState<number>(0);\n const updateContainerWidth = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n const style = globalThis.getComputedStyle(el);\n const pl = Number.parseFloat(style.paddingLeft) || 0;\n const pr = Number.parseFloat(style.paddingRight) || 0;\n setContainerWidthPx(el.offsetWidth - pl - pr);\n }, []);\n useEffect(() => {\n updateContainerWidth();\n if (typeof ResizeObserver === 'undefined' || !containerRef.current) return;\n const ro = new ResizeObserver(updateContainerWidth);\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [updateContainerWidth]);\n\n const presetColumns = useMemo(() => getPresetColumns(preset), [preset]);\n const targetSlidesToShow = getSlidesToShowByViewport(windowWidth, presetColumns);\n const isVariableWidth = isVariableWidthPreset(preset, windowWidth);\n const getSlideWidth = useMemo(\n () => (index: number) => getVariableSlideWidth(preset, index, windowWidth, gapPx, containerWidthPx),\n [preset, windowWidth, gapPx, containerWidthPx]\n );\n\n const effectiveAutoplayEnabled = autoplayEnabled;\n const effectiveShowPagination = showPagination;\n const showArrowsOnDesktop = windowWidth > DEVICE_SIZES.LARGE;\n\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport = false;\n const stackedItemHeight = 'auto';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = 0;\n const containerHeight = height ?? 'auto';\n\n const shouldShowDots = effectiveShowPagination && slides.length > 1 && windowWidth <= DEVICE_SIZES.LARGE;\n\n const sliderRef = useRef<SliderRefInstance | null>(null);\n const goToPrevious = () => sliderRef.current?.slickPrev();\n const goToNext = () => sliderRef.current?.slickNext();\n\n const containerClassName = [className].filter(Boolean).join(' ');\n // Set variableWidth=true and slidesToScroll=1 for asymmetric presets on desktop.\n const isVariablePresetDesktop = isVariableWidth && windowWidth > DEVICE_SIZES.MEDIUM;\n const effectiveSlidesToShow = isVariablePresetDesktop ? 1 : targetSlidesToShow;\n const placeholderSlotsToShow = isVariablePresetDesktop ? targetSlidesToShow : effectiveSlidesToShow;\n\n const responsiveSettings = useMemo(\n () =>\n buildCarouselResponsiveSettings({\n presetColumns,\n slidesLength: slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n }),\n [presetColumns, slides.length, isEditing, shouldShowDots, isVariableWidth]\n );\n\n const slidesToScroll = 1;\n const sliderSettings = {\n dots: shouldShowDots,\n infinite: slides.length > effectiveSlidesToShow,\n speed: 500,\n slidesToShow: effectiveSlidesToShow,\n slidesToScroll,\n autoplay: effectiveAutoplayEnabled,\n autoplaySpeed: autoplayDuration * 1000,\n pauseOnHover: true,\n arrows: false,\n variableWidth: isVariablePresetDesktop,\n swipe: true,\n draggable: true,\n beforeChange: (_: number, next: number) => onSlideChange?.(next),\n responsive: responsiveSettings,\n ...slickSettings\n };\n\n const renderSlides = (useFlexLayout = false) =>\n renderSlidesContent({\n slidesForRender: slides,\n renderSlide,\n presetColumns,\n gap: gapPx,\n isVariableWidth: isVariablePresetDesktop,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout,\n $\n });\n\n return {\n gapPx,\n containerHeight,\n stackedItemHeight,\n stackedItemMaxHeight,\n isVariableWidth,\n containerClassName,\n effectiveFullWidth,\n parent$,\n $,\n emptyBlockParentClass,\n emptyPlaceholderText,\n sliderRef,\n sliderSettings,\n carouselKey,\n renderSlides,\n slidesForRender: slides,\n hasSlides: slides.length > 0,\n isStackedViewport,\n isTabletGridViewport,\n preset,\n showArrowsOnDesktop,\n slidesToShow: effectiveSlidesToShow,\n placeholderSlotsToShow,\n slidesLength: slides.length,\n isVariablePresetDesktop,\n getSlideWidth,\n goToPrevious,\n goToNext,\n containerRef\n };\n}\n","import { useEffect, useState } from 'react';\n\nimport type { CarouselProps } from '../types';\n\nexport interface UseCarouselResizeResult {\n windowWidth: number;\n carouselKey: string;\n}\n\nexport function useCarouselResize(preset: CarouselProps['preset'], slideCount: number): UseCarouselResizeResult {\n const [windowWidth, setWindowWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 0);\n\n const [carouselKey, setCarouselKey] = useState(`carousel-${preset}-${slideCount}-${Date.now()}`);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n let timeoutId: NodeJS.Timeout;\n\n const handleResize = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n setWindowWidth(window.innerWidth);\n setCarouselKey(`carousel-${preset}-${slideCount}-${Date.now()}`);\n }, 150);\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', handleResize);\n };\n }, [preset, slideCount]);\n\n return { windowWidth, carouselKey };\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, MIN_EMPTY_PLACEHOLDER_HEIGHT_PX, MIN_SLIDE_WIDTH_PX } from './types';\n\nexport const ColumnControlContainer = styled('section')<{\n gap: number;\n height: string;\n columnHeight: string;\n maxColumnHeight?: number;\n fullWidth?: boolean;\n dotsInside?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth, dotsInside = true }) => ({\n position: 'relative',\n width: '100%',\n textAlign: 'center',\n padding: '0 80px 50px',\n height,\n boxSizing: 'border-box',\n\n ...(fullWidth && {\n padding: '0'\n }),\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n padding: fullWidth ? '0' : '0 40px 50px'\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n // On mobile, always use full-width (no horizontal padding) regardless of fullWidth prop\n padding: '0 0 40px'\n },\n\n '.slick-slider': {\n position: 'relative',\n display: 'block',\n height: '100%'\n },\n\n '.slick-list': {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n ...(columnHeight === 'auto' && { minHeight: 280 }),\n margin: `0 -${gap / 2}px`,\n // Add a subtle buffer so slides don't touch the container edges\n padding: '1px 0'\n },\n\n '.slick-track': {\n display: 'flex',\n height: '100%'\n },\n\n '.slick-slide': {\n padding: `0 ${gap / 2}px`,\n // When auto, fill track height so slide content can occupy full height; otherwise use fixed columnHeight\n height: columnHeight === 'auto' ? 'auto' : columnHeight,\n minHeight: 0,\n ...(maxColumnHeight != null && { maxHeight: `${maxColumnHeight}px` }),\n\n '& > div': {\n height: '100%',\n width: '100%',\n\n '& > div': {\n height: '100%',\n width: '100%'\n }\n }\n },\n\n '.slick-dots': {\n position: dotsInside ? 'absolute' : 'static',\n // When inside, overlay within the slider; when outside, place below as part of layout\n bottom: dotsInside ? 12 : 'auto',\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: dotsInside ? 0 : '16px 0 0',\n width: '100%',\n left: 0,\n\n li: {\n margin: 0,\n width: 12,\n height: 12,\n\n button: {\n width: 12,\n height: 12,\n padding: 0,\n borderRadius: '50%',\n border: 'none',\n background: '#ccc',\n textIndent: -9999,\n cursor: 'pointer',\n transition: 'background 0.2s ease, transform 0.2s ease',\n\n '&:before': {\n display: 'none'\n }\n },\n\n '&.slick-active button': {\n background: '#4A90E2'\n }\n }\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n '.slick-dots': {\n bottom: dotsInside ? 8 : 'auto',\n gap: 6,\n\n li: {\n width: 10,\n height: 10,\n\n button: {\n width: 10,\n height: 10\n }\n }\n }\n }\n}));\n\nexport const TabletGridContainer = styled('div')<{ gap: number }>(({ gap }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${gap}px`,\n width: '100%'\n}));\n\nexport const SlideSection = styled('section')<{\n useFlexLayout: boolean;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n slideWidth?: string;\n flexBasis?: string;\n gap: number;\n columns: number;\n}>(\n ({\n useFlexLayout,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n slideWidth,\n flexBasis,\n gap,\n columns\n }) => ({\n maxWidth: 'none',\n margin: useFlexLayout ? 0 : `0 0 ${stackedVerticalGap}px`,\n // Fill parent height so renderSlide content can occupy full slide height\n height: stackedItemHeight,\n minHeight: 0,\n ...(stackedItemMaxHeight != null && { maxHeight: stackedItemMaxHeight }),\n width: slideWidth,\n flex: useFlexLayout && flexBasis ? `0 0 ${flexBasis}` : undefined,\n boxSizing: useFlexLayout ? 'border-box' : undefined,\n // Prevent slides from shrinking too small for readability\n minWidth: MIN_SLIDE_WIDTH_PX,\n position: 'relative',\n\n // Narrow desktop: for 4‑column layouts, drop to 3 columns so cards don't wrap\n // Uses EXTRA_LARGE (1200px) to catch widths where 4 * MIN_SLIDE_WIDTH_PX + gaps no longer fit.\n [`@media (max-width: ${DEVICE_SIZES.EXTRA_LARGE}px)`]: {\n ...(useFlexLayout &&\n columns === 4 && {\n flex: `0 0 calc((100% - ${gap * 2}px) / 3)`,\n maxWidth: `calc((100% - ${gap * 2}px) / 3)`,\n minWidth: 0\n })\n },\n\n // Tablet: at most 2 columns, each using (100% - gap) / 2 so gap is respected\n // Use LARGE breakpoint (1024px) so 2-column behavior kicks in for typical tablet widths.\n [`@media (max-width: ${DEVICE_SIZES.LARGE}px)`]: {\n ...(useFlexLayout && {\n flex: `0 0 calc((100% - ${gap}px) / 2)`,\n maxWidth: `calc((100% - ${gap}px) / 2)`,\n minWidth: 0\n })\n },\n\n // Mobile: single column, each item full width for widths ≤ 600px\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n ...(useFlexLayout && {\n flex: '0 0 100%',\n maxWidth: '100%',\n minWidth: 0\n })\n }\n })\n);\n\nexport const SlideInner = styled('div')<{\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n}>(({ stackedItemHeight }) => ({\n width: '100%',\n // Fill slide section so content wrapper can stretch to full height\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n // Remove justifyContent: center so SlideContentInner can fill full height\n alignItems: 'stretch',\n textAlign: 'left',\n overflow: 'hidden',\n minWidth: 0,\n position: 'relative'\n}));\n\nexport const SlideContentInner = styled('div')({\n maxWidth: '100%',\n width: '100%',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n});\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%'\n});\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: `${MIN_EMPTY_PLACEHOLDER_HEIGHT_PX}px`,\n border: '1px dashed #ccc',\n boxSizing: 'border-box'\n});\n","import React from 'react';\n\n/** Gap between columns/slides: preset name → px (none: 0, small: 8, medium: 12, large: 16) */\nexport type GapPreset = 'none' | 'small' | 'medium' | 'large';\n\nexport const GAP_PRESET_VALUES: Record<GapPreset, number> = {\n none: 0,\n small: 8,\n medium: 12,\n large: 16\n};\n\n/** Resolve gap to pixels. Accepts preset name or legacy number (for backward compatibility). */\nexport function getGapPx(gap?: GapPreset | number): number {\n if (gap === undefined) return GAP_PRESET_VALUES.large;\n if (typeof gap === 'number') return gap;\n return GAP_PRESET_VALUES[gap];\n}\n\nexport type ColumnControlGridLayout = '2x1' | '3x1' | '4x1' | '2x2' | '3x2' | '4x2';\n\nexport type Alignment = 'left' | 'center' | 'right';\n\n/** Render callback: consumer renders each slide from their data. */\nexport type RenderSlideCallback<T = unknown> = (slide: T, index: number) => React.ReactNode;\n\nexport type ColumnControlProps<T = unknown> = Readonly<{\n /** Slide data (CMS/consumer shape). Rendered via renderSlide. */\n slides: T[];\n /** Called to render each slide. Receives slide data and index. */\n renderSlide: RenderSlideCallback<T>;\n /** Grid layout for ColumnControl (grid) mode: \"<columns>x<rows>\" (e.g. \"3x2\"). */\n layout?: ColumnControlGridLayout;\n className?: string;\n /** Spacing between columns/slides: 'none'|'small'|'medium'|'large' (0,8,12,16px) or legacy number */\n gap?: GapPreset | number;\n height?: string;\n fullWidth?: boolean;\n emptyBlockParentClass?: string;\n /** Override empty placeholder label. Defaults: \"Add items to the column control\". */\n emptyPlaceholderText?: string;\n isEditing?: boolean;\n parent$?: Record<string, unknown>;\n $?: Record<string, unknown>;\n}>;\n\nexport interface ColumnControlSlideProps {\n children: React.ReactNode;\n isActive: boolean;\n alignment: Alignment;\n index: number;\n slideCount: number;\n}\n\nexport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX } from '../utils/deviceConstants';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\nexport type DeviceSize = keyof typeof DEVICE_SIZES;\n\nexport const MIN_SLIDE_WIDTH_PX = 280;\n\nexport const MIN_SLIDE_HEIGHT_PX = 320;\n\n/** Minimum height (px) for empty placeholder slots in column control. */\nexport const MIN_EMPTY_PLACEHOLDER_HEIGHT_PX = 220;\n\n// Max number of items allowed when using grid/column-control style layout\n// Column Control grid supports up to 4 columns x 2 rows = 8 items.\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 8;\n","import React from 'react';\n\nimport { EmptyPlaceholderWrapper } from './ColumnControl.styled';\nimport type { ColumnControlGridLayout } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS, MAX_SLIDE_HEIGHT_PX } from './types';\n\nexport interface ViewportLayoutState {\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n stackedItemHeight: string;\n stackedItemMaxHeight: number;\n stackedVerticalGap: number;\n containerHeight: string;\n}\n\nexport function getViewportLayoutState(\n isGridLayout: boolean,\n windowWidth: number,\n gapPx: number,\n height: string = 'auto'\n): ViewportLayoutState {\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport = isGridLayout && windowWidth > DEVICE_SIZES.SMALL && windowWidth <= DEVICE_SIZES.LARGE;\n const stackedItemHeight = 'auto';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = isGridLayout && isStackedViewport ? gapPx : 0;\n return {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight: height\n };\n}\n\nexport interface GridDimensions {\n columns: number;\n rows: number;\n}\n\nexport function getGridDimensions(layout: ColumnControlGridLayout | undefined): GridDimensions {\n const fallback: GridDimensions = { columns: 2, rows: 1 };\n if (!layout) return fallback;\n\n const normalized = layout.toLowerCase();\n const [rawCols, rawRows] = normalized.split('x');\n const parsedCols = Number(rawCols);\n const parsedRows = Number(rawRows);\n\n let columns = Number.isFinite(parsedCols) && parsedCols > 0 ? parsedCols : fallback.columns;\n let rows = Number.isFinite(parsedRows) && parsedRows > 0 ? parsedRows : fallback.rows;\n\n // Enforce business constraints\n columns = Math.min(Math.max(columns, 2), 4);\n rows = Math.min(Math.max(rows, 1), 2);\n\n return { columns, rows };\n}\n\nexport function getMaxChildrenForLayout(layout: ColumnControlGridLayout | undefined): number {\n const { columns, rows } = getGridDimensions(layout);\n const maxByLayout = columns * rows;\n return Math.min(maxByLayout, MAX_ALLOWED_COLUMN_CONTROL_ITEMS);\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items'\n}) => React.createElement(EmptyPlaceholderWrapper, { className: emptyBlockParentClass }, text);\n","import React from 'react';\n\nimport * as Styled from './ColumnControl.styled';\nimport { EmptyPlaceholder, getGridDimensions, getMaxChildrenForLayout } from './utils';\nimport { getGapPx, MAX_SLIDE_HEIGHT_PX, type ColumnControlProps, type ColumnControlGridLayout } from './types';\n\n/** Column control: simple equal-width grid driven by layout (cols x rows). */\nfunction ColumnControl<T = unknown>(props: ColumnControlProps<T>) {\n const {\n slides,\n renderSlide,\n layout,\n gap = 'medium',\n height,\n fullWidth,\n className,\n emptyBlockParentClass,\n emptyPlaceholderText: emptyTextProp,\n isEditing,\n parent$,\n $\n } = props;\n\n const effectiveGridLayout: ColumnControlGridLayout = layout ?? '2x1';\n\n const gapPx = getGapPx(gap);\n const { columns } = getGridDimensions(effectiveGridLayout);\n const maxChildren = getMaxChildrenForLayout(effectiveGridLayout);\n const visibleSlides = slides.slice(0, maxChildren);\n const slidesCount = visibleSlides.length;\n\n const emptyPlaceholderText = emptyTextProp ?? 'Add items to the column control';\n const effectiveFullWidth = fullWidth ?? true;\n const containerClassName = ['column-control-container', className].filter(Boolean).join(' ');\n const containerHeight = height ?? 'auto';\n\n const flexBasis = columns === 1 ? '100%' : `calc((100% - ${(columns - 1) * gapPx}px) / ${columns})`;\n\n const renderSlot = (slotIndex: number) => {\n const hasSlide = slotIndex < slidesCount;\n if (!isEditing && !hasSlide) return null;\n const id = `slide-${slotIndex}`;\n\n return (\n <Styled.SlideSection\n key={id}\n aria-roledescription=\"slide\"\n aria-label={`Slide ${slotIndex + 1} of ${maxChildren}`}\n useFlexLayout\n stackedVerticalGap={0}\n stackedItemHeight=\"auto\"\n stackedItemMaxHeight={MAX_SLIDE_HEIGHT_PX}\n flexBasis={flexBasis}\n gap={gapPx}\n columns={columns}\n {...($?.[`slides__${slotIndex}`] ?? {})}\n >\n <Styled.SlideInner\n stackedItemHeight=\"auto\"\n stackedItemMaxHeight={MAX_SLIDE_HEIGHT_PX}\n >\n <Styled.SlideContentInner>\n {hasSlide ? (\n renderSlide(visibleSlides[slotIndex], slotIndex)\n ) : (\n <EmptyPlaceholder\n emptyBlockParentClass={emptyBlockParentClass}\n text={emptyPlaceholderText}\n />\n )}\n </Styled.SlideContentInner>\n </Styled.SlideInner>\n </Styled.SlideSection>\n );\n };\n\n return (\n <Styled.ColumnControlContainer\n gap={gapPx}\n height={containerHeight}\n columnHeight=\"auto\"\n maxColumnHeight={MAX_SLIDE_HEIGHT_PX}\n className={containerClassName}\n aria-label=\"Column Control\"\n fullWidth={effectiveFullWidth}\n {...(parent$ ?? {})}\n >\n <Styled.InnerWrapper>\n <div>\n <Styled.TabletGridContainer\n className=\"column-control-container\"\n gap={gapPx}\n {...($?.['slides'] as Record<string, unknown> | undefined)}\n {...($?.['slides__parent'] as Record<string, unknown> | undefined)}\n data-add-direction=\"horizontal\"\n >\n {Array.from({ length: maxChildren }).map((_, index) => renderSlot(index))}\n </Styled.TabletGridContainer>\n </div>\n </Styled.InnerWrapper>\n </Styled.ColumnControlContainer>\n );\n}\n\nexport default ColumnControl as React.FC<ColumnControlProps>;\n","import styled from '@emotion/styled';\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\n/* ===================== CARD ===================== */\nexport const Card = styled.article<{\n align?: 'left' | 'center' | 'right';\n borderRadius?: string;\n backgroundColor?: string;\n textColor?: string;\n $maxHeight?: number;\n}>`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n max-height: ${({ $maxHeight }) => ($maxHeight ? `${$maxHeight}px` : 'none')};\n flex: 1 1 0%;\n overflow: hidden;\n text-align: ${({ align }) => align ?? 'left'};\n border-radius: ${({ borderRadius }) => borderRadius ?? '12px'};\n background-color: ${({ backgroundColor }) => backgroundColor ?? 'inherit'};\n color: ${({ textColor }) => textColor ?? 'inherit'};\n text-decoration: none;\n\n &[data-cta-style='card'] {\n text-decoration: none;\n color: inherit;\n }\n`;\n\n/* ===================== MEDIA ===================== */\nexport const MediaWrapper = styled('div', { shouldForwardProp: noForward$ })<{\n $inlineMedia?: boolean;\n $mediaHeight?: number;\n $mediaMaxHeight?: number;\n}>`\n position: relative;\n width: 100%;\n flex-shrink: 0;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n height: ${({ $mediaHeight }) => ($mediaHeight != null && $mediaHeight > 0 ? `${$mediaHeight}px` : 'auto')};\n max-height: ${({ $mediaMaxHeight }) =>\n $mediaMaxHeight != null && $mediaMaxHeight > 0 ? `${$mediaMaxHeight}px` : 'none'};\n ${({ $mediaHeight }) =>\n $mediaHeight != null &&\n $mediaHeight > 0 &&\n `\n & > * {\n height: 100%;\n min-height: 0;\n } \n `}\n\n ${({ $inlineMedia }) =>\n $inlineMedia &&\n `\n & img,\n & video {\n width: auto;\n height: 100% ;\n display: inline-block;\n max-width: 100%;\n }\n `}\n`;\n\n/* ===================== CONTENT ===================== */\nexport const Content = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n min-width: 0;\n padding: 16px 0;\n gap: 8px;\n justify-content: flex-start;\n align-items: stretch;\n`;\n\nexport const RichTextWrapper = styled.div`\n padding: 0;\n width: 100%;\n & > div {\n padding: 0;\n width: 100%;\n }\n && > div > div > div {\n padding: 0;\n }\n ul,\n ol {\n list-style-position: inside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 0;\n }\n ol {\n list-style-type: decimal;\n }\n li {\n margin: 0.25em 0;\n }\n`;\n\n/* ===================== CTA WRAPPER ===================== */\nexport const CtaWrapper = styled.div<{\n $isCardCta?: boolean;\n}>`\n margin-top: 16px;\n ${({ $isCardCta }) =>\n $isCardCta &&\n `\n div > a.MuiButton-root{\n justify-content: inherit;\n }\n `}\n`;\n\n/* ===================== CONTENT INNER ===================== */\nexport const ContentInner = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n gap: 8px;\n`;\n","import sanitizeHtml from 'sanitize-html';\nimport type { ButtonBlockProp, ButtonProps, ButtonsEntry } from '../../button/types';\nimport type { ContentAlignment, CtaStyle, ContentCardProps } from '../types';\nimport { MAX_MEDIA_HEIGHT_PX, PLACEHOLDER_BODY } from '../constants';\nimport { extractBynderMedia } from '../../bynder-media';\nimport { resolveTarget } from '../../button/helpers';\n\nexport function getEffectiveCta(cta: ButtonBlockProp | undefined): ButtonProps | null {\n if (!cta) return null;\n if ('buttons' in cta) {\n const block = cta;\n const entry: ButtonsEntry | undefined = block.buttons?.[0];\n return entry?.button ?? null;\n }\n return cta;\n}\n\nexport function normalizeContentAlignment(alignment?: string | null): ContentAlignment {\n if (alignment === 'centre' || alignment === 'center') return 'center';\n if (alignment === 'right') return 'right';\n return 'left';\n}\n\nexport function normalizeCtaStyle(value?: string | null): CtaStyle {\n const raw = typeof value === 'string' ? value.toLowerCase().trim() : '';\n if (raw === 'card' || raw === 'button' || raw === 'none') {\n return raw as CtaStyle;\n }\n if (raw.includes('card')) {\n return 'card';\n }\n if (raw.includes('button')) {\n return 'button';\n }\n if (raw.includes('none') || raw.includes('no cta')) {\n return 'none';\n }\n return 'none';\n}\n\nexport function getCtaState(cta: ButtonBlockProp | undefined, ctaStyleNormalized: CtaStyle) {\n const effectiveCta = getEffectiveCta(cta);\n\n const hasCtaHref = Boolean(effectiveCta?.url);\n const hasCtaLabel = Boolean(effectiveCta?.title);\n\n const isCardLink = ctaStyleNormalized === 'card' && hasCtaHref;\n\n const showButton =\n (ctaStyleNormalized === 'button' && hasCtaLabel) ||\n (ctaStyleNormalized === 'card' && hasCtaHref && hasCtaLabel);\n\n const cardTarget = resolveTarget(effectiveCta?.open_in_new_tab);\n\n return {\n ctaStyleNormalized,\n effectiveCta,\n isCardLink,\n showButton,\n cardTarget\n };\n}\n\nexport function getMediaLayout(media: ContentCardProps['media']) {\n const mediaInfo = media ? extractBynderMedia(media) : null;\n const isInlineMedia = Boolean(mediaInfo?.type === 'image' && (mediaInfo?.imageFit ?? 'cover') === 'none');\n\n const useFixedMediaHeight = media && !isInlineMedia && (mediaInfo?.type === 'image' || mediaInfo?.type === 'video');\n const mediaHeightValue = useFixedMediaHeight ? MAX_MEDIA_HEIGHT_PX : undefined;\n const mediaMaxHeightValue = media && !isInlineMedia && !mediaHeightValue ? MAX_MEDIA_HEIGHT_PX : undefined;\n\n return {\n mediaInfo,\n isInlineMedia,\n mediaHeightValue,\n mediaMaxHeightValue\n };\n}\n\nfunction contentCardBodyVisiblePlainText(html: string): string {\n const plainText = sanitizeHtml(html, {\n allowedTags: [],\n allowedAttributes: {}\n });\n\n return plainText\n .replace(/&nbsp;/gi, ' ')\n .replace(/\\u00a0/g, ' ')\n .trim();\n}\n\nexport function getContentCardBodyHtml(\n body: string | null | undefined,\n placeholderBody: string = PLACEHOLDER_BODY,\n isEditing: boolean = false\n): string {\n const raw = typeof body === 'string' ? body : '';\n const plain = contentCardBodyVisiblePlainText(raw);\n const emptyOrPlaceholderOnly =\n plain.length === 0 || plain.localeCompare(placeholderBody, undefined, { sensitivity: 'base' }) === 0;\n\n if (emptyOrPlaceholderOnly) {\n return isEditing ? `<p>${placeholderBody}</p>` : '';\n }\n return raw;\n}\n\nexport function getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean\n): string | undefined {\n const trimmed = (text ?? '').trim();\n if (isEditing) {\n if (trimmed === placeholderValue) {\n return placeholderValue;\n }\n return trimmed;\n }\n if (!trimmed || trimmed === placeholderValue) {\n return undefined;\n }\n return trimmed;\n}\n","export const DEFAULT_MAX_HEIGHT = 750;\n/** Max height for media (img/video); taller assets are capped, shorter stay at natural size. */\nexport const MAX_MEDIA_HEIGHT_PX = 400;\nexport const PLACEHOLDER_TITLE = 'Enter Title';\nexport const PLACEHOLDER_SUBTITLE = 'Enter Subtitle';\nexport const PLACEHOLDER_BODY = 'Enter Body';\n","import { ReactElement, useMemo } from 'react';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { TableRichTextWrapper, TableRichTextInner } from './TableRichText.styled';\nimport { getJustifyContent, getAlignItems, localizeAndValidateLinks, sanitizeHtml } from '../utils/richTextUtils';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface TableRichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n readonly text_editor: string;\n readonly font_color?: 'Light' | 'Dark';\n readonly container_alignment?: 'left' | 'center' | 'right';\n readonly container_vertical_alignment?: 'top' | 'center' | 'bottom';\n readonly container_width?: 100 | 75 | 50 | 25;\n readonly container_background_color?: string;\n}\n\nconst ALLOWED_TAGS = [\n 'p',\n 'div',\n 'span',\n 'a',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'blockquote',\n 'table',\n 'colgroup',\n 'col',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'th',\n 'td',\n 'caption'\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'title',\n 'class',\n 'style',\n 'data-testid',\n 'colspan',\n 'rowspan',\n 'scope',\n 'align',\n 'valign',\n 'data-width'\n];\n\nconst FORBID_ATTR = ['data-cslp', 'data-cs-id', 'data-cs-type'];\n\nconst wrapTablesForScroll = (html: string): string => {\n if (!html) return html;\n return html.replace(\n /<table\\b([^>]*)>([\\s\\S]*?)<\\/table>/gi,\n '<div class=\"rt-table-responsive\"><table$1>$2</table></div>'\n );\n};\n\n/**\n * RichText Component\n *\n * Wrapper component that sanitizes Rich Text Editor content before passing to CsText.\n * Uses DOMPurify to remove dangerous markup (scripts, styles, event handlers, etc.)\n * while preserving allowed formatting tags and attributes.\n *\n * SECURITY FEATURES:\n * - Removes script tags and event handlers\n * - Strips dangerous attributes and tags\n * - Allows only specified tags: p, div, span, a, br, strong, em, i, u, h1, h2, h3, ul, ol, li\n * - Allows only specified attributes: href, target, rel, title, class, style, data-cslp\n * - Sanitization is applied before rendering in CsText\n *\n * @param props - CsText component props with sanitizable text_editor content\n * @returns Rendered component with sanitized content\n */\nconst TableRichText = ({\n text_editor,\n font_color,\n container_alignment = 'left',\n container_vertical_alignment = 'top',\n container_width = 100,\n container_background_color,\n ...restProps\n}: TableRichTextProps): ReactElement | null => {\n // 1) Rewrite/validate link hrefs first (based on author input)\n // 2) Then sanitize the final HTML (security)\n const rewrittenHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) return '';\n return localizeAndValidateLinks(text_editor);\n }, [text_editor]);\n\n const sanitizedHtml = useMemo(() => {\n if (!rewrittenHtml) return '';\n return wrapTablesForScroll(\n sanitizeHtml(rewrittenHtml, {\n allowedTags: ALLOWED_TAGS,\n allowedAttrs: ALLOWED_ATTR,\n forbidAttrs: FORBID_ATTR\n })\n );\n }, [rewrittenHtml]);\n\n // Convert string font_color value to boolean (light = true, dark = false)\n const fontColorBoolean = font_color === 'Light';\n\n // Don't render if no content\n if (!sanitizedHtml) {\n return null;\n }\n\n const justifyContent = getJustifyContent(container_alignment);\n const alignItems = getAlignItems(container_vertical_alignment);\n\n // Pass sanitized HTML to CsText component with all other props\n return (\n <TableRichTextWrapper\n alignItems={alignItems}\n style={{\n justifyContent,\n backgroundColor: resolveBackgroundColor(container_background_color)\n }}\n >\n <TableRichTextInner width={container_width}>\n <CsText\n {...restProps}\n container_background_color={container_background_color}\n text_editor={sanitizedHtml}\n font_color={fontColorBoolean}\n />\n </TableRichTextInner>\n </TableRichTextWrapper>\n );\n};\n\nexport default TableRichText;\n","import styled from '@emotion/styled';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\n\nexport const TableRichTextWrapper = styled.div<{ alignItems: string }>`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({ alignItems }) => alignItems};\n`;\n\nexport const TableRichTextInner = styled.div<{ width: number }>`\n width: 100%;\n\n a {\n color: #008ab0;\n text-decoration: none;\n }\n\n .rt-table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n max-width: 100%;\n margin: 1em 0;\n }\n\n .rt-table-responsive > table {\n margin: 0;\n }\n\n @media (max-width: ${DEVICE_SIZES.MEDIUM - 1}px) {\n .rt-table-responsive > table {\n min-width: 480px;\n }\n }\n\n table {\n display: table;\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n margin: 1em 0;\n word-break: break-word;\n }\n\n thead {\n display: table-header-group;\n }\n\n tbody {\n display: table-row-group;\n }\n\n tfoot {\n display: table-footer-group;\n }\n\n tr {\n display: table-row;\n }\n\n colgroup {\n display: table-column-group;\n }\n\n col {\n display: table-column;\n }\n\n th,\n td {\n display: table-cell;\n border: 1px solid #ddd;\n padding: 8px 12px;\n vertical-align: top;\n }\n\n thead th {\n background-color: #f5f5f5;\n font-weight: 600;\n text-align: left;\n }\n\n tbody tr:nth-of-type(even) {\n background-color: #fafafa;\n }\n\n table p {\n margin: 0;\n }\n\n @media (min-width: ${DEVICE_SIZES.MEDIUM}px) {\n width: ${({ width }) => width}%;\n }\n`;\n","import DOMPurify from 'dompurify';\nimport { convertToLocalizedUrl } from './common';\n\n/**\n * Returns the CSS `justify-content` value for a horizontal alignment.\n */\nexport const getJustifyContent = (alignment: 'left' | 'center' | 'right'): string => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n\n/**\n * Returns the CSS `align-items` value for a vertical alignment.\n */\nexport const getAlignItems = (alignment: 'top' | 'center' | 'bottom'): string => {\n if (alignment === 'center') return 'center';\n if (alignment === 'bottom') return 'flex-end';\n return 'flex-start';\n};\n\n/**\n * For CMS RichText HTML:\n * - for safe internal/relative links, localize hrefs using convertToLocalizedUrl\n * - placeholders (`{%region}`, `{%language}`) are handled inside convertToLocalizedUrl\n */\nexport const localizeAndValidateLinks = (inputHtml: string): string => {\n if (typeof window === 'undefined' || !inputHtml) return inputHtml;\n const parser = new DOMParser();\n const doc = parser.parseFromString(inputHtml, 'text/html');\n\n doc.querySelectorAll('a[href]').forEach((link) => {\n const href = link.getAttribute('href');\n if (!href) return;\n\n const trimmed = href.trim();\n if (!trimmed) {\n link.removeAttribute('href');\n return;\n }\n\n // Non-web links should not be localized.\n if (/^(mailto|tel)\\s*:/i.test(trimmed) || trimmed.startsWith('#')) {\n return;\n }\n\n try {\n const localized = convertToLocalizedUrl(trimmed);\n if (!localized) {\n link.removeAttribute('href');\n return;\n }\n\n link.setAttribute('href', localized);\n } catch {\n link.removeAttribute('href');\n }\n });\n\n return doc.body.innerHTML;\n};\n\nexport type SanitizeHtmlOptions = {\n allowedTags: string[];\n allowedAttrs: string[];\n forbidAttrs?: string[];\n};\n\n/**\n * Sanitize HTML using DOMPurify.\n * Removes dangerous content while preserving the allowed tags and attributes\n * defined by the caller.\n *\n * @param html - Raw HTML content from the CMS editor\n * @param options - Allowlist/denylist configuration\n * @returns Sanitized HTML safe for rendering\n */\nexport const sanitizeHtml = (html: string, options: SanitizeHtmlOptions): string => {\n if (!html || typeof html !== 'string') {\n return '';\n }\n\n // DOMPurify requires a browser DOM environment; skip sanitization during SSR\n if (typeof window === 'undefined') {\n return html;\n }\n\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: options.allowedTags,\n ALLOWED_ATTR: options.allowedAttrs,\n ...(options.forbidAttrs ? { FORBID_ATTR: options.forbidAttrs } : {}),\n KEEP_CONTENT: true,\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false,\n FORCE_BODY: false,\n SANITIZE_DOM: true,\n IN_PLACE: false\n });\n};\n","import React from 'react';\nimport { Buttons as Button, ButtonBlockProp, ButtonsBlock } from '../button';\nimport { ContentCardProps } from './types';\nimport { Card, MediaWrapper, Content, CtaWrapper, ContentInner, RichTextWrapper } from './ContentCard.styled';\nimport { Typography } from '../typography';\nimport {\n normalizeContentAlignment,\n getCtaState,\n getMediaLayout,\n normalizeCtaStyle,\n getDisplayText,\n getContentCardBodyHtml\n} from './utils/helpers';\nimport { DEFAULT_MAX_HEIGHT, PLACEHOLDER_TITLE, PLACEHOLDER_SUBTITLE, PLACEHOLDER_BODY } from './constants';\nimport { BynderMedia } from '../bynder-media';\nimport { TableRichText } from '../table-rich-text';\n\nfunction CardTextBlock({\n title,\n subtitle,\n body,\n isEditing,\n editTags,\n alignment\n}: Readonly<{\n title: string | undefined;\n subtitle: string;\n body: ContentCardProps['body'];\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n alignment: 'left' | 'center' | 'right';\n}>) {\n const bodyHtml = typeof body === 'string' ? body : '';\n const displayTitle = getDisplayText(title, PLACEHOLDER_TITLE, isEditing);\n const displaySubtitle = getDisplayText(subtitle, PLACEHOLDER_SUBTITLE, isEditing);\n const richTextHtml = getContentCardBodyHtml(bodyHtml, PLACEHOLDER_BODY, isEditing);\n\n return (\n <ContentInner data-testid=\"card-content-inner\">\n {displayTitle ? (\n <Typography\n variant=\"h3\"\n inputText={displayTitle}\n color=\"inherit\"\n {...(editTags?.title ?? {})}\n />\n ) : null}\n {displaySubtitle ? (\n <Typography\n variant=\"body\"\n inputText={displaySubtitle}\n color=\"inherit\"\n {...(editTags?.subtitle ?? {})}\n />\n ) : null}\n {richTextHtml ? (\n <RichTextWrapper>\n <TableRichText\n text_editor={richTextHtml}\n container_alignment={alignment}\n container_background_color=\"transparent\"\n $={{ text_editor: editTags?.body ?? {} }}\n />\n </RichTextWrapper>\n ) : null}\n </ContentInner>\n );\n}\n\nfunction CardCtaBlock({\n show,\n cta,\n alignment,\n isEditing,\n editTags,\n isCardCta\n}: Readonly<{\n show: boolean;\n cta: ButtonBlockProp | undefined;\n alignment: 'left' | 'center' | 'right';\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n isCardCta: boolean;\n}>) {\n if (!show || !cta) return null;\n const nestedButtonParent = (cta as ButtonsBlock).buttons?.[0]?.$?.button;\n const buttonParent$: Record<string, unknown> = {\n ...(typeof nestedButtonParent === 'object' && nestedButtonParent !== null ? nestedButtonParent : {}),\n ...(editTags?.button ?? {})\n };\n return (\n <CtaWrapper\n data-testid=\"card-cta-wrapper\"\n $isCardCta={isCardCta}\n >\n <Button\n {...cta}\n parent$={buttonParent$}\n alignment={alignment}\n isEditing={isEditing}\n />\n </CtaWrapper>\n );\n}\n\nconst ContentCard: React.FC<ContentCardProps> = (props) => {\n const {\n title,\n subtitle = '',\n body = '',\n media,\n cta_style = 'none',\n cta,\n card_cta_group,\n button_cta_group,\n content_alignment = 'left',\n background_color = '#ffffff',\n text_color = '#000000',\n border_radius = '0px',\n max_height = DEFAULT_MAX_HEIGHT,\n parent$ = {},\n isEditing = false,\n $ = {}\n } = props;\n\n const normalizedStyle = normalizeCtaStyle(cta_style);\n let activeCta: ButtonBlockProp | undefined;\n\n if (normalizedStyle === 'card') {\n activeCta = card_cta_group ?? cta;\n } else if (normalizedStyle === 'button') {\n activeCta = button_cta_group ?? cta;\n }\n const alignment = normalizeContentAlignment(content_alignment);\n const { ctaStyleNormalized, effectiveCta, isCardLink, showButton, cardTarget } = getCtaState(\n activeCta,\n normalizedStyle\n );\n\n const { mediaInfo, isInlineMedia, mediaHeightValue, mediaMaxHeightValue } = getMediaLayout(media);\n\n const cardAs = isCardLink ? 'a' : 'article';\n const cardLinkProps = isCardLink ? { href: effectiveCta?.url ?? '', target: cardTarget } : {};\n\n return (\n <Card\n align={alignment}\n borderRadius={border_radius}\n backgroundColor={background_color}\n textColor={text_color}\n $maxHeight={max_height}\n as={cardAs}\n {...cardLinkProps}\n data-cta-style={ctaStyleNormalized}\n {...parent$}\n >\n <MediaWrapper\n data-testid={`card-media-${mediaInfo?.type}`}\n $inlineMedia={isInlineMedia}\n $mediaHeight={mediaHeightValue}\n $mediaMaxHeight={mediaMaxHeightValue}\n >\n {media ? (\n <BynderMedia\n bynder_media={media}\n $={$?.media}\n />\n ) : null}\n </MediaWrapper>\n\n <Content data-testid=\"card-content\">\n <CardTextBlock\n title={title}\n subtitle={subtitle}\n body={body}\n isEditing={isEditing}\n editTags={$}\n alignment={alignment}\n />\n <CardCtaBlock\n show={showButton}\n cta={activeCta}\n alignment={alignment}\n isEditing={isEditing}\n editTags={$}\n isCardCta={ctaStyleNormalized === 'card'}\n />\n </Content>\n </Card>\n );\n};\n\nexport default ContentCard;\n","// Placeholder text constants\nexport const PLACEHOLDER_BRAND_CAPTION = 'Enter Brand Caption';\nexport const PLACEHOLDER_TITLE = 'Enter Title';\nexport const PLACEHOLDER_SUBTITLE = 'Enter Subtitle';\nexport const PLACEHOLDER_BODY = 'Enter Body';\n\n// Aria labels\nexport const ARIA_LABEL_HERO_BANNER = 'Hero banner';\n","import React from 'react';\nimport { Typography } from '../../typography';\nimport { PLACEHOLDER_BRAND_CAPTION, PLACEHOLDER_TITLE, PLACEHOLDER_SUBTITLE, PLACEHOLDER_BODY } from '../constants';\nimport type { TypographyVariant } from '../../typography';\nimport type { TextColor } from '../helpers';\n\ninterface TypographyFieldConfig {\n value?: string;\n placeholder: string;\n variant: TypographyVariant;\n className: string;\n editTagKey: 'brandcaption' | 'title' | 'subtitle' | 'body';\n}\n\ninterface TypographyFieldsProps {\n readonly brandcaption?: string;\n readonly title?: string;\n readonly subtitle?: string;\n readonly body?: string;\n readonly isEditing: boolean;\n readonly editTags?: Record<string, unknown>;\n readonly textColor?: TextColor;\n}\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean,\n showPlaceholder?: boolean\n): string | undefined {\n const normalizedText = text?.trim();\n if (isEditing === true) {\n if (!normalizedText) {\n return showPlaceholder ? placeholderValue : undefined;\n }\n return text;\n }\n if (isEditing === false && text === placeholderValue) {\n return undefined;\n }\n return text;\n}\n\nconst getTypographyFields = (\n brandcaption?: string,\n title?: string,\n subtitle?: string,\n body?: string\n): TypographyFieldConfig[] => [\n {\n value: brandcaption,\n placeholder: PLACEHOLDER_BRAND_CAPTION,\n variant: 'disclaimer',\n className: 'brand-caption',\n editTagKey: 'brandcaption'\n },\n {\n value: title,\n placeholder: PLACEHOLDER_TITLE,\n variant: 'h1',\n className: 'hero-title',\n editTagKey: 'title'\n },\n {\n value: subtitle,\n placeholder: PLACEHOLDER_SUBTITLE,\n variant: 'h3',\n className: 'subtitle',\n editTagKey: 'subtitle'\n },\n {\n value: body,\n placeholder: PLACEHOLDER_BODY,\n variant: 'body',\n className: 'body',\n editTagKey: 'body'\n }\n];\n\nexport const TypographyFields: React.FC<TypographyFieldsProps> = ({\n brandcaption,\n title,\n subtitle,\n body,\n isEditing,\n editTags = {},\n textColor\n}) => {\n const fields = getTypographyFields(brandcaption, title, subtitle, body);\n\n return (\n <>\n {fields.map((field) => {\n const editAttributes = (editTags?.[field.editTagKey] ?? {}) as Record<string, unknown>;\n\n const displayValue = getDisplayText(\n field.value,\n field.placeholder,\n isEditing,\n field.editTagKey === 'title'\n );\n\n const color = textColor === 'white' ? '#FFFFFF' : '#1D1D1B';\n\n if (!displayValue) return null;\n\n return (\n <Typography\n key={field.editTagKey}\n variant={field.variant}\n inputText={displayValue}\n className={field.className}\n color={color}\n {...editAttributes}\n />\n );\n })}\n </>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nimport { GradientDepth, MOBILE_BREAKPOINT } from './helpers';\n\n// Media Layer\n\nexport const MediaLayer = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n// Container\n\nexport const Container = styled('section')<{ hasMedia: boolean }>`\n width: 100%;\n position: relative;\n min-height: ${({ hasMedia }) => (hasMedia ? '500px' : 'auto')};\n overflow: hidden;\n\n .hero-title,\n .subtitle,\n .brand-caption,\n .body {\n margin-bottom: 4px;\n }\n\n @media ${MOBILE_BREAKPOINT} {\n min-height: ${({ hasMedia }) => (hasMedia ? '400px' : 'auto')};\n }\n`;\n\n// Gradient Overlay\n\nconst GRADIENT_OPACITIES = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n} as const;\n\nconst getGradientBackground = (direction: string, depth: GradientDepth, color: 'black' | 'white'): string => {\n const { start, end } = GRADIENT_OPACITIES[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n\n if (direction === 'leftToRight') {\n return `background: linear-gradient(to right, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n\n if (direction === 'rightToLeft') {\n return `background: linear-gradient(to left, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n\n return `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n};\n\nexport const GradientOverlay = styled.div<{\n direction: string;\n depth: GradientDepth;\n color: 'black' | 'white';\n}>`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({ direction, depth, color }) => getGradientBackground(direction, depth, color)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({ depth, color }) => {\n const { start, end } = GRADIENT_OPACITIES[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n return `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }}\n }\n`;\n\n// Overlay\n\nexport const Overlay = styled.div<{ justifyContent?: string; hasMedia: boolean }>`\n position: ${({ hasMedia }) => (hasMedia ? 'absolute' : 'static')};\n inset: ${({ hasMedia }) => (hasMedia ? '0' : 'auto')};\n z-index: 2;\n display: flex;\n align-items: center;\n padding: 3rem;\n pointer-events: none;\n justify-content: ${({ justifyContent }) => justifyContent ?? 'flex-start'};\n\n // Force center alignment on mobile\n @media ${MOBILE_BREAKPOINT} {\n position: static;\n inset: auto;\n min-height: ${({ hasMedia }) => (hasMedia ? '400px' : 'auto')};\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n`;\n\n// Content\n\nexport const Content = styled.div<{ textAlign?: string }>`\n max-width: 600px;\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n text-align: ${({ textAlign }) => textAlign ?? 'left'};\n\n // Force center alignment on mobile\n @media ${MOBILE_BREAKPOINT} {\n max-width: 100%;\n text-align: center;\n }\n`;\n\n// Button to be Centered on Mobile\nexport const HERO_CTA_WRAPPER_CLASS = 'hero-banner-button-wrapper';\n\nexport const ButtonWrapper = styled.div`\n @media ${MOBILE_BREAKPOINT} {\n &.${HERO_CTA_WRAPPER_CLASS} > div {\n justify-content: center;\n }\n }\n`;\n\n// Helpers\n\nexport const getJustifyContent = (alignment: 'left' | 'center' | 'right') => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n","export type GradientDepth = 'sm' | 'md' | 'lg';\nexport type ContentAlignment = 'left' | 'center' | 'right';\nexport type TextColor = 'black' | 'white';\n\n// Constants\nexport const FULL_SIZE_PERCENT = '100%';\nexport const MOBILE_BREAKPOINT = '(max-width: 768px)';\nexport const DESKTOP_BREAKPOINT = '(min-width: 769px)';\n\nexport function resolveContentAlignment(contentAlignment?: ContentAlignment): ContentAlignment {\n return contentAlignment ?? 'left';\n}\n\nexport function resolveGradientDepth(gradientDepth?: GradientDepth): GradientDepth {\n return gradientDepth ?? 'md';\n}\n\nexport function resolveTextColor(textColor?: string): TextColor {\n return (textColor === 'white' ? 'white' : 'black') as TextColor;\n}\n\nexport function getGradientColor(textColor: TextColor): 'white' | 'black' {\n return textColor === 'black' ? 'white' : 'black';\n}\n\nexport type GradientDirection = 'leftToRight' | 'radial' | 'rightToLeft';\n\nconst gradientDirectionMap: Record<ContentAlignment, GradientDirection> = {\n left: 'leftToRight',\n center: 'radial',\n right: 'rightToLeft'\n} as const;\n\nexport function getGradientDirection(contentAlignment: ContentAlignment): GradientDirection {\n return gradientDirectionMap[contentAlignment];\n}\n","import React from 'react';\nimport { Buttons as Button, ButtonsBlock } from '../button';\nimport { TypographyFields } from './components/TypographyFields';\nimport { HeroBannerProps } from './types';\nimport {\n Container,\n MediaLayer,\n GradientOverlay,\n Overlay,\n Content,\n getJustifyContent,\n ButtonWrapper,\n HERO_CTA_WRAPPER_CLASS\n} from './HeroBanner.styled';\nimport {\n resolveContentAlignment,\n resolveGradientDepth,\n resolveTextColor,\n getGradientColor,\n getGradientDirection\n} from './helpers';\nimport { ARIA_LABEL_HERO_BANNER } from './constants';\nimport { BynderMedia, extractBynderMedia } from '../bynder-media';\n\nconst HeroBanner: React.FC<HeroBannerProps> = (props) => {\n const {\n title,\n subtitle,\n body,\n brandcaption,\n button,\n media,\n class_name: className,\n content_alignment: contentAlignment,\n gradient_enabled: gradientEnabled = false,\n gradient_depth: gradientDepth,\n text_color: textColor,\n $ = {},\n parent$ = {},\n isEditing = false\n } = props;\n const resolvedContentAlignment = resolveContentAlignment(contentAlignment);\n const resolvedGradientDepth = resolveGradientDepth(gradientDepth);\n const resolvedTextColor = resolveTextColor(textColor);\n\n const justifyContent = getJustifyContent(resolvedContentAlignment);\n const gradientColor = getGradientColor(resolvedTextColor);\n const gradientDirection = getGradientDirection(resolvedContentAlignment);\n const mediaInfo = extractBynderMedia(media);\n const hasMedia = !!mediaInfo?.url;\n\n return (\n <Container\n hasMedia={hasMedia}\n className={className}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {hasMedia && (\n <MediaLayer>\n <BynderMedia\n bynder_media={media}\n $={$?.media}\n />\n </MediaLayer>\n )}\n\n {gradientEnabled && (\n <GradientOverlay\n direction={gradientDirection}\n depth={resolvedGradientDepth}\n color={gradientColor}\n aria-hidden=\"true\"\n />\n )}\n\n <Overlay\n justifyContent={justifyContent}\n hasMedia={hasMedia}\n >\n <Content textAlign={resolvedContentAlignment}>\n <TypographyFields\n brandcaption={brandcaption}\n title={title}\n subtitle={subtitle}\n body={body}\n isEditing={isEditing}\n editTags={$}\n textColor={resolvedTextColor}\n />\n\n {button && (\n <ButtonWrapper className={HERO_CTA_WRAPPER_CLASS}>\n <Button\n {...button}\n parent$={(button as ButtonsBlock).$?.buttons__0 ?? $?.button ?? {}}\n alignment={resolvedContentAlignment}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n","import { ReactElement, useMemo } from 'react';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { RichTextWrapper, RichTextInner } from './RichText.styled';\nimport { getJustifyContent, getAlignItems, localizeAndValidateLinks, sanitizeHtml } from '../utils/richTextUtils';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface RichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n readonly text_editor: string;\n readonly font_color?: 'Light' | 'Dark';\n readonly container_alignment?: 'left' | 'center' | 'right';\n readonly container_vertical_alignment?: 'top' | 'center' | 'bottom';\n readonly container_width?: 100 | 75 | 50 | 25;\n readonly container_background_color?: string;\n}\n\nconst ALLOWED_TAGS = [\n 'p',\n 'div',\n 'span',\n 'a',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'blockquote'\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'title',\n 'class',\n 'style',\n 'data-testid',\n 'data-cs-id',\n 'data-cs-type',\n 'data-cslp'\n];\n\n/**\n * RichText Component\n *\n * Wrapper component that sanitizes Rich Text Editor content before passing to CsText.\n * Uses DOMPurify to remove dangerous markup (scripts, styles, event handlers, etc.)\n * while preserving allowed formatting tags and attributes.\n *\n * SECURITY FEATURES:\n * - Removes script tags and event handlers\n * - Strips dangerous attributes and tags\n * - Allows only specified tags: p, div, span, a, br, strong, em, i, u, h1, h2, h3, ul, ol, li\n * - Allows only specified attributes: href, target, rel, title, class, style, data-cslp\n * - Sanitization is applied before rendering in CsText\n *\n * @param props - CsText component props with sanitizable text_editor content\n * @returns Rendered component with sanitized content\n */\nconst RichText = ({\n text_editor,\n font_color,\n container_alignment = 'left',\n container_vertical_alignment = 'top',\n container_width = 100,\n container_background_color,\n ...restProps\n}: RichTextProps): ReactElement | null => {\n // 1) Rewrite/validate link hrefs first (based on author input)\n // 2) Then sanitize the final HTML (security)\n const rewrittenHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) return '';\n return localizeAndValidateLinks(text_editor);\n }, [text_editor]);\n\n const sanitizedHtml = useMemo(() => {\n if (!rewrittenHtml) return '';\n return sanitizeHtml(rewrittenHtml, { allowedTags: ALLOWED_TAGS, allowedAttrs: ALLOWED_ATTR });\n }, [rewrittenHtml]);\n\n // Convert string font_color value to boolean (light = true, dark = false)\n const fontColorBoolean = font_color === 'Light';\n\n // Don't render if no content\n if (!sanitizedHtml) {\n return null;\n }\n\n const justifyContent = getJustifyContent(container_alignment);\n const alignItems = getAlignItems(container_vertical_alignment);\n\n // Pass sanitized HTML to CsText component with all other props\n return (\n <RichTextWrapper\n alignItems={alignItems}\n style={{\n justifyContent,\n backgroundColor: resolveBackgroundColor(container_background_color)\n }}\n >\n <RichTextInner width={container_width}>\n <CsText\n {...restProps}\n container_background_color={container_background_color}\n text_editor={sanitizedHtml}\n font_color={fontColorBoolean}\n />\n </RichTextInner>\n </RichTextWrapper>\n );\n};\n\nexport default RichText;\n","import styled from '@emotion/styled';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\n\nexport const RichTextWrapper = styled.div<{ alignItems: string }>`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({ alignItems }) => alignItems};\n`;\n\nexport const RichTextInner = styled.div<{ width: number }>`\n width: 100%;\n\n a {\n color: #008ab0;\n text-decoration: none;\n }\n\n @media (min-width: ${DEVICE_SIZES.MEDIUM}px) {\n width: ${({ width }) => width}%;\n }\n`;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { Typography } from '../typography';\nimport { useToggleFontColor } from '../hooks';\nimport FaqItem from './components/FaqItem';\nimport { FaqOuter, FaqSection, FaqContent, FaqTitleWrapper, FaqList, FaqEmptyPlaceholder } from './Faq.styled';\nimport type { FaqInternalProps, FaqProps } from './types';\nimport {\n getDisplayText,\n getFaqItemKey,\n getVisibleFaqItems,\n normalizeFaqSectionWidth,\n resolveContainerBackgroundColor\n} from './utils/helpers';\nimport { DEFAULT_FAQ_SECTION_WIDTH, DEFAULT_TEST_ID, EMPTY_ITEMS_PLACEHOLDER, PLACEHOLDER_TITLE } from './constants';\n\nconst FaqInternal: React.FC<FaqInternalProps> = ({\n faq_section_title,\n faq_items,\n faq_section_width = DEFAULT_FAQ_SECTION_WIDTH,\n allow_multiple_faqs_open = false,\n expand_all_faqs,\n font_color = 'Dark',\n container_background_color,\n isEditing = false,\n testId = DEFAULT_TEST_ID,\n ariaLabel,\n parent$ = {},\n $ = {},\n visibleItems,\n renderAnswer\n}) => {\n const headerRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const resolvedContainerBackground = resolveContainerBackgroundColor(container_background_color);\n const resolvedFontColor = useToggleFontColor(font_color === 'Light');\n const resolvedSectionWidth = normalizeFaqSectionWidth(faq_section_width);\n\n const displayTitle = getDisplayText(faq_section_title, PLACEHOLDER_TITLE, isEditing);\n const itemsForRender = visibleItems.length > 0 ? visibleItems : (faq_items ?? []);\n const shouldExpandAllFaqs = expand_all_faqs ?? false;\n const [openIndices, setOpenIndices] = useState<Set<number>>(() =>\n shouldExpandAllFaqs ? new Set(itemsForRender.map((_, index) => index)) : new Set()\n );\n\n useEffect(() => {\n setOpenIndices(shouldExpandAllFaqs ? new Set(itemsForRender.map((_, index) => index)) : new Set());\n }, [itemsForRender.length, shouldExpandAllFaqs]);\n\n const toggleItem = useCallback(\n (index: number) => {\n setOpenIndices((previous) => {\n if (previous.has(index)) {\n const next = new Set(previous);\n next.delete(index);\n return next;\n }\n if (allow_multiple_faqs_open) {\n const next = new Set(previous);\n next.add(index);\n return next;\n }\n return new Set([index]);\n });\n },\n [allow_multiple_faqs_open]\n );\n\n const focusHeader = useCallback(\n (index: number) => {\n const targetIndex = Math.max(0, Math.min(index, itemsForRender.length - 1));\n headerRefs.current[targetIndex]?.focus();\n },\n [itemsForRender.length]\n );\n\n const handleHeaderKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusHeader(index + 1);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n focusHeader(index - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n focusHeader(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n focusHeader(itemsForRender.length - 1);\n }\n },\n [focusHeader, itemsForRender.length]\n );\n\n const setHeaderRef = useCallback(\n (index: number) => (element: HTMLButtonElement | null) => {\n headerRefs.current[index] = element;\n },\n []\n );\n\n const listEditTags = useMemo(\n () => ({\n ...($?.faq_items__parent ?? {}),\n 'data-add-direction': 'vertical'\n }),\n [$]\n );\n\n const sectionLabel = ariaLabel ?? displayTitle ?? 'Frequently asked questions';\n\n return (\n <FaqOuter data-testid={`${testId}-outer`}>\n <FaqSection\n aria-label={sectionLabel}\n $containerBackgroundColor={resolvedContainerBackground}\n $fontColor={resolvedFontColor}\n data-testid={testId}\n {...parent$}\n {...($?.container_background_color ?? {})}\n >\n <FaqContent\n $sectionWidth={resolvedSectionWidth}\n data-testid={`${testId}-content`}\n data-section-width={resolvedSectionWidth}\n >\n {displayTitle ? (\n <FaqTitleWrapper data-testid={`${testId}-title-wrapper`}>\n <Typography\n variant=\"h2\"\n inputText={displayTitle}\n color={resolvedFontColor}\n dataTestId={`${testId}-title`}\n {...($?.title ?? {})}\n />\n </FaqTitleWrapper>\n ) : null}\n\n {itemsForRender.length === 0 && isEditing ? (\n <FaqEmptyPlaceholder\n data-testid={`${testId}-empty-placeholder`}\n {...listEditTags}\n >\n {EMPTY_ITEMS_PLACEHOLDER}\n </FaqEmptyPlaceholder>\n ) : (\n <FaqList\n data-testid={`${testId}-list`}\n {...listEditTags}\n >\n {itemsForRender.map((item, index) => (\n <FaqItem\n key={getFaqItemKey(item, index)}\n item={item}\n index={index}\n isOpen={openIndices.has(index)}\n isEditing={isEditing}\n onToggle={toggleItem}\n onHeaderKeyDown={handleHeaderKeyDown}\n headerRef={setHeaderRef(index)}\n testId={testId}\n itemEditTags={$?.[`faq_items__${index}`]}\n renderAnswer={renderAnswer}\n />\n ))}\n </FaqList>\n )}\n </FaqContent>\n </FaqSection>\n </FaqOuter>\n );\n};\n\nconst Faq: React.FC<FaqProps> = (props) => {\n const { faq_items, isEditing = false } = props;\n const visibleItems = getVisibleFaqItems(faq_items, isEditing);\n\n if (visibleItems.length === 0 && !isEditing) {\n console.warn('[Faq] No FAQ items provided');\n return null;\n }\n\n return (\n <FaqInternal\n {...props}\n visibleItems={visibleItems}\n />\n );\n};\n\nexport default Faq;\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const BREAKPOINTS = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px) and (max-width: 1440px)',\n ultra: '(min-width: 1441px)'\n} as const;\n\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\nexport const FaqOuter = styled('div')({\n width: '100%',\n display: 'flex',\n justifyContent: 'center'\n});\n\nexport const FaqSection = styled('section', { shouldForwardProp: noForward$ })<{\n $containerBackgroundColor: string;\n $fontColor: string;\n}>(({ $containerBackgroundColor, $fontColor }) => ({\n width: '100%',\n margin: '0 auto',\n padding: '24px 0',\n boxSizing: 'border-box',\n backgroundColor: $containerBackgroundColor,\n color: $fontColor,\n\n [`@media ${BREAKPOINTS.tablet}`]: {\n padding: '32px 24px'\n },\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n padding: '32px 32px'\n }\n}));\n\nexport const FaqContent = styled('div', { shouldForwardProp: noForward$ })<{\n $sectionWidth: 25 | 50 | 75 | 100;\n}>(({ $sectionWidth }) => ({\n width: '100%',\n margin: '0 auto',\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n width: `${$sectionWidth}%`\n },\n\n [`@media ${BREAKPOINTS.ultra}`]: {\n width: `${$sectionWidth}%`\n }\n}));\n\nexport const FaqTitleWrapper = styled('div')({\n marginBottom: '32px',\n textAlign: 'center',\n fontSize: '32px',\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n marginBottom: '24px',\n fontSize: '36px'\n }\n});\n\nexport const FaqList = styled('div')({\n display: 'flex',\n flexDirection: 'column',\n width: '100%'\n});\n\nexport const FaqItemContainer = styled('div')({\n width: '100%',\n\n '& h3': {\n margin: 0\n }\n});\n\nconst EASE_OUT = 'cubic-bezier(0.4, 0, 0.2, 1)';\nconst EASE_SPRING = 'cubic-bezier(0.34, 1.4, 0.64, 1)';\n\nexport const FaqQuestionButton = styled('button')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n gap: '16px',\n padding: '16px 0',\n margin: 0,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n textAlign: 'left',\n color: 'inherit',\n fontFamily: \"'Lora', serif\",\n fontSize: '18px',\n fontWeight: 600,\n lineHeight: '24px',\n '&:focus-visible': {\n outline: '2px solid currentColor',\n outlineOffset: '2px'\n },\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n padding: '12px 10px 12px 0',\n gap: '12px'\n }\n});\n\nexport const FaqQuestionText = styled('span')({\n flex: '1 1 auto',\n minWidth: 0,\n padding: '0 16px'\n});\n\nexport const FaqChevronIcon = styled('span')<{ isOpen: boolean }>(({ isOpen }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: '24px',\n height: '24px',\n color: 'inherit',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: `transform 0.35s ${EASE_SPRING}`\n}));\n\nexport const FaqAnswerPanel = styled('section')<{ isOpen: boolean }>(({ isOpen }) => ({\n display: 'grid',\n gridTemplateRows: isOpen ? '1fr' : '0fr',\n transition: `grid-template-rows 0.4s ${EASE_OUT}`,\n marginBottom: isOpen ? '12px' : '0',\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n marginBottom: isOpen ? '8px' : '0'\n }\n}));\n\nexport const FaqAnswerInner = styled('div')<{ isOpen: boolean }>(({ isOpen }) => ({\n overflow: 'hidden',\n minHeight: 0,\n visibility: isOpen ? 'visible' : 'hidden',\n transition: 'visibility 0s linear',\n transitionDelay: isOpen ? '0s' : '0.4s',\n\n '@media (prefers-reduced-motion: reduce)': {\n transition: 'none',\n transitionDelay: '0s'\n }\n}));\n\nexport const FaqAnswerContent = styled('div')<{ isOpen: boolean }>(({ isOpen }) => ({\n width: '100%',\n fontFamily: \"'Inter', sans-serif\",\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '20px',\n opacity: isOpen ? 1 : 0,\n transform: isOpen ? 'translateY(0)' : 'translateY(-10px)',\n transition: `opacity 0.35s ${EASE_OUT}, transform 0.35s ${EASE_OUT}`,\n transitionDelay: isOpen ? '0.1s' : '0s',\n paddingBottom: '4px',\n\n '@media (prefers-reduced-motion: reduce)': {\n transition: 'none',\n transitionDelay: '0s',\n transform: 'none'\n }\n}));\n\nexport const FaqEmptyPlaceholder = styled('div')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '120px',\n padding: '24px 16px',\n color: 'inherit',\n font: 'inherit',\n lineHeight: 'inherit',\n textAlign: 'center'\n});\n","import sanitizeHtml from 'sanitize-html';\nimport { getDisplayText } from '../../content-card/utils/helpers';\nimport type { FaqItemData, FaqSectionWidth } from '../types';\nimport {\n DEFAULT_FAQ_SECTION_WIDTH,\n FAQ_SECTION_WIDTH_OPTIONS,\n PLACEHOLDER_ANSWER,\n PLACEHOLDER_QUESTION\n} from '../constants';\nimport { resolveBackgroundColor } from '../../text/CsText';\n\nfunction faqAnswerVisiblePlainText(html: string): string {\n const plainText = sanitizeHtml(html, {\n allowedTags: [],\n allowedAttributes: {}\n });\n\n return plainText\n .replace(/&nbsp;/gi, ' ')\n .replace(/\\u00a0/g, ' ')\n .trim();\n}\n\nexport function getFaqAnswerHtml(\n answer: string | null | undefined,\n placeholderAnswer: string = PLACEHOLDER_ANSWER,\n isEditing: boolean = false\n): string {\n const raw = typeof answer === 'string' ? answer : '';\n const plain = faqAnswerVisiblePlainText(raw);\n const emptyOrPlaceholderOnly =\n plain.length === 0 || plain.localeCompare(placeholderAnswer, undefined, { sensitivity: 'base' }) === 0;\n\n if (emptyOrPlaceholderOnly) {\n return isEditing ? `<p>${placeholderAnswer}</p>` : '';\n }\n return raw;\n}\n\nexport function hasAnswerContent(item: FaqItemData, isEditing: boolean): boolean {\n if (item.answer_content != null) {\n return true;\n }\n return Boolean(getFaqAnswerHtml(item.answer, PLACEHOLDER_ANSWER, isEditing));\n}\n\nexport function hasVisibleFaqContent(item: FaqItemData, isEditing: boolean): boolean {\n const question = getDisplayText(item.question, PLACEHOLDER_QUESTION, isEditing);\n return Boolean(question ?? hasAnswerContent(item, isEditing));\n}\n\nexport function getVisibleFaqItems(items: FaqItemData[] | undefined, isEditing: boolean): FaqItemData[] {\n const sourceItems = items ?? [];\n\n if (isEditing) {\n return sourceItems;\n }\n\n return sourceItems.filter((item) => hasVisibleFaqContent(item, false));\n}\n\nexport function normalizeFaqSectionWidth(value: FaqSectionWidth | string | undefined): FaqSectionWidth {\n const parsed = typeof value === 'string' ? Number(value) : value;\n if (FAQ_SECTION_WIDTH_OPTIONS.includes(parsed as FaqSectionWidth)) {\n return parsed as FaqSectionWidth;\n }\n return DEFAULT_FAQ_SECTION_WIDTH;\n}\n\nexport function resolveContainerBackgroundColor(value: unknown): string {\n return resolveBackgroundColor(value);\n}\n\nexport function getFaqItemKey(item: FaqItemData, index: number): string {\n const uid = item._metadata?.uid;\n if (uid) {\n return `faq-item-${uid}`;\n }\n const question = (item.question ?? '').trim();\n if (question.length > 0) {\n return `faq-item-${question}-${index}`;\n }\n return `faq-item-${index}`;\n}\n\nexport { getDisplayText };\n","export const PLACEHOLDER_TITLE = \"Got questions? We've got answers\";\nexport const PLACEHOLDER_QUESTION = 'Enter question';\nexport const PLACEHOLDER_ANSWER = 'Enter answer';\nexport const DEFAULT_TEST_ID = 'cs-faq';\nexport const EMPTY_ITEMS_PLACEHOLDER = 'Add FAQ items using the editor';\n\nexport const DEFAULT_FAQ_SECTION_WIDTH = 100;\nexport const FAQ_SECTION_WIDTH_OPTIONS = [25, 50, 75, 100] as const;\n","import React from 'react';\nimport { TableRichText } from '../../table-rich-text';\nimport type { FaqAnswerProps } from '../types';\nimport { FaqAnswerContent } from '../Faq.styled';\nimport { getFaqAnswerHtml } from '../utils/helpers';\nimport { PLACEHOLDER_ANSWER } from '../constants';\n\nconst FaqAnswer: React.FC<FaqAnswerProps> = ({ item, index, isOpen, isEditing, testId, renderAnswer }) => {\n const answerTestId = `${testId ?? 'cs-faq'}-answer-${index}`;\n\n const wrapAnswer = (content: React.ReactNode) => (\n <FaqAnswerContent\n isOpen={isOpen}\n data-testid={answerTestId}\n >\n {content}\n </FaqAnswerContent>\n );\n\n if (renderAnswer) {\n const customContent = renderAnswer(item, index, isEditing);\n if (customContent != null) {\n return wrapAnswer(customContent);\n }\n }\n\n if (item.answer_content != null) {\n return wrapAnswer(item.answer_content);\n }\n\n const answerHtml = getFaqAnswerHtml(item.answer, PLACEHOLDER_ANSWER, isEditing);\n if (!answerHtml) {\n return null;\n }\n\n return wrapAnswer(\n <TableRichText\n text_editor={answerHtml}\n container_alignment=\"left\"\n $={{ text_editor: item.$?.answer ?? {} }}\n />\n );\n};\n\nexport default FaqAnswer;\n","import React from 'react';\nimport FaqAnswer from './FaqAnswer';\nimport type { FaqItemProps } from '../types';\nimport {\n FaqItemContainer,\n FaqQuestionButton,\n FaqQuestionText,\n FaqChevronIcon,\n FaqAnswerPanel,\n FaqAnswerInner\n} from '../Faq.styled';\nimport { getDisplayText, hasAnswerContent } from '../utils/helpers';\nimport { PLACEHOLDER_QUESTION } from '../constants';\n\nfunction ChevronDownIcon(): React.ReactElement {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst FaqItem: React.FC<FaqItemProps> = ({\n item,\n index,\n isOpen,\n isEditing,\n onToggle,\n onHeaderKeyDown,\n headerRef,\n testId,\n itemEditTags,\n renderAnswer\n}) => {\n const displayQuestion = getDisplayText(item.question, PLACEHOLDER_QUESTION, isEditing);\n const hasAnswer = hasAnswerContent(item, isEditing);\n const panelId = `${testId ?? 'cs-faq'}-panel-${index}`;\n const headerId = `${testId ?? 'cs-faq'}-header-${index}`;\n\n if (!displayQuestion && !hasAnswer) {\n return null;\n }\n\n const questionLabel = displayQuestion ?? PLACEHOLDER_QUESTION;\n\n return (\n <FaqItemContainer\n data-testid={`${testId ?? 'cs-faq'}-item-${index}`}\n {...(itemEditTags ?? {})}\n >\n <h3>\n <FaqQuestionButton\n type=\"button\"\n id={headerId}\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => onToggle(index)}\n onKeyDown={(event) => onHeaderKeyDown(event, index)}\n ref={headerRef}\n data-testid={`${testId ?? 'cs-faq'}-question-${index}`}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <FaqQuestionText {...(item.$?.question ?? {})}>{questionLabel}</FaqQuestionText>\n <FaqChevronIcon\n isOpen={isOpen}\n data-testid={`${testId ?? 'cs-faq'}-icon-${index}`}\n >\n <ChevronDownIcon />\n </FaqChevronIcon>\n </FaqQuestionButton>\n </h3>\n <FaqAnswerPanel\n id={panelId}\n aria-labelledby={headerId}\n aria-hidden={!isOpen}\n isOpen={isOpen}\n data-testid={`${testId ?? 'cs-faq'}-answer-panel-${index}`}\n >\n <FaqAnswerInner isOpen={isOpen}>\n <FaqAnswer\n item={item}\n index={index}\n isOpen={isOpen}\n isEditing={isEditing}\n testId={testId}\n renderAnswer={renderAnswer}\n />\n </FaqAnswerInner>\n </FaqAnswerPanel>\n </FaqItemContainer>\n );\n};\n\nexport default FaqItem;\n"]}
1
+ {"version":3,"sources":["../src/text/CsText.tsx","../src/hooks/useRouteReplacer.tsx","../src/utils/route-utils.ts","../src/hooks/use-toggle-font-color/useMainContrast.tsx","../src/hooks/use-toggle-font-color/useToggleFontColor.ts","../src/image/CsImage.tsx","../src/image/CsImage.styled.tsx","../src/marketing-banner/constants.ts","../src/typography/Typography.styled.tsx","../src/typography/Typography.tsx","../src/marketing-banner/components/BannerText.styled.tsx","../src/marketing-banner/styles/theme.ts","../src/marketing-banner/styles/mixins.ts","../src/marketing-banner/components/BannerText.tsx","../src/bynder-media/BynderMedia.tsx","../src/bynder-media/utils.ts","../src/bynder-media/BynderMedia.styled.tsx","../src/marketing-banner/hooks/useCarousel.ts","../src/marketing-banner/hooks/useReducedMotion.ts","../src/marketing-banner/utils/utils.ts","../src/button/Button.tsx","../src/button/Button.styled.tsx","../src/button/helpers.ts","../src/utils/common.ts","../src/button/ButtonWrapper.tsx","../src/marketing-banner/MarketingBanner.styled.tsx","../src/marketing-banner/MarketingBanner.tsx","../src/spacing-divider/SpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/SpacingDivider.tsx","../src/carousel/Carousel.tsx","../src/carousel/shared.tsx","../src/carousel/CarouselLayout.styled.tsx","../src/utils/deviceConstants.ts","../src/carousel/types.ts","../src/utils/viewportLayoutUtils.ts","../src/carousel/utils.ts","../src/carousel/hooks/useCarouselLayout.ts","../src/carousel/hooks/useCarouselResize.ts","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/column-control/ColumnControl.tsx","../src/content-card/ContentCard.styled.ts","../src/content-card/utils/helpers.ts","../src/content-card/constants.ts","../src/table-rich-text/TableRichText.tsx","../src/table-rich-text/TableRichText.styled.tsx","../src/utils/richTextUtils.ts","../src/content-card/ContentCard.tsx","../src/hero-banner/constants.ts","../src/hero-banner/components/TypographyFields.tsx","../src/hero-banner/HeroBanner.styled.tsx","../src/hero-banner/helpers.ts","../src/hero-banner/HeroBanner.tsx","../src/rich-text/RichText.tsx","../src/rich-text/RichText.styled.tsx","../src/faq/Faq.tsx","../src/faq/Faq.styled.tsx","../src/faq/utils/helpers.ts","../src/faq/constants.ts","../src/faq/components/FaqAnswer.tsx","../src/faq/components/FaqItem.tsx","../src/video-player/videoUtils.ts","../src/video-player/VideoPlayer.styled.tsx","../src/video-player/types.ts","../src/video-player/VideoPlayer.tsx"],"names":["useMemo","styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","DEFAULT_REGION","DEFAULT_LANGUAGE","getRegionAndLanguageFromSearch","search","startsWith","params","URLSearchParams","get","getRegionAndLanguageFromPath","pathname","parts","split","filter","Boolean","length","getRegionAndLanguageFromLocation","window","location","useTheme","ColorUtils","getGenomeColor","useToggleFontColor","toggleValue","theme","useToggleFontColor_default","jsx","useRegionLanguage","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","o","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","error","console","resolveBackgroundColor","value","trimmed","CsText","full_width","container_background_color","text_editor","font_color","$","fontColor","regionLang","backgroundColor","updatedHtml","children","dangerouslySetInnerHTML","__html","CsText_default","NsImage","StyledCsImageWrapper","image_alignment","display","justifyContent","left","right","center","maxWidth","objectFit","objectPosition","PLACEHOLDER_IMAGE_SRC","encodeURIComponent","allowedImageProps","CsImage","props","align","image","parent$","isEditing","rest","selectedImage","fileMeta","contentstackAsset","parsed","entry","selected","files","err","warn","resolvedSrc","resolvedAlt","resolvedWidth","resolvedHeight","imageType","fileSource","altText","width","height","title","filename","imageProps","src","alt","key","containerClassForNSImage","className","CsImage_default","DEFAULT_BANNER_CONFIG","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","DEFAULT_CAROUSEL_CONFIG","rotationInterval","DEFAULT_ROTATION_INTERVAL","PLACEHOLDER_VALUES","header","subtitle","typographyVariants","h1","desktop","fontSize","lineHeight","mobile","fontFamily","h2","h3","disclaimer","boxquote","commonTextStyles","variantToElement","TypographyStyled","variant","variantStyle","fontFamilyValue","fontWeight","isBoxquote","Typography","inputText","dataTestId","elementType","as","Typography_default","BREAKPOINTS","tablet","wide","SPACING","headerMargin","titleMargin","subtitleMargin","bodyMargin","textGap","desktopPadding","mobilePadding","carouselGap","ctaPaddingDesktop","ctaPaddingTablet","ctaPaddingWide","DIMENSIONS","bannerHeightDesktop","bannerHeightMobile","textMaxWidth","indicatorSize","indicatorBorder","COLORS","textWhite","textDark","textGray","ctaDark","ctaBorder","fallbackBg","indicatorActive","indicatorInactive","TEXT_COLOR_MAP","white","dark","TRANSITIONS","fast","default","slow","Z_INDEX","background","media","gradient","content","controls","MEDIA_QUERIES","mobileAndBelow","desktopAndUp","css","centerOnMobile","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","textAlignment","HeaderTextWrapper","TitleWrapper","SubtitleWrapper","BodyTextWrapper","jsxs","getDisplayText","placeholderValue","showPlaceholder","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","header_text","body_text","React","getMediaUrl","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParams","searchParams","getAll","isFit","some","io","hasFillWithDimensions","includes","has","skipAspectRatio","updatedIoParams","push","origin","addDefaultTransform","extractFocusPointFromUrl","focuspoint","parseFloat","x","y","isNaN","Math","round","parseObjectPosition","normalized","toLowerCase","extractBynderMedia","mediaJson","firstImage","mediaUrl","endsWith","isResponsive","focusPoint","result","imageFit","fit","desktopUrl","mobileUrl","MediaContainer","StyledImage","img","StyledVideo","video","PictureElement","picture","SourceElement","source","BynderMedia","bynder_media","useState","mediaInfo","setMediaInfo","hasError","setHasError","useEffect","extracted","handleMediaError","mediaAlt","onError","autoPlay","muted","loop","playsInline","srcSet","loading","useCallback","useReducedMotion","prefersReducedMotion","setPrefersReducedMotion","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","initialIndex","validInitialIndex","min","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","hasCTA","banner","cta_button","buttons","isCarouselMode","Array","isArray","banners","hasMedia","NsIcon","NsIconVariants","NsButton","ROUNDED_BORDER_RADIUS","REL_NOOPENER_NOREFERRER","DISABLED_STATE_STRING","DEFAULT_VARIANT","DEFAULT_SIZE","DEFAULT_ALIGNMENT","DEFAULT_ICON_POSITION","DEFAULT_BUTTON_TYPE","DEFAULT_PLACEHOLDER_TEXT","DEFAULT_TARGET","BUTTON_TYPE_ROUNDED","BUTTON_TYPE_SQUARE","BORDER_COLOR_TRANSPARENT","resolveTarget","target","resolveDisabled","disabled","iconAliasMap","arrow","resolveIconName","iconName","variantDefaults","primary","bg","hover","pressed","disabledBg","disabledText","focusRing","secondary","border","hoverText","underlineColor","widthBySize","large","medium","small","DEFAULT_BUTTON_WIDTH","getButtonWidth","size","iconSizeByButtonSize","DEFAULT_ICON_SIZE","getIconSize","BUTTON_GAP","BUTTON_MIN_WIDTH","DESKTOP_BREAKPOINT","TABLET_BREAKPOINT","MOBILE_BREAKPOINT","DESKTOP_FONT_WEIGHT","TABLET_MOBILE_FONT_WEIGHT","FOCUS_OUTLINE_WIDTH","FONT_FAMILY_LORA","JUSTIFY_CONTENT_CENTER","JUSTIFY_CONTENT_FLEX_END","JUSTIFY_CONTENT_FLEX_START","getJustifyContent","noForward$","ButtonContainer","verticalAlignment","StyledButton","shouldForwardProp","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$hoverText","$underlineColor","$buttonWidth","$maxButtonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","hasLocalePrefix","path","test","isProtocolRelativeUrl","isAbsoluteHttpUrl","isPlainDomain","replaceLocalePlaceholders","country","replaceAll","buildNuSkinUrl","current","localizedBase","normalizedOrigin","protocol","host","hash","needsLocaleRewrite","currentHost","isMainWebsiteHost","hasPlaceholders","resolveNuSkinUrl","fallback","resolveExternalOrAbsoluteUrl","trimmedUrl","isNuSkinDomain","buildLocalizedRelativeUrl","hadTrailingSlash","relativeUrl","convertToLocalizedUrl","inputUrl","globalThis","resolvedUrl","Fragment","Button","open_in_new_tab","button_size","vertical_alignment","buttonType","buttontype","icon","iconposition","iconPosition","button_state","resolvedVariant","resolvedSize","resolvedAlignment","resolvedVerticalAlignment","resolvedIconPosition","resolvedButtonType","hrefProp","variantDefault","buttonWidth","maxButtonWidth","resolvedTarget","resolvedDisabled","buttonBorder","isLinkVariant","IconName","isValidNsIcon","iconSize","renderIcon","iconColor","name","colorOverride","getLabelText","labelTitle","$variant","rel","Button_default","getButtonProps","button","buttonProps","Buttons","Object","keys","ButtonWrapper_default","BannerContainer","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","$isNested","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","ButtonWrapper","CarouselControls","Indicator","active","getEditTags","getButtonParentEditTags","blockEditTags","buttons__0","renderBanner","isNested","showMedia","showCTA","baseTestId","resolvedTextColor","text_color","show_gradient","content_position","gradientColor","gradientDirection","gradient_depth","bynderEditTags","buttonParentEditTags","MarketingBannerComponent","rotation_interval","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","onClick","THICKNESS_PX","thin","thick","ultra","StyledSpacingContainer","vertical_padding","divider_alignment","v","none","flexDirection","alignItems","paddingTop","paddingBottom","StyledDividerLine","divider_style","divider_thickness_px","divider_color","divider_gradient","divider_width_percent","base","max","backgroundImage","backgroundSize","dashLength","gapLength","maskImage","WebkitMaskImage","dotSize","spacing","radius","maskSize","WebkitMaskSize","maskRepeat","WebkitMaskRepeat","maskPosition","WebkitMaskPosition","borderBottomStyle","borderBottomWidth","borderBottomColor","isValidHex","hexToRgb","hex","r","parseInt","slice","g","b","gradientPresetCss","preset","baseHex","rgb","DEFAULT_HEX","SpacingDivider","divider_thickness","divider_gradient_preset","final_divider_color","SpacingDivider_default","SliderImport","DEVICE_SIZES","ULTRA_SMALL","EXTRA_SMALL","SMALL","MEDIUM","LARGE","EXTRA_LARGE","ULTRA_LARGE","SUPER_LARGE","MAX_SLIDE_HEIGHT_PX","GAP_PRESET_VALUES","getGapPx","gap","MIN_SLIDE_WIDTH_PX","MIN_EMPTY_PLACEHOLDER_HEIGHT_PX","getArrowButtonPosition","fullVal","nonFullVal","CarouselContainer","columnHeight","maxColumnHeight","dotsInside","textAlign","padding","boxSizing","overflow","minHeight","margin","marginLeft","flexShrink","maxHeight","bottom","listStyle","li","borderRadius","textIndent","cursor","transition","SlideSection","useFlexLayout","stackedVerticalGap","stackedItemHeight","stackedItemMaxHeight","slideWidth","flexBasis","isVariableWidth","flex","minWidth","SlideInner","SlideContentInner","ArrowButton","top","transform","zIndex","verticalAlign","outline","outlineOffset","opacity","InnerWrapper","containerType","EmptyPlaceholderWrapper","EmptyPlaceholder","emptyBlockParentClass","slides","slides__parent","getPresetColumns","unwrapComponent","mod","candidate","isVariableWidthPreset","windowWidth","getVariableSlideWidth","gapPx","containerWidthPx","baseWidth","pos","smallPx","largePx","getSlidesToShowByViewport","presetColumns","buildCarouselResponsiveSettings","shouldShowDots","toShowSmall","toShowMedium","toShowLarge","breakpoint","settings","slidesToShow","slidesToScroll","swipeToSlide","arrows","dots","variableWidth","Slider","getSlideKey","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","addSlideEditTags","slide","currentFlexBasis","style","useRef","useCarouselResize","slideCount","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","useCarouselLayout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","emptyPlaceholderText","emptyPlaceholderTextProp","effectiveFullWidth","containerRef","setContainerWidthPx","updateContainerWidth","el","getComputedStyle","pl","Number","paddingLeft","pr","paddingRight","offsetWidth","ResizeObserver","ro","observe","disconnect","targetSlidesToShow","effectiveAutoplayEnabled","effectiveShowPagination","showArrowsOnDesktop","isStackedViewport","isTabletGridViewport","containerHeight","sliderRef","slickPrev","slickNext","containerClassName","isVariablePresetDesktop","effectiveSlidesToShow","placeholderSlotsToShow","responsiveSettings","slidesLength","sliderSettings","infinite","speed","autoplay","autoplaySpeed","pauseOnHover","swipe","draggable","beforeChange","_","next","responsive","renderSlides","hasSlides","createElement","Carousel","dotsPosition","carouselProps","renderEmptySlot","slotIndex","ref","from","offset","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","ColumnControlContainer","TabletGridContainer","flexWrap","columns","getGridDimensions","layout","rows","rawCols","rawRows","parsedCols","parsedRows","isFinite","getMaxChildrenForLayout","maxByLayout","ColumnControl","emptyTextProp","effectiveGridLayout","maxChildren","visibleSlides","slidesCount","renderSlot","hasSlide","id","ColumnControl_default","Card","article","$maxHeight","$mediaHeight","$mediaMaxHeight","$inlineMedia","Content","RichTextWrapper","CtaWrapper","$isCardCta","ContentInner","sanitizeHtml","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","getEffectiveCta","cta","normalizeContentAlignment","normalizeCtaStyle","raw","getCtaState","ctaStyleNormalized","effectiveCta","hasCtaHref","hasCtaLabel","isCardLink","showButton","cardTarget","getMediaLayout","isInlineMedia","mediaHeightValue","mediaMaxHeightValue","contentCardBodyVisiblePlainText","allowedTags","allowedAttributes","getContentCardBodyHtml","placeholderBody","plain","localeCompare","sensitivity","TableRichTextWrapper","TableRichTextInner","DOMPurify","getAlignItems","localizeAndValidateLinks","inputHtml","removeAttribute","localized","sanitize","ALLOWED_TAGS","ALLOWED_ATTR","allowedAttrs","forbidAttrs","FORBID_ATTR","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","wrapTablesForScroll","TableRichText","container_alignment","container_vertical_alignment","container_width","restProps","rewrittenHtml","sanitizedHtml","fontColorBoolean","TableRichText_default","CardTextBlock","editTags","bodyHtml","displayTitle","displaySubtitle","richTextHtml","CardCtaBlock","show","isCardCta","nestedButtonParent","buttonParent$","ContentCard","cta_style","card_cta_group","button_cta_group","content_alignment","background_color","border_radius","max_height","normalizedStyle","activeCta","cardAs","cardLinkProps","ContentCard_default","PLACEHOLDER_BRAND_CAPTION","ARIA_LABEL_HERO_BANNER","normalizedText","getTypographyFields","brandcaption","placeholder","editTagKey","TypographyFields","fields","field","editAttributes","displayValue","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","getGradientColor","gradientDirectionMap","getGradientDirection","MediaLayer","GRADIENT_OPACITIES","getGradientBackground","Overlay","HERO_CTA_WRAPPER_CLASS","HeroBanner","class_name","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","HeroBanner_default","RichTextInner","RichText","RichText_default","FaqOuter","FaqSection","$containerBackgroundColor","$fontColor","FaqContent","$sectionWidth","FaqTitleWrapper","marginBottom","FaqList","FaqItemContainer","EASE_OUT","EASE_SPRING","FaqQuestionButton","FaqQuestionText","FaqChevronIcon","isOpen","FaqAnswerPanel","gridTemplateRows","FaqAnswerInner","visibility","transitionDelay","FaqAnswerContent","FaqEmptyPlaceholder","font","PLACEHOLDER_QUESTION","PLACEHOLDER_ANSWER","DEFAULT_TEST_ID","EMPTY_ITEMS_PLACEHOLDER","FAQ_SECTION_WIDTH_OPTIONS","faqAnswerVisiblePlainText","getFaqAnswerHtml","answer","placeholderAnswer","hasAnswerContent","item","answer_content","hasVisibleFaqContent","question","getVisibleFaqItems","items","sourceItems","normalizeFaqSectionWidth","resolveContainerBackgroundColor","getFaqItemKey","uid","_metadata","FaqAnswer","renderAnswer","answerTestId","wrapAnswer","customContent","answerHtml","FaqAnswer_default","ChevronDownIcon","viewBox","fill","xmlns","focusable","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","FaqItem","onToggle","onHeaderKeyDown","headerRef","itemEditTags","displayQuestion","hasAnswer","panelId","headerId","questionLabel","FaqItem_default","FaqInternal","faq_section_title","faq_items","faq_section_width","allow_multiple_faqs_open","expand_all_faqs","ariaLabel","visibleItems","headerRefs","resolvedContainerBackground","resolvedFontColor","resolvedSectionWidth","itemsForRender","shouldExpandAllFaqs","Set","openIndices","setOpenIndices","toggleItem","previous","delete","add","focusHeader","targetIndex","focus","handleHeaderKeyDown","setHeaderRef","element","listEditTags","faq_items__parent","sectionLabel","Faq","Faq_default","YOUTUBE_ID","VIMEO_ID","safeVideoSrc","s","String","extractVideoId","match","exec","buildYouTubeParams","opts","set","buildVimeoParams","toQuerySuffix","qs","toString","buildEmbedUrl","buildVideoDescriptor","videoSource","kind","VIDEO_BREAKPOINTS","EmbedWrapper","StyledIframe","iframe","PlaceholderWrapper","PlaceholderLabel","verticalScaleMap","horizontalScaleMap","alignItemsMap","justifyContentMap","StyledVideoContainer","horizontal_padding","h","StyledVideoInner","width_percent","IFRAME_SANDBOX","IFRAME_ALLOW","VideoPlaceholder","rx","VideoPlayerFromDescriptor","sandbox","allow","allowFullScreen","VideoPlayer","descriptor","pct","safePct","VideoPlayer_default"],"mappings":"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","sourcesContent":["import { ReactElement, useMemo } from 'react';\nimport styled from '@emotion/styled';\nimport { useToggleFontColor } from '../hooks';\nimport { getRegionAndLanguageFromLocation, RegionLanguageQuery, replaceRegionAndLanguage } from '../utils/route-utils';\n\ninterface CsTextProps {\n readonly full_width?: boolean;\n readonly container_background_color?: unknown;\n readonly alignment?: 'left' | 'center' | 'right';\n readonly text_editor: string;\n readonly font_color?: boolean;\n readonly $?: {\n text_editor?: Record<string, unknown>;\n };\n}\n\n// Get region + language once\nconst useRegionLanguage = () => {\n return useMemo(() => getRegionAndLanguageFromLocation(), []);\n};\n\n// Replace region and language in a single URL\nconst rewriteUrl = (url: string, replacer?: RegionLanguageQuery): string => {\n if (!replacer || !url) return url;\n return replaceRegionAndLanguage(url, replacer);\n};\n\n// Rewrite all <a> links inside CMS HTML\nexport const rewriteLinks = (html: string, replacer?: RegionLanguageQuery): string => {\n if (typeof window === 'undefined' || !html || !replacer) return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n doc.querySelectorAll('a').forEach((link) => {\n const href = link.getAttribute('href');\n if (!href) return;\n link.setAttribute('href', rewriteUrl(href, replacer));\n });\n\n return doc.body.innerHTML;\n};\n\n// Styled container for CMS text\nconst Container = styled.div<{\n fullWidth: boolean;\n bgColor: string;\n alignment: string;\n color: string;\n}>`\n width: ${({ fullWidth }) => (fullWidth ? '100%' : 'auto')};\n background-color: ${({ bgColor }) => bgColor};\n text-align: ${({ alignment }) => alignment};\n color: ${({ color }) => color};\n padding: 16px 32px;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: 'Lora', serif;\n }\n\n h1 {\n font-size: 42px;\n line-height: 48px;\n }\n h2 {\n font-size: 36px;\n line-height: 42px;\n }\n h3 {\n font-size: 32px;\n line-height: 38px;\n }\n h4 {\n font-size: 26px;\n line-height: 34px;\n }\n h5 {\n font-size: 22px;\n line-height: 28px;\n }\n h6 {\n font-size: 18px;\n line-height: 24px;\n }\n\n p {\n margin: 0;\n padding: 0;\n }\n`;\n\n// Safely resolve CMS background color (CMS color object shape)\nconst extractColorFromObject = (obj: unknown): string | null => {\n if (typeof obj !== 'object' || obj === null) return null;\n const o = obj as { brandColor?: { colorObj?: { light?: unknown } }; color?: unknown };\n const color = o?.brandColor?.colorObj?.light ?? o?.color;\n return typeof color === 'string' && color.trim() ? color : null;\n};\n\nconst parseJsonColor = (jsonString: string): string | null => {\n try {\n const parsed = JSON.parse(jsonString);\n const color = parsed?.brandColor?.colorObj?.light;\n return typeof color === 'string' && color.trim() ? color : null;\n } catch (error) {\n console.error(error);\n return null;\n }\n};\n\nexport const resolveBackgroundColor = (value: unknown): string => {\n // null, undefined, false, 0, '' → transparent\n if (!value) return 'transparent';\n\n // CMS object\n if (typeof value === 'object') {\n const color = extractColorFromObject(value);\n return color ?? 'transparent';\n }\n\n // CMS string\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return 'transparent';\n\n // JSON string\n if (trimmed.startsWith('{')) {\n const color = parseJsonColor(trimmed);\n return color ?? 'transparent';\n }\n\n // Normal CSS color\n return trimmed;\n }\n\n // numbers, booleans, etc\n return 'transparent';\n};\n\nconst CsText = ({\n full_width = false,\n container_background_color,\n alignment = 'left',\n text_editor,\n font_color = false,\n $\n}: CsTextProps): ReactElement | null => {\n const fontColor = useToggleFontColor(font_color);\n const regionLang = useRegionLanguage();\n\n const backgroundColor = useMemo(\n () => resolveBackgroundColor(container_background_color),\n [container_background_color]\n );\n\n const updatedHtml = useMemo(() => rewriteLinks(text_editor, regionLang), [text_editor, regionLang]);\n\n if (!text_editor) return null;\n\n return (\n <Container\n fullWidth={full_width}\n bgColor={backgroundColor}\n alignment={alignment}\n color={fontColor}\n >\n <div\n dangerouslySetInnerHTML={{ __html: updatedHtml }}\n {...$?.text_editor}\n />\n </Container>\n );\n};\n\nexport default CsText;\n","import { useMemo } from 'react';\nimport { getRegionAndLanguageFromLocation, replaceRegionAndLanguage, RegionLanguageQuery } from '../utils/route-utils';\n\n/**\n * Simply use this hook to update the region and language in the url\n * Note: urlToParse should have {%region} or {%language} or {%rREGION} or {%LANGUAGE}\n * @param urlToParse url to be parsed\n * @returns urlToParse after conditionally replacing the region and language\n */\nconst useRouteReplacer = (urlToParse?: string): { url?: string } => {\n const replacer: RegionLanguageQuery | undefined = useMemo(() => getRegionAndLanguageFromLocation(), []);\n\n const url = useMemo(() => {\n if (!urlToParse || !replacer) return undefined;\n return replaceRegionAndLanguage(urlToParse, replacer);\n }, [urlToParse, replacer]);\n\n return { url };\n};\n\nexport default useRouteReplacer;\n","const languageReplaceExpression = '{%language}';\nconst languageReplaceExpressionUppercase = '{%LANGUAGE}';\nconst regionReplaceExpression = '{%region}';\nconst regionReplaceExpressionUppercase = '{%REGION}';\n\nexport type RegionLanguageQuery = {\n region?: string;\n language?: string;\n slug?: string;\n};\n\n/**\n * Replace {%region}, {%language} placeholders in text\n */\nexport const replaceRegionAndLanguage = (text: string, replacer: RegionLanguageQuery = {}): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n if (replacer.region) {\n text = text.replace(regionReplaceExpression, replacer.region);\n text = text.replace(regionReplaceExpressionUppercase, replacer.region.toUpperCase());\n }\n\n if (replacer.language) {\n text = text.replace(languageReplaceExpression, replacer.language);\n text = text.replace(languageReplaceExpressionUppercase, replacer.language.toUpperCase());\n }\n\n return text;\n};\n\n/**\n * Replace dynamic pathname segments like [region], [language]\n */\nexport const replacePathnameWithQueryParams = (pathname: string, queryParams: RegionLanguageQuery): string => {\n if (!pathname || typeof pathname !== 'string') {\n return '';\n }\n\n let formattedUrl = pathname;\n\n if (queryParams.region) {\n formattedUrl = formattedUrl.replace('[region]', queryParams.region);\n }\n\n if (queryParams.language) {\n formattedUrl = formattedUrl.replace('[language]', queryParams.language);\n }\n\n if (queryParams.slug) {\n formattedUrl = formattedUrl.replace('[[...slug]]', queryParams.slug);\n }\n\n return formattedUrl;\n};\n\n/**\n * Extract region & language from a query object\n */\nexport const getRegionAndLanguageFromQuery = (\n query?: Record<string, string | string[] | undefined>\n): RegionLanguageQuery | undefined => {\n if (!query) return undefined;\n\n const region = Array.isArray(query.region) ? query.region[0] : query.region;\n\n const language = Array.isArray(query.language) ? query.language[0] : query.language;\n\n if ([region, language].some(Boolean)) {\n return { region, language };\n }\n\n return undefined;\n};\n\n/**\n * ✅ Next.js Router replacement\n * Reads from browser URL safely\n */\nconst DEFAULT_REGION = 'us';\nconst DEFAULT_LANGUAGE = 'en';\n\nfunction getRegionAndLanguageFromSearch(search?: string | null): RegionLanguageQuery | undefined {\n if (!search?.startsWith?.('?')) {\n return undefined;\n }\n\n const params = new URLSearchParams(search);\n const region = params.get('region');\n const language = params.get('language');\n\n if (!region && !language) {\n return undefined;\n }\n\n return {\n region: region ?? DEFAULT_REGION,\n language: language ?? DEFAULT_LANGUAGE\n };\n}\n\nfunction getRegionAndLanguageFromPath(pathname?: string | null): RegionLanguageQuery | undefined {\n if (!pathname) {\n return undefined;\n }\n\n const parts = pathname.split('/').filter(Boolean);\n if (parts.length < 2) {\n return undefined;\n }\n\n const [region, language] = parts;\n if (region?.length === 2 && language?.length === 2) {\n return { region, language };\n }\n\n return undefined;\n}\n\nexport const getRegionAndLanguageFromLocation = (): RegionLanguageQuery => {\n // ---------- SSR ----------\n if (typeof window === 'undefined' || !window.location) {\n return { region: DEFAULT_REGION, language: DEFAULT_LANGUAGE };\n }\n\n const { search, pathname } = window.location;\n\n // Try query params first, then path, then defaults\n return (\n getRegionAndLanguageFromSearch(search) ??\n getRegionAndLanguageFromPath(pathname) ?? {\n region: DEFAULT_REGION,\n language: DEFAULT_LANGUAGE\n }\n );\n};\n","import { useMemo } from 'react';\n\nimport { useTheme } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\n/**\n * @returns {main:#FFFFFF, contrast:#252525} when passed true\n */\nconst useMainContrast = (toggleValue: boolean = false): { main: string; contrast: string } => {\n const theme = useTheme();\n\n return useMemo(() => {\n const main = getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark');\n const contrast = getGenomeColor(theme, 'N10', toggleValue ? 'dark' : 'light');\n return { main, contrast };\n }, [toggleValue, theme]);\n};\n\nexport default useMainContrast;\n","import { useTheme } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport { useMemo } from 'react';\n\nconst { getGenomeColor } = ColorUtils;\n/**\n * Used to fetch the appropriate theme color for primary and contrast.\n * Usually black or similar, and white for contrast.\n * @param toggleValue the CS toggle value between black and white font color.\n * @returns hex value of the color.\n */\nconst useToggleFontColor = (toggleValue: boolean = false): string => {\n const theme = useTheme();\n\n return useMemo(() => getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark'), [toggleValue, theme]);\n};\n\nexport default useToggleFontColor;\n","import { NsImage } from '@nuskin/foundation-ui-components';\nimport { StyledCsImageWrapper } from './CsImage.styled';\nimport type { ContentstackAsset, CsImageProps, ImageFile, ImageFileMeta, NsImageProps } from './types';\n\n// Inline SVG data URL used as a safe placeholder when the main image is unavailable\nexport const PLACEHOLDER_IMAGE_SRC =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 300\" role=\"img\" aria-label=\"Image not available\">\n <defs>\n <linearGradient id=\"csImagePlaceholderGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#f3f4f6\" />\n <stop offset=\"100%\" stop-color=\"#e5e7eb\" />\n </linearGradient>\n </defs>\n <rect width=\"400\" height=\"300\" fill=\"url(#csImagePlaceholderGradient)\" />\n <g stroke=\"#d1d5db\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n <rect x=\"60\" y=\"60\" width=\"280\" height=\"180\" rx=\"12\" />\n <path d=\"M120 200 L180 140 L230 185 L260 160 L320 210\" />\n <circle cx=\"160\" cy=\"120\" r=\"20\" />\n </g>\n </svg>`\n );\n\nconst allowedImageProps: (keyof NsImageProps)[] = [\n 'alt',\n 'className',\n 'fill',\n 'height',\n 'id',\n 'src',\n 'variant',\n 'width'\n];\n\nconst CsImage = (props: CsImageProps) => {\n // parent$ and isEditing are accepted from the CMS API for consistency with other components but are not\n // passed to NsImage; we destructure them only to keep them out of ...rest.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- CMS props consumed here to exclude from rest\n const { image_alignment: align = 'center', image, parent$, isEditing, $, ...rest } = props;\n\n let selectedImage: ImageFile | null = null;\n let fileMeta: Record<string, ImageFileMeta> | null = null;\n let contentstackAsset: ContentstackAsset | null = null;\n\n try {\n const parsed = typeof image === 'string' ? JSON.parse(image) : image;\n\n // Try Bynder format first: { image: [{ selected, files }] }\n const entry = parsed?.image?.[0];\n if ((entry?.selected ?? entry?.files) != null) {\n selectedImage = entry?.selected;\n fileMeta = entry?.files;\n } else if (parsed?.url) {\n // Fallback: Contentstack native asset format\n contentstackAsset = parsed;\n }\n } catch (err) {\n console.warn('[CsImage] Failed to parse image prop:', err);\n }\n\n let resolvedSrc = PLACEHOLDER_IMAGE_SRC;\n let resolvedAlt = 'Image not available';\n let resolvedWidth: number | string = '100%';\n let resolvedHeight: number | string = '100%';\n\n // Bynder format\n if ((selectedImage ?? fileMeta) != null) {\n const imageType = selectedImage?.imageType ?? 'transformBaseUrl';\n const fileSource = fileMeta?.[imageType];\n\n if (fileSource?.url) {\n resolvedSrc = fileSource.url;\n resolvedAlt = selectedImage?.altText ?? 'Image';\n resolvedWidth = selectedImage?.width ?? '100%';\n resolvedHeight = selectedImage?.height ?? '100%';\n }\n }\n // Contentstack asset fallback\n else if (contentstackAsset?.url) {\n resolvedSrc = contentstackAsset.url;\n resolvedAlt = contentstackAsset.title || contentstackAsset.filename || 'Image';\n // Contentstack assets don't provide width/height in metadata, keep defaults\n }\n\n const imageProps: NsImageProps = {\n src: resolvedSrc,\n alt: resolvedAlt,\n width: resolvedWidth,\n height: resolvedHeight\n };\n\n // Add any other valid props from rest\n allowedImageProps.forEach((key) => {\n if (rest[key] !== undefined) {\n (imageProps as Record<string, unknown>)[key] = rest[key];\n }\n });\n\n const containerClassForNSImage = rest?.full_width ? 'container !p-0' : '';\n\n return (\n <StyledCsImageWrapper\n image_alignment={align}\n width={imageProps.width}\n height={imageProps.height}\n className={containerClassForNSImage}\n >\n <NsImage\n {...imageProps}\n {...($?.image ?? {})}\n />\n </StyledCsImageWrapper>\n );\n};\n\nexport default CsImage;\n","import { styled } from '@nuskin/foundation-theme';\nimport type { CsImageProps } from './types';\n\nexport const StyledCsImageWrapper = styled('div')<\n Pick<CsImageProps, 'image_alignment'> & { width?: string | number; height?: string | number }\n>(({ image_alignment = 'center' }) => ({\n display: 'flex',\n justifyContent: {\n left: 'flex-start',\n right: 'flex-end',\n center: 'center'\n }[image_alignment],\n '& img': {\n maxWidth: 'fit-content',\n objectFit: 'contain',\n objectPosition: 'center'\n }\n}));\n","/**\n * Default Configurations\n * Marketing Banner Component\n */\n\nexport const DEFAULT_BANNER_CONFIG = {\n position: 'left' as const,\n textColor: 'white' as const,\n showGradient: false,\n gradientDepth: 'md' as const,\n mediaType: 'image' as const,\n ctaVariant: 'dark' as const\n};\n\nexport const DEFAULT_CAROUSEL_CONFIG = {\n rotationInterval: 5000\n};\n\nexport const DEFAULT_ROTATION_INTERVAL = 5000;\n\nexport const PLACEHOLDER_VALUES = {\n header: 'Enter Header',\n title: 'Enter Title',\n subtitle: 'Enter Subtitle',\n body: 'Enter Body Text'\n} as const;\n","import styled from '@emotion/styled';\nimport { TypographyStyledProps } from './types';\n\nexport const typographyVariants = {\n h1: {\n desktop: { fontSize: '44px', lineHeight: '50px' },\n mobile: { fontSize: '38px', lineHeight: '44px' },\n fontFamily: 'Lora'\n },\n h2: {\n desktop: { fontSize: '26px', lineHeight: '34px' },\n mobile: { fontSize: '24px', lineHeight: '30px' },\n fontFamily: 'Lora'\n },\n h3: {\n desktop: { fontSize: '22px', lineHeight: '28px' },\n mobile: { fontSize: '20px', lineHeight: '26px' },\n fontFamily: 'Lora'\n },\n body: {\n desktop: { fontSize: '16px', lineHeight: '22px' },\n mobile: { fontSize: '16px', lineHeight: '22px' },\n fontFamily: 'Inter'\n },\n disclaimer: {\n desktop: { fontSize: '12px', lineHeight: '16px' },\n mobile: { fontSize: '12px', lineHeight: '16px' },\n fontFamily: 'Inter'\n },\n boxquote: {\n desktop: { fontSize: '16px', lineHeight: '22px' },\n mobile: { fontSize: '16px', lineHeight: '22px' },\n fontFamily: 'Inter'\n }\n};\n\n/**\n * Common text element styles for rich content\n * Includes styling for paragraphs, links, lists, and text formatting\n * Can be imported and used in other styled components\n */\nexport const commonTextStyles = `\n p {\n margin: 0;\n padding: 0;\n font-size: 16px;\n line-height: 22px;\n font-family: 'Inter', sans-serif;\n }\n\n @media (max-width: 768px) {\n p {\n font-size: 16px;\n line-height: 22px;\n }\n }\n\n strong, b {\n font-weight: 600;\n }\n\n em, i {\n font-style: italic;\n }\n\n a {\n color: #008ab0;\n text-decoration: underline;\n\n &:hover {\n opacity: 0.8;\n }\n }\n\n ul, ol {\n margin: 16px 0;\n padding-left: 24px;\n }\n\n li {\n margin: 8px 0;\n }\n`;\n\nexport const variantToElement: Record<string, string> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n body: 'p',\n disclaimer: 'p',\n boxquote: 'p'\n};\n\nexport const TypographyStyled = styled.div<TypographyStyledProps>`\n ${({ variant, color = '#1D1D1B' }) => {\n if (!variant) {\n return `\n color: ${color};\n margin: 0;\n padding: 0;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n ${commonTextStyles}\n `;\n }\n\n const variantStyle = typographyVariants[variant];\n if (!variantStyle) return '';\n\n const fontFamilyValue = variantStyle.fontFamily === 'Lora' ? \"'Lora', serif\" : \"'Inter', sans-serif\";\n const fontWeight = (variantStyle as { fontWeight?: string }).fontWeight ?? '400';\n const isBoxquote = (variant as string) === 'boxquote';\n\n return `\n /* Desktop styles */\n font-size: ${variantStyle.desktop.fontSize};\n line-height: ${variantStyle.desktop.lineHeight};\n font-family: ${fontFamilyValue};\n color: ${color};\n margin: 0;\n padding: 0;\n font-weight: ${fontWeight};\n ${\n isBoxquote\n ? `\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\n }\n `\n : ''\n }\n\n /* Mobile/Tablet styles */\n @media (max-width: 768px) {\n font-size: ${variantStyle.mobile.fontSize};\n line-height: ${variantStyle.mobile.lineHeight};\n }\n\n /* ADA Compliance */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n /* Common text element styles */\n ${commonTextStyles}\n `;\n }}\n`;\n","import type { ElementType } from 'react';\nimport { TypographyStyled, variantToElement } from './Typography.styled';\nimport { TypographyProps } from './types';\n\n/**\n * Centralized Typography Component\n *\n * Supports multiple variants with responsive font sizes for desktop and mobile/tablet.\n * Includes ADA compliance features like semantic HTML and ARIA attributes.\n *\n * @param variant - Typography variant\n * @param inputText - Text content to display\n * @param color - Text color (hex code, default: #1D1D1B)\n * @param className - Additional CSS class\n * @param role - ARIA role for accessibility\n * @param ariaLabel - ARIA label for screen readers\n * @param ariaDescribedBy - ARIA described-by attribute\n * @param dataTestId - Data attribute for testing\n */\nexport const Typography = ({\n variant,\n inputText,\n color = '#1D1D1B',\n className = '',\n dataTestId,\n ...props\n}: TypographyProps) => {\n const elementType = variant ? variantToElement[variant] || 'div' : 'div';\n\n return (\n <TypographyStyled\n as={elementType as ElementType}\n variant={variant}\n color={color}\n className={className}\n data-testid={dataTestId}\n {...props}\n >\n {inputText}\n </TypographyStyled>\n );\n};\n\nexport default Typography;\n","import styled from '@emotion/styled';\nimport type { TextAlignment } from '../types';\nimport { SPACING } from '../styles/theme';\nimport { centerOnMobile } from '../styles/mixins';\n\nexport const TextContainer = styled.div<{\n textAlignment: TextAlignment;\n}>`\n text-align: ${({ textAlignment }) => textAlignment};\n max-width: 90vw;\n overflow-wrap: break-word;\n ${centerOnMobile}\n`;\n\nexport const HeaderTextWrapper = styled.div`\n margin: ${SPACING.headerMargin};\n letter-spacing: 0.05em;\n`;\n\nexport const TitleWrapper = styled.div`\n margin: ${SPACING.titleMargin};\n`;\n\nexport const SubtitleWrapper = styled.div`\n margin: ${SPACING.subtitleMargin};\n`;\n\nexport const BodyTextWrapper = styled.div`\n margin: ${SPACING.bodyMargin};\n`;\n","/**\n * Marketing Banner Theme Constants\n * Centralized design tokens for all components\n */\n\nexport const BREAKPOINTS = {\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n wide: 1440\n} as const;\n\nexport const FONT_STACKS = {\n lora: \"'Lora', Georgia, 'Times New Roman', serif\",\n inter: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\"\n} as const;\n\nexport const FONT_SIZES = {\n header: {\n mobile: '12px',\n tablet: '14px',\n desktop: '14px',\n wide: '16px'\n },\n title: {\n mobile: '24px',\n tablet: '32px',\n desktop: '40px',\n wide: '48px'\n },\n subtitle: {\n mobile: '16px',\n tablet: '18px',\n desktop: '20px',\n wide: '22px'\n },\n body: {\n mobile: '14px',\n tablet: '16px',\n desktop: '18px',\n wide: '20px'\n },\n cta: {\n mobile: '18px',\n tablet: '22px',\n wide: '24px'\n }\n} as const;\n\nexport const SPACING = {\n // Text component spacing\n headerMargin: '0 0 0.25rem 0',\n titleMargin: '0 0 0.75rem 0',\n subtitleMargin: '0 0 0.5rem 0',\n bodyMargin: '0 0 0.5rem 0',\n\n // Layout spacing\n textGap: '0',\n desktopPadding: '3rem',\n mobilePadding: '2rem',\n carouselGap: '0.75rem',\n\n // CTA spacing\n ctaPaddingDesktop: '16px 32px',\n ctaPaddingTablet: '12px 28px',\n ctaPaddingWide: '18px 36px'\n} as const;\n\nexport const DIMENSIONS = {\n // Banner height\n bannerHeightDesktop: '600px',\n bannerHeightMobile: '400px',\n\n // Text container\n textMaxWidth: '600px',\n\n // Carousel indicators\n indicatorSize: '12px',\n indicatorBorder: '2px'\n} as const;\n\nexport const COLORS = {\n // Text colors\n textWhite: '#ffffff',\n textDark: '#1D1D1B',\n textGray: '#666',\n\n // CTA colors\n ctaDark: '#888888',\n ctaBorder: '#888888',\n\n // Media fallback\n fallbackBg: '#f0f0f0',\n\n // Indicator colors\n indicatorBorder: 'rgba(255, 255, 255, 0.9)',\n indicatorActive: 'rgba(200, 200, 200, 0.9)',\n indicatorInactive: 'transparent'\n} as const;\n\nexport const TEXT_COLOR_MAP = {\n white: COLORS.textWhite,\n dark: COLORS.textDark\n} as const;\n\nexport const TRANSITIONS = {\n fast: '0.1s ease',\n default: '0.3s ease',\n slow: '0.6s cubic-bezier(0.4, 0, 0.2, 1)'\n} as const;\n\nexport const Z_INDEX = {\n background: 0,\n media: 0,\n gradient: 1,\n content: 2,\n controls: 3\n} as const;\n\nexport const MEDIA_QUERIES = {\n tablet: `@media (min-width: ${BREAKPOINTS.tablet + 1}px) and (max-width: ${BREAKPOINTS.desktop - 1}px)`,\n desktop: `@media (min-width: ${BREAKPOINTS.desktop}px) and (max-width: ${BREAKPOINTS.wide - 1}px)`,\n wide: `@media (min-width: ${BREAKPOINTS.wide}px)`,\n mobileAndBelow: `@media (max-width: ${BREAKPOINTS.tablet}px)`,\n desktopAndUp: `@media (min-width: ${BREAKPOINTS.desktop}px)`\n} as const;\n","/**\n * Marketing Banner Styled Component Mixins\n * Reusable CSS patterns and helper functions\n */\n\nimport { css } from '@emotion/react';\nimport { MEDIA_QUERIES, TRANSITIONS } from './theme';\n\n/**\n * Responsive font sizing\n * Applies font-size at different breakpoints\n */\nexport const responsiveFontSize = (sizes: Record<string, string>) => css`\n font-size: ${sizes.mobile};\n\n ${MEDIA_QUERIES.tablet} {\n font-size: ${sizes.tablet || sizes.mobile};\n }\n ${MEDIA_QUERIES.desktop} {\n font-size: ${sizes.desktop || sizes.tablet || sizes.mobile};\n }\n ${MEDIA_QUERIES.wide} {\n font-size: ${sizes.wide || sizes.desktop || sizes.tablet || sizes.mobile};\n }\n`;\n\n/**\n * Center text on mobile, preserve positioning on desktop\n */\nexport const centerOnMobile = css`\n ${MEDIA_QUERIES.mobileAndBelow} {\n text-align: center;\n }\n`;\n\n/**\n * Smooth transitions for interactive elements\n */\nexport const smoothTransition = (\n properties: string[] = ['background-color', 'color', 'border-color', 'transform', 'text-decoration']\n) => css`\n transition: ${properties.map((prop) => `${prop} ${TRANSITIONS.default}`).join(', ')};\n`;\n\n/**\n * Focus outline styling for accessibility\n */\nexport const focusOutline = (color: string) => css`\n &:focus-visible {\n outline: 2px solid ${color};\n outline-offset: 4px;\n }\n`;\n\n/**\n * Absolute fill (cover parent completely)\n */\nexport const absoluteFill = css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`;\n\n/**\n * Absolute positioning with dimensions\n */\nexport const absoluteFullSize = css`\n ${absoluteFill}\n width: 100%;\n height: 100%;\n`;\n\n/**\n * Center positioning (horizontal only)\n */\nexport const centerHorizontal = css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`;\n\n/**\n * Flex center alignment\n */\nexport const flexCenter = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n/**\n * Removes all margins and padding\n */\nexport const resetSpacing = css`\n margin: 0;\n padding: 0;\n`;\n\n/**\n * CTA hover state with transform\n */\nexport const ctaHoverState = (backgroundColor: string, borderColor: string, textColor: string) => css`\n &:hover {\n background-color: ${backgroundColor};\n color: ${textColor};\n border-color: ${borderColor};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n`;\n\n/**\n * Gradient overlay mixin\n */\nexport const gradientOverlay = (direction: string, startOpacity: number, endOpacity: number, baseColor: string) => css`\n background: linear-gradient(${direction}, rgba(${baseColor}, ${startOpacity}), rgba(${baseColor}, ${endOpacity}));\n`;\n\n/**\n * Radial gradient overlay mixin\n */\nexport const radialGradientOverlay = (startOpacity: number, endOpacity: number, baseColor: string) => css`\n background: radial-gradient(circle, rgba(${baseColor}, ${startOpacity}), rgba(${baseColor}, ${endOpacity}));\n`;\n","/**\n * BannerText Sub-Component\n * Renders text content (header, title, subtitle, bodyText) using the Typography component\n */\n\nimport React from 'react';\nimport type { BannerTextProps } from '../types';\nimport { PLACEHOLDER_VALUES } from '../constants';\nimport { Typography } from '../../typography';\nimport { TextContainer, HeaderTextWrapper, TitleWrapper, SubtitleWrapper, BodyTextWrapper } from './BannerText.styled';\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean,\n showPlaceholder?: boolean\n): string | undefined {\n if (isEditing === true) {\n if (!text) {\n return showPlaceholder ? placeholderValue : undefined;\n }\n return text;\n }\n if (isEditing === false && text === placeholderValue) {\n return undefined;\n }\n return text;\n}\n\nexport function BannerText({\n headerText,\n title,\n subtitle,\n bodyText,\n textColor = '#ffffff',\n textAlignment = 'left',\n testId,\n $,\n isEditing\n}: Readonly<BannerTextProps>): React.ReactElement | null {\n const header = getDisplayText(headerText, PLACEHOLDER_VALUES.header, isEditing);\n const titleDisplay = getDisplayText(title, PLACEHOLDER_VALUES.title, isEditing, true);\n const subtitleDisplay = getDisplayText(subtitle, PLACEHOLDER_VALUES.subtitle, isEditing);\n const body = getDisplayText(bodyText, PLACEHOLDER_VALUES.body, isEditing);\n\n if (!header && !titleDisplay && !subtitleDisplay && !body) {\n return null;\n }\n\n return (\n <TextContainer\n textAlignment={textAlignment}\n data-testid={testId}\n >\n {header && (\n <HeaderTextWrapper>\n <Typography\n variant=\"disclaimer\"\n inputText={header}\n color={textColor}\n aria-label={header}\n {...($?.header_text ?? {})}\n />\n </HeaderTextWrapper>\n )}\n {titleDisplay && (\n <TitleWrapper>\n <Typography\n variant=\"h2\"\n inputText={titleDisplay}\n color={textColor}\n aria-label={titleDisplay}\n {...($?.title ?? {})}\n />\n </TitleWrapper>\n )}\n {subtitleDisplay && (\n <SubtitleWrapper>\n <Typography\n variant=\"h3\"\n inputText={subtitleDisplay}\n color={textColor}\n aria-label={subtitleDisplay}\n {...($?.subtitle ?? {})}\n />\n </SubtitleWrapper>\n )}\n {body && (\n <BodyTextWrapper>\n <Typography\n variant=\"body\"\n inputText={body}\n color={textColor}\n aria-label={body}\n {...($?.body_text ?? {})}\n />\n </BodyTextWrapper>\n )}\n </TextContainer>\n );\n}\n","import React from 'react';\nimport { extractBynderMedia } from './utils';\nimport { MediaContainer, StyledImage, StyledVideo, PictureElement, SourceElement } from './BynderMedia.styled';\nimport type { BynderMediaProps } from './types';\n\nexport function BynderMedia({ bynder_media, $ }: Readonly<BynderMediaProps>): React.ReactElement | null {\n const [mediaInfo, setMediaInfo] = React.useState<ReturnType<typeof extractBynderMedia>>(\n extractBynderMedia(bynder_media)\n );\n const [hasError, setHasError] = React.useState(false);\n\n React.useEffect(() => {\n const extracted = extractBynderMedia(bynder_media);\n setMediaInfo(extracted);\n setHasError(!extracted);\n }, [bynder_media]);\n\n const handleMediaError = () => {\n setHasError(true);\n };\n\n if (!mediaInfo || hasError) {\n return null;\n }\n\n const mediaType = mediaInfo.type;\n const mediaAlt = mediaInfo.alt;\n const isResponsive = mediaInfo.isResponsive ?? false;\n const desktopUrl = mediaInfo.desktopUrl;\n const mobileUrl = mediaInfo.mobileUrl;\n const mediaUrl = mediaInfo.url;\n const imageFit = mediaInfo.imageFit ?? 'cover';\n const focusPoint = mediaInfo.focusPoint;\n const objectPosition = mediaInfo.objectPosition;\n const bgColor = mediaInfo.bgColor;\n\n if (mediaType === 'video') {\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <StyledVideo\n src={mediaUrl}\n onError={handleMediaError}\n autoPlay\n muted\n loop\n playsInline\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </MediaContainer>\n );\n }\n\n // Responsive image with picture element\n if (isResponsive && mobileUrl && desktopUrl) {\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <PictureElement>\n <SourceElement\n media=\"(max-width: 768px)\"\n srcSet={mobileUrl}\n />\n <SourceElement\n media=\"(min-width: 769px)\"\n srcSet={desktopUrl}\n />\n <StyledImage\n src={desktopUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </PictureElement>\n </MediaContainer>\n );\n }\n\n // Standard image\n return (\n <MediaContainer\n bgColor={bgColor}\n {...($ ?? {})}\n >\n <StyledImage\n src={mediaUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n objectFit={imageFit}\n focusPoint={focusPoint}\n objectPosition={objectPosition}\n {...($ ?? {})}\n />\n </MediaContainer>\n );\n}\n","import { BynderImageDataType, BynderMediaExtracted, BynderMediaType } from './types';\n\nexport function getMediaUrl(\n selected: BynderImageDataType['selected'],\n isPublic: boolean,\n previewUrls: BynderImageDataType['previewUrls']\n): string {\n const { url = '', type: fileType = '' } = selected ?? {};\n if (fileType === 'VIDEO') {\n if (isPublic) {\n return url;\n } else {\n return previewUrls?.[0] ?? '';\n }\n }\n return url;\n}\n\nfunction generateResponsiveUrl(baseUrl: string, aspectRatio: string): string {\n try {\n const url = new URL(baseUrl);\n const ioParams = url.searchParams.getAll('io');\n\n if (!ioParams.length) return baseUrl;\n\n const isFit = ioParams.some((io) => io.startsWith('transform:fit'));\n const hasFillWithDimensions = ioParams.some((io) => {\n if (!io.includes('transform:fill')) return false;\n return (\n (io.includes('width:') && io.includes('height:')) ||\n (url.searchParams.has('width') && url.searchParams.has('height'))\n );\n });\n\n const skipAspectRatio = isFit || hasFillWithDimensions;\n\n const updatedIoParams = ioParams.map((io) => {\n if (!skipAspectRatio && io.includes('transform:fill')) {\n return `${io},aspectratio:${aspectRatio}`;\n }\n return io;\n });\n\n const params: string[] = [];\n updatedIoParams.forEach((io) => params.push(`io=${io}`));\n params.push('quality=95');\n\n url.searchParams.forEach((value, key) => {\n if (key !== 'io') {\n params.push(`${key}=${value}`);\n }\n });\n\n return `${url.origin}${url.pathname}?${params.join('&')}`;\n } catch (error) {\n console.warn('Failed to generate responsive URL:', error);\n return baseUrl;\n }\n}\n\nfunction addDefaultTransform(baseUrl: string): string {\n // Basic type and emptiness validation before attempting URL parsing\n if (typeof baseUrl !== 'string') {\n console.error('addDefaultTransform: expected string URL, got', baseUrl);\n return '';\n }\n\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n console.error('addDefaultTransform: received empty URL string');\n return baseUrl;\n }\n\n // Only attempt to parse absolute or protocol-relative URLs. Anything else is treated\n // as misconfigured input and returned unchanged after logging.\n const looksAbsolute = trimmed.startsWith('http://') || trimmed.startsWith('https://') || trimmed.startsWith('//');\n\n if (!looksAbsolute) {\n console.error('addDefaultTransform: URL is not absolute', trimmed);\n return baseUrl;\n }\n\n try {\n const url = new URL(trimmed);\n if (!url.searchParams.has('io')) {\n return `${trimmed}?io=transform:fill&quality=95`;\n }\n return trimmed;\n } catch (error) {\n console.error(error);\n return baseUrl;\n }\n}\n\nfunction extractFocusPointFromUrl(url: string): { x: number; y: number } | undefined {\n try {\n const urlObj = new URL(url);\n const focuspoint = urlObj.searchParams.get('focuspoint');\n\n if (focuspoint) {\n const [x, y] = focuspoint.split(',').map(parseFloat);\n if (!isNaN(x) && !isNaN(y)) {\n return {\n x: Math.round(x * 100),\n y: Math.round(y * 100)\n };\n }\n }\n } catch (error) {\n console.warn('Failed to extract focus point from URL:', error);\n }\n return undefined;\n}\n\nfunction parseObjectPosition(position?: string): string {\n if (!position) return 'center';\n\n const normalized = position?.trim()?.toLowerCase();\n\n if (normalized === 'center' || normalized === 'center center') return 'center';\n if (\n normalized.includes('left') ||\n normalized.includes('right') ||\n normalized.includes('top') ||\n normalized.includes('bottom')\n ) {\n return normalized;\n }\n\n return 'center';\n}\n\nexport function extractBynderMedia(mediaJson?: string): BynderMediaExtracted | null {\n if (!mediaJson) {\n return null;\n }\n try {\n const parsed = JSON.parse(mediaJson);\n const firstImage = parsed?.image?.[0];\n const selected = firstImage?.selected;\n\n const mediaUrl = getMediaUrl(selected, firstImage?.isPublic, firstImage?.previewUrls);\n\n let mediaType: BynderMediaType = 'image';\n if (selected?.type === 'VIDEO') {\n mediaType = 'video';\n } else if (selected?.type === 'IMAGE' && mediaUrl?.toLowerCase().endsWith('.gif')) {\n mediaType = 'gif';\n }\n\n const isResponsive = selected?.imageType === 'customTransformation' || selected?.imageType === 'defaultPreset';\n\n const focusPoint = extractFocusPointFromUrl(mediaUrl);\n\n const objectPosition = parseObjectPosition(selected?.position);\n\n const bgColor = selected?.bgColor ?? undefined;\n\n const result: BynderMediaExtracted = {\n url: mediaUrl,\n type: mediaType,\n alt: selected?.altText ?? '',\n imageFit: selected?.fit ?? 'cover',\n focusPoint,\n objectPosition,\n bgColor\n };\n\n if (isResponsive && mediaType === 'image') {\n result.isResponsive = true;\n result.desktopUrl = generateResponsiveUrl(mediaUrl, '16x9');\n result.mobileUrl = generateResponsiveUrl(mediaUrl, '3x4');\n result.url = result.desktopUrl;\n } else if (mediaType === 'image') {\n result.url = addDefaultTransform(mediaUrl);\n }\n\n return result;\n } catch (error) {\n console.warn('Failed to parse bynder_media JSON:', error);\n return null;\n }\n}\n","import styled from '@emotion/styled';\n\nexport const MediaContainer = styled.div<{ bgColor?: string }>`\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: block;\n background-color: ${({ bgColor }) => bgColor ?? 'transparent'};\n`;\n\nexport const StyledImage = styled.img<{\n objectFit?: string;\n focusPoint?: { x: number; y: number };\n objectPosition?: string;\n}>`\n width: 100%;\n height: 100%;\n object-fit: ${({ objectFit }) => objectFit ?? 'cover'};\n object-position: ${({ focusPoint, objectPosition }) => {\n if (focusPoint) {\n return `${focusPoint.x}% ${focusPoint.y}%`;\n }\n return objectPosition ?? 'center';\n }};\n display: block;\n`;\n\nexport const StyledVideo = styled.video<{\n objectFit?: string;\n focusPoint?: { x: number; y: number };\n objectPosition?: string;\n}>`\n width: 100%;\n height: 100%;\n object-fit: ${({ objectFit }) => objectFit ?? 'cover'};\n object-position: ${({ focusPoint, objectPosition }) => {\n if (focusPoint) {\n return `${focusPoint.x}% ${focusPoint.y}%`;\n }\n return objectPosition ?? 'center';\n }};\n display: block;\n`;\n\nexport const PictureElement = styled.picture`\n width: 100%;\n height: 100%;\n display: block;\n`;\n\nexport const SourceElement = styled.source`\n display: block;\n`;\n","/**\n * useCarousel Hook\n * Manages carousel state and keyboard navigation\n */\n\nimport { useCallback, useEffect, useState, KeyboardEvent } from 'react';\nimport type { UseCarouselReturn } from '../types';\nimport { useReducedMotion } from './useReducedMotion';\n\ninterface UseCarouselOptions {\n totalSlides: number;\n autoRotate?: boolean;\n rotationInterval?: number;\n initialIndex?: number;\n}\n\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const { totalSlides, autoRotate = false, rotationInterval = 5000, initialIndex = 0 } = options;\n\n const validInitialIndex = totalSlides > 0 ? Math.min(initialIndex, totalSlides - 1) : 0;\n const [currentIndex, setCurrentIndex] = useState(validInitialIndex);\n const [isPaused, setIsPaused] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n\n const goToNext = useCallback(() => {\n if (totalSlides === 0) return;\n setCurrentIndex((prev) => (prev + 1) % totalSlides);\n }, [totalSlides]);\n\n const goToPrevious = useCallback(() => {\n if (totalSlides === 0) return;\n setCurrentIndex((prev) => (prev - 1 + totalSlides) % totalSlides);\n }, [totalSlides]);\n\n const goToSlide = useCallback(\n (index: number) => {\n if (index >= 0 && index < totalSlides) {\n setCurrentIndex(index);\n }\n },\n [totalSlides]\n );\n\n const pause = useCallback(() => {\n setIsPaused(true);\n }, []);\n\n const resume = useCallback(() => {\n setIsPaused(false);\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n goToPrevious();\n break;\n case 'ArrowRight':\n event.preventDefault();\n goToNext();\n break;\n case 'Home':\n event.preventDefault();\n goToSlide(0);\n break;\n case 'End':\n event.preventDefault();\n goToSlide(totalSlides - 1);\n break;\n }\n },\n [goToNext, goToPrevious, goToSlide, totalSlides]\n );\n\n useEffect(() => {\n if (currentIndex >= totalSlides && totalSlides > 0) {\n setCurrentIndex(totalSlides - 1);\n }\n }, [totalSlides, currentIndex]);\n\n // Auto-rotation effect\n useEffect(() => {\n if (!autoRotate || isPaused || prefersReducedMotion || totalSlides === 0) return;\n\n const intervalId = setInterval(goToNext, rotationInterval);\n return () => clearInterval(intervalId);\n }, [autoRotate, isPaused, prefersReducedMotion, rotationInterval, goToNext, totalSlides]);\n\n return {\n currentIndex,\n isPaused,\n totalSlides,\n goToNext,\n goToPrevious,\n goToSlide,\n pause,\n resume,\n handleKeyDown\n };\n}\n","/**\n * useReducedMotion Hook\n * Detects user's prefers-reduced-motion preference\n */\n\nimport { useEffect, useState } from 'react';\n\nexport function useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n // SSR-safe: Check if window is available\n if (typeof window === 'undefined' || !window.matchMedia) {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (event: MediaQueryListEvent) => {\n setPrefersReducedMotion(event.matches);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n","import { ButtonsBlock } from '../../button/types';\nimport { MarketingBannerProps, BannerData } from '../types';\n\nexport function hasCTA(banner: BannerData): boolean {\n return Boolean((banner?.cta_button as ButtonsBlock)?.buttons?.length);\n}\n\nexport function isCarouselMode(props: MarketingBannerProps): boolean {\n return Array.isArray(props?.banners) && props?.banners?.length > 1;\n}\n\nexport function hasMedia(banner: BannerData): boolean {\n return Boolean(banner?.bynder_media);\n}\n","import React from 'react';\nimport { NsIcon, NsIconVariants } from '@nuskin/foundation-ui-components';\nimport { ButtonContainer, StyledButton, StyledLabelText, StyledIconWrapper } from './Button.styled';\nimport {\n getButtonWidth,\n getIconSize,\n resolveDisabled,\n resolveIconName,\n resolveTarget,\n variantDefaults,\n REL_NOOPENER_NOREFERRER,\n DEFAULT_VARIANT,\n DEFAULT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_ICON_POSITION,\n DEFAULT_BUTTON_TYPE,\n DEFAULT_PLACEHOLDER_TEXT,\n DEFAULT_TARGET,\n BUTTON_TYPE_ROUNDED,\n BUTTON_TYPE_SQUARE,\n BORDER_COLOR_TRANSPARENT\n} from './helpers';\nimport { convertToLocalizedUrl } from '../utils/common';\nimport { ButtonProps, ButtonType } from './types';\n\nconst Button: React.FC<ButtonProps> = ({\n title,\n url,\n open_in_new_tab: target = DEFAULT_TARGET,\n variant,\n button_size: size,\n alignment,\n vertical_alignment,\n buttontype: buttonType = DEFAULT_BUTTON_TYPE,\n icon,\n iconposition: iconPosition,\n button_state: disabled,\n isEditing,\n $,\n parent$\n}) => {\n const resolvedVariant = variant ?? DEFAULT_VARIANT;\n const resolvedSize = size ?? DEFAULT_SIZE;\n const resolvedAlignment = alignment ?? DEFAULT_ALIGNMENT;\n const resolvedVerticalAlignment = vertical_alignment ?? 'top';\n const resolvedIconPosition = iconPosition ?? DEFAULT_ICON_POSITION;\n\n const resolvedButtonType: ButtonType =\n buttonType === BUTTON_TYPE_ROUNDED ? BUTTON_TYPE_ROUNDED : BUTTON_TYPE_SQUARE;\n\n const hrefProp = convertToLocalizedUrl(url);\n\n const variantDefault =\n variantDefaults[resolvedVariant as keyof typeof variantDefaults] ?? variantDefaults[DEFAULT_VARIANT];\n const buttonWidth = getButtonWidth(resolvedSize);\n const maxButtonWidth = getButtonWidth('large');\n const resolvedTarget = resolveTarget(target);\n const resolvedDisabled = resolveDisabled(disabled);\n const buttonBorder = ('border' in variantDefault ? variantDefault.border : undefined) ?? BORDER_COLOR_TRANSPARENT;\n\n const isLinkVariant = resolvedVariant === 'link';\n\n const IconName = resolveIconName(icon);\n const isValidNsIcon = typeof IconName === 'string' && IconName in NsIconVariants;\n const iconSize = getIconSize(resolvedSize);\n\n const renderIcon = (position: 'left' | 'right') => {\n if (!IconName || !isValidNsIcon || resolvedIconPosition !== position) return null;\n\n const iconColor = resolvedDisabled ? variantDefault.disabledText : variantDefault.text;\n\n return (\n <StyledIconWrapper\n position={position}\n data-button-icon\n >\n <NsIcon\n name={IconName}\n size={iconSize}\n colorOverride={iconColor}\n {...($?.icon ?? {})}\n />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n const labelTitle = title;\n\n if (labelTitle === '') {\n return DEFAULT_PLACEHOLDER_TEXT;\n }\n if (!isEditing && labelTitle !== DEFAULT_PLACEHOLDER_TEXT) {\n return labelTitle;\n }\n return labelTitle;\n };\n\n return (\n <ButtonContainer\n alignment={resolvedAlignment}\n verticalAlignment={resolvedVerticalAlignment}\n >\n <StyledButton\n $variant={resolvedVariant}\n $buttonWidth={buttonWidth}\n $buttonType={resolvedButtonType}\n $bg={variantDefault.bg}\n $hover={variantDefault.hover}\n $pressed={variantDefault.pressed}\n $text={variantDefault.text}\n $border={buttonBorder}\n $disabledBg={variantDefault.disabledBg}\n $disabledText={variantDefault.disabledText}\n $focusRing={variantDefault.focusRing}\n $maxButtonWidth={maxButtonWidth}\n $hoverText={\n 'hoverText' in variantDefault ? (variantDefault as { hoverText?: string }).hoverText : undefined\n }\n $underlineColor={\n 'underlineColor' in variantDefault\n ? (variantDefault as { underlineColor?: string }).underlineColor\n : undefined\n }\n href={hrefProp}\n data-variant={resolvedVariant}\n {...(resolvedTarget === '_blank' ? { target: '_blank', rel: REL_NOOPENER_NOREFERRER } : {})}\n aria-disabled={resolvedDisabled}\n disabled={resolvedDisabled}\n {...(parent$ ?? {})}\n >\n {isLinkVariant ? (\n <span data-link-content>\n {renderIcon('left')}\n <StyledLabelText\n data-button-label\n {...($?.title ?? {})}\n >\n {getLabelText()}\n </StyledLabelText>\n {renderIcon('right')}\n </span>\n ) : (\n <>\n {renderIcon('left')}\n <StyledLabelText {...($?.title ?? {})}>{getLabelText()}</StyledLabelText>\n {renderIcon('right')}\n </>\n )}\n </StyledButton>\n </ButtonContainer>\n );\n};\n\nexport default Button;\n","import { NsButton } from '@nuskin/foundation-ui-components';\nimport { styled } from '@nuskin/foundation-theme';\nimport type { ButtonAlignment, ButtonVariant, VerticalAlignment } from './types';\nimport { ROUNDED_BORDER_RADIUS, ICON_MARGIN, BUTTON_TYPE_ROUNDED } from './helpers';\n\nconst BUTTON_GAP = '2px';\nconst BUTTON_MIN_WIDTH = '70px';\nconst DESKTOP_BREAKPOINT = '769px';\nconst TABLET_BREAKPOINT = '768px';\nconst MOBILE_BREAKPOINT = '425px';\nconst DESKTOP_FONT_WEIGHT = 500;\nconst TABLET_MOBILE_FONT_WEIGHT = 400;\nconst FOCUS_OUTLINE_WIDTH = '2px';\nconst FONT_FAMILY_LORA = 'Lora, sans-serif';\nconst BORDER_COLOR_TRANSPARENT = 'transparent';\nconst JUSTIFY_CONTENT_CENTER = 'center';\nconst JUSTIFY_CONTENT_FLEX_END = 'flex-end';\nconst JUSTIFY_CONTENT_FLEX_START = 'flex-start';\n\nconst getJustifyContent = (alignment: ButtonAlignment | VerticalAlignment): string => {\n if (alignment === 'center') return JUSTIFY_CONTENT_CENTER;\n if (alignment === 'right' || alignment === 'bottom') return JUSTIFY_CONTENT_FLEX_END;\n return JUSTIFY_CONTENT_FLEX_START;\n};\n\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\nexport const ButtonContainer = styled('div')<{ alignment: ButtonAlignment; verticalAlignment: VerticalAlignment }>`\n display: flex;\n justify-content: ${(props) => getJustifyContent(props.alignment)};\n align-items: ${(props) => getJustifyContent(props.verticalAlignment)};\n width: 100%;\n height: 100%;\n`;\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $buttonWidth: string;\n $maxButtonWidth?: string;\n $buttonType: 'square' | 'rounded';\n $bg: string;\n $hover: string;\n $pressed: string;\n $text: string;\n $border: string;\n $disabledBg: string;\n $disabledText: string;\n $focusRing: string;\n $hoverText?: string;\n $underlineColor?: string;\n href?: string;\n}\n\nexport const StyledButton = styled(NsButton, { shouldForwardProp: noForward$ })<StyledButtonProps>`\n --btn-bg: ${(props) => props.$bg};\n --btn-hover: ${(props) => props.$hover};\n --btn-pressed: ${(props) => props.$pressed};\n --btn-color: ${(props) => props.$text};\n --btn-border: ${(props) => props.$border};\n --btn-disabled-bg: ${(props) => props.$disabledBg};\n --btn-disabled-color: ${(props) => props.$disabledText};\n --btn-focus: ${(props) => props.$focusRing};\n --btn-hover-text: ${(props) => props.$hoverText ?? props.$text};\n --btn-underline: ${(props) => props.$underlineColor ?? 'transparent'};\n\n &&&:link:not(:disabled):not([aria-disabled='true']),\n &&&:visited:not(:disabled):not([aria-disabled='true']) {\n color: var(--btn-color);\n text-decoration: none;\n }\n\n && {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${BUTTON_GAP};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${FONT_FAMILY_LORA};\n font-size: 14px;\n padding: 8px 10px;\n min-width: ${(props) => props.$buttonWidth ?? BUTTON_MIN_WIDTH};\n width: auto;\n max-width: ${(props) => props.$maxButtonWidth ?? props.$buttonWidth ?? BUTTON_MIN_WIDTH};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n ${(props) => props.$buttonType === BUTTON_TYPE_ROUNDED && `border-radius: ${ROUNDED_BORDER_RADIUS};`}\n }\n\n @media (min-width: ${DESKTOP_BREAKPOINT}) {\n && {\n font-weight: ${DESKTOP_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${TABLET_BREAKPOINT}) {\n && {\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${MOBILE_BREAKPOINT}) {\n && {\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n width: ${(props) => (props.$buttonWidth === '400px' ? '100%' : 'auto')};\n max-width: ${(props) => (props.$buttonWidth === '400px' ? '100%' : props.$maxButtonWidth)};\n min-width: ${(props) => (props.$buttonWidth === '400px' ? '0' : (props.$buttonWidth ?? BUTTON_MIN_WIDTH))};\n }\n }\n\n &&:hover {\n background: var(--btn-hover);\n }\n\n &&:active {\n background: var(--btn-pressed);\n }\n\n &&:focus {\n border: 1px solid var(--btn-border);\n }\n\n &&:not(:disabled):hover {\n background: var(--btn-hover);\n border-color: var(--btn-border);\n }\n\n &&:not(:disabled):active {\n background: var(--btn-pressed);\n border-color: var(--btn-border);\n }\n\n &&:focus-visible {\n outline: ${FOCUS_OUTLINE_WIDTH} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${BORDER_COLOR_TRANSPARENT};\n }\n\n &&:disabled:focus-visible {\n box-shadow: none;\n }\n\n &&[aria-disabled='true'],\n &&:disabled {\n pointer-events: none;\n cursor: not-allowed;\n background: var(--btn-disabled-bg);\n color: var(--btn-disabled-color);\n border-color: var(--btn-border);\n box-shadow: none;\n }\n\n &&&&:link[aria-disabled='true'],\n &&&&:link:disabled,\n &&&&:visited[aria-disabled='true'],\n &&&&:visited:disabled {\n color: var(--btn-disabled-color);\n text-decoration: none;\n }\n\n &&[data-variant='secondary'][aria-disabled='true'],\n &&[data-variant='secondary']:disabled {\n border-color: var(--btn-border);\n }\n\n &&[data-variant='link'] {\n border: none;\n border-radius: 0;\n padding: 0px;\n background: transparent;\n }\n\n &&[data-variant='link'] [data-link-content] {\n display: inline-flex;\n align-items: center;\n gap: ${BUTTON_GAP};\n border-bottom: 1px solid var(--btn-underline);\n }\n\n &&[data-variant='link']:hover {\n background: transparent;\n }\n\n &&[data-variant='link']:hover:not(:active) [data-link-content] {\n border-bottom-color: var(--btn-hover-text);\n }\n\n &&[data-variant='link']:hover [data-button-label],\n &&[data-variant='link']:hover [data-button-icon] {\n color: var(--btn-hover-text);\n }\n\n &&[data-variant='link']:hover [data-button-icon] svg path {\n fill: currentColor;\n }\n\n &&[data-variant='link']:hover [data-button-icon] svg polyline {\n stroke: currentColor;\n }\n\n &&[data-variant='link']:focus-visible {\n outline: none;\n }\n\n &&[data-variant='link']:focus-visible [data-link-content],\n &&[data-variant='link']:focus [data-link-content],\n &&[data-variant='link']:active [data-link-content] {\n border-bottom: none;\n }\n\n &&[data-variant='link']:active {\n background: transparent;\n }\n\n &&[data-variant='link']:active [data-link-content] {\n border-bottom-color: transparent;\n }\n &&[data-variant='link']:active [data-button-label],\n &&[data-variant='link']:active [data-button-icon] {\n color: var(--btn-color);\n }\n\n &&[data-variant='link']:active [data-button-icon] svg path {\n fill: currentColor;\n }\n\n &&[data-variant='link'][aria-disabled='true'],\n &&[data-variant='link']:disabled {\n background: transparent;\n }\n &&[data-variant='link'][aria-disabled='true'] [data-link-content],\n &&[data-variant='link']:disabled [data-link-content] {\n border-bottom-color: var(--btn-disabled-color);\n }\n &&[data-variant='link'][aria-disabled='true'] [data-button-label],\n &&[data-variant='link']:disabled [data-button-label],\n &&[data-variant='link'][aria-disabled='true'] [data-button-icon],\n &&[data-variant='link']:disabled [data-button-icon] {\n color: var(--btn-disabled-color);\n }\n &&[data-variant='link'][aria-disabled='true'] [data-button-icon] svg,\n &&[data-variant='link']:disabled [data-button-icon] svg {\n color: var(--btn-disabled-color);\n fill: currentColor;\n }\n`;\n\nexport const StyledLabelText = styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`;\n\ninterface StyledIconWrapperProps {\n position: 'left' | 'right';\n}\n\nconst ICON_MARGIN_PX = `${ICON_MARGIN}px`;\n\nexport const StyledIconWrapper = styled.span<StyledIconWrapperProps>`\n flex-shrink: 0;\n ${(props) => props.position === 'left' && `margin-right: ${ICON_MARGIN_PX};`}\n ${(props) => props.position === 'right' && `margin-left: ${ICON_MARGIN_PX};`}\n`;\n","import type { ButtonSize, LinkTarget } from './types';\n\nexport const ROUNDED_BORDER_RADIUS = '25px';\nexport const ICON_MARGIN = 2;\nexport const FLEX_SHRINK_ZERO = 0;\nexport const REL_NOOPENER_NOREFERRER = 'noopener noreferrer';\nexport const CSS_WORD_BREAK = 'break-word';\nexport const PROTOCOL_HTTP = 'http:';\nexport const PROTOCOL_HTTPS = 'https:';\nexport const DISABLED_STATE_STRING = 'disabled';\nexport const DEFAULT_VARIANT = 'primary';\nexport const DEFAULT_SIZE = 'small';\nexport const DEFAULT_ALIGNMENT = 'left';\nexport const DEFAULT_ICON_POSITION = 'left';\nexport const DEFAULT_BUTTON_TYPE = 'square';\nexport const DEFAULT_PLACEHOLDER_TEXT = 'Enter Title';\nexport const DEFAULT_TARGET = 'No';\nexport const BUTTON_TYPE_ROUNDED = 'rounded';\nexport const BUTTON_TYPE_SQUARE = 'square';\nexport const BORDER_COLOR_TRANSPARENT = 'transparent';\n\nexport function resolveTarget(target?: 'Yes' | 'No' | null): LinkTarget | undefined {\n if (target === 'Yes') {\n return '_blank';\n }\n return '_self';\n}\n\nexport function resolveDisabled(disabled?: boolean | string | null): boolean {\n if (disabled == null) {\n return false;\n }\n if (typeof disabled === 'string') {\n return disabled === DISABLED_STATE_STRING;\n }\n return disabled;\n}\n\nconst iconAliasMap: Record<string, string> = {\n arrow: 'arrowRight'\n};\n\nexport function resolveIconName(iconName?: string): string | undefined {\n if (!iconName) return undefined;\n return iconAliasMap[iconName] ?? iconName;\n}\n\nexport const variantDefaults = {\n primary: {\n bg: '#1f1f1f',\n hover: '#3a3530',\n pressed: '#000000',\n text: '#ffffff',\n disabledBg: '#e6e6e6',\n disabledText: '#9e9e9e',\n focusRing: '#4f84b4'\n },\n secondary: {\n bg: '#ffffff',\n hover: '#f2f2f2',\n pressed: '#e6e6e6',\n text: '#000000',\n border: '#626262',\n disabledBg: '#f2f2f2',\n disabledText: '#b0b0b0',\n focusRing: '#4f84b4'\n },\n link: {\n bg: 'transparent',\n hover: 'transparent',\n pressed: 'transparent',\n text: '#000000',\n border: 'transparent',\n disabledBg: 'transparent',\n disabledText: '#9e9e9e',\n focusRing: '#000000',\n hoverText: '#626262',\n underlineColor: '#000000'\n }\n} as const;\n\nconst widthBySize: Record<ButtonSize, string> = {\n large: '400px',\n medium: '250px',\n small: '130px'\n};\n\nconst DEFAULT_BUTTON_WIDTH = '130px';\n\nexport function getButtonWidth(size: string): string {\n return widthBySize[size] ?? DEFAULT_BUTTON_WIDTH;\n}\n\nconst iconSizeByButtonSize: Record<ButtonSize, ButtonSize> = {\n small: 'small',\n medium: 'medium',\n large: 'medium'\n};\n\nconst DEFAULT_ICON_SIZE: ButtonSize = 'medium';\n\nexport function getIconSize(size: string): ButtonSize {\n return iconSizeByButtonSize[size] ?? DEFAULT_ICON_SIZE;\n}\n","const hasLocalePrefix = (path: string): boolean => /^\\/[a-z]{2}\\/[a-z]{2}(\\/|$)/i.test(path);\nconst isProtocolRelativeUrl = (value: string): boolean => /^\\/\\/[^/]/.test(value);\nconst isAbsoluteHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\nconst isPlainDomain = (value: string): boolean =>\n /^(?:www\\.)?[a-z0-9-]+\\.[a-z]{2,}(\\/.*)?$/i.test(value) && !value.startsWith('/');\n\nfunction replaceLocalePlaceholders(value: string, country: string, language: string): string {\n return value\n .replaceAll(/\\{%\\s*region\\s*}/gi, country)\n .replaceAll(/\\{%\\s*language\\s*}/gi, language)\n .replaceAll(/%7B%\\s*region\\s*%7D/gi, country)\n .replaceAll(/%7B%\\s*language\\s*%7D/gi, language);\n}\n\nfunction buildNuSkinUrl(params: {\n url: URL;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n}): string {\n const { url, current, localizedBase, country, language } = params;\n const normalizedOrigin = `${current.protocol}//${current.host}`;\n const pathname = replaceLocalePlaceholders(url.pathname, country, language);\n if (hasLocalePrefix(pathname)) {\n return `${normalizedOrigin}${pathname}${url.search}${url.hash}`;\n }\n return `${localizedBase}${pathname}${url.search}${url.hash}`;\n}\n\nfunction needsLocaleRewrite(url: URL, currentHost: string): boolean {\n const isMainWebsiteHost = url.host === currentHost || url.host === 'nuskin.com' || url.host === 'www.nuskin.com';\n const hasPlaceholders = /\\{%\\s*(region|language)\\s*\\}/i.test(url.pathname);\n return isMainWebsiteHost || hasLocalePrefix(url.pathname) || hasPlaceholders;\n}\n\nfunction resolveNuSkinUrl(params: {\n url: URL;\n fallback: string;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n}): string {\n const { url, fallback, current, localizedBase, country, language } = params;\n\n return needsLocaleRewrite(url, current.host)\n ? buildNuSkinUrl({ url, current, localizedBase, country, language })\n : fallback;\n}\n\nfunction resolveExternalOrAbsoluteUrl(params: {\n trimmedUrl: string;\n current: URL;\n localizedBase: string;\n country: string;\n language: string;\n isNuSkinDomain: (host: string) => boolean;\n}): string | undefined {\n const { trimmedUrl, current, localizedBase, country, language, isNuSkinDomain } = params;\n\n if (isProtocolRelativeUrl(trimmedUrl)) {\n const url = new URL(`https:${trimmedUrl}`);\n const fallback = `https:${trimmedUrl}`;\n return isNuSkinDomain(url.host)\n ? resolveNuSkinUrl({ url, fallback, current, localizedBase, country, language })\n : fallback;\n }\n\n if (isAbsoluteHttpUrl(trimmedUrl)) {\n const url = new URL(trimmedUrl);\n return isNuSkinDomain(url.host)\n ? resolveNuSkinUrl({ url, fallback: trimmedUrl, current, localizedBase, country, language })\n : trimmedUrl;\n }\n\n if (isPlainDomain(trimmedUrl)) {\n return `https://${trimmedUrl}`;\n }\n\n return undefined;\n}\n\nfunction buildLocalizedRelativeUrl(params: {\n trimmedUrl: string;\n country: string;\n language: string;\n localizedBase: string;\n}): string {\n const { trimmedUrl, country, language, localizedBase } = params;\n const hadTrailingSlash = trimmedUrl.endsWith('/');\n let relativeUrl = trimmedUrl.replace(/^\\.[a-z]{2,}/i, '');\n relativeUrl = replaceLocalePlaceholders(relativeUrl, country, language);\n if (hasLocalePrefix(relativeUrl)) {\n relativeUrl = relativeUrl.replace(/^\\/[a-z]{2}\\/[a-z]{2}/i, '');\n }\n relativeUrl = relativeUrl.replace(/^\\/+/, '/');\n if (!relativeUrl.startsWith('/')) {\n relativeUrl = `/${relativeUrl}`;\n }\n\n if (relativeUrl === '/' || relativeUrl === '') {\n return hadTrailingSlash ? `${localizedBase}/` : localizedBase;\n }\n\n return `${localizedBase}${relativeUrl}`;\n}\n\nexport const convertToLocalizedUrl = (inputUrl?: string): string | undefined => {\n if (!inputUrl) return inputUrl;\n const trimmedUrl = inputUrl.trim();\n\n if (globalThis.window?.location == null) {\n return trimmedUrl;\n }\n\n const current = new URL(globalThis.window.location.href);\n const [, country, language] = current.pathname.split('/');\n if (!country || !language) return trimmedUrl;\n\n const localizedBase = `${current.protocol}//${current.host}/${country}/${language}`;\n const isNuSkinDomain = (host: string): boolean =>\n host === current.host || host.endsWith('.nuskin.com') || host === 'nuskin.com';\n\n const resolvedUrl = resolveExternalOrAbsoluteUrl({\n trimmedUrl,\n current,\n localizedBase,\n country,\n language,\n isNuSkinDomain\n });\n if (resolvedUrl !== undefined) {\n return resolvedUrl;\n }\n\n return buildLocalizedRelativeUrl({ trimmedUrl, country, language, localizedBase });\n};\n","import React from 'react';\nimport Button from './Button';\nimport { ButtonProps, ButtonBlockProp } from './types';\n\nexport type ButtonWrapperProps = {\n readonly parent$?: Record<string, unknown>;\n readonly alignment?: ButtonProps['alignment'];\n readonly isEditing?: boolean;\n} & Partial<ButtonBlockProp>;\n\nfunction getButtonProps(button: ButtonBlockProp | null | undefined): { buttonProps: ButtonProps | null } {\n if (!button) return { buttonProps: null };\n const hasButtons = 'buttons' in button && Array.isArray(button.buttons);\n if (hasButtons) {\n const buttons = button.buttons;\n const entry: ButtonProps | undefined = buttons?.[0];\n const buttonProps = entry ?? null;\n return { buttonProps };\n }\n return { buttonProps: button as ButtonProps };\n}\n\nconst Buttons: React.FC<ButtonWrapperProps> = (props) => {\n const { parent$ = {}, alignment, isEditing = false, ...button } = props;\n const { buttonProps } = getButtonProps(Object.keys(button).length > 0 ? (button as ButtonBlockProp) : null);\n if (!buttonProps || (!buttonProps.title && !isEditing)) return null;\n return (\n <Button\n {...buttonProps}\n alignment={alignment ?? buttonProps.alignment}\n parent$={parent$}\n isEditing={isEditing}\n />\n );\n};\n\nexport default Buttons;\n","/**\n * MarketingBanner Styled Components\n * All styling for the Marketing Banner component\n */\n\nimport styled from '@emotion/styled';\nimport type { GradientDirection, GradientDepth } from './types';\nimport { DIMENSIONS, SPACING, COLORS, Z_INDEX, TRANSITIONS, MEDIA_QUERIES } from './styles/theme';\nimport {\n absoluteFill,\n centerHorizontal,\n gradientOverlay,\n radialGradientOverlay,\n smoothTransition\n} from './styles/mixins';\n\nexport const BannerContainer = styled.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`;\n\nexport const CarouselWrapper = styled.div`\n position: relative;\n width: 100%;\n`;\n\nexport const CarouselTrack = styled.div<{ currentIndex: number; totalSlides: number }>`\n display: flex;\n transition: transform ${TRANSITIONS.slow};\n transform: translateX(-${({ currentIndex }) => currentIndex * 100}%);\n`;\n\nexport const BannerSlide = styled.div`\n min-width: 100%;\n position: relative;\n`;\n\nexport const BannerContent = styled.div<{ hasMedia: boolean; $isNested?: boolean }>`\n position: relative;\n min-height: ${({ hasMedia, $isNested }) => {\n if (!hasMedia) return 'auto';\n if ($isNested) return DIMENSIONS.bannerHeightMobile;\n return DIMENSIONS.bannerHeightDesktop;\n }};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${MEDIA_QUERIES.mobileAndBelow} {\n min-height: ${({ hasMedia }) => (hasMedia ? DIMENSIONS.bannerHeightMobile : 'auto')};\n }\n`;\n\nexport const MediaWrapper = styled.div`\n ${absoluteFill}\n z-index: ${Z_INDEX.media};\n`;\n\nexport const TextContentWrapper = styled.div<{\n position?: 'left' | 'center' | 'right';\n}>`\n position: relative;\n z-index: ${Z_INDEX.content};\n display: flex;\n flex-direction: column;\n gap: ${SPACING.textGap};\n justify-content: center;\n padding: ${SPACING.desktopPadding};\n max-width: ${DIMENSIONS.textMaxWidth};\n width: auto;\n\n /* Base positioning from props (applies to desktop/tablet) */\n ${({ position = 'left' }) => {\n if (position === 'center') {\n return `\n margin: 0 auto;\n align-items: center;\n text-align: center;\n `;\n }\n if (position === 'right') {\n return `\n margin-left: auto;\n margin-right: 0;\n align-items: flex-end;\n text-align: right;\n `;\n }\n return `\n margin-right: auto;\n align-items: flex-start;\n text-align: left;\n `;\n }}\n\n /* Mobile: Override to always center content */\n ${MEDIA_QUERIES.mobileAndBelow} {\n padding: ${SPACING.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n overflow: hidden;\n }\n`;\n\nexport const GradientOverlay = styled.div<{\n direction: GradientDirection;\n depth: GradientDepth;\n color: 'black' | 'white';\n}>`\n ${absoluteFill}\n z-index: ${Z_INDEX.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({ direction, depth, color }) => {\n const opacities = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n };\n const { start, end } = opacities[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n\n if (direction === 'leftToRight') {\n return gradientOverlay('to right', start, end, baseColor);\n }\n if (direction === 'rightToLeft') {\n return gradientOverlay('to left', start, end, baseColor);\n }\n if (direction === 'radial') {\n return radialGradientOverlay(start, end, baseColor);\n }\n return '';\n }}\n\n /* Mobile: Override to always use radial gradient */\n ${MEDIA_QUERIES.mobileAndBelow} {\n ${({ depth, color }) => {\n const opacities = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n };\n const { start, end } = opacities[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n return radialGradientOverlay(start, end, baseColor);\n }}\n }\n`;\n\nexport const ButtonWrapper = styled.div`\n /* Mobile: Always center the button */\n display: flex;\n justify-content: center;\n max-width: min(520px, 90vw);\n\n /* Desktop: Follow parent alignment from TextContentWrapper */\n ${MEDIA_QUERIES.tablet} {\n justify-content: inherit;\n }\n\n ${MEDIA_QUERIES.desktop} {\n justify-content: inherit;\n }\n`;\n\nexport const CarouselControls = styled.div`\n position: absolute;\n bottom: ${SPACING.carouselGap};\n ${centerHorizontal}\n z-index: ${Z_INDEX.controls};\n display: flex;\n gap: ${SPACING.carouselGap};\n align-items: center;\n\n ${MEDIA_QUERIES.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`;\n\nexport const Indicator = styled.button<{ active: boolean }>`\n width: ${DIMENSIONS.indicatorSize};\n height: ${DIMENSIONS.indicatorSize};\n border-radius: 50%;\n border: ${DIMENSIONS.indicatorBorder} solid ${COLORS.indicatorBorder};\n background-color: ${({ active }) => (active ? COLORS.indicatorActive : COLORS.indicatorInactive)};\n cursor: pointer;\n padding: 0;\n box-shadow:\n 0 0 0 1px rgba(0, 0, 0, 0.35),\n 0 1px 3px rgba(0, 0, 0, 0.25);\n ${smoothTransition(['all'])}\n\n &:hover {\n background-color: ${COLORS.indicatorActive};\n transform: scale(1.15);\n }\n`;\n","/**\n * MarketingBanner Component\n * Main component with single banner and automatic carousel mode\n */\n\nimport React from 'react';\nimport { BannerText } from './components';\nimport { BynderMedia } from '../bynder-media';\nimport { useCarousel } from './hooks';\nimport { hasCTA, hasMedia, isCarouselMode } from './utils/utils';\nimport type { MarketingBannerProps, BannerData } from './types';\nimport { TEXT_COLOR_MAP } from './styles/theme';\nimport { Buttons as Button } from '../button';\nimport {\n BannerContainer,\n CarouselWrapper,\n CarouselTrack,\n BannerSlide,\n BannerContent,\n MediaWrapper,\n TextContentWrapper,\n GradientOverlay,\n ButtonWrapper,\n CarouselControls,\n Indicator\n} from './MarketingBanner.styled';\n\nconst getEditTags = (value: unknown): Record<string, unknown> | undefined => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n};\n\nconst getButtonParentEditTags = (banner: BannerData): Record<string, unknown> => {\n const blockEditTags =\n banner.cta_button && 'buttons' in banner.cta_button ? banner.cta_button.$?.buttons__0 : undefined;\n return getEditTags(blockEditTags) ?? getEditTags(banner.$?.cta_button) ?? {};\n};\n\nconst renderBanner = (banner: BannerData, isEditing: boolean, index: number, isNested?: boolean) => {\n const showMedia = hasMedia(banner);\n const showCTA = hasCTA(banner);\n\n const baseTestId = 'marketing-banner';\n const resolvedTextColor = TEXT_COLOR_MAP[banner.text_color ?? 'white'];\n\n const showGradient = banner.gradient?.show_gradient === true;\n const position = banner.content_position ?? banner.position ?? 'left';\n\n // Derive gradient color from text color (inverse)\n const gradientColor = banner.text_color === 'dark' ? 'white' : 'black';\n\n // Derive gradient direction from position\n let gradientDirection: 'leftToRight' | 'rightToLeft' | 'radial';\n if (position === 'left') {\n gradientDirection = 'leftToRight';\n } else if (position === 'right') {\n gradientDirection = 'rightToLeft';\n } else {\n gradientDirection = 'radial';\n }\n\n // Determine text alignment based on position\n let textAlignment: 'left' | 'center' | 'right';\n if (position === 'center') {\n textAlignment = 'center';\n } else if (position === 'right') {\n textAlignment = 'right';\n } else {\n textAlignment = 'left';\n }\n\n const gradientDepth = banner.gradient?.gradient_depth ?? 'md';\n const bynderEditTags = getEditTags(banner.$?.bynder_media);\n const buttonParentEditTags = getButtonParentEditTags(banner);\n\n return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent\n hasMedia={showMedia}\n $isNested={isNested}\n >\n {showMedia && (\n <MediaWrapper>\n <BynderMedia\n bynder_media={banner.bynder_media}\n $={bynderEditTags}\n />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay\n direction={gradientDirection}\n depth={gradientDepth}\n color={gradientColor}\n />\n )}\n\n <TextContentWrapper position={position}>\n <BannerText\n headerText={banner.header_text}\n title={banner.title}\n subtitle={banner.subtitle}\n bodyText={banner.body_text}\n textColor={resolvedTextColor}\n textAlignment={textAlignment}\n testId={`${baseTestId}-${index}-text`}\n $={banner.$}\n isEditing={isEditing}\n />\n\n {showCTA && (\n <ButtonWrapper>\n <Button\n {...banner?.cta_button}\n alignment={textAlignment}\n parent$={buttonParentEditTags}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </TextContentWrapper>\n </BannerContent>\n </BannerSlide>\n );\n};\n\nexport default function MarketingBannerComponent(props: Readonly<MarketingBannerProps>): React.ReactElement {\n const { banners, rotation_interval, isEditing = false, isNested = false } = props;\n\n const isCarousel = isCarouselMode(props);\n\n const carousel = useCarousel({\n totalSlides: banners.length,\n autoRotate: isCarousel,\n rotationInterval: rotation_interval ?? 5000,\n initialIndex: 0\n });\n\n return (\n <BannerContainer\n data-testid={'marketing-banner'}\n onKeyDown={isCarousel ? carousel.handleKeyDown : undefined}\n onMouseEnter={isCarousel ? carousel.pause : undefined}\n onMouseLeave={isCarousel ? carousel.resume : undefined}\n >\n <CarouselWrapper>\n <CarouselTrack\n currentIndex={carousel.currentIndex}\n totalSlides={banners.length}\n >\n {banners.map((banner, index) => renderBanner(banner, isEditing, index, isNested))}\n </CarouselTrack>\n </CarouselWrapper>\n\n {isCarousel && (\n <CarouselControls>\n {banners.map((banner, index) => (\n <Indicator\n key={`${'banner'}-indicator-${index}-${banner.title ?? ''}`}\n active={index === carousel.currentIndex}\n onClick={() => carousel.goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </CarouselControls>\n )}\n </BannerContainer>\n );\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport type { StyledSpacingProps, StyledDividerProps } from './types';\nimport { BREAKPOINTS } from './types';\n\nexport const StyledSpacingContainer = styled('div')<StyledSpacingProps>(({ vertical_padding, divider_alignment }) => {\n const verticalScaleMap = {\n none: { mobile: 0, tablet: 0, desktop: 0, ultra: 0 },\n small: { mobile: 8, tablet: 8, desktop: 8, ultra: 12 },\n medium: { mobile: 12, tablet: 12, desktop: 16, ultra: 20 },\n large: { mobile: 16, tablet: 16, desktop: 24, ultra: 32 }\n } as const;\n\n const v = verticalScaleMap[vertical_padding];\n\n const alignItemsMap = {\n center: 'center',\n right: 'flex-end',\n left: 'flex-start'\n } as const;\n const alignItems = alignItemsMap[divider_alignment ?? 'left'];\n\n return {\n display: 'flex',\n flexDirection: 'column',\n alignItems,\n\n paddingTop: `${v.mobile}px`,\n paddingBottom: `${v.mobile}px`,\n\n [`@media ${BREAKPOINTS.tablet}`]: {\n paddingTop: `${v.tablet}px`,\n paddingBottom: `${v.tablet}px`\n },\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n paddingTop: `${v.desktop}px`,\n paddingBottom: `${v.desktop}px`\n },\n\n [`@media ${BREAKPOINTS.ultra}`]: {\n paddingTop: `${v.ultra}px`,\n paddingBottom: `${v.ultra}px`\n }\n };\n});\n\nexport const StyledDividerLine = styled('div')<StyledDividerProps>(({\n divider_style,\n divider_thickness_px,\n divider_color,\n divider_gradient,\n divider_width_percent\n}) => {\n const base: Record<string, string | number> = {\n width: `${Math.max(0, Math.min(100, divider_width_percent))}%`\n };\n\n if (divider_gradient && divider_style !== 'none') {\n base.height = `${divider_thickness_px}px`;\n base.backgroundImage = divider_gradient ?? '';\n base.backgroundSize = '100% 100%';\n\n if (divider_style === 'dashed') {\n const dashLength = Math.max(12, divider_thickness_px * 4);\n const gapLength = Math.max(6, divider_thickness_px * 2);\n base.maskImage =\n `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n base.WebkitMaskImage =\n `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n } else if (divider_style === 'dotted') {\n const dotSize = Math.max(2, divider_thickness_px);\n const spacing = Math.max(8, dotSize * 3);\n const radius = dotSize / 2;\n\n base.maskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` + `black 99%, transparent 100%)`;\n base.WebkitMaskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` + `black 99%, transparent 100%)`;\n base.maskSize = `${spacing}px ${divider_thickness_px}px`;\n base.WebkitMaskSize = `${spacing}px ${divider_thickness_px}px`;\n base.maskRepeat = 'repeat-x';\n base.WebkitMaskRepeat = 'repeat-x';\n base.maskPosition = '0 center';\n base.WebkitMaskPosition = '0 center';\n }\n } else if (divider_style === 'none') {\n base.height = `${divider_thickness_px}px`;\n base.backgroundImage = divider_gradient ?? '';\n } else {\n base.borderBottomStyle = divider_style;\n base.borderBottomWidth = `${divider_thickness_px}px`;\n base.borderBottomColor = divider_color;\n base.height = 0;\n }\n\n return base;\n});\n","export type PaddingScale = 'none' | 'small' | 'medium' | 'large';\nexport type DividerStyle = 'solid' | 'dashed' | 'dotted' | 'none';\nexport type DividerThickness = 'thin' | 'medium' | 'thick';\nexport type BreakpointName = 'mobile' | 'tablet' | 'desktop' | 'ultra';\n\nexport interface SpacingDividerProps {\n vertical_padding?: PaddingScale;\n divider_style?: DividerStyle;\n divider_thickness?: DividerThickness;\n divider_color?: string;\n divider_gradient_preset?: 'none' | 'soft' | 'bold' | 'faint';\n divider_width_percent?: number;\n divider_alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StyledSpacingProps {\n vertical_padding: PaddingScale;\n divider_alignment: 'left' | 'center' | 'right';\n}\n\nexport interface StyledDividerProps {\n divider_style: DividerStyle;\n divider_thickness_px: number;\n divider_color: string;\n divider_gradient?: string;\n divider_width_percent: number;\n}\n\nexport const THICKNESS_PX: Record<DividerThickness, number> = {\n thin: 1,\n medium: 2,\n thick: 4\n};\n\nexport const BREAKPOINTS: Record<BreakpointName, string> = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px) and (max-width: 1439px)',\n ultra: '(min-width: 1440px)'\n};\n","/**\n * Validates if a string is a valid hex color\n * @param value - The string to validate\n * @returns true if valid hex color, false otherwise\n */\nexport const isValidHex = (value?: string): boolean => {\n if (!value) return false;\n return /^#([A-Fa-f0-9]{6})$/.test(value);\n};\n\n/**\n * Converts hex color to RGB object\n * @param hex - The hex color string (e.g., '#FF0000')\n * @returns RGB object or undefined if invalid hex\n */\nconst hexToRgb = (hex?: string): { r: number; g: number; b: number } | undefined => {\n if (!hex || !/^#([A-Fa-f0-9]{6})$/.test(hex)) return undefined;\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return { r, g, b };\n};\n\n/**\n * Generates CSS gradient string based on preset and base color\n * @param preset - The gradient preset type\n * @param baseHex - The base hex color for the gradient\n * @returns CSS gradient string or undefined\n */\nexport const gradientPresetCss = (\n preset?: 'none' | 'soft' | 'bold' | 'faint',\n baseHex?: string\n): string | undefined => {\n if (!preset || preset === 'none') return undefined;\n const rgb = hexToRgb(baseHex) ?? { r: 0, g: 0, b: 0 };\n switch (preset) {\n case 'soft':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.3), rgba(${rgb.r},${rgb.g},${rgb.b},0.8))`;\n case 'bold':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.6), rgba(${rgb.r},${rgb.g},${rgb.b},1.0))`;\n case 'faint':\n return `linear-gradient(90deg, rgba(${rgb.r},${rgb.g},${rgb.b},0.4), rgba(${rgb.r},${rgb.g},${rgb.b},0.4))`;\n default:\n return undefined;\n }\n};\n","import React from 'react';\nimport { StyledSpacingContainer, StyledDividerLine } from './SpacingDivider.styled';\nimport type { SpacingDividerProps } from './types';\nimport { THICKNESS_PX } from './types';\nimport { isValidHex, gradientPresetCss } from './utils/utils';\n\nconst DEFAULT_HEX = '#000000';\n\nconst SpacingDivider = (props: SpacingDividerProps): React.ReactElement | null => {\n const {\n vertical_padding = 'small',\n divider_style = 'solid',\n divider_thickness = 'thin',\n divider_color,\n divider_gradient_preset = 'none',\n divider_width_percent = 100,\n divider_alignment = 'left'\n } = props;\n\n const divider_thickness_px = THICKNESS_PX[divider_thickness];\n const final_divider_color = isValidHex(divider_color) ? divider_color! : DEFAULT_HEX;\n const divider_gradient = gradientPresetCss(divider_gradient_preset, final_divider_color);\n\n return (\n <StyledSpacingContainer\n vertical_padding={vertical_padding}\n divider_alignment={divider_alignment}\n >\n {divider_style !== 'none' && (\n <StyledDividerLine\n divider_style={divider_style}\n divider_thickness_px={divider_thickness_px}\n divider_color={final_divider_color}\n divider_gradient={divider_gradient}\n divider_width_percent={divider_width_percent ?? 100}\n aria-hidden=\"true\"\n />\n )}\n </StyledSpacingContainer>\n );\n};\n\nexport default SpacingDivider;\n","import React, { useEffect } from 'react';\n\nimport { CarouselContainer, InnerWrapper, Slider, ArrowButton, EmptyPlaceholder } from './shared';\nimport { useCarouselLayout } from './hooks/useCarouselLayout';\n\nimport type { CarouselProps } from './types';\n\n/** Carousel layout: slider with arrows and dots. Uses shared hook and UI with carousel container. */\nexport function Carousel<T = unknown>(props: CarouselProps<T>) {\n const { dotsPosition, isEditing } = props;\n const carouselProps = { ...props };\n\n useEffect(() => {\n import('slick-carousel/slick/slick.css');\n import('slick-carousel/slick/slick-theme.css');\n }, []);\n\n const {\n gapPx,\n containerHeight,\n stackedItemHeight,\n stackedItemMaxHeight,\n isVariableWidth,\n containerClassName,\n effectiveFullWidth,\n parent$,\n $,\n emptyBlockParentClass,\n emptyPlaceholderText,\n sliderRef,\n sliderSettings,\n carouselKey,\n renderSlides,\n hasSlides,\n showArrowsOnDesktop,\n slidesToShow,\n placeholderSlotsToShow,\n slidesLength,\n isVariablePresetDesktop,\n getSlideWidth,\n goToPrevious,\n goToNext,\n containerRef\n } = useCarouselLayout(carouselProps);\n\n const renderEmptySlot = (slotIndex: number) => (\n <section\n key={`empty-slide-${slotIndex}`}\n aria-roledescription=\"slide\"\n aria-label={`Empty slide ${slotIndex + 1} of ${placeholderSlotsToShow}`}\n style={\n isVariablePresetDesktop\n ? {\n width: getSlideWidth(slotIndex)\n }\n : undefined\n }\n >\n <EmptyPlaceholder\n emptyBlockParentClass={emptyBlockParentClass}\n text={emptyPlaceholderText}\n totalSlides={slidesLength}\n $={$}\n />\n </section>\n );\n\n return (\n <CarouselContainer\n ref={containerRef}\n gap={gapPx}\n height={containerHeight}\n columnHeight={stackedItemHeight}\n maxColumnHeight={stackedItemMaxHeight}\n isVariableWidth={isVariableWidth}\n className={containerClassName}\n aria-label=\"Carousel Control\"\n fullWidth={effectiveFullWidth}\n dotsInside={dotsPosition !== 'outside'}\n {...(parent$ ?? {})}\n >\n <InnerWrapper>\n <div\n {...($?.['slides'] ?? {})}\n {...($?.['slides__parent'] ?? {})}\n {...{ 'data-add-direction': 'horizontal' }}\n >\n <Slider\n ref={sliderRef}\n {...sliderSettings}\n key={carouselKey}\n >\n {hasSlides && renderSlides()}\n {isEditing &&\n (hasSlides\n ? slidesLength < placeholderSlotsToShow &&\n Array.from({ length: placeholderSlotsToShow - slidesLength }).map((_, offset) =>\n renderEmptySlot(slidesLength + offset)\n )\n : Array.from({ length: placeholderSlotsToShow }).map((_, index) =>\n renderEmptySlot(index)\n ))}\n </Slider>\n </div>\n\n {showArrowsOnDesktop && slidesLength > slidesToShow && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={goToPrevious}\n aria-label=\"Previous slide\"\n fullWidth={effectiveFullWidth}\n >\n ‹\n </ArrowButton>\n <ArrowButton\n direction=\"next\"\n onClick={goToNext}\n aria-label=\"Next slide\"\n fullWidth={effectiveFullWidth}\n >\n ›\n </ArrowButton>\n </>\n )}\n </InnerWrapper>\n </CarouselContainer>\n );\n}\n\nexport default Carousel;\n","import React from 'react';\n\nimport SliderImport from 'react-slick';\nimport * as Styled from './CarouselLayout.styled';\n\nimport { unwrapComponent } from './utils';\n\nconst Slider = unwrapComponent(SliderImport);\nconst CarouselContainer = unwrapComponent(Styled.CarouselContainer);\nconst ArrowButton = unwrapComponent(Styled.ArrowButton);\nconst InnerWrapper = unwrapComponent(Styled.InnerWrapper);\nconst SlideSection = unwrapComponent(Styled.SlideSection);\nconst SlideInner = unwrapComponent(Styled.SlideInner);\nconst SlideContentInner = unwrapComponent(Styled.SlideContentInner);\nconst EmptyPlaceholder = unwrapComponent(Styled.EmptyPlaceholder);\n\nexport {\n Slider,\n CarouselContainer,\n ArrowButton,\n InnerWrapper,\n SlideSection,\n SlideInner,\n SlideContentInner,\n EmptyPlaceholder\n};\n\nexport interface SliderRefInstance {\n slickPrev: () => void;\n slickNext: () => void;\n}\n\nexport function getSlideKey(index: number): string {\n return `slide-${index}`;\n}\n\nexport function renderSlidesContent<T>(params: {\n slidesForRender: T[];\n renderSlide: (slide: T, index: number) => React.ReactNode;\n presetColumns: number;\n gap: number;\n isVariableWidth: boolean;\n getSlideWidth: (index: number) => string;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n useFlexLayout?: boolean;\n $?: Record<string, unknown>;\n}) {\n const {\n slidesForRender,\n renderSlide,\n presetColumns,\n gap,\n isVariableWidth,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout = false,\n $ = {}\n } = params;\n\n const addSlideEditTags = {\n ...($?.['slides'] ?? undefined),\n ...($?.['slides__parent'] ?? undefined),\n 'data-add-direction': 'horizontal'\n };\n\n const flexBasis = presetColumns === 1 ? '100%' : `calc((100% - ${(presetColumns - 1) * gap}px) / ${presetColumns})`;\n\n return slidesForRender.map((slide, index) => {\n const slideWidth = !useFlexLayout && isVariableWidth ? getSlideWidth(index) : undefined;\n const currentFlexBasis = useFlexLayout && isVariableWidth ? getSlideWidth(index) : flexBasis;\n\n return (\n <SlideSection\n key={getSlideKey(index)}\n aria-roledescription=\"slide\"\n aria-label={`Slide ${index + 1} of ${slidesForRender.length}`}\n useFlexLayout={useFlexLayout}\n stackedVerticalGap={stackedVerticalGap}\n stackedItemHeight={stackedItemHeight}\n stackedItemMaxHeight={stackedItemMaxHeight}\n slideWidth={slideWidth}\n flexBasis={currentFlexBasis}\n isVariableWidth={isVariableWidth}\n /**\n * react-slick (variableWidth) reads width from the direct child element's inline style.\n * Without this, widths can be ignored and extra slides may \"peek\" into view.\n */\n style={slideWidth ? { width: slideWidth } : undefined}\n {...addSlideEditTags}\n {...($?.[`slides__${index}`] ?? {})}\n >\n <SlideInner\n stackedItemHeight={stackedItemHeight}\n stackedItemMaxHeight={stackedItemMaxHeight}\n >\n <SlideContentInner>{renderSlide(slide, index)}</SlideContentInner>\n </SlideInner>\n </SlideSection>\n );\n });\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, MIN_EMPTY_PLACEHOLDER_HEIGHT_PX, MIN_SLIDE_WIDTH_PX } from './types';\n\nfunction getArrowButtonPosition(\n fullWidth: boolean | undefined,\n direction: 'prev' | 'next',\n fullVal: number,\n nonFullVal: number\n): { left?: number; right?: number } {\n if (fullWidth) {\n return direction === 'prev' ? { left: 16 } : { right: 16 };\n }\n return direction === 'prev' ? { left: nonFullVal } : { right: nonFullVal };\n}\n\nexport const CarouselContainer = styled('section')<{\n gap: number;\n height: string;\n columnHeight: string;\n maxColumnHeight?: number;\n isVariableWidth: boolean;\n fullWidth?: boolean;\n dotsInside?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth, dotsInside = true }) => ({\n position: 'relative',\n width: '100%',\n textAlign: 'left',\n padding: '0 80px 50px',\n height,\n boxSizing: 'border-box',\n\n ...(fullWidth && {\n padding: '0'\n }),\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n padding: '0 40px 50px',\n ...(fullWidth && {\n padding: '0'\n })\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n padding: '0 20px 40px',\n ...(fullWidth && {\n padding: '0'\n })\n },\n\n '.slick-slider': {\n position: 'relative',\n display: 'block',\n height: '100%'\n },\n\n '.slick-list': {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n boxSizing: 'border-box',\n ...(columnHeight === 'auto' && { minHeight: 280 }),\n margin: `0 -${gap / 2}px`,\n padding: '1px 0'\n },\n\n '.slick-track': {\n display: 'flex',\n height: '100%',\n justifyContent: 'flex-start',\n boxSizing: 'border-box',\n margin: 0,\n marginLeft: 0\n },\n\n '.slick-slide': {\n flexShrink: 0,\n padding: `0 ${gap / 2}px`,\n height: columnHeight === 'auto' ? 'auto' : columnHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n ...(maxColumnHeight != null && { maxHeight: `${maxColumnHeight}px` }),\n\n '& > div': {\n height: '100%',\n width: '100%',\n\n '& > div': {\n height: '100%',\n width: '100%'\n }\n }\n },\n\n '.slick-dots': {\n position: dotsInside ? 'absolute' : 'static',\n bottom: dotsInside ? 0 : 'auto',\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: dotsInside ? 0 : '16px 0 0',\n width: '100%',\n left: 0,\n\n li: {\n margin: 0,\n width: 12,\n height: 12,\n\n button: {\n width: 12,\n height: 12,\n padding: 0,\n borderRadius: '50%',\n border: 'none',\n background: '#ccc',\n textIndent: -9999,\n cursor: 'pointer',\n transition: 'background 0.2s ease, transform 0.2s ease',\n\n '&:before': {\n display: 'none'\n }\n },\n\n '&.slick-active button': {\n background: '#4A90E2'\n }\n }\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n '.slick-dots': {\n bottom: dotsInside ? 8 : 'auto',\n gap: 6,\n\n li: {\n width: 10,\n height: 10,\n\n button: {\n width: 10,\n height: 10\n }\n }\n }\n }\n}));\n\nexport const SlideSection = styled('section')<{\n useFlexLayout: boolean;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n slideWidth?: string;\n flexBasis?: string;\n isVariableWidth: boolean;\n}>(\n ({\n useFlexLayout,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n slideWidth,\n flexBasis,\n isVariableWidth\n }) => ({\n maxWidth: 'none',\n margin: useFlexLayout ? 0 : `0 0 ${stackedVerticalGap}px`,\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n ...(stackedItemMaxHeight != null && { maxHeight: stackedItemMaxHeight }),\n width: slideWidth,\n flex: useFlexLayout && flexBasis ? `0 0 ${flexBasis}` : undefined,\n flexShrink: 0,\n boxSizing: useFlexLayout ? 'border-box' : undefined,\n minWidth: isVariableWidth ? 0 : MIN_SLIDE_WIDTH_PX,\n position: 'relative'\n })\n);\n\nexport const SlideInner = styled('div')<{\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n}>(({ stackedItemHeight }) => ({\n width: '100%',\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n textAlign: 'left',\n overflow: 'hidden',\n minWidth: 0,\n position: 'relative'\n}));\n\nexport const SlideContentInner = styled('div')({\n maxWidth: '100%',\n width: '100%',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n});\n\nexport const ArrowButton = styled('button')<{\n direction: 'prev' | 'next';\n fullWidth?: boolean;\n}>(({ direction, fullWidth }) => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'rgba(0, 0, 0, 0.5)',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n width: 48,\n height: 48,\n padding: 0,\n margin: 0,\n cursor: 'pointer',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 0.2s ease',\n fontSize: 24,\n lineHeight: 1,\n verticalAlign: 'middle',\n ...getArrowButtonPosition(fullWidth, direction, 8, -60),\n\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.7)'\n },\n\n '&:focus': {\n outline: '2px solid #4A90E2',\n outlineOffset: 2\n },\n\n '&:disabled': {\n opacity: 0.3,\n cursor: 'not-allowed'\n },\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n width: 40,\n height: 40,\n ...getArrowButtonPosition(fullWidth, direction, 4, -45)\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n width: 32,\n height: 32,\n fontSize: 20,\n ...getArrowButtonPosition(fullWidth, direction, 2, -35)\n }\n}));\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%',\n containerType: 'inline-size'\n});\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: `${MIN_EMPTY_PLACEHOLDER_HEIGHT_PX}px`,\n border: '1px dashed #ccc',\n boxSizing: 'border-box'\n});\n\ntype EmptyPlaceholderProps = {\n readonly emptyBlockParentClass?: string;\n readonly text?: string;\n readonly totalSlides?: number;\n readonly $?: Record<string, unknown>;\n};\n\nexport const EmptyPlaceholder = ({\n emptyBlockParentClass,\n text = 'Add items',\n totalSlides = 0,\n $ = {}\n}: EmptyPlaceholderProps) => (\n <EmptyPlaceholderWrapper\n className={totalSlides === 0 ? emptyBlockParentClass : undefined}\n {...(totalSlides === 0 ? ($?.slides ?? {}) : {})}\n {...(totalSlides === 0 ? ($?.['slides__parent'] ?? {}) : {})}\n {...($?.[`slides__${totalSlides - 1}`] ?? {})}\n data-add-direction=\"horizontal\"\n >\n {text}\n </EmptyPlaceholderWrapper>\n);\n","/** Shared breakpoints and layout constants for column-control and carousel. */\nexport const DEVICE_SIZES = {\n ULTRA_SMALL: 320,\n EXTRA_SMALL: 480,\n SMALL: 600,\n MEDIUM: 768,\n LARGE: 992,\n EXTRA_LARGE: 1200,\n ULTRA_LARGE: 1440,\n SUPER_LARGE: 1920\n} as const;\n\n/** Max height of a slide/card when height is content-driven. */\nexport const MAX_SLIDE_HEIGHT_PX = 750;\n","import React from 'react';\n\n/** Gap between columns/slides: preset name → px (none: 0, small: 8, medium: 12, large: 16) */\nexport type GapPreset = 'none' | 'small' | 'medium' | 'large';\n\nexport const GAP_PRESET_VALUES: Record<GapPreset, number> = {\n none: 0,\n small: 8,\n medium: 12,\n large: 16\n};\n\n/** Resolve gap to pixels. Accepts preset name or legacy number (for backward compatibility). */\nexport function getGapPx(gap?: GapPreset | number): number {\n if (gap === undefined) return GAP_PRESET_VALUES.large;\n if (typeof gap === 'number') return gap;\n return GAP_PRESET_VALUES[gap];\n}\n\nexport type CarouselPreset =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'two-small-one-large'\n | 'four-equal';\n\nexport type Alignment = 'left' | 'center' | 'right';\n\n/** Render callback: consumer renders each slide from their data. */\nexport type CarouselRenderSlide<T = unknown> = (slide: T, index: number) => React.ReactNode;\n\nexport type CarouselProps<T = unknown> = Readonly<{\n /** Slide data (CMS/consumer shape). Rendered via renderSlide. */\n slides: T[];\n /** Called to render each slide. Receives slide data and index. */\n renderSlide: CarouselRenderSlide<T>;\n preset?: CarouselPreset;\n /** Convenience props that override autoplay.enabled */\n autoplayEnabled?: boolean;\n /** Autoplay interval in seconds (e.g. 3 = 3s). Passed to slider as ms internally. */\n autoplayDuration?: number;\n /** Convenience props that override navigation.showArrows */\n showArrows?: boolean;\n /** Convenience props that override navigation.showPagination */\n showPagination?: boolean;\n onSlideChange?: (index: number) => void;\n className?: string;\n slickSettings?: Record<string, unknown>;\n /** Spacing between columns/slides: 'none'|'small'|'medium'|'large' (0,8,12,16px) or legacy number */\n gap?: GapPreset | number;\n height?: string;\n fullWidth?: boolean;\n emptyBlockParentClass?: string;\n /** Override empty placeholder label. Defaults: \"Add items to the column control\" (grid) or \"Add items to the carousel\" (carousel). */\n emptyPlaceholderText?: string;\n /** Position of slider dots: 'inside' overlays within the slider; 'outside' places them below as part of the height. Defaults to 'inside'. */\n dotsPosition?: 'inside' | 'outside';\n isEditing?: boolean;\n parent$?: Record<string, unknown>;\n $?: Record<string, unknown>;\n}>;\n\nexport interface CarouselSlideProps {\n children: React.ReactNode;\n isActive: boolean;\n preset: CarouselPreset;\n alignment: Alignment;\n index: number;\n slideCount: number;\n}\n\nexport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX } from '../utils/deviceConstants';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\nexport type DeviceSize = keyof typeof DEVICE_SIZES;\nexport const MIN_SLIDE_WIDTH_PX = 280;\nexport const MIN_SLIDE_HEIGHT_PX = 320;\nexport const MIN_EMPTY_PLACEHOLDER_HEIGHT_PX = 220;\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 4;\n","/** Preset name used by both column-control and carousel. */\ntype PresetName =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'two-small-one-large'\n | 'four-equal';\n\nexport function getPresetColumns(preset: PresetName | undefined): number {\n switch (preset) {\n case 'single-full':\n return 1;\n case 'two-equal':\n case 'two-small-large':\n return 2;\n case 'three-equal':\n case 'two-small-one-large':\n return 3;\n case 'four-equal':\n return 4;\n default:\n return 1;\n }\n}\n","import type { CarouselProps } from './types';\nimport { DEVICE_SIZES } from './types';\nexport { getPresetColumns } from '../utils/viewportLayoutUtils';\n\nexport function unwrapComponent<T>(mod: T): T {\n if (!mod || typeof mod === 'function') return mod;\n if (typeof mod === 'object' && mod !== null) {\n const candidate = (mod as { default?: unknown }).default;\n if (candidate) return candidate as T;\n }\n return mod;\n}\n\nexport function isVariableWidthPreset(preset: CarouselProps['preset'], windowWidth: number): boolean {\n if (windowWidth < DEVICE_SIZES.LARGE) return false;\n return preset === 'two-small-large' || preset === 'two-small-one-large';\n}\n\nexport function getVariableSlideWidth(\n preset: CarouselProps['preset'],\n index: number,\n windowWidth: number,\n gapPx: number,\n containerWidthPx: number\n): string {\n if (windowWidth < DEVICE_SIZES.LARGE) return 'auto';\n\n // Use measured container width; fallback to window width if not yet measured\n const avail = containerWidthPx > 0 ? containerWidthPx : windowWidth;\n\n // Base width needs to account for gaps to fill container after negative margins.\n const baseWidth = avail + gapPx;\n\n if (preset === 'two-small-large') {\n const pos = ((index % 2) + 2) % 2;\n const smallPx = Math.round(baseWidth / 3);\n const largePx = baseWidth - smallPx;\n return pos === 0 ? `${smallPx}px` : `${largePx}px`;\n }\n\n if (preset === 'two-small-one-large') {\n const pos = ((index % 3) + 3) % 3;\n const smallPx = Math.round(baseWidth * 0.25);\n const largePx = baseWidth - smallPx * 2;\n return pos === 1 ? `${largePx}px` : `${smallPx}px`;\n }\n\n return 'auto';\n}\n\nexport function getSlidesToShowByViewport(windowWidth: number, presetColumns: number): number {\n if (windowWidth >= DEVICE_SIZES.EXTRA_LARGE) return Math.min(presetColumns, 4);\n if (windowWidth >= DEVICE_SIZES.LARGE) return Math.min(presetColumns, 3);\n if (windowWidth >= DEVICE_SIZES.SMALL) return Math.min(presetColumns, 2);\n return 1;\n}\n\nexport function buildCarouselResponsiveSettings(params: {\n presetColumns: number;\n slidesLength: number;\n isEditing: boolean;\n shouldShowDots: boolean;\n isVariableWidth: boolean;\n}) {\n const { presetColumns, shouldShowDots, isVariableWidth } = params;\n\n const toShowSmall = 1;\n const toShowMedium = Math.min(presetColumns, 2);\n const toShowLarge = Math.min(presetColumns, 3);\n\n return [\n {\n breakpoint: DEVICE_SIZES.SMALL,\n settings: {\n slidesToShow: toShowSmall,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.MEDIUM,\n settings: {\n slidesToShow: toShowMedium,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.LARGE,\n settings: {\n slidesToShow: toShowLarge,\n slidesToScroll: 1,\n swipeToSlide: true,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: isVariableWidth\n }\n }\n ];\n}\n","import { useRef, useMemo, useState, useEffect, useCallback } from 'react';\n\nimport {\n getPresetColumns,\n getSlidesToShowByViewport,\n isVariableWidthPreset,\n getVariableSlideWidth,\n buildCarouselResponsiveSettings\n} from '../utils';\nimport { renderSlidesContent } from '../shared';\nimport { useCarouselResize } from '../hooks/useCarouselResize';\n\nimport type { CarouselProps } from '../types';\nimport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX, getGapPx } from '../types';\nimport type { SliderRefInstance } from '../shared';\n\n/** Shared hook for carousel layout behavior. */\nexport function useCarouselLayout<T>(props: CarouselProps<T>) {\n const {\n slides,\n renderSlide,\n preset = 'single-full',\n autoplayEnabled = false,\n autoplayDuration = 3,\n showPagination = true,\n onSlideChange,\n className,\n slickSettings,\n gap = 'medium',\n height,\n fullWidth,\n isEditing = false,\n emptyBlockParentClass,\n emptyPlaceholderText: emptyPlaceholderTextProp,\n parent$,\n $\n } = props;\n\n const gapPx = getGapPx(gap);\n const emptyPlaceholderText = emptyPlaceholderTextProp ?? 'Add items to the carousel';\n const effectiveFullWidth = fullWidth ?? false;\n\n const { windowWidth, carouselKey } = useCarouselResize(preset, slides.length);\n\n // Measure container width in px for react-slick to handle variableWidth correctly.\n const containerRef = useRef<HTMLElement | null>(null);\n const [containerWidthPx, setContainerWidthPx] = useState<number>(0);\n const updateContainerWidth = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n const style = globalThis.getComputedStyle(el);\n const pl = Number.parseFloat(style.paddingLeft) || 0;\n const pr = Number.parseFloat(style.paddingRight) || 0;\n setContainerWidthPx(el.offsetWidth - pl - pr);\n }, []);\n useEffect(() => {\n updateContainerWidth();\n if (typeof ResizeObserver === 'undefined' || !containerRef.current) return;\n const ro = new ResizeObserver(updateContainerWidth);\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [updateContainerWidth]);\n\n const presetColumns = useMemo(() => getPresetColumns(preset), [preset]);\n const targetSlidesToShow = getSlidesToShowByViewport(windowWidth, presetColumns);\n const isVariableWidth = isVariableWidthPreset(preset, windowWidth);\n const getSlideWidth = useMemo(\n () => (index: number) => getVariableSlideWidth(preset, index, windowWidth, gapPx, containerWidthPx),\n [preset, windowWidth, gapPx, containerWidthPx]\n );\n\n const effectiveAutoplayEnabled = autoplayEnabled;\n const effectiveShowPagination = showPagination;\n const showArrowsOnDesktop = windowWidth > DEVICE_SIZES.LARGE;\n\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport = false;\n const stackedItemHeight = 'auto';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = 0;\n const containerHeight = height ?? 'auto';\n\n const shouldShowDots = effectiveShowPagination && slides.length > 1 && windowWidth <= DEVICE_SIZES.LARGE;\n\n const sliderRef = useRef<SliderRefInstance | null>(null);\n const goToPrevious = () => sliderRef.current?.slickPrev();\n const goToNext = () => sliderRef.current?.slickNext();\n\n const containerClassName = [className].filter(Boolean).join(' ');\n // Set variableWidth=true and slidesToScroll=1 for asymmetric presets on desktop.\n const isVariablePresetDesktop = isVariableWidth && windowWidth > DEVICE_SIZES.MEDIUM;\n const effectiveSlidesToShow = isVariablePresetDesktop ? 1 : targetSlidesToShow;\n const placeholderSlotsToShow = isVariablePresetDesktop ? targetSlidesToShow : effectiveSlidesToShow;\n\n const responsiveSettings = useMemo(\n () =>\n buildCarouselResponsiveSettings({\n presetColumns,\n slidesLength: slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n }),\n [presetColumns, slides.length, isEditing, shouldShowDots, isVariableWidth]\n );\n\n const slidesToScroll = 1;\n const sliderSettings = {\n dots: shouldShowDots,\n infinite: slides.length > effectiveSlidesToShow,\n speed: 500,\n slidesToShow: effectiveSlidesToShow,\n slidesToScroll,\n autoplay: effectiveAutoplayEnabled,\n autoplaySpeed: autoplayDuration * 1000,\n pauseOnHover: true,\n arrows: false,\n variableWidth: isVariablePresetDesktop,\n swipe: true,\n draggable: true,\n beforeChange: (_: number, next: number) => onSlideChange?.(next),\n responsive: responsiveSettings,\n ...slickSettings\n };\n\n const renderSlides = (useFlexLayout = false) =>\n renderSlidesContent({\n slidesForRender: slides,\n renderSlide,\n presetColumns,\n gap: gapPx,\n isVariableWidth: isVariablePresetDesktop,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout,\n $\n });\n\n return {\n gapPx,\n containerHeight,\n stackedItemHeight,\n stackedItemMaxHeight,\n isVariableWidth,\n containerClassName,\n effectiveFullWidth,\n parent$,\n $,\n emptyBlockParentClass,\n emptyPlaceholderText,\n sliderRef,\n sliderSettings,\n carouselKey,\n renderSlides,\n slidesForRender: slides,\n hasSlides: slides.length > 0,\n isStackedViewport,\n isTabletGridViewport,\n preset,\n showArrowsOnDesktop,\n slidesToShow: effectiveSlidesToShow,\n placeholderSlotsToShow,\n slidesLength: slides.length,\n isVariablePresetDesktop,\n getSlideWidth,\n goToPrevious,\n goToNext,\n containerRef\n };\n}\n","import { useEffect, useState } from 'react';\n\nimport type { CarouselProps } from '../types';\n\nexport interface UseCarouselResizeResult {\n windowWidth: number;\n carouselKey: string;\n}\n\nexport function useCarouselResize(preset: CarouselProps['preset'], slideCount: number): UseCarouselResizeResult {\n const [windowWidth, setWindowWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 0);\n\n const [carouselKey, setCarouselKey] = useState(`carousel-${preset}-${slideCount}-${Date.now()}`);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n let timeoutId: NodeJS.Timeout;\n\n const handleResize = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n setWindowWidth(window.innerWidth);\n setCarouselKey(`carousel-${preset}-${slideCount}-${Date.now()}`);\n }, 150);\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', handleResize);\n };\n }, [preset, slideCount]);\n\n return { windowWidth, carouselKey };\n}\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, MIN_EMPTY_PLACEHOLDER_HEIGHT_PX, MIN_SLIDE_WIDTH_PX } from './types';\n\nexport const ColumnControlContainer = styled('section')<{\n gap: number;\n height: string;\n columnHeight: string;\n maxColumnHeight?: number;\n fullWidth?: boolean;\n dotsInside?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth, dotsInside = true }) => ({\n position: 'relative',\n width: '100%',\n textAlign: 'center',\n padding: '0 80px 50px',\n height,\n boxSizing: 'border-box',\n\n ...(fullWidth && {\n padding: '0'\n }),\n\n [`@media (max-width: ${DEVICE_SIZES.MEDIUM}px)`]: {\n padding: fullWidth ? '0' : '0 40px 50px'\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n // On mobile, always use full-width (no horizontal padding) regardless of fullWidth prop\n padding: '0 0 40px'\n },\n\n '.slick-slider': {\n position: 'relative',\n display: 'block',\n height: '100%'\n },\n\n '.slick-list': {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n ...(columnHeight === 'auto' && { minHeight: 280 }),\n margin: `0 -${gap / 2}px`,\n // Add a subtle buffer so slides don't touch the container edges\n padding: '1px 0'\n },\n\n '.slick-track': {\n display: 'flex',\n height: '100%'\n },\n\n '.slick-slide': {\n padding: `0 ${gap / 2}px`,\n // When auto, fill track height so slide content can occupy full height; otherwise use fixed columnHeight\n height: columnHeight === 'auto' ? 'auto' : columnHeight,\n minHeight: 0,\n ...(maxColumnHeight != null && { maxHeight: `${maxColumnHeight}px` }),\n\n '& > div': {\n height: '100%',\n width: '100%',\n\n '& > div': {\n height: '100%',\n width: '100%'\n }\n }\n },\n\n '.slick-dots': {\n position: dotsInside ? 'absolute' : 'static',\n // When inside, overlay within the slider; when outside, place below as part of layout\n bottom: dotsInside ? 12 : 'auto',\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: dotsInside ? 0 : '16px 0 0',\n width: '100%',\n left: 0,\n\n li: {\n margin: 0,\n width: 12,\n height: 12,\n\n button: {\n width: 12,\n height: 12,\n padding: 0,\n borderRadius: '50%',\n border: 'none',\n background: '#ccc',\n textIndent: -9999,\n cursor: 'pointer',\n transition: 'background 0.2s ease, transform 0.2s ease',\n\n '&:before': {\n display: 'none'\n }\n },\n\n '&.slick-active button': {\n background: '#4A90E2'\n }\n }\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n '.slick-dots': {\n bottom: dotsInside ? 8 : 'auto',\n gap: 6,\n\n li: {\n width: 10,\n height: 10,\n\n button: {\n width: 10,\n height: 10\n }\n }\n }\n }\n}));\n\nexport const TabletGridContainer = styled('div')<{ gap: number }>(({ gap }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${gap}px`,\n width: '100%'\n}));\n\nexport const SlideSection = styled('section')<{\n useFlexLayout: boolean;\n stackedVerticalGap: number;\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n slideWidth?: string;\n flexBasis?: string;\n gap: number;\n columns: number;\n}>(\n ({\n useFlexLayout,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n slideWidth,\n flexBasis,\n gap,\n columns\n }) => ({\n maxWidth: 'none',\n margin: useFlexLayout ? 0 : `0 0 ${stackedVerticalGap}px`,\n // Fill parent height so renderSlide content can occupy full slide height\n height: stackedItemHeight,\n minHeight: 0,\n ...(stackedItemMaxHeight != null && { maxHeight: stackedItemMaxHeight }),\n width: slideWidth,\n flex: useFlexLayout && flexBasis ? `0 0 ${flexBasis}` : undefined,\n boxSizing: useFlexLayout ? 'border-box' : undefined,\n // Prevent slides from shrinking too small for readability\n minWidth: MIN_SLIDE_WIDTH_PX,\n position: 'relative',\n\n // Narrow desktop: for 4‑column layouts, drop to 3 columns so cards don't wrap\n // Uses EXTRA_LARGE (1200px) to catch widths where 4 * MIN_SLIDE_WIDTH_PX + gaps no longer fit.\n [`@media (max-width: ${DEVICE_SIZES.EXTRA_LARGE}px)`]: {\n ...(useFlexLayout &&\n columns === 4 && {\n flex: `0 0 calc((100% - ${gap * 2}px) / 3)`,\n maxWidth: `calc((100% - ${gap * 2}px) / 3)`,\n minWidth: 0\n })\n },\n\n // Tablet: at most 2 columns, each using (100% - gap) / 2 so gap is respected\n // Use LARGE breakpoint (1024px) so 2-column behavior kicks in for typical tablet widths.\n [`@media (max-width: ${DEVICE_SIZES.LARGE}px)`]: {\n ...(useFlexLayout && {\n flex: `0 0 calc((100% - ${gap}px) / 2)`,\n maxWidth: `calc((100% - ${gap}px) / 2)`,\n minWidth: 0\n })\n },\n\n // Mobile: single column, each item full width for widths ≤ 600px\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n ...(useFlexLayout && {\n flex: '0 0 100%',\n maxWidth: '100%',\n minWidth: 0\n })\n }\n })\n);\n\nexport const SlideInner = styled('div')<{\n stackedItemHeight: string;\n stackedItemMaxHeight?: number;\n}>(({ stackedItemHeight }) => ({\n width: '100%',\n // Fill slide section so content wrapper can stretch to full height\n height: stackedItemHeight === 'auto' ? '100%' : stackedItemHeight,\n minHeight: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n // Remove justifyContent: center so SlideContentInner can fill full height\n alignItems: 'stretch',\n textAlign: 'left',\n overflow: 'hidden',\n minWidth: 0,\n position: 'relative'\n}));\n\nexport const SlideContentInner = styled('div')({\n maxWidth: '100%',\n width: '100%',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n});\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%'\n});\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: `${MIN_EMPTY_PLACEHOLDER_HEIGHT_PX}px`,\n border: '1px dashed #ccc',\n boxSizing: 'border-box'\n});\n","import React from 'react';\n\n/** Gap between columns/slides: preset name → px (none: 0, small: 8, medium: 12, large: 16) */\nexport type GapPreset = 'none' | 'small' | 'medium' | 'large';\n\nexport const GAP_PRESET_VALUES: Record<GapPreset, number> = {\n none: 0,\n small: 8,\n medium: 12,\n large: 16\n};\n\n/** Resolve gap to pixels. Accepts preset name or legacy number (for backward compatibility). */\nexport function getGapPx(gap?: GapPreset | number): number {\n if (gap === undefined) return GAP_PRESET_VALUES.large;\n if (typeof gap === 'number') return gap;\n return GAP_PRESET_VALUES[gap];\n}\n\nexport type ColumnControlGridLayout = '2x1' | '3x1' | '4x1' | '2x2' | '3x2' | '4x2';\n\nexport type Alignment = 'left' | 'center' | 'right';\n\n/** Render callback: consumer renders each slide from their data. */\nexport type RenderSlideCallback<T = unknown> = (slide: T, index: number) => React.ReactNode;\n\nexport type ColumnControlProps<T = unknown> = Readonly<{\n /** Slide data (CMS/consumer shape). Rendered via renderSlide. */\n slides: T[];\n /** Called to render each slide. Receives slide data and index. */\n renderSlide: RenderSlideCallback<T>;\n /** Grid layout for ColumnControl (grid) mode: \"<columns>x<rows>\" (e.g. \"3x2\"). */\n layout?: ColumnControlGridLayout;\n className?: string;\n /** Spacing between columns/slides: 'none'|'small'|'medium'|'large' (0,8,12,16px) or legacy number */\n gap?: GapPreset | number;\n height?: string;\n fullWidth?: boolean;\n emptyBlockParentClass?: string;\n /** Override empty placeholder label. Defaults: \"Add items to the column control\". */\n emptyPlaceholderText?: string;\n isEditing?: boolean;\n parent$?: Record<string, unknown>;\n $?: Record<string, unknown>;\n}>;\n\nexport interface ColumnControlSlideProps {\n children: React.ReactNode;\n isActive: boolean;\n alignment: Alignment;\n index: number;\n slideCount: number;\n}\n\nexport { DEVICE_SIZES, MAX_SLIDE_HEIGHT_PX } from '../utils/deviceConstants';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\nexport type DeviceSize = keyof typeof DEVICE_SIZES;\n\nexport const MIN_SLIDE_WIDTH_PX = 280;\n\nexport const MIN_SLIDE_HEIGHT_PX = 320;\n\n/** Minimum height (px) for empty placeholder slots in column control. */\nexport const MIN_EMPTY_PLACEHOLDER_HEIGHT_PX = 220;\n\n// Max number of items allowed when using grid/column-control style layout\n// Column Control grid supports up to 4 columns x 2 rows = 8 items.\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 8;\n","import React from 'react';\n\nimport { EmptyPlaceholderWrapper } from './ColumnControl.styled';\nimport type { ColumnControlGridLayout } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS, MAX_SLIDE_HEIGHT_PX } from './types';\n\nexport interface ViewportLayoutState {\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n stackedItemHeight: string;\n stackedItemMaxHeight: number;\n stackedVerticalGap: number;\n containerHeight: string;\n}\n\nexport function getViewportLayoutState(\n isGridLayout: boolean,\n windowWidth: number,\n gapPx: number,\n height: string = 'auto'\n): ViewportLayoutState {\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport = isGridLayout && windowWidth > DEVICE_SIZES.SMALL && windowWidth <= DEVICE_SIZES.LARGE;\n const stackedItemHeight = 'auto';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = isGridLayout && isStackedViewport ? gapPx : 0;\n return {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight: height\n };\n}\n\nexport interface GridDimensions {\n columns: number;\n rows: number;\n}\n\nexport function getGridDimensions(layout: ColumnControlGridLayout | undefined): GridDimensions {\n const fallback: GridDimensions = { columns: 2, rows: 1 };\n if (!layout) return fallback;\n\n const normalized = layout.toLowerCase();\n const [rawCols, rawRows] = normalized.split('x');\n const parsedCols = Number(rawCols);\n const parsedRows = Number(rawRows);\n\n let columns = Number.isFinite(parsedCols) && parsedCols > 0 ? parsedCols : fallback.columns;\n let rows = Number.isFinite(parsedRows) && parsedRows > 0 ? parsedRows : fallback.rows;\n\n // Enforce business constraints\n columns = Math.min(Math.max(columns, 2), 4);\n rows = Math.min(Math.max(rows, 1), 2);\n\n return { columns, rows };\n}\n\nexport function getMaxChildrenForLayout(layout: ColumnControlGridLayout | undefined): number {\n const { columns, rows } = getGridDimensions(layout);\n const maxByLayout = columns * rows;\n return Math.min(maxByLayout, MAX_ALLOWED_COLUMN_CONTROL_ITEMS);\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items'\n}) => React.createElement(EmptyPlaceholderWrapper, { className: emptyBlockParentClass }, text);\n","import React from 'react';\n\nimport * as Styled from './ColumnControl.styled';\nimport { EmptyPlaceholder, getGridDimensions, getMaxChildrenForLayout } from './utils';\nimport { getGapPx, MAX_SLIDE_HEIGHT_PX, type ColumnControlProps, type ColumnControlGridLayout } from './types';\n\n/** Column control: simple equal-width grid driven by layout (cols x rows). */\nfunction ColumnControl<T = unknown>(props: ColumnControlProps<T>) {\n const {\n slides,\n renderSlide,\n layout,\n gap = 'medium',\n height,\n fullWidth,\n className,\n emptyBlockParentClass,\n emptyPlaceholderText: emptyTextProp,\n isEditing,\n parent$,\n $\n } = props;\n\n const effectiveGridLayout: ColumnControlGridLayout = layout ?? '2x1';\n\n const gapPx = getGapPx(gap);\n const { columns } = getGridDimensions(effectiveGridLayout);\n const maxChildren = getMaxChildrenForLayout(effectiveGridLayout);\n const visibleSlides = slides.slice(0, maxChildren);\n const slidesCount = visibleSlides.length;\n\n const emptyPlaceholderText = emptyTextProp ?? 'Add items to the column control';\n const effectiveFullWidth = fullWidth ?? true;\n const containerClassName = ['column-control-container', className].filter(Boolean).join(' ');\n const containerHeight = height ?? 'auto';\n\n const flexBasis = columns === 1 ? '100%' : `calc((100% - ${(columns - 1) * gapPx}px) / ${columns})`;\n\n const renderSlot = (slotIndex: number) => {\n const hasSlide = slotIndex < slidesCount;\n if (!isEditing && !hasSlide) return null;\n const id = `slide-${slotIndex}`;\n\n return (\n <Styled.SlideSection\n key={id}\n aria-roledescription=\"slide\"\n aria-label={`Slide ${slotIndex + 1} of ${maxChildren}`}\n useFlexLayout\n stackedVerticalGap={0}\n stackedItemHeight=\"auto\"\n stackedItemMaxHeight={MAX_SLIDE_HEIGHT_PX}\n flexBasis={flexBasis}\n gap={gapPx}\n columns={columns}\n {...($?.[`slides__${slotIndex}`] ?? {})}\n >\n <Styled.SlideInner\n stackedItemHeight=\"auto\"\n stackedItemMaxHeight={MAX_SLIDE_HEIGHT_PX}\n >\n <Styled.SlideContentInner>\n {hasSlide ? (\n renderSlide(visibleSlides[slotIndex], slotIndex)\n ) : (\n <EmptyPlaceholder\n emptyBlockParentClass={emptyBlockParentClass}\n text={emptyPlaceholderText}\n />\n )}\n </Styled.SlideContentInner>\n </Styled.SlideInner>\n </Styled.SlideSection>\n );\n };\n\n return (\n <Styled.ColumnControlContainer\n gap={gapPx}\n height={containerHeight}\n columnHeight=\"auto\"\n maxColumnHeight={MAX_SLIDE_HEIGHT_PX}\n className={containerClassName}\n aria-label=\"Column Control\"\n fullWidth={effectiveFullWidth}\n {...(parent$ ?? {})}\n >\n <Styled.InnerWrapper>\n <div>\n <Styled.TabletGridContainer\n className=\"column-control-container\"\n gap={gapPx}\n {...($?.['slides'] as Record<string, unknown> | undefined)}\n {...($?.['slides__parent'] as Record<string, unknown> | undefined)}\n data-add-direction=\"horizontal\"\n >\n {Array.from({ length: maxChildren }).map((_, index) => renderSlot(index))}\n </Styled.TabletGridContainer>\n </div>\n </Styled.InnerWrapper>\n </Styled.ColumnControlContainer>\n );\n}\n\nexport default ColumnControl as React.FC<ColumnControlProps>;\n","import styled from '@emotion/styled';\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\n/* ===================== CARD ===================== */\nexport const Card = styled.article<{\n align?: 'left' | 'center' | 'right';\n borderRadius?: string;\n backgroundColor?: string;\n textColor?: string;\n $maxHeight?: number;\n}>`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n max-height: ${({ $maxHeight }) => ($maxHeight ? `${$maxHeight}px` : 'none')};\n flex: 1 1 0%;\n overflow: hidden;\n text-align: ${({ align }) => align ?? 'left'};\n border-radius: ${({ borderRadius }) => borderRadius ?? '12px'};\n background-color: ${({ backgroundColor }) => backgroundColor ?? 'inherit'};\n color: ${({ textColor }) => textColor ?? 'inherit'};\n text-decoration: none;\n\n &[data-cta-style='card'] {\n text-decoration: none;\n color: inherit;\n }\n`;\n\n/* ===================== MEDIA ===================== */\nexport const MediaWrapper = styled('div', { shouldForwardProp: noForward$ })<{\n $inlineMedia?: boolean;\n $mediaHeight?: number;\n $mediaMaxHeight?: number;\n}>`\n position: relative;\n width: 100%;\n flex-shrink: 0;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n height: ${({ $mediaHeight }) => ($mediaHeight != null && $mediaHeight > 0 ? `${$mediaHeight}px` : 'auto')};\n max-height: ${({ $mediaMaxHeight }) =>\n $mediaMaxHeight != null && $mediaMaxHeight > 0 ? `${$mediaMaxHeight}px` : 'none'};\n ${({ $mediaHeight }) =>\n $mediaHeight != null &&\n $mediaHeight > 0 &&\n `\n & > * {\n height: 100%;\n min-height: 0;\n } \n `}\n\n ${({ $inlineMedia }) =>\n $inlineMedia &&\n `\n & img,\n & video {\n width: auto;\n height: 100% ;\n display: inline-block;\n max-width: 100%;\n }\n `}\n`;\n\n/* ===================== CONTENT ===================== */\nexport const Content = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n min-width: 0;\n padding: 16px 0;\n gap: 8px;\n justify-content: flex-start;\n align-items: stretch;\n`;\n\nexport const RichTextWrapper = styled.div`\n padding: 0;\n width: 100%;\n & > div {\n padding: 0;\n width: 100%;\n }\n && > div > div > div {\n padding: 0;\n }\n ul,\n ol {\n list-style-position: inside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 0;\n }\n ol {\n list-style-type: decimal;\n }\n li {\n margin: 0.25em 0;\n }\n`;\n\n/* ===================== CTA WRAPPER ===================== */\nexport const CtaWrapper = styled.div<{\n $isCardCta?: boolean;\n}>`\n margin-top: 16px;\n ${({ $isCardCta }) =>\n $isCardCta &&\n `\n div > a.MuiButton-root{\n justify-content: inherit;\n }\n `}\n`;\n\n/* ===================== CONTENT INNER ===================== */\nexport const ContentInner = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n gap: 8px;\n`;\n","import sanitizeHtml from 'sanitize-html';\nimport type { ButtonBlockProp, ButtonProps, ButtonsEntry } from '../../button/types';\nimport type { ContentAlignment, CtaStyle, ContentCardProps } from '../types';\nimport { MAX_MEDIA_HEIGHT_PX, PLACEHOLDER_BODY } from '../constants';\nimport { extractBynderMedia } from '../../bynder-media';\nimport { resolveTarget } from '../../button/helpers';\n\nexport function getEffectiveCta(cta: ButtonBlockProp | undefined): ButtonProps | null {\n if (!cta) return null;\n if ('buttons' in cta) {\n const block = cta;\n const entry: ButtonsEntry | undefined = block.buttons?.[0];\n return entry?.button ?? null;\n }\n return cta;\n}\n\nexport function normalizeContentAlignment(alignment?: string | null): ContentAlignment {\n if (alignment === 'centre' || alignment === 'center') return 'center';\n if (alignment === 'right') return 'right';\n return 'left';\n}\n\nexport function normalizeCtaStyle(value?: string | null): CtaStyle {\n const raw = typeof value === 'string' ? value.toLowerCase().trim() : '';\n if (raw === 'card' || raw === 'button' || raw === 'none') {\n return raw as CtaStyle;\n }\n if (raw.includes('card')) {\n return 'card';\n }\n if (raw.includes('button')) {\n return 'button';\n }\n if (raw.includes('none') || raw.includes('no cta')) {\n return 'none';\n }\n return 'none';\n}\n\nexport function getCtaState(cta: ButtonBlockProp | undefined, ctaStyleNormalized: CtaStyle) {\n const effectiveCta = getEffectiveCta(cta);\n\n const hasCtaHref = Boolean(effectiveCta?.url);\n const hasCtaLabel = Boolean(effectiveCta?.title);\n\n const isCardLink = ctaStyleNormalized === 'card' && hasCtaHref;\n\n const showButton =\n (ctaStyleNormalized === 'button' && hasCtaLabel) ||\n (ctaStyleNormalized === 'card' && hasCtaHref && hasCtaLabel);\n\n const cardTarget = resolveTarget(effectiveCta?.open_in_new_tab);\n\n return {\n ctaStyleNormalized,\n effectiveCta,\n isCardLink,\n showButton,\n cardTarget\n };\n}\n\nexport function getMediaLayout(media: ContentCardProps['media']) {\n const mediaInfo = media ? extractBynderMedia(media) : null;\n const isInlineMedia = Boolean(mediaInfo?.type === 'image' && (mediaInfo?.imageFit ?? 'cover') === 'none');\n\n const useFixedMediaHeight = media && !isInlineMedia && (mediaInfo?.type === 'image' || mediaInfo?.type === 'video');\n const mediaHeightValue = useFixedMediaHeight ? MAX_MEDIA_HEIGHT_PX : undefined;\n const mediaMaxHeightValue = media && !isInlineMedia && !mediaHeightValue ? MAX_MEDIA_HEIGHT_PX : undefined;\n\n return {\n mediaInfo,\n isInlineMedia,\n mediaHeightValue,\n mediaMaxHeightValue\n };\n}\n\nfunction contentCardBodyVisiblePlainText(html: string): string {\n const plainText = sanitizeHtml(html, {\n allowedTags: [],\n allowedAttributes: {}\n });\n\n return plainText\n .replace(/&nbsp;/gi, ' ')\n .replace(/\\u00a0/g, ' ')\n .trim();\n}\n\nexport function getContentCardBodyHtml(\n body: string | null | undefined,\n placeholderBody: string = PLACEHOLDER_BODY,\n isEditing: boolean = false\n): string {\n const raw = typeof body === 'string' ? body : '';\n const plain = contentCardBodyVisiblePlainText(raw);\n const emptyOrPlaceholderOnly =\n plain.length === 0 || plain.localeCompare(placeholderBody, undefined, { sensitivity: 'base' }) === 0;\n\n if (emptyOrPlaceholderOnly) {\n return isEditing ? `<p>${placeholderBody}</p>` : '';\n }\n return raw;\n}\n\nexport function getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean\n): string | undefined {\n const trimmed = (text ?? '').trim();\n if (isEditing) {\n if (trimmed === placeholderValue) {\n return placeholderValue;\n }\n return trimmed;\n }\n if (!trimmed || trimmed === placeholderValue) {\n return undefined;\n }\n return trimmed;\n}\n","export const DEFAULT_MAX_HEIGHT = 750;\n/** Max height for media (img/video); taller assets are capped, shorter stay at natural size. */\nexport const MAX_MEDIA_HEIGHT_PX = 400;\nexport const PLACEHOLDER_TITLE = 'Enter Title';\nexport const PLACEHOLDER_SUBTITLE = 'Enter Subtitle';\nexport const PLACEHOLDER_BODY = 'Enter Body';\n","import { ReactElement, useMemo } from 'react';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { TableRichTextWrapper, TableRichTextInner } from './TableRichText.styled';\nimport { getJustifyContent, getAlignItems, localizeAndValidateLinks, sanitizeHtml } from '../utils/richTextUtils';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface TableRichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n readonly text_editor: string;\n readonly font_color?: 'Light' | 'Dark';\n readonly container_alignment?: 'left' | 'center' | 'right';\n readonly container_vertical_alignment?: 'top' | 'center' | 'bottom';\n readonly container_width?: 100 | 75 | 50 | 25;\n readonly container_background_color?: string;\n}\n\nconst ALLOWED_TAGS = [\n 'p',\n 'div',\n 'span',\n 'a',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'blockquote',\n 'table',\n 'colgroup',\n 'col',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'th',\n 'td',\n 'caption'\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'title',\n 'class',\n 'style',\n 'data-testid',\n 'colspan',\n 'rowspan',\n 'scope',\n 'align',\n 'valign',\n 'data-width'\n];\n\nconst FORBID_ATTR = ['data-cslp', 'data-cs-id', 'data-cs-type'];\n\nconst wrapTablesForScroll = (html: string): string => {\n if (!html) return html;\n return html.replace(\n /<table\\b([^>]*)>([\\s\\S]*?)<\\/table>/gi,\n '<div class=\"rt-table-responsive\"><table$1>$2</table></div>'\n );\n};\n\n/**\n * RichText Component\n *\n * Wrapper component that sanitizes Rich Text Editor content before passing to CsText.\n * Uses DOMPurify to remove dangerous markup (scripts, styles, event handlers, etc.)\n * while preserving allowed formatting tags and attributes.\n *\n * SECURITY FEATURES:\n * - Removes script tags and event handlers\n * - Strips dangerous attributes and tags\n * - Allows only specified tags: p, div, span, a, br, strong, em, i, u, h1, h2, h3, ul, ol, li\n * - Allows only specified attributes: href, target, rel, title, class, style, data-cslp\n * - Sanitization is applied before rendering in CsText\n *\n * @param props - CsText component props with sanitizable text_editor content\n * @returns Rendered component with sanitized content\n */\nconst TableRichText = ({\n text_editor,\n font_color,\n container_alignment = 'left',\n container_vertical_alignment = 'top',\n container_width = 100,\n container_background_color,\n ...restProps\n}: TableRichTextProps): ReactElement | null => {\n // 1) Rewrite/validate link hrefs first (based on author input)\n // 2) Then sanitize the final HTML (security)\n const rewrittenHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) return '';\n return localizeAndValidateLinks(text_editor);\n }, [text_editor]);\n\n const sanitizedHtml = useMemo(() => {\n if (!rewrittenHtml) return '';\n return wrapTablesForScroll(\n sanitizeHtml(rewrittenHtml, {\n allowedTags: ALLOWED_TAGS,\n allowedAttrs: ALLOWED_ATTR,\n forbidAttrs: FORBID_ATTR\n })\n );\n }, [rewrittenHtml]);\n\n // Convert string font_color value to boolean (light = true, dark = false)\n const fontColorBoolean = font_color === 'Light';\n\n // Don't render if no content\n if (!sanitizedHtml) {\n return null;\n }\n\n const justifyContent = getJustifyContent(container_alignment);\n const alignItems = getAlignItems(container_vertical_alignment);\n\n // Pass sanitized HTML to CsText component with all other props\n return (\n <TableRichTextWrapper\n alignItems={alignItems}\n style={{\n justifyContent,\n backgroundColor: resolveBackgroundColor(container_background_color)\n }}\n >\n <TableRichTextInner width={container_width}>\n <CsText\n {...restProps}\n container_background_color={container_background_color}\n text_editor={sanitizedHtml}\n font_color={fontColorBoolean}\n />\n </TableRichTextInner>\n </TableRichTextWrapper>\n );\n};\n\nexport default TableRichText;\n","import styled from '@emotion/styled';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\n\nexport const TableRichTextWrapper = styled.div<{ alignItems: string }>`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({ alignItems }) => alignItems};\n`;\n\nexport const TableRichTextInner = styled.div<{ width: number }>`\n width: 100%;\n\n a {\n color: #008ab0;\n text-decoration: none;\n }\n\n .rt-table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n max-width: 100%;\n margin: 1em 0;\n }\n\n .rt-table-responsive > table {\n margin: 0;\n }\n\n @media (max-width: ${DEVICE_SIZES.MEDIUM - 1}px) {\n .rt-table-responsive > table {\n min-width: 480px;\n }\n }\n\n table {\n display: table;\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n margin: 1em 0;\n word-break: break-word;\n }\n\n thead {\n display: table-header-group;\n }\n\n tbody {\n display: table-row-group;\n }\n\n tfoot {\n display: table-footer-group;\n }\n\n tr {\n display: table-row;\n }\n\n colgroup {\n display: table-column-group;\n }\n\n col {\n display: table-column;\n }\n\n th,\n td {\n display: table-cell;\n border: 1px solid #ddd;\n padding: 8px 12px;\n vertical-align: top;\n }\n\n thead th {\n background-color: #f5f5f5;\n font-weight: 600;\n text-align: left;\n }\n\n tbody tr:nth-of-type(even) {\n background-color: #fafafa;\n }\n\n table p {\n margin: 0;\n }\n\n @media (min-width: ${DEVICE_SIZES.MEDIUM}px) {\n width: ${({ width }) => width}%;\n }\n`;\n","import DOMPurify from 'dompurify';\nimport { convertToLocalizedUrl } from './common';\n\n/**\n * Returns the CSS `justify-content` value for a horizontal alignment.\n */\nexport const getJustifyContent = (alignment: 'left' | 'center' | 'right'): string => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n\n/**\n * Returns the CSS `align-items` value for a vertical alignment.\n */\nexport const getAlignItems = (alignment: 'top' | 'center' | 'bottom'): string => {\n if (alignment === 'center') return 'center';\n if (alignment === 'bottom') return 'flex-end';\n return 'flex-start';\n};\n\n/**\n * For CMS RichText HTML:\n * - for safe internal/relative links, localize hrefs using convertToLocalizedUrl\n * - placeholders (`{%region}`, `{%language}`) are handled inside convertToLocalizedUrl\n */\nexport const localizeAndValidateLinks = (inputHtml: string): string => {\n if (typeof window === 'undefined' || !inputHtml) return inputHtml;\n const parser = new DOMParser();\n const doc = parser.parseFromString(inputHtml, 'text/html');\n\n doc.querySelectorAll('a[href]').forEach((link) => {\n const href = link.getAttribute('href');\n if (!href) return;\n\n const trimmed = href.trim();\n if (!trimmed) {\n link.removeAttribute('href');\n return;\n }\n\n // Non-web links should not be localized.\n if (/^(mailto|tel)\\s*:/i.test(trimmed) || trimmed.startsWith('#')) {\n return;\n }\n\n try {\n const localized = convertToLocalizedUrl(trimmed);\n if (!localized) {\n link.removeAttribute('href');\n return;\n }\n\n link.setAttribute('href', localized);\n } catch {\n link.removeAttribute('href');\n }\n });\n\n return doc.body.innerHTML;\n};\n\nexport type SanitizeHtmlOptions = {\n allowedTags: string[];\n allowedAttrs: string[];\n forbidAttrs?: string[];\n};\n\n/**\n * Sanitize HTML using DOMPurify.\n * Removes dangerous content while preserving the allowed tags and attributes\n * defined by the caller.\n *\n * @param html - Raw HTML content from the CMS editor\n * @param options - Allowlist/denylist configuration\n * @returns Sanitized HTML safe for rendering\n */\nexport const sanitizeHtml = (html: string, options: SanitizeHtmlOptions): string => {\n if (!html || typeof html !== 'string') {\n return '';\n }\n\n // DOMPurify requires a browser DOM environment; skip sanitization during SSR\n if (typeof window === 'undefined') {\n return html;\n }\n\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: options.allowedTags,\n ALLOWED_ATTR: options.allowedAttrs,\n ...(options.forbidAttrs ? { FORBID_ATTR: options.forbidAttrs } : {}),\n KEEP_CONTENT: true,\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false,\n FORCE_BODY: false,\n SANITIZE_DOM: true,\n IN_PLACE: false\n });\n};\n","import React from 'react';\nimport { Buttons as Button, ButtonBlockProp, ButtonsBlock } from '../button';\nimport { ContentCardProps } from './types';\nimport { Card, MediaWrapper, Content, CtaWrapper, ContentInner, RichTextWrapper } from './ContentCard.styled';\nimport { Typography } from '../typography';\nimport {\n normalizeContentAlignment,\n getCtaState,\n getMediaLayout,\n normalizeCtaStyle,\n getDisplayText,\n getContentCardBodyHtml\n} from './utils/helpers';\nimport { DEFAULT_MAX_HEIGHT, PLACEHOLDER_TITLE, PLACEHOLDER_SUBTITLE, PLACEHOLDER_BODY } from './constants';\nimport { BynderMedia } from '../bynder-media';\nimport { TableRichText } from '../table-rich-text';\n\nfunction CardTextBlock({\n title,\n subtitle,\n body,\n isEditing,\n editTags,\n alignment\n}: Readonly<{\n title: string | undefined;\n subtitle: string;\n body: ContentCardProps['body'];\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n alignment: 'left' | 'center' | 'right';\n}>) {\n const bodyHtml = typeof body === 'string' ? body : '';\n const displayTitle = getDisplayText(title, PLACEHOLDER_TITLE, isEditing);\n const displaySubtitle = getDisplayText(subtitle, PLACEHOLDER_SUBTITLE, isEditing);\n const richTextHtml = getContentCardBodyHtml(bodyHtml, PLACEHOLDER_BODY, isEditing);\n\n return (\n <ContentInner data-testid=\"card-content-inner\">\n {displayTitle ? (\n <Typography\n variant=\"h3\"\n inputText={displayTitle}\n color=\"inherit\"\n {...(editTags?.title ?? {})}\n />\n ) : null}\n {displaySubtitle ? (\n <Typography\n variant=\"body\"\n inputText={displaySubtitle}\n color=\"inherit\"\n {...(editTags?.subtitle ?? {})}\n />\n ) : null}\n {richTextHtml ? (\n <RichTextWrapper>\n <TableRichText\n text_editor={richTextHtml}\n container_alignment={alignment}\n container_background_color=\"transparent\"\n $={{ text_editor: editTags?.body ?? {} }}\n />\n </RichTextWrapper>\n ) : null}\n </ContentInner>\n );\n}\n\nfunction CardCtaBlock({\n show,\n cta,\n alignment,\n isEditing,\n editTags,\n isCardCta\n}: Readonly<{\n show: boolean;\n cta: ButtonBlockProp | undefined;\n alignment: 'left' | 'center' | 'right';\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n isCardCta: boolean;\n}>) {\n if (!show || !cta) return null;\n const nestedButtonParent = (cta as ButtonsBlock).buttons?.[0]?.$?.button;\n const buttonParent$: Record<string, unknown> = {\n ...(typeof nestedButtonParent === 'object' && nestedButtonParent !== null ? nestedButtonParent : {}),\n ...(editTags?.button ?? {})\n };\n return (\n <CtaWrapper\n data-testid=\"card-cta-wrapper\"\n $isCardCta={isCardCta}\n >\n <Button\n {...cta}\n parent$={buttonParent$}\n alignment={alignment}\n isEditing={isEditing}\n />\n </CtaWrapper>\n );\n}\n\nconst ContentCard: React.FC<ContentCardProps> = (props) => {\n const {\n title,\n subtitle = '',\n body = '',\n media,\n cta_style = 'none',\n cta,\n card_cta_group,\n button_cta_group,\n content_alignment = 'left',\n background_color = '#ffffff',\n text_color = '#000000',\n border_radius = '0px',\n max_height = DEFAULT_MAX_HEIGHT,\n parent$ = {},\n isEditing = false,\n $ = {}\n } = props;\n\n const normalizedStyle = normalizeCtaStyle(cta_style);\n let activeCta: ButtonBlockProp | undefined;\n\n if (normalizedStyle === 'card') {\n activeCta = card_cta_group ?? cta;\n } else if (normalizedStyle === 'button') {\n activeCta = button_cta_group ?? cta;\n }\n const alignment = normalizeContentAlignment(content_alignment);\n const { ctaStyleNormalized, effectiveCta, isCardLink, showButton, cardTarget } = getCtaState(\n activeCta,\n normalizedStyle\n );\n\n const { mediaInfo, isInlineMedia, mediaHeightValue, mediaMaxHeightValue } = getMediaLayout(media);\n\n const cardAs = isCardLink ? 'a' : 'article';\n const cardLinkProps = isCardLink ? { href: effectiveCta?.url ?? '', target: cardTarget } : {};\n\n return (\n <Card\n align={alignment}\n borderRadius={border_radius}\n backgroundColor={background_color}\n textColor={text_color}\n $maxHeight={max_height}\n as={cardAs}\n {...cardLinkProps}\n data-cta-style={ctaStyleNormalized}\n {...parent$}\n >\n <MediaWrapper\n data-testid={`card-media-${mediaInfo?.type}`}\n $inlineMedia={isInlineMedia}\n $mediaHeight={mediaHeightValue}\n $mediaMaxHeight={mediaMaxHeightValue}\n >\n {media ? (\n <BynderMedia\n bynder_media={media}\n $={$?.media}\n />\n ) : null}\n </MediaWrapper>\n\n <Content data-testid=\"card-content\">\n <CardTextBlock\n title={title}\n subtitle={subtitle}\n body={body}\n isEditing={isEditing}\n editTags={$}\n alignment={alignment}\n />\n <CardCtaBlock\n show={showButton}\n cta={activeCta}\n alignment={alignment}\n isEditing={isEditing}\n editTags={$}\n isCardCta={ctaStyleNormalized === 'card'}\n />\n </Content>\n </Card>\n );\n};\n\nexport default ContentCard;\n","// Placeholder text constants\nexport const PLACEHOLDER_BRAND_CAPTION = 'Enter Brand Caption';\nexport const PLACEHOLDER_TITLE = 'Enter Title';\nexport const PLACEHOLDER_SUBTITLE = 'Enter Subtitle';\nexport const PLACEHOLDER_BODY = 'Enter Body';\n\n// Aria labels\nexport const ARIA_LABEL_HERO_BANNER = 'Hero banner';\n","import React from 'react';\nimport { Typography } from '../../typography';\nimport { PLACEHOLDER_BRAND_CAPTION, PLACEHOLDER_TITLE, PLACEHOLDER_SUBTITLE, PLACEHOLDER_BODY } from '../constants';\nimport type { TypographyVariant } from '../../typography';\nimport type { TextColor } from '../helpers';\n\ninterface TypographyFieldConfig {\n value?: string;\n placeholder: string;\n variant: TypographyVariant;\n className: string;\n editTagKey: 'brandcaption' | 'title' | 'subtitle' | 'body';\n}\n\ninterface TypographyFieldsProps {\n readonly brandcaption?: string;\n readonly title?: string;\n readonly subtitle?: string;\n readonly body?: string;\n readonly isEditing: boolean;\n readonly editTags?: Record<string, unknown>;\n readonly textColor?: TextColor;\n}\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isEditing?: boolean,\n showPlaceholder?: boolean\n): string | undefined {\n const normalizedText = text?.trim();\n if (isEditing === true) {\n if (!normalizedText) {\n return showPlaceholder ? placeholderValue : undefined;\n }\n return text;\n }\n if (isEditing === false && text === placeholderValue) {\n return undefined;\n }\n return text;\n}\n\nconst getTypographyFields = (\n brandcaption?: string,\n title?: string,\n subtitle?: string,\n body?: string\n): TypographyFieldConfig[] => [\n {\n value: brandcaption,\n placeholder: PLACEHOLDER_BRAND_CAPTION,\n variant: 'disclaimer',\n className: 'brand-caption',\n editTagKey: 'brandcaption'\n },\n {\n value: title,\n placeholder: PLACEHOLDER_TITLE,\n variant: 'h1',\n className: 'hero-title',\n editTagKey: 'title'\n },\n {\n value: subtitle,\n placeholder: PLACEHOLDER_SUBTITLE,\n variant: 'h3',\n className: 'subtitle',\n editTagKey: 'subtitle'\n },\n {\n value: body,\n placeholder: PLACEHOLDER_BODY,\n variant: 'body',\n className: 'body',\n editTagKey: 'body'\n }\n];\n\nexport const TypographyFields: React.FC<TypographyFieldsProps> = ({\n brandcaption,\n title,\n subtitle,\n body,\n isEditing,\n editTags = {},\n textColor\n}) => {\n const fields = getTypographyFields(brandcaption, title, subtitle, body);\n\n return (\n <>\n {fields.map((field) => {\n const editAttributes = (editTags?.[field.editTagKey] ?? {}) as Record<string, unknown>;\n\n const displayValue = getDisplayText(\n field.value,\n field.placeholder,\n isEditing,\n field.editTagKey === 'title'\n );\n\n const color = textColor === 'white' ? '#FFFFFF' : '#1D1D1B';\n\n if (!displayValue) return null;\n\n return (\n <Typography\n key={field.editTagKey}\n variant={field.variant}\n inputText={displayValue}\n className={field.className}\n color={color}\n {...editAttributes}\n />\n );\n })}\n </>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nimport { GradientDepth, MOBILE_BREAKPOINT } from './helpers';\n\n// Media Layer\n\nexport const MediaLayer = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n// Container\n\nexport const Container = styled('section')<{ hasMedia: boolean }>`\n width: 100%;\n position: relative;\n min-height: ${({ hasMedia }) => (hasMedia ? '500px' : 'auto')};\n overflow: hidden;\n\n .hero-title,\n .subtitle,\n .brand-caption,\n .body {\n margin-bottom: 4px;\n }\n\n @media ${MOBILE_BREAKPOINT} {\n min-height: ${({ hasMedia }) => (hasMedia ? '400px' : 'auto')};\n }\n`;\n\n// Gradient Overlay\n\nconst GRADIENT_OPACITIES = {\n sm: { start: 0.3, end: 0 },\n md: { start: 0.6, end: 0 },\n lg: { start: 0.9, end: 0 }\n} as const;\n\nconst getGradientBackground = (direction: string, depth: GradientDepth, color: 'black' | 'white'): string => {\n const { start, end } = GRADIENT_OPACITIES[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n\n if (direction === 'leftToRight') {\n return `background: linear-gradient(to right, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n\n if (direction === 'rightToLeft') {\n return `background: linear-gradient(to left, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n\n return `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n};\n\nexport const GradientOverlay = styled.div<{\n direction: string;\n depth: GradientDepth;\n color: 'black' | 'white';\n}>`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({ direction, depth, color }) => getGradientBackground(direction, depth, color)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({ depth, color }) => {\n const { start, end } = GRADIENT_OPACITIES[depth];\n const baseColor = color === 'black' ? '0, 0, 0' : '255, 255, 255';\n return `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }}\n }\n`;\n\n// Overlay\n\nexport const Overlay = styled.div<{ justifyContent?: string; hasMedia: boolean }>`\n position: ${({ hasMedia }) => (hasMedia ? 'absolute' : 'static')};\n inset: ${({ hasMedia }) => (hasMedia ? '0' : 'auto')};\n z-index: 2;\n display: flex;\n align-items: center;\n padding: 3rem;\n pointer-events: none;\n justify-content: ${({ justifyContent }) => justifyContent ?? 'flex-start'};\n\n // Force center alignment on mobile\n @media ${MOBILE_BREAKPOINT} {\n position: static;\n inset: auto;\n min-height: ${({ hasMedia }) => (hasMedia ? '400px' : 'auto')};\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n`;\n\n// Content\n\nexport const Content = styled.div<{ textAlign?: string }>`\n max-width: 600px;\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n text-align: ${({ textAlign }) => textAlign ?? 'left'};\n\n // Force center alignment on mobile\n @media ${MOBILE_BREAKPOINT} {\n max-width: 100%;\n text-align: center;\n }\n`;\n\n// Button to be Centered on Mobile\nexport const HERO_CTA_WRAPPER_CLASS = 'hero-banner-button-wrapper';\n\nexport const ButtonWrapper = styled.div`\n @media ${MOBILE_BREAKPOINT} {\n &.${HERO_CTA_WRAPPER_CLASS} > div {\n justify-content: center;\n }\n }\n`;\n\n// Helpers\n\nexport const getJustifyContent = (alignment: 'left' | 'center' | 'right') => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n","export type GradientDepth = 'sm' | 'md' | 'lg';\nexport type ContentAlignment = 'left' | 'center' | 'right';\nexport type TextColor = 'black' | 'white';\n\n// Constants\nexport const FULL_SIZE_PERCENT = '100%';\nexport const MOBILE_BREAKPOINT = '(max-width: 768px)';\nexport const DESKTOP_BREAKPOINT = '(min-width: 769px)';\n\nexport function resolveContentAlignment(contentAlignment?: ContentAlignment): ContentAlignment {\n return contentAlignment ?? 'left';\n}\n\nexport function resolveGradientDepth(gradientDepth?: GradientDepth): GradientDepth {\n return gradientDepth ?? 'md';\n}\n\nexport function resolveTextColor(textColor?: string): TextColor {\n return (textColor === 'white' ? 'white' : 'black') as TextColor;\n}\n\nexport function getGradientColor(textColor: TextColor): 'white' | 'black' {\n return textColor === 'black' ? 'white' : 'black';\n}\n\nexport type GradientDirection = 'leftToRight' | 'radial' | 'rightToLeft';\n\nconst gradientDirectionMap: Record<ContentAlignment, GradientDirection> = {\n left: 'leftToRight',\n center: 'radial',\n right: 'rightToLeft'\n} as const;\n\nexport function getGradientDirection(contentAlignment: ContentAlignment): GradientDirection {\n return gradientDirectionMap[contentAlignment];\n}\n","import React from 'react';\nimport { Buttons as Button, ButtonsBlock } from '../button';\nimport { TypographyFields } from './components/TypographyFields';\nimport { HeroBannerProps } from './types';\nimport {\n Container,\n MediaLayer,\n GradientOverlay,\n Overlay,\n Content,\n getJustifyContent,\n ButtonWrapper,\n HERO_CTA_WRAPPER_CLASS\n} from './HeroBanner.styled';\nimport {\n resolveContentAlignment,\n resolveGradientDepth,\n resolveTextColor,\n getGradientColor,\n getGradientDirection\n} from './helpers';\nimport { ARIA_LABEL_HERO_BANNER } from './constants';\nimport { BynderMedia, extractBynderMedia } from '../bynder-media';\n\nconst HeroBanner: React.FC<HeroBannerProps> = (props) => {\n const {\n title,\n subtitle,\n body,\n brandcaption,\n button,\n media,\n class_name: className,\n content_alignment: contentAlignment,\n gradient_enabled: gradientEnabled = false,\n gradient_depth: gradientDepth,\n text_color: textColor,\n $ = {},\n parent$ = {},\n isEditing = false\n } = props;\n const resolvedContentAlignment = resolveContentAlignment(contentAlignment);\n const resolvedGradientDepth = resolveGradientDepth(gradientDepth);\n const resolvedTextColor = resolveTextColor(textColor);\n\n const justifyContent = getJustifyContent(resolvedContentAlignment);\n const gradientColor = getGradientColor(resolvedTextColor);\n const gradientDirection = getGradientDirection(resolvedContentAlignment);\n const mediaInfo = extractBynderMedia(media);\n const hasMedia = !!mediaInfo?.url;\n\n return (\n <Container\n hasMedia={hasMedia}\n className={className}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {hasMedia && (\n <MediaLayer>\n <BynderMedia\n bynder_media={media}\n $={$?.media}\n />\n </MediaLayer>\n )}\n\n {gradientEnabled && (\n <GradientOverlay\n direction={gradientDirection}\n depth={resolvedGradientDepth}\n color={gradientColor}\n aria-hidden=\"true\"\n />\n )}\n\n <Overlay\n justifyContent={justifyContent}\n hasMedia={hasMedia}\n >\n <Content textAlign={resolvedContentAlignment}>\n <TypographyFields\n brandcaption={brandcaption}\n title={title}\n subtitle={subtitle}\n body={body}\n isEditing={isEditing}\n editTags={$}\n textColor={resolvedTextColor}\n />\n\n {button && (\n <ButtonWrapper className={HERO_CTA_WRAPPER_CLASS}>\n <Button\n {...button}\n parent$={(button as ButtonsBlock).$?.buttons__0 ?? $?.button ?? {}}\n alignment={resolvedContentAlignment}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n","import { ReactElement, useMemo } from 'react';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { RichTextWrapper, RichTextInner } from './RichText.styled';\nimport { getJustifyContent, getAlignItems, localizeAndValidateLinks, sanitizeHtml } from '../utils/richTextUtils';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface RichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n readonly text_editor: string;\n readonly font_color?: 'Light' | 'Dark';\n readonly container_alignment?: 'left' | 'center' | 'right';\n readonly container_vertical_alignment?: 'top' | 'center' | 'bottom';\n readonly container_width?: 100 | 75 | 50 | 25;\n readonly container_background_color?: string;\n}\n\nconst ALLOWED_TAGS = [\n 'p',\n 'div',\n 'span',\n 'a',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'blockquote'\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'title',\n 'class',\n 'style',\n 'data-testid',\n 'data-cs-id',\n 'data-cs-type',\n 'data-cslp'\n];\n\n/**\n * RichText Component\n *\n * Wrapper component that sanitizes Rich Text Editor content before passing to CsText.\n * Uses DOMPurify to remove dangerous markup (scripts, styles, event handlers, etc.)\n * while preserving allowed formatting tags and attributes.\n *\n * SECURITY FEATURES:\n * - Removes script tags and event handlers\n * - Strips dangerous attributes and tags\n * - Allows only specified tags: p, div, span, a, br, strong, em, i, u, h1, h2, h3, ul, ol, li\n * - Allows only specified attributes: href, target, rel, title, class, style, data-cslp\n * - Sanitization is applied before rendering in CsText\n *\n * @param props - CsText component props with sanitizable text_editor content\n * @returns Rendered component with sanitized content\n */\nconst RichText = ({\n text_editor,\n font_color,\n container_alignment = 'left',\n container_vertical_alignment = 'top',\n container_width = 100,\n container_background_color,\n ...restProps\n}: RichTextProps): ReactElement | null => {\n // 1) Rewrite/validate link hrefs first (based on author input)\n // 2) Then sanitize the final HTML (security)\n const rewrittenHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) return '';\n return localizeAndValidateLinks(text_editor);\n }, [text_editor]);\n\n const sanitizedHtml = useMemo(() => {\n if (!rewrittenHtml) return '';\n return sanitizeHtml(rewrittenHtml, { allowedTags: ALLOWED_TAGS, allowedAttrs: ALLOWED_ATTR });\n }, [rewrittenHtml]);\n\n // Convert string font_color value to boolean (light = true, dark = false)\n const fontColorBoolean = font_color === 'Light';\n\n // Don't render if no content\n if (!sanitizedHtml) {\n return null;\n }\n\n const justifyContent = getJustifyContent(container_alignment);\n const alignItems = getAlignItems(container_vertical_alignment);\n\n // Pass sanitized HTML to CsText component with all other props\n return (\n <RichTextWrapper\n alignItems={alignItems}\n style={{\n justifyContent,\n backgroundColor: resolveBackgroundColor(container_background_color)\n }}\n >\n <RichTextInner width={container_width}>\n <CsText\n {...restProps}\n container_background_color={container_background_color}\n text_editor={sanitizedHtml}\n font_color={fontColorBoolean}\n />\n </RichTextInner>\n </RichTextWrapper>\n );\n};\n\nexport default RichText;\n","import styled from '@emotion/styled';\nimport { DEVICE_SIZES } from '../utils/deviceConstants';\n\nexport const RichTextWrapper = styled.div<{ alignItems: string }>`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({ alignItems }) => alignItems};\n`;\n\nexport const RichTextInner = styled.div<{ width: number }>`\n width: 100%;\n\n a {\n color: #008ab0;\n text-decoration: none;\n }\n\n @media (min-width: ${DEVICE_SIZES.MEDIUM}px) {\n width: ${({ width }) => width}%;\n }\n`;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { Typography } from '../typography';\nimport { useToggleFontColor } from '../hooks';\nimport FaqItem from './components/FaqItem';\nimport { FaqOuter, FaqSection, FaqContent, FaqTitleWrapper, FaqList, FaqEmptyPlaceholder } from './Faq.styled';\nimport type { FaqInternalProps, FaqProps } from './types';\nimport {\n getDisplayText,\n getFaqItemKey,\n getVisibleFaqItems,\n normalizeFaqSectionWidth,\n resolveContainerBackgroundColor\n} from './utils/helpers';\nimport { DEFAULT_FAQ_SECTION_WIDTH, DEFAULT_TEST_ID, EMPTY_ITEMS_PLACEHOLDER, PLACEHOLDER_TITLE } from './constants';\n\nconst FaqInternal: React.FC<FaqInternalProps> = ({\n faq_section_title,\n faq_items,\n faq_section_width = DEFAULT_FAQ_SECTION_WIDTH,\n allow_multiple_faqs_open = false,\n expand_all_faqs,\n font_color = 'Dark',\n container_background_color,\n isEditing = false,\n testId = DEFAULT_TEST_ID,\n ariaLabel,\n parent$ = {},\n $ = {},\n visibleItems,\n renderAnswer\n}) => {\n const headerRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const resolvedContainerBackground = resolveContainerBackgroundColor(container_background_color);\n const resolvedFontColor = useToggleFontColor(font_color === 'Light');\n const resolvedSectionWidth = normalizeFaqSectionWidth(faq_section_width);\n\n const displayTitle = getDisplayText(faq_section_title, PLACEHOLDER_TITLE, isEditing);\n const itemsForRender = visibleItems.length > 0 ? visibleItems : (faq_items ?? []);\n const shouldExpandAllFaqs = expand_all_faqs ?? false;\n const [openIndices, setOpenIndices] = useState<Set<number>>(() =>\n shouldExpandAllFaqs ? new Set(itemsForRender.map((_, index) => index)) : new Set()\n );\n\n useEffect(() => {\n setOpenIndices(shouldExpandAllFaqs ? new Set(itemsForRender.map((_, index) => index)) : new Set());\n }, [itemsForRender.length, shouldExpandAllFaqs]);\n\n const toggleItem = useCallback(\n (index: number) => {\n setOpenIndices((previous) => {\n if (previous.has(index)) {\n const next = new Set(previous);\n next.delete(index);\n return next;\n }\n if (allow_multiple_faqs_open) {\n const next = new Set(previous);\n next.add(index);\n return next;\n }\n return new Set([index]);\n });\n },\n [allow_multiple_faqs_open]\n );\n\n const focusHeader = useCallback(\n (index: number) => {\n const targetIndex = Math.max(0, Math.min(index, itemsForRender.length - 1));\n headerRefs.current[targetIndex]?.focus();\n },\n [itemsForRender.length]\n );\n\n const handleHeaderKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusHeader(index + 1);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n focusHeader(index - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n focusHeader(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n focusHeader(itemsForRender.length - 1);\n }\n },\n [focusHeader, itemsForRender.length]\n );\n\n const setHeaderRef = useCallback(\n (index: number) => (element: HTMLButtonElement | null) => {\n headerRefs.current[index] = element;\n },\n []\n );\n\n const listEditTags = useMemo(\n () => ({\n ...($?.faq_items__parent ?? {}),\n 'data-add-direction': 'vertical'\n }),\n [$]\n );\n\n const sectionLabel = ariaLabel ?? displayTitle ?? 'Frequently asked questions';\n\n return (\n <FaqOuter data-testid={`${testId}-outer`}>\n <FaqSection\n aria-label={sectionLabel}\n $containerBackgroundColor={resolvedContainerBackground}\n $fontColor={resolvedFontColor}\n data-testid={testId}\n {...parent$}\n {...($?.container_background_color ?? {})}\n >\n <FaqContent\n $sectionWidth={resolvedSectionWidth}\n data-testid={`${testId}-content`}\n data-section-width={resolvedSectionWidth}\n >\n {displayTitle ? (\n <FaqTitleWrapper data-testid={`${testId}-title-wrapper`}>\n <Typography\n variant=\"h2\"\n inputText={displayTitle}\n color={resolvedFontColor}\n dataTestId={`${testId}-title`}\n {...($?.title ?? {})}\n />\n </FaqTitleWrapper>\n ) : null}\n\n {itemsForRender.length === 0 && isEditing ? (\n <FaqEmptyPlaceholder\n data-testid={`${testId}-empty-placeholder`}\n {...listEditTags}\n >\n {EMPTY_ITEMS_PLACEHOLDER}\n </FaqEmptyPlaceholder>\n ) : (\n <FaqList\n data-testid={`${testId}-list`}\n {...listEditTags}\n >\n {itemsForRender.map((item, index) => (\n <FaqItem\n key={getFaqItemKey(item, index)}\n item={item}\n index={index}\n isOpen={openIndices.has(index)}\n isEditing={isEditing}\n onToggle={toggleItem}\n onHeaderKeyDown={handleHeaderKeyDown}\n headerRef={setHeaderRef(index)}\n testId={testId}\n itemEditTags={$?.[`faq_items__${index}`]}\n renderAnswer={renderAnswer}\n />\n ))}\n </FaqList>\n )}\n </FaqContent>\n </FaqSection>\n </FaqOuter>\n );\n};\n\nconst Faq: React.FC<FaqProps> = (props) => {\n const { faq_items, isEditing = false } = props;\n const visibleItems = getVisibleFaqItems(faq_items, isEditing);\n\n if (visibleItems.length === 0 && !isEditing) {\n console.warn('[Faq] No FAQ items provided');\n return null;\n }\n\n return (\n <FaqInternal\n {...props}\n visibleItems={visibleItems}\n />\n );\n};\n\nexport default Faq;\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const BREAKPOINTS = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px) and (max-width: 1440px)',\n ultra: '(min-width: 1441px)'\n} as const;\n\nconst noForward$ = (prop: string) => !prop.startsWith('$');\n\nexport const FaqOuter = styled('div')({\n width: '100%',\n display: 'flex',\n justifyContent: 'center'\n});\n\nexport const FaqSection = styled('section', { shouldForwardProp: noForward$ })<{\n $containerBackgroundColor: string;\n $fontColor: string;\n}>(({ $containerBackgroundColor, $fontColor }) => ({\n width: '100%',\n margin: '0 auto',\n padding: '24px 0',\n boxSizing: 'border-box',\n backgroundColor: $containerBackgroundColor,\n color: $fontColor,\n\n [`@media ${BREAKPOINTS.tablet}`]: {\n padding: '32px 24px'\n },\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n padding: '32px 32px'\n }\n}));\n\nexport const FaqContent = styled('div', { shouldForwardProp: noForward$ })<{\n $sectionWidth: 25 | 50 | 75 | 100;\n}>(({ $sectionWidth }) => ({\n width: '100%',\n margin: '0 auto',\n\n [`@media ${BREAKPOINTS.desktop}`]: {\n width: `${$sectionWidth}%`\n },\n\n [`@media ${BREAKPOINTS.ultra}`]: {\n width: `${$sectionWidth}%`\n }\n}));\n\nexport const FaqTitleWrapper = styled('div')({\n marginBottom: '32px',\n textAlign: 'center',\n fontSize: '32px',\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n marginBottom: '24px',\n fontSize: '36px'\n }\n});\n\nexport const FaqList = styled('div')({\n display: 'flex',\n flexDirection: 'column',\n width: '100%'\n});\n\nexport const FaqItemContainer = styled('div')({\n width: '100%',\n\n '& h3': {\n margin: 0\n }\n});\n\nconst EASE_OUT = 'cubic-bezier(0.4, 0, 0.2, 1)';\nconst EASE_SPRING = 'cubic-bezier(0.34, 1.4, 0.64, 1)';\n\nexport const FaqQuestionButton = styled('button')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n gap: '16px',\n padding: '16px 0',\n margin: 0,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n textAlign: 'left',\n color: 'inherit',\n fontFamily: \"'Lora', serif\",\n fontSize: '18px',\n fontWeight: 600,\n lineHeight: '24px',\n '&:focus-visible': {\n outline: '2px solid currentColor',\n outlineOffset: '2px'\n },\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n padding: '12px 10px 12px 0',\n gap: '12px'\n }\n});\n\nexport const FaqQuestionText = styled('span')({\n flex: '1 1 auto',\n minWidth: 0,\n padding: '0 16px'\n});\n\nexport const FaqChevronIcon = styled('span')<{ isOpen: boolean }>(({ isOpen }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: '24px',\n height: '24px',\n color: 'inherit',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: `transform 0.35s ${EASE_SPRING}`\n}));\n\nexport const FaqAnswerPanel = styled('section')<{ isOpen: boolean }>(({ isOpen }) => ({\n display: 'grid',\n gridTemplateRows: isOpen ? '1fr' : '0fr',\n transition: `grid-template-rows 0.4s ${EASE_OUT}`,\n marginBottom: isOpen ? '12px' : '0',\n\n [`@media ${BREAKPOINTS.mobile}`]: {\n marginBottom: isOpen ? '8px' : '0'\n }\n}));\n\nexport const FaqAnswerInner = styled('div')<{ isOpen: boolean }>(({ isOpen }) => ({\n overflow: 'hidden',\n minHeight: 0,\n visibility: isOpen ? 'visible' : 'hidden',\n transition: 'visibility 0s linear',\n transitionDelay: isOpen ? '0s' : '0.4s',\n\n '@media (prefers-reduced-motion: reduce)': {\n transition: 'none',\n transitionDelay: '0s'\n }\n}));\n\nexport const FaqAnswerContent = styled('div')<{ isOpen: boolean }>(({ isOpen }) => ({\n width: '100%',\n fontFamily: \"'Inter', sans-serif\",\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '20px',\n opacity: isOpen ? 1 : 0,\n transform: isOpen ? 'translateY(0)' : 'translateY(-10px)',\n transition: `opacity 0.35s ${EASE_OUT}, transform 0.35s ${EASE_OUT}`,\n transitionDelay: isOpen ? '0.1s' : '0s',\n paddingBottom: '4px',\n\n '@media (prefers-reduced-motion: reduce)': {\n transition: 'none',\n transitionDelay: '0s',\n transform: 'none'\n }\n}));\n\nexport const FaqEmptyPlaceholder = styled('div')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '120px',\n padding: '24px 16px',\n color: 'inherit',\n font: 'inherit',\n lineHeight: 'inherit',\n textAlign: 'center'\n});\n","import sanitizeHtml from 'sanitize-html';\nimport { getDisplayText } from '../../content-card/utils/helpers';\nimport type { FaqItemData, FaqSectionWidth } from '../types';\nimport {\n DEFAULT_FAQ_SECTION_WIDTH,\n FAQ_SECTION_WIDTH_OPTIONS,\n PLACEHOLDER_ANSWER,\n PLACEHOLDER_QUESTION\n} from '../constants';\nimport { resolveBackgroundColor } from '../../text/CsText';\n\nfunction faqAnswerVisiblePlainText(html: string): string {\n const plainText = sanitizeHtml(html, {\n allowedTags: [],\n allowedAttributes: {}\n });\n\n return plainText\n .replace(/&nbsp;/gi, ' ')\n .replace(/\\u00a0/g, ' ')\n .trim();\n}\n\nexport function getFaqAnswerHtml(\n answer: string | null | undefined,\n placeholderAnswer: string = PLACEHOLDER_ANSWER,\n isEditing: boolean = false\n): string {\n const raw = typeof answer === 'string' ? answer : '';\n const plain = faqAnswerVisiblePlainText(raw);\n const emptyOrPlaceholderOnly =\n plain.length === 0 || plain.localeCompare(placeholderAnswer, undefined, { sensitivity: 'base' }) === 0;\n\n if (emptyOrPlaceholderOnly) {\n return isEditing ? `<p>${placeholderAnswer}</p>` : '';\n }\n return raw;\n}\n\nexport function hasAnswerContent(item: FaqItemData, isEditing: boolean): boolean {\n if (item.answer_content != null) {\n return true;\n }\n return Boolean(getFaqAnswerHtml(item.answer, PLACEHOLDER_ANSWER, isEditing));\n}\n\nexport function hasVisibleFaqContent(item: FaqItemData, isEditing: boolean): boolean {\n const question = getDisplayText(item.question, PLACEHOLDER_QUESTION, isEditing);\n return Boolean(question ?? hasAnswerContent(item, isEditing));\n}\n\nexport function getVisibleFaqItems(items: FaqItemData[] | undefined, isEditing: boolean): FaqItemData[] {\n const sourceItems = items ?? [];\n\n if (isEditing) {\n return sourceItems;\n }\n\n return sourceItems.filter((item) => hasVisibleFaqContent(item, false));\n}\n\nexport function normalizeFaqSectionWidth(value: FaqSectionWidth | string | undefined): FaqSectionWidth {\n const parsed = typeof value === 'string' ? Number(value) : value;\n if (FAQ_SECTION_WIDTH_OPTIONS.includes(parsed as FaqSectionWidth)) {\n return parsed as FaqSectionWidth;\n }\n return DEFAULT_FAQ_SECTION_WIDTH;\n}\n\nexport function resolveContainerBackgroundColor(value: unknown): string {\n return resolveBackgroundColor(value);\n}\n\nexport function getFaqItemKey(item: FaqItemData, index: number): string {\n const uid = item._metadata?.uid;\n if (uid) {\n return `faq-item-${uid}`;\n }\n const question = (item.question ?? '').trim();\n if (question.length > 0) {\n return `faq-item-${question}-${index}`;\n }\n return `faq-item-${index}`;\n}\n\nexport { getDisplayText };\n","export const PLACEHOLDER_TITLE = \"Got questions? We've got answers\";\nexport const PLACEHOLDER_QUESTION = 'Enter question';\nexport const PLACEHOLDER_ANSWER = 'Enter answer';\nexport const DEFAULT_TEST_ID = 'cs-faq';\nexport const EMPTY_ITEMS_PLACEHOLDER = 'Add FAQ items using the editor';\n\nexport const DEFAULT_FAQ_SECTION_WIDTH = 100;\nexport const FAQ_SECTION_WIDTH_OPTIONS = [25, 50, 75, 100] as const;\n","import React from 'react';\nimport { TableRichText } from '../../table-rich-text';\nimport type { FaqAnswerProps } from '../types';\nimport { FaqAnswerContent } from '../Faq.styled';\nimport { getFaqAnswerHtml } from '../utils/helpers';\nimport { PLACEHOLDER_ANSWER } from '../constants';\n\nconst FaqAnswer: React.FC<FaqAnswerProps> = ({ item, index, isOpen, isEditing, testId, renderAnswer }) => {\n const answerTestId = `${testId ?? 'cs-faq'}-answer-${index}`;\n\n const wrapAnswer = (content: React.ReactNode) => (\n <FaqAnswerContent\n isOpen={isOpen}\n data-testid={answerTestId}\n >\n {content}\n </FaqAnswerContent>\n );\n\n if (renderAnswer) {\n const customContent = renderAnswer(item, index, isEditing);\n if (customContent != null) {\n return wrapAnswer(customContent);\n }\n }\n\n if (item.answer_content != null) {\n return wrapAnswer(item.answer_content);\n }\n\n const answerHtml = getFaqAnswerHtml(item.answer, PLACEHOLDER_ANSWER, isEditing);\n if (!answerHtml) {\n return null;\n }\n\n return wrapAnswer(\n <TableRichText\n text_editor={answerHtml}\n container_alignment=\"left\"\n $={{ text_editor: item.$?.answer ?? {} }}\n />\n );\n};\n\nexport default FaqAnswer;\n","import React from 'react';\nimport FaqAnswer from './FaqAnswer';\nimport type { FaqItemProps } from '../types';\nimport {\n FaqItemContainer,\n FaqQuestionButton,\n FaqQuestionText,\n FaqChevronIcon,\n FaqAnswerPanel,\n FaqAnswerInner\n} from '../Faq.styled';\nimport { getDisplayText, hasAnswerContent } from '../utils/helpers';\nimport { PLACEHOLDER_QUESTION } from '../constants';\n\nfunction ChevronDownIcon(): React.ReactElement {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst FaqItem: React.FC<FaqItemProps> = ({\n item,\n index,\n isOpen,\n isEditing,\n onToggle,\n onHeaderKeyDown,\n headerRef,\n testId,\n itemEditTags,\n renderAnswer\n}) => {\n const displayQuestion = getDisplayText(item.question, PLACEHOLDER_QUESTION, isEditing);\n const hasAnswer = hasAnswerContent(item, isEditing);\n const panelId = `${testId ?? 'cs-faq'}-panel-${index}`;\n const headerId = `${testId ?? 'cs-faq'}-header-${index}`;\n\n if (!displayQuestion && !hasAnswer) {\n return null;\n }\n\n const questionLabel = displayQuestion ?? PLACEHOLDER_QUESTION;\n\n return (\n <FaqItemContainer\n data-testid={`${testId ?? 'cs-faq'}-item-${index}`}\n {...(itemEditTags ?? {})}\n >\n <h3>\n <FaqQuestionButton\n type=\"button\"\n id={headerId}\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => onToggle(index)}\n onKeyDown={(event) => onHeaderKeyDown(event, index)}\n ref={headerRef}\n data-testid={`${testId ?? 'cs-faq'}-question-${index}`}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <FaqQuestionText {...(item.$?.question ?? {})}>{questionLabel}</FaqQuestionText>\n <FaqChevronIcon\n isOpen={isOpen}\n data-testid={`${testId ?? 'cs-faq'}-icon-${index}`}\n >\n <ChevronDownIcon />\n </FaqChevronIcon>\n </FaqQuestionButton>\n </h3>\n <FaqAnswerPanel\n id={panelId}\n aria-labelledby={headerId}\n aria-hidden={!isOpen}\n isOpen={isOpen}\n data-testid={`${testId ?? 'cs-faq'}-answer-panel-${index}`}\n >\n <FaqAnswerInner isOpen={isOpen}>\n <FaqAnswer\n item={item}\n index={index}\n isOpen={isOpen}\n isEditing={isEditing}\n testId={testId}\n renderAnswer={renderAnswer}\n />\n </FaqAnswerInner>\n </FaqAnswerPanel>\n </FaqItemContainer>\n );\n};\n\nexport default FaqItem;\n","import { PlaybackOptions, VideoDescriptor } from './types';\n\nconst YOUTUBE_ID = /(?:youtu\\.be\\/|youtube\\.com\\/(?:watch\\?v=|embed\\/|v\\/|shorts\\/))([\\w-]{11})/;\nconst VIMEO_ID = /vimeo\\.com\\/(?:video\\/)?(\\d+)/;\n\n/**\n * Only permit http/https URLs to prevent `javascript:` injection.\n */\nexport function safeVideoSrc(url: unknown): string {\n const s = String(url ?? '').trim();\n return /^https?:\\/\\//i.test(s) ? s : '';\n}\n\n/**\n * Extract the bare video ID from either a raw id or a full share/watch URL.\n * The author may enter a YouTube/Vimeo URL or just the ID.\n */\nexport function extractVideoId(source: string, raw: unknown): string {\n const value = String(raw ?? '').trim();\n if (!value) return '';\n if (source === 'youtube') {\n const match = YOUTUBE_ID.exec(value);\n return match ? match[1] : value;\n }\n if (source === 'vimeo') {\n const match = VIMEO_ID.exec(value);\n return match ? match[1] : value;\n }\n return value;\n}\n\nfunction buildYouTubeParams(id: string, opts: PlaybackOptions): URLSearchParams {\n const params = new URLSearchParams();\n if (opts.autoplay) {\n params.set('autoplay', '1');\n params.set('mute', '1'); // browsers require muted autoplay\n }\n if (opts.controls === false) params.set('controls', '0');\n if (opts.loop) {\n params.set('loop', '1');\n params.set('playlist', id); // YouTube needs playlist=ID to loop a single video\n }\n return params;\n}\n\nfunction buildVimeoParams(opts: PlaybackOptions): URLSearchParams {\n const params = new URLSearchParams();\n if (opts.autoplay) {\n params.set('autoplay', '1');\n params.set('muted', '1');\n }\n if (opts.controls === false) params.set('controls', '0');\n if (opts.loop) params.set('loop', '1');\n return params;\n}\n\nfunction toQuerySuffix(params: URLSearchParams): string {\n const qs = params.toString();\n return qs ? `?${qs}` : '';\n}\n\n/** Build a provider embed URL (YouTube/Vimeo), encoding playback options as query params. */\nexport function buildEmbedUrl(source: string, raw: unknown, opts: PlaybackOptions = {}): string {\n const id = extractVideoId(source, raw);\n if (!id) return '';\n\n if (source === 'youtube') {\n return `https://www.youtube.com/embed/${encodeURIComponent(id)}${toQuerySuffix(buildYouTubeParams(id, opts))}`;\n }\n\n if (source === 'vimeo') {\n return `https://player.vimeo.com/video/${encodeURIComponent(id)}${toQuerySuffix(buildVimeoParams(opts))}`;\n }\n\n return '';\n}\n\n/**\n * Build a render-ready VideoDescriptor from the VideoPlayer props.\n * Returns null until enough has been entered to render something.\n *\n * Providers:\n * - youtube / vimeo → provider embed iframe (options encoded in the URL).\n * - embed → generic iframe using the entered URL as-is.\n */\nexport function buildVideoDescriptor(\n videoSource: string | undefined,\n url: string | undefined,\n opts: PlaybackOptions = {}\n): VideoDescriptor | null {\n if (!videoSource || !url?.trim()) return null;\n const raw = url.trim();\n\n if (videoSource === 'youtube' || videoSource === 'vimeo') {\n const src = buildEmbedUrl(videoSource, raw, opts);\n if (!src) return null;\n return { kind: videoSource, src };\n }\n\n // 'embed' or any other source → generic sandboxed iframe.\n const src = safeVideoSrc(raw);\n if (!src) return null;\n return { kind: 'embed', src };\n}\n","import styled from '@emotion/styled';\n\nimport type { StyledVideoContainerProps, StyledVideoInnerProps, PaddingScale, Alignment } from './types';\nimport { VIDEO_BREAKPOINTS } from './types';\n\nexport const EmbedWrapper = styled.div`\n position: relative;\n width: 100%;\n padding-top: 56.25%; /* responsive 16:9 */\n background: #000;\n border-radius: 8px;\n overflow: hidden;\n`;\n\nexport const StyledIframe = styled.iframe`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n`;\n\nexport const PlaceholderWrapper = styled.div`\n width: 100%;\n aspect-ratio: 16 / 9;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n color: #9aa0a6;\n background: #f0f0f0;\n border: 1px dashed #ccc;\n border-radius: 8px;\n`;\n\nexport const PlaceholderLabel = styled.span`\n font-size: 12px;\n`;\n\nconst verticalScaleMap: Record<PaddingScale, { mobile: number; tablet: number; desktop: number; ultra: number }> = {\n none: { mobile: 0, tablet: 0, desktop: 0, ultra: 0 },\n small: { mobile: 8, tablet: 8, desktop: 8, ultra: 12 },\n medium: { mobile: 12, tablet: 12, desktop: 16, ultra: 20 },\n large: { mobile: 16, tablet: 16, desktop: 24, ultra: 32 }\n};\n\nconst horizontalScaleMap: Record<PaddingScale, { mobile: number; tablet: number; desktop: number; ultra: number }> = {\n none: { mobile: 0, tablet: 0, desktop: 0, ultra: 0 },\n small: { mobile: 8, tablet: 8, desktop: 8, ultra: 12 },\n medium: { mobile: 12, tablet: 12, desktop: 16, ultra: 20 },\n large: { mobile: 16, tablet: 16, desktop: 24, ultra: 32 }\n};\n\nconst alignItemsMap: Record<Alignment, string> = {\n center: 'center',\n right: 'flex-end',\n left: 'flex-start'\n};\n\nconst justifyContentMap: Record<Alignment, string> = {\n center: 'center',\n right: 'center',\n left: 'center'\n};\n\nexport const StyledVideoContainer = styled.div<StyledVideoContainerProps>(\n ({ alignment, vertical_padding, horizontal_padding }) => {\n const v = verticalScaleMap[vertical_padding];\n const h = horizontalScaleMap[horizontal_padding];\n const alignItems = alignItemsMap[alignment];\n const justifyContent = justifyContentMap[alignment];\n\n return {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems,\n justifyContent,\n flex: 1,\n height: '100%',\n boxSizing: 'border-box' as const,\n paddingTop: `${v.mobile}px`,\n paddingBottom: `${v.mobile}px`,\n paddingLeft: `${h.mobile}px`,\n paddingRight: `${h.mobile}px`,\n [`@media ${VIDEO_BREAKPOINTS.tablet}`]: {\n paddingTop: `${v.tablet}px`,\n paddingBottom: `${v.tablet}px`,\n paddingLeft: `${h.tablet}px`,\n paddingRight: `${h.tablet}px`\n },\n [`@media ${VIDEO_BREAKPOINTS.desktop}`]: {\n paddingTop: `${v.desktop}px`,\n paddingBottom: `${v.desktop}px`,\n paddingLeft: `${h.desktop}px`,\n paddingRight: `${h.desktop}px`\n },\n [`@media ${VIDEO_BREAKPOINTS.ultra}`]: {\n paddingTop: `${v.ultra}px`,\n paddingBottom: `${v.ultra}px`,\n paddingLeft: `${h.ultra}px`,\n paddingRight: `${h.ultra}px`\n }\n };\n }\n);\n\nexport const StyledVideoInner = styled.div<StyledVideoInnerProps>(({ width_percent }) => ({\n width: `${Math.max(0, Math.min(100, width_percent))}%`\n}));\n","export type VideoKind = 'youtube' | 'vimeo' | 'embed';\n\nexport type PaddingScale = 'none' | 'small' | 'medium' | 'large';\nexport type Alignment = 'left' | 'center' | 'right';\n\n/** Playback options for the video player. */\nexport interface PlaybackOptions {\n autoplay?: boolean;\n /** When false, controls are hidden. Defaults to visible. */\n controls?: boolean;\n loop?: boolean;\n}\n\n/** Normalized, render-ready description of a video. */\nexport interface VideoDescriptor extends PlaybackOptions {\n /** 'youtube' | 'vimeo' render as a provider iframe; 'embed' renders a generic sandboxed iframe. */\n kind: VideoKind;\n /** Embed/iframe URL (providers & generic embeds) or direct media URL (file). */\n src: string;\n /** Optional human-readable title used for the iframe `title`. */\n title?: string;\n}\n\n/** Raw values as supplied by the VideoPlayer component props. */\nexport interface VideoPlayerProps {\n /** Video source type: 'youtube', 'vimeo', or 'embed' (generic iframe). */\n videoSource?: 'youtube' | 'vimeo' | 'embed' | string;\n /** Provider video URL or bare ID, a generic embed URL, or a direct file URL. */\n url?: string;\n autoplay?: boolean;\n controls?: boolean;\n loop?: boolean;\n /** Optional accessible title for the iframe. */\n title?: string;\n /** Horizontal alignment of the video within its container. */\n alignment?: Alignment;\n /** Vertical padding above and below the video. */\n vertical_padding?: PaddingScale;\n /** Horizontal padding to the left and right of the video. */\n horizontal_padding?: PaddingScale;\n /** Width of the video as a percentage of its container (0–100). */\n width_percent?: number | string;\n}\n\nexport interface StyledVideoContainerProps {\n alignment: Alignment;\n vertical_padding: PaddingScale;\n horizontal_padding: PaddingScale;\n}\n\nexport interface StyledVideoInnerProps {\n width_percent: number;\n}\n\nexport const VIDEO_BREAKPOINTS = {\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px) and (max-width: 1439px)',\n ultra: '(min-width: 1440px)'\n} as const;\n","import React from 'react';\n\nimport { VideoDescriptor, VideoPlayerProps } from './types';\nimport { buildVideoDescriptor } from './videoUtils';\nimport {\n EmbedWrapper,\n StyledIframe,\n PlaceholderWrapper,\n PlaceholderLabel,\n StyledVideoContainer,\n StyledVideoInner\n} from './VideoPlayer.styled';\n\n/**\n * Sandbox attributes for embedded players. `allow-scripts` + `allow-same-origin`\n * are required for YouTube/Vimeo playback; `allow-presentation` enables full screen.\n */\nconst IFRAME_SANDBOX = 'allow-scripts allow-same-origin allow-presentation allow-popups';\nconst IFRAME_ALLOW =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen';\n\nfunction VideoPlaceholder(): React.ReactElement {\n return (\n <PlaceholderWrapper data-testid=\"video-placeholder\">\n <svg\n width={42}\n height={42}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n >\n <rect\n x=\"2\"\n y=\"4\"\n width=\"20\"\n height=\"16\"\n rx=\"2\"\n />\n <path d=\"M10 9l5 3-5 3V9z\" />\n </svg>\n <PlaceholderLabel>No video set</PlaceholderLabel>\n </PlaceholderWrapper>\n );\n}\n\n/**\n * Renders a sandboxed provider/embed iframe (YouTube, Vimeo, generic) or an\n * HTML5 `<video>` for direct file URLs, given a normalized `VideoDescriptor`.\n * This internal variant accepts a pre-built descriptor — useful when you already\n * have one (e.g. from `buildVideoDescriptor`).\n */\nexport function VideoPlayerFromDescriptor({ video }: { readonly video: VideoDescriptor | null }): React.ReactElement {\n if (!video) {\n return <VideoPlaceholder />;\n }\n\n return (\n <EmbedWrapper>\n <StyledIframe\n src={video.src}\n title={video.title ?? 'Video player'}\n sandbox={IFRAME_SANDBOX}\n allow={IFRAME_ALLOW}\n allowFullScreen\n />\n </EmbedWrapper>\n );\n}\n\n/**\n * Presentational video player component.\n *\n * Supports YouTube, Vimeo, generic embed iframes, and direct video file URLs.\n * Pass `videoSource` and `url` to render a video; if either is missing a\n * placeholder is shown instead.\n *\n * @example\n * // YouTube\n * <VideoPlayer videoSource=\"youtube\" url=\"https://www.youtube.com/watch?v=I0_951_MPE0\" />\n *\n * @example\n * // Vimeo\n * <VideoPlayer videoSource=\"vimeo\" url=\"https://vimeo.com/22439234\" />\n *\n * @example\n * // Direct file\n * <VideoPlayer videoSource=\"url\" url=\"https://example.com/video.mp4\" controls loop />\n */\nconst VideoPlayer: React.FC<VideoPlayerProps> = ({\n videoSource,\n url,\n autoplay,\n controls,\n loop,\n title,\n alignment = 'left',\n vertical_padding = 'none',\n horizontal_padding = 'none',\n width_percent = 100\n}) => {\n const descriptor = buildVideoDescriptor(videoSource, url, { autoplay, controls, loop });\n if (descriptor && title) {\n descriptor.title = title;\n }\n const pct = typeof width_percent === 'string' ? parseFloat(width_percent) : width_percent;\n const safePct = Number.isFinite(pct) ? pct : 100;\n return (\n <StyledVideoContainer\n alignment={alignment}\n vertical_padding={vertical_padding}\n horizontal_padding={horizontal_padding}\n >\n <StyledVideoInner width_percent={safePct}>\n <VideoPlayerFromDescriptor video={descriptor} />\n </StyledVideoInner>\n </StyledVideoContainer>\n );\n};\n\nexport default VideoPlayer;\n"]}