@nuskin/marketing-components 1.43.2 → 1.43.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/gitlab-runner-data/builds/ns-am/content-foundation/marketing-components/dist/index.js","../src/index.ts","../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/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.tsx","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/content-card/ContentCard.styled.ts","../src/content-card/utils/helpers.ts","../src/rich-text/RichText.tsx","../src/rich-text/RichText.styled.tsx","../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"],"names":["vo","Object","create","Te","defineProperty","Eo","getOwnPropertyDescriptor","wo","getOwnPropertyNames","ko","getPrototypeOf","$o","prototype","hasOwnProperty","_o","e","t","n","get","enumerable","Tt","r","i","call","$","__esModule","value","Ro","index_exports","__export","Button","Button_default","Buttons","ButtonWrapper_default","BynderMedia","Carousel","ColumnControl","ColumnControl_default","ContentCard","ContentCard_default","CsImage","CsImage_default","CsTextComponent","CsText_default","DEFAULT_BANNER_CONFIG","DEFAULT_CAROUSEL_CONFIG","DEFAULT_ROTATION_INTERVAL","HeroBanner","HeroBanner_default","MarketingBanner","MarketingBannerComponent","PLACEHOLDER_VALUES","RichTextComponent","RichText_default","SpacingDivider","SpacingDivider_default","extractBynderMedia","getMediaUrl","module","exports","__toCommonJS","import_react","require","import_styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","DEFAULT_REGION","DEFAULT_LANGUAGE","getRegionAndLanguageFromSearch","search","startsWith","params","URLSearchParams","getRegionAndLanguageFromPath","pathname","parts","split","filter","Boolean","length","getRegionAndLanguageFromLocation","window","location","import_material","import_foundation_theme","Ct","ColorUtils","getGenomeColor","vt","useToggleFontColor","toggleValue","theme","St","useTheme","Et","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","Ce","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","wt","styled","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","resolveBackgroundColor","trimmed","CsText","full_width","container_background_color","text_editor","font_color","fontColor","regionLang","backgroundColor","updatedHtml","Ve","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","kt","image_alignment","width","height","display","justifyContent","left","right","center","maxWidth","objectFit","objectPosition","PLACEHOLDER_IMAGE_SRC","encodeURIComponent","allowedImageProps","props","align","image","parent$","isEditing","rest","selectedImage","fileMeta","contentstackAsset","parsed","entry","selected","files","err","console","warn","resolvedSrc","resolvedAlt","resolvedWidth","resolvedHeight","imageType","fileSource","altText","title","filename","imageProps","src","alt","key","containerClassForNSImage","je","className","_t","NsImage","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","rotationInterval","header","subtitle","typographyVariants","h1","desktop","fontSize","lineHeight","mobile","fontFamily","h2","h3","disclaimer","boxquote","commonTextStyles","variantToElement","TypographyStyled","Pt","variant","variantStyle","fontFamilyValue","fontWeight","isBoxquote","Typography","inputText","dataTestId","elementType","Dt","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","centerOnMobile","V","css","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","le","textAlignment","HeaderTextWrapper","TitleWrapper","SubtitleWrapper","BodyTextWrapper","getDisplayText","placeholderValue","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","H","jsxs","header_text","body_text","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParams","searchParams","getAll","isFit","some","io","hasFillWithDimensions","includes","has","skipAspectRatio","updatedIoParams","push","origin","error","addDefaultTransform","extractFocusPointFromUrl","focuspoint","parseFloat","x","y","isNaN","Math","round","parseObjectPosition","normalized","toLowerCase","mediaJson","firstImage","mediaUrl","endsWith","isResponsive","focusPoint","result","imageFit","fit","desktopUrl","mobileUrl","MediaContainer","ce","StyledImage","img","StyledVideo","video","PictureElement","picture","SourceElement","source","bynder_media","et","React","useState","hasError","setHasError","mediaInfo","handleMediaError","mediaAlt","G","onError","autoPlay","muted","loop","playsInline","srcSet","loading","useReducedMotion","$e","prefersReducedMotion","setPrefersReducedMotion","useEffect","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","pauseOnHover","initialIndex","validInitialIndex","min","_","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","useCallback","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","hasCTA","banner","cta_button","buttons","isCarouselMode","Array","isArray","banners","hasMedia","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","getBaseUrl","isValidUrl","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","ButtonContainer","me","verticalAlignment","StyledButton","hn","NsButton","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$hoverText","$underlineColor","$buttonWidth","$maxButtonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","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","_e","NsIconVariants","iconSize","renderIcon","iconColor","A","NsIcon","name","colorOverride","getLabelText","labelTitle","$variant","rel","Fragment","getButtonProps","button","buttonProps","keys","Tn","BannerContainer","L","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","ButtonWrapper","CarouselControls","Indicator","active","renderBanner","showMedia","showCTA","baseTestId","resolvedTextColor","text_color","show_gradient","content_position","gradientColor","gradientDirection","gradient_depth","v","buttons__0","rotation_interval","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","onClick","THICKNESS_PX","thin","thick","ultra","StyledSpacingContainer","ct","vertical_padding","divider_alignment","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","test","hexToRgb","hex","parseInt","slice","g","b","gradientPresetCss","preset","baseHex","rgb","DEFAULT_HEX","divider_thickness","divider_gradient_preset","finalDividerColor","pt","import_react_slick","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","ee","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","Yn","slides","slides__parent","getPresetColumns","unwrapComponent","mod","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","er","SliderImport","getSlideKey","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","addSlideEditTags","slide","currentFlexBasis","Ae","style","useCarouselResize","slideCount","fe","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","useCarouselLayout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","emptyPlaceholderText","emptyPlaceholderTextProp","effectiveFullWidth","containerRef","R","useRef","setContainerWidthPx","updateContainerWidth","el","current","getComputedStyle","pl","paddingLeft","pr","paddingRight","offsetWidth","ResizeObserver","ro","observe","disconnect","targetSlidesToShow","effectiveAutoplayEnabled","effectiveShowPagination","showArrowsOnDesktop","isStackedViewport","isTabletGridViewport","containerHeight","sliderRef","slickPrev","slickNext","containerClassName","isVariablePresetDesktop","effectiveSlidesToShow","responsiveSettings","slidesLength","sliderSettings","infinite","speed","autoplay","autoplaySpeed","swipe","draggable","beforeChange","next","responsive","renderSlides","hasSlides","dotsPosition","carouselProps","lr","renderEmptySlot","slotIndex","B","ref","cr","createElement","from","offset","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","ColumnControlContainer","te","TabletGridContainer","flexWrap","columns","getGridDimensions","layout","fallback","rows","rawCols","rawRows","parsedCols","Number","parsedRows","isFinite","getMaxChildrenForLayout","maxByLayout","mapPresetToGridLayout","vr","emptyTextProp","effectiveGridLayout","maxChildren","visibleSlides","slidesCount","$r","renderSlot","hasSlide","id","Z","noForward$","Card","ie","article","$maxHeight","shouldForwardProp","$mediaHeight","$mediaMaxHeight","$inlineMedia","Content","RichTextWrapper","CtaWrapper","ContentInner","getEffectiveCta","cta","getTitle","normalizeContentAlignment","normalizeCtaStyle","raw","getCtaState","ctaStyle","ctaStyleNormalized","effectiveCta","hasCtaHref","hasCtaLabel","isCardLink","showButton","cardTarget","getMediaLayout","isInlineMedia","mediaHeightValue","mediaMaxHeightValue","import_dompurify","ht","RichTextInner","SANITIZATION_CONFIG","ALLOWED_TAGS","ALLOWED_ATTR","sanitizeHtml","zr","DOMPurify","sanitize","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","getAlignItems","RichText","container_alignment","container_vertical_alignment","container_width","restProps","sanitizedHtml","Ur","fontColorBoolean","Le","CardTextBlock","contentTitle","editTags","bodyHtml","E","CardCtaBlock","show","buttonParent$","cta_style","card_cta_group","button_cta_group","content_alignment","background_color","border_radius","max_height","normalizedStyle","activeCta","cardAs","cardLinkProps","PLACEHOLDER_BRAND_CAPTION","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","ARIA_LABEL_HERO_BANNER","getTypographyFields","brandcaption","placeholder","editTagKey","TypographyFields","fields","he","field","editAttributes","displayValue","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","getGradientColor","gradientDirectionMap","getGradientDirection","MediaLayer","ae","GRADIENT_OPACITIES","getGradientBackground","Overlay","HERO_CTA_WRAPPER_CLASS","class_name","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","F"],"mappings":"AAAA,6jkBAAa,IAAIA,GAAGC,OAAOC,MAAM,CAAC,IAAIC,GAAGF,OAAOG,cAAc,CAAC,IAAIC,GAAGJ,OAAOK,wBAAwB,CAAC,IAAIC,GAAGN,OAAOO,mBAAmB,CAAC,IAAIC,GAAGR,OAAOS,cAAc,CAACC,GAAGV,OAAOW,SAAS,CAACC,cAAc,CAAC,IAAIC,GAAG,SAACC,EAAEC,GAAK,IAAI,IAAIC,KAAKD,EAAEb,GAAGY,EAAEE,EAAE,CAACC,IAAIF,CAAC,CAACC,EAAE,CAACE,WAAW,CAAC,CAAC,EAAE,EAAEC,GAAG,SAACL,EAAEC,EAAEC,EAAEI,OAAwD,OAAA,QAAA,YAAnD,GAAGL,GAAG,CAAA,OAAOA,4BAAP,EAAOA,EAAAA,GAAG,UAAU,OAAOA,GAAG,gCAAe,IAAIM,EAAJ,OAAe,EAACX,GAAGY,IAAI,CAACR,EAAEO,IAAIA,IAAIL,GAAGd,GAAGY,EAAEO,EAAE,CAACJ,IAAI,kBAAIF,CAAC,CAACM,EAAE,EAACH,WAAW,CAAEE,CAAAA,EAAEhB,GAAGW,EAAEM,EAAC,GAAID,EAAEF,UAAU,IAAnG,QAAI,EAASZ,GAAGS,sBAAZ,IAAA,GAAA,EAAA,gBAAA,oBAAA,OAAA,oBAAA,GAAA,gBAAA,uBAAA,SAAA,IAAkG,OAAOD,CAAC,EAAE,IAAIS,GAAE,SAACT,EAAEC,EAAEC,UAAKA,EAAEF,GAAG,KAAKf,GAAGS,GAAGM,IAAI,CAAC,EAAEK,GAAGJ,GAAG,CAACD,GAAG,CAACA,EAAEU,UAAU,CAACtB,GAAGc,EAAE,UAAU,CAACS,MAAMX,EAAEI,WAAW,CAAC,CAAC,GAAGF,EAAEF,IAAIY,GAAGZ,SAAAA,UAAGK,GAAGjB,GAAG,CAAC,EAAE,aAAa,CAACuB,MAAM,CAAC,CAAC,GAAGX,ICA3kB,IAAAa,GAAA,CAAA,EAAAC,GAAAD,GAAA,CAAAE,OAAA,kBAAAC,IAAAC,QAAA,kBAAAC,IAAAC,YAAA,kBAAAA,IAAAC,SAAA,kBAAAA,IAAAC,cAAA,kBAAAC,IAAAC,YAAA,kBAAAC,IAAAC,QAAA,kBAAAC,IAAAC,gBAAA,kBAAAC,IAAAC,sBAAA,kBAAAA,IAAAC,wBAAA,kBAAAA,IAAAC,0BAAA,kBAAAA,IAAAC,WAAA,kBAAAC,IAAAC,gBAAA,kBAAAC,IAAAC,mBAAA,kBAAAA,IAAAC,kBAAA,kBAAAC,IAAAC,eAAA,kBAAAC,IAAAC,mBAAA,kBAAAA,IAAAC,YAAA,kBAAAA,GAAAA,EAAAC,CAAAA,OAAAC,OAAA,CAAAC,GAAAhC,ICAA,IAAAiC,GAAsCC,QAAA,SACtCC,GAAmBvC,GAAAsC,QAAA,oBCDnB,IAAAD,GAAwBC,QAAA,SCAxB,IAAME,GAA4B,cAC5BC,GAAqC,cACrCC,GAA0B,YAC1BC,GAAmC,YAW5BC,GAA2B,SAACC,OAAcC,yDAAgC,CAAC,SAChF,OAAOD,GAAS,SACT,GAGPC,CAAAA,EAASC,MAAA,EACTF,CAAAA,EAAOA,EAAKG,OAAA,CAAQN,GAAyBI,EAASC,MAAM,EAC5DF,EAAOA,EAAKG,OAAA,CAAQL,GAAkCG,EAASC,MAAA,CAAOE,WAAA,GAAa,EAGnFH,EAASI,QAAA,EACTL,CAAAA,EAAOA,EAAKG,OAAA,CAAQR,GAA2BM,EAASI,QAAQ,EAChEL,EAAOA,EAAKG,OAAA,CAAQP,GAAoCK,EAASI,QAAA,CAASD,WAAA,GAAa,EAGpFJ,CAAAA,GAmDX,IAAMM,GAAiB,KACjBC,GAAmB,KAEzB,SAASC,GAA+BC,CAAAA,MAC/BA,EAAL,GAAI,EAACA,UAAAA,mBAAAA,EAAAA,EAAQC,UAAA,UAARD,kBAAAA,OAAAA,EAAqB,MACtB,OAGJ,IAAME,EAAS,IAAIC,gBAAgBH,GAC7BP,EAASS,EAAO9D,GAAA,CAAI,UACpBwD,EAAWM,EAAO9D,GAAA,CAAI,YAE5B,GAAI,CAAA,CAAA,CAACqD,GAAU,CAACG,CAAAA,EAIhB,MAAO,CACHH,OAAQA,UAAAA,WAAAA,EAAUI,GAClBD,SAAUA,UAAAA,WAAAA,EAAYE,EAC1B,CACJ,CAEA,SAASM,GAA6BC,CAAAA,EAClC,GAAI,CAACA,EACD,OAGJ,IAAMC,EAAQD,EAASE,KAAA,CAAM,KAAKC,MAAA,CAAOC,SACzC,GAAIH,EAAMI,MAAA,CAAS,EACf,OAGJ,IAA2BJ,IAAAA,KAApBb,EAAoBa,KAAZV,EAAYU,KAC3B,GAAIb,CAAAA,UAAAA,kBAAAA,EAAQiB,MAAA,IAAW,GAAKd,CAAAA,UAAAA,kBAAAA,EAAUc,MAAA,IAAW,EAC7C,MAAO,CAAEjB,OAAAA,EAAQG,SAAAA,CAAS,CAIlC,CAEO,IAAMe,GAAmC,WAE5C,GAAI,CAAA,OAAOC,iCAAP,EAAOA,OAAA,EAAW,KAAe,CAACA,OAAOC,QAAA,CACzC,MAAO,CAAEpB,OAAQI,GAAgBD,SAAUE,EAAiB,EAGhE,IAA6Bc,EAAAA,OAAOC,QAAA,CAA5Bb,EAAqBY,EAArBZ,OAAQK,EAAaO,EAAbP,aAIZN,EAAAA,EADJ,MACIA,CAAAA,EAAAA,CAAAA,EAAAA,GAA+BC,YAA/BD,WAAAA,EACAK,GAA6BC,YAD7BN,WAAAA,EAC0C,CACtCN,OAAQI,GACRD,SAAUE,EACd,CAER,ECxIA,IAAAf,GAAwBC,QAAA,SAExB8B,GAAyB9B,QAAA,iBACzB+B,GAA2B/B,QAAA,4BAEAgC,GAAAA,GAAAC,UAAA,CAAnBC,GAAmBF,GAAnBE,eCLR,IAAAJ,GAAyB9B,QAAA,iBACzB+B,GAA2B/B,QAAA,4BAC3BD,GAAwBC,QAAA,SAEGmC,GAAAA,GAAAF,UAAA,CAAnBC,GAAmBC,GAAnBD,eAOFE,GAAqB,eAACC,yDAAuB,CAAA,EAC/C,IAAMC,EAAAA,CAAAA,EAAQC,GAAAC,QAAA,IAEd,MAAA,CAAA,EAAOC,GAAAC,OAAA,EACH,kBAAMR,GAAeI,EAAO,MAAOD,EAAc,QAAU,SAC3D,CAACA,EAAaC,EAClB,CACJ,EAEOK,GAAQP,GJ+IH,IAAAQ,GAAA5C,QAAA,qBAlJN6C,GAAoB,iBAAA,CAAA,EACfC,GAAAJ,OAAA,EAAQ,kBAAMf,MAAoC,EAAE,GAIzDoB,GAAa,SAACC,EAAaxC,SACzB,CAACA,GAAY,CAACwC,EAAYA,EACvB1C,GAAyB0C,EAAKxC,IAI5ByC,GAAe,SAACC,EAAc1C,GACvC,GAAI,CAAA,OAAOoB,iCAAP,EAAOA,OAAA,EAAW,KAAe,CAACsB,GAAQ,CAAC1C,EAAU,OAAO0C,EAGhE,IAAMC,EADS,IAAIC,YACAC,eAAA,CAAgBH,EAAM,aAEzC,OAAAC,EAAIG,gBAAA,CAAiB,KAAKC,OAAA,CAASC,SAAAA,GAC/B,IAAMC,EAAOD,EAAKE,YAAA,CAAa,OAC1BD,CAAAA,GACLD,EAAKG,YAAA,CAAa,OAAQZ,GAAWU,EAAMjD,GAC/C,GAEO2C,EAAIS,IAAA,CAAKC,SACpB,EAGMC,GAAYC,GAAAC,OAAAA,CAAOC,GAAA,KAMZ,gBAAGC,IAAAA,iBAAiBA,EAAY,OAAS,QAC9B,gBAAGC,IAAAA,eAAcA,GACvB,gBAAGC,IAAAA,iBAAgBA,GACxB,gBAAGC,IAAAA,aAAYA,IA4CtBC,GAA0BC,SAAAA,OACdA,EAAAA,MAAAA,EAAd,IAAMF,EAAQE,CAAAA,EAAAA,UAAAA,mBAAAA,EAAAA,EAAKC,UAAA,UAALD,mBAAAA,EAAAA,EAAiBE,QAAA,UAAjBF,kBAAAA,EAA2BG,KAAA,UAA3BH,WAAAA,EAAoCA,UAAAA,kBAAAA,EAAKF,KAAA,CACvD,OAAO,OAAOA,GAAU,UAAYA,EAAMM,IAAA,GAASN,EAAQ,IAC/D,EAEMO,GAAkBC,SAAAA,GACpB,GAAI,KACeC,EAAAA,EAAAA,EACf,IAAMT,GADSS,EAAAA,KAAKC,KAAA,CAAMF,YAAXC,mBAAAA,EAAAA,EACON,UAAA,UADPM,mBAAAA,EAAAA,EACmBL,QAAA,UADnBK,kBAAAA,EAC6BJ,KAAA,CAC5C,OAAO,OAAOL,GAAU,UAAYA,EAAMM,IAAA,GAASN,EAAQ,IAC/D,CAAA,QAAQ,CACJ,OAAO,IACX,CACJ,EAEaW,GAA0BpH,SAAAA,GAEnC,GAAI,CAACA,EAAO,MAAO,kBAID0G,EADlB,GAAI,CAAA,OAAO1G,4BAAP,EAAOA,EAAAA,GAAU,SAEjB,MADc0G,CAAAA,EAAAA,GAAuB1G,YAAvB0G,WAAAA,EACE,cAIpB,GAAI,OAAO1G,GAAU,SAAU,CAC3B,IAAMqH,EAAUrH,EAAM+G,IAAA,OAKJC,EAJlB,OAAKK,EAGDA,EAAQhE,UAAA,CAAW,KACL2D,CAAAA,EAAAA,GAAeK,YAAfL,WAAAA,EACE,cAIbK,EATc,aAUzB,CAGA,MAAO,aACX,EAEMC,GAAS,gBACXC,IAAAA,WAAAA,EAAAA,WAAa,CAAA,EAAbA,EACAC,IAAAA,2BACAhB,IAAAA,UAAAA,EAAAA,WAAY,OAAZA,EACAiB,IAAAA,YACAC,IAAAA,WAAAA,EAAAA,WAAa,CAAA,EAAbA,EACA5H,IAAAA,EAEA,IAAM6H,EAAY5C,GAAmB2C,GAC/BE,EAAa3C,KAEb4C,EAAAA,CAAAA,EAAkB3C,GAAAJ,OAAA,EACpB,kBAAMsC,GAAuBI,IAC7B,CAACA,EACL,EAEMM,EAAAA,CAAAA,EAAc5C,GAAAJ,OAAA,EAAQ,kBAAMO,GAAaoC,EAAaG,IAAa,CAACH,EAAaG,EAAW,EAElG,OAAKH,EAAAA,CAAAA,EAGDM,GAAAC,GAAA,EAAC9B,GAAA,CAAUI,UAAWiB,EAAYhB,QAASsB,EAAiBrB,UAAWA,EAAWC,MAAOkB,EACrFM,SAAA,CAAA,EAAAF,GAAAC,GAAA,EAAC,MAAA,GAAIE,wBAAyB,CAAEC,OAAQL,CAAY,GAAOhI,UAAAA,kBAAAA,EAAG2H,WAAA,EAAa,GAJ1D,IAO7B,EAEOxG,GAAQqG,GKxKf,IAAAc,GAAwBhG,QAAA,oCCAxB,IAAA+B,GAAuB/B,QAAA,4BAGViG,GAAAA,CAAAA,EAAuBC,GAAAlC,MAAA,EAAO,OAEzC,gBAAGmC,IAAAA,gBAAAA,EAAAA,WAAkB,SAAlBA,EAA4BC,IAAAA,MAAOC,IAAAA,aAAc,CAClDC,QAAS,OACTC,eAAgB,CAAA,CACZC,KAAM,aACNC,MAAO,WACPC,OAAQ,QACZ,CAAA,CAAA,CAAEP,EAAe,CACjB,QAAS,CACLQ,SAAU,cACVC,UAAW,UACXC,eAAgB,QACpB,CACJ,IDyFY,IAAAjE,GAAA5C,QAAA,qBArGC8G,GACT,2BACAC,mBACI,w0BAgBFC,GAA4C,CAC9C,MACA,YACA,OACA,SACA,KACA,MACA,UACA,QACJ,CAEMtI,GAAWuI,SAAAA,GACb,IAAyBC,EAA4DD,EAA7Ed,gBAAiBe,EAAAA,WAAQ,SAARA,EAAkBC,EAA0CF,EAA1CE,MAAOC,EAAmCH,EAAnCG,QAASC,EAA0BJ,EAA1BI,UAAW3J,EAAeuJ,EAAfvJ,EAAM4J,IAASL,GAA7Ed,kBAAmCgB,QAAOC,UAASC,YAAW3J,MAElE6J,EAAkC,KAClCC,EAAiD,KACjDC,EAA8C,KAElD,GAAI,KAIcC,EAHd,IAAMA,EAAS,OAAOP,GAAU,SAAWrC,KAAKC,KAAA,CAAMoC,GAASA,EAGzDQ,EAAQD,UAAAA,mBAAAA,EAAAA,EAAQP,KAAA,UAARO,kBAAAA,CAAQ,CAAQ,EAAC,AAC3BC,EAAAA,UAAAA,kBAAAA,EAAOC,QAAA,IAAYD,UAAAA,kBAAAA,EAAOE,KAAA,EAC1BN,CAAAA,EAAgBI,UAAAA,kBAAAA,EAAOC,QAAA,CACvBJ,EAAWG,UAAAA,kBAAAA,EAAOE,KAAA,EACXH,CAAAA,UAAAA,kBAAAA,EAAQ1E,GAAA,GAEfyE,CAAAA,EAAoBC,CAAAA,CAE5B,CAAA,MAASI,EAAK,CACVC,QAAQC,IAAA,CAAK,wCAAyCF,EAC1D,CAEA,IAAIG,EAAcnB,GACdoB,EAAc,sBACdC,EAAiC,OACjCC,EAAkC,OAGtC,GAAIb,GAAiBC,EAAU,KACTD,EAAlB,IAAMc,EAAYd,CAAAA,EAAAA,UAAAA,kBAAAA,EAAec,SAAA,UAAfd,WAAAA,EAA4B,mBACxCe,EAAad,UAAAA,kBAAAA,CAAAA,CAAWa,EAAS,KAKrBd,EACEA,EACCA,CAJjBe,EAAAA,UAAAA,kBAAAA,EAAYtF,GAAA,GACZiF,CAAAA,EAAcK,EAAWtF,GAAA,CACzBkF,EAAcX,CAAAA,EAAAA,UAAAA,kBAAAA,EAAegB,OAAA,UAAfhB,WAAAA,EAA0B,QACxCY,EAAgBZ,CAAAA,EAAAA,UAAAA,kBAAAA,EAAenB,KAAA,UAAfmB,WAAAA,EAAwB,OACxCa,EAAiBb,CAAAA,EAAAA,UAAAA,kBAAAA,EAAelB,MAAA,UAAfkB,WAAAA,EAAyB,MAAA,CAElD,KAESE,CAAAA,UAAAA,kBAAAA,EAAmBzE,GAAA,GACxBiF,CAAAA,EAAcR,EAAkBzE,GAAA,CAChCkF,EAAcT,EAAkBe,KAAA,EAASf,EAAkBgB,QAAA,EAAY,OAAA,EAI3E,IAAMC,EAA2B,CAC7BC,IAAKV,EACLW,IAAKV,EACL9B,MAAO+B,EACP9B,OAAQ+B,CACZ,EAGApB,GAAkBzD,OAAA,CAASsF,SAAAA,GACnBvB,CAAAA,CAAKuB,EAAG,GAAM,KAAA,GACbH,CAAAA,CAAAA,CAAuCG,EAAG,CAAIvB,CAAAA,CAAKuB,EAAG,CAE/D,GAEA,IAAMC,EAA2BxB,CAAAA,UAAAA,kBAAAA,EAAMnC,UAAA,EAAa,iBAAmB,GAEvE,MAAA,CAAA,EACI4D,GAAAnD,GAAA,EAACK,GAAA,CACGE,gBAAiBe,EACjBd,MAAOsC,EAAWtC,KAAA,CAClBC,OAAQqC,EAAWrC,MAAA,CACnB2C,UAAWF,EAEXjD,SAAA,CAAA,EAAAkD,GAAAnD,GAAA,EAACqD,GAAAC,OAAA,CAAA,KAAYR,EAAiBhL,CAAAA,UAAAA,kBAAAA,EAAGyJ,KAAA,GAAS,CAAC,GAAI,EAG3D,EAEOxI,GAAQD,GE1GR,IAAMI,GAAwB,CACjCqK,SAAU,OACVC,UAAW,QACXC,aAAc,CAAA,EACdC,cAAe,KACfC,UAAW,QACXC,WAAY,MAChB,EAEazK,GAA0B,CACnC0K,iBAAkB,GACtB,EAEazK,GAA4B,IAE5BK,GAAqB,CAC9BqK,OAAQ,eACRlB,MAAO,cACPmB,SAAU,iBACV/F,KAAM,iBACV,ECzBA,IAAA3D,GAAmBvC,GAAAsC,QAAA,oBAGN4J,GAAqB,CAC9BC,GAAM,CAAEC,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,MAAO,EAChIC,GAAM,CAAEL,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,MAAO,EAChIE,GAAM,CAAEN,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,MAAO,EAChItG,KAAQ,CAAEkG,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,OAAQ,EACnIG,WAAc,CAAEP,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,OAAQ,EACzII,SAAY,CAAER,QAAS,CAAEC,SAAU,OAAQC,WAAY,MAAO,EAAGC,OAAQ,CAAEF,SAAU,OAAQC,WAAY,MAAO,EAAGE,WAAY,OAAQ,CAC3I,EAQaK,GAAmB,0oBA2CnBC,GAA2C,CACpDX,GAAM,KACNM,GAAM,KACNC,GAAM,KACNxG,KAAQ,IACRyG,WAAc,IACdC,SAAY,GAChB,EAEaG,GAAmBC,GAAA1G,OAAAA,CAAOC,GAAA,KACjC,gBAAG0G,IAAAA,QAAStG,IAAAA,MAAAA,EAAAA,WAAQ,UAARA,EACV,GAAI,CAACsG,EACD,MAAO,4BAMDJ,OALOlG,EAAK,2LAKI,OAAhBkG,GAAgB,kBAI1B,IAAMK,EAAehB,EAAAA,CAAmBe,EAAO,CAC/C,GAAI,CAACC,EAAc,MAAO,GAE1B,IAAMC,EAAkBD,EAAaV,UAAA,GAAe,OAAS,gBAAkB,sBACzEY,EAAcF,EAAqBE,UAAA,EAAc,MACjDC,EAAcJ,IAAuB,WAE3C,MAAO,8DAGYC,OADFA,EAAad,OAAA,CAAQC,QAAQ,CAAA,gCAE3Bc,OADAD,EAAad,OAAA,CAAQE,UAAU,CAAA,gCAErC3F,OADMwG,EAAe,0BAIfC,OAHNzG,EAAK,iFAIZ0G,OADaD,EAAU,mBAYRF,OAXfG,EAAa,wLAOX,GAAE,oHAKaH,OADFA,EAAaX,MAAA,CAAOF,QAAQ,CAAA,oCAS3CQ,OARiBK,EAAaX,MAAA,CAAOD,UAAU,CAAA,yNAQ/B,OAAhBO,GAAgB,aAE1B,GC5FI,IAAA3H,GAAA5C,QAAA,qBAXKgL,GAAa,gBACtBL,IAAAA,QACAM,IAAAA,UACA5G,IAAAA,MAAAA,EAAAA,WAAQ,UAARA,EACA2E,IAAAA,UAAAA,EAAAA,WAAY,GAAZA,EACAkC,IAAAA,WACGjE,OALH0D,UACAM,YACA5G,QACA2E,YACAkC,eAGA,IAAMC,EAAcR,GAAUH,EAAAA,CAAiBG,EAAO,EAAK,MAE3D,MAAA,CAAA,EACIS,GAAAxF,GAAA,EAAC6E,GAAA,KACGY,GAAIF,EACJR,QAASA,EACTtG,MAAOA,EACP2E,UAAWA,EACX,cAAakC,GACTjE,IAEHpB,SAAAoF,IAGb,EAEOK,GAAQN,GC1Cf,IAAA/K,GAAmBvC,GAAAsC,QAAA,oBCKZ,IAAMuL,GAAc,CACvBtB,OAAQ,EACRuB,OAAQ,IACR1B,QAAS,KACT2B,KAAM,IACV,EAuCO,IAAMC,GAAU,CAEnBC,aAAc,gBACdC,YAAa,gBACbC,eAAgB,eAChBC,WAAY,IAGZC,QAAS,SACTC,eAAgB,OAChBC,cAAe,OACfC,YAAa,UAGbC,kBAAmB,YACnBC,iBAAkB,YAClBC,eAAgB,WACpB,EAEaC,GAAa,CAEtBC,oBAAqB,QACrBC,mBAAoB,QAGpBC,aAAc,QAGdC,cAAe,OACfC,gBAAiB,KACrB,EAEaC,GAAS,CAElBC,UAAW,UACXC,SAAU,UACVC,SAAU,OAGVC,QAAS,UACTC,UAAW,UAGXC,WAAY,UAGZP,gBAAiB,2BACjBQ,gBAAiB,2BACjBC,kBAAmB,aACvB,EAEaC,GAAiB,CAC1BC,MAAOV,GAAOC,SAAA,CACdU,KAAMX,GAAOE,QACjB,EAEaU,GAAc,CACvBC,KAAM,YACNC,QAAS,YACTC,KAAM,mCACV,EAEaC,GAAU,CACnBC,WAAY,EACZC,MAAO,EACPC,SAAU,EACVC,QAAS,EACTC,SAAU,CACd,EAEaC,GAAgB,CACzB1C,OAAQ,sBAAmED,OAA7CA,GAAYC,MAAA,CAAS,EAAC,wBAA8C,OAAvBD,GAAYzB,OAAA,CAAU,EAAC,OAClGA,QAAS,sBAAgEyB,OAA1CA,GAAYzB,OAAO,CAAA,wBAA2C,OAApByB,GAAYE,IAAA,CAAO,EAAC,OAC7FA,KAAM,sBAAsC,OAAhBF,GAAYE,IAAI,CAAA,OAC5C0C,eAAgB,sBAAwC,OAAlB5C,GAAYC,MAAM,CAAA,OACxD4C,aAAc,sBAAyC,OAAnB7C,GAAYzB,OAAO,CAAA,MAC3D,ECxHA,IAAA/J,GAAoBC,QAAA,kBAwBb,IAAMqO,GAAiBC,GAAAC,GAAA,KACxBL,GAAcC,cAAc,EAQrBK,GAAmB,eAC5BC,yDAAuB,CAAC,mBAAoB,QAAS,eAAgB,YAAa,kBAAiB,QAClGH,GAAAC,GAAA,KACaE,EAAWC,GAAA,CAAKC,SAAAA,SAAS,GAAWnB,OAARmB,EAAI,KAAuB,OAAnBnB,GAAYE,OAAO,IAAIkB,IAAA,CAAK,QAgB3E,IAAMC,GAAeP,GAAAC,GAAA,MAWfO,GAAmBR,GAAAC,GAAA,KAC1BM,IAQOE,GAAmBT,GAAAC,GAAA,MASnBS,GAAaV,GAAAC,GAAA,MASbU,GAAeX,GAAAC,GAAA,MAqBrB,IAAMW,GAAkB,SAACC,EAAmBC,EAAsBC,EAAoBC,UAAsBhB,GAAAC,GAAA,KACjFY,EAAmBG,EAAcF,EAAuBE,EAAcD,IAM3FE,GAAwB,SAACH,EAAsBC,EAAoBC,UAAsBhB,GAAAC,GAAA,KACvDe,EAAcF,EAAuBE,EAAcD,IFvH3F,IAAMG,GAAgBC,GAAAzL,OAAAA,CAAOC,GAAA,KAGlB,gBAAGyL,IAAAA,qBAAoBA,GAGnCrB,IAGOsB,GAAoBF,GAAAzL,OAAAA,CAAOC,GAAA,KAC1ByH,GAAQC,YAAY,EAIrBiE,GAAeH,GAAAzL,OAAAA,CAAOC,GAAA,KACrByH,GAAQE,WAAW,EAGpBiE,GAAkBJ,GAAAzL,OAAAA,CAAOC,GAAA,KACxByH,GAAQG,cAAc,EAGvBiE,GAAkBL,GAAAzL,OAAAA,CAAOC,GAAA,KACxByH,GAAQI,UAAU,EGcxB,IAAAlJ,GAAA5C,QAAA,qBA/BR,SAAS+P,GAAexP,CAAAA,CAA0ByP,CAAAA,CAA0B3I,CAAAA,EACxE,GAAIA,IAAc,CAAA,GAAS,CAAA,CAAC9G,GAAQA,IAASyP,CAAAA,EACzC,OAAOA,EAEX,GAAI,CAAA3I,CAAAA,IAAc,CAAA,GAAS9G,IAASyP,CAAAA,EAGpC,OAAOzP,CACX,CAEO,SAAS0P,GAAW,CAU3B,MATIC,EADuB,EACvBA,WACA1H,EAFuB,EAEvBA,MACAmB,EAHuB,EAGvBA,SACAwG,EAJuB,EAIvBA,SACA/G,EALuB,EAKvBA,UAAAA,EAAAA,WAAY,UAAZA,EACAsG,EANuB,EAMvBA,cAAAA,EAAAA,WAAgB,OAAhBA,EACAU,EAPuB,EAOvBA,OACA1S,EARuB,EAQvBA,EACA2J,EATuB,EASvBA,UAEA,IAAMqC,EAASqG,GAAeG,EAAY7Q,GAAmBqK,MAAA,CAAQrC,GAC/DgJ,EAAeN,GAAevH,EAAOnJ,GAAmBmJ,KAAA,CAAOnB,GAC/DiJ,EAAkBP,GAAepG,EAAUtK,GAAmBsK,QAAA,CAAUtC,GACxEzD,EAAOmM,GAAeI,EAAU9Q,GAAmBuE,IAAA,CAAMyD,OAetC3J,EAWAA,EAWAA,EAWAA,EA9CzB,MAAI,CAACgM,GAAU,CAAC2G,GAAgB,CAACC,GAAmB,CAAC1M,EAC1C,KAAA,CAAA,EAIP2M,GAAAC,IAAA,EAAChB,GAAA,CAAcE,cAAeA,EAAe,cAAaU,EACrDvK,SAAA,CAAA6D,GAAAA,CAAAA,EACG6G,GAAA3K,GAAA,EAAC+J,GAAA,CACG9J,SAAA,CAAA,EAAA0K,GAAA3K,GAAA,EAAC0F,GAAA,GACGX,QAAQ,aACRM,UAAWvB,EACXrF,MAAO+E,EACP,aAAYM,GACPhM,CAAAA,EAAAA,UAAAA,kBAAAA,EAAG+S,WAAA,UAAH/S,WAAAA,EAAkB,CAAC,GAC5B,GAGP2S,GAAAA,CAAAA,EACGE,GAAA3K,GAAA,EAACgK,GAAA,CACG/J,SAAA,CAAA,EAAA0K,GAAA3K,GAAA,EAAC0F,GAAA,GACGX,QAAQ,KACRM,UAAWoF,EACXhM,MAAO+E,EACP,aAAYiH,GACP3S,CAAAA,EAAAA,UAAAA,kBAAAA,EAAG8K,KAAA,UAAH9K,WAAAA,EAAY,CAAC,GACtB,GAGP4S,GAAAA,CAAAA,EACGC,GAAA3K,GAAA,EAACiK,GAAA,CACGhK,SAAA,CAAA,EAAA0K,GAAA3K,GAAA,EAAC0F,GAAA,GACGX,QAAQ,KACRM,UAAWqF,EACXjM,MAAO+E,EACP,aAAYkH,GACP5S,CAAAA,EAAAA,UAAAA,kBAAAA,EAAGiM,QAAA,UAAHjM,WAAAA,EAAe,CAAC,GACzB,GAGPkG,GAAAA,CAAAA,EACG2M,GAAA3K,GAAA,EAACkK,GAAA,CACGjK,SAAA,CAAA,EAAA0K,GAAA3K,GAAA,EAAC0F,GAAA,GACGX,QAAQ,OACRM,UAAWrH,EACXS,MAAO+E,EACP,aAAYxF,GACPlG,CAAAA,EAAAA,UAAAA,kBAAAA,EAAGgT,SAAA,UAAHhT,WAAAA,EAAgB,CAAC,GAC1B,GACJ,EAIhB,CCzFA,IAAAqC,GAAkBrC,GAAAsC,QAAA,UCEX,SAASL,GACZiI,CAAAA,CACA+I,CAAAA,CACAC,CAAAA,EAEA,IAA0ChJ,EAAAA,UAAAA,WAAAA,EAAY,CAAC,EAA/C5E,EAAkC4E,EAAlC5E,IAAAA,EAAAA,WAAM,GAANA,EAAgB6N,EAAkBjJ,EAAxBkJ,KAAMD,EAAAA,WAAW,GAAXA,MAKTD,EAJf,OAAIC,IAAa,QACTF,EACO3N,EAEA4N,CAAAA,EAAAA,UAAAA,kBAAAA,CAAAA,CAAc,EAAC,UAAfA,WAAAA,EAAoB,GAG5B5N,CACX,CAEA,SAAS+N,GAAsBC,CAAAA,CAAiBC,CAAAA,EAC5C,GAAI,CACA,IAAMjO,EAAM,IAAIkO,IAAIF,GACdG,EAAWnO,EAAIoO,YAAA,CAAaC,MAAA,CAAO,MAEzC,GAAI,CAACF,EAASzP,MAAA,CAAQ,OAAOsP,EAE7B,IAAMM,EAAQH,EAASI,IAAA,CAAKC,SAAAA,UAAMA,EAAGvQ,UAAA,CAAW,mBAC1CwQ,EAAwBN,EAASI,IAAA,CAAKC,SAAAA,UACnCA,EAAGE,QAAA,CAAS,kBACTF,EAAGE,QAAA,CAAS,WAAaF,EAAGE,QAAA,CAAS,YACxC1O,EAAIoO,YAAA,CAAaO,GAAA,CAAI,UAAY3O,EAAIoO,YAAA,CAAaO,GAAA,CAAI,UAFhB,CAAA,IAKzCC,EAAkBN,GAASG,EAE3BI,EAAkBV,EAASzC,GAAA,CAAI8C,SAAAA,SAC7B,CAACI,GAAmBJ,EAAGE,QAAA,CAAS,kBACzB,GAAqBT,OAAlBO,EAAE,iBAA2B,OAAXP,GAEzBO,IAGLtQ,EAAmB,EAAC,CAC1B,OAAA2Q,EAAgBtO,OAAA,CAAQiO,SAAAA,UAAMtQ,EAAO4Q,IAAA,CAAK,MAAQ,OAAFN,MAChDtQ,EAAO4Q,IAAA,CAAK,cAEZ9O,EAAIoO,YAAA,CAAa7N,OAAA,CAAQ,SAAC3F,EAAOiL,GACzBA,IAAQ,MACR3H,EAAO4Q,IAAA,CAAK,GAAUlU,OAAPiL,EAAG,KAAS,OAALjL,GAE9B,GAEO,GAAgBoF,OAAbA,EAAI+O,MAAM,EAAmB7Q,OAAhB8B,EAAI3B,QAAQ,CAAA,KAAoB,OAAhBH,EAAO0N,IAAA,CAAK,KACvD,CAAA,MAASoD,EAAO,CACZ,OAAAjK,QAAQC,IAAA,CAAK,qCAAsCgK,GAC5ChB,CACX,CACJ,CAEA,SAASiB,GAAoBjB,CAAAA,EACzB,GAAI,CAEA,OADY,IAAIE,IAAIF,GACXI,YAAA,CAAaO,GAAA,CAAI,MAGnBX,EAFI,GAAU,OAAPA,EAAO,gCAGzB,CAAA,QAAgB,CACZ,OAAOA,CACX,CACJ,CAEA,SAASkB,GAAyBlP,CAAAA,EAC9B,GAAI,CAEA,IAAMmP,EADS,IAAIjB,IAAIlO,GACGoO,YAAA,CAAahU,GAAA,CAAI,cAE3C,GAAI+U,EAAY,CACZ,IAAeA,IAAAA,EAAW5Q,KAAA,CAAM,KAAKmN,GAAA,CAAI0D,eAAlCC,EAAQF,KAALG,EAAKH,KACf,GAAI,CAACI,MAAMF,IAAM,CAACE,MAAMD,GACpB,MAAO,CACHD,EAAGG,KAAKC,KAAA,CAAMJ,EAAI,KAClBC,EAAGE,KAAKC,KAAA,CAAMH,EAAI,IACtB,CAER,CACJ,CAAA,MAASN,EAAO,CACZjK,QAAQC,IAAA,CAAK,0CAA2CgK,EAC5D,CAEJ,CAEA,SAASU,GAAoBvJ,CAAAA,MAGNA,EAFnB,GAAI,CAACA,EAAU,MAAO,SAEtB,IAAMwJ,EAAaxJ,UAAAA,mBAAAA,EAAAA,EAAUxE,IAAA,YAAVwE,kBAAAA,EAAkByJ,WAAA,GAErC,OAAID,IAAe,UAAYA,IAAe,gBAAwB,SAClEA,EAAWjB,QAAA,CAAS,SAAWiB,EAAWjB,QAAA,CAAS,UACnDiB,EAAWjB,QAAA,CAAS,QAAUiB,EAAWjB,QAAA,CAAS,UAC3CiB,EAGJ,QACX,CAEO,SAASjT,GAAmBmT,CAAAA,EAC/B,GAAI,CAACA,EACD,OAAO,KAEX,GAAI,KACe/N,EAAAA,EACf,IAAMgO,GADShO,EAAAA,KAAKC,KAAA,CAAM8N,YAAX/N,mBAAAA,EAAAA,EACYqC,KAAA,UADZrC,kBAAAA,CACY,CAAQ,EAAC,CAC9B8C,EAAWkL,UAAAA,kBAAAA,EAAYlL,QAAA,CAEvBmL,EAAWpT,GAAYiI,EAAUkL,UAAAA,kBAAAA,EAAYnC,QAAA,CAAUmC,UAAAA,kBAAAA,EAAYlC,WAAW,EAEhFrH,EAA6B,OAC7B3B,EAAAA,UAAAA,kBAAAA,EAAUkJ,IAAA,IAAS,QACnBvH,EAAY,QACL3B,CAAAA,UAAAA,kBAAAA,EAAUkJ,IAAA,IAAS,UAAWiC,UAAAA,kBAAAA,EAAUH,WAAA,GAAcI,QAAA,CAAS,UACtEzJ,CAAAA,EAAY,KAAA,MAcP3B,EACKA,EAZd,IAAMqL,EAAerL,CAAAA,UAAAA,kBAAAA,EAAUS,SAAA,IAAc,wBAA0BT,CAAAA,UAAAA,kBAAAA,EAAUS,SAAA,IAAc,gBAEzF6K,EAAahB,GAAyBa,GAEtClM,EAAiB6L,GAAoB9K,UAAAA,kBAAAA,EAAUuB,QAAQ,EAEvDhF,EAAUyD,CAAAA,UAAAA,kBAAAA,EAAUzD,OAAA,GAAW,KAAA,EAE/BgP,EAA+B,CACjCnQ,IAAK+P,EACLjC,KAAMvH,EACNX,IAAKhB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAUW,OAAA,UAAVX,WAAAA,EAAqB,GAC1BwL,SAAUxL,CAAAA,EAAAA,UAAAA,kBAAAA,EAAUyL,GAAA,UAAVzL,WAAAA,EAAiB,QAC3BsL,WAAAA,EACArM,eAAAA,EACA1C,QAAAA,CACJ,EAEA,OAAI8O,GAAgB1J,IAAc,QAC9B4J,CAAAA,EAAOF,YAAA,CAAe,CAAA,EACtBE,EAAOG,UAAA,CAAavC,GAAsBgC,EAAU,QACpDI,EAAOI,SAAA,CAAYxC,GAAsBgC,EAAU,OACnDI,EAAOnQ,GAAA,CAAMmQ,EAAOG,UAAA,EACb/J,IAAc,SACrB4J,CAAAA,EAAOnQ,GAAA,CAAMiP,GAAoBc,EAAQ,EAGtCI,CACX,CAAA,MAASnB,EAAO,CACZ,OAAAjK,QAAQC,IAAA,CAAK,qCAAsCgK,GAC5C,IACX,CACJ,CC1JA,IAAA/R,GAAmBvC,GAAAsC,QAAA,oBAENwT,GAAiBC,GAAAzP,OAAAA,CAAOC,GAAA,KAKb,gBAAGE,IAAAA,eAAcA,GAAW,gBAGvCuP,GAAcD,GAAAzP,OAAAA,CAAO2P,GAAA,KAOhB,gBAAG/M,IAAAA,iBAAgBA,GAAa,SAC3B,gBAAGsM,IAAAA,WAAYrM,IAAAA,sBAC1BqM,EACO,GAAoBA,OAAjBA,EAAWb,CAAC,CAAA,MAAiB,OAAZa,EAAWZ,CAAC,CAAA,KAEpCzL,GAAkB,WAKpB+M,GAAcH,GAAAzP,OAAAA,CAAO6P,KAAA,KAOhB,gBAAGjN,IAAAA,iBAAgBA,GAAa,SAC3B,gBAAGsM,IAAAA,WAAYrM,IAAAA,sBAC1BqM,EACO,GAAoBA,OAAjBA,EAAWb,CAAC,CAAA,MAAiB,OAAZa,EAAWZ,CAAC,CAAA,KAEpCzL,GAAkB,WAKpBiN,GAAiBL,GAAAzP,OAAAA,CAAO+P,OAAA,MAMxBC,GAAgBP,GAAAzP,OAAAA,CAAOiQ,MAAA,MFhBpB,IAAArR,GAAA5C,QAAA,qBA7BT,SAAS5B,GAAY,CAAkB,MAAhB8V,EAAF,EAAEA,aAAcxW,EAAhB,EAAgBA,EACxC,IAAgCyW,IAAAA,GAAAC,OAAAA,CAAMC,QAAA,CAAS,CAAA,MAAxCC,EAAyBH,KAAfI,EAAeJ,KAI1BK,EAAYL,GAAAC,OAAAA,CAAM1R,OAAA,CAAQ,kBAAMhD,GAAmBwU,IAAe,CAACA,EAAa,EAEhFO,EAAmB,WACrBF,EAAY,CAAA,EAChB,EAEA,GAAI,CAACC,GAAaF,EACd,OAAO,SAKUE,EAIJA,EANjB,IAAMjL,EAAYiL,EAAU1D,IAAA,CACtB4D,EAAWF,EAAU5L,GAAA,CACrBqK,EAAeuB,CAAAA,EAAAA,EAAUvB,YAAA,UAAVuB,WAAAA,EAA0B,CAAA,EACzClB,EAAakB,EAAUlB,UAAA,CACvBC,EAAYiB,EAAUjB,SAAA,CACtBR,EAAWyB,EAAUxR,GAAA,CACrBoQ,EAAWoB,CAAAA,EAAAA,EAAUpB,QAAA,UAAVoB,WAAAA,EAAsB,QACjCtB,EAAasB,EAAUtB,UAAA,CACvBrM,EAAiB2N,EAAU3N,cAAA,CAC3B1C,EAAUqQ,EAAUrQ,OAAA,CAE1B,OAAIoF,IAAc,QAAA,CAAA,EAEVoL,GAAA/O,GAAA,EAAC4N,GAAA,KAAerP,QAASA,GAAczG,UAAAA,WAAAA,EAAK,CAAC,IACzCmI,SAAA,CAAA,EAAA8O,GAAA/O,GAAA,EAACgO,GAAA,GACGjL,IAAKoK,EACL6B,QAASH,EACTI,SAAQ,CAAA,EACRC,MAAK,CAAA,EACLC,KAAI,CAAA,EACJC,YAAW,CAAA,EACXpO,UAAWwM,EACXF,WAAYA,EACZrM,eAAgBA,GACXnJ,UAAAA,WAAAA,EAAK,CAAC,OAOvBuV,GAAgBM,GAAaD,EAAAA,CAAAA,EAEzBqB,GAAA/O,GAAA,EAAC4N,GAAA,KAAerP,QAASA,GAAczG,UAAAA,WAAAA,EAAK,CAAC,IACzCmI,SAAA,CAAA,EAAA8O,GAAAnE,IAAA,EAACsD,GAAA,CACGjO,SAAA,CAAA,CAAA,EAAA8O,GAAA/O,GAAA,EAACoO,GAAA,CAAclG,MAAM,qBAAqBmH,OAAQ1B,CAAAA,GAAW,CAAA,EAC7DoB,GAAA/O,GAAA,EAACoO,GAAA,CAAclG,MAAM,qBAAqBmH,OAAQ3B,CAAAA,GAAY,CAAA,EAC9DqB,GAAA/O,GAAA,EAAC8N,GAAA,GACG/K,IAAK2K,EACL1K,IAAK8L,EACLE,QAASH,EACTS,QAAQ,OACRtO,UAAWwM,EACXF,WAAYA,EACZrM,eAAgBA,GACXnJ,UAAAA,WAAAA,EAAK,CAAC,IACf,MAER,CAAA,EAMJiX,GAAA/O,GAAA,EAAC4N,GAAA,KAAerP,QAASA,GAAczG,UAAAA,WAAAA,EAAK,CAAC,IACzCmI,SAAA,CAAA,EAAA8O,GAAA/O,GAAA,EAAC8N,GAAA,GACG/K,IAAKoK,EACLnK,IAAK8L,EACLE,QAASH,EACTS,QAAQ,OACRtO,UAAWwM,EACXF,WAAYA,EACZrM,eAAgBA,GACXnJ,UAAAA,WAAAA,EAAK,CAAC,MAI3B,CGlFA,IAAAqC,GAAgEC,QAAA,SCAhE,IAAAD,GAAoCC,QAAA,SAE7B,SAASmV,KACZ,IAAoD,IAAA,CAAA,EAAIC,GAAAf,QAAA,EAAS,CAAA,MAA1DgB,EAA6C,KAAvBC,EAAuB,KAEpD,MAAA,CAAA,EAAAF,GAAAG,SAAA,EAAU,WAEN,GAAI,CAAA,OAAO3T,iCAAP,EAAOA,OAAA,EAAW,KAAe,CAACA,OAAO4T,UAAA,CACzC,OAGJ,IAAMC,EAAa7T,OAAO4T,UAAA,CAAW,oCACrCF,EAAwBG,EAAWC,OAAO,EAE1C,IAAMC,EAAgBC,SAAAA,GAClBN,EAAwBM,EAAMF,OAAO,CACzC,EAEA,OAAAD,EAAWI,gBAAA,CAAiB,SAAUF,GAC/B,kBAAMF,EAAWK,mBAAA,CAAoB,SAAUH,GAC1D,EAAG,EAAE,EAEEN,CACX,CDXO,SAASU,GAAYC,CAAAA,EACxB,IAAQC,EAAoGD,EAApGC,YAAaC,EAAuFF,EAAvFE,WAAAA,EAAAA,WAAa,CAAA,EAAbA,EAAoBzM,EAAmEuM,EAAnEvM,iBAAAA,EAAAA,WAAmB,IAAnBA,EAAyB0M,EAA0CH,EAA1CG,aAAAA,EAAAA,WAAe,CAAA,EAAfA,EAAqBC,EAAqBJ,EAArBI,aAAAA,EAAAA,WAAe,EAAfA,EAEjFC,EAAoBJ,EAAc,EAAIzD,KAAK8D,GAAA,CAAIF,EAAcH,EAAc,GAAK,EAClD,IAAA,CAAA,EAAIM,GAAAlC,QAAA,EAASgC,MAA1CG,EAA6B,KAAfC,EAAe,KACR,IAAA,CAAA,EAAIF,GAAAlC,QAAA,EAAS,CAAA,MAAlCqC,EAAqB,KAAXC,EAAW,KACtBtB,EAAuBF,KAEvByB,EAAAA,CAAAA,EAAWL,GAAAM,WAAA,EAAY,WACrBZ,IAAgB,GACpBQ,EAAiBK,SAAAA,SAAAA,AAAUA,CAAAA,EAAO,CAAA,EAAKb,GAC3C,EAAG,CAACA,EAAY,EAEVc,EAAAA,CAAAA,EAAeR,GAAAM,WAAA,EAAY,WACzBZ,IAAgB,GACpBQ,EAAiBK,SAAAA,SAAAA,AAAUA,CAAAA,EAAO,EAAIb,CAAAA,EAAeA,GACzD,EAAG,CAACA,EAAY,EAEVe,EAAAA,CAAAA,EAAYT,GAAAM,WAAA,EACbI,SAAAA,GACOA,GAAS,GAAKA,EAAQhB,GACtBQ,EAAgBQ,EAExB,EACA,CAAChB,EACL,EAEMiB,EAAAA,CAAAA,EAAQX,GAAAM,WAAA,EAAY,WACtBF,EAAY,CAAA,EAChB,EAAG,EAAE,EAECQ,EAAAA,CAAAA,EAASZ,GAAAM,WAAA,EAAY,WACvBF,EAAY,CAAA,EAChB,EAAG,EAAE,EAECS,EAAAA,CAAAA,EAAgBb,GAAAM,WAAA,EACjBjB,SAAAA,GACG,OAAQA,EAAM/M,GAAA,EACV,IAAK,YACD+M,EAAMyB,cAAA,GACNN,IACA,KACJ,KAAK,aACDnB,EAAMyB,cAAA,GACNT,IACA,KACJ,KAAK,OACDhB,EAAMyB,cAAA,GACNL,EAAU,GACV,KACJ,KAAK,MACDpB,EAAMyB,cAAA,GACNL,EAAUf,EAAc,GACxB,KACR,CACJ,EACA,CAACW,EAAUG,EAAcC,EAAWf,EACxC,EAEA,MAAA,CAAA,EAAAM,GAAAhB,SAAA,EAAU,WACFiB,GAAgBP,GAAeA,EAAc,GAC7CQ,EAAgBR,EAAc,EAEtC,EAAG,CAACA,EAAaO,EAAa,EAAA,CAAA,EAG9BD,GAAAhB,SAAA,EAAU,WACN,GAAI,CAACW,GAAcQ,GAAYrB,GAAwBY,IAAgB,EAAG,OAE1E,IAAMqB,EAAaC,YAAYX,EAAUnN,GACzC,OAAO,kBAAM+N,cAAcF,GAC/B,EAAG,CAACpB,EAAYQ,EAAUrB,EAAsB5L,EAAkBmN,EAAUX,EAAY,EAEjF,CACHO,aAAAA,EACAE,SAAAA,EACAT,YAAAA,EACAW,SAAAA,EACAG,aAAAA,EACAC,UAAAA,EACAE,MAAAA,EACAC,OAAAA,EACAC,cAAAA,CACJ,CACJ,CElGO,SAASK,GAAOC,CAAAA,MACHA,EAAAA,EAAhB,MAAO,CAAA,EAASA,UAAAA,mBAAAA,EAAAA,EAAQC,UAAA,UAARD,mBAAAA,EAAAA,EAAqCE,OAAA,UAArCF,kBAAAA,EAA8ChW,MAClE,CAAA,CAEO,SAASmW,GAAe5Q,CAAAA,MACaA,EAAxC,OAAO6Q,MAAMC,OAAA,CAAQ9Q,UAAAA,kBAAAA,EAAO+Q,OAAO,GAAK/Q,CAAAA,UAAAA,mBAAAA,EAAAA,EAAO+Q,OAAA,UAAP/Q,kBAAAA,EAAgBvF,MAAA,EAAS,CACrE,CAEO,SAASuW,GAASP,CAAAA,EACrB,MAAO,CAAA,EAAQA,UAAAA,kBAAAA,EAAQxD,YAC3B,CAAA,CCZA,IAAAlO,GAAuChG,QAAA,oCCAvC,IAAAgG,GAAyBhG,QAAA,oCACzB+B,GAAuB/B,QAAA,4BCAhB,IAAMkY,GAAwB,OAG9B,IAAMC,GAA0B,sBAIhC,IAAMC,GAAwB,WACxBC,GAAkB,UAClBC,GAAe,QACfC,GAAoB,OACpBC,GAAwB,OACxBC,GAAsB,SACtBC,GAA2B,cAC3BC,GAAiB,KACjBC,GAAsB,UACtBC,GAAqB,SACrBC,GAA2B,cACjC,SAASC,KACZ,MAAO,CAAA,OAAOnX,iCAAP,EAAOA,OAAA,EAAW,IAAcA,OAAOC,QAAA,CAAS4B,IAAA,CAAO,EAClE,CAEO,SAASuV,GAAWhW,CAAAA,EACvB,MAAOA,CAAAA,UAAAA,kBAAAA,EAAK/B,UAAA,CAAW,MAAO8X,KAAe/V,EAAMA,CACvD,CAEO,SAASiW,GAAcC,CAAAA,EAC1B,OAAIA,IAAW,MACJ,SAEJ,OACX,CAEO,SAASC,GAAgBC,CAAAA,EAC5B,OAAIA,GAAY,KACL,CAAA,EAEP,OAAOA,GAAa,SACbA,IAAahB,GAEjBgB,CACX,CAEA,IAAMC,GAAuC,CACzCC,MAAO,YACX,EAEO,SAASC,GAAgBC,CAAAA,MAErBH,EADP,GAAKG,EACL,MAAOH,CAAAA,EAAAA,EAAAA,CAAaG,EAAQ,UAArBH,WAAAA,EAA0BG,CACrC,CAEO,IAAMC,GAAkB,CAC3BC,QAAS,CACLC,GAAI,UACJC,MAAO,UACPC,QAAS,UACTtZ,KAAM,UACNuZ,WAAY,UACZC,aAAc,UACdC,UAAW,SACf,EACAC,UAAW,CACPN,GAAI,UACJC,MAAO,UACPC,QAAS,UACTtZ,KAAM,UACN2Z,OAAQ,UACRJ,WAAY,UACZC,aAAc,UACdC,UAAW,SACf,EACAxW,KAAM,CACFmW,GAAI,cACJC,MAAO,cACPC,QAAS,cACTtZ,KAAM,UACN2Z,OAAQ,cACRJ,WAAY,cACZC,aAAc,UACdC,UAAW,UACXG,UAAW,UACXC,eAAgB,SACpB,CACJ,EAEMC,GAA0C,CAC5CC,MAAO,QACPC,OAAQ,QACRC,MAAO,OACX,EAEMC,GAAuB,QAEtB,SAASC,GAAeC,CAAAA,MACpBN,EAAP,MAAOA,CAAAA,EAAAA,EAAAA,CAAYM,EAAI,UAAhBN,WAAAA,EAAqBI,EAChC,CAEA,IAAMG,GAAuD,CACzDJ,MAAO,QACPD,OAAQ,SACRD,MAAO,QACX,EAEMO,GAAgC,SAE/B,SAASC,GAAYH,CAAAA,MACjBC,EAAP,MAAOA,CAAAA,EAAAA,EAAAA,CAAqBD,EAAI,UAAzBC,WAAAA,EAA8BC,EACzC,CDxGA,IAAME,GAAa,MACbC,GAAmB,OACnBC,GAAqB,QACrBC,GAAoB,QACpBC,GAAoB,QACpBC,GAAsB,IACtBC,GAA4B,IAC5BC,GAAsB,MACtBC,GAAmB,mBACnBzC,GAA2B,cAC3B0C,GAAyB,SACzBC,GAA2B,WAC3BC,GAA6B,aAE7BC,GAAqBvX,SAAAA,UACnBA,IAAc,SAAiBoX,GAC/BpX,IAAc,SAAWA,IAAc,SAAiBqX,GACrDC,IAGEE,GAAAA,CAAAA,EAAkBC,GAAA7X,MAAA,EAAO,WAEfiD,SAAAA,UAAS0U,GAAkB1U,EAAM7C,SAAS,GAC9C6C,SAAAA,UAAS0U,GAAkB1U,EAAM6U,iBAAiB,IAuBxDC,GAAAA,CAAAA,EAAeF,GAAA7X,MAAA,EAAOgY,GAAAC,QAAQ,MAC3BhV,SAAAA,UAASA,EAAMiV,GAAG,EACfjV,SAAAA,UAASA,EAAMkV,MAAM,EACnBlV,SAAAA,UAASA,EAAMmV,QAAQ,EACzBnV,SAAAA,UAASA,EAAMoV,KAAK,EACnBpV,SAAAA,UAASA,EAAMqV,OAAO,EACjBrV,SAAAA,UAASA,EAAMsV,WAAW,EACvBtV,SAAAA,UAASA,EAAMuV,aAAa,EACrCvV,SAAAA,UAASA,EAAMwV,UAAU,EACpBxV,SAAAA,OAASA,QAAAA,CAAAA,EAAAA,EAAMyV,UAAA,UAANzV,WAAAA,EAAoBA,EAAMoV,KAAK,EACzCpV,SAAAA,OAASA,QAAAA,CAAAA,EAAAA,EAAM0V,eAAA,UAAN1V,WAAAA,EAAyB,eAY1C8T,GAKQQ,GAGFtU,SAAAA,UAASA,EAAM2V,YAAA,EAAgB5B,IAE/B/T,SAAAA,UAASA,EAAM4V,eAAA,EAAmB5V,EAAM2V,YAAA,EAAgB5B,IAInE/T,SAAAA,UAASA,EAAM6V,WAAA,GAAgBlE,IAAuB,kBAAuC,OAArBV,GAAqB,MAG9E+C,GAEEG,GAIFF,GAEEG,GAIFF,GAEEE,GACNpU,SAAAA,UAAUA,EAAM2V,YAAA,GAAiB,QAAU,OAAS,QAChD3V,SAAAA,UAASA,EAAM2V,YAAA,GAAiB,QAAU,OAAS3V,EAAM4V,eAAgB,EACzE5V,SAAAA,UAASA,EAAM2V,YAAA,GAAiB,QAAU,IAAO3V,EAAM2V,YAAA,EAAgB5B,IA2B7EM,GAESxC,GAwCbiC,IAwEFgC,GAAkBlB,GAAA7X,MAAA,CAAOgZ,IAAA,MAUhCC,GAAiB,GAAc,OAAX,EAAW,MAExBC,GAAoBrB,GAAA7X,MAAA,CAAOgZ,IAAA,KAElC/V,SAAAA,UAASA,EAAMkC,QAAA,GAAa,QAAU,iBAA+B,OAAd8T,GAAc,MACrEhW,SAAAA,UAASA,EAAMkC,QAAA,GAAa,SAAW,gBAA8B,OAAd8T,GAAc,OD/L3D,IAAAra,GAAA5C,QAAA,qBAhDVhC,GAAgC,gBAClCwK,IAAAA,MACAxF,IAAAA,IACiBkW,IAAjBiE,gBAAiBjE,EAAAA,WAASP,GAATO,EACjBvO,IAAAA,QACAyS,AAAazC,IAAbyC,YACAhZ,IAAAA,UACAiZ,IAAAA,mBACYC,IAAZC,WAAYD,EAAAA,WAAa7E,GAAb6E,EACZE,IAAAA,KACAC,AAAcC,IAAdD,aACAE,AAAcvE,IAAduE,aACAtW,IAAAA,UACA3J,IAAAA,EACA0J,IAAAA,YAcIqS,EAKkB,EAjBtB,IAAMmE,EAAkBjT,UAAAA,WAAAA,EAAW0N,GAC7BwF,EAAelD,UAAAA,WAAAA,EAAQrC,GACvBwF,EAAoB1Z,UAAAA,WAAAA,EAAamU,GACjCwF,EAA4BV,UAAAA,WAAAA,EAAsB,MAClDW,EAAuBN,UAAAA,WAAAA,EAAgBlF,GAEvCyF,EACFX,IAAe1E,GAAsBA,GAAsBC,GAEzDqF,EAAWlF,GAAWhW,GAEtBmb,EACF1E,CAAAA,EAAAA,EAAAA,CAAgBmE,EAA+C,UAA/DnE,WAAAA,EAAoEA,EAAAA,CAAgBpB,GAAe,CACjG+F,EAAc1D,GAAemD,GAC7BQ,EAAiB3D,GAAe,SAChC4D,EAAiBrF,GAAcC,GAC/BqF,EAAmBpF,GAAgBC,GACnCoF,EAAAA,CAAgB,EAAA,WAAYL,EAAiBA,EAAejE,MAAA,CAAS,KAAA,WAArD,WAAA,EAAmEpB,GAEnF2F,EAAgBb,IAAoB,OAEpCc,EAAWnF,GAAgBiE,GAC3BmB,EAAgB,OAAOD,GAAa,UAAYA,KAAYE,GAAAC,cAAA,CAC5DC,EAAWhE,GAAY+C,GAEvBkB,EAAc5V,SAAAA,GAChB,GAAI,CAACuV,GAAY,CAACC,GAAiBX,IAAyB7U,EAAU,OAAO,KAE7E,IAAM6V,EAAYT,EAAmBJ,EAAepE,YAAA,CAAeoE,EAAe5d,IAAA,KAIH7C,EAF/E,MAAA,CAAA,EACIuhB,GAAArZ,GAAA,EAACsX,GAAA,CAAkB/T,SAAUA,EAAU,mBAAgB,CAAA,EACnDtD,SAAA,CAAA,EAAAoZ,GAAArZ,GAAA,EAACgZ,GAAAM,MAAA,CAAA,GAAOC,KAAMT,EAAU/D,KAAMmE,EAAUM,cAAeJ,GAAgBthB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAG8f,IAAA,UAAH9f,WAAAA,EAAW,CAAC,GAAI,EAGnG,EAEM2hB,EAAe,WACjB,IAAIC,EAAa9W,EAEjB,OAAI8W,IAAe,GACR5G,GAGA4G,CAGf,MA6B4D5hB,EAMlBA,EAjC1C,MAAA,CAAA,EACIuhB,GAAArZ,GAAA,EAACgW,GAAA,CAAgBxX,UAAW0Z,EAAmBhC,kBAAmBiC,EAC9DlY,SAAA,CAAA,EAAAoZ,GAAArZ,GAAA,EAACmW,GAAA,SACGwD,SAAU3B,EACVhB,aAAcwB,EACdtB,YAAamB,EACb/B,IAAKiC,EAAexE,EAAA,CACpBwC,OAAQgC,EAAevE,KAAA,CACvBwC,SAAU+B,EAAetE,OAAA,CACzBwC,MAAO8B,EAAe5d,IAAA,CACtB+b,QAASkC,EACTjC,YAAa4B,EAAerE,UAAA,CAC5B0C,cAAe2B,EAAepE,YAAA,CAC9B0C,WAAY0B,EAAenE,SAAA,CAC3B6C,gBAAiBwB,EACjB3B,WAAY,cAAeyB,EAAkBA,EAA0ChE,SAAA,CAAY,KAAA,EACnGwC,gBAAiB,mBAAoBwB,EAAkBA,EAA+C/D,cAAA,CAAiB,KAAA,EACvH3W,KAAMya,EACN,eAAcN,GACTU,IAAmB,SAAW,CAAEpF,OAAQ,SAAUsG,IAAKrH,EAAwB,EAAI,CAAC,IACzF,gBAAeoG,EACfnF,SAAUmF,IACLnX,UAAAA,WAAAA,EAAW,CAAC,IAEhBvB,SAAA4Y,EAAAA,CAAAA,EACGQ,GAAAzO,IAAA,EAAC,OAAA,CAAK,oBAAiB,CAAA,EAClB3K,SAAA,CAAAkZ,EAAW,QAAM,CAAA,EAClBE,GAAArZ,GAAA,EAACmX,GAAA,KAAgB,oBAAiB,CAAA,GAAMrf,CAAAA,EAAAA,UAAAA,kBAAAA,EAAG8K,KAAA,UAAH9K,WAAAA,EAAY,CAAC,IAAKmI,SAAAwZ,OACzDN,EAAW,SAAO,GACvB,CAAA,EAEAE,GAAAzO,IAAA,EAAAyO,GAAAQ,QAAA,CAAA,CACK5Z,SAAA,CAAAkZ,EAAW,QAAM,CAAA,EAClBE,GAAArZ,GAAA,EAACmX,GAAA,OAAqBrf,CAAAA,EAAAA,UAAAA,kBAAAA,EAAG8K,KAAA,UAAH9K,WAAAA,EAAY,CAAC,IAAKmI,SAAAwZ,OACvCN,EAAW,SAAO,KAG/B,EAGZ,EAEO9gB,GAAQD,GGlGP,IAAA4E,GAAA5C,QAAA,qBArBR,SAAS0f,GACLC,CAAAA,MAKoBA,MAAAA,EAHpB,OAAKA,EACc,YAAaA,GAAU7H,MAAMC,OAAA,CAAQ4H,EAAO/H,OAAO,EAK3D,CAAEgI,YAHOD,CAAAA,GAAAA,EAAAA,EAAO/H,OAAA,UAAP+H,kBAAAA,CAAO,CAC0B,EAAC,UADlCA,WAAAA,EAEa,IACR,EAElB,CAAEC,YAAaD,CAAsB,EARxB,CAAEC,YAAa,IAAK,CAS5C,CAEA,IAAM1hB,GAAyC+I,SAAAA,GAC3C,IAAQG,EAA0DH,EAA1DG,QAAAA,EAAAA,WAAU,CAAC,EAAXA,EAAchD,EAA4C6C,EAA5C7C,UAAWiD,EAAiCJ,EAAjCI,UAAAA,EAAAA,WAAY,CAAA,EAAZA,EAAsBsY,IAAW1Y,GAA1DG,UAAchD,YAAWiD,cACTqY,EAAAA,GACpBvjB,OAAO0jB,IAAA,CAAKF,GAAQje,MAAA,CAAS,EAAKie,EAA6B,MAD3DC,EAAgBF,EAAhBE,YAGR,MAAI,CAACA,GAAgB,CAACA,EAAYpX,KAAA,EAAS,CAACnB,EAAmB,KAAA,CAAA,EAE3DyY,GAAAla,GAAA,EAAC3H,GAAA,OACO2hB,IACJxb,UAAWA,UAAAA,WAAAA,EAAawb,EAAYxb,SAAA,CACpCgD,QAASA,EACTC,UAAWA,IAGvB,EAEOlJ,GAAQD,GCtCf,IAAA+B,GAAmBvC,GAAAsC,QAAA,oBAWZ,IAAM+f,GAAkBC,GAAAhc,OAAAA,CAAOC,GAAA,MAMzBgc,GAAkBD,GAAAhc,OAAAA,CAAOC,GAAA,MAKzBic,GAAgBF,GAAAhc,OAAAA,CAAOC,GAAA,KAERuJ,GAAYG,IAAI,CACf,gBAAG6I,IAAAA,oBAAmBA,EAAe,MAGrD2J,GAAcH,GAAAhc,OAAAA,CAAOC,GAAA,MAKrBmc,GAAgBJ,GAAAhc,OAAAA,CAAOC,GAAA,KAElB,gBAAGgU,IAAAA,gBAAgBA,EAAW3L,GAAWC,mBAAA,CAAsB,QAK3E2B,GAAcC,cAAc,CACZ,gBAAG8J,IAAAA,gBAAgBA,EAAW3L,GAAWE,kBAAA,CAAqB,SAIvE6T,GAAeL,GAAAhc,OAAAA,CAAOC,GAAA,KAC7B4K,GACSjB,GAAQE,KAAK,EAGfwS,GAAqBN,GAAAhc,OAAAA,CAAOC,GAAA,KAI1B2J,GAAQI,OAAO,CAGnBtC,GAAQK,OAAO,CAEXL,GAAQM,cAAc,CACpBM,GAAWG,YAAY,CAIlC,gBAAGtD,IAAAA,SAAAA,EAAAA,WAAW,OAAXA,SACGA,IAAa,SACN,6HAMPA,IAAa,QACN,mKAOJ,oHAQT+E,GAAcC,cAAc,CACfzC,GAAQO,aAAa,EAS3BsU,GAAkBP,GAAAhc,OAAAA,CAAOC,GAAA,KAKhC4K,GACSjB,GAAQG,QAAQ,CAIzB,gBAAGoB,IAAAA,UAAWqR,IAAAA,MAAOnc,IAAAA,MACnB,IAAMoc,EAAY,CACdC,GAAI,CAAEC,MAAO,GAAKC,IAAK,CAAE,EACzBC,GAAI,CAAEF,MAAO,GAAKC,IAAK,CAAE,EACzBE,GAAI,CAAEH,MAAO,GAAKC,IAAK,CAAE,CAC7B,EACuBH,EAAAA,CAAAA,CAAUD,EAAK,CAA9BG,EAAeF,EAAfE,MAAOC,EAAQH,EAARG,IACTtR,EAAYjL,IAAU,QAAU,UAAY,gBAElD,OAAI8K,IAAc,cACPD,GAAgB,WAAYyR,EAAOC,EAAKtR,GAE/CH,IAAc,cACPD,GAAgB,UAAWyR,EAAOC,EAAKtR,GAE9CH,IAAc,SACPI,GAAsBoR,EAAOC,EAAKtR,GAEtC,EACX,EAGEpB,GAAcC,cAAc,CACxB,gBAAGqS,IAAAA,MAAOnc,IAAAA,MACZ,IAAMoc,EAAY,CACdC,GAAI,CAAEC,MAAO,GAAKC,IAAK,CAAE,EACzBC,GAAI,CAAEF,MAAO,GAAKC,IAAK,CAAE,EACzBE,GAAI,CAAEH,MAAO,GAAKC,IAAK,CAAE,CAC7B,EACuBH,EAAAA,CAAAA,CAAUD,EAAK,CAA9BG,EAAeF,EAAfE,MAAOC,EAAQH,EAARG,IAEf,OAAOrR,GAAsBoR,EAAOC,EADlBvc,IAAU,QAAU,UAAY,gBAEtD,GAIS0c,GAAgBf,GAAAhc,OAAAA,CAAOC,GAAA,KAO9BiK,GAAc1C,MAAM,CAIpB0C,GAAcpE,OAAO,EAKdkX,GAAmBhB,GAAAhc,OAAAA,CAAOC,GAAA,KAEzByH,GAAQQ,WAAW,CAC3B6C,GACSnB,GAAQK,QAAQ,CAEpBvC,GAAQQ,WAAW,CAGxBgC,GAAcC,cAAc,EAKrB8S,GAAYjB,GAAAhc,OAAAA,CAAO2b,MAAA,KACnBrT,GAAWI,aAAa,CACvBJ,GAAWI,aAAa,CAExBJ,GAAWK,eAAe,CAAUC,GAAOD,eAAe,CAChD,gBAAGuU,IAAAA,cAAcA,EAAStU,GAAOO,eAAA,CAAkBP,GAAOQ,iBAAkB,EAG9FoB,GAAiB,CAAC,MAAM,EAGF5B,GAAOO,eAAe,EC3H1B,IAAAvK,GAAA5C,QAAA,qBAxClBmhB,GAAe,SAACzJ,EAAoBrQ,EAAoB4P,OAOrCS,EA0BCA,EAOkDA,EA0B5C,EAEOA,MA/DMA,EAGxBA,EAAAA,EAPjB,IAAM0J,EAAYnJ,GAASP,GACrB2J,EAAU5J,GAAOC,GAEjB4J,EAAa,mBACbC,EAAoBlU,EAAAA,CAAeqK,CAAAA,EAAAA,EAAO8J,UAAA,UAAP9J,WAAAA,EAAqB,QAAO,CAE/DrO,EAAeqO,EAAAA,EAAAA,EAAO3J,QAAA,UAAP2J,kBAAAA,EAAiB+J,aAAA,IAAkB,CAAA,EAClDtY,EAAWuO,CAAAA,EAAAA,CAAAA,EAAAA,EAAOgK,gBAAA,UAAPhK,WAAAA,EAA2BA,EAAOvO,QAAA,UAAlCuO,WAAAA,EAA8C,OAGzDiK,EAAgBjK,EAAO8J,UAAA,GAAe,OAAS,QAAU,QAG3DI,CACAzY,CAAAA,IAAa,OACbyY,EAAoB,cACbzY,IAAa,QACpByY,EAAoB,cAEpBA,EAAoB,SAIxB,IAAIlS,CACAvG,CAAAA,IAAa,SACbuG,EAAgB,SACTvG,IAAa,QACpBuG,EAAgB,QAEhBA,EAAgB,WAGEgI,EAAtB,IAAMpO,EAAgBoO,CAAAA,GAAAA,EAAAA,EAAO3J,QAAA,UAAP2J,kBAAAA,EAAiBmK,cAAA,UAAjBnK,WAAAA,EAAmC,SAiC7B,EAAA,EA/B5B,MAAA,CAAA,EACIoK,GAAAlc,GAAA,EAACua,GAAA,CACGta,SAAA,CAAA,EAAAic,GAAAtR,IAAA,EAAC4P,GAAA,CAAcnI,SAAUmJ,EACpBvb,SAAA,CAAAub,GAAAA,CAAAA,EACGU,GAAAlc,GAAA,EAACya,GAAA,CACGxa,SAAA,CAAA,EAAAic,GAAAlc,GAAA,EAACxH,GAAA,CAAY8V,YAAA,CAAcwD,UAAAA,kBAAAA,EAAQxD,YAAA,CAAcxW,CAAA,CAAGga,UAAAA,mBAAAA,EAAAA,EAAQha,CAAA,UAARga,kBAAAA,EAAWxD,YAAA,EAAc,GAIpF7K,GAAAA,CAAAA,EACGyY,GAAAlc,GAAA,EAAC2a,GAAA,CAAgBpR,UAAWyS,EAAmBpB,MAAOlX,EAAejF,MAAOsd,CAAAA,GAAe,CAAA,EAG/FG,GAAAtR,IAAA,EAAC8P,GAAA,CAAmBnX,SAAUA,EAC1BtD,SAAA,CAAA,CAAA,EAAAic,GAAAlc,GAAA,EAACqK,GAAA,CACGC,WAAYwH,EAAOjH,WAAA,CACnBjI,MAAOkP,EAAOlP,KAAA,CACdmB,SAAU+N,EAAO/N,QAAA,CACjBwG,SAAUuH,EAAOhH,SAAA,CACjBtH,UAAWmY,EACX7R,cAAeA,EACfU,OAAQ,GAAiB6G,OAAdqK,EAAU,KAAS,OAALrK,EAAK,SAC9BvZ,EAAGga,EAAOha,CAAA,CACV2J,UAAWA,CAAAA,GAGdga,GAAAA,CAAAA,EACGS,GAAAlc,GAAA,EAACmb,GAAA,CACGlb,SAAA,CAAA,EAAAic,GAAAlc,GAAA,EAACzH,GAAA,OACOuZ,UAAAA,kBAAAA,EAAQC,UAAA,GACZvT,UAAWsL,EACXtI,QAAA,CAAA,EAAA,CAAA,GAAA,EAAA,CACKsQ,UAAAA,kBAAAA,EAAQC,UAAA,EAA4Bja,CAAA,UADzC,kBAAA,EAC4CqkB,UAAA,UAD5C,WAAA,EAEOrK,UAAAA,mBAAAA,EAAAA,EAAQha,CAAA,UAARga,kBAAAA,EAAWC,UAAA,UAFlB,WAAA,EAGO,CAAC,EAERtQ,UAAWA,IACf,GACJ,GAER,EACJ,EAxCc,GAAiB4P,OAAdqK,EAAU,KAAS,OAALrK,GA2C3C,EAEe,SAAR7X,GAA0C6H,CAAAA,EAC7C,IAAQ+Q,EAAkD/Q,EAAlD+Q,QAASgK,EAAyC/a,EAAzC+a,kBAAmB3a,EAAsBJ,EAAtBI,UAAAA,EAAAA,WAAY,CAAA,EAAZA,EAE9B4a,EAAapK,GAAe5Q,GAE5Bib,EAAWnM,GAAY,CACzBE,YAAa+B,EAAQtW,MAAA,CACrBwU,WAAY+L,EACZxY,iBAAkBuY,UAAAA,WAAAA,EAAqB,IACvC7L,aAAc,CAAA,EACdC,aAAc,CAClB,GAEA,MAAA,CAAA,EACI0L,GAAAtR,IAAA,EAACuP,GAAA,CACG,cAAa,mBACboC,UAAWF,EAAaC,EAAS9K,aAAA,CAAgB,KAAA,EACjDgL,aAAcH,EAAaC,EAAShL,KAAA,CAAQ,KAAA,EAC5CmL,aAAcJ,EAAaC,EAAS/K,MAAA,CAAS,KAAA,EAE7CtR,SAAA,CAAA,CAAA,EAAAic,GAAAlc,GAAA,EAACqa,GAAA,CACGpa,SAAA,CAAA,EAAAic,GAAAlc,GAAA,EAACsa,GAAA,CAAc1J,aAAc0L,EAAS1L,YAAA,CAAcP,YAAa+B,EAAQtW,MAAA,CACpEmE,SAAAmS,EAAQtJ,GAAA,CAAI,SAACgJ,EAAQT,UAAUkK,GAAazJ,EAAQrQ,EAAW4P,IAAM,EAC1E,GAGHgL,GAAAA,CAAAA,EACGH,GAAAlc,GAAA,EAACob,GAAA,CACInb,SAAAmS,EAAQtJ,GAAA,CAAI,SAACgJ,EAAQT,OAEyBS,QAFzBT,CAAAA,EAClB6K,GAAAlc,GAAA,EAACqb,GAAA,CAEGC,OAAQjK,IAAUiL,EAAS1L,YAAA,CAC3B8L,QAAS,kBAAMJ,EAASlL,SAAA,CAAUC,IAClC,aAAY,eAAwB,OAATA,EAAQ,EAAC,EAH/B,oBAAkCS,OAATT,EAAK,KAAsB,OAAlBS,CAAAA,EAAAA,EAAOlP,KAAA,UAAPkP,WAAAA,EAAgB,MAK9D,GACL,EAIhB,CCpJA,IAAA3V,GAAuB/B,QAAA,4BC4BhB,IAAMuiB,GAAiD,CAC1DC,KAAM,EACNjI,OAAQ,EACRkI,MAAO,CACX,EAEalX,GAA8C,CACvDtB,OAAQ,qBACRuB,OAAQ,6CACR1B,QAAS,8CACT4Y,MAAO,qBACX,EDnCO,IAAMC,GAAAA,CAAAA,EAAyBC,GAAA5e,MAAA,EAAO,OACzC,gBAAG6e,IAAAA,iBAAkBC,IAAAA,kBASjB,IAAMhB,EARmB,CACrBiB,KAAM,CAAE9Y,OAAQ,EAAGuB,OAAQ,EAAG1B,QAAS,EAAG4Y,MAAO,CAAE,EACnDlI,MAAO,CAAEvQ,OAAQ,EAAGuB,OAAQ,EAAG1B,QAAS,EAAG4Y,MAAO,EAAG,EACrDnI,OAAQ,CAAEtQ,OAAQ,GAAIuB,OAAQ,GAAI1B,QAAS,GAAI4Y,MAAO,EAAG,EACzDpI,MAAO,CAAErQ,OAAQ,GAAIuB,OAAQ,GAAI1B,QAAS,GAAI4Y,MAAO,EAAG,CAC5D,CAAA,CAG2BG,EAAgB,KAEpC,EAAP,OAAO,GACHvc,QAAS,OACT0c,cAAe,SACfC,WAAYH,IAAsB,SAAW,SAAWA,IAAsB,QAAU,WAAa,aAErGI,WAAY,GAAW,OAARpB,EAAE7X,MAAM,CAAA,MACvBkZ,cAAe,GAAW,OAARrB,EAAE7X,MAAM,CAAA,OAE1B,EARG,EAQF,UAA4B,OAAlBsB,GAAYC,MAAM,EAAK,CAC9B0X,WAAY,GAAW,OAARpB,EAAEtW,MAAM,CAAA,MACvB2X,cAAe,GAAW,OAARrB,EAAEtW,MAAM,CAAA,KAC9B,GAEA,EAbG,EAaF,UAA6B,OAAnBD,GAAYzB,OAAO,EAAK,CAC/BoZ,WAAY,GAAY,OAATpB,EAAEhY,OAAO,CAAA,MACxBqZ,cAAe,GAAY,OAATrB,EAAEhY,OAAO,CAAA,KAC/B,GAEA,EAlBG,EAkBF,UAA2B,OAAjByB,GAAYmX,KAAK,EAAK,CAC7BQ,WAAY,GAAU,OAAPpB,EAAEY,KAAK,CAAA,MACtBS,cAAe,GAAU,OAAPrB,EAAEY,KAAK,CAAA,KAC7B,GArBG,CAuBX,GAGSU,GAAAA,CAAAA,EAAoBR,GAAA5e,MAAA,EAAO,OACpC,gBAAGqf,IAAAA,cAAeC,IAAAA,qBAAsBC,IAAAA,cAAeC,IAAAA,iBAAkBC,IAAAA,sBACrE,IAAMC,EAA4B,CAC9Btd,MAAO,GAAoD,OAAjDoM,KAAKmR,GAAA,CAAI,EAAGnR,KAAK8D,GAAA,CAAI,IAAKmN,IAAuB,IAC/D,EAEA,GAAID,GAAoBH,IAAkB,OAAA,CAKtC,GAJAK,EAAKrd,MAAA,CAAS,GAAuB,OAApBid,EAAoB,MACrCI,EAAKE,eAAA,CAAkBJ,EACvBE,EAAKG,cAAA,CAAiB,YAElBR,IAAkB,SAAU,CAC5B,IAAMS,EAAatR,KAAKmR,GAAA,CAAI,GAAIL,EAAuB,GACjDS,EAAYvR,KAAKmR,GAAA,CAAI,EAAGL,EAAuB,EACrDI,CAAAA,EAAKM,SAAA,CAAY,qDACEF,OADmDA,EAAU,oBAChCA,OAA7BA,EAAU,oBAAyC,OAAtBA,EAAaC,EAAS,OACtEL,EAAKO,eAAA,CAAkB,qDACJH,OADyDA,EAAU,oBACtCA,OAA7BA,EAAU,oBAAyC,OAAtBA,EAAaC,EAAS,MAC1E,MAAA,GAAWV,IAAkB,SAAU,CACnC,IAAMa,EAAU1R,KAAKmR,GAAA,CAAI,EAAGL,GACtBa,EAAU3R,KAAKmR,GAAA,CAAI,EAAGO,EAAU,GAChCE,EAASF,EAAU,CAEzBR,CAAAA,EAAKM,SAAA,CAAY,0BAAgC,OAANI,EAAM,+CAEjDV,EAAKO,eAAA,CAAkB,0BAAgC,OAANG,EAAM,+CAEvDV,EAAKW,QAAA,CAAW,GAAgBf,OAAba,EAAO,OAA0B,OAApBb,EAAoB,MACpDI,EAAKY,cAAA,CAAiB,GAAgBhB,OAAba,EAAO,OAA0B,OAApBb,EAAoB,MAC1DI,EAAKa,UAAA,CAAa,WAClBb,EAAKc,gBAAA,CAAmB,WACxBd,EAAKe,YAAA,CAAe,WACpBf,EAAKgB,kBAAA,CAAqB,UAC9B,CAAA,MACOrB,IAAkB,OACzBK,CAAAA,EAAKrd,MAAA,CAAS,GAAuB,OAApBid,EAAoB,MACrCI,EAAKE,eAAA,CAAkBJ,CAAAA,EAEvBE,CAAAA,EAAKiB,iBAAA,CAAoBtB,EACzBK,EAAKkB,iBAAA,CAAoB,GAAuB,OAApBtB,EAAoB,MAChDI,EAAKmB,iBAAA,CAAoBtB,EACzBG,EAAKrd,MAAA,CAAS,CAAA,EAGlB,OAAOqd,CACX,GElFG,IAAMoB,GAAclnB,SAAAA,UAClBA,EACE,sBAAsBmnB,IAAA,CAAKnnB,GADf,CAAA,GASjBonB,GAAYC,SAAAA,GACd,GAAI,CAACA,GAAO,CAAC,sBAAsBF,IAAA,CAAKE,GAAM,OAC9C,IAAM1nB,EAAI2nB,SAASD,EAAIE,KAAA,CAAM,EAAG,GAAI,IAC9BC,EAAIF,SAASD,EAAIE,KAAA,CAAM,EAAG,GAAI,IAC9BE,EAAIH,SAASD,EAAIE,KAAA,CAAM,EAAG,GAAI,IACpC,MAAO,CAAE5nB,EAAAA,EAAG6nB,EAAAA,EAAGC,EAAAA,CAAE,CACrB,EAQaC,GAAoB,SAC7BC,EACAC,GAEA,GAAI,CAACD,GAAUA,IAAW,OAAQ,WACtBP,EAAZ,IAAMS,EAAMT,CAAAA,EAAAA,GAASQ,YAATR,WAAAA,EAAqB,CAAEznB,EAAG,EAAG6nB,EAAG,EAAGC,EAAG,CAAE,EACpD,OAAQE,GACJ,IAAK,OACD,MAAO,+BAAwCE,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAwBK,OAApBA,EAAIJ,CAAC,CAAA,gBAAwBI,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAS,OAALK,EAAIJ,CAAC,CAAA,SACvG,KAAK,OACD,MAAO,+BAAwCI,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAwBK,OAApBA,EAAIJ,CAAC,CAAA,gBAAwBI,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAS,OAALK,EAAIJ,CAAC,CAAA,SACvG,KAAK,QACD,MAAO,+BAAwCI,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAwBK,OAApBA,EAAIJ,CAAC,CAAA,gBAAwBI,OAATA,EAAIloB,CAAC,CAAA,KAAakoB,OAATA,EAAIL,CAAC,CAAA,KAAS,OAALK,EAAIJ,CAAC,CAAA,SACvG,SACI,MACR,CACJ,ECnBgB,IAAAziB,GAAA5C,QAAA,qBApBV0lB,GAAc,UAEdlmB,GAAkByH,SAAAA,GACpB,IACI4b,EAOA5b,EAPA4b,iBAAAA,EAAAA,WAAmB,QAAnBA,EACAQ,EAMApc,EANAoc,cAAAA,EAAAA,WAAgB,QAAhBA,EACAsC,EAKA1e,EALA0e,kBAAAA,EAAAA,WAAoB,OAApBA,EACApC,EAIAtc,EAJAsc,cACAqC,EAGA3e,EAHA2e,wBAAAA,EAAAA,WAA0B,OAA1BA,EACAnC,EAEAxc,EAFAwc,sBAAAA,EAAAA,WAAwB,IAAxBA,EACAX,EACA7b,EADA6b,kBAAAA,EAAAA,WAAoB,OAApBA,EAGEQ,EAAuBf,EAAAA,CAAaoD,EAAiB,CACrDE,EAAoBf,GAAWvB,GAAiBA,EAAiBmC,GACjElC,EAAmB8B,GAAkBM,EAAyBC,GAEpE,MAAA,CAAA,EACIC,GAAAlgB,GAAA,EAAC+c,GAAA,CAAuBE,iBAAkBA,EAAkBC,kBAAmBA,EAC1Ejd,SAAAwd,IAAkB,QAAA,CAAA,EACfyC,GAAAlgB,GAAA,EAACwd,GAAA,CACGC,cAAeA,EACfC,qBAAsBA,EACtBC,cAAesC,EACfrC,iBAAkBA,EAClBC,sBAAuBA,UAAAA,WAAAA,EAAyB,IAChD,cAAY,MAAA,EAChB,EAIhB,EAEOhkB,GAAQD,GCvCf,IAAAO,GAAiCC,QAAA,SCEjC,IAAA+lB,GAAyBroB,GAAAsC,QAAA,gBCFzB,IAAA+B,GAAuB/B,QAAA,4BCChB,IAAMgmB,GAAe,CACxBC,YAAa,IACbC,YAAa,IACbC,MAAO,IACPC,OAAQ,IACRC,MAAO,IACPC,YAAa,KACbC,YAAa,KACbC,YAAa,IACjB,EAGaC,GAAsB,ICR5B,IAAMC,GAA+C,CACxD3D,KAAM,EACNvI,MAAO,EACPD,OAAQ,GACRD,MAAO,EACX,EAGO,SAASqM,GAASC,CAAAA,EACrB,OAAIA,IAAQ,KAAA,EAAkBF,GAAkBpM,KAAA,CAC5C,OAAOsM,GAAQ,SAAiBA,EAC7BF,EAAAA,CAAkBE,EAC7B,CA0DO,IAAMC,GAAqB,IAE3B,IAAMC,GAAkC,IFwN3C,IAAAlkB,GAAA5C,QAAA,qBAlSJ,SAAS+mB,GACL7iB,CAAAA,CACAiL,CAAAA,CACA6X,CAAAA,CACAC,CAAAA,EAEA,OAAI/iB,EACOiL,IAAc,OAAS,CAAE3I,KAAM,EAAG,EAAI,CAAEC,MAAO,EAAG,EAEtD0I,IAAc,OAAS,CAAE3I,KAAMygB,CAAW,EAAI,CAAExgB,MAAOwgB,CAAW,CAC7E,CAEO,IAAMC,GAAAA,CAAAA,EAAoBC,GAAAnjB,MAAA,EAAO,WAQrC,gBAAG4iB,IAAAA,IAAKvgB,IAAAA,OAAQ+gB,IAAAA,aAAcC,IAAAA,gBAAiBnjB,IAAAA,UAAWojB,IAAAA,WAAAA,EAAAA,WAAa,CAAA,EAAbA,eAAyB,KAClFne,SAAU,WACV/C,MAAO,OACPmhB,UAAW,OACXC,QAAS,cACTnhB,OAAAA,EACAohB,UAAW,cAEPvjB,GAAa,CACbsjB,QAAS,GACb,SAEA,IAAC,sBAAyC,OAAnBxB,GAAaI,MAAM,CAAA,OAAQ,GAC9CoB,QAAS,eACLtjB,GAAa,CACbsjB,QAAS,GACb,IAGJ,IAAC,sBAAwC,OAAlBxB,GAAaG,KAAK,CAAA,OAAQ,GAC7CqB,QAAS,eACLtjB,GAAa,CACbsjB,QAAS,GACb,IAGJ,IAAA,gBAAiB,CACbre,SAAU,WACV7C,QAAS,QACTD,OAAQ,MACZ,GAEA,IAAA,cAAe,KACX8C,SAAU,WACVue,SAAU,SACVrhB,OAAQ,OACRohB,UAAW,cACPL,IAAiB,QAAU,CAAEO,UAAW,GAAI,IAChDC,OAAQ,MAAa,OAAPhB,EAAM,EAAC,MACrBY,QAAS,WAGb,IAAA,eAAgB,CACZlhB,QAAS,OACTD,OAAQ,OACRE,eAAgB,aAChBkhB,UAAW,aACXG,OAAQ,EACRC,WAAY,CAChB,GAEA,IAAA,eAAgB,KACZC,WAAY,EACZN,QAAS,KAAY,OAAPZ,EAAM,EAAC,MACrBvgB,OAAQ+gB,IAAiB,OAAS,OAASA,EAC3CO,UAAW,EACXF,UAAW,cACPJ,GAAmB,MAAQ,CAAEU,UAAW,GAAkB,OAAfV,EAAe,KAAK,IAEnE,UAAW,CACPhhB,OAAQ,OACRD,MAAO,OAEP,UAAW,CACPC,OAAQ,OACRD,MAAO,MACX,CACJ,KAGJ,IAAA,cAAe,CACX+C,SAAUme,EAAa,WAAa,SACpCU,OAAQV,EAAa,EAAI,OACzBhhB,QAAS,OACTC,eAAgB,SAChBqgB,IAAK,EACLqB,UAAW,OACXT,QAAS,EACTI,OAAQN,EAAa,EAAI,WACzBlhB,MAAO,OACPI,KAAM,EAEN0hB,GAAI,CACAN,OAAQ,EACRxhB,MAAO,GACPC,OAAQ,GAERsZ,OAAQ,CACJvZ,MAAO,GACPC,OAAQ,GACRmhB,QAAS,EACTW,aAAc,MACdjO,OAAQ,OACRrM,WAAY,OACZua,WAAY,CAAA,KACZC,OAAQ,UACRC,WAAY,4CAEZ,WAAY,CACRhiB,QAAS,MACb,CACJ,EAEA,wBAAyB,CACrBuH,WAAY,SAChB,CACJ,CACJ,GAEA,IAAC,sBAAwC,OAAlBmY,GAAaG,KAAK,CAAA,OAAQ,CAC7C,cAAe,CACX6B,OAAQV,EAAa,EAAI,OACzBV,IAAK,EAELsB,GAAI,CACA9hB,MAAO,GACPC,OAAQ,GAERsZ,OAAQ,CACJvZ,MAAO,GACPC,OAAQ,EACZ,CACJ,CACJ,CACJ,SAGSkiB,GAAAA,CAAAA,EAAepB,GAAAnjB,MAAA,EAAO,WAS/B,gBACIwkB,IAAAA,cACAC,IAAAA,mBACAC,IAAAA,kBACAC,IAAAA,qBACAC,IAAAA,WACAC,IAAAA,UACAC,IAAAA,uBACG,KACHniB,SAAU,OACVihB,OAAQY,EAAgB,EAAI,OAAyB,OAAlBC,EAAkB,MACrDpiB,OAAQqiB,IAAsB,OAAS,OAASA,EAChDf,UAAW,GACPgB,GAAwB,MAAQ,CAAEZ,UAAWY,CAAqB,IACtEviB,MAAOwiB,EACPG,KAAMP,GAAiBK,EAAY,OAAgB,OAATA,GAAc,KAAA,EACxDf,WAAY,EACZL,UAAWe,EAAgB,aAAe,KAAA,EAC1CQ,SAAUF,EAAkB,EAAIjC,GAChC1d,SAAU,eAIL8f,GAAAA,CAAAA,EAAa9B,GAAAnjB,MAAA,EAAO,OAG9B,gBAAG0kB,IAAAA,wBAAyB,CAC3BtiB,MAAO,OACPC,OAAQqiB,IAAsB,OAAS,OAASA,EAChDf,UAAW,EACXF,UAAW,aACXnhB,QAAS,OACT0c,cAAe,SACfC,WAAY,UACZsE,UAAW,OACXG,SAAU,SACVsB,SAAU,EACV7f,SAAU,UACd,IAEa+f,GAAAA,CAAAA,EAAoB/B,GAAAnjB,MAAA,EAAO,OAAO,CAC3C2C,SAAU,OACVP,MAAO,OACP2iB,KAAM,EACNpB,UAAW,EACXD,SAAU,SACVphB,QAAS,OACT0c,cAAe,QACnB,GAEamG,GAAAA,CAAAA,EAAchC,GAAAnjB,MAAA,EAAO,UAG/B,gBAAGmL,IAAAA,UAAWjL,IAAAA,uBAAiB,KAC9BiF,SAAU,WACVigB,IAAK,MACLC,UAAW,mBACXxb,WAAY,qBACZxJ,MAAO,OACP6V,OAAQ,OACRiO,aAAc,MACd/hB,MAAO,GACPC,OAAQ,GACRmhB,QAAS,EACTI,OAAQ,EACRS,OAAQ,UACRiB,OAAQ,GACRhjB,QAAS,OACT2c,WAAY,SACZ1c,eAAgB,SAChB+hB,WAAY,uBACZve,SAAU,GACVC,WAAY,EACZuf,cAAe,UACZxC,GAAuB7iB,EAAWiL,EAAW,EAAG,CAAA,SAEnD,UAAW,CACPtB,WAAY,oBAChB,EAEA,UAAW,CACP2b,QAAS,oBACTC,cAAe,CACnB,EAEA,aAAc,CACVC,QAAS,GACTrB,OAAQ,aACZ,GAEA,IAAC,sBAAyC,OAAnBrC,GAAaI,MAAM,CAAA,OAAQ,GAC9ChgB,MAAO,GACPC,OAAQ,IACL0gB,GAAuB7iB,EAAWiL,EAAW,EAAG,CAAA,MAGvD,IAAC,sBAAwC,OAAlB6W,GAAaG,KAAK,CAAA,OAAQ,GAC7C/f,MAAO,GACPC,OAAQ,GACR0D,SAAU,IACPgd,GAAuB7iB,EAAWiL,EAAW,EAAG,CAAA,YAI9Cwa,GAAAA,CAAAA,EAAexC,GAAAnjB,MAAA,EAAO,OAAO,CACtCmF,SAAU,WACV9C,OAAQ,OACRujB,cAAe,aACnB,GAEaC,GAAAA,CAAAA,EAA0B1C,GAAAnjB,MAAA,EAAO,OAAO,CACjDwjB,QAAS,OACTlhB,QAAS,OACT0c,cAAe,SACfzc,eAAgB,SAChB0c,WAAY,SACZ0E,UAAW,GAAkC,OAA/Bb,GAA+B,MAC7C5M,OAAQ,kBACRuN,UAAW,YACf,GASaqC,GAAmB,gBAC5BC,IAAAA,sBACAxpB,IAAAA,KAAAA,EAAAA,WAAO,YAAPA,EACA0V,IAAAA,YAAAA,EAAAA,WAAc,EAAdA,EACAvY,IAAAA,EAAAA,EAAAA,WAAI,CAAC,EAALA,MAI6BA,EACAA,EACpBA,QALb,CAAA,EACIssB,GAAApkB,GAAA,EAACikB,GAAA,KACG7gB,UAAWiN,IAAgB,EAAI8T,EAAwB,KAAA,GAClD9T,IAAgB,EAAIvY,CAAAA,EAAAA,UAAAA,kBAAAA,EAAGusB,MAAA,UAAHvsB,WAAAA,EAAa,CAAC,EAAI,CAAC,EACvCuY,IAAgB,EAAIvY,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIwsB,cAAA,UAAJxsB,WAAAA,EAAyB,CAAC,EAAI,CAAC,EACnDA,CAAAA,EAAAA,UAAAA,kBAAAA,CAAAA,CAAI,WAAwB,OAAbuY,EAAY,GAAG,UAA9BvY,WAAAA,EAAmC,CAAC,IACzC,qBAAmB,aAElBmI,SAAAtF,MGnSF,SAAS4pB,GAAiB5E,CAAAA,EAC7B,OAAQA,GACJ,IAAK,cACD,OAAO,CACX,KAAK,YACL,IAAK,kBACD,OAAO,CACX,KAAK,cACL,IAAK,2BACD,OAAO,CACX,KAAK,aACD,OAAO,CACX,SACI,OAAO,CACf,CACJ,CClBO,SAAS6E,GAAmBC,CAAAA,EAC/B,MAAI,CAACA,GAAO,OAAOA,GAAQ,WAAmBA,EACtC,CAAA,OAAOA,4BAAP,EAAOA,EAAAA,GAAQ,UAAaA,EAAY3c,OAAA,CAAY2c,EAAY3c,OAAA,CAAU2c,CACtF,CAEO,SAASC,GAAsB/E,CAAAA,CAAiCgF,CAAAA,EACnE,OAAIA,EAAcvE,GAAaK,KAAA,CAAc,CAAA,EACtCd,IAAW,mBAAqBA,IAAW,0BACtD,CAEO,SAASiF,GACZjF,CAAAA,CACAtO,CAAAA,CACAsT,CAAAA,CACAE,CAAAA,CACAC,CAAAA,EAEA,GAAIH,EAAcvE,GAAaK,KAAA,CAAO,MAAO,OAM7C,IAAMsE,EAAAA,AAHQD,CAAAA,EAAmB,EAAIA,EAAmBH,CAAAA,EAG9BE,EAE1B,GAAIlF,IAAW,kBAAmB,CAC9B,IAAMqF,EAAAA,AAAQ3T,CAAAA,EAAQ,EAAK,CAAA,EAAK,EAC1B4T,EAAUrY,KAAKC,KAAA,CAAMkY,EAAY,GACjCG,EAAUH,EAAYE,EAC5B,OAAOD,IAAQ,EAAI,GAAU,OAAPC,EAAO,MAAO,GAAU,OAAPC,EAAO,KAClD,CAEA,GAAIvF,IAAW,2BAA4B,CACvC,IAAMqF,EAAAA,AAAQ3T,CAAAA,EAAQ,EAAK,CAAA,EAAK,EAC1B4T,EAAUrY,KAAKC,KAAA,CAAMkY,EAAY,KACjCG,EAAUH,EAAaE,EAAU,EACvC,OAAOD,IAAQ,EAAI,GAAU,OAAPE,EAAO,MAAO,GAAU,OAAPD,EAAO,KAClD,CAEA,MAAO,MACX,CAEO,SAASE,GAA0BR,CAAAA,CAAqBS,CAAAA,EAC3D,OAAIT,GAAevE,GAAaM,WAAA,CAAoB9T,KAAK8D,GAAA,CAAI0U,EAAe,GACxET,GAAevE,GAAaK,KAAA,CAAc7T,KAAK8D,GAAA,CAAI0U,EAAe,GAClET,GAAevE,GAAaG,KAAA,CAAc3T,KAAK8D,GAAA,CAAI0U,EAAe,GAC/D,CACX,CAEO,SAASC,GAAgC/pB,CAAAA,EAO5C,IAAQ8pB,EAAmD9pB,EAAnD8pB,cAAeE,EAAoChqB,EAApCgqB,eAAgBpC,EAAoB5nB,EAApB4nB,gBAEjCqC,EAAc,EACdC,EAAe5Y,KAAK8D,GAAA,CAAI0U,EAAe,GACvCK,EAAc7Y,KAAK8D,GAAA,CAAI0U,EAAe,GAE5C,MAAO,CACH,CACIM,WAAYtF,GAAaG,KAAA,CACzBoF,SAAU,CACNC,aAAcL,EACdM,eAAgB,EAChBC,aAAc,CAAA,EACdC,OAAQ,CAAA,EACRC,KAAMV,EACNW,cAAe,CAAA,CACnB,CACJ,EACA,CACIP,WAAYtF,GAAaI,MAAA,CACzBmF,SAAU,CACNC,aAAcJ,EACdK,eAAgB,EAChBC,aAAc,CAAA,EACdC,OAAQ,CAAA,EACRC,KAAMV,EACNW,cAAe,CAAA,CACnB,CACJ,EACA,CACIP,WAAYtF,GAAaK,KAAA,CACzBkF,SAAU,CACNC,aAAcH,EACdI,eAAgB,EAChBC,aAAc,CAAA,EACdC,OAAQ,CAAA,EACRC,KAAMV,EACNW,cAAe/C,CACnB,CACJ,EAER,CLFoB,IAAAlmB,GAAA5C,QAAA,qBA5Fd8rB,GAAS1B,GAAgB2B,GAAAC,OAAY,EACrC9E,GAAoBkD,GAAuBlD,IAC3CiC,GAAciB,GAAuBjB,IACrCQ,GAAeS,GAAuBT,IACtCpB,GAAe6B,GAAuB7B,IACtCU,GAAamB,GAAuBnB,IACpCC,GAAoBkB,GAAuBlB,IAC3CY,GAAmBM,GAAuBN,IAkBzC,SAASmC,GAAYhV,CAAAA,EACxB,MAAO,SAAc,OAALA,EACpB,CAEO,SAASiV,GAAuBhrB,CAAAA,MA4B3BxD,EACAA,EAhBR,IACIyuB,EAWAjrB,EAXAirB,gBACAC,EAUAlrB,EAVAkrB,YACApB,EASA9pB,EATA8pB,cACApE,EAQA1lB,EARA0lB,IACAkC,EAOA5nB,EAPA4nB,gBACAuD,EAMAnrB,EANAmrB,cACA5D,EAKAvnB,EALAunB,mBACAC,EAIAxnB,EAJAwnB,kBACAC,EAGAznB,EAHAynB,qBACAH,EAEAtnB,EAFAsnB,cAAAA,EAAAA,WAAgB,CAAA,EAAhBA,EACA9qB,EACAwD,EADAxD,EAAAA,EAAAA,WAAI,CAAC,EAALA,EAGE4uB,EAAmB,OACjB5uB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIusB,MAAA,UAAJvsB,WAAAA,EAAiB,KAAA,EACjBA,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIwsB,cAAA,UAAJxsB,WAAAA,EAAyB,KAAA,IAC7B,qBAAsB,eAGpBmrB,EACFmC,IAAkB,EACZ,OACA,gBAAkDA,OAAlD,AAAiBA,CAAAA,EAAgB,CAAA,EAAKpE,EAAG,UAAsB,OAAboE,EAAa,KAEzE,OAAOmB,EAAgBzd,GAAA,CAAI,SAAC6d,EAAOtV,GAC/B,IAAM2R,EAAa,CAACJ,GAAiBM,EAAkBuD,EAAcpV,GAAS,KAAA,EACxEuV,EAAmBhE,GAAiBM,EAAkBuD,EAAcpV,GAAS4R,MAoBtEnrB,EAlBb,MAAA,CAAA,EACI+uB,GAAA7mB,GAAA,EAAC2iB,GAAA,KAEG,uBAAqB,QACrB,aAAY,SAAyB4D,OAAhBlV,EAAQ,EAAC,QAA6B,OAAtBkV,EAAgBzqB,MAAM,EAC3D8mB,cAAeA,EACfC,mBAAoBA,EACpBC,kBAAmBA,EACnBC,qBAAsBA,EACtBC,WAAYA,EACZC,UAAW2D,EACX1D,gBAAiBA,EAKjB4D,MAAO9D,EAAa,CAAExiB,MAAOwiB,CAAW,EAAI,KAAA,GACxC0D,EACC5uB,CAAAA,EAAAA,UAAAA,kBAAAA,CAAAA,CAAI,WAAgB,OAALuZ,GAAO,UAAtBvZ,WAAAA,EAA2B,CAAC,IAEjCmI,SAAA,CAAA,EAAA4mB,GAAA7mB,GAAA,EAACqjB,GAAA,CAAWP,kBAAmBA,EAAmBC,qBAAsBA,EACpE9iB,SAAA,CAAA,EAAA4mB,GAAA7mB,GAAA,EAACsjB,GAAA,CACIrjB,SAAAumB,EAAYG,EAAOtV,EAAK,EAC7B,KArBCgV,GAAYhV,GAyB7B,EACJ,CM5GA,IAAAlX,GAAyEC,QAAA,SCAzE,IAAAD,GAAoCC,QAAA,SAS7B,SAAS2sB,GAAkBpH,CAAAA,CAAiCqH,CAAAA,EAC/D,IAAkC,IAAA,CAAA,EAAIC,GAAAxY,QAAA,EAClC,CAAA,OAAOzS,iCAAP,EAAOA,OAAA,EAAW,IAAcA,OAAOkrB,UAAA,CAAa,MADjDvC,EAA2B,KAAdwC,EAAc,KAIA,IAAA,CAAA,EAAIF,GAAAxY,QAAA,EAClC,YAAsBuY,OAAVrH,EAAM,KAAkByH,OAAdJ,EAAU,KAAc,OAAVI,KAAKC,GAAA,QADtCC,EAA2B,KAAdC,EAAc,KAIlC,MAAA,CAAA,EAAAN,GAAAtX,SAAA,EAAU,WACN,GAAI,CAAA,OAAO3T,iCAAP,EAAOA,OAAA,EAAW,IAClB,OAGJ,IAAIwrB,EAEEC,EAAe,WACjBC,aAAaF,GACbA,EAAYG,WAAW,WACnBR,EAAenrB,OAAOkrB,UAAU,EAChCK,EAAe,YAAsBP,OAAVrH,EAAM,KAAkByH,OAAdJ,EAAU,KAAc,OAAVI,KAAKC,GAAA,IAC5D,EAAG,IACP,EAEA,OAAArrB,OAAOiU,gBAAA,CAAiB,SAAUwX,GAE3B,WACHC,aAAaF,GACbxrB,OAAOkU,mBAAA,CAAoB,SAAUuX,EACzC,CACJ,EAAG,CAAC9H,EAAQqH,EAAW,EAEhB,CAAErC,YAAAA,EAAa2C,YAAAA,CAAY,CACtC,CDzBO,SAASM,GAAqBvmB,CAAAA,EACjC,IACIgjB,EAiBAhjB,EAjBAgjB,OACAmC,EAgBAnlB,EAhBAmlB,YACA7G,EAeAte,EAfAse,OAAAA,EAAAA,WAAS,cAATA,EACAkI,EAcAxmB,EAdAwmB,gBAAAA,EAAAA,WAAkB,CAAA,EAAlBA,EACAC,EAaAzmB,EAbAymB,iBAAAA,EAAAA,WAAmB,EAAnBA,EACAC,EAYA1mB,EAZA0mB,eAAAA,EAAAA,WAAiB,CAAA,EAAjBA,EACAC,EAWA3mB,EAXA2mB,cACA5kB,EAUA/B,EAVA+B,UACA6kB,EASA5mB,EATA4mB,cACAjH,EAQA3f,EARA2f,IAAAA,EAAAA,WAAM,SAANA,EACAvgB,EAOAY,EAPAZ,OACAnC,EAMA+C,EANA/C,UACAmD,EAKAJ,EALAI,UAAAA,EAAAA,WAAY,CAAA,EAAZA,EACA0iB,EAIA9iB,EAJA8iB,sBACA+D,AAAsBC,EAGtB9mB,EAHA6mB,qBACA1mB,EAEAH,EAFAG,QACA1J,EACAuJ,EADAvJ,EAGE+sB,EAAQ9D,GAASC,GACjBkH,EAAuBC,UAAAA,WAAAA,EAA4B,4BACnDC,EAAqB9pB,UAAAA,WAAAA,EAAa,CAAA,EAEHyoB,EAAAA,GAAkBpH,EAAQ0E,EAAOvoB,MAAM,EAApE6oB,EAA6BoC,EAA7BpC,YAAa2C,EAAgBP,EAAhBO,YAGfe,EAAAA,CAAAA,EAAeC,GAAAC,MAAA,EAA2B,MACJ,IAAA,CAAA,EAAID,GAAA7Z,QAAA,EAAiB,MAA1DqW,EAAqC,KAAnB0D,EAAmB,KACtCC,EAAAA,CAAAA,EAAuBH,GAAArX,WAAA,EAAY,WACrC,IAAMyX,EAAKL,EAAaM,OAAA,CACxB,GAAI,CAACD,EAAI,OACT,IAAM5B,EAAQ9qB,OAAO4sB,gBAAA,CAAiBF,GAChCG,EAAKrc,WAAWsa,EAAMgC,WAAW,GAAK,EACtCC,EAAKvc,WAAWsa,EAAMkC,YAAY,GAAK,EAC7CR,EAAoBE,EAAGO,WAAA,CAAcJ,EAAKE,EAC9C,EAAG,EAAE,EAAA,CAAA,EACLT,GAAA3Y,SAAA,EAAU,WAEN,GADA8Y,IACI,CAAA,OAAOS,yCAAP,EAAOA,eAAA,EAAmB,KAAe,CAACb,EAAaM,OAAA,CAAS,OACpE,IAAMQ,EAAK,IAAID,eAAeT,GAC9B,OAAAU,EAAGC,OAAA,CAAQf,EAAaM,OAAO,EACxB,kBAAMQ,EAAGE,UAAA,GACpB,EAAG,CAACZ,EAAqB,EAEzB,IAAMrD,EAAAA,CAAAA,EAAgBkD,GAAAxrB,OAAA,EAAQ,kBAAMynB,GAAiB5E,IAAS,CAACA,EAAO,EAChE2J,EAAqBnE,GAA0BR,EAAaS,GAC5DlC,EAAkBwB,GAAsB/E,EAAQgF,GAChD8B,EAAAA,CAAAA,EAAgB6B,GAAAxrB,OAAA,EAClB,kBAAOuU,SAAAA,UAAkBuT,GAAsBjF,EAAQtO,EAAOsT,EAAaE,EAAOC,KAClF,CAACnF,EAAQgF,EAAaE,EAAOC,EACjC,EAEMyE,EAA2B1B,EAC3B2B,EAA0BzB,EAC1B0B,EAAsB9E,EAAcvE,GAAaK,KAAA,CAEjDiJ,EAAoB/E,GAAevE,GAAaG,KAAA,CAChDoJ,EAAuB,CAAA,EACvB7G,EAAoB,OACpBC,EAAuBlC,GACvBgC,EAAqB,EACrB+G,EAAkBnpB,UAAAA,WAAAA,EAAU,OAE5B6kB,EAAiBkE,GAA2BnF,EAAOvoB,MAAA,CAAS,GAAK6oB,GAAevE,GAAaK,KAAA,CAE7FoJ,EAAAA,CAAAA,EAAYvB,GAAAC,MAAA,EAAiC,MAC7CpX,EAAe,eAAM0Y,SAAAA,EAAAA,EAAUlB,OAAA,UAAVkB,kBAAAA,EAAmBC,SAAA,IACxC9Y,GAAW,eAAM6Y,SAAAA,EAAAA,EAAUlB,OAAA,UAAVkB,kBAAAA,EAAmBE,SAAA,IAEpCC,GAAqB,CAAC5mB,EAAS,CAAExH,MAAA,CAAOC,SAASmN,IAAA,CAAK,KAEtDihB,GAA0B/G,GAAmByB,EAAcvE,GAAaI,MAAA,CACxE0J,GAAwBD,GAA0B,EAAIX,EAEtDa,GAAAA,CAAAA,EAAqB7B,GAAAxrB,OAAA,EACvB,kBACIuoB,GAAgC,CAC5BD,cAAAA,EACAgF,aAAc/F,EAAOvoB,MAAA,CACrB2F,UAAAA,EACA6jB,eAAAA,EACApC,gBAAAA,CACJ,IACJ,CACIkC,EACAf,EAAOvoB,MAAA,CACP2F,EACA6jB,EACApC,EAER,EAGMmH,GAAiB,GACnBrE,KAAMV,EACNgF,SAAUjG,EAAOvoB,MAAA,CAASouB,GAC1BK,MAAO,IACP3E,aAAcsE,GACdrE,eANmB,EAOnB2E,SAAUjB,EACVkB,cAAe3C,EAAmB,IAClCvX,aAAc,CAAA,EACdwV,OAAQ,CAAA,EACRE,cAAegE,GACfS,MAAO,CAAA,EACPC,UAAW,CAAA,EACXC,aAAc,SAACja,EAAWka,UAAiB7C,UAAAA,kBAAAA,EAAgB6C,IAC3DC,WAAYX,IACTlC,GAkBP,MAAO,CACHpD,MAAAA,EACA+E,gBAAAA,EACA9G,kBAAAA,EACAC,qBAAAA,EACAG,gBAAAA,EACA8G,mBAAAA,GACA5B,mBAAAA,EACA5mB,QAAAA,EACA1J,EAAAA,EACAqsB,sBAAAA,EACA+D,qBAAAA,EACA2B,UAAAA,EACAQ,eAAAA,GACA/C,YAAAA,EACAyD,aA9BiB,eAACnI,yDAAgB,CAAA,SAClC0D,GAAoB,CAChBC,gBAAiBlC,EACjBmC,YAAAA,EACApB,cAAAA,EACApE,IAAK6D,EACL3B,gBAAiB+G,GACjBxD,cAAAA,EACA5D,mBAAAA,EACAC,kBAAAA,EACAC,qBAAAA,EACAH,cAAAA,EACA9qB,EAAAA,CACJ,IAkBAyuB,gBAAiBlC,EACjB2G,UAAW3G,EAAOvoB,MAAA,CAAS,EAC3B4tB,kBAAAA,EACAC,qBAAAA,EACAhK,OAAAA,EACA8J,oBAAAA,EACA7D,aAAcsE,GACdE,aAAc/F,EAAOvoB,MAAA,CACrBqV,aAAAA,EACAH,SAAAA,GACAqX,aAAAA,CACJ,CACJ,CPvHY,IAAArrB,GAAA5C,QAAA,qBA6BQD,GAAAC,QAAA,SArEb,SAAS3B,GAAsB4I,CAAAA,EAClC,IAAQ4pB,EAA4B5pB,EAA5B4pB,aAAcxpB,EAAcJ,EAAdI,UAChBypB,EAAgB,KAAK7pB,GAAM,CAAA,EAEjC8pB,GAAAxb,SAAA,EAAU,WACN,wDAAA,QAAO,qCACP,wDAAA,QAAO,0CACX,EAAG,EAAE,EAEL,IAuBIiY,EAAAA,GAAkBsD,GAtBlBrG,EAsBA+C,EAtBA/C,MACA+E,EAqBAhC,EArBAgC,gBACA9G,EAoBA8E,EApBA9E,kBACAC,EAmBA6E,EAnBA7E,qBACAG,EAkBA0E,EAlBA1E,gBACA8G,EAiBApC,EAjBAoC,mBACA5B,EAgBAR,EAhBAQ,mBACA5mB,EAeAomB,EAfApmB,QACA1J,EAcA8vB,EAdA9vB,EACAqsB,EAaAyD,EAbAzD,sBACA+D,EAYAN,EAZAM,qBACA2B,EAWAjC,EAXAiC,UACAQ,EAUAzC,EAVAyC,eACA/C,EASAM,EATAN,YACAyD,EAQAnD,EARAmD,aACAC,EAOApD,EAPAoD,UACAvB,EAMA7B,EANA6B,oBACA7D,EAKAgC,EALAhC,aACAwE,EAIAxC,EAJAwC,aACAjZ,EAGAyW,EAHAzW,aACAH,EAEA4W,EAFA5W,SACAqX,EACAT,EADAS,aAGE+C,EAAmBC,SAAAA,SAAAA,CAAAA,EACrBC,GAAAtrB,GAAA,EAAC,UAAA,CAEG,uBAAqB,QACrB,aAAY,eAAmC4lB,OAApByF,EAAY,EAAC,QAAmB,OAAZzF,GAE/C3lB,SAAA,CAAA,EAAAqrB,GAAAtrB,GAAA,EAACkkB,GAAA,CACGC,sBAAuBA,EACvBxpB,KAAMutB,EACN7X,YAAa+Z,EACbtyB,EAAGA,CAAAA,EACP,EATK,eAAwB,OAATuzB,SA6BPvzB,EACAA,EAjBrB,MAAA,CAAA,EACIwzB,GAAAtrB,GAAA,EAACshB,GAAA,KACGiK,IAAKlD,EACLrH,IAAK6D,EACLpkB,OAAQmpB,EACRpI,aAAcsB,EACdrB,gBAAiBsB,EACjBG,gBAAiBA,EACjB9f,UAAW4mB,EACX,aAAW,mBACX1rB,UAAW8pB,EACX1G,WAAYuJ,IAAiB,WACxBzpB,UAAAA,WAAAA,EAAW,CAAC,IAEjBvB,SAAA,CAAA,EAAAqrB,GAAA1gB,IAAA,EAACmZ,GAAA,CACG9jB,SAAA,CAAA,CAAA,EAAAqrB,GAAAtrB,GAAA,EAAC,MAAA,OACQlI,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIusB,MAAA,UAAJvsB,WAAAA,EAAiB,CAAC,EAClBA,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIwsB,cAAA,UAAJxsB,WAAAA,EAAyB,CAAC,IACzB,qBAAsB,aAE5BmI,SAAA,CAAA,EAAAurB,GAAAC,aAAA,EAACvF,GAAA,KAAOqF,IAAK1B,GAAeQ,IAAgBpnB,IAAKqkB,IAC5C0D,GAAaD,IACbtpB,GACIupB,CAAAA,EACKZ,EAAexE,GACf1T,MAAMwZ,IAAA,CAAK,CAAE5vB,OAAQ8pB,EAAewE,CAAa,GAAGthB,GAAA,CAAI,SAAC6H,EAAGgb,UACxDP,EAAgBhB,EAAeuB,KAEnCzZ,MAAMwZ,IAAA,CAAK,CAAE5vB,OAAQ8pB,CAAa,GAAG9c,GAAA,CAAI,SAAC6H,EAAGU,UAAU+Z,EAAgB/Z,IAAM,MAI9FoY,GAAuBW,EAAexE,GAAAA,CAAAA,EACnC0F,GAAA1gB,IAAA,EAAA0gB,GAAAzR,QAAA,CAAA,CACI5Z,SAAA,CAAA,CAAA,EAAAqrB,GAAAtrB,GAAA,EAACujB,GAAA,CACGha,UAAU,OACVmT,QAASvL,EACT,aAAW,iBACX7S,UAAW8pB,EACdnoB,SAAA,GAAA,GAED,CAAA,EACAqrB,GAAAtrB,GAAA,EAACujB,GAAA,CACGha,UAAU,OACVmT,QAAS1L,EACT,aAAW,aACX1S,UAAW8pB,EACdnoB,SAAA,GAAA,GAED,GACJ,KAKpB,CStHA,IAAA9F,GAA+BC,QAAA,SCA/B,IAAA+B,GAAuB/B,QAAA,4BCKhB,IAAM0mB,GAA+C,CACxD3D,KAAM,EACNvI,MAAO,EACPD,OAAQ,GACRD,MAAO,EACX,EAGO,SAASqM,GAASC,CAAAA,EACrB,OAAIA,IAAQ,KAAA,EAAkBF,GAAkBpM,KAAA,CAC5C,OAAOsM,GAAQ,SAAiBA,EAC7BF,EAAAA,CAAkBE,EAC7B,CA2DO,IAAMC,GAAqB,IAK3B,IAAMC,GAAkC,IAIlC0K,GAAmC,EDlFzC,IAAMC,GAAAA,CAAAA,EAAyBC,GAAA1tB,MAAA,EAAO,WAO1C,gBAAG4iB,IAAAA,IAAKvgB,IAAAA,OAAQ+gB,IAAAA,aAAcC,IAAAA,gBAAiBnjB,IAAAA,UAAWojB,IAAAA,WAAAA,EAAAA,WAAa,CAAA,EAAbA,eAAyB,KAClFne,SAAU,WACV/C,MAAO,OACPmhB,UAAW,SACXC,QAAS,cACTnhB,OAAAA,EACAohB,UAAW,cAEPvjB,GAAa,CACbsjB,QAAS,GACb,SAEA,IAAC,sBAAyC,OAAnBxB,GAAaI,MAAM,CAAA,OAAQ,CAC9CoB,QAAStjB,EAAY,IAAM,aAC/B,GAEA,IAAC,sBAAwC,OAAlB8hB,GAAaG,KAAK,CAAA,OAAQ,CAE7CqB,QAAS,UACb,GAEA,IAAA,gBAAiB,CACbre,SAAU,WACV7C,QAAS,QACTD,OAAQ,MACZ,GAEA,IAAA,cAAe,KACX8C,SAAU,WACVue,SAAU,SACVrhB,OAAQ,QACJ+gB,IAAiB,QAAU,CAAEO,UAAW,GAAI,IAChDC,OAAQ,MAAa,OAAPhB,EAAM,EAAC,MAErBY,QAAS,WAGb,IAAA,eAAgB,CACZlhB,QAAS,OACTD,OAAQ,MACZ,GAEA,IAAA,eAAgB,KACZmhB,QAAS,KAAY,OAAPZ,EAAM,EAAC,MAErBvgB,OAAQ+gB,IAAiB,OAAS,OAASA,EAC3CO,UAAW,GACPN,GAAmB,MAAQ,CAAEU,UAAW,GAAkB,OAAfV,EAAe,KAAK,IAEnE,UAAW,CACPhhB,OAAQ,OACRD,MAAO,OAEP,UAAW,CACPC,OAAQ,OACRD,MAAO,MACX,CACJ,KAGJ,IAAA,cAAe,CACX+C,SAAUme,EAAa,WAAa,SAEpCU,OAAQV,EAAa,GAAK,OAC1BhhB,QAAS,OACTC,eAAgB,SAChBqgB,IAAK,EACLqB,UAAW,OACXT,QAAS,EACTI,OAAQN,EAAa,EAAI,WACzBlhB,MAAO,OACPI,KAAM,EAEN0hB,GAAI,CACAN,OAAQ,EACRxhB,MAAO,GACPC,OAAQ,GAERsZ,OAAQ,CACJvZ,MAAO,GACPC,OAAQ,GACRmhB,QAAS,EACTW,aAAc,MACdjO,OAAQ,OACRrM,WAAY,OACZua,WAAY,CAAA,KACZC,OAAQ,UACRC,WAAY,4CAEZ,WAAY,CACRhiB,QAAS,MACb,CACJ,EAEA,wBAAyB,CACrBuH,WAAY,SAChB,CACJ,CACJ,GAEA,IAAC,sBAAwC,OAAlBmY,GAAaG,KAAK,CAAA,OAAQ,CAC7C,cAAe,CACX6B,OAAQV,EAAa,EAAI,OACzBV,IAAK,EAELsB,GAAI,CACA9hB,MAAO,GACPC,OAAQ,GAERsZ,OAAQ,CACJvZ,MAAO,GACPC,OAAQ,EACZ,CACJ,CACJ,CACJ,SAGSsrB,GAAAA,CAAAA,EAAsBD,GAAA1tB,MAAA,EAAO,OAAwB,gBAAG4iB,IAAAA,UAAW,CAC5EtgB,QAAS,OACTsrB,SAAU,OACVhL,IAAK,GAAM,OAAHA,EAAG,MACXxgB,MAAO,MACX,IAEamiB,GAAAA,CAAAA,EAAemJ,GAAA1tB,MAAA,EAAO,WAU/B,gBACIwkB,IAAAA,cACAC,IAAAA,mBACAC,IAAAA,kBACAC,IAAAA,qBACAC,IAAAA,WACAC,IAAAA,UACAjC,IAAAA,IACAiL,IAAAA,qBACG,KACHlrB,SAAU,OACVihB,OAAQY,EAAgB,EAAI,OAAyB,OAAlBC,EAAkB,MAErDpiB,OAAQqiB,EACRf,UAAW,GACPgB,GAAwB,MAAQ,CAAEZ,UAAWY,CAAqB,OACtEviB,MAAOwiB,EACPG,KAAMP,GAAiBK,EAAY,OAAgB,OAATA,GAAc,KAAA,EACxDpB,UAAWe,EAAgB,aAAe,KAAA,EAE1CQ,SAAUnC,GACV1d,SAAU,YAIV,IAAC,sBAA8C,OAAxB6c,GAAaM,WAAW,CAAA,OAAQ,KAC/CkC,GACAqJ,IAAY,GAAK,CACjB9I,KAAM,oBAA2B,OAAPnC,EAAM,EAAC,YACjCjgB,SAAU,gBAAuB,OAAPigB,EAAM,EAAC,YACjCoC,SAAU,CACd,IAKJ,IAAC,sBAAwC,OAAlBhD,GAAaK,KAAK,CAAA,OAAQ,KACzCmC,GAAiB,CACjBO,KAAM,oBAAuB,OAAHnC,EAAG,YAC7BjgB,SAAU,gBAAmB,OAAHigB,EAAG,YAC7BoC,SAAU,CACd,IAIJ,IAAC,sBAAwC,OAAlBhD,GAAaG,KAAK,CAAA,OAAQ,KACzCqC,GAAiB,CACjBO,KAAM,WACNpiB,SAAU,OACVqiB,SAAU,CACd,UAKCC,GAAAA,CAAAA,EAAayI,GAAA1tB,MAAA,EAAO,OAG9B,gBAAG0kB,IAAAA,wBAAyB,CAC3BtiB,MAAO,OAEPC,OAAQqiB,IAAsB,OAAS,OAASA,EAChDf,UAAW,EACXF,UAAW,aACXnhB,QAAS,OACT0c,cAAe,SAEfC,WAAY,UACZsE,UAAW,OACXG,SAAU,SACVsB,SAAU,EACV7f,SAAU,UACd,IAEa+f,GAAAA,CAAAA,EAAoBwI,GAAA1tB,MAAA,EAAO,OAAO,CAC3C2C,SAAU,OACVP,MAAO,OACP2iB,KAAM,EACNpB,UAAW,EACXD,SAAU,SACVphB,QAAS,OACT0c,cAAe,QACnB,GAEa2G,GAAAA,CAAAA,EAAe+H,GAAA1tB,MAAA,EAAO,OAAO,CACtCmF,SAAU,WACV9C,OAAQ,MACZ,GAEawjB,GAAAA,CAAAA,EAA0B6H,GAAA1tB,MAAA,EAAO,OAAO,CACjDwjB,QAAS,OACTlhB,QAAS,OACTC,eAAgB,SAChB0c,WAAY,SACZ0E,UAAW,GAAkC,OAA/Bb,GAA+B,MAC7C5M,OAAQ,kBACRuN,UAAW,YACf,GElPA,IAAA1nB,GAAkBrC,GAAAsC,QAAA,UA2CX,SAAS8xB,GAAkBC,CAAAA,EAC9B,IAAMC,EAA2B,CAAEH,QAAS,EAAGI,KAAM,CAAE,EACvD,GAAI,CAACF,EAAQ,OAAOC,EAEpB,IAAMrf,EAAaof,EAAOnf,WAAA,GACCD,IAAAA,EAAWpR,KAAA,CAAM,QAArC2wB,EAAoBvf,KAAXwf,EAAWxf,KACrByf,EAAaC,OAAOH,GACpBI,EAAaD,OAAOF,GAEtBN,EAAUQ,OAAOE,QAAA,CAASH,IAAeA,EAAa,EAAIA,EAAaJ,EAASH,OAAA,CAChFI,EAAOI,OAAOE,QAAA,CAASD,IAAeA,EAAa,EAAIA,EAAaN,EAASC,IAAA,CAGjF,OAAAJ,EAAUrf,KAAK8D,GAAA,CAAI9D,KAAKmR,GAAA,CAAIkO,EAAS,GAAI,GACzCI,EAAOzf,KAAK8D,GAAA,CAAI9D,KAAKmR,GAAA,CAAIsO,EAAM,GAAI,GAE5B,CAAEJ,QAAAA,EAASI,KAAAA,CAAK,CAC3B,CAEO,SAASO,GAAwBT,CAAAA,EACpC,IAA0BD,EAAAA,GAAkBC,GAApCF,EAAkBC,EAAlBD,QAASI,EAASH,EAATG,KACXQ,EAAcZ,EAAUI,EAC9B,OAAOzf,KAAK8D,GAAA,CAAImc,EAAajB,GACjC,CAEO,SAASkB,GAAsBnN,CAAAA,EAClC,OAAQA,GACJ,IAAK,aACD,MAAO,KACX,KAAK,cACL,IAAK,2BACD,MAAO,KACX,KAAK,YACL,IAAK,kBACD,MAAO,KACX,KAAK,cACL,QACI,MAAO,KACf,CACJ,CAEO,IAAMuE,GAA0F,gBACnGC,IAAAA,sBACAxpB,IAAAA,KAAAA,EAAAA,WAAO,YAAPA,SAEAoyB,GAAAve,OAAAA,CAAMid,aAAA,CACFxH,GACA,CAAE7gB,UAAW+gB,CAAsB,EACnCxpB,IHAoB,IAAAqC,GAAA5C,QAAA,qBA1E5B,SAAS1B,GAA2B2I,CAAAA,EAChC,IACIgjB,EAaAhjB,EAbAgjB,OACAmC,EAYAnlB,EAZAmlB,YACA2F,EAWA9qB,EAXA8qB,OACAxM,EAUAte,EAVAse,OACAqB,EASA3f,EATA2f,IAAAA,EAAAA,WAAM,SAANA,EACAvgB,EAQAY,EARAZ,OACAnC,EAOA+C,EAPA/C,UACA8E,EAMA/B,EANA+B,UACA+gB,EAKA9iB,EALA8iB,sBACA+D,AAAsB8E,EAItB3rB,EAJA6mB,qBACAzmB,EAGAJ,EAHAI,UACAD,EAEAH,EAFAG,QACA1J,EACAuJ,EADAvJ,EAGEm1B,EACFd,UAAAA,WAAAA,EAAUW,GAAsBnN,GAE9BkF,EAAQ9D,GAASC,GACHkL,EAAAA,GAAkBe,GAA9BhB,EAAYC,EAAZD,QACFiB,EAAcN,GAAwBK,GACtCE,EAAgB9I,EAAO9E,KAAA,CAAM,EAAG2N,GAChCE,EAAcD,EAAcrxB,MAAA,CAE5BosB,EAAuB8E,UAAAA,WAAAA,EAAiB,kCACxC5E,EAAqB9pB,UAAAA,WAAAA,EAAa,CAAA,EAClC0rB,EAAqB,CAAC,2BAA4B5mB,EAAS,CAC5DxH,MAAA,CAAOC,SACPmN,IAAA,CAAK,KACJ4gB,EAAkBnpB,UAAAA,WAAAA,EAAU,OAE5BimB,EAAAA,CAAAA,EAAmB2G,GAAAvwB,OAAA,EACrB,eACQhF,EACAA,SAFD,OACCA,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIusB,MAAA,UAAJvsB,WAAAA,EAAiB,CAAC,EAClBA,CAAAA,EAAAA,UAAAA,kBAAAA,EAAIwsB,cAAA,UAAJxsB,WAAAA,EAAyB,CAAC,IAC9B,qBAAsB,gBAE1B,CAACA,EACL,EAEMmrB,EACFgJ,IAAY,EACN,OACA,gBAA8CA,OAA9C,AAAiBA,CAAAA,EAAU,CAAA,EAAKpH,EAAK,UAAgB,OAAPoH,EAAO,KAEzDqB,EAAcjC,SAAAA,GAChB,IAAMkC,EAAWlC,EAAY+B,EAC7B,GAAI,CAAC3rB,GAAa,CAAC8rB,EAAU,OAAO,KACpC,IAAMC,EAAK,SAAkB,OAATnC,OAcPvzB,EAZb,MAAA,CAAA,EACI21B,GAAAztB,GAAA,EAAQ2iB,GAAP,KAEG,uBAAqB,QACrB,aAAY,SAA6BuK,OAApB7B,EAAY,EAAC,QAAkB,OAAX6B,GACzCtK,cAAa,CAAA,EACbC,mBAAoB,EACpBC,kBAAkB,OAClBC,qBAAsBlC,GACtBoC,UAAWA,EACXjC,IAAK6D,EACLoH,QAASA,GACJn0B,CAAAA,EAAAA,UAAAA,kBAAAA,CAAAA,CAAI,WAAoB,OAATuzB,GAAW,UAA1BvzB,WAAAA,EAA+B,CAAC,IAErCmI,SAAA,CAAA,EAAAwtB,GAAAztB,GAAA,EAAQqjB,GAAP,CACGP,kBAAkB,OAClBC,qBAAsBlC,GAEtB5gB,SAAA,CAAA,EAAAwtB,GAAAztB,GAAA,EAAQsjB,GAAP,CACIrjB,SAAAstB,EACG/G,EAAY2G,CAAAA,CAAc9B,EAAS,CAAGA,GAAS,CAAA,EAE/CoC,GAAAztB,GAAA,EAACkkB,GAAA,CACGC,sBAAuBA,EACvBxpB,KAAMutB,CAAAA,EACV,EAER,KAzBCsF,EA6BjB,EAEA,MAAA,CAAA,EACIC,GAAAztB,GAAA,EAAQ6rB,GAAP,KACG7K,IAAK6D,EACLpkB,OAAQmpB,EACRpI,aAAa,OACbC,gBAAiBZ,GACjBzd,UAAW4mB,EACX,aAAW,iBACX1rB,UAAW8pB,GACN5mB,UAAAA,WAAAA,EAAW,CAAC,IAEjBvB,SAAA,CAAA,EAAAwtB,GAAAztB,GAAA,EAAQ+jB,GAAP,CACG9jB,SAAA,CAAA,EAAAwtB,GAAAztB,GAAA,EAAC,MAAA,CACGC,SAAA,CAAA,EAAAwtB,GAAAztB,GAAA,EAAQ+rB,GAAP,KACG3oB,UAAU,2BACV4d,IAAK6D,GACD6B,IAEHzmB,SAAAiS,MAAMwZ,IAAA,CAAK,CAAE5vB,OAAQoxB,CAAY,GAAGpkB,GAAA,CAAI,SAAC6H,EAAGU,UAAUic,EAAWjc,OACtE,EACJ,KAIhB,CAEA,IAAO1Y,GAAQD,GIhIf,IAAA2B,GAAmBvC,GAAAsC,QAAA,oBACbszB,GAAc3kB,SAAAA,SAAiB,CAACA,EAAK1N,UAAA,CAAW,MAGzCsyB,GAAOC,GAAAxvB,OAAAA,CAAOyvB,OAAA,KAYT,gBAAGC,IAAAA,kBAAkBA,EAAa,GAAa,OAAVA,EAAU,MAAO,QAGtD,gBAAGxsB,IAAAA,aAAYA,GAAS,QACrB,gBAAGihB,IAAAA,oBAAmBA,GAAgB,QACnC,gBAAG1iB,IAAAA,uBAAsBA,GAAmB,WACvD,gBAAG2D,IAAAA,iBAAgBA,GAAa,YAUhCiX,GAAAA,CAAAA,EAAemT,GAAAxvB,OAAAA,EAAO,MAAO,CAAE2vB,kBAAmBL,EAAW,OAW5D,gBAAGM,IAAAA,oBAAoBA,GAAgB,MAAQA,EAAe,EAAI,GAAe,OAAZA,EAAY,MAAO,QACpF,gBAAGC,IAAAA,uBACbA,GAAmB,MAAQA,EAAkB,EAAI,GAAkB,OAAfA,EAAe,MAAO,QAC5E,gBAAGD,IAAAA,oBACDA,GAAgB,MAChBA,EAAe,GACf,gGAOF,gBAAGE,IAAAA,oBACDA,GACA,iLAYKC,GAAUP,GAAAxvB,OAAAA,CAAOC,GAAA,OAYjB+vB,GAAkBR,GAAAxvB,OAAAA,CAAOC,GAAA,OAuBzBgwB,GAAaT,GAAAxvB,OAAAA,CAAOC,GAAA,OAKpBiwB,GAAeV,GAAAxvB,OAAAA,CAAOC,GAAA,OCzG5B,SAASkwB,GAAgBC,CAAAA,MAGVA,EAAAA,MAAAA,EAFlB,OAAKA,EACD,YAAaA,EACCA,CAAAA,GAAAA,EAAAA,EACgCxc,OAAA,UADhCwc,mBAAAA,EAAAA,CACgC,CAAU,EAAC,UAD3CA,kBAAAA,EAEAzU,MAAA,UAFAyU,WAAAA,EAEU,KAErBA,EANU,IAOrB,CAEO,IAAMC,GAAW,SAAC7rB,EAAenB,UAChCmB,GACAnB,CAAAA,EAAkB,cACf,EAAA,GAGJ,SAASitB,GACZlwB,CAAAA,EAEA,OAAIA,IAAc,UAAYA,IAAc,SAAiB,SACzDA,IAAc,QAAgB,QAC3B,MACX,CAEO,SAASmwB,GAAkB32B,CAAAA,EAC9B,IAAM42B,EAAM,OAAO52B,GAAU,SAAWA,EAAMgV,WAAA,GAAcjO,IAAA,GAAS,GACrE,OAAI6vB,IAAQ,QAAUA,IAAQ,UAAYA,IAAQ,OACvCA,EAEPA,EAAI9iB,QAAA,CAAS,QACN,OAEP8iB,EAAI9iB,QAAA,CAAS,UACN,SAEP8iB,CAAAA,EAAI9iB,QAAA,CAAS,SAAW8iB,EAAI9iB,QAAA,CAAS,UAC9B,MAAA,CAGf,CAEO,SAASuH,GAAcC,CAAAA,EAC1B,OAAIA,IAAW,MACJ,SAEJ,OACX,CAEO,SAASub,GACZL,CAAAA,CACAM,CAAAA,EAEA,IAAMC,EAAqBJ,GAAkBG,GACvCE,EAAeT,GAAgBC,GAE/BS,EAAa,CAAA,EAAQD,UAAAA,kBAAAA,EAAc5xB,GAAA,EACnC8xB,EAAc,CAAA,EAAQF,UAAAA,kBAAAA,EAAcpsB,KAAA,EAEpCusB,EACFJ,IAAuB,QAAUE,GAAc,CAACC,EAE9CE,EACDL,IAAuB,UAAYG,GACnCH,IAAuB,QAAUE,GAAcC,EAE9CG,EAAahc,GAAc2b,UAAAA,kBAAAA,EAAczX,eAAe,EAE9D,MAAO,CACHwX,mBAAAA,EACAC,aAAAA,EACAG,WAAAA,EACAC,WAAAA,EACAC,WAAAA,CACJ,CACJ,CAEO,SAASC,GAAepnB,CAAAA,MAGiB0G,EAF5C,IAAMA,EAAY1G,EAAQpO,GAAmBoO,GAAS,KAChDqnB,EACM3gB,CAAAA,UAAAA,kBAAAA,EAAW1D,IAAA,IAAS,SAAA,AAAY0D,CAAAA,CAAAA,EAAAA,UAAAA,kBAAAA,EAAWpB,QAAA,UAAXoB,WAAAA,EAAuB,OAAA,IAAa,OAM1E4gB,EAHFtnB,GACA,CAACqnB,GACA3gB,CAAAA,CAAAA,UAAAA,kBAAAA,EAAW1D,IAAA,IAAS,SAAW0D,CAAAA,UAAAA,kBAAAA,EAAW1D,IAAA,IAAS,OAAA,EACT,IAAsB,KAAA,EAIrE,MAAO,CACH0D,UAAAA,EACA2gB,cAAAA,EACAC,iBAAAA,EACAC,oBANAvnB,GAAS,CAACqnB,GAAiB,CAACC,EAAmB,IAAsB,KAAA,CAOzE,CACJ,CCpGA,IAAAr1B,GAAsCC,QAAA,SACtCs1B,GAAsB53B,GAAAsC,QAAA,cCDtB,IAAAC,GAAmBvC,GAAAsC,QAAA,oBAGZ,IAAMg0B,GAAkBuB,GAAAvxB,OAAAA,CAAOC,GAAA,MAInB,gBAAGgf,IAAAA,kBAAiBA,IAG1BuS,GAAgBD,GAAAvxB,OAAAA,CAAOC,GAAA,MAGX+hB,GAAaI,MAAM,CAC3B,gBAAGhgB,IAAAA,aAAYA,IDoIhB,IAAAxD,GAAA5C,QAAA,qBA7HVy1B,GAAsB,CACxBC,aAAc,CACV,IACA,MACA,OACA,IACA,KACA,SACA,IACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,aACJ,CACAC,aAAc,CACV,OACA,SACA,MACA,QACA,QACA,QACA,cACA,aACA,eACA,YAER,EASMC,GAAgB1yB,SAAAA,SACd,CAACA,GAAQ,OAAOA,GAAS,SAClB,GAGJ2yB,GAAAC,OAAAA,CAAUC,QAAA,CAAS7yB,EAAM,CAC5BwyB,aAAcD,GAAoBC,YAAA,CAClCC,aAAcF,GAAoBE,YAAA,CAClCK,aAAc,CAAA,EACdC,WAAY,CAAA,EACZC,oBAAqB,CAAA,EACrBC,WAAY,CAAA,EACZC,aAAc,CAAA,EACdC,SAAU,CAAA,CACd,IAGE1a,GAAqBvX,SAAAA,UACnBA,IAAc,SAAiB,SAC/BA,IAAc,QAAgB,WAC3B,cAGLkyB,GAAiBlyB,SAAAA,UACfA,IAAc,SAAiB,SAC/BA,IAAc,SAAiB,WAC5B,cAoBLmyB,GAAW,gBACblxB,IAAAA,YACAC,IAAAA,WACAkxB,IAAAA,oBAAAA,EAAAA,WAAsB,OAAtBA,EACAC,IAAAA,6BAAAA,EAAAA,WAA+B,MAA/BA,EACAC,IAAAA,gBAAAA,EAAAA,WAAkB,IAAlBA,EACAtxB,IAAAA,2BACGuxB,OANHtxB,cACAC,aACAkxB,sBACAC,+BACAC,kBACAtxB,+BAIA,IAAMwxB,EAAAA,CAAAA,EAAgBC,GAAAn0B,OAAA,EAAQ,iBACtB,CAAC2C,GAAe,OAAOA,GAAgB,UAAY,CAACA,EAAYV,IAAA,GACzD,GAEJixB,GAAavwB,IACrB,CAACA,EAAY,EAGVyxB,EAAmBxxB,IAAe,QAGxC,GAAI,CAACsxB,EACD,OAAO,KAGX,IAAMrwB,EAAiBoV,GAAkB6a,GACnCvT,EAAaqT,GAAcG,GAGjC,MAAA,CAAA,EACIM,GAAAnxB,GAAA,EAACouB,GAAA,CACG/Q,WAAYA,EACZyJ,MAAO,CACHnmB,eAAAA,EACAd,gBAAiBT,GAAuBI,EAC5C,EAEAS,SAAA,CAAA,EAAAkxB,GAAAnxB,GAAA,EAAC4vB,GAAA,CAAcpvB,MAAOswB,EAClB7wB,SAAA,CAAA,EAAAkxB,GAAAnxB,GAAA,EAAC/G,GAAA,OACO83B,IACJvxB,2BAA4BA,EAC5BC,YAAauxB,EACbtxB,WAAYwxB,IAChB,EACJ,EAGZ,EAEOv3B,GAAQg3B,GEpHP,IAAA3zB,GAAA5C,QAAA,qBAlBR,SAASg3B,GAAc,CAOvB,MANIxuB,EADmB,EACnBA,MACAmB,EAFmB,EAEnBA,SACA/F,EAHmB,EAGnBA,KACAqzB,EAJmB,EAInBA,aACAC,EALmB,EAKnBA,SACA9yB,EANmB,EAMnBA,UASA,IAAM+yB,EAAW,OAAOvzB,GAAS,SAAWA,EAAO,OAS9BszB,EAQAA,EAUiBA,EAzBtC,MAAA,CAAA,EACIE,GAAA5mB,IAAA,EAAC0jB,GAAA,CAAa,cAAY,qBACrBruB,SAAA,CAAA2C,EAAAA,CAAAA,EACG4uB,GAAAxxB,GAAA,EAAC0F,GAAA,GACGX,QAAQ,KACRM,UAAWgsB,EACX5yB,MAAM,WACD6yB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAU1uB,KAAA,UAAV0uB,WAAAA,EAAmB,CAAC,IAE7B,KACHvtB,EAAAA,CAAAA,EACGytB,GAAAxxB,GAAA,EAAC0F,GAAA,GACGX,QAAQ,OACRM,UAAWtB,EACXtF,MAAM,WACD6yB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAUvtB,QAAA,UAAVutB,WAAAA,EAAsB,CAAC,IAEhC,KACHC,EAAAA,CAAAA,EACGC,GAAAxxB,GAAA,EAACouB,GAAA,CACGnuB,SAAA,CAAA,EAAAuxB,GAAAxxB,GAAA,EAACrG,GAAA,CACG8F,YAAa8xB,EACb/yB,UAAWA,EACXe,WAAY,CAAA,EACZC,2BAA2B,cAC3B1H,EAAG,CAAE2H,YAAa6xB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAUtzB,IAAA,UAAVszB,WAAAA,EAAkB,CAAC,CAAE,CAAA,EAC3C,GAEJ,KAAA,EAGhB,CAEA,SAASG,GAAa,CAMtB,MALIC,EADkB,EAClBA,KACAlD,EAFkB,EAElBA,IACAhwB,EAHkB,EAGlBA,UACAiD,EAJkB,EAIlBA,UACA6vB,EALkB,EAKlBA,aAUM9C,EAAAA,EAAAA,EAFN,GAAI,CAACkD,GAAQ,CAAClD,EAAK,OAAO,SAEpBA,EAAwD8C,EAD9D,IAAMK,EACN,KAAMnD,CAAAA,GAAAA,EAAAA,EAAqBxc,OAAA,UAArBwc,mBAAAA,EAAAA,CAAqB,CAAU,EAAC,UAAhCA,mBAAAA,EAAAA,EAAmC12B,CAAA,UAAnC02B,kBAAAA,EAAsCzU,MAAA,UAAtCyU,WAAAA,EAAgD,CAAC,EAAO8C,CAAAA,EAAAA,UAAAA,kBAAAA,EAAUvX,MAAA,UAAVuX,WAAAA,EAAoB,CAAC,GACnF,MAAA,CAAA,EACIE,GAAAxxB,GAAA,EAACquB,GAAA,CAAW,cAAY,mBACpBpuB,SAAA,CAAA,EAAAuxB,GAAAxxB,GAAA,EAACzH,GAAA,OAAWi2B,IAAKhtB,QAASmwB,EAAenzB,UAAWA,EAAWiD,UAAWA,IAAW,EAGjG,CAEA,IAAM7I,GAA2CyI,SAAAA,GAC7C,IACIuB,EAgBAvB,EAhBAuB,MACAmB,EAeA1C,EAfA0C,SAAAA,EAAAA,WAAW,GAAXA,EACA/F,EAcAqD,EAdArD,KAAAA,EAAAA,WAAO,GAAPA,EACAkK,EAaA7G,EAbA6G,MACA0pB,EAYAvwB,EAZAuwB,UAAAA,EAAAA,WAAY,OAAZA,EACApD,EAWAntB,EAXAmtB,IACAqD,EAUAxwB,EAVAwwB,eACAC,EASAzwB,EATAywB,iBACAC,EAQA1wB,EARA0wB,kBAAAA,EAAAA,WAAoB,OAApBA,EACAC,EAOA3wB,EAPA2wB,iBAAAA,EAAAA,WAAmB,UAAnBA,EACApW,EAMAva,EANAua,WAAAA,EAAAA,WAAa,UAAbA,EACAqW,EAKA5wB,EALA4wB,cAAAA,EAAAA,WAAgB,MAAhBA,EACAC,EAIA7wB,EAJA6wB,WAAAA,EAAAA,WAAa,IAAbA,EACA1wB,EAGAH,EAHAG,QAAAA,EAAAA,WAAU,CAAC,EAAXA,EACAC,EAEAJ,EAFAI,UAAAA,EAAAA,WAAY,CAAA,EAAZA,EACA3J,EACAuJ,EADAvJ,EAAAA,EAAAA,WAAI,CAAC,EAALA,EAGEq6B,EAAkBxD,GAAkBiD,GACtCQ,CAEAD,CAAAA,IAAoB,OACpBC,EAAYP,UAAAA,WAAAA,EAAkBrD,EACvB2D,IAAoB,UAC3BC,CAAAA,EAAYN,UAAAA,WAAAA,EAAoBtD,CAAAA,MAgBtBQ,EAdd,IAAMxwB,EAAYkwB,GAA0BqD,GAOxClD,EAAAA,GAAYuD,EAAWD,GALvBpD,EAKAF,EALAE,mBACAC,EAIAH,EAJAG,aACAG,EAGAN,EAHAM,WACAC,EAEAP,EAFAO,WACAC,EACAR,EADAQ,WAGEgC,EAAe5C,GAAS7rB,UAAAA,WAAAA,EAAS,GAAInB,GACiC6tB,EAAAA,GAAepnB,GAAnF0G,EAAoE0gB,EAApE1gB,UAAW2gB,EAAyDD,EAAzDC,cAAeC,EAA0CF,EAA1CE,iBAAkBC,EAAwBH,EAAxBG,oBAE9C4C,EAASlD,EAAa,IAAM,UAC5BmD,EAAgBnD,EAChB,CAAEtxB,KAAMmxB,CAAAA,EAAAA,UAAAA,kBAAAA,EAAc5xB,GAAA,UAAd4xB,WAAAA,EAAqB,GAAI1b,OAAQ+b,CAAW,EACpD,CAAC,EAEP,MAAA,CAAA,EACImC,GAAA5mB,IAAA,EAAC+iB,GAAA,SACGrsB,MAAO9C,EACP+jB,aAAc0P,EACdpyB,gBAAiBmyB,EACjBxuB,UAAWoY,EACXkS,WAAYoE,EACZzsB,GAAI4sB,GACAC,IACJ,iBAAgBvD,IACZvtB,IAEJvB,SAAA,CAAA,CAAA,EAAAuxB,GAAAxxB,GAAA,EAACya,GAAA,CACG,cAAa,cAA6B,OAAf7L,UAAAA,kBAAAA,EAAW1D,IAAI,EAC1CgjB,aAAcqB,EACdvB,aAAcwB,EACdvB,gBAAiBwB,EAEhBxvB,SAAAiI,EAAAA,CAAAA,EAAQspB,GAAAxxB,GAAA,EAACxH,GAAA,CAAY8V,aAAcpG,EAAOpQ,CAAA,CAAGA,UAAAA,kBAAAA,EAAGoQ,KAAA,GAAY,IAAA,GACjE,CAAA,EAEAspB,GAAA5mB,IAAA,EAACujB,GAAA,CAAQ,cAAY,eACjBluB,SAAA,CAAA,CAAA,EAAAuxB,GAAAxxB,GAAA,EAACoxB,GAAA,CACGxuB,MAAOA,EACPmB,SAAUA,EACV/F,KAAMA,EACNqzB,aAAcA,EACdC,SAAUx5B,EACV0G,UAAWA,CAAAA,GACf,CAAA,EACAgzB,GAAAxxB,GAAA,EAACyxB,GAAA,CACGC,KAAMtC,EACNZ,IAAK4D,EACL5zB,UAAWA,EACXiD,UAAWA,EACX6vB,SAAUx5B,CAAAA,GACd,GACJ,GAGZ,EAEOe,GAAQD,GCtLR,IAAM25B,GAA4B,sBAC5BC,GAAoB,cACpBC,GAAuB,iBACvBC,GAAmB,aAGnBC,GAAyB,cCsE9B,IAAA31B,GAAA5C,QAAA,qBAhDFw4B,GAAsB,SACxBC,EACAjwB,EACAmB,EACA/F,SAC0B,CAC1B,CACIhG,MAAO66B,EACPC,YAAaP,GACbxtB,QAAS,aACT3B,UAAW,gBACX2vB,WAAY,cAChB,EACA,CACI/6B,MAAO4K,EACPkwB,YAAaN,GACbztB,QAAS,KACT3B,UAAW,aACX2vB,WAAY,OAChB,EACA,CACI/6B,MAAO+L,EACP+uB,YAAaL,GACb1tB,QAAS,KACT3B,UAAW,WACX2vB,WAAY,UAChB,EACA,CACI/6B,MAAOgG,EACP80B,YAAaJ,GACb3tB,QAAS,OACT3B,UAAW,OACX2vB,WAAY,MAChB,EACJ,EAEaC,GAAoD,gBAC7DH,IAAAA,aACAjwB,IAAAA,MACAmB,IAAAA,SACA/F,IAAAA,KACAyD,IAAAA,UACA6vB,IAAAA,SAAAA,EAAAA,WAAW,CAAC,EAAZA,EACA9tB,IAAAA,UAEA,IAAMyvB,EAASL,GAAoBC,EAAcjwB,EAAOmB,EAAU/F,GAElE,MAAA,CAAA,EACIk1B,GAAAlzB,GAAA,EAAAkzB,GAAArZ,QAAA,CAAA,CACK5Z,SAAAgzB,EAAOnqB,GAAA,CAAKqqB,SAAAA,OACe7B,EAAxB,IAAM8B,EAAkB9B,CAAAA,EAAAA,UAAAA,kBAAAA,CAAAA,CAAW6B,EAAMJ,UAAU,CAAA,UAA3BzB,WAAAA,EAAgC,CAAC,EAErD+B,EAAeF,EAAMn7B,KAAA,AACrB,EAACyJ,GAAa0xB,EAAMn7B,KAAA,GAAUm7B,EAAML,WAAA,CACpCO,EAAeF,EAAMn7B,KAAA,CACdm7B,EAAMn7B,KAAA,GAAU,IACvBq7B,CAAAA,EAAeF,EAAML,WAAA,EAGzB,IAAMr0B,EAAQ+E,IAAc,QAAU,UAAY,UAElD,MAAA,CAAA,EACI0vB,GAAAlzB,GAAA,EAAC0F,GAAA,GAEGX,QAASouB,EAAMpuB,OAAA,CACfM,UAAWguB,EACXjwB,UAAW+vB,EAAM/vB,SAAA,CACjB3E,MAAOA,GACH20B,GALCD,EAAMJ,UAMf,CAER,EAAC,EAGb,ECvGA,IAAA52B,GAAuB/B,QAAA,4BCOhB,IAAMmb,GAAoB,qBAG1B,SAAS+d,GAAwBC,CAAAA,EACpC,OAAOA,UAAAA,WAAAA,EAAoB,MAC/B,CAEO,SAASC,GAAqB9vB,CAAAA,EACjC,OAAOA,UAAAA,WAAAA,EAAiB,IAC5B,CAEO,SAAS+vB,GAAiBjwB,CAAAA,EAC7B,OAAQA,IAAc,QAAU,QAAU,OAC9C,CAGO,SAASkwB,GAAiBlwB,CAAAA,EAC7B,OAAOA,IAAc,QAAU,QAAU,OAC7C,CAIA,IAAMmwB,GAAoE,CACtE/yB,KAAM,cACNE,OAAQ,SACRD,MAAO,aACX,EAEO,SAAS+yB,GAAqBL,CAAAA,EACjC,OAAOI,EAAAA,CAAqBJ,EAChC,CDhCO,IAAMM,GAAaC,GAAA11B,MAAA,CAAOC,GAAA,OAapBH,GAAAA,CAAAA,EAAY41B,GAAA11B,MAAA,EAAO,gBAUnBmX,IAOPwe,GAAqB,CACvBjZ,GAAI,CAAEC,MAAO,GAAKC,IAAK,CAAE,EACzBC,GAAI,CAAEF,MAAO,GAAKC,IAAK,CAAE,EACzBE,GAAI,CAAEH,MAAO,GAAKC,IAAK,CAAE,CAC7B,EAEMgZ,GAAwB,SAC1BzqB,EACAqR,EACAnc,GAEA,IAAuBs1B,EAAAA,EAAAA,CAAmBnZ,EAAK,CAAvCG,EAAegZ,EAAfhZ,MAAOC,EAAQ+Y,EAAR/Y,IACTtR,EAAYjL,IAAU,QAAU,UAAY,gBAElD,OAAI8K,IAAc,cACP,8CAA4DwR,OAAdrR,EAAS,MAAqBA,OAAhBqR,EAAK,YAAyBC,OAAdtR,EAAS,MAAQ,OAAHsR,EAAG,OAGpGzR,IAAc,cACP,6CAA2DwR,OAAdrR,EAAS,MAAqBA,OAAhBqR,EAAK,YAAyBC,OAAdtR,EAAS,MAAQ,OAAHsR,EAAG,OAGhG,4CAA0DD,OAAdrR,EAAS,MAAqBA,OAAhBqR,EAAK,YAAyBC,OAAdtR,EAAS,MAAQ,OAAHsR,EAAG,MACtG,EAEaL,GAAkBmZ,GAAA11B,MAAA,CAAOC,GAAA,MAUhC,gBAAGkL,IAAAA,UAAWqR,IAAAA,MAAOnc,IAAAA,aAAYu1B,GAAsBzqB,EAAWqR,EAAOnc,IAIrE,gBAAGmc,IAAAA,MAAOnc,IAAAA,MACZ,IAAuBs1B,EAAAA,EAAAA,CAAmBnZ,EAAK,CAAvCG,EAAegZ,EAAfhZ,MAAOC,EAAQ+Y,EAAR/Y,IACTtR,EAAYjL,IAAU,QAAU,UAAY,gBAClD,MAAO,4CAA0Dsc,OAAdrR,EAAS,MAAqBA,OAAhBqR,EAAK,YAAyBC,OAAdtR,EAAS,MAAQ,OAAHsR,EAAG,MACtG,GAOSiZ,GAAUH,GAAA11B,MAAA,CAAOC,GAAA,MAQP,gBAAGsC,IAAAA,sBAAqBA,UAAAA,WAAAA,EAAkB,cAGpD4U,IAYA4Y,GAAU2F,GAAA11B,MAAA,CAAOC,GAAA,MAKZ,gBAAGsjB,IAAAA,iBAAgBA,UAAAA,WAAAA,EAAa,QAGrCpM,IAOA2e,GAAyB,6BAEzB/Y,GAAgB2Y,GAAA11B,MAAA,CAAOC,GAAA,MACvBkX,GACD2e,IAQCne,GACTvX,SAAAA,UAEIA,IAAc,SAAiB,SAC/BA,IAAc,QAAgB,WAC3B,cEnFS,IAAAxB,GAAA5C,QAAA,qBAjCdf,GAAyCgI,SAAAA,OA+DV0Y,EA9DjC,IACInX,EAcAvB,EAdAuB,MACAmB,EAaA1C,EAbA0C,SACA/F,EAYAqD,EAZArD,KACA60B,EAWAxxB,EAXAwxB,aACA9Y,EAUA1Y,EAVA0Y,OACA7R,EASA7G,EATA6G,MACAisB,AAAY/wB,EAQZ/B,EARA8yB,WACApC,AAAmBwB,EAOnBlyB,EAPA0wB,kBACkBqC,EAMlB/yB,EANAgzB,iBAAkBD,EAAAA,WAAkB,CAAA,EAAlBA,EAClBnY,AAAgBvY,EAKhBrC,EALA4a,eACAL,AAAYpY,EAIZnC,EAJAua,WACA9jB,EAGAuJ,EAHAvJ,EAAAA,EAAAA,WAAI,CAAC,EAALA,EACA0J,EAEAH,EAFAG,QAAAA,EAAAA,WAAU,CAAC,EAAXA,EACAC,EACAJ,EADAI,UAAAA,EAAAA,WAAY,CAAA,EAAZA,EAEE6yB,EAA2BhB,GAAwBC,GACnDgB,EAAwBf,GAAqB9vB,GAC7CiY,EAAoB8X,GAAiBjwB,GAErC7C,EAAiBoV,GAAkBue,GACnCvY,EAAgB2X,GAAiB/X,GACjCK,EAAoB4X,GAAqBU,OAwCdva,EAAAA,EAtCjC,MAAA,CAAA,EACIya,GAAA5pB,IAAA,EAAC1M,GAAA,KACGkF,UAAWA,EACX,aAAYuvB,IACPnxB,UAAAA,WAAAA,EAAW,CAAC,IAEhBvB,SAAA,CAAAiI,GAAAA,CAAAA,EACGssB,GAAAx0B,GAAA,EAAC6zB,GAAA,CACG5zB,SAAA,CAAA,EAAAu0B,GAAAx0B,GAAA,EAACxH,GAAA,CAAY8V,aAAcpG,EAAOpQ,CAAA,CAAGA,UAAAA,kBAAAA,EAAGoQ,KAAA,EAAO,GAItDksB,GAAAA,CAAAA,EACGI,GAAAx0B,GAAA,EAAC2a,GAAA,CACGpR,UAAWyS,EACXpB,MAAO2Z,EACP91B,MAAOsd,EACP,cAAY,MAAA,GAChB,CAAA,EAGJyY,GAAAx0B,GAAA,EAACi0B,GAAA,CAAQtzB,eAAgBA,EACrBV,SAAA,CAAA,EAAAu0B,GAAA5pB,IAAA,EAACujB,GAAA,CAAQxM,UAAW2S,EAChBr0B,SAAA,CAAA,CAAA,EAAAu0B,GAAAx0B,GAAA,EAACgzB,GAAA,CACGH,aAAcA,EACdjwB,MAAOA,EACPmB,SAAUA,EACV/F,KAAMA,EACNyD,UAAWA,EACX6vB,SAAUx5B,EACV0L,UAAWmY,CAAAA,GAGd5B,GAAAA,CAAAA,EACGya,GAAAx0B,GAAA,EAACmb,GAAA,CAAc/X,UAAW8wB,GACtBj0B,SAAA,CAAA,EAAAu0B,GAAAx0B,GAAA,EAACzH,GAAA,OACOwhB,IACJvY,QACKuY,CAAAA,EAAAA,CAAAA,GAAAA,EAAAA,EAAwBjiB,CAAA,UAAxBiiB,kBAAAA,EAA2BoC,UAAA,UAA3BpC,WAAAA,EACDjiB,UAAAA,kBAAAA,EAAGiiB,MAAA,UADFA,WAAAA,EAED,CAAC,EAELvb,UAAW81B,EACX7yB,UAAWA,IACf,GACJ,EAER,GACJ,GAGZ,EAEOnI,GAAQD","sourcesContent":["\"use strict\";var vo=Object.create;var Te=Object.defineProperty;var Eo=Object.getOwnPropertyDescriptor;var wo=Object.getOwnPropertyNames;var ko=Object.getPrototypeOf,$o=Object.prototype.hasOwnProperty;var _o=(e,t)=>{for(var n in t)Te(e,n,{get:t[n],enumerable:!0})},Tt=(e,t,n,r)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of wo(t))!$o.call(e,i)&&i!==n&&Te(e,i,{get:()=>t[i],enumerable:!(r=Eo(t,i))||r.enumerable});return e};var $=(e,t,n)=>(n=e!=null?vo(ko(e)):{},Tt(t||!e||!e.__esModule?Te(n,\"default\",{value:e,enumerable:!0}):n,e)),Ro=e=>Tt(Te({},\"__esModule\",{value:!0}),e);var qi={};_o(qi,{Button:()=>Re,Buttons:()=>J,BynderMedia:()=>q,Carousel:()=>dr,ColumnControl:()=>_r,ContentCard:()=>Vr,CsImage:()=>Rt,CsTextComponent:()=>Se,DEFAULT_BANNER_CONFIG:()=>Qo,DEFAULT_CAROUSEL_CONFIG:()=>qo,DEFAULT_ROTATION_INTERVAL:()=>Jo,HeroBanner:()=>uo,MarketingBanner:()=>dt,PLACEHOLDER_VALUES:()=>se,RichTextComponent:()=>Be,SpacingDivider:()=>Nn,extractBynderMedia:()=>de,getMediaUrl:()=>Qe});module.exports=Ro(qi);var Ce=require(\"react\"),wt=$(require(\"@emotion/styled\"));var Mo=require(\"react\");var Io=\"{%language}\",Po=\"{%LANGUAGE}\",Ao=\"{%region}\",Lo=\"{%REGION}\",Fe=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(Ao,t.region),e=e.replace(Lo,t.region.toUpperCase())),t.language&&(e=e.replace(Io,t.language),e=e.replace(Po,t.language.toUpperCase())),e);var He=\"us\",Ge=\"en\";function Bo(e){if(!e?.startsWith?.(\"?\"))return;let t=new URLSearchParams(e),n=t.get(\"region\"),r=t.get(\"language\");if(!(!n&&!r))return{region:n??He,language:r??Ge}}function Do(e){if(!e)return;let t=e.split(\"/\").filter(Boolean);if(t.length<2)return;let[n,r]=t;if(n?.length===2&&r?.length===2)return{region:n,language:r}}var Ue=()=>{if(typeof window>\"u\"||!window.location)return{region:He,language:Ge};let{search:e,pathname:t}=window.location;return Bo(e)??Do(t)??{region:He,language:Ge}};var No=require(\"react\"),Oo=require(\"@mui/material\"),Ct=require(\"@nuskin/foundation-theme\"),{getGenomeColor:aa}=Ct.ColorUtils;var St=require(\"@mui/material\"),vt=require(\"@nuskin/foundation-theme\"),Et=require(\"react\"),{getGenomeColor:Wo}=vt.ColorUtils,Ho=(e=!1)=>{let t=(0,St.useTheme)();return(0,Et.useMemo)(()=>Wo(t,\"N10\",e?\"light\":\"dark\"),[e,t])},ze=Ho;var Ve=require(\"react/jsx-runtime\"),Go=()=>(0,Ce.useMemo)(()=>Ue(),[]),Fo=(e,t)=>!t||!e?e:Fe(e,t),Uo=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let r=new DOMParser().parseFromString(e,\"text/html\");return r.querySelectorAll(\"a\").forEach(i=>{let o=i.getAttribute(\"href\");o&&i.setAttribute(\"href\",Fo(o,t))}),r.body.innerHTML},zo=wt.default.div`\n width: ${({fullWidth:e})=>e?\"100%\":\"auto\"};\n background-color: ${({bgColor:e})=>e};\n text-align: ${({alignment:e})=>e};\n color: ${({color:e})=>e};\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`,Vo=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},Xo=e=>{try{let n=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof n==\"string\"&&n.trim()?n:null}catch{return null}},Xe=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return Vo(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?Xo(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},jo=({full_width:e=!1,container_background_color:t,alignment:n=\"left\",text_editor:r,font_color:i=!1,$:o})=>{let a=ze(i),s=Go(),l=(0,Ce.useMemo)(()=>Xe(t),[t]),d=(0,Ce.useMemo)(()=>Uo(r,s),[r,s]);return r?(0,Ve.jsx)(zo,{fullWidth:e,bgColor:l,alignment:n,color:a,children:(0,Ve.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:d},...o?.text_editor})}):null},Se=jo;var _t=require(\"@nuskin/foundation-ui-components\");var kt=require(\"@nuskin/foundation-theme\"),$t=(0,kt.styled)(\"div\")(({image_alignment:e=\"center\",width:t,height:n})=>({display:\"flex\",justifyContent:{left:\"flex-start\",right:\"flex-end\",center:\"center\"}[e],\"& img\":{maxWidth:\"fit-content\",objectFit:\"contain\",objectPosition:\"center\"}}));var je=require(\"react/jsx-runtime\"),Ko=\"data:image/svg+xml;utf8,\"+encodeURIComponent(`<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>`),Yo=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],Zo=e=>{let{image_alignment:t=\"center\",image:n,parent$:r,isEditing:i,$:o,...a}=e,s=null,l=null,d=null;try{let m=typeof n==\"string\"?JSON.parse(n):n,y=m?.image?.[0];y?.selected||y?.files?(s=y?.selected,l=y?.files):m?.url&&(d=m)}catch(m){console.warn(\"[CsImage] Failed to parse image prop:\",m)}let c=Ko,u=\"Image not available\",p=\"100%\",T=\"100%\";if(s||l){let m=s?.imageType??\"transformBaseUrl\",y=l?.[m];y?.url&&(c=y.url,u=s?.altText??\"Image\",p=s?.width??\"100%\",T=s?.height??\"100%\")}else d?.url&&(c=d.url,u=d.title||d.filename||\"Image\");let x={src:c,alt:u,width:p,height:T};Yo.forEach(m=>{a[m]!==void 0&&(x[m]=a[m])});let g=a?.full_width?\"container !p-0\":\"\";return(0,je.jsx)($t,{image_alignment:t,width:x.width,height:x.height,className:g,children:(0,je.jsx)(_t.NsImage,{...x,...o?.image||{}})})},Rt=Zo;var Qo={position:\"left\",textColor:\"white\",showGradient:!1,gradientDepth:\"md\",mediaType:\"image\",ctaVariant:\"dark\"},qo={rotationInterval:5e3},Jo=5e3,se={header:\"Enter Header\",title:\"Enter Title\",subtitle:\"Enter Subtitle\",body:\"Enter Body Text\"};var Pt=$(require(\"@emotion/styled\")),At={h1:{desktop:{fontSize:\"44px\",lineHeight:\"50px\"},mobile:{fontSize:\"38px\",lineHeight:\"44px\"},fontFamily:\"Lora\"},h2:{desktop:{fontSize:\"26px\",lineHeight:\"34px\"},mobile:{fontSize:\"24px\",lineHeight:\"30px\"},fontFamily:\"Lora\"},h3:{desktop:{fontSize:\"22px\",lineHeight:\"28px\"},mobile:{fontSize:\"20px\",lineHeight:\"26px\"},fontFamily:\"Lora\"},body:{desktop:{fontSize:\"16px\",lineHeight:\"22px\"},mobile:{fontSize:\"16px\",lineHeight:\"22px\"},fontFamily:\"Inter\"},disclaimer:{desktop:{fontSize:\"12px\",lineHeight:\"16px\"},mobile:{fontSize:\"12px\",lineHeight:\"16px\"},fontFamily:\"Inter\"},boxquote:{desktop:{fontSize:\"16px\",lineHeight:\"22px\"},mobile:{fontSize:\"16px\",lineHeight:\"22px\"},fontFamily:\"Inter\"}},It=`\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`,Lt={h1:\"h1\",h2:\"h2\",h3:\"h3\",body:\"p\",disclaimer:\"p\",boxquote:\"p\"},Bt=Pt.default.div`\n ${({variant:e,color:t=\"#1D1D1B\"})=>{if(!e)return`\n color: ${t};\n margin: 0;\n padding: 0;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n ${It}\n `;let n=At[e];if(!n)return\"\";let r=n.fontFamily===\"Lora\"?\"'Lora', serif\":\"'Inter', sans-serif\",i=n.fontWeight||\"400\",o=e===\"boxquote\";return`\n /* Desktop styles */\n font-size: ${n.desktop.fontSize};\n line-height: ${n.desktop.lineHeight};\n font-family: ${r};\n color: ${t};\n margin: 0;\n padding: 0;\n font-weight: ${i};\n ${o?`\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\n }\n `:\"\"}\n\n /* Mobile/Tablet styles */\n @media (max-width: 768px) {\n font-size: ${n.mobile.fontSize};\n line-height: ${n.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 ${It}\n `}}\n`;var Dt=require(\"react/jsx-runtime\"),ei=({variant:e,inputText:t,color:n=\"#1D1D1B\",className:r=\"\",dataTestId:i,...o})=>{let a=e&&Lt[e]||\"div\";return(0,Dt.jsx)(Bt,{as:a,variant:e,color:n,className:r,\"data-testid\":i,...o,children:t})},O=ei;var le=$(require(\"@emotion/styled\"));var ne={mobile:0,tablet:768,desktop:1024,wide:1440};var W={headerMargin:\"0 0 0.25rem 0\",titleMargin:\"0 0 0.75rem 0\",subtitleMargin:\"0 0 0.5rem 0\",bodyMargin:\"0\",textGap:\"1.5rem\",desktopPadding:\"3rem\",mobilePadding:\"2rem\",carouselGap:\"0.75rem\",ctaPaddingDesktop:\"16px 32px\",ctaPaddingTablet:\"12px 28px\",ctaPaddingWide:\"18px 36px\"},oe={bannerHeightDesktop:\"600px\",bannerHeightMobile:\"400px\",textMaxWidth:\"600px\",indicatorSize:\"12px\",indicatorBorder:\"2px\"},re={textWhite:\"#ffffff\",textDark:\"#1D1D1B\",textGray:\"#666\",ctaDark:\"#888888\",ctaBorder:\"#888888\",fallbackBg:\"#f0f0f0\",indicatorBorder:\"rgba(255, 255, 255, 0.9)\",indicatorActive:\"rgba(255, 255, 255, 0.9)\",indicatorInactive:\"transparent\"},Mt={white:re.textWhite,dark:re.textDark},ve={fast:\"0.1s ease\",default:\"0.3s ease\",slow:\"0.6s cubic-bezier(0.4, 0, 0.2, 1)\"},ue={background:0,media:0,gradient:1,content:2,controls:3},j={tablet:`@media (min-width: ${ne.tablet+1}px) and (max-width: ${ne.desktop-1}px)`,desktop:`@media (min-width: ${ne.desktop}px) and (max-width: ${ne.wide-1}px)`,wide:`@media (min-width: ${ne.wide}px)`,mobileAndBelow:`@media (max-width: ${ne.tablet}px)`,desktopAndUp:`@media (min-width: ${ne.desktop}px)`};var V=require(\"@emotion/react\");var Nt=V.css`\n ${j.mobileAndBelow} {\n text-align: center;\n }\n`,Ot=(e=[\"background-color\",\"color\",\"border-color\",\"transform\",\"text-decoration\"])=>V.css`\n transition: ${e.map(t=>`${t} ${ve.default}`).join(\", \")};\n`;var Ee=V.css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`,Na=V.css`\n ${Ee}\n width: 100%;\n height: 100%;\n`,Wt=V.css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`,Oa=V.css`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Wa=V.css`\n margin: 0;\n padding: 0;\n`;var Ke=(e,t,n,r)=>V.css`\n background: linear-gradient(${e}, rgba(${r}, ${t}), rgba(${r}, ${n}));\n`,Ye=(e,t,n)=>V.css`\n background: radial-gradient(circle, rgba(${n}, ${e}), rgba(${n}, ${t}));\n`;var Ht=le.default.div`\n text-align: ${({textAlignment:e})=>e};\n max-width: 90vw;\n overflow-wrap: break-word;\n ${Nt}\n`,Gt=le.default.div`\n margin: ${W.headerMargin};\n letter-spacing: 0.05em;\n`,Ft=le.default.div`\n margin: ${W.titleMargin};\n`,Ut=le.default.div`\n margin: ${W.subtitleMargin};\n`,zt=le.default.div`\n margin: ${W.bodyMargin};\n`;var H=require(\"react/jsx-runtime\");function we(e,t,n){if(n===!0&&(!e||e===t))return t;if(!(n===!1&&e===t))return e}function Ze({headerText:e,title:t,subtitle:n,bodyText:r,textColor:i=\"#ffffff\",textAlignment:o=\"left\",testId:a,$:s,isEditing:l}){let d=we(e,se.header,l),c=we(t,se.title,l),u=we(n,se.subtitle,l),p=we(r,se.body,l);return!d&&!c&&!u&&!p?null:(0,H.jsxs)(Ht,{textAlignment:o,\"data-testid\":a,children:[d&&(0,H.jsx)(Gt,{children:(0,H.jsx)(O,{variant:\"disclaimer\",inputText:d,color:i,\"aria-label\":d,...s?.header_text??{}})}),c&&(0,H.jsx)(Ft,{children:(0,H.jsx)(O,{variant:\"h2\",inputText:c,color:i,\"aria-label\":c,...s?.title??{}})}),u&&(0,H.jsx)(Ut,{children:(0,H.jsx)(O,{variant:\"h3\",inputText:u,color:i,\"aria-label\":u,...s?.subtitle??{}})}),p&&(0,H.jsx)(zt,{children:(0,H.jsx)(O,{variant:\"body\",inputText:p,color:i,\"aria-label\":p,...s?.body_text??{}})})]})}var et=$(require(\"react\"));function Qe(e,t,n){let{url:r=\"\",type:i=\"\"}=e??{};return i===\"VIDEO\"?t?r:n?.[0]??\"\":r}function Vt(e,t){try{let n=new URL(e),r=n.searchParams.getAll(\"io\");if(!r.length)return e;let i=r.some(d=>d.startsWith(\"transform:fit\")),o=r.some(d=>d.includes(\"transform:fill\")?d.includes(\"width:\")&&d.includes(\"height:\")||n.searchParams.has(\"width\")&&n.searchParams.has(\"height\"):!1),a=i||o,s=r.map(d=>!a&&d.includes(\"transform:fill\")?`${d},aspectratio:${t}`:d),l=[];return s.forEach(d=>l.push(`io=${d}`)),l.push(\"quality=95\"),n.searchParams.forEach((d,c)=>{c!==\"io\"&&l.push(`${c}=${d}`)}),`${n.origin}${n.pathname}?${l.join(\"&\")}`}catch(n){return console.warn(\"Failed to generate responsive URL:\",n),e}}function ti(e){try{return new URL(e).searchParams.has(\"io\")?e:`${e}?io=transform:fill&quality=95`}catch{return e}}function ni(e){try{let n=new URL(e).searchParams.get(\"focuspoint\");if(n){let[r,i]=n.split(\",\").map(parseFloat);if(!isNaN(r)&&!isNaN(i))return{x:Math.round(r*100),y:Math.round(i*100)}}}catch(t){console.warn(\"Failed to extract focus point from URL:\",t)}}function ri(e){if(!e)return\"center\";let t=e?.trim()?.toLowerCase();return t===\"center\"||t===\"center center\"?\"center\":t.includes(\"left\")||t.includes(\"right\")||t.includes(\"top\")||t.includes(\"bottom\")?t:\"center\"}function de(e){if(!e)return null;try{let n=JSON.parse(e)?.image?.[0],r=n?.selected,i=Qe(r,n?.isPublic,n?.previewUrls),o=\"image\";r?.type===\"VIDEO\"?o=\"video\":r?.type===\"IMAGE\"&&i?.toLowerCase().endsWith(\".gif\")&&(o=\"gif\");let a=r?.imageType===\"customTransformation\"||r?.imageType===\"defaultPreset\",s=ni(i),l=ri(r?.position),d=r?.bgColor||void 0,c={url:i,type:o,alt:r?.altText??\"\",imageFit:r?.fit??\"cover\",focusPoint:s,objectPosition:l,bgColor:d};return a&&o===\"image\"?(c.isResponsive=!0,c.desktopUrl=Vt(i,\"16x9\"),c.mobileUrl=Vt(i,\"3x4\"),c.url=c.desktopUrl):o===\"image\"&&(c.url=ti(i)),c}catch(t){return console.warn(\"Failed to parse bynder_media JSON:\",t),null}}var ce=$(require(\"@emotion/styled\")),ke=ce.default.div`\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: block;\n background-color: ${({bgColor:e})=>e||\"transparent\"};\n`,qe=ce.default.img`\n width: 100%;\n height: 100%;\n object-fit: ${({objectFit:e})=>e||\"cover\"};\n object-position: ${({focusPoint:e,objectPosition:t})=>e?`${e.x}% ${e.y}%`:t||\"center\"};\n display: block;\n`,Xt=ce.default.video`\n width: 100%;\n height: 100%;\n object-fit: ${({objectFit:e})=>e||\"cover\"};\n object-position: ${({focusPoint:e,objectPosition:t})=>e?`${e.x}% ${e.y}%`:t||\"center\"};\n display: block;\n`,jt=ce.default.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,Je=ce.default.source`\n display: block;\n`;var G=require(\"react/jsx-runtime\");function q({bynder_media:e,$:t}){let[n,r]=et.default.useState(!1),i=et.default.useMemo(()=>de(e),[e]),o=()=>{r(!0)};if(!i||n)return null;let a=i.type,s=i.alt,l=i.isResponsive??!1,d=i.desktopUrl,c=i.mobileUrl,u=i.url,p=i.imageFit??\"cover\",T=i.focusPoint,x=i.objectPosition,g=i.bgColor;return a===\"video\"?(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsx)(Xt,{src:u,onError:o,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,objectFit:p,focusPoint:T,objectPosition:x,...t??{}})}):l&&c&&d?(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsxs)(jt,{children:[(0,G.jsx)(Je,{media:\"(max-width: 768px)\",srcSet:c}),(0,G.jsx)(Je,{media:\"(min-width: 769px)\",srcSet:d}),(0,G.jsx)(qe,{src:d,alt:s,onError:o,loading:\"lazy\",objectFit:p,focusPoint:T,objectPosition:x,...t??{}})]})}):(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsx)(qe,{src:u,alt:s,onError:o,loading:\"lazy\",objectFit:p,focusPoint:T,objectPosition:x,...t??{}})})}var _=require(\"react\");var $e=require(\"react\");function tt(){let[e,t]=(0,$e.useState)(!1);return(0,$e.useEffect)(()=>{if(typeof window>\"u\"||!window.matchMedia)return;let n=window.matchMedia(\"(prefers-reduced-motion: reduce)\");t(n.matches);let r=i=>{t(i.matches)};return n.addEventListener(\"change\",r),()=>n.removeEventListener(\"change\",r)},[]),e}function nt(e){let{totalSlides:t,autoRotate:n=!1,rotationInterval:r=5e3,pauseOnHover:i=!0,initialIndex:o=0}=e,a=t>0?Math.min(o,t-1):0,[s,l]=(0,_.useState)(a),[d,c]=(0,_.useState)(!1),u=tt(),p=(0,_.useCallback)(()=>{t!==0&&l(f=>(f+1)%t)},[t]),T=(0,_.useCallback)(()=>{t!==0&&l(f=>(f-1+t)%t)},[t]),x=(0,_.useCallback)(f=>{f>=0&&f<t&&l(f)},[t]),g=(0,_.useCallback)(()=>{c(!0)},[]),m=(0,_.useCallback)(()=>{c(!1)},[]),y=(0,_.useCallback)(f=>{switch(f.key){case\"ArrowLeft\":f.preventDefault(),T();break;case\"ArrowRight\":f.preventDefault(),p();break;case\"Home\":f.preventDefault(),x(0);break;case\"End\":f.preventDefault(),x(t-1);break}},[p,T,x,t]);return(0,_.useEffect)(()=>{s>=t&&t>0&&l(t-1)},[t,s]),(0,_.useEffect)(()=>{if(!n||d||u||t===0)return;let f=setInterval(p,r);return()=>clearInterval(f)},[n,d,u,r,p,t]),{currentIndex:s,isPaused:d,totalSlides:t,goToNext:p,goToPrevious:T,goToSlide:x,pause:g,resume:m,handleKeyDown:y}}function Kt(e){return!!e?.cta_button?.buttons?.length}function Yt(e){return Array.isArray(e?.banners)&&e?.banners?.length>1}function Zt(e){return!!e?.bynder_media}var _e=require(\"@nuskin/foundation-ui-components\");var hn=require(\"@nuskin/foundation-ui-components\"),me=require(\"@nuskin/foundation-theme\");var Qt=\"25px\";var qt=\"noopener noreferrer\";var oi=\"disabled\",rt=\"primary\",Jt=\"small\",en=\"left\",tn=\"left\",nn=\"square\",ot=\"Enter Title\",rn=\"No\",ge=\"rounded\",on=\"square\",an=\"transparent\";function ii(){return typeof window<\"u\"?window.location.href:\"\"}function sn(e){return e?.startsWith(\"/\")?ii()+e:e}function ln(e){return e===\"Yes\"?\"_blank\":\"_self\"}function dn(e){return e==null?!1:typeof e==\"string\"?e===oi:e}var ai={arrow:\"arrowRight\"};function cn(e){if(e)return ai[e]??e}var it={primary:{bg:\"#1f1f1f\",hover:\"#3a3530\",pressed:\"#000000\",text:\"#ffffff\",disabledBg:\"#e6e6e6\",disabledText:\"#9e9e9e\",focusRing:\"#4f84b4\"},secondary:{bg:\"#ffffff\",hover:\"#f2f2f2\",pressed:\"#e6e6e6\",text:\"#000000\",border:\"#626262\",disabledBg:\"#f2f2f2\",disabledText:\"#b0b0b0\",focusRing:\"#4f84b4\"},link:{bg:\"transparent\",hover:\"transparent\",pressed:\"transparent\",text:\"#000000\",border:\"transparent\",disabledBg:\"transparent\",disabledText:\"#9e9e9e\",focusRing:\"#000000\",hoverText:\"#626262\",underlineColor:\"#000000\"}},si={large:\"400px\",medium:\"250px\",small:\"130px\"},li=\"130px\";function at(e){return si[e]??li}var di={small:\"small\",medium:\"medium\",large:\"medium\"},ci=\"medium\";function pn(e){return di[e]??ci}var un=\"2px\",st=\"70px\",ui=\"769px\",gi=\"768px\",mi=\"425px\",fi=500,gn=400,hi=\"2px\",xi=\"Lora, sans-serif\",bi=\"transparent\",yi=\"center\",Ti=\"flex-end\",Ci=\"flex-start\",mn=e=>e===\"center\"?yi:e===\"right\"||e===\"bottom\"?Ti:Ci,xn=(0,me.styled)(\"div\")`\n display: flex;\n justify-content: ${e=>mn(e.alignment)};\n align-items: ${e=>mn(e.verticalAlignment)};\n width: 100%;\n height: 100%;\n`,bn=(0,me.styled)(hn.NsButton)`\n --btn-bg: ${e=>e.$bg};\n --btn-hover: ${e=>e.$hover};\n --btn-pressed: ${e=>e.$pressed};\n --btn-color: ${e=>e.$text};\n --btn-border: ${e=>e.$border};\n --btn-disabled-bg: ${e=>e.$disabledBg};\n --btn-disabled-color: ${e=>e.$disabledText};\n --btn-focus: ${e=>e.$focusRing};\n --btn-hover-text: ${e=>e.$hoverText??e.$text};\n --btn-underline: ${e=>e.$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: ${un};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${xi};\n font-size: 14px;\n padding: 8px 10px;\n min-width: ${e=>e.$buttonWidth||st};\n width: auto;\n max-width: ${e=>e.$maxButtonWidth||e.$buttonWidth||st};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n ${e=>e.$buttonType===ge&&`border-radius: ${Qt};`}\n }\n\n @media (min-width: ${ui}) {\n && {\n font-weight: ${fi};\n }\n }\n \n @media (max-width: ${gi}) {\n && {\n font-weight: ${gn};\n }\n }\n\n @media (max-width: ${mi}) {\n && {\n font-weight: ${gn};\n width: ${e=>e.$buttonWidth===\"400px\"?\"100%\":\"auto\"};\n max-width: ${e=>e.$buttonWidth===\"400px\"?\"100%\":e.$maxButtonWidth};\n min-width: ${e=>e.$buttonWidth===\"400px\"?\"0\":e.$buttonWidth||st};\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: ${hi} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${bi};\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: ${un};\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`,lt=me.styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`,fn=`${2}px`,yn=me.styled.span`\n flex-shrink: 0;\n ${e=>e.position===\"left\"&&`margin-right: ${fn};`}\n ${e=>e.position===\"right\"&&`margin-left: ${fn};`}\n`;var A=require(\"react/jsx-runtime\"),Si=({title:e,url:t,open_in_new_tab:n=rn,variant:r,button_size:i,alignment:o,vertical_alignment:a,buttontype:s=nn,icon:l,iconposition:d,button_state:c,isEditing:u,$:p,parent$:T})=>{let x=r??rt,g=i??Jt,m=o??en,y=a??\"top\",f=d??tn,w=s===ge?ge:on,D=sn(t),h=it[x]??it[rt],k=at(g),I=at(\"large\"),U=ln(n),M=dn(c),P=(\"border\"in h?h.border:void 0)??an,C=x===\"link\",S=cn(l),z=typeof S==\"string\"&&S in _e.NsIconVariants,pe=pn(g),Q=X=>{if(!S||!z||f!==X)return null;let De=M?h.disabledText:h.text;return(0,A.jsx)(yn,{position:X,\"data-button-icon\":!0,children:(0,A.jsx)(_e.NsIcon,{name:S,size:pe,colorOverride:De,...p?.icon??{}})})},be=()=>{let X=e;return X===\"\"?ot:X};return(0,A.jsx)(xn,{alignment:m,verticalAlignment:y,children:(0,A.jsx)(bn,{$variant:x,$buttonWidth:k,$buttonType:w,$bg:h.bg,$hover:h.hover,$pressed:h.pressed,$text:h.text,$border:P,$disabledBg:h.disabledBg,$disabledText:h.disabledText,$focusRing:h.focusRing,$maxButtonWidth:I,$hoverText:\"hoverText\"in h?h.hoverText:void 0,$underlineColor:\"underlineColor\"in h?h.underlineColor:void 0,href:D,\"data-variant\":x,...U===\"_blank\"?{target:\"_blank\",rel:qt}:{},\"aria-disabled\":M,disabled:M,...T??{},children:C?(0,A.jsxs)(\"span\",{\"data-link-content\":!0,children:[Q(\"left\"),(0,A.jsx)(lt,{\"data-button-label\":!0,...p?.title??{},children:be()}),Q(\"right\")]}):(0,A.jsxs)(A.Fragment,{children:[Q(\"left\"),(0,A.jsx)(lt,{...p?.title??{},children:be()}),Q(\"right\")]})})})},Re=Si;var Tn=require(\"react/jsx-runtime\");function vi(e){return e?\"buttons\"in e&&Array.isArray(e.buttons)?{buttonProps:e.buttons?.[0]??null}:{buttonProps:e}:{buttonProps:null}}var Ei=e=>{let{parent$:t={},alignment:n,isEditing:r=!1,...i}=e,{buttonProps:o}=vi(Object.keys(i).length>0?i:null);return!o||!o.title&&!r?null:(0,Tn.jsx)(Re,{...o,alignment:n??o.alignment,parent$:t,isEditing:r})},J=Ei;var L=$(require(\"@emotion/styled\"));var Cn=L.default.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`,Sn=L.default.div`\n position: relative;\n width: 100%;\n`,vn=L.default.div`\n display: flex;\n transition: transform ${ve.slow};\n transform: translateX(-${({currentIndex:e})=>e*100}%);\n`,En=L.default.div`\n min-width: 100%;\n position: relative;\n`,wn=L.default.div`\n position: relative;\n min-height: ${({hasMedia:e})=>e?oe.bannerHeightDesktop:\"auto\"};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${j.mobileAndBelow} {\n min-height: ${({hasMedia:e})=>e?oe.bannerHeightMobile:\"auto\"};\n }\n`,kn=L.default.div`\n ${Ee}\n z-index: ${ue.media};\n`,$n=L.default.div`\n position: relative;\n z-index: ${ue.content};\n display: flex;\n flex-direction: column;\n gap: ${W.textGap};\n justify-content: center;\n padding: ${W.desktopPadding};\n max-width: ${oe.textMaxWidth};\n width: auto;\n\n /* Base positioning from props (applies to desktop/tablet) */\n ${({position:e=\"left\"})=>e===\"center\"?`\n margin: 0 auto;\n align-items: center;\n text-align: center;\n `:e===\"right\"?`\n margin-left: auto;\n margin-right: 0;\n align-items: flex-end;\n text-align: right;\n `:`\n margin-right: auto;\n align-items: flex-start;\n text-align: left;\n `}\n\n /* Mobile: Override to always center content */\n ${j.mobileAndBelow} {\n padding: ${W.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n overflow: hidden;\n }\n`,_n=L.default.div`\n ${Ee}\n z-index: ${ue.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({direction:e,depth:t,color:n})=>{let r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:i,end:o}=r[t],a=n===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?Ke(\"to right\",i,o,a):e===\"rightToLeft\"?Ke(\"to left\",i,o,a):e===\"radial\"?Ye(i,o,a):\"\"}}\n\n /* Mobile: Override to always use radial gradient */\n ${j.mobileAndBelow} {\n ${({depth:e,color:t})=>{let n={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:r,end:i}=n[e];return Ye(r,i,t===\"black\"?\"0, 0, 0\":\"255, 255, 255\")}}\n }\n`,Rn=L.default.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 ${j.tablet} {\n justify-content: inherit;\n }\n\n ${j.desktop} {\n justify-content: inherit;\n }\n`,In=L.default.div`\n position: absolute;\n bottom: ${W.carouselGap};\n ${Wt}\n z-index: ${ue.controls};\n display: flex;\n gap: ${W.carouselGap};\n align-items: center;\n\n ${j.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`,Pn=L.default.button`\n width: ${oe.indicatorSize};\n height: ${oe.indicatorSize};\n border-radius: 50%;\n border: ${oe.indicatorBorder} solid ${re.indicatorBorder};\n background-color: ${({active:e})=>e?re.indicatorActive:re.indicatorInactive};\n cursor: pointer;\n padding: 0;\n ${Ot([\"all\"])}\n\n &:hover {\n background-color: ${re.indicatorActive};\n transform: scale(1.15);\n }\n`;var v=require(\"react/jsx-runtime\"),wi=(e,t,n)=>{let r=Zt(e),i=Kt(e),o=\"marketing-banner\",a=Mt[e.text_color??\"white\"],s=e.gradient?.show_gradient===!0,l=e.content_position??e.position??\"left\",d=e.text_color===\"dark\"?\"white\":\"black\",c;l===\"left\"?c=\"leftToRight\":l===\"right\"?c=\"rightToLeft\":c=\"radial\";let u;l===\"center\"?u=\"center\":l===\"right\"?u=\"right\":u=\"left\";let p=e.gradient?.gradient_depth??\"md\";return(0,v.jsx)(En,{children:(0,v.jsxs)(wn,{hasMedia:r,children:[r&&(0,v.jsx)(kn,{children:(0,v.jsx)(q,{bynder_media:e?.bynder_media,$:e?.$?.bynder_media})}),s&&(0,v.jsx)(_n,{direction:c,depth:p,color:d}),(0,v.jsxs)($n,{position:l,children:[(0,v.jsx)(Ze,{headerText:e.header_text,title:e.title,subtitle:e.subtitle,bodyText:e.body_text,textColor:a,textAlignment:u,testId:`${o}-${n}-text`,$:e.$,isEditing:t}),i&&(0,v.jsx)(Rn,{children:(0,v.jsx)(J,{...e?.cta_button,alignment:u,parent$:(e?.cta_button).$?.buttons__0??e?.$?.cta_button??{},isEditing:t})})]})]})},`${o}-${n}`)};function dt(e){let{banners:t,rotation_interval:n,isEditing:r=!1}=e,i=Yt(e),o=nt({totalSlides:t.length,autoRotate:i,rotationInterval:n??5e3,pauseOnHover:!0,initialIndex:0});return(0,v.jsxs)(Cn,{\"data-testid\":\"marketing-banner\",onKeyDown:i?o.handleKeyDown:void 0,onMouseEnter:i?o.pause:void 0,onMouseLeave:i?o.resume:void 0,children:[(0,v.jsx)(Sn,{children:(0,v.jsx)(vn,{currentIndex:o.currentIndex,totalSlides:t.length,children:t.map((a,s)=>wi(a,r,s))})}),i&&(0,v.jsx)(In,{children:t.map((a,s)=>(0,v.jsx)(Pn,{active:s===o.currentIndex,onClick:()=>o.goToSlide(s),\"aria-label\":`Go to slide ${s+1}`},`banner-indicator-${s}-${a.title??\"\"}`))})]})}var ct=require(\"@nuskin/foundation-theme\");var An={thin:1,medium:2,thick:4},Ie={mobile:\"(max-width: 768px)\",tablet:\"(min-width: 769px) and (max-width: 1024px)\",desktop:\"(min-width: 1025px) and (max-width: 1439px)\",ultra:\"(min-width: 1440px)\"};var Ln=(0,ct.styled)(\"div\")(({vertical_padding:e,divider_alignment:t})=>{let r={none:{mobile:0,tablet:0,desktop:0,ultra:0},small:{mobile:8,tablet:8,desktop:8,ultra:12},medium:{mobile:12,tablet:12,desktop:16,ultra:20},large:{mobile:16,tablet:16,desktop:24,ultra:32}}[e];return{display:\"flex\",flexDirection:\"column\",alignItems:t===\"center\"?\"center\":t===\"right\"?\"flex-end\":\"flex-start\",paddingTop:`${r.mobile}px`,paddingBottom:`${r.mobile}px`,[`@media ${Ie.tablet}`]:{paddingTop:`${r.tablet}px`,paddingBottom:`${r.tablet}px`},[`@media ${Ie.desktop}`]:{paddingTop:`${r.desktop}px`,paddingBottom:`${r.desktop}px`},[`@media ${Ie.ultra}`]:{paddingTop:`${r.ultra}px`,paddingBottom:`${r.ultra}px`}}}),Bn=(0,ct.styled)(\"div\")(({divider_style:e,divider_thickness_px:t,divider_color:n,divider_gradient:r,divider_width_percent:i})=>{let o={width:`${Math.max(0,Math.min(100,i))}%`};if(r&&e!==\"none\"){if(o.height=`${t}px`,o.backgroundImage=r,o.backgroundSize=\"100% 100%\",e===\"dashed\"){let a=Math.max(12,t*4),s=Math.max(6,t*2);o.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+s}px)`,o.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+s}px)`}else if(e===\"dotted\"){let a=Math.max(2,t),s=Math.max(8,a*3),l=a/2;o.maskImage=`radial-gradient(circle ${l}px at 50% 50%, black 99%, transparent 100%)`,o.WebkitMaskImage=`radial-gradient(circle ${l}px at 50% 50%, black 99%, transparent 100%)`,o.maskSize=`${s}px ${t}px`,o.WebkitMaskSize=`${s}px ${t}px`,o.maskRepeat=\"repeat-x\",o.WebkitMaskRepeat=\"repeat-x\",o.maskPosition=\"0 center\",o.WebkitMaskPosition=\"0 center\"}}else e===\"none\"?(o.height=`${t}px`,o.backgroundImage=r):(o.borderBottomStyle=e,o.borderBottomWidth=`${t}px`,o.borderBottomColor=n,o.height=0);return o});var Dn=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,ki=e=>{if(!e||!/^#([A-Fa-f0-9]{6})$/.test(e))return;let t=parseInt(e.slice(1,3),16),n=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return{r:t,g:n,b:r}},Mn=(e,t)=>{if(!e||e===\"none\")return;let n=ki(t)??{r:0,g:0,b:0};switch(e){case\"soft\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.3), rgba(${n.r},${n.g},${n.b},0.8))`;case\"bold\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.6), rgba(${n.r},${n.g},${n.b},1.0))`;case\"faint\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.4), rgba(${n.r},${n.g},${n.b},0.4))`;default:return}};var pt=require(\"react/jsx-runtime\"),$i=\"#000000\",_i=e=>{let{vertical_padding:t=\"small\",divider_style:n=\"solid\",divider_thickness:r=\"thin\",divider_color:i,divider_gradient_preset:o=\"none\",divider_width_percent:a=100,divider_alignment:s=\"left\"}=e,l=An[r],d=Dn(i)?i:$i,c=Mn(o,d);return(0,pt.jsx)(Ln,{vertical_padding:t,divider_alignment:s,children:n!==\"none\"&&(0,pt.jsx)(Bn,{divider_style:n,divider_thickness_px:l,divider_color:d,divider_gradient:c,divider_width_percent:a??100,\"aria-hidden\":\"true\"})})},Nn=_i;var lr=require(\"react\");var er=$(require(\"react-slick\"));var ee=require(\"@nuskin/foundation-theme\");var b={ULTRA_SMALL:320,EXTRA_SMALL:480,SMALL:600,MEDIUM:768,LARGE:992,EXTRA_LARGE:1200,ULTRA_LARGE:1440,SUPER_LARGE:1920},K=750;var On={none:0,small:8,medium:12,large:16};function Wn(e){return e===void 0?On.large:typeof e==\"number\"?e:On[e]}var Hn=280;var Gn=220;var Yn=require(\"react/jsx-runtime\");function ut(e,t,n,r){return e?t===\"prev\"?{left:16}:{right:16}:t===\"prev\"?{left:r}:{right:r}}var Fn=(0,ee.styled)(\"section\")(({gap:e,height:t,columnHeight:n,maxColumnHeight:r,fullWidth:i,dotsInside:o=!0})=>({position:\"relative\",width:\"100%\",textAlign:\"left\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${b.MEDIUM}px)`]:{padding:\"0 40px 50px\",...i&&{padding:\"0\"}},[`@media (max-width: ${b.SMALL}px)`]:{padding:\"0 20px 40px\",...i&&{padding:\"0\"}},\".slick-slider\":{position:\"relative\",display:\"block\",height:\"100%\"},\".slick-list\":{position:\"relative\",overflow:\"hidden\",height:\"100%\",boxSizing:\"border-box\",...n===\"auto\"&&{minHeight:280},margin:`0 -${e/2}px`,padding:\"1px 0\"},\".slick-track\":{display:\"flex\",height:\"100%\",justifyContent:\"flex-start\",boxSizing:\"border-box\",margin:0,marginLeft:0},\".slick-slide\":{flexShrink:0,padding:`0 ${e/2}px`,height:n===\"auto\"?\"auto\":n,minHeight:0,boxSizing:\"border-box\",...r!=null&&{maxHeight:`${r}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:o?\"absolute\":\"static\",bottom:o?0:\"auto\",display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin:o?0:\"16px 0 0\",width:\"100%\",left:0,li:{margin:0,width:12,height:12,button:{width:12,height:12,padding:0,borderRadius:\"50%\",border:\"none\",background:\"#ccc\",textIndent:-9999,cursor:\"pointer\",transition:\"background 0.2s ease, transform 0.2s ease\",\"&:before\":{display:\"none\"}},\"&.slick-active button\":{background:\"#4A90E2\"}}},[`@media (max-width: ${b.SMALL}px)`]:{\".slick-dots\":{bottom:o?8:\"auto\",gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),Un=(0,ee.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:n,stackedItemMaxHeight:r,slideWidth:i,flexBasis:o,isVariableWidth:a})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:n===\"auto\"?\"100%\":n,minHeight:0,...r!=null&&{maxHeight:r},width:i,flex:e&&o?`0 0 ${o}`:void 0,flexShrink:0,boxSizing:e?\"border-box\":void 0,minWidth:a?0:Hn,position:\"relative\"})),zn=(0,ee.styled)(\"div\")(({stackedItemHeight:e})=>({width:\"100%\",height:e===\"auto\"?\"100%\":e,minHeight:0,boxSizing:\"border-box\",display:\"flex\",flexDirection:\"column\",alignItems:\"stretch\",textAlign:\"left\",overflow:\"hidden\",minWidth:0,position:\"relative\"})),Vn=(0,ee.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),Xn=(0,ee.styled)(\"button\")(({direction:e,fullWidth:t})=>({position:\"absolute\",top:\"50%\",transform:\"translateY(-50%)\",background:\"rgba(0, 0, 0, 0.5)\",color:\"#fff\",border:\"none\",borderRadius:\"50%\",width:48,height:48,padding:0,margin:0,cursor:\"pointer\",zIndex:10,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",transition:\"background 0.2s ease\",fontSize:24,lineHeight:1,verticalAlign:\"middle\",...ut(t,e,8,-60),\"&:hover\":{background:\"rgba(0, 0, 0, 0.7)\"},\"&:focus\":{outline:\"2px solid #4A90E2\",outlineOffset:2},\"&:disabled\":{opacity:.3,cursor:\"not-allowed\"},[`@media (max-width: ${b.MEDIUM}px)`]:{width:40,height:40,...ut(t,e,4,-45)},[`@media (max-width: ${b.SMALL}px)`]:{width:32,height:32,fontSize:20,...ut(t,e,2,-35)}})),jn=(0,ee.styled)(\"div\")({position:\"relative\",height:\"100%\",containerType:\"inline-size\"}),Ri=(0,ee.styled)(\"div\")({padding:\"10px\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",alignItems:\"center\",minHeight:`${Gn}px`,border:\"1px dashed #ccc\",boxSizing:\"border-box\"}),Kn=({emptyBlockParentClass:e,text:t=\"Add items\",totalSlides:n=0,$:r={}})=>(0,Yn.jsx)(Ri,{className:n===0?e:void 0,...n===0?r?.slides??{}:{},...n===0?r?.slides__parent??{}:{},...r?.[`slides__${n-1}`]??{},\"data-add-direction\":\"horizontal\",children:t});function Pe(e){switch(e){case\"single-full\":return 1;case\"two-equal\":case\"two-small-large\":return 2;case\"three-equal\":case\"three-small-medium-large\":return 3;case\"four-equal\":return 4;default:return 1}}function Y(e){return!e||typeof e==\"function\"?e:typeof e==\"object\"&&e.default?e.default:e}function Zn(e,t){return t<b.LARGE?!1:e===\"two-small-large\"||e===\"three-small-medium-large\"}function Qn(e,t,n,r,i){if(n<b.LARGE)return\"auto\";let a=(i>0?i:n)+r;if(e===\"two-small-large\"){let s=(t%2+2)%2,l=Math.round(a/3),d=a-l;return s===0?`${l}px`:`${d}px`}if(e===\"three-small-medium-large\"){let s=(t%3+3)%3,l=Math.round(a*.25),d=a-l*2;return s===1?`${d}px`:`${l}px`}return\"auto\"}function qn(e,t){return e>=b.EXTRA_LARGE?Math.min(t,4):e>=b.LARGE?Math.min(t,3):e>=b.SMALL?Math.min(t,2):1}function Jn(e){let{presetColumns:t,shouldShowDots:n,isVariableWidth:r}=e,i=1,o=Math.min(t,2),a=Math.min(t,3);return[{breakpoint:b.SMALL,settings:{slidesToShow:i,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:!1}},{breakpoint:b.MEDIUM,settings:{slidesToShow:o,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:!1}},{breakpoint:b.LARGE,settings:{slidesToShow:a,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:r}}]}var Ae=require(\"react/jsx-runtime\"),tr=Y(er.default),nr=Y(Fn),gt=Y(Xn),rr=Y(jn),Pi=Y(Un),Ai=Y(zn),Li=Y(Vn),or=Y(Kn);function Bi(e){return`slide-${e}`}function ir(e){let{slidesForRender:t,renderSlide:n,presetColumns:r,gap:i,isVariableWidth:o,getSlideWidth:a,stackedVerticalGap:s,stackedItemHeight:l,stackedItemMaxHeight:d,useFlexLayout:c=!1,$:u={}}=e,p={...u?.slides??void 0,...u?.slides__parent??void 0,\"data-add-direction\":\"horizontal\"},T=r===1?\"100%\":`calc((100% - ${(r-1)*i}px) / ${r})`;return t.map((x,g)=>{let m=!c&&o?a(g):void 0,y=c&&o?a(g):T;return(0,Ae.jsx)(Pi,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${g+1} of ${t.length}`,useFlexLayout:c,stackedVerticalGap:s,stackedItemHeight:l,stackedItemMaxHeight:d,slideWidth:m,flexBasis:y,isVariableWidth:o,style:m?{width:m}:void 0,...p,...u?.[`slides__${g}`]??{},children:(0,Ae.jsx)(Ai,{stackedItemHeight:l,stackedItemMaxHeight:d,children:(0,Ae.jsx)(Li,{children:n(x,g)})})},Bi(g))})}var R=require(\"react\");var fe=require(\"react\");function ar(e,t){let[n,r]=(0,fe.useState)(typeof window<\"u\"?window.innerWidth:0),[i,o]=(0,fe.useState)(`carousel-${e}-${t}-${Date.now()}`);return(0,fe.useEffect)(()=>{if(typeof window>\"u\")return;let a,s=()=>{clearTimeout(a),a=setTimeout(()=>{r(window.innerWidth),o(`carousel-${e}-${t}-${Date.now()}`)},150)};return window.addEventListener(\"resize\",s),()=>{clearTimeout(a),window.removeEventListener(\"resize\",s)}},[e,t]),{windowWidth:n,carouselKey:i}}function sr(e){let{slides:t,renderSlide:n,preset:r=\"single-full\",autoplayEnabled:i=!1,autoplayDuration:o=3,showPagination:a=!0,onSlideChange:s,className:l,slickSettings:d,gap:c=\"medium\",height:u,fullWidth:p,isEditing:T=!1,emptyBlockParentClass:x,emptyPlaceholderText:g,parent$:m,$:y}=e,f=Wn(c),w=g??\"Add items to the carousel\",D=p??!1,{windowWidth:h,carouselKey:k}=ar(r,t.length),I=(0,R.useRef)(null),[U,M]=(0,R.useState)(0),P=(0,R.useCallback)(()=>{let N=I.current;if(!N)return;let ye=window.getComputedStyle(N),Co=parseFloat(ye.paddingLeft)||0,So=parseFloat(ye.paddingRight)||0;M(N.offsetWidth-Co-So)},[]);(0,R.useEffect)(()=>{if(P(),typeof ResizeObserver>\"u\"||!I.current)return;let N=new ResizeObserver(P);return N.observe(I.current),()=>N.disconnect()},[P]);let C=(0,R.useMemo)(()=>Pe(r),[r]),S=qn(h,C),z=Zn(r,h),pe=(0,R.useMemo)(()=>N=>Qn(r,N,h,f,U),[r,h,f,U]),Q=i,be=a,X=h>b.LARGE,De=h<=b.SMALL,go=!1,bt=\"auto\",yt=K,mo=0,fo=u??\"auto\",Me=be&&t.length>1&&h<=b.LARGE,Ne=(0,R.useRef)(null),ho=()=>Ne.current?.slickPrev(),xo=()=>Ne.current?.slickNext(),bo=[l].filter(Boolean).join(\" \"),Oe=z&&h>b.MEDIUM,We=Oe?1:S,yo=(0,R.useMemo)(()=>Jn({presetColumns:C,slidesLength:t.length,isEditing:T,shouldShowDots:Me,isVariableWidth:z}),[C,t.length,T,Me,z]),To={dots:Me,infinite:t.length>We,speed:500,slidesToShow:We,slidesToScroll:1,autoplay:Q,autoplaySpeed:o*1e3,pauseOnHover:!0,arrows:!1,variableWidth:Oe,swipe:!0,draggable:!0,beforeChange:(N,ye)=>s?.(ye),responsive:yo,...d};return{gapPx:f,containerHeight:fo,stackedItemHeight:bt,stackedItemMaxHeight:yt,isVariableWidth:z,containerClassName:bo,effectiveFullWidth:D,parent$:m,$:y,emptyBlockParentClass:x,emptyPlaceholderText:w,sliderRef:Ne,sliderSettings:To,carouselKey:k,renderSlides:(N=!1)=>ir({slidesForRender:t,renderSlide:n,presetColumns:C,gap:f,isVariableWidth:Oe,getSlideWidth:pe,stackedVerticalGap:mo,stackedItemHeight:bt,stackedItemMaxHeight:yt,useFlexLayout:N,$:y}),slidesForRender:t,hasSlides:t.length>0,isStackedViewport:De,isTabletGridViewport:go,preset:r,showArrowsOnDesktop:X,slidesToShow:We,slidesLength:t.length,goToPrevious:ho,goToNext:xo,containerRef:I}}var B=require(\"react/jsx-runtime\"),cr=require(\"react\");function dr(e){let{dotsPosition:t,isEditing:n}=e,r={...e};(0,lr.useEffect)(()=>{import(\"slick-carousel/slick/slick.css\"),import(\"slick-carousel/slick/slick-theme.css\")},[]);let{gapPx:i,containerHeight:o,stackedItemHeight:a,stackedItemMaxHeight:s,isVariableWidth:l,containerClassName:d,effectiveFullWidth:c,parent$:u,$:p,emptyBlockParentClass:T,emptyPlaceholderText:x,sliderRef:g,sliderSettings:m,carouselKey:y,renderSlides:f,hasSlides:w,showArrowsOnDesktop:D,slidesToShow:h,slidesLength:k,goToPrevious:I,goToNext:U,containerRef:M}=sr(r),P=C=>(0,B.jsx)(\"section\",{\"aria-roledescription\":\"slide\",\"aria-label\":`Empty slide ${C+1} of ${h}`,children:(0,B.jsx)(or,{emptyBlockParentClass:T,text:x,totalSlides:k,$:p})},`empty-slide-${C}`);return(0,B.jsx)(nr,{ref:M,gap:i,height:o,columnHeight:a,maxColumnHeight:s,isVariableWidth:l,className:d,\"aria-label\":\"Carousel Control\",fullWidth:c,dotsInside:t!==\"outside\",...u??{},children:(0,B.jsxs)(rr,{children:[(0,B.jsx)(\"div\",{...p?.slides??{},...p?.slides__parent??{},\"data-add-direction\":\"horizontal\",children:(0,cr.createElement)(tr,{ref:g,...m,key:y},w&&f(),n&&(w?k<h&&Array.from({length:h-k}).map((C,S)=>P(k+S)):Array.from({length:h}).map((C,S)=>P(S))))}),D&&k>h&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(gt,{direction:\"prev\",onClick:I,\"aria-label\":\"Previous slide\",fullWidth:c,children:\"\\u2039\"}),(0,B.jsx)(gt,{direction:\"next\",onClick:U,\"aria-label\":\"Next slide\",fullWidth:c,children:\"\\u203A\"})]})]})})}var $r=require(\"react\");var te=require(\"@nuskin/foundation-theme\");var pr={none:0,small:8,medium:12,large:16};function ur(e){return e===void 0?pr.large:typeof e==\"number\"?e:pr[e]}var gr=280;var mr=220,fr=8;var hr=(0,te.styled)(\"section\")(({gap:e,height:t,columnHeight:n,maxColumnHeight:r,fullWidth:i,dotsInside:o=!0})=>({position:\"relative\",width:\"100%\",textAlign:\"center\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${b.MEDIUM}px)`]:{padding:i?\"0\":\"0 40px 50px\"},[`@media (max-width: ${b.SMALL}px)`]:{padding:\"0 0 40px\"},\".slick-slider\":{position:\"relative\",display:\"block\",height:\"100%\"},\".slick-list\":{position:\"relative\",overflow:\"hidden\",height:\"100%\",...n===\"auto\"&&{minHeight:280},margin:`0 -${e/2}px`,padding:\"1px 0\"},\".slick-track\":{display:\"flex\",height:\"100%\"},\".slick-slide\":{padding:`0 ${e/2}px`,height:n===\"auto\"?\"auto\":n,minHeight:0,...r!=null&&{maxHeight:`${r}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:o?\"absolute\":\"static\",bottom:o?12:\"auto\",display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin:o?0:\"16px 0 0\",width:\"100%\",left:0,li:{margin:0,width:12,height:12,button:{width:12,height:12,padding:0,borderRadius:\"50%\",border:\"none\",background:\"#ccc\",textIndent:-9999,cursor:\"pointer\",transition:\"background 0.2s ease, transform 0.2s ease\",\"&:before\":{display:\"none\"}},\"&.slick-active button\":{background:\"#4A90E2\"}}},[`@media (max-width: ${b.SMALL}px)`]:{\".slick-dots\":{bottom:o?8:\"auto\",gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),xr=(0,te.styled)(\"div\")(({gap:e})=>({display:\"flex\",flexWrap:\"wrap\",gap:`${e}px`,width:\"100%\"})),br=(0,te.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:n,stackedItemMaxHeight:r,slideWidth:i,flexBasis:o,gap:a,columns:s})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:n,minHeight:0,...r!=null&&{maxHeight:r},width:i,flex:e&&o?`0 0 ${o}`:void 0,boxSizing:e?\"border-box\":void 0,minWidth:gr,position:\"relative\",[`@media (max-width: ${b.EXTRA_LARGE}px)`]:{...e&&s===4&&{flex:`0 0 calc((100% - ${a*2}px) / 3)`,maxWidth:`calc((100% - ${a*2}px) / 3)`,minWidth:0}},[`@media (max-width: ${b.LARGE}px)`]:{...e&&{flex:`0 0 calc((100% - ${a}px) / 2)`,maxWidth:`calc((100% - ${a}px) / 2)`,minWidth:0}},[`@media (max-width: ${b.SMALL}px)`]:{...e&&{flex:\"0 0 100%\",maxWidth:\"100%\",minWidth:0}}})),yr=(0,te.styled)(\"div\")(({stackedItemHeight:e})=>({width:\"100%\",height:e===\"auto\"?\"100%\":e,minHeight:0,boxSizing:\"border-box\",display:\"flex\",flexDirection:\"column\",alignItems:\"stretch\",textAlign:\"left\",overflow:\"hidden\",minWidth:0,position:\"relative\"})),Tr=(0,te.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),Cr=(0,te.styled)(\"div\")({position:\"relative\",height:\"100%\"}),Sr=(0,te.styled)(\"div\")({padding:\"10px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",minHeight:`${mr}px`,border:\"1px dashed #ccc\",boxSizing:\"border-box\"});var vr=$(require(\"react\"));function mt(e){let t={columns:2,rows:1};if(!e)return t;let n=e.toLowerCase(),[r,i]=n.split(\"x\"),o=Number(r),a=Number(i),s=Number.isFinite(o)&&o>0?o:t.columns,l=Number.isFinite(a)&&a>0?a:t.rows;return s=Math.min(Math.max(s,2),4),l=Math.min(Math.max(l,1),2),{columns:s,rows:l}}function Er(e){let{columns:t,rows:n}=mt(e),r=t*n;return Math.min(r,fr)}function wr(e){switch(e){case\"four-equal\":return\"4x1\";case\"three-equal\":case\"three-small-medium-large\":return\"3x1\";case\"two-equal\":case\"two-small-large\":return\"2x1\";case\"single-full\":default:return\"2x1\"}}var kr=({emptyBlockParentClass:e,text:t=\"Add items\"})=>vr.default.createElement(Sr,{className:e},t);var Z=require(\"react/jsx-runtime\");function Mi(e){let{slides:t,renderSlide:n,layout:r,preset:i,gap:o=\"medium\",height:a,fullWidth:s,className:l,emptyBlockParentClass:d,emptyPlaceholderText:c,isEditing:u,parent$:p,$:T}=e,x=r??wr(i),g=ur(o),{columns:m}=mt(x),y=Er(x),f=t.slice(0,y),w=f.length,D=c??\"Add items to the column control\",h=s??!0,k=[\"column-control-container\",l].filter(Boolean).join(\" \"),I=a??\"auto\",U=(0,$r.useMemo)(()=>({...T?.slides??{},...T?.slides__parent??{},\"data-add-direction\":\"horizontal\"}),[T]),M=m===1?\"100%\":`calc((100% - ${(m-1)*g}px) / ${m})`,P=C=>{let S=C<w;if(!u&&!S)return null;let z=`slide-${C}`;return(0,Z.jsx)(br,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${C+1} of ${y}`,useFlexLayout:!0,stackedVerticalGap:0,stackedItemHeight:\"auto\",stackedItemMaxHeight:K,flexBasis:M,gap:g,columns:m,...T?.[`slides__${C}`]??{},children:(0,Z.jsx)(yr,{stackedItemHeight:\"auto\",stackedItemMaxHeight:K,children:(0,Z.jsx)(Tr,{children:S?n(f[C],C):(0,Z.jsx)(kr,{emptyBlockParentClass:d,text:D})})})},z)};return(0,Z.jsx)(hr,{gap:g,height:I,columnHeight:\"auto\",maxColumnHeight:K,className:k,\"aria-label\":\"Column Control\",fullWidth:h,...p??{},children:(0,Z.jsx)(Cr,{children:(0,Z.jsx)(\"div\",{children:(0,Z.jsx)(xr,{className:\"column-control-container\",gap:g,...U,children:Array.from({length:y}).map((C,S)=>P(S))})})})})}var _r=Mi;var ie=$(require(\"@emotion/styled\")),Ni=e=>!e.startsWith(\"$\"),Rr=ie.default.article`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n max-height: ${({$maxHeight:e})=>e?`${e}px`:\"none\"};\n flex: 1 1 0%;\n overflow: hidden;\n text-align: ${({align:e})=>e||\"left\"};\n border-radius: ${({borderRadius:e})=>e||\"12px\"};\n background-color: ${({backgroundColor:e})=>e||\"inherit\"};\n color: ${({textColor:e})=>e||\"inherit\"};\n text-decoration: none;\n\n &[data-cta-style='card'] {\n text-decoration: none;\n color: inherit;\n }\n`,Ir=(0,ie.default)(\"div\",{shouldForwardProp:Ni})`\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:e})=>e!=null&&e>0?`${e}px`:\"auto\"};\n max-height: ${({$mediaMaxHeight:e})=>e!=null&&e>0?`${e}px`:\"none\"};\n ${({$mediaHeight:e})=>e!=null&&e>0&&`\n & > * {\n height: 100%;\n min-height: 0;\n } \n `}\n\n ${({$inlineMedia:e})=>e&&`\n & img,\n & video {\n width: auto;\n height: 100% ;\n display: inline-block;\n max-width: 100%;\n }\n `}\n`,Pr=ie.default.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`,Ar=ie.default.div`\n padding: 0;\n width: 100%;\n & > div {\n padding: 0;\n width: 100%;\n }\n ul,\n ol {\n list-style-position: outside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 1.25em;\n }\n ol {\n list-style-type: decimal;\n }\n li {\n margin: 0.25em 0;\n }\n`,Lr=ie.default.div`\n margin-top: 16px;\n`,Br=ie.default.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n gap: 8px;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: none;\n`;function Oi(e){return e?\"buttons\"in e?e.buttons?.[0]?.button??null:e:null}var Mr=(e,t)=>e||(t?\"Enter Title\":\"\");function Nr(e){return e===\"centre\"||e===\"center\"?\"center\":e===\"right\"?\"right\":\"left\"}function ft(e){let t=typeof e==\"string\"?e.toLowerCase().trim():\"\";return t===\"card\"||t===\"button\"||t===\"none\"?t:t.includes(\"card\")?\"card\":t.includes(\"button\")?\"button\":(t.includes(\"none\")||t.includes(\"no cta\"),\"none\")}function Wi(e){return e===\"Yes\"?\"_blank\":\"_self\"}function Or(e,t){let n=ft(t),r=Oi(e),i=!!r?.url,o=!!r?.title,a=n===\"card\"&&i&&!o,s=n===\"button\"&&o||n===\"card\"&&i&&o,l=Wi(r?.open_in_new_tab);return{ctaStyleNormalized:n,effectiveCta:r,isCardLink:a,showButton:s,cardTarget:l}}function Wr(e){let t=e?de(e):null,n=t?.type===\"image\"&&(t?.imageFit??\"cover\")===\"none\",i=e&&!n&&(t?.type===\"image\"||t?.type===\"video\")?400:void 0;return{mediaInfo:t,isInlineMedia:n,mediaHeightValue:i,mediaMaxHeightValue:e&&!n&&!i?400:void 0}}var Ur=require(\"react\"),zr=$(require(\"dompurify\"));var ht=$(require(\"@emotion/styled\"));var Hr=ht.default.div`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({alignItems:e})=>e};\n`,Gr=ht.default.div`\n width: 100%;\n\n @media (min-width: ${b.MEDIUM}px) {\n width: ${({width:e})=>e}%;\n }\n`;var Le=require(\"react/jsx-runtime\"),Fr={ALLOWED_TAGS:[\"p\",\"div\",\"span\",\"a\",\"br\",\"strong\",\"b\",\"em\",\"i\",\"u\",\"h1\",\"h2\",\"h3\",\"ul\",\"ol\",\"li\",\"blockquote\"],ALLOWED_ATTR:[\"href\",\"target\",\"rel\",\"title\",\"class\",\"style\",\"data-testid\",\"data-cs-id\",\"data-cs-type\",\"data-cslp\"]},Hi=e=>!e||typeof e!=\"string\"?\"\":zr.default.sanitize(e,{ALLOWED_TAGS:Fr.ALLOWED_TAGS,ALLOWED_ATTR:Fr.ALLOWED_ATTR,KEEP_CONTENT:!0,RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,FORCE_BODY:!1,SANITIZE_DOM:!0,IN_PLACE:!1}),Gi=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\",Fi=e=>e===\"center\"?\"center\":e===\"bottom\"?\"flex-end\":\"flex-start\",Ui=({text_editor:e,font_color:t,container_alignment:n=\"left\",container_vertical_alignment:r=\"top\",container_width:i=100,container_background_color:o,...a})=>{let s=(0,Ur.useMemo)(()=>!e||typeof e!=\"string\"||!e.trim()?\"\":Hi(e),[e]),l=t===\"Light\";if(!s)return null;let d=Gi(n),c=Fi(r);return(0,Le.jsx)(Hr,{alignItems:c,style:{justifyContent:d,backgroundColor:Xe(o)},children:(0,Le.jsx)(Gr,{width:i,children:(0,Le.jsx)(Se,{...a,container_background_color:o,text_editor:s,font_color:l})})})},Be=Ui;var E=require(\"react/jsx-runtime\");function Vi({title:e,subtitle:t,body:n,contentTitle:r,editTags:i,alignment:o}){let a=typeof n==\"string\"?n:\"\";return(0,E.jsxs)(Br,{\"data-testid\":\"card-content-inner\",children:[e?(0,E.jsx)(O,{variant:\"h3\",inputText:r,color:\"inherit\",...i?.title??{}}):null,t?(0,E.jsx)(O,{variant:\"body\",inputText:t,color:\"inherit\",...i?.subtitle??{}}):null,a?(0,E.jsx)(Ar,{children:(0,E.jsx)(Be,{text_editor:a,alignment:o,full_width:!0,container_background_color:\"transparent\",$:{text_editor:i?.body??{}}})}):null]})}function Xi({show:e,cta:t,alignment:n,isEditing:r,editTags:i}){if(!e||!t)return null;let o={...t.buttons?.[0]?.$?.button??{},...i?.button??{}};return(0,E.jsx)(Lr,{\"data-testid\":\"card-cta-wrapper\",children:(0,E.jsx)(J,{...t,parent$:o,alignment:n,isEditing:r})})}var ji=e=>{let{title:t,subtitle:n=\"\",body:r=\"\",media:i,cta_style:o=\"none\",cta:a,card_cta_group:s,button_cta_group:l,content_alignment:d=\"left\",background_color:c=\"#ffffff\",text_color:u=\"#000000\",border_radius:p=\"0px\",max_height:T=750,parent$:x={},isEditing:g=!1,$:m={}}=e,y=ft(o),f;y===\"card\"?f=s??a:y===\"button\"&&(f=l??a);let w=Nr(d),{ctaStyleNormalized:D,effectiveCta:h,isCardLink:k,showButton:I,cardTarget:U}=Or(f,y),M=Mr(t??\"\",g),{mediaInfo:P,isInlineMedia:C,mediaHeightValue:S,mediaMaxHeightValue:z}=Wr(i),pe=k?\"a\":\"article\",Q=k?{href:h?.url??\"\",target:U}:{};return(0,E.jsxs)(Rr,{align:w,borderRadius:p,backgroundColor:c,textColor:u,$maxHeight:T,as:pe,...Q,\"data-cta-style\":D,...x,children:[(0,E.jsx)(Ir,{\"data-testid\":`card-media-${P?.type}`,$inlineMedia:C,$mediaHeight:S,$mediaMaxHeight:z,children:i?(0,E.jsx)(q,{bynder_media:i,$:m?.media}):null}),(0,E.jsxs)(Pr,{\"data-testid\":\"card-content\",children:[(0,E.jsx)(Vi,{title:t,subtitle:n,body:r,contentTitle:M,editTags:m,alignment:w}),(0,E.jsx)(Xi,{show:I,cta:f,alignment:w,isEditing:g,editTags:m})]})]})},Vr=ji;var Xr=\"Enter Brand Caption\",jr=\"Enter Title\",Kr=\"Enter Subtitle\",Yr=\"Enter Body\",Zr=\"Hero banner\";var he=require(\"react/jsx-runtime\"),Ki=(e,t,n,r)=>[{value:e,placeholder:Xr,variant:\"disclaimer\",className:\"brand-caption\",editTagKey:\"brandcaption\"},{value:t,placeholder:jr,variant:\"h1\",className:\"hero-title\",editTagKey:\"title\"},{value:n,placeholder:Kr,variant:\"h3\",className:\"subtitle\",editTagKey:\"subtitle\"},{value:r,placeholder:Yr,variant:\"body\",className:\"body\",editTagKey:\"body\"}],Qr=({brandcaption:e,title:t,subtitle:n,body:r,isEditing:i,editTags:o={},textColor:a})=>{let s=Ki(e,t,n,r);return(0,he.jsx)(he.Fragment,{children:s.map(l=>{let d=o?.[l.editTagKey]??{},c=l.value;!i&&l.value!==l.placeholder?c=l.value:l.value===\"\"&&(c=l.placeholder);let u=a===\"white\"?\"#FFFFFF\":\"#1D1D1B\";return(0,he.jsx)(O,{variant:l.variant,inputText:c,className:l.className,color:u,...d},l.editTagKey)})})};var ae=require(\"@nuskin/foundation-theme\");var xe=\"(max-width: 768px)\";function qr(e){return e??\"left\"}function Jr(e){return e??\"md\"}function eo(e){return e===\"white\"?\"white\":\"black\"}function to(e){return e===\"black\"?\"white\":\"black\"}var Yi={left:\"leftToRight\",center:\"radial\",right:\"rightToLeft\"};function no(e){return Yi[e]}var ro=ae.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`,oo=(0,ae.styled)(\"section\")`\n width: 100%;\n position: relative;\n min-height: 500px;\n overflow: hidden;\n\n .hero-title, .subtitle, .brand-caption, .body {\n margin-bottom: 4px;\n }\n\n @media ${xe} {\n min-height: 400px;\n }\n`,io={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},Zi=(e,t,n)=>{let{start:r,end:i}=io[t],o=n===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?`background: linear-gradient(to right, rgba(${o}, ${r}), rgba(${o}, ${i}));`:e===\"rightToLeft\"?`background: linear-gradient(to left, rgba(${o}, ${r}), rgba(${o}, ${i}));`:`background: radial-gradient(circle, rgba(${o}, ${r}), rgba(${o}, ${i}));`},ao=ae.styled.div`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({direction:e,depth:t,color:n})=>Zi(e,t,n)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({depth:e,color:t})=>{let{start:n,end:r}=io[e],i=t===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return`background: radial-gradient(circle, rgba(${i}, ${n}), rgba(${i}, ${r}));`}}\n }\n`,so=ae.styled.div`\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n padding: 3rem;\n pointer-events: none;\n justify-content: ${({justifyContent:e})=>e??\"flex-start\"};\n\n // Force center alignment on mobile\n @media ${xe} {\n position: static;\n inset: auto;\n min-height: 400px;\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n`,lo=ae.styled.div`\n max-width: 600px;\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n text-align: ${({textAlign:e})=>e??\"left\"};\n\n // Force center alignment on mobile\n @media ${xe} {\n max-width: 100%;\n text-align: center;\n }\n`,xt=\"hero-banner-button-wrapper\",co=ae.styled.div`\n @media ${xe} {\n &.${xt} > div {\n justify-content: center;\n }\n }\n`,po=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\";var F=require(\"react/jsx-runtime\"),Qi=e=>{let{title:t,subtitle:n,body:r,brandcaption:i,button:o,media:a,class_name:s,content_alignment:l,gradient_enabled:d=!1,gradient_depth:c,text_color:u,$:p={},parent$:T={},isEditing:x=!1}=e,g=qr(l),m=Jr(c),y=eo(u),f=po(g),w=to(y),D=no(g);return(0,F.jsxs)(oo,{className:s,\"aria-label\":Zr,...T??{},children:[a&&(0,F.jsx)(ro,{children:(0,F.jsx)(q,{bynder_media:a,$:p?.media})}),d&&(0,F.jsx)(ao,{direction:D,depth:m,color:w,\"aria-hidden\":\"true\"}),(0,F.jsx)(so,{justifyContent:f,children:(0,F.jsxs)(lo,{textAlign:g,children:[(0,F.jsx)(Qr,{brandcaption:i,title:t,subtitle:n,body:r,isEditing:x,editTags:p,textColor:y}),o&&(0,F.jsx)(co,{className:xt,children:(0,F.jsx)(J,{...o,parent$:o.$?.buttons__0??p?.button??{},alignment:g,isEditing:x})})]})})]})},uo=Qi;\n","export * from './text';\nexport * from './image';\nexport * from './marketing-banner';\nexport * from './spacing-divider';\nexport * from './carousel';\nexport * from './column-control';\nexport * from './content-card';\nexport * from './hero-banner';\nexport * from './button';\nexport * from './rich-text';\nexport * from './bynder-media';\n","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 full_width?: boolean;\n container_background_color?: unknown;\n alignment?: 'left' | 'center' | 'right';\n text_editor: string;\n font_color?: boolean;\n $?: {\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\nconst extractColorFromObject = (obj: any): string | null => {\n const color = obj?.brandColor?.colorObj?.light ?? obj?.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 {\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 fullWidth={full_width} bgColor={backgroundColor} alignment={alignment} color={fontColor}>\n <div dangerouslySetInnerHTML={{ __html: updatedHtml }} {...$?.text_editor} />\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) {\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};","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(\n () => getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark'),\n [toggleValue, theme]\n );\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 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) {\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) {\n const imageType = selectedImage?.imageType ?? 'transformBaseUrl';\n const fileSource = fileMeta?.[imageType];\n\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 {...imageProps} {...($?.image || {})} />\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', width, height }) => ({\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': { desktop: { fontSize: '44px', lineHeight: '50px' }, mobile: { fontSize: '38px', lineHeight: '44px' }, fontFamily: 'Lora' },\n 'h2': { desktop: { fontSize: '26px', lineHeight: '34px' }, mobile: { fontSize: '24px', lineHeight: '30px' }, fontFamily: 'Lora' },\n 'h3': { desktop: { fontSize: '22px', lineHeight: '28px' }, mobile: { fontSize: '20px', lineHeight: '26px' }, fontFamily: 'Lora' },\n 'body': { desktop: { fontSize: '16px', lineHeight: '22px' }, mobile: { fontSize: '16px', lineHeight: '22px' }, fontFamily: 'Inter' },\n 'disclaimer': { desktop: { fontSize: '12px', lineHeight: '16px' }, mobile: { fontSize: '12px', lineHeight: '16px' }, fontFamily: 'Inter' },\n 'boxquote': { desktop: { fontSize: '16px', lineHeight: '22px' }, mobile: { fontSize: '16px', lineHeight: '22px' }, 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 any).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 ${isBoxquote ? `\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\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 { 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 any}\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',\n\n // Layout spacing\n textGap: '1.5rem',\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(255, 255, 255, 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(text: string | undefined, placeholderValue: string, isEditing?: boolean): string | undefined {\n if (isEditing === true && (!text || text === placeholderValue)) {\n return placeholderValue;\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);\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 textAlignment={textAlignment} data-testid={testId}>\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 [hasError, setHasError] = React.useState(false);\n\n // Extract media data from bynder_media synchronously so it works during SSR\n // and when JavaScript is disabled in the browser\n const mediaInfo = React.useMemo(() => extractBynderMedia(bynder_media), [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 bgColor={bgColor} {...($ ?? {})}>\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 bgColor={bgColor} {...($ ?? {})}>\n <PictureElement>\n <SourceElement media=\"(max-width: 768px)\" srcSet={mobileUrl} />\n <SourceElement media=\"(min-width: 769px)\" srcSet={desktopUrl} />\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 bgColor={bgColor} {...($ ?? {})}>\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 (io.includes('width:') && io.includes('height:')) ||\n (url.searchParams.has('width') && url.searchParams.has('height'));\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 try {\n const url = new URL(baseUrl);\n if (!url.searchParams.has('io')) {\n return `${baseUrl}?io=transform:fill&quality=95`;\n }\n return baseUrl;\n } catch (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 (normalized.includes('left') || normalized.includes('right') || \n normalized.includes('top') || normalized.includes('bottom')) {\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 pauseOnHover?: boolean;\n initialIndex?: number;\n}\n\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const { totalSlides, autoRotate = false, rotationInterval = 5000, pauseOnHover = true, 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 isValidUrl,\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 { 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 = isValidUrl(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 position={position} data-button-icon>\n <NsIcon name={IconName} size={iconSize} colorOverride={iconColor} {...($?.icon ?? {})} />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n let 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 alignment={resolvedAlignment} verticalAlignment={resolvedVerticalAlignment}>\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={'hoverText' in variantDefault ? (variantDefault as { hoverText?: string }).hoverText : undefined}\n $underlineColor={'underlineColor' in variantDefault ? (variantDefault as { underlineColor?: string }).underlineColor : undefined}\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 data-button-label {...($?.title ?? {})}>{getLabelText()}</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 React from 'react';\nimport { 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\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)<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';\nexport function getBaseUrl(): string {\n return typeof window !== 'undefined' ? window.location.href : '';\n}\n\nexport function isValidUrl(url?: string): string | undefined {\n return url?.startsWith('/') ? getBaseUrl() + url : url;\n}\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","import React from 'react';\nimport Button from './Button';\nimport {\n ButtonProps,\n ButtonBlockProp\n} from './types';\n\nexport type ButtonWrapperProps = {\n parent$?: Record<string, unknown>;\n alignment?: ButtonProps['alignment'];\n isEditing?: boolean;\n} & Partial<ButtonBlockProp>;\n\nfunction getButtonProps(\n button: ButtonBlockProp | null | undefined,\n): { 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(\n Object.keys(button).length > 0 ? (button as ButtonBlockProp) : null\n );\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 }>`\n position: relative;\n min-height: ${({ hasMedia }) => (hasMedia ? DIMENSIONS.bannerHeightDesktop : 'auto')};\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 ${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, ButtonsBlock } 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 renderBanner = (banner: BannerData, isEditing: boolean, index: number) => {\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\n return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent hasMedia={showMedia}>\n {showMedia && (\n <MediaWrapper>\n <BynderMedia bynder_media={banner?.bynder_media} $={banner?.$?.bynder_media} />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay direction={gradientDirection} depth={gradientDepth} color={gradientColor} />\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$={\n (banner?.cta_button as ButtonsBlock).$?.buttons__0 \n ?? banner?.$?.cta_button \n ?? {}\n }\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 } = 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 pauseOnHover: true,\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 currentIndex={carousel.currentIndex} totalSlides={banners.length}>\n {banners.map((banner, index) => renderBanner(banner, isEditing, index))}\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>(\n ({ 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\n const v = verticalScaleMap[vertical_padding];\n\n return {\n display: 'flex',\n flexDirection: 'column',\n alignItems: divider_alignment === 'center' ? 'center' : divider_alignment === 'right' ? 'flex-end' : 'flex-start',\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);\n\nexport const StyledDividerLine = styled('div')<StyledDividerProps>(\n ({ divider_style, divider_thickness_px, divider_color, divider_gradient, divider_width_percent }) => {\n const base: Record<string, any> = {\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 = `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n base.WebkitMaskImage = `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%, ` +\n `black 99%, transparent 100%)`;\n base.WebkitMaskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` +\n `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)\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};","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 finalDividerColor = isValidHex(divider_color) ? divider_color! : DEFAULT_HEX;\n const divider_gradient = gradientPresetCss(divider_gradient_preset, finalDividerColor);\n\n return (\n <StyledSpacingContainer vertical_padding={vertical_padding} divider_alignment={divider_alignment}>\n {divider_style !== 'none' && (\n <StyledDividerLine\n divider_style={divider_style}\n divider_thickness_px={divider_thickness_px}\n divider_color={finalDividerColor}\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 {\n CarouselContainer,\n InnerWrapper,\n Slider,\n ArrowButton,\n EmptyPlaceholder\n} 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 slidesLength,\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 ${slidesToShow}`}\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 ref={sliderRef} {...sliderSettings} key={carouselKey}>\n {hasSlides && renderSlides()}\n {isEditing &&\n (hasSlides\n ? slidesLength < slidesToShow &&\n Array.from({ length: slidesToShow - slidesLength }).map((_, offset) =>\n renderEmptySlot(slidesLength + offset)\n )\n : Array.from({ length: slidesToShow }).map((_, index) => renderEmptySlot(index)))}\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 {\n unwrapComponent\n} 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 =\n presetColumns === 1\n ? '100%'\n : `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 stackedItemHeight={stackedItemHeight} stackedItemMaxHeight={stackedItemMaxHeight}>\n <SlideContentInner>\n {renderSlide(slide, index)}\n </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 emptyBlockParentClass?: string;\n text?: string;\n totalSlides?: number;\n $?: 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 | 'three-small-medium-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?: any;\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 | 'three-small-medium-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 'three-small-medium-large':\n return 3;\n case 'four-equal':\n return 4;\n default:\n return 1;\n }\n}\n","import React from 'react';\n\nimport type { CarouselProps } from './types';\nimport { DEVICE_SIZES } from './types';\nexport { getPresetColumns } from '../utils/viewportLayoutUtils';\n\nexport function unwrapComponent<T>(mod: T): any {\n if (!mod || typeof mod === 'function') return mod;\n return (typeof mod === 'object' && (mod as any).default) ? (mod as any).default : 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 === 'three-small-medium-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 === 'three-small-medium-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 React, { 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 = window.getComputedStyle(el);\n const pl = parseFloat(style.paddingLeft) || 0;\n const pr = 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\n const responsiveSettings = useMemo(\n () =>\n buildCarouselResponsiveSettings({\n presetColumns,\n slidesLength: slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n }),\n [\n presetColumns,\n slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n ]\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 slidesLength: slides.length,\n goToPrevious,\n goToNext,\n containerRef\n };\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(\n typeof window !== 'undefined' ? window.innerWidth : 0\n );\n\n const [carouselKey, setCarouselKey] = useState(\n `carousel-${preset}-${slideCount}-${Date.now()}`\n );\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\n","import React, { useMemo } from 'react';\n\nimport * as Styled from './ColumnControl.styled';\nimport { \n EmptyPlaceholder, \n getGridDimensions, \n getMaxChildrenForLayout, \n mapPresetToGridLayout \n} from './utils';\nimport { \n getGapPx, \n MAX_SLIDE_HEIGHT_PX, \n type ColumnControlProps, \n type ColumnControlGridLayout \n} 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 preset,\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 =\n layout ?? mapPresetToGridLayout(preset);\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]\n .filter(Boolean)\n .join(' ');\n const containerHeight = height ?? 'auto';\n\n const addSlideEditTags = useMemo(\n () => ({\n ...($?.['slides'] ?? {}),\n ...($?.['slides__parent'] ?? {}),\n 'data-add-direction': 'horizontal'\n }),\n [$]\n );\n\n const flexBasis =\n columns === 1\n ? '100%'\n : `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 {...addSlideEditTags}\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 '@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});","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 =\n | '2x1'\n | '3x1'\n | '4x1'\n | '2x2'\n | '3x2'\n | '4x2';\n\nexport type SlidePreset =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'three-small-medium-large'\n | 'four-equal';\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 /** Preset-based sizing is deprecated. Use ColumnControl (grid) with layout. */\n preset?: SlidePreset;\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 preset: SlidePreset;\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\n// Minimum slide width (in px) for non-variable width presets (CMS-friendly default)\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, SlidePreset } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS, MAX_SLIDE_HEIGHT_PX } from './types';\nimport { getPresetColumns } from '../utils/viewportLayoutUtils';\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 =\n 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 function mapPresetToGridLayout(preset: SlidePreset | undefined): ColumnControlGridLayout {\n switch (preset) {\n case 'four-equal':\n return '4x1';\n case 'three-equal':\n case 'three-small-medium-large':\n return '3x1';\n case 'two-equal':\n case 'two-small-large':\n return '2x1';\n case 'single-full':\n default:\n return '2x1';\n }\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items'\n}) =>\n React.createElement(\n EmptyPlaceholderWrapper as React.ComponentType<any>,\n { className: emptyBlockParentClass },\n text\n );\n\nexport { getPresetColumns };\n\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 ul,\n ol {\n list-style-position: outside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 1.25em;\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 margin-top: 16px;\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 overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: none;\n`;\n","import type { ButtonBlockProp, ButtonProps, ButtonsEntry } from '../../button/types';\nimport type { ContentAlignment, CtaStyle, LinkTarget, ContentCardProps } from '../types';\nimport { MAX_MEDIA_HEIGHT_PX } from '../constants';\nimport { extractBynderMedia } from '../../bynder-media';\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 const getTitle = (title: string, isEditing: boolean) => {\n if (title) return title;\n if (isEditing) return 'Enter Title';\n return '';\n};\n\nexport function normalizeContentAlignment(\n alignment?: string | null\n): 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 resolveTarget(target?: 'Yes' | 'No' | null): LinkTarget | undefined {\n if (target === 'Yes') {\n return '_blank';\n }\n return '_self';\n}\n\nexport function getCtaState(\n cta: ButtonBlockProp | undefined,\n ctaStyle: ContentCardProps['cta_style']\n) {\n const ctaStyleNormalized = normalizeCtaStyle(ctaStyle);\n const effectiveCta = getEffectiveCta(cta);\n\n const hasCtaHref = Boolean(effectiveCta?.url);\n const hasCtaLabel = Boolean(effectiveCta?.title);\n\n const isCardLink =\n ctaStyleNormalized === 'card' && hasCtaHref && !hasCtaLabel;\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 =\n Boolean(mediaInfo?.type === 'image' && (mediaInfo?.imageFit ?? 'cover') === 'none');\n\n const useFixedMediaHeight =\n media &&\n !isInlineMedia &&\n (mediaInfo?.type === 'image' || mediaInfo?.type === 'video');\n const mediaHeightValue = useFixedMediaHeight ? MAX_MEDIA_HEIGHT_PX : undefined;\n const mediaMaxHeightValue =\n media && !isInlineMedia && !mediaHeightValue ? MAX_MEDIA_HEIGHT_PX : undefined;\n\n return {\n mediaInfo,\n isInlineMedia,\n mediaHeightValue,\n mediaMaxHeightValue\n };\n}\n","import { ReactElement, useMemo } from 'react';\nimport DOMPurify from 'dompurify';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { RichTextWrapper, RichTextInner } from './RichText.styled';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface RichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n text_editor: string;\n font_color?: 'Light' | 'Dark';\n container_alignment?: 'left' | 'center' | 'right';\n container_vertical_alignment?: 'top' | 'center' | 'bottom';\n container_width?: 100 | 75 | 50 | 25;\n container_background_color?: string;\n}\n\n/**\n * Sanitization configuration for allowed tags and attributes\n * Following Contentstack Rich Text Editor restricted toolbar guidelines\n */\nconst SANITIZATION_CONFIG = {\n 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 'ul',\n 'ol',\n 'li',\n 'blockquote'\n ],\n 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/**\n * Sanitize HTML using DOMPurify\n * Removes dangerous content while preserving allowed tags and attributes\n *\n * @param html - Raw HTML content from editor\n * @returns Sanitized HTML safe for rendering\n */\nconst sanitizeHtml = (html: string): string => {\n if (!html || typeof html !== 'string') {\n return '';\n }\n\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: SANITIZATION_CONFIG.ALLOWED_TAGS,\n ALLOWED_ATTR: SANITIZATION_CONFIG.ALLOWED_ATTR,\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\nconst 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\nconst 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 * 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 // Memoize sanitized HTML to avoid recalculation on every render\n const sanitizedHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) {\n return '';\n }\n return sanitizeHtml(text_editor);\n }, [text_editor]);\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 @media (min-width: ${DEVICE_SIZES.MEDIUM}px) {\n width: ${({ width }) => width}%;\n }\n`;\n","import React from 'react';\nimport { Buttons as Button, ButtonBlockProp, ButtonsBlock } from '../button';\nimport { ContentCardProps } from './types';\nimport {\n Card,\n MediaWrapper,\n Content,\n CtaWrapper,\n ContentInner,\n RichTextWrapper\n} from './ContentCard.styled';\nimport { Typography } from '../typography';\nimport {\n getTitle,\n normalizeContentAlignment,\n getCtaState,\n getMediaLayout,\n normalizeCtaStyle\n} from './utils/helpers';\nimport { DEFAULT_MAX_HEIGHT } from './constants';\nimport { BynderMedia } from '../bynder-media';\nimport { RichTextComponent } from '../rich-text';\n\nfunction CardTextBlock({\n title,\n subtitle,\n body,\n contentTitle,\n editTags,\n alignment\n}: Readonly<{\n title: string | undefined;\n subtitle: string;\n body: ContentCardProps['body'];\n contentTitle: string;\n editTags: ContentCardProps['$'];\n alignment: 'left' | 'center' | 'right';\n}>) {\n const bodyHtml = typeof body === 'string' ? body : '';\n \n return (\n <ContentInner data-testid=\"card-content-inner\">\n {title ? (\n <Typography\n variant=\"h3\"\n inputText={contentTitle}\n color=\"inherit\"\n {...(editTags?.title ?? {})}\n />\n ) : null}\n {subtitle ? (\n <Typography\n variant=\"body\"\n inputText={subtitle}\n color=\"inherit\"\n {...(editTags?.subtitle ?? {})}\n />\n ) : null}\n {bodyHtml ? (\n <RichTextWrapper>\n <RichTextComponent\n text_editor={bodyHtml}\n alignment={alignment}\n full_width={true}\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}: Readonly<{\n show: boolean;\n cta: ButtonBlockProp | undefined;\n alignment: 'left' | 'center' | 'right';\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n}>) {\n if (!show || !cta) return null;\n const buttonParent$ : Record<string, unknown> = \n { ...(cta as ButtonsBlock).buttons?.[0]?.$?.button ?? {}, ...(editTags?.button ?? {}) };\n return (\n <CtaWrapper data-testid=\"card-cta-wrapper\">\n <Button {...cta} parent$={buttonParent$} alignment={alignment} isEditing={isEditing} />\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 {\n ctaStyleNormalized,\n effectiveCta,\n isCardLink,\n showButton,\n cardTarget\n } = getCtaState(activeCta, normalizedStyle);\n\n const contentTitle = getTitle(title ?? '', isEditing);\n const { mediaInfo, isInlineMedia, mediaHeightValue, mediaMaxHeightValue } = getMediaLayout(media);\n\n const cardAs = isCardLink ? 'a' : 'article';\n const cardLinkProps = isCardLink\n ? { href: effectiveCta?.url ?? '', target: cardTarget }\n : {};\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 ? <BynderMedia bynder_media={media} $={$?.media} /> : null}\n </MediaWrapper>\n\n <Content data-testid=\"card-content\">\n <CardTextBlock\n title={title}\n subtitle={subtitle}\n body={body}\n contentTitle={contentTitle}\n editTags={$}\n alignment={alignment}\n />\n <CardCtaBlock\n show={showButton}\n cta={activeCta}\n alignment={alignment}\n isEditing={isEditing}\n editTags={$}\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\n","import React from 'react';\nimport { Typography } from '../../typography';\nimport {\n PLACEHOLDER_BRAND_CAPTION,\n PLACEHOLDER_TITLE,\n PLACEHOLDER_SUBTITLE,\n PLACEHOLDER_BODY\n} 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 brandcaption?: string;\n title?: string;\n subtitle?: string;\n body?: string;\n isEditing: boolean;\n editTags?: Record<string, unknown>;\n textColor?: TextColor;\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 let displayValue = field.value;\n if (!isEditing && field.value !== field.placeholder) {\n displayValue = field.value;\n } else if (field.value === '') {\n displayValue = field.placeholder;\n }\n\n const color = textColor === 'white' ? '#FFFFFF' : '#1D1D1B';\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')`\n width: 100%;\n position: relative;\n min-height: 500px;\n overflow: hidden;\n\n .hero-title, .subtitle, .brand-caption, .body {\n margin-bottom: 4px;\n }\n\n @media ${MOBILE_BREAKPOINT} {\n min-height: 400px;\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 = (\n direction: string,\n depth: GradientDepth,\n color: 'black' | 'white'\n): 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\n// Overlay\n\nexport const Overlay = styled.div<{ justifyContent?: string }>`\n position: absolute;\n inset: 0;\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: 400px;\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 = (\n alignment: 'left' | 'center' | 'right'\n) => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n","\nexport 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\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 } 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\n return (\n <Container\n className={className}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {media && (\n <MediaLayer>\n <BynderMedia bynder_media={media} $={$?.media} />\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 justifyContent={justifyContent}>\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$={\n (button as ButtonsBlock).$?.buttons__0 ??\n $?.button ??\n {}\n }\n alignment={resolvedContentAlignment}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n"]}
1
+ {"version":3,"sources":["/gitlab-runner-data/builds/ns-am/content-foundation/marketing-components/dist/index.js","../src/index.ts","../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/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.tsx","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/content-card/ContentCard.styled.ts","../src/content-card/utils/helpers.ts","../src/rich-text/RichText.tsx","../src/rich-text/RichText.styled.tsx","../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"],"names":["vo","Object","create","Te","defineProperty","Eo","getOwnPropertyDescriptor","wo","getOwnPropertyNames","ko","getPrototypeOf","$o","prototype","hasOwnProperty","_o","e","t","n","get","enumerable","Tt","r","i","call","$","__esModule","value","Ro","index_exports","__export","Button","Button_default","Buttons","ButtonWrapper_default","BynderMedia","Carousel","ColumnControl","ColumnControl_default","ContentCard","ContentCard_default","CsImage","CsImage_default","CsTextComponent","CsText_default","DEFAULT_BANNER_CONFIG","DEFAULT_CAROUSEL_CONFIG","DEFAULT_ROTATION_INTERVAL","HeroBanner","HeroBanner_default","MarketingBanner","MarketingBannerComponent","PLACEHOLDER_VALUES","RichTextComponent","RichText_default","SpacingDivider","SpacingDivider_default","extractBynderMedia","getMediaUrl","module","exports","__toCommonJS","import_react","require","import_styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","DEFAULT_REGION","DEFAULT_LANGUAGE","getRegionAndLanguageFromSearch","search","startsWith","params","URLSearchParams","getRegionAndLanguageFromPath","pathname","parts","split","filter","Boolean","length","getRegionAndLanguageFromLocation","window","location","import_material","import_foundation_theme","Ct","ColorUtils","getGenomeColor","vt","useToggleFontColor","toggleValue","theme","St","useTheme","Et","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","Ce","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","wt","styled","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","resolveBackgroundColor","trimmed","CsText","full_width","container_background_color","text_editor","font_color","fontColor","regionLang","backgroundColor","updatedHtml","Ve","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","kt","image_alignment","width","height","display","justifyContent","left","right","center","maxWidth","objectFit","objectPosition","PLACEHOLDER_IMAGE_SRC","encodeURIComponent","allowedImageProps","props","align","image","parent$","isEditing","rest","selectedImage","fileMeta","contentstackAsset","parsed","entry","selected","files","err","console","warn","resolvedSrc","resolvedAlt","resolvedWidth","resolvedHeight","imageType","fileSource","altText","title","filename","imageProps","src","alt","key","containerClassForNSImage","je","className","_t","NsImage","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","rotationInterval","header","subtitle","typographyVariants","h1","desktop","fontSize","lineHeight","mobile","fontFamily","h2","h3","disclaimer","boxquote","commonTextStyles","variantToElement","TypographyStyled","Pt","variant","variantStyle","fontFamilyValue","fontWeight","isBoxquote","Typography","inputText","dataTestId","elementType","Dt","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","centerOnMobile","V","css","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","le","textAlignment","HeaderTextWrapper","TitleWrapper","SubtitleWrapper","BodyTextWrapper","getDisplayText","placeholderValue","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","H","jsxs","header_text","body_text","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParams","searchParams","getAll","isFit","some","io","hasFillWithDimensions","includes","has","skipAspectRatio","updatedIoParams","push","origin","error","addDefaultTransform","extractFocusPointFromUrl","focuspoint","parseFloat","x","y","isNaN","Math","round","parseObjectPosition","normalized","toLowerCase","mediaJson","firstImage","mediaUrl","endsWith","isResponsive","focusPoint","result","imageFit","fit","desktopUrl","mobileUrl","MediaContainer","ce","StyledImage","img","StyledVideo","video","PictureElement","picture","SourceElement","source","bynder_media","et","React","useState","hasError","setHasError","mediaInfo","handleMediaError","mediaAlt","G","onError","autoPlay","muted","loop","playsInline","srcSet","loading","useReducedMotion","$e","prefersReducedMotion","setPrefersReducedMotion","useEffect","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","pauseOnHover","initialIndex","validInitialIndex","min","_","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","useCallback","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","hasCTA","banner","cta_button","buttons","isCarouselMode","Array","isArray","banners","hasMedia","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","getBaseUrl","isValidUrl","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","ButtonContainer","me","verticalAlignment","StyledButton","hn","NsButton","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$hoverText","$underlineColor","$buttonWidth","$maxButtonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","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","_e","NsIconVariants","iconSize","renderIcon","iconColor","A","NsIcon","name","colorOverride","getLabelText","labelTitle","$variant","rel","Fragment","getButtonProps","button","buttonProps","keys","Tn","BannerContainer","L","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","$isNested","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","ButtonWrapper","CarouselControls","Indicator","active","renderBanner","isNested","showMedia","showCTA","baseTestId","resolvedTextColor","text_color","show_gradient","content_position","gradientColor","gradientDirection","gradient_depth","v","buttons__0","rotation_interval","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","onClick","THICKNESS_PX","thin","thick","ultra","StyledSpacingContainer","ct","vertical_padding","divider_alignment","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","test","hexToRgb","hex","parseInt","slice","g","b","gradientPresetCss","preset","baseHex","rgb","DEFAULT_HEX","divider_thickness","divider_gradient_preset","finalDividerColor","pt","import_react_slick","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","te","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","Yn","slides","slides__parent","getPresetColumns","unwrapComponent","mod","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","er","SliderImport","getSlideKey","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","addSlideEditTags","slide","currentFlexBasis","Ae","style","useCarouselResize","slideCount","fe","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","useCarouselLayout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","emptyPlaceholderText","emptyPlaceholderTextProp","effectiveFullWidth","containerRef","R","useRef","setContainerWidthPx","updateContainerWidth","el","current","getComputedStyle","pl","paddingLeft","pr","paddingRight","offsetWidth","ResizeObserver","ro","observe","disconnect","targetSlidesToShow","effectiveAutoplayEnabled","effectiveShowPagination","showArrowsOnDesktop","isStackedViewport","isTabletGridViewport","containerHeight","sliderRef","slickPrev","slickNext","containerClassName","isVariablePresetDesktop","effectiveSlidesToShow","responsiveSettings","slidesLength","sliderSettings","infinite","speed","autoplay","autoplaySpeed","swipe","draggable","beforeChange","next","responsive","renderSlides","hasSlides","dotsPosition","carouselProps","lr","renderEmptySlot","slotIndex","B","ref","cr","createElement","from","offset","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","ColumnControlContainer","ne","TabletGridContainer","flexWrap","columns","getGridDimensions","layout","fallback","rows","rawCols","rawRows","parsedCols","Number","parsedRows","isFinite","getMaxChildrenForLayout","maxByLayout","mapPresetToGridLayout","vr","emptyTextProp","effectiveGridLayout","maxChildren","visibleSlides","slidesCount","$r","renderSlot","hasSlide","id","Z","noForward$","Card","ie","article","$maxHeight","shouldForwardProp","$mediaHeight","$mediaMaxHeight","$inlineMedia","Content","RichTextWrapper","CtaWrapper","ContentInner","getEffectiveCta","cta","getTitle","normalizeContentAlignment","normalizeCtaStyle","raw","getCtaState","ctaStyle","ctaStyleNormalized","effectiveCta","hasCtaHref","hasCtaLabel","isCardLink","showButton","cardTarget","getMediaLayout","isInlineMedia","mediaHeightValue","mediaMaxHeightValue","import_dompurify","ht","RichTextInner","SANITIZATION_CONFIG","ALLOWED_TAGS","ALLOWED_ATTR","sanitizeHtml","zr","DOMPurify","sanitize","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","getAlignItems","RichText","container_alignment","container_vertical_alignment","container_width","restProps","sanitizedHtml","Ur","fontColorBoolean","Le","CardTextBlock","contentTitle","editTags","bodyHtml","E","CardCtaBlock","show","buttonParent$","cta_style","card_cta_group","button_cta_group","content_alignment","background_color","border_radius","max_height","normalizedStyle","activeCta","cardAs","cardLinkProps","PLACEHOLDER_BRAND_CAPTION","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","ARIA_LABEL_HERO_BANNER","getTypographyFields","brandcaption","placeholder","editTagKey","TypographyFields","fields","he","field","editAttributes","displayValue","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","getGradientColor","gradientDirectionMap","getGradientDirection","MediaLayer","ae","GRADIENT_OPACITIES","getGradientBackground","Overlay","HERO_CTA_WRAPPER_CLASS","class_name","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","F"],"mappings":"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","sourcesContent":["\"use strict\";var vo=Object.create;var Te=Object.defineProperty;var Eo=Object.getOwnPropertyDescriptor;var wo=Object.getOwnPropertyNames;var ko=Object.getPrototypeOf,$o=Object.prototype.hasOwnProperty;var _o=(e,t)=>{for(var n in t)Te(e,n,{get:t[n],enumerable:!0})},Tt=(e,t,n,r)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of wo(t))!$o.call(e,i)&&i!==n&&Te(e,i,{get:()=>t[i],enumerable:!(r=Eo(t,i))||r.enumerable});return e};var $=(e,t,n)=>(n=e!=null?vo(ko(e)):{},Tt(t||!e||!e.__esModule?Te(n,\"default\",{value:e,enumerable:!0}):n,e)),Ro=e=>Tt(Te({},\"__esModule\",{value:!0}),e);var qi={};_o(qi,{Button:()=>Re,Buttons:()=>ee,BynderMedia:()=>J,Carousel:()=>dr,ColumnControl:()=>_r,ContentCard:()=>Vr,CsImage:()=>Rt,CsTextComponent:()=>Se,DEFAULT_BANNER_CONFIG:()=>Qo,DEFAULT_CAROUSEL_CONFIG:()=>qo,DEFAULT_ROTATION_INTERVAL:()=>Jo,HeroBanner:()=>uo,MarketingBanner:()=>dt,PLACEHOLDER_VALUES:()=>se,RichTextComponent:()=>Be,SpacingDivider:()=>Nn,extractBynderMedia:()=>de,getMediaUrl:()=>Qe});module.exports=Ro(qi);var Ce=require(\"react\"),wt=$(require(\"@emotion/styled\"));var Mo=require(\"react\");var Io=\"{%language}\",Po=\"{%LANGUAGE}\",Ao=\"{%region}\",Lo=\"{%REGION}\",Fe=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(Ao,t.region),e=e.replace(Lo,t.region.toUpperCase())),t.language&&(e=e.replace(Io,t.language),e=e.replace(Po,t.language.toUpperCase())),e);var He=\"us\",Ge=\"en\";function Bo(e){if(!e?.startsWith?.(\"?\"))return;let t=new URLSearchParams(e),n=t.get(\"region\"),r=t.get(\"language\");if(!(!n&&!r))return{region:n??He,language:r??Ge}}function Do(e){if(!e)return;let t=e.split(\"/\").filter(Boolean);if(t.length<2)return;let[n,r]=t;if(n?.length===2&&r?.length===2)return{region:n,language:r}}var Ue=()=>{if(typeof window>\"u\"||!window.location)return{region:He,language:Ge};let{search:e,pathname:t}=window.location;return Bo(e)??Do(t)??{region:He,language:Ge}};var No=require(\"react\"),Oo=require(\"@mui/material\"),Ct=require(\"@nuskin/foundation-theme\"),{getGenomeColor:aa}=Ct.ColorUtils;var St=require(\"@mui/material\"),vt=require(\"@nuskin/foundation-theme\"),Et=require(\"react\"),{getGenomeColor:Wo}=vt.ColorUtils,Ho=(e=!1)=>{let t=(0,St.useTheme)();return(0,Et.useMemo)(()=>Wo(t,\"N10\",e?\"light\":\"dark\"),[e,t])},ze=Ho;var Ve=require(\"react/jsx-runtime\"),Go=()=>(0,Ce.useMemo)(()=>Ue(),[]),Fo=(e,t)=>!t||!e?e:Fe(e,t),Uo=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let r=new DOMParser().parseFromString(e,\"text/html\");return r.querySelectorAll(\"a\").forEach(i=>{let o=i.getAttribute(\"href\");o&&i.setAttribute(\"href\",Fo(o,t))}),r.body.innerHTML},zo=wt.default.div`\n width: ${({fullWidth:e})=>e?\"100%\":\"auto\"};\n background-color: ${({bgColor:e})=>e};\n text-align: ${({alignment:e})=>e};\n color: ${({color:e})=>e};\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`,Vo=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},Xo=e=>{try{let n=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof n==\"string\"&&n.trim()?n:null}catch{return null}},Xe=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return Vo(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?Xo(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},jo=({full_width:e=!1,container_background_color:t,alignment:n=\"left\",text_editor:r,font_color:i=!1,$:o})=>{let a=ze(i),l=Go(),s=(0,Ce.useMemo)(()=>Xe(t),[t]),d=(0,Ce.useMemo)(()=>Uo(r,l),[r,l]);return r?(0,Ve.jsx)(zo,{fullWidth:e,bgColor:s,alignment:n,color:a,children:(0,Ve.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:d},...o?.text_editor})}):null},Se=jo;var _t=require(\"@nuskin/foundation-ui-components\");var kt=require(\"@nuskin/foundation-theme\"),$t=(0,kt.styled)(\"div\")(({image_alignment:e=\"center\",width:t,height:n})=>({display:\"flex\",justifyContent:{left:\"flex-start\",right:\"flex-end\",center:\"center\"}[e],\"& img\":{maxWidth:\"fit-content\",objectFit:\"contain\",objectPosition:\"center\"}}));var je=require(\"react/jsx-runtime\"),Ko=\"data:image/svg+xml;utf8,\"+encodeURIComponent(`<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>`),Yo=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],Zo=e=>{let{image_alignment:t=\"center\",image:n,parent$:r,isEditing:i,$:o,...a}=e,l=null,s=null,d=null;try{let m=typeof n==\"string\"?JSON.parse(n):n,T=m?.image?.[0];T?.selected||T?.files?(l=T?.selected,s=T?.files):m?.url&&(d=m)}catch(m){console.warn(\"[CsImage] Failed to parse image prop:\",m)}let c=Ko,u=\"Image not available\",p=\"100%\",y=\"100%\";if(l||s){let m=l?.imageType??\"transformBaseUrl\",T=s?.[m];T?.url&&(c=T.url,u=l?.altText??\"Image\",p=l?.width??\"100%\",y=l?.height??\"100%\")}else d?.url&&(c=d.url,u=d.title||d.filename||\"Image\");let x={src:c,alt:u,width:p,height:y};Yo.forEach(m=>{a[m]!==void 0&&(x[m]=a[m])});let g=a?.full_width?\"container !p-0\":\"\";return(0,je.jsx)($t,{image_alignment:t,width:x.width,height:x.height,className:g,children:(0,je.jsx)(_t.NsImage,{...x,...o?.image||{}})})},Rt=Zo;var Qo={position:\"left\",textColor:\"white\",showGradient:!1,gradientDepth:\"md\",mediaType:\"image\",ctaVariant:\"dark\"},qo={rotationInterval:5e3},Jo=5e3,se={header:\"Enter Header\",title:\"Enter Title\",subtitle:\"Enter Subtitle\",body:\"Enter Body Text\"};var Pt=$(require(\"@emotion/styled\")),At={h1:{desktop:{fontSize:\"44px\",lineHeight:\"50px\"},mobile:{fontSize:\"38px\",lineHeight:\"44px\"},fontFamily:\"Lora\"},h2:{desktop:{fontSize:\"26px\",lineHeight:\"34px\"},mobile:{fontSize:\"24px\",lineHeight:\"30px\"},fontFamily:\"Lora\"},h3:{desktop:{fontSize:\"22px\",lineHeight:\"28px\"},mobile:{fontSize:\"20px\",lineHeight:\"26px\"},fontFamily:\"Lora\"},body:{desktop:{fontSize:\"16px\",lineHeight:\"22px\"},mobile:{fontSize:\"16px\",lineHeight:\"22px\"},fontFamily:\"Inter\"},disclaimer:{desktop:{fontSize:\"12px\",lineHeight:\"16px\"},mobile:{fontSize:\"12px\",lineHeight:\"16px\"},fontFamily:\"Inter\"},boxquote:{desktop:{fontSize:\"16px\",lineHeight:\"22px\"},mobile:{fontSize:\"16px\",lineHeight:\"22px\"},fontFamily:\"Inter\"}},It=`\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`,Lt={h1:\"h1\",h2:\"h2\",h3:\"h3\",body:\"p\",disclaimer:\"p\",boxquote:\"p\"},Bt=Pt.default.div`\n ${({variant:e,color:t=\"#1D1D1B\"})=>{if(!e)return`\n color: ${t};\n margin: 0;\n padding: 0;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n ${It}\n `;let n=At[e];if(!n)return\"\";let r=n.fontFamily===\"Lora\"?\"'Lora', serif\":\"'Inter', sans-serif\",i=n.fontWeight||\"400\",o=e===\"boxquote\";return`\n /* Desktop styles */\n font-size: ${n.desktop.fontSize};\n line-height: ${n.desktop.lineHeight};\n font-family: ${r};\n color: ${t};\n margin: 0;\n padding: 0;\n font-weight: ${i};\n ${o?`\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\n }\n `:\"\"}\n\n /* Mobile/Tablet styles */\n @media (max-width: 768px) {\n font-size: ${n.mobile.fontSize};\n line-height: ${n.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 ${It}\n `}}\n`;var Dt=require(\"react/jsx-runtime\"),ei=({variant:e,inputText:t,color:n=\"#1D1D1B\",className:r=\"\",dataTestId:i,...o})=>{let a=e&&Lt[e]||\"div\";return(0,Dt.jsx)(Bt,{as:a,variant:e,color:n,className:r,\"data-testid\":i,...o,children:t})},O=ei;var le=$(require(\"@emotion/styled\"));var re={mobile:0,tablet:768,desktop:1024,wide:1440};var W={headerMargin:\"0 0 0.25rem 0\",titleMargin:\"0 0 0.75rem 0\",subtitleMargin:\"0 0 0.5rem 0\",bodyMargin:\"0\",textGap:\"1.5rem\",desktopPadding:\"3rem\",mobilePadding:\"2rem\",carouselGap:\"0.75rem\",ctaPaddingDesktop:\"16px 32px\",ctaPaddingTablet:\"12px 28px\",ctaPaddingWide:\"18px 36px\"},q={bannerHeightDesktop:\"600px\",bannerHeightMobile:\"400px\",textMaxWidth:\"600px\",indicatorSize:\"12px\",indicatorBorder:\"2px\"},oe={textWhite:\"#ffffff\",textDark:\"#1D1D1B\",textGray:\"#666\",ctaDark:\"#888888\",ctaBorder:\"#888888\",fallbackBg:\"#f0f0f0\",indicatorBorder:\"rgba(255, 255, 255, 0.9)\",indicatorActive:\"rgba(255, 255, 255, 0.9)\",indicatorInactive:\"transparent\"},Mt={white:oe.textWhite,dark:oe.textDark},ve={fast:\"0.1s ease\",default:\"0.3s ease\",slow:\"0.6s cubic-bezier(0.4, 0, 0.2, 1)\"},ue={background:0,media:0,gradient:1,content:2,controls:3},j={tablet:`@media (min-width: ${re.tablet+1}px) and (max-width: ${re.desktop-1}px)`,desktop:`@media (min-width: ${re.desktop}px) and (max-width: ${re.wide-1}px)`,wide:`@media (min-width: ${re.wide}px)`,mobileAndBelow:`@media (max-width: ${re.tablet}px)`,desktopAndUp:`@media (min-width: ${re.desktop}px)`};var V=require(\"@emotion/react\");var Nt=V.css`\n ${j.mobileAndBelow} {\n text-align: center;\n }\n`,Ot=(e=[\"background-color\",\"color\",\"border-color\",\"transform\",\"text-decoration\"])=>V.css`\n transition: ${e.map(t=>`${t} ${ve.default}`).join(\", \")};\n`;var Ee=V.css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`,Na=V.css`\n ${Ee}\n width: 100%;\n height: 100%;\n`,Wt=V.css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`,Oa=V.css`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Wa=V.css`\n margin: 0;\n padding: 0;\n`;var Ke=(e,t,n,r)=>V.css`\n background: linear-gradient(${e}, rgba(${r}, ${t}), rgba(${r}, ${n}));\n`,Ye=(e,t,n)=>V.css`\n background: radial-gradient(circle, rgba(${n}, ${e}), rgba(${n}, ${t}));\n`;var Ht=le.default.div`\n text-align: ${({textAlignment:e})=>e};\n max-width: 90vw;\n overflow-wrap: break-word;\n ${Nt}\n`,Gt=le.default.div`\n margin: ${W.headerMargin};\n letter-spacing: 0.05em;\n`,Ft=le.default.div`\n margin: ${W.titleMargin};\n`,Ut=le.default.div`\n margin: ${W.subtitleMargin};\n`,zt=le.default.div`\n margin: ${W.bodyMargin};\n`;var H=require(\"react/jsx-runtime\");function we(e,t,n){if(n===!0&&(!e||e===t))return t;if(!(n===!1&&e===t))return e}function Ze({headerText:e,title:t,subtitle:n,bodyText:r,textColor:i=\"#ffffff\",textAlignment:o=\"left\",testId:a,$:l,isEditing:s}){let d=we(e,se.header,s),c=we(t,se.title,s),u=we(n,se.subtitle,s),p=we(r,se.body,s);return!d&&!c&&!u&&!p?null:(0,H.jsxs)(Ht,{textAlignment:o,\"data-testid\":a,children:[d&&(0,H.jsx)(Gt,{children:(0,H.jsx)(O,{variant:\"disclaimer\",inputText:d,color:i,\"aria-label\":d,...l?.header_text??{}})}),c&&(0,H.jsx)(Ft,{children:(0,H.jsx)(O,{variant:\"h2\",inputText:c,color:i,\"aria-label\":c,...l?.title??{}})}),u&&(0,H.jsx)(Ut,{children:(0,H.jsx)(O,{variant:\"h3\",inputText:u,color:i,\"aria-label\":u,...l?.subtitle??{}})}),p&&(0,H.jsx)(zt,{children:(0,H.jsx)(O,{variant:\"body\",inputText:p,color:i,\"aria-label\":p,...l?.body_text??{}})})]})}var et=$(require(\"react\"));function Qe(e,t,n){let{url:r=\"\",type:i=\"\"}=e??{};return i===\"VIDEO\"?t?r:n?.[0]??\"\":r}function Vt(e,t){try{let n=new URL(e),r=n.searchParams.getAll(\"io\");if(!r.length)return e;let i=r.some(d=>d.startsWith(\"transform:fit\")),o=r.some(d=>d.includes(\"transform:fill\")?d.includes(\"width:\")&&d.includes(\"height:\")||n.searchParams.has(\"width\")&&n.searchParams.has(\"height\"):!1),a=i||o,l=r.map(d=>!a&&d.includes(\"transform:fill\")?`${d},aspectratio:${t}`:d),s=[];return l.forEach(d=>s.push(`io=${d}`)),s.push(\"quality=95\"),n.searchParams.forEach((d,c)=>{c!==\"io\"&&s.push(`${c}=${d}`)}),`${n.origin}${n.pathname}?${s.join(\"&\")}`}catch(n){return console.warn(\"Failed to generate responsive URL:\",n),e}}function ti(e){try{return new URL(e).searchParams.has(\"io\")?e:`${e}?io=transform:fill&quality=95`}catch{return e}}function ni(e){try{let n=new URL(e).searchParams.get(\"focuspoint\");if(n){let[r,i]=n.split(\",\").map(parseFloat);if(!isNaN(r)&&!isNaN(i))return{x:Math.round(r*100),y:Math.round(i*100)}}}catch(t){console.warn(\"Failed to extract focus point from URL:\",t)}}function ri(e){if(!e)return\"center\";let t=e?.trim()?.toLowerCase();return t===\"center\"||t===\"center center\"?\"center\":t.includes(\"left\")||t.includes(\"right\")||t.includes(\"top\")||t.includes(\"bottom\")?t:\"center\"}function de(e){if(!e)return null;try{let n=JSON.parse(e)?.image?.[0],r=n?.selected,i=Qe(r,n?.isPublic,n?.previewUrls),o=\"image\";r?.type===\"VIDEO\"?o=\"video\":r?.type===\"IMAGE\"&&i?.toLowerCase().endsWith(\".gif\")&&(o=\"gif\");let a=r?.imageType===\"customTransformation\"||r?.imageType===\"defaultPreset\",l=ni(i),s=ri(r?.position),d=r?.bgColor||void 0,c={url:i,type:o,alt:r?.altText??\"\",imageFit:r?.fit??\"cover\",focusPoint:l,objectPosition:s,bgColor:d};return a&&o===\"image\"?(c.isResponsive=!0,c.desktopUrl=Vt(i,\"16x9\"),c.mobileUrl=Vt(i,\"3x4\"),c.url=c.desktopUrl):o===\"image\"&&(c.url=ti(i)),c}catch(t){return console.warn(\"Failed to parse bynder_media JSON:\",t),null}}var ce=$(require(\"@emotion/styled\")),ke=ce.default.div`\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: block;\n background-color: ${({bgColor:e})=>e||\"transparent\"};\n`,qe=ce.default.img`\n width: 100%;\n height: 100%;\n object-fit: ${({objectFit:e})=>e||\"cover\"};\n object-position: ${({focusPoint:e,objectPosition:t})=>e?`${e.x}% ${e.y}%`:t||\"center\"};\n display: block;\n`,Xt=ce.default.video`\n width: 100%;\n height: 100%;\n object-fit: ${({objectFit:e})=>e||\"cover\"};\n object-position: ${({focusPoint:e,objectPosition:t})=>e?`${e.x}% ${e.y}%`:t||\"center\"};\n display: block;\n`,jt=ce.default.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,Je=ce.default.source`\n display: block;\n`;var G=require(\"react/jsx-runtime\");function J({bynder_media:e,$:t}){let[n,r]=et.default.useState(!1),i=et.default.useMemo(()=>de(e),[e]),o=()=>{r(!0)};if(!i||n)return null;let a=i.type,l=i.alt,s=i.isResponsive??!1,d=i.desktopUrl,c=i.mobileUrl,u=i.url,p=i.imageFit??\"cover\",y=i.focusPoint,x=i.objectPosition,g=i.bgColor;return a===\"video\"?(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsx)(Xt,{src:u,onError:o,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,objectFit:p,focusPoint:y,objectPosition:x,...t??{}})}):s&&c&&d?(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsxs)(jt,{children:[(0,G.jsx)(Je,{media:\"(max-width: 768px)\",srcSet:c}),(0,G.jsx)(Je,{media:\"(min-width: 769px)\",srcSet:d}),(0,G.jsx)(qe,{src:d,alt:l,onError:o,loading:\"lazy\",objectFit:p,focusPoint:y,objectPosition:x,...t??{}})]})}):(0,G.jsx)(ke,{bgColor:g,...t??{},children:(0,G.jsx)(qe,{src:u,alt:l,onError:o,loading:\"lazy\",objectFit:p,focusPoint:y,objectPosition:x,...t??{}})})}var _=require(\"react\");var $e=require(\"react\");function tt(){let[e,t]=(0,$e.useState)(!1);return(0,$e.useEffect)(()=>{if(typeof window>\"u\"||!window.matchMedia)return;let n=window.matchMedia(\"(prefers-reduced-motion: reduce)\");t(n.matches);let r=i=>{t(i.matches)};return n.addEventListener(\"change\",r),()=>n.removeEventListener(\"change\",r)},[]),e}function nt(e){let{totalSlides:t,autoRotate:n=!1,rotationInterval:r=5e3,pauseOnHover:i=!0,initialIndex:o=0}=e,a=t>0?Math.min(o,t-1):0,[l,s]=(0,_.useState)(a),[d,c]=(0,_.useState)(!1),u=tt(),p=(0,_.useCallback)(()=>{t!==0&&s(f=>(f+1)%t)},[t]),y=(0,_.useCallback)(()=>{t!==0&&s(f=>(f-1+t)%t)},[t]),x=(0,_.useCallback)(f=>{f>=0&&f<t&&s(f)},[t]),g=(0,_.useCallback)(()=>{c(!0)},[]),m=(0,_.useCallback)(()=>{c(!1)},[]),T=(0,_.useCallback)(f=>{switch(f.key){case\"ArrowLeft\":f.preventDefault(),y();break;case\"ArrowRight\":f.preventDefault(),p();break;case\"Home\":f.preventDefault(),x(0);break;case\"End\":f.preventDefault(),x(t-1);break}},[p,y,x,t]);return(0,_.useEffect)(()=>{l>=t&&t>0&&s(t-1)},[t,l]),(0,_.useEffect)(()=>{if(!n||d||u||t===0)return;let f=setInterval(p,r);return()=>clearInterval(f)},[n,d,u,r,p,t]),{currentIndex:l,isPaused:d,totalSlides:t,goToNext:p,goToPrevious:y,goToSlide:x,pause:g,resume:m,handleKeyDown:T}}function Kt(e){return!!e?.cta_button?.buttons?.length}function Yt(e){return Array.isArray(e?.banners)&&e?.banners?.length>1}function Zt(e){return!!e?.bynder_media}var _e=require(\"@nuskin/foundation-ui-components\");var hn=require(\"@nuskin/foundation-ui-components\"),me=require(\"@nuskin/foundation-theme\");var Qt=\"25px\";var qt=\"noopener noreferrer\";var oi=\"disabled\",rt=\"primary\",Jt=\"small\",en=\"left\",tn=\"left\",nn=\"square\",ot=\"Enter Title\",rn=\"No\",ge=\"rounded\",on=\"square\",an=\"transparent\";function ii(){return typeof window<\"u\"?window.location.href:\"\"}function sn(e){return e?.startsWith(\"/\")?ii()+e:e}function ln(e){return e===\"Yes\"?\"_blank\":\"_self\"}function dn(e){return e==null?!1:typeof e==\"string\"?e===oi:e}var ai={arrow:\"arrowRight\"};function cn(e){if(e)return ai[e]??e}var it={primary:{bg:\"#1f1f1f\",hover:\"#3a3530\",pressed:\"#000000\",text:\"#ffffff\",disabledBg:\"#e6e6e6\",disabledText:\"#9e9e9e\",focusRing:\"#4f84b4\"},secondary:{bg:\"#ffffff\",hover:\"#f2f2f2\",pressed:\"#e6e6e6\",text:\"#000000\",border:\"#626262\",disabledBg:\"#f2f2f2\",disabledText:\"#b0b0b0\",focusRing:\"#4f84b4\"},link:{bg:\"transparent\",hover:\"transparent\",pressed:\"transparent\",text:\"#000000\",border:\"transparent\",disabledBg:\"transparent\",disabledText:\"#9e9e9e\",focusRing:\"#000000\",hoverText:\"#626262\",underlineColor:\"#000000\"}},si={large:\"400px\",medium:\"250px\",small:\"130px\"},li=\"130px\";function at(e){return si[e]??li}var di={small:\"small\",medium:\"medium\",large:\"medium\"},ci=\"medium\";function pn(e){return di[e]??ci}var un=\"2px\",st=\"70px\",ui=\"769px\",gi=\"768px\",mi=\"425px\",fi=500,gn=400,hi=\"2px\",xi=\"Lora, sans-serif\",bi=\"transparent\",yi=\"center\",Ti=\"flex-end\",Ci=\"flex-start\",mn=e=>e===\"center\"?yi:e===\"right\"||e===\"bottom\"?Ti:Ci,xn=(0,me.styled)(\"div\")`\n display: flex;\n justify-content: ${e=>mn(e.alignment)};\n align-items: ${e=>mn(e.verticalAlignment)};\n width: 100%;\n height: 100%;\n`,bn=(0,me.styled)(hn.NsButton)`\n --btn-bg: ${e=>e.$bg};\n --btn-hover: ${e=>e.$hover};\n --btn-pressed: ${e=>e.$pressed};\n --btn-color: ${e=>e.$text};\n --btn-border: ${e=>e.$border};\n --btn-disabled-bg: ${e=>e.$disabledBg};\n --btn-disabled-color: ${e=>e.$disabledText};\n --btn-focus: ${e=>e.$focusRing};\n --btn-hover-text: ${e=>e.$hoverText??e.$text};\n --btn-underline: ${e=>e.$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: ${un};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${xi};\n font-size: 14px;\n padding: 8px 10px;\n min-width: ${e=>e.$buttonWidth||st};\n width: auto;\n max-width: ${e=>e.$maxButtonWidth||e.$buttonWidth||st};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n ${e=>e.$buttonType===ge&&`border-radius: ${Qt};`}\n }\n\n @media (min-width: ${ui}) {\n && {\n font-weight: ${fi};\n }\n }\n \n @media (max-width: ${gi}) {\n && {\n font-weight: ${gn};\n }\n }\n\n @media (max-width: ${mi}) {\n && {\n font-weight: ${gn};\n width: ${e=>e.$buttonWidth===\"400px\"?\"100%\":\"auto\"};\n max-width: ${e=>e.$buttonWidth===\"400px\"?\"100%\":e.$maxButtonWidth};\n min-width: ${e=>e.$buttonWidth===\"400px\"?\"0\":e.$buttonWidth||st};\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: ${hi} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${bi};\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: ${un};\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`,lt=me.styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`,fn=`${2}px`,yn=me.styled.span`\n flex-shrink: 0;\n ${e=>e.position===\"left\"&&`margin-right: ${fn};`}\n ${e=>e.position===\"right\"&&`margin-left: ${fn};`}\n`;var A=require(\"react/jsx-runtime\"),Si=({title:e,url:t,open_in_new_tab:n=rn,variant:r,button_size:i,alignment:o,vertical_alignment:a,buttontype:l=nn,icon:s,iconposition:d,button_state:c,isEditing:u,$:p,parent$:y})=>{let x=r??rt,g=i??Jt,m=o??en,T=a??\"top\",f=d??tn,w=l===ge?ge:on,D=sn(t),h=it[x]??it[rt],k=at(g),I=at(\"large\"),U=ln(n),M=dn(c),P=(\"border\"in h?h.border:void 0)??an,C=x===\"link\",S=cn(s),z=typeof S==\"string\"&&S in _e.NsIconVariants,pe=pn(g),Q=X=>{if(!S||!z||f!==X)return null;let De=M?h.disabledText:h.text;return(0,A.jsx)(yn,{position:X,\"data-button-icon\":!0,children:(0,A.jsx)(_e.NsIcon,{name:S,size:pe,colorOverride:De,...p?.icon??{}})})},be=()=>{let X=e;return X===\"\"?ot:X};return(0,A.jsx)(xn,{alignment:m,verticalAlignment:T,children:(0,A.jsx)(bn,{$variant:x,$buttonWidth:k,$buttonType:w,$bg:h.bg,$hover:h.hover,$pressed:h.pressed,$text:h.text,$border:P,$disabledBg:h.disabledBg,$disabledText:h.disabledText,$focusRing:h.focusRing,$maxButtonWidth:I,$hoverText:\"hoverText\"in h?h.hoverText:void 0,$underlineColor:\"underlineColor\"in h?h.underlineColor:void 0,href:D,\"data-variant\":x,...U===\"_blank\"?{target:\"_blank\",rel:qt}:{},\"aria-disabled\":M,disabled:M,...y??{},children:C?(0,A.jsxs)(\"span\",{\"data-link-content\":!0,children:[Q(\"left\"),(0,A.jsx)(lt,{\"data-button-label\":!0,...p?.title??{},children:be()}),Q(\"right\")]}):(0,A.jsxs)(A.Fragment,{children:[Q(\"left\"),(0,A.jsx)(lt,{...p?.title??{},children:be()}),Q(\"right\")]})})})},Re=Si;var Tn=require(\"react/jsx-runtime\");function vi(e){return e?\"buttons\"in e&&Array.isArray(e.buttons)?{buttonProps:e.buttons?.[0]??null}:{buttonProps:e}:{buttonProps:null}}var Ei=e=>{let{parent$:t={},alignment:n,isEditing:r=!1,...i}=e,{buttonProps:o}=vi(Object.keys(i).length>0?i:null);return!o||!o.title&&!r?null:(0,Tn.jsx)(Re,{...o,alignment:n??o.alignment,parent$:t,isEditing:r})},ee=Ei;var L=$(require(\"@emotion/styled\"));var Cn=L.default.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`,Sn=L.default.div`\n position: relative;\n width: 100%;\n`,vn=L.default.div`\n display: flex;\n transition: transform ${ve.slow};\n transform: translateX(-${({currentIndex:e})=>e*100}%);\n`,En=L.default.div`\n min-width: 100%;\n position: relative;\n`,wn=L.default.div`\n position: relative;\n min-height: ${({hasMedia:e,$isNested:t})=>e?t?q.bannerHeightMobile:q.bannerHeightDesktop:\"auto\"};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${j.mobileAndBelow} {\n min-height: ${({hasMedia:e})=>e?q.bannerHeightMobile:\"auto\"};\n }\n`,kn=L.default.div`\n ${Ee}\n z-index: ${ue.media};\n`,$n=L.default.div`\n position: relative;\n z-index: ${ue.content};\n display: flex;\n flex-direction: column;\n gap: ${W.textGap};\n justify-content: center;\n padding: ${W.desktopPadding};\n max-width: ${q.textMaxWidth};\n width: auto;\n\n /* Base positioning from props (applies to desktop/tablet) */\n ${({position:e=\"left\"})=>e===\"center\"?`\n margin: 0 auto;\n align-items: center;\n text-align: center;\n `:e===\"right\"?`\n margin-left: auto;\n margin-right: 0;\n align-items: flex-end;\n text-align: right;\n `:`\n margin-right: auto;\n align-items: flex-start;\n text-align: left;\n `}\n\n /* Mobile: Override to always center content */\n ${j.mobileAndBelow} {\n padding: ${W.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n overflow: hidden;\n }\n`,_n=L.default.div`\n ${Ee}\n z-index: ${ue.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({direction:e,depth:t,color:n})=>{let r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:i,end:o}=r[t],a=n===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?Ke(\"to right\",i,o,a):e===\"rightToLeft\"?Ke(\"to left\",i,o,a):e===\"radial\"?Ye(i,o,a):\"\"}}\n\n /* Mobile: Override to always use radial gradient */\n ${j.mobileAndBelow} {\n ${({depth:e,color:t})=>{let n={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:r,end:i}=n[e];return Ye(r,i,t===\"black\"?\"0, 0, 0\":\"255, 255, 255\")}}\n }\n`,Rn=L.default.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 ${j.tablet} {\n justify-content: inherit;\n }\n\n ${j.desktop} {\n justify-content: inherit;\n }\n`,In=L.default.div`\n position: absolute;\n bottom: ${W.carouselGap};\n ${Wt}\n z-index: ${ue.controls};\n display: flex;\n gap: ${W.carouselGap};\n align-items: center;\n\n ${j.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`,Pn=L.default.button`\n width: ${q.indicatorSize};\n height: ${q.indicatorSize};\n border-radius: 50%;\n border: ${q.indicatorBorder} solid ${oe.indicatorBorder};\n background-color: ${({active:e})=>e?oe.indicatorActive:oe.indicatorInactive};\n cursor: pointer;\n padding: 0;\n ${Ot([\"all\"])}\n\n &:hover {\n background-color: ${oe.indicatorActive};\n transform: scale(1.15);\n }\n`;var v=require(\"react/jsx-runtime\"),wi=(e,t,n,r)=>{let i=Zt(e),o=Kt(e),a=\"marketing-banner\",l=Mt[e.text_color??\"white\"],s=e.gradient?.show_gradient===!0,d=e.content_position??e.position??\"left\",c=e.text_color===\"dark\"?\"white\":\"black\",u;d===\"left\"?u=\"leftToRight\":d===\"right\"?u=\"rightToLeft\":u=\"radial\";let p;d===\"center\"?p=\"center\":d===\"right\"?p=\"right\":p=\"left\";let y=e.gradient?.gradient_depth??\"md\";return(0,v.jsx)(En,{children:(0,v.jsxs)(wn,{hasMedia:i,$isNested:r,children:[i&&(0,v.jsx)(kn,{children:(0,v.jsx)(J,{bynder_media:e?.bynder_media,$:e?.$?.bynder_media})}),s&&(0,v.jsx)(_n,{direction:u,depth:y,color:c}),(0,v.jsxs)($n,{position:d,children:[(0,v.jsx)(Ze,{headerText:e.header_text,title:e.title,subtitle:e.subtitle,bodyText:e.body_text,textColor:l,textAlignment:p,testId:`${a}-${n}-text`,$:e.$,isEditing:t}),o&&(0,v.jsx)(Rn,{children:(0,v.jsx)(ee,{...e?.cta_button,alignment:p,parent$:(e?.cta_button).$?.buttons__0??e?.$?.cta_button??{},isEditing:t})})]})]})},`${a}-${n}`)};function dt(e){let{banners:t,rotation_interval:n,isEditing:r=!1,isNested:i=!1}=e,o=Yt(e),a=nt({totalSlides:t.length,autoRotate:o,rotationInterval:n??5e3,pauseOnHover:!0,initialIndex:0});return(0,v.jsxs)(Cn,{\"data-testid\":\"marketing-banner\",onKeyDown:o?a.handleKeyDown:void 0,onMouseEnter:o?a.pause:void 0,onMouseLeave:o?a.resume:void 0,children:[(0,v.jsx)(Sn,{children:(0,v.jsx)(vn,{currentIndex:a.currentIndex,totalSlides:t.length,children:t.map((l,s)=>wi(l,r,s,i))})}),o&&(0,v.jsx)(In,{children:t.map((l,s)=>(0,v.jsx)(Pn,{active:s===a.currentIndex,onClick:()=>a.goToSlide(s),\"aria-label\":`Go to slide ${s+1}`},`banner-indicator-${s}-${l.title??\"\"}`))})]})}var ct=require(\"@nuskin/foundation-theme\");var An={thin:1,medium:2,thick:4},Ie={mobile:\"(max-width: 768px)\",tablet:\"(min-width: 769px) and (max-width: 1024px)\",desktop:\"(min-width: 1025px) and (max-width: 1439px)\",ultra:\"(min-width: 1440px)\"};var Ln=(0,ct.styled)(\"div\")(({vertical_padding:e,divider_alignment:t})=>{let r={none:{mobile:0,tablet:0,desktop:0,ultra:0},small:{mobile:8,tablet:8,desktop:8,ultra:12},medium:{mobile:12,tablet:12,desktop:16,ultra:20},large:{mobile:16,tablet:16,desktop:24,ultra:32}}[e];return{display:\"flex\",flexDirection:\"column\",alignItems:t===\"center\"?\"center\":t===\"right\"?\"flex-end\":\"flex-start\",paddingTop:`${r.mobile}px`,paddingBottom:`${r.mobile}px`,[`@media ${Ie.tablet}`]:{paddingTop:`${r.tablet}px`,paddingBottom:`${r.tablet}px`},[`@media ${Ie.desktop}`]:{paddingTop:`${r.desktop}px`,paddingBottom:`${r.desktop}px`},[`@media ${Ie.ultra}`]:{paddingTop:`${r.ultra}px`,paddingBottom:`${r.ultra}px`}}}),Bn=(0,ct.styled)(\"div\")(({divider_style:e,divider_thickness_px:t,divider_color:n,divider_gradient:r,divider_width_percent:i})=>{let o={width:`${Math.max(0,Math.min(100,i))}%`};if(r&&e!==\"none\"){if(o.height=`${t}px`,o.backgroundImage=r,o.backgroundSize=\"100% 100%\",e===\"dashed\"){let a=Math.max(12,t*4),l=Math.max(6,t*2);o.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+l}px)`,o.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+l}px)`}else if(e===\"dotted\"){let a=Math.max(2,t),l=Math.max(8,a*3),s=a/2;o.maskImage=`radial-gradient(circle ${s}px at 50% 50%, black 99%, transparent 100%)`,o.WebkitMaskImage=`radial-gradient(circle ${s}px at 50% 50%, black 99%, transparent 100%)`,o.maskSize=`${l}px ${t}px`,o.WebkitMaskSize=`${l}px ${t}px`,o.maskRepeat=\"repeat-x\",o.WebkitMaskRepeat=\"repeat-x\",o.maskPosition=\"0 center\",o.WebkitMaskPosition=\"0 center\"}}else e===\"none\"?(o.height=`${t}px`,o.backgroundImage=r):(o.borderBottomStyle=e,o.borderBottomWidth=`${t}px`,o.borderBottomColor=n,o.height=0);return o});var Dn=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,ki=e=>{if(!e||!/^#([A-Fa-f0-9]{6})$/.test(e))return;let t=parseInt(e.slice(1,3),16),n=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return{r:t,g:n,b:r}},Mn=(e,t)=>{if(!e||e===\"none\")return;let n=ki(t)??{r:0,g:0,b:0};switch(e){case\"soft\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.3), rgba(${n.r},${n.g},${n.b},0.8))`;case\"bold\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.6), rgba(${n.r},${n.g},${n.b},1.0))`;case\"faint\":return`linear-gradient(90deg, rgba(${n.r},${n.g},${n.b},0.4), rgba(${n.r},${n.g},${n.b},0.4))`;default:return}};var pt=require(\"react/jsx-runtime\"),$i=\"#000000\",_i=e=>{let{vertical_padding:t=\"small\",divider_style:n=\"solid\",divider_thickness:r=\"thin\",divider_color:i,divider_gradient_preset:o=\"none\",divider_width_percent:a=100,divider_alignment:l=\"left\"}=e,s=An[r],d=Dn(i)?i:$i,c=Mn(o,d);return(0,pt.jsx)(Ln,{vertical_padding:t,divider_alignment:l,children:n!==\"none\"&&(0,pt.jsx)(Bn,{divider_style:n,divider_thickness_px:s,divider_color:d,divider_gradient:c,divider_width_percent:a??100,\"aria-hidden\":\"true\"})})},Nn=_i;var lr=require(\"react\");var er=$(require(\"react-slick\"));var te=require(\"@nuskin/foundation-theme\");var b={ULTRA_SMALL:320,EXTRA_SMALL:480,SMALL:600,MEDIUM:768,LARGE:992,EXTRA_LARGE:1200,ULTRA_LARGE:1440,SUPER_LARGE:1920},K=750;var On={none:0,small:8,medium:12,large:16};function Wn(e){return e===void 0?On.large:typeof e==\"number\"?e:On[e]}var Hn=280;var Gn=220;var Yn=require(\"react/jsx-runtime\");function ut(e,t,n,r){return e?t===\"prev\"?{left:16}:{right:16}:t===\"prev\"?{left:r}:{right:r}}var Fn=(0,te.styled)(\"section\")(({gap:e,height:t,columnHeight:n,maxColumnHeight:r,fullWidth:i,dotsInside:o=!0})=>({position:\"relative\",width:\"100%\",textAlign:\"left\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${b.MEDIUM}px)`]:{padding:\"0 40px 50px\",...i&&{padding:\"0\"}},[`@media (max-width: ${b.SMALL}px)`]:{padding:\"0 20px 40px\",...i&&{padding:\"0\"}},\".slick-slider\":{position:\"relative\",display:\"block\",height:\"100%\"},\".slick-list\":{position:\"relative\",overflow:\"hidden\",height:\"100%\",boxSizing:\"border-box\",...n===\"auto\"&&{minHeight:280},margin:`0 -${e/2}px`,padding:\"1px 0\"},\".slick-track\":{display:\"flex\",height:\"100%\",justifyContent:\"flex-start\",boxSizing:\"border-box\",margin:0,marginLeft:0},\".slick-slide\":{flexShrink:0,padding:`0 ${e/2}px`,height:n===\"auto\"?\"auto\":n,minHeight:0,boxSizing:\"border-box\",...r!=null&&{maxHeight:`${r}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:o?\"absolute\":\"static\",bottom:o?0:\"auto\",display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin:o?0:\"16px 0 0\",width:\"100%\",left:0,li:{margin:0,width:12,height:12,button:{width:12,height:12,padding:0,borderRadius:\"50%\",border:\"none\",background:\"#ccc\",textIndent:-9999,cursor:\"pointer\",transition:\"background 0.2s ease, transform 0.2s ease\",\"&:before\":{display:\"none\"}},\"&.slick-active button\":{background:\"#4A90E2\"}}},[`@media (max-width: ${b.SMALL}px)`]:{\".slick-dots\":{bottom:o?8:\"auto\",gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),Un=(0,te.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:n,stackedItemMaxHeight:r,slideWidth:i,flexBasis:o,isVariableWidth:a})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:n===\"auto\"?\"100%\":n,minHeight:0,...r!=null&&{maxHeight:r},width:i,flex:e&&o?`0 0 ${o}`:void 0,flexShrink:0,boxSizing:e?\"border-box\":void 0,minWidth:a?0:Hn,position:\"relative\"})),zn=(0,te.styled)(\"div\")(({stackedItemHeight:e})=>({width:\"100%\",height:e===\"auto\"?\"100%\":e,minHeight:0,boxSizing:\"border-box\",display:\"flex\",flexDirection:\"column\",alignItems:\"stretch\",textAlign:\"left\",overflow:\"hidden\",minWidth:0,position:\"relative\"})),Vn=(0,te.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),Xn=(0,te.styled)(\"button\")(({direction:e,fullWidth:t})=>({position:\"absolute\",top:\"50%\",transform:\"translateY(-50%)\",background:\"rgba(0, 0, 0, 0.5)\",color:\"#fff\",border:\"none\",borderRadius:\"50%\",width:48,height:48,padding:0,margin:0,cursor:\"pointer\",zIndex:10,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",transition:\"background 0.2s ease\",fontSize:24,lineHeight:1,verticalAlign:\"middle\",...ut(t,e,8,-60),\"&:hover\":{background:\"rgba(0, 0, 0, 0.7)\"},\"&:focus\":{outline:\"2px solid #4A90E2\",outlineOffset:2},\"&:disabled\":{opacity:.3,cursor:\"not-allowed\"},[`@media (max-width: ${b.MEDIUM}px)`]:{width:40,height:40,...ut(t,e,4,-45)},[`@media (max-width: ${b.SMALL}px)`]:{width:32,height:32,fontSize:20,...ut(t,e,2,-35)}})),jn=(0,te.styled)(\"div\")({position:\"relative\",height:\"100%\",containerType:\"inline-size\"}),Ri=(0,te.styled)(\"div\")({padding:\"10px\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",alignItems:\"center\",minHeight:`${Gn}px`,border:\"1px dashed #ccc\",boxSizing:\"border-box\"}),Kn=({emptyBlockParentClass:e,text:t=\"Add items\",totalSlides:n=0,$:r={}})=>(0,Yn.jsx)(Ri,{className:n===0?e:void 0,...n===0?r?.slides??{}:{},...n===0?r?.slides__parent??{}:{},...r?.[`slides__${n-1}`]??{},\"data-add-direction\":\"horizontal\",children:t});function Pe(e){switch(e){case\"single-full\":return 1;case\"two-equal\":case\"two-small-large\":return 2;case\"three-equal\":case\"three-small-medium-large\":return 3;case\"four-equal\":return 4;default:return 1}}function Y(e){return!e||typeof e==\"function\"?e:typeof e==\"object\"&&e.default?e.default:e}function Zn(e,t){return t<b.LARGE?!1:e===\"two-small-large\"||e===\"three-small-medium-large\"}function Qn(e,t,n,r,i){if(n<b.LARGE)return\"auto\";let a=(i>0?i:n)+r;if(e===\"two-small-large\"){let l=(t%2+2)%2,s=Math.round(a/3),d=a-s;return l===0?`${s}px`:`${d}px`}if(e===\"three-small-medium-large\"){let l=(t%3+3)%3,s=Math.round(a*.25),d=a-s*2;return l===1?`${d}px`:`${s}px`}return\"auto\"}function qn(e,t){return e>=b.EXTRA_LARGE?Math.min(t,4):e>=b.LARGE?Math.min(t,3):e>=b.SMALL?Math.min(t,2):1}function Jn(e){let{presetColumns:t,shouldShowDots:n,isVariableWidth:r}=e,i=1,o=Math.min(t,2),a=Math.min(t,3);return[{breakpoint:b.SMALL,settings:{slidesToShow:i,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:!1}},{breakpoint:b.MEDIUM,settings:{slidesToShow:o,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:!1}},{breakpoint:b.LARGE,settings:{slidesToShow:a,slidesToScroll:1,swipeToSlide:!0,arrows:!1,dots:n,variableWidth:r}}]}var Ae=require(\"react/jsx-runtime\"),tr=Y(er.default),nr=Y(Fn),gt=Y(Xn),rr=Y(jn),Pi=Y(Un),Ai=Y(zn),Li=Y(Vn),or=Y(Kn);function Bi(e){return`slide-${e}`}function ir(e){let{slidesForRender:t,renderSlide:n,presetColumns:r,gap:i,isVariableWidth:o,getSlideWidth:a,stackedVerticalGap:l,stackedItemHeight:s,stackedItemMaxHeight:d,useFlexLayout:c=!1,$:u={}}=e,p={...u?.slides??void 0,...u?.slides__parent??void 0,\"data-add-direction\":\"horizontal\"},y=r===1?\"100%\":`calc((100% - ${(r-1)*i}px) / ${r})`;return t.map((x,g)=>{let m=!c&&o?a(g):void 0,T=c&&o?a(g):y;return(0,Ae.jsx)(Pi,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${g+1} of ${t.length}`,useFlexLayout:c,stackedVerticalGap:l,stackedItemHeight:s,stackedItemMaxHeight:d,slideWidth:m,flexBasis:T,isVariableWidth:o,style:m?{width:m}:void 0,...p,...u?.[`slides__${g}`]??{},children:(0,Ae.jsx)(Ai,{stackedItemHeight:s,stackedItemMaxHeight:d,children:(0,Ae.jsx)(Li,{children:n(x,g)})})},Bi(g))})}var R=require(\"react\");var fe=require(\"react\");function ar(e,t){let[n,r]=(0,fe.useState)(typeof window<\"u\"?window.innerWidth:0),[i,o]=(0,fe.useState)(`carousel-${e}-${t}-${Date.now()}`);return(0,fe.useEffect)(()=>{if(typeof window>\"u\")return;let a,l=()=>{clearTimeout(a),a=setTimeout(()=>{r(window.innerWidth),o(`carousel-${e}-${t}-${Date.now()}`)},150)};return window.addEventListener(\"resize\",l),()=>{clearTimeout(a),window.removeEventListener(\"resize\",l)}},[e,t]),{windowWidth:n,carouselKey:i}}function sr(e){let{slides:t,renderSlide:n,preset:r=\"single-full\",autoplayEnabled:i=!1,autoplayDuration:o=3,showPagination:a=!0,onSlideChange:l,className:s,slickSettings:d,gap:c=\"medium\",height:u,fullWidth:p,isEditing:y=!1,emptyBlockParentClass:x,emptyPlaceholderText:g,parent$:m,$:T}=e,f=Wn(c),w=g??\"Add items to the carousel\",D=p??!1,{windowWidth:h,carouselKey:k}=ar(r,t.length),I=(0,R.useRef)(null),[U,M]=(0,R.useState)(0),P=(0,R.useCallback)(()=>{let N=I.current;if(!N)return;let ye=window.getComputedStyle(N),Co=parseFloat(ye.paddingLeft)||0,So=parseFloat(ye.paddingRight)||0;M(N.offsetWidth-Co-So)},[]);(0,R.useEffect)(()=>{if(P(),typeof ResizeObserver>\"u\"||!I.current)return;let N=new ResizeObserver(P);return N.observe(I.current),()=>N.disconnect()},[P]);let C=(0,R.useMemo)(()=>Pe(r),[r]),S=qn(h,C),z=Zn(r,h),pe=(0,R.useMemo)(()=>N=>Qn(r,N,h,f,U),[r,h,f,U]),Q=i,be=a,X=h>b.LARGE,De=h<=b.SMALL,go=!1,bt=\"auto\",yt=K,mo=0,fo=u??\"auto\",Me=be&&t.length>1&&h<=b.LARGE,Ne=(0,R.useRef)(null),ho=()=>Ne.current?.slickPrev(),xo=()=>Ne.current?.slickNext(),bo=[s].filter(Boolean).join(\" \"),Oe=z&&h>b.MEDIUM,We=Oe?1:S,yo=(0,R.useMemo)(()=>Jn({presetColumns:C,slidesLength:t.length,isEditing:y,shouldShowDots:Me,isVariableWidth:z}),[C,t.length,y,Me,z]),To={dots:Me,infinite:t.length>We,speed:500,slidesToShow:We,slidesToScroll:1,autoplay:Q,autoplaySpeed:o*1e3,pauseOnHover:!0,arrows:!1,variableWidth:Oe,swipe:!0,draggable:!0,beforeChange:(N,ye)=>l?.(ye),responsive:yo,...d};return{gapPx:f,containerHeight:fo,stackedItemHeight:bt,stackedItemMaxHeight:yt,isVariableWidth:z,containerClassName:bo,effectiveFullWidth:D,parent$:m,$:T,emptyBlockParentClass:x,emptyPlaceholderText:w,sliderRef:Ne,sliderSettings:To,carouselKey:k,renderSlides:(N=!1)=>ir({slidesForRender:t,renderSlide:n,presetColumns:C,gap:f,isVariableWidth:Oe,getSlideWidth:pe,stackedVerticalGap:mo,stackedItemHeight:bt,stackedItemMaxHeight:yt,useFlexLayout:N,$:T}),slidesForRender:t,hasSlides:t.length>0,isStackedViewport:De,isTabletGridViewport:go,preset:r,showArrowsOnDesktop:X,slidesToShow:We,slidesLength:t.length,goToPrevious:ho,goToNext:xo,containerRef:I}}var B=require(\"react/jsx-runtime\"),cr=require(\"react\");function dr(e){let{dotsPosition:t,isEditing:n}=e,r={...e};(0,lr.useEffect)(()=>{import(\"slick-carousel/slick/slick.css\"),import(\"slick-carousel/slick/slick-theme.css\")},[]);let{gapPx:i,containerHeight:o,stackedItemHeight:a,stackedItemMaxHeight:l,isVariableWidth:s,containerClassName:d,effectiveFullWidth:c,parent$:u,$:p,emptyBlockParentClass:y,emptyPlaceholderText:x,sliderRef:g,sliderSettings:m,carouselKey:T,renderSlides:f,hasSlides:w,showArrowsOnDesktop:D,slidesToShow:h,slidesLength:k,goToPrevious:I,goToNext:U,containerRef:M}=sr(r),P=C=>(0,B.jsx)(\"section\",{\"aria-roledescription\":\"slide\",\"aria-label\":`Empty slide ${C+1} of ${h}`,children:(0,B.jsx)(or,{emptyBlockParentClass:y,text:x,totalSlides:k,$:p})},`empty-slide-${C}`);return(0,B.jsx)(nr,{ref:M,gap:i,height:o,columnHeight:a,maxColumnHeight:l,isVariableWidth:s,className:d,\"aria-label\":\"Carousel Control\",fullWidth:c,dotsInside:t!==\"outside\",...u??{},children:(0,B.jsxs)(rr,{children:[(0,B.jsx)(\"div\",{...p?.slides??{},...p?.slides__parent??{},\"data-add-direction\":\"horizontal\",children:(0,cr.createElement)(tr,{ref:g,...m,key:T},w&&f(),n&&(w?k<h&&Array.from({length:h-k}).map((C,S)=>P(k+S)):Array.from({length:h}).map((C,S)=>P(S))))}),D&&k>h&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(gt,{direction:\"prev\",onClick:I,\"aria-label\":\"Previous slide\",fullWidth:c,children:\"\\u2039\"}),(0,B.jsx)(gt,{direction:\"next\",onClick:U,\"aria-label\":\"Next slide\",fullWidth:c,children:\"\\u203A\"})]})]})})}var $r=require(\"react\");var ne=require(\"@nuskin/foundation-theme\");var pr={none:0,small:8,medium:12,large:16};function ur(e){return e===void 0?pr.large:typeof e==\"number\"?e:pr[e]}var gr=280;var mr=220,fr=8;var hr=(0,ne.styled)(\"section\")(({gap:e,height:t,columnHeight:n,maxColumnHeight:r,fullWidth:i,dotsInside:o=!0})=>({position:\"relative\",width:\"100%\",textAlign:\"center\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${b.MEDIUM}px)`]:{padding:i?\"0\":\"0 40px 50px\"},[`@media (max-width: ${b.SMALL}px)`]:{padding:\"0 0 40px\"},\".slick-slider\":{position:\"relative\",display:\"block\",height:\"100%\"},\".slick-list\":{position:\"relative\",overflow:\"hidden\",height:\"100%\",...n===\"auto\"&&{minHeight:280},margin:`0 -${e/2}px`,padding:\"1px 0\"},\".slick-track\":{display:\"flex\",height:\"100%\"},\".slick-slide\":{padding:`0 ${e/2}px`,height:n===\"auto\"?\"auto\":n,minHeight:0,...r!=null&&{maxHeight:`${r}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:o?\"absolute\":\"static\",bottom:o?12:\"auto\",display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin:o?0:\"16px 0 0\",width:\"100%\",left:0,li:{margin:0,width:12,height:12,button:{width:12,height:12,padding:0,borderRadius:\"50%\",border:\"none\",background:\"#ccc\",textIndent:-9999,cursor:\"pointer\",transition:\"background 0.2s ease, transform 0.2s ease\",\"&:before\":{display:\"none\"}},\"&.slick-active button\":{background:\"#4A90E2\"}}},[`@media (max-width: ${b.SMALL}px)`]:{\".slick-dots\":{bottom:o?8:\"auto\",gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),xr=(0,ne.styled)(\"div\")(({gap:e})=>({display:\"flex\",flexWrap:\"wrap\",gap:`${e}px`,width:\"100%\"})),br=(0,ne.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:n,stackedItemMaxHeight:r,slideWidth:i,flexBasis:o,gap:a,columns:l})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:n,minHeight:0,...r!=null&&{maxHeight:r},width:i,flex:e&&o?`0 0 ${o}`:void 0,boxSizing:e?\"border-box\":void 0,minWidth:gr,position:\"relative\",[`@media (max-width: ${b.EXTRA_LARGE}px)`]:{...e&&l===4&&{flex:`0 0 calc((100% - ${a*2}px) / 3)`,maxWidth:`calc((100% - ${a*2}px) / 3)`,minWidth:0}},[`@media (max-width: ${b.LARGE}px)`]:{...e&&{flex:`0 0 calc((100% - ${a}px) / 2)`,maxWidth:`calc((100% - ${a}px) / 2)`,minWidth:0}},[`@media (max-width: ${b.SMALL}px)`]:{...e&&{flex:\"0 0 100%\",maxWidth:\"100%\",minWidth:0}}})),yr=(0,ne.styled)(\"div\")(({stackedItemHeight:e})=>({width:\"100%\",height:e===\"auto\"?\"100%\":e,minHeight:0,boxSizing:\"border-box\",display:\"flex\",flexDirection:\"column\",alignItems:\"stretch\",textAlign:\"left\",overflow:\"hidden\",minWidth:0,position:\"relative\"})),Tr=(0,ne.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),Cr=(0,ne.styled)(\"div\")({position:\"relative\",height:\"100%\"}),Sr=(0,ne.styled)(\"div\")({padding:\"10px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",minHeight:`${mr}px`,border:\"1px dashed #ccc\",boxSizing:\"border-box\"});var vr=$(require(\"react\"));function mt(e){let t={columns:2,rows:1};if(!e)return t;let n=e.toLowerCase(),[r,i]=n.split(\"x\"),o=Number(r),a=Number(i),l=Number.isFinite(o)&&o>0?o:t.columns,s=Number.isFinite(a)&&a>0?a:t.rows;return l=Math.min(Math.max(l,2),4),s=Math.min(Math.max(s,1),2),{columns:l,rows:s}}function Er(e){let{columns:t,rows:n}=mt(e),r=t*n;return Math.min(r,fr)}function wr(e){switch(e){case\"four-equal\":return\"4x1\";case\"three-equal\":case\"three-small-medium-large\":return\"3x1\";case\"two-equal\":case\"two-small-large\":return\"2x1\";case\"single-full\":default:return\"2x1\"}}var kr=({emptyBlockParentClass:e,text:t=\"Add items\"})=>vr.default.createElement(Sr,{className:e},t);var Z=require(\"react/jsx-runtime\");function Mi(e){let{slides:t,renderSlide:n,layout:r,preset:i,gap:o=\"medium\",height:a,fullWidth:l,className:s,emptyBlockParentClass:d,emptyPlaceholderText:c,isEditing:u,parent$:p,$:y}=e,x=r??wr(i),g=ur(o),{columns:m}=mt(x),T=Er(x),f=t.slice(0,T),w=f.length,D=c??\"Add items to the column control\",h=l??!0,k=[\"column-control-container\",s].filter(Boolean).join(\" \"),I=a??\"auto\",U=(0,$r.useMemo)(()=>({...y?.slides??{},...y?.slides__parent??{},\"data-add-direction\":\"horizontal\"}),[y]),M=m===1?\"100%\":`calc((100% - ${(m-1)*g}px) / ${m})`,P=C=>{let S=C<w;if(!u&&!S)return null;let z=`slide-${C}`;return(0,Z.jsx)(br,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${C+1} of ${T}`,useFlexLayout:!0,stackedVerticalGap:0,stackedItemHeight:\"auto\",stackedItemMaxHeight:K,flexBasis:M,gap:g,columns:m,...y?.[`slides__${C}`]??{},children:(0,Z.jsx)(yr,{stackedItemHeight:\"auto\",stackedItemMaxHeight:K,children:(0,Z.jsx)(Tr,{children:S?n(f[C],C):(0,Z.jsx)(kr,{emptyBlockParentClass:d,text:D})})})},z)};return(0,Z.jsx)(hr,{gap:g,height:I,columnHeight:\"auto\",maxColumnHeight:K,className:k,\"aria-label\":\"Column Control\",fullWidth:h,...p??{},children:(0,Z.jsx)(Cr,{children:(0,Z.jsx)(\"div\",{children:(0,Z.jsx)(xr,{className:\"column-control-container\",gap:g,...U,children:Array.from({length:T}).map((C,S)=>P(S))})})})})}var _r=Mi;var ie=$(require(\"@emotion/styled\")),Ni=e=>!e.startsWith(\"$\"),Rr=ie.default.article`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n max-height: ${({$maxHeight:e})=>e?`${e}px`:\"none\"};\n flex: 1 1 0%;\n overflow: hidden;\n text-align: ${({align:e})=>e||\"left\"};\n border-radius: ${({borderRadius:e})=>e||\"12px\"};\n background-color: ${({backgroundColor:e})=>e||\"inherit\"};\n color: ${({textColor:e})=>e||\"inherit\"};\n text-decoration: none;\n\n &[data-cta-style='card'] {\n text-decoration: none;\n color: inherit;\n }\n`,Ir=(0,ie.default)(\"div\",{shouldForwardProp:Ni})`\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:e})=>e!=null&&e>0?`${e}px`:\"auto\"};\n max-height: ${({$mediaMaxHeight:e})=>e!=null&&e>0?`${e}px`:\"none\"};\n ${({$mediaHeight:e})=>e!=null&&e>0&&`\n & > * {\n height: 100%;\n min-height: 0;\n } \n `}\n\n ${({$inlineMedia:e})=>e&&`\n & img,\n & video {\n width: auto;\n height: 100% ;\n display: inline-block;\n max-width: 100%;\n }\n `}\n`,Pr=ie.default.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`,Ar=ie.default.div`\n padding: 0;\n width: 100%;\n & > div {\n padding: 0;\n width: 100%;\n }\n ul,\n ol {\n list-style-position: outside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 1.25em;\n }\n ol {\n list-style-type: decimal;\n }\n li {\n margin: 0.25em 0;\n }\n`,Lr=ie.default.div`\n margin-top: 16px;\n`,Br=ie.default.div`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n gap: 8px;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: none;\n`;function Oi(e){return e?\"buttons\"in e?e.buttons?.[0]?.button??null:e:null}var Mr=(e,t)=>e||(t?\"Enter Title\":\"\");function Nr(e){return e===\"centre\"||e===\"center\"?\"center\":e===\"right\"?\"right\":\"left\"}function ft(e){let t=typeof e==\"string\"?e.toLowerCase().trim():\"\";return t===\"card\"||t===\"button\"||t===\"none\"?t:t.includes(\"card\")?\"card\":t.includes(\"button\")?\"button\":(t.includes(\"none\")||t.includes(\"no cta\"),\"none\")}function Wi(e){return e===\"Yes\"?\"_blank\":\"_self\"}function Or(e,t){let n=ft(t),r=Oi(e),i=!!r?.url,o=!!r?.title,a=n===\"card\"&&i&&!o,l=n===\"button\"&&o||n===\"card\"&&i&&o,s=Wi(r?.open_in_new_tab);return{ctaStyleNormalized:n,effectiveCta:r,isCardLink:a,showButton:l,cardTarget:s}}function Wr(e){let t=e?de(e):null,n=t?.type===\"image\"&&(t?.imageFit??\"cover\")===\"none\",i=e&&!n&&(t?.type===\"image\"||t?.type===\"video\")?400:void 0;return{mediaInfo:t,isInlineMedia:n,mediaHeightValue:i,mediaMaxHeightValue:e&&!n&&!i?400:void 0}}var Ur=require(\"react\"),zr=$(require(\"dompurify\"));var ht=$(require(\"@emotion/styled\"));var Hr=ht.default.div`\n display: flex;\n width: 100%;\n height: 100%;\n align-items: ${({alignItems:e})=>e};\n`,Gr=ht.default.div`\n width: 100%;\n\n a {\n color: #008ab0;\n text-decoration: none;\n }\n\n @media (min-width: ${b.MEDIUM}px) {\n width: ${({width:e})=>e}%;\n }\n`;var Le=require(\"react/jsx-runtime\"),Fr={ALLOWED_TAGS:[\"p\",\"div\",\"span\",\"a\",\"br\",\"strong\",\"b\",\"em\",\"i\",\"u\",\"h1\",\"h2\",\"h3\",\"ul\",\"ol\",\"li\",\"blockquote\"],ALLOWED_ATTR:[\"href\",\"target\",\"rel\",\"title\",\"class\",\"style\",\"data-testid\",\"data-cs-id\",\"data-cs-type\",\"data-cslp\"]},Hi=e=>!e||typeof e!=\"string\"?\"\":zr.default.sanitize(e,{ALLOWED_TAGS:Fr.ALLOWED_TAGS,ALLOWED_ATTR:Fr.ALLOWED_ATTR,KEEP_CONTENT:!0,RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,FORCE_BODY:!1,SANITIZE_DOM:!0,IN_PLACE:!1}),Gi=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\",Fi=e=>e===\"center\"?\"center\":e===\"bottom\"?\"flex-end\":\"flex-start\",Ui=({text_editor:e,font_color:t,container_alignment:n=\"left\",container_vertical_alignment:r=\"top\",container_width:i=100,container_background_color:o,...a})=>{let l=(0,Ur.useMemo)(()=>!e||typeof e!=\"string\"||!e.trim()?\"\":Hi(e),[e]),s=t===\"Light\";if(!l)return null;let d=Gi(n),c=Fi(r);return(0,Le.jsx)(Hr,{alignItems:c,style:{justifyContent:d,backgroundColor:Xe(o)},children:(0,Le.jsx)(Gr,{width:i,children:(0,Le.jsx)(Se,{...a,container_background_color:o,text_editor:l,font_color:s})})})},Be=Ui;var E=require(\"react/jsx-runtime\");function Vi({title:e,subtitle:t,body:n,contentTitle:r,editTags:i,alignment:o}){let a=typeof n==\"string\"?n:\"\";return(0,E.jsxs)(Br,{\"data-testid\":\"card-content-inner\",children:[e?(0,E.jsx)(O,{variant:\"h3\",inputText:r,color:\"inherit\",...i?.title??{}}):null,t?(0,E.jsx)(O,{variant:\"body\",inputText:t,color:\"inherit\",...i?.subtitle??{}}):null,a?(0,E.jsx)(Ar,{children:(0,E.jsx)(Be,{text_editor:a,alignment:o,full_width:!0,container_background_color:\"transparent\",$:{text_editor:i?.body??{}}})}):null]})}function Xi({show:e,cta:t,alignment:n,isEditing:r,editTags:i}){if(!e||!t)return null;let o={...t.buttons?.[0]?.$?.button??{},...i?.button??{}};return(0,E.jsx)(Lr,{\"data-testid\":\"card-cta-wrapper\",children:(0,E.jsx)(ee,{...t,parent$:o,alignment:n,isEditing:r})})}var ji=e=>{let{title:t,subtitle:n=\"\",body:r=\"\",media:i,cta_style:o=\"none\",cta:a,card_cta_group:l,button_cta_group:s,content_alignment:d=\"left\",background_color:c=\"#ffffff\",text_color:u=\"#000000\",border_radius:p=\"0px\",max_height:y=750,parent$:x={},isEditing:g=!1,$:m={}}=e,T=ft(o),f;T===\"card\"?f=l??a:T===\"button\"&&(f=s??a);let w=Nr(d),{ctaStyleNormalized:D,effectiveCta:h,isCardLink:k,showButton:I,cardTarget:U}=Or(f,T),M=Mr(t??\"\",g),{mediaInfo:P,isInlineMedia:C,mediaHeightValue:S,mediaMaxHeightValue:z}=Wr(i),pe=k?\"a\":\"article\",Q=k?{href:h?.url??\"\",target:U}:{};return(0,E.jsxs)(Rr,{align:w,borderRadius:p,backgroundColor:c,textColor:u,$maxHeight:y,as:pe,...Q,\"data-cta-style\":D,...x,children:[(0,E.jsx)(Ir,{\"data-testid\":`card-media-${P?.type}`,$inlineMedia:C,$mediaHeight:S,$mediaMaxHeight:z,children:i?(0,E.jsx)(J,{bynder_media:i,$:m?.media}):null}),(0,E.jsxs)(Pr,{\"data-testid\":\"card-content\",children:[(0,E.jsx)(Vi,{title:t,subtitle:n,body:r,contentTitle:M,editTags:m,alignment:w}),(0,E.jsx)(Xi,{show:I,cta:f,alignment:w,isEditing:g,editTags:m})]})]})},Vr=ji;var Xr=\"Enter Brand Caption\",jr=\"Enter Title\",Kr=\"Enter Subtitle\",Yr=\"Enter Body\",Zr=\"Hero banner\";var he=require(\"react/jsx-runtime\"),Ki=(e,t,n,r)=>[{value:e,placeholder:Xr,variant:\"disclaimer\",className:\"brand-caption\",editTagKey:\"brandcaption\"},{value:t,placeholder:jr,variant:\"h1\",className:\"hero-title\",editTagKey:\"title\"},{value:n,placeholder:Kr,variant:\"h3\",className:\"subtitle\",editTagKey:\"subtitle\"},{value:r,placeholder:Yr,variant:\"body\",className:\"body\",editTagKey:\"body\"}],Qr=({brandcaption:e,title:t,subtitle:n,body:r,isEditing:i,editTags:o={},textColor:a})=>{let l=Ki(e,t,n,r);return(0,he.jsx)(he.Fragment,{children:l.map(s=>{let d=o?.[s.editTagKey]??{},c=s.value;!i&&s.value!==s.placeholder?c=s.value:s.value===\"\"&&(c=s.placeholder);let u=a===\"white\"?\"#FFFFFF\":\"#1D1D1B\";return(0,he.jsx)(O,{variant:s.variant,inputText:c,className:s.className,color:u,...d},s.editTagKey)})})};var ae=require(\"@nuskin/foundation-theme\");var xe=\"(max-width: 768px)\";function qr(e){return e??\"left\"}function Jr(e){return e??\"md\"}function eo(e){return e===\"white\"?\"white\":\"black\"}function to(e){return e===\"black\"?\"white\":\"black\"}var Yi={left:\"leftToRight\",center:\"radial\",right:\"rightToLeft\"};function no(e){return Yi[e]}var ro=ae.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`,oo=(0,ae.styled)(\"section\")`\n width: 100%;\n position: relative;\n min-height: 500px;\n overflow: hidden;\n\n .hero-title, .subtitle, .brand-caption, .body {\n margin-bottom: 4px;\n }\n\n @media ${xe} {\n min-height: 400px;\n }\n`,io={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},Zi=(e,t,n)=>{let{start:r,end:i}=io[t],o=n===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?`background: linear-gradient(to right, rgba(${o}, ${r}), rgba(${o}, ${i}));`:e===\"rightToLeft\"?`background: linear-gradient(to left, rgba(${o}, ${r}), rgba(${o}, ${i}));`:`background: radial-gradient(circle, rgba(${o}, ${r}), rgba(${o}, ${i}));`},ao=ae.styled.div`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({direction:e,depth:t,color:n})=>Zi(e,t,n)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({depth:e,color:t})=>{let{start:n,end:r}=io[e],i=t===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return`background: radial-gradient(circle, rgba(${i}, ${n}), rgba(${i}, ${r}));`}}\n }\n`,so=ae.styled.div`\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n padding: 3rem;\n pointer-events: none;\n justify-content: ${({justifyContent:e})=>e??\"flex-start\"};\n\n // Force center alignment on mobile\n @media ${xe} {\n position: static;\n inset: auto;\n min-height: 400px;\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n`,lo=ae.styled.div`\n max-width: 600px;\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n text-align: ${({textAlign:e})=>e??\"left\"};\n\n // Force center alignment on mobile\n @media ${xe} {\n max-width: 100%;\n text-align: center;\n }\n`,xt=\"hero-banner-button-wrapper\",co=ae.styled.div`\n @media ${xe} {\n &.${xt} > div {\n justify-content: center;\n }\n }\n`,po=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\";var F=require(\"react/jsx-runtime\"),Qi=e=>{let{title:t,subtitle:n,body:r,brandcaption:i,button:o,media:a,class_name:l,content_alignment:s,gradient_enabled:d=!1,gradient_depth:c,text_color:u,$:p={},parent$:y={},isEditing:x=!1}=e,g=qr(s),m=Jr(c),T=eo(u),f=po(g),w=to(T),D=no(g);return(0,F.jsxs)(oo,{className:l,\"aria-label\":Zr,...y??{},children:[a&&(0,F.jsx)(ro,{children:(0,F.jsx)(J,{bynder_media:a,$:p?.media})}),d&&(0,F.jsx)(ao,{direction:D,depth:m,color:w,\"aria-hidden\":\"true\"}),(0,F.jsx)(so,{justifyContent:f,children:(0,F.jsxs)(lo,{textAlign:g,children:[(0,F.jsx)(Qr,{brandcaption:i,title:t,subtitle:n,body:r,isEditing:x,editTags:p,textColor:T}),o&&(0,F.jsx)(co,{className:xt,children:(0,F.jsx)(ee,{...o,parent$:o.$?.buttons__0??p?.button??{},alignment:g,isEditing:x})})]})})]})},uo=Qi;\n","export * from './text';\nexport * from './image';\nexport * from './marketing-banner';\nexport * from './spacing-divider';\nexport * from './carousel';\nexport * from './column-control';\nexport * from './content-card';\nexport * from './hero-banner';\nexport * from './button';\nexport * from './rich-text';\nexport * from './bynder-media';\n","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 full_width?: boolean;\n container_background_color?: unknown;\n alignment?: 'left' | 'center' | 'right';\n text_editor: string;\n font_color?: boolean;\n $?: {\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\nconst extractColorFromObject = (obj: any): string | null => {\n const color = obj?.brandColor?.colorObj?.light ?? obj?.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 {\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 fullWidth={full_width} bgColor={backgroundColor} alignment={alignment} color={fontColor}>\n <div dangerouslySetInnerHTML={{ __html: updatedHtml }} {...$?.text_editor} />\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) {\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};","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(\n () => getGenomeColor(theme, 'N10', toggleValue ? 'light' : 'dark'),\n [toggleValue, theme]\n );\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 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) {\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) {\n const imageType = selectedImage?.imageType ?? 'transformBaseUrl';\n const fileSource = fileMeta?.[imageType];\n\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 {...imageProps} {...($?.image || {})} />\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', width, height }) => ({\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': { desktop: { fontSize: '44px', lineHeight: '50px' }, mobile: { fontSize: '38px', lineHeight: '44px' }, fontFamily: 'Lora' },\n 'h2': { desktop: { fontSize: '26px', lineHeight: '34px' }, mobile: { fontSize: '24px', lineHeight: '30px' }, fontFamily: 'Lora' },\n 'h3': { desktop: { fontSize: '22px', lineHeight: '28px' }, mobile: { fontSize: '20px', lineHeight: '26px' }, fontFamily: 'Lora' },\n 'body': { desktop: { fontSize: '16px', lineHeight: '22px' }, mobile: { fontSize: '16px', lineHeight: '22px' }, fontFamily: 'Inter' },\n 'disclaimer': { desktop: { fontSize: '12px', lineHeight: '16px' }, mobile: { fontSize: '12px', lineHeight: '16px' }, fontFamily: 'Inter' },\n 'boxquote': { desktop: { fontSize: '16px', lineHeight: '22px' }, mobile: { fontSize: '16px', lineHeight: '22px' }, 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 any).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 ${isBoxquote ? `\n &::before {\n content: '\"';\n }\n &::after {\n content: '\"';\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 { 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 any}\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',\n\n // Layout spacing\n textGap: '1.5rem',\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(255, 255, 255, 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(text: string | undefined, placeholderValue: string, isEditing?: boolean): string | undefined {\n if (isEditing === true && (!text || text === placeholderValue)) {\n return placeholderValue;\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);\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 textAlignment={textAlignment} data-testid={testId}>\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 [hasError, setHasError] = React.useState(false);\n\n // Extract media data from bynder_media synchronously so it works during SSR\n // and when JavaScript is disabled in the browser\n const mediaInfo = React.useMemo(() => extractBynderMedia(bynder_media), [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 bgColor={bgColor} {...($ ?? {})}>\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 bgColor={bgColor} {...($ ?? {})}>\n <PictureElement>\n <SourceElement media=\"(max-width: 768px)\" srcSet={mobileUrl} />\n <SourceElement media=\"(min-width: 769px)\" srcSet={desktopUrl} />\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 bgColor={bgColor} {...($ ?? {})}>\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 (io.includes('width:') && io.includes('height:')) ||\n (url.searchParams.has('width') && url.searchParams.has('height'));\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 try {\n const url = new URL(baseUrl);\n if (!url.searchParams.has('io')) {\n return `${baseUrl}?io=transform:fill&quality=95`;\n }\n return baseUrl;\n } catch (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 (normalized.includes('left') || normalized.includes('right') || \n normalized.includes('top') || normalized.includes('bottom')) {\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 pauseOnHover?: boolean;\n initialIndex?: number;\n}\n\nexport function useCarousel(options: UseCarouselOptions): UseCarouselReturn {\n const { totalSlides, autoRotate = false, rotationInterval = 5000, pauseOnHover = true, 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 isValidUrl,\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 { 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 = isValidUrl(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 position={position} data-button-icon>\n <NsIcon name={IconName} size={iconSize} colorOverride={iconColor} {...($?.icon ?? {})} />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n let 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 alignment={resolvedAlignment} verticalAlignment={resolvedVerticalAlignment}>\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={'hoverText' in variantDefault ? (variantDefault as { hoverText?: string }).hoverText : undefined}\n $underlineColor={'underlineColor' in variantDefault ? (variantDefault as { underlineColor?: string }).underlineColor : undefined}\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 data-button-label {...($?.title ?? {})}>{getLabelText()}</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 React from 'react';\nimport { 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\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)<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';\nexport function getBaseUrl(): string {\n return typeof window !== 'undefined' ? window.location.href : '';\n}\n\nexport function isValidUrl(url?: string): string | undefined {\n return url?.startsWith('/') ? getBaseUrl() + url : url;\n}\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","import React from 'react';\nimport Button from './Button';\nimport {\n ButtonProps,\n ButtonBlockProp\n} from './types';\n\nexport type ButtonWrapperProps = {\n parent$?: Record<string, unknown>;\n alignment?: ButtonProps['alignment'];\n isEditing?: boolean;\n} & Partial<ButtonBlockProp>;\n\nfunction getButtonProps(\n button: ButtonBlockProp | null | undefined,\n): { 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(\n Object.keys(button).length > 0 ? (button as ButtonBlockProp) : null\n );\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 ${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, ButtonsBlock } 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 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\n return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent hasMedia={showMedia} $isNested={isNested}>\n {showMedia && (\n <MediaWrapper>\n <BynderMedia bynder_media={banner?.bynder_media} $={banner?.$?.bynder_media} />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay direction={gradientDirection} depth={gradientDepth} color={gradientColor} />\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$={\n (banner?.cta_button as ButtonsBlock).$?.buttons__0 \n ?? banner?.$?.cta_button \n ?? {}\n }\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 pauseOnHover: true,\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 currentIndex={carousel.currentIndex} totalSlides={banners.length}>\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>(\n ({ 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\n const v = verticalScaleMap[vertical_padding];\n\n return {\n display: 'flex',\n flexDirection: 'column',\n alignItems: divider_alignment === 'center' ? 'center' : divider_alignment === 'right' ? 'flex-end' : 'flex-start',\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);\n\nexport const StyledDividerLine = styled('div')<StyledDividerProps>(\n ({ divider_style, divider_thickness_px, divider_color, divider_gradient, divider_width_percent }) => {\n const base: Record<string, any> = {\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 = `repeating-linear-gradient(90deg, black 0px, black ${dashLength}px, ` +\n `transparent ${dashLength}px, transparent ${dashLength + gapLength}px)`;\n base.WebkitMaskImage = `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%, ` +\n `black 99%, transparent 100%)`;\n base.WebkitMaskImage = `radial-gradient(circle ${radius}px at 50% 50%, ` +\n `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)\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};","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 finalDividerColor = isValidHex(divider_color) ? divider_color! : DEFAULT_HEX;\n const divider_gradient = gradientPresetCss(divider_gradient_preset, finalDividerColor);\n\n return (\n <StyledSpacingContainer vertical_padding={vertical_padding} divider_alignment={divider_alignment}>\n {divider_style !== 'none' && (\n <StyledDividerLine\n divider_style={divider_style}\n divider_thickness_px={divider_thickness_px}\n divider_color={finalDividerColor}\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 {\n CarouselContainer,\n InnerWrapper,\n Slider,\n ArrowButton,\n EmptyPlaceholder\n} 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 slidesLength,\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 ${slidesToShow}`}\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 ref={sliderRef} {...sliderSettings} key={carouselKey}>\n {hasSlides && renderSlides()}\n {isEditing &&\n (hasSlides\n ? slidesLength < slidesToShow &&\n Array.from({ length: slidesToShow - slidesLength }).map((_, offset) =>\n renderEmptySlot(slidesLength + offset)\n )\n : Array.from({ length: slidesToShow }).map((_, index) => renderEmptySlot(index)))}\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 {\n unwrapComponent\n} 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 =\n presetColumns === 1\n ? '100%'\n : `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 stackedItemHeight={stackedItemHeight} stackedItemMaxHeight={stackedItemMaxHeight}>\n <SlideContentInner>\n {renderSlide(slide, index)}\n </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 emptyBlockParentClass?: string;\n text?: string;\n totalSlides?: number;\n $?: 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 | 'three-small-medium-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?: any;\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 | 'three-small-medium-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 'three-small-medium-large':\n return 3;\n case 'four-equal':\n return 4;\n default:\n return 1;\n }\n}\n","import React from 'react';\n\nimport type { CarouselProps } from './types';\nimport { DEVICE_SIZES } from './types';\nexport { getPresetColumns } from '../utils/viewportLayoutUtils';\n\nexport function unwrapComponent<T>(mod: T): any {\n if (!mod || typeof mod === 'function') return mod;\n return (typeof mod === 'object' && (mod as any).default) ? (mod as any).default : 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 === 'three-small-medium-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 === 'three-small-medium-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 React, { 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 = window.getComputedStyle(el);\n const pl = parseFloat(style.paddingLeft) || 0;\n const pr = 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\n const responsiveSettings = useMemo(\n () =>\n buildCarouselResponsiveSettings({\n presetColumns,\n slidesLength: slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n }),\n [\n presetColumns,\n slides.length,\n isEditing,\n shouldShowDots,\n isVariableWidth\n ]\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 slidesLength: slides.length,\n goToPrevious,\n goToNext,\n containerRef\n };\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(\n typeof window !== 'undefined' ? window.innerWidth : 0\n );\n\n const [carouselKey, setCarouselKey] = useState(\n `carousel-${preset}-${slideCount}-${Date.now()}`\n );\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\n","import React, { useMemo } from 'react';\n\nimport * as Styled from './ColumnControl.styled';\nimport { \n EmptyPlaceholder, \n getGridDimensions, \n getMaxChildrenForLayout, \n mapPresetToGridLayout \n} from './utils';\nimport { \n getGapPx, \n MAX_SLIDE_HEIGHT_PX, \n type ColumnControlProps, \n type ColumnControlGridLayout \n} 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 preset,\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 =\n layout ?? mapPresetToGridLayout(preset);\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]\n .filter(Boolean)\n .join(' ');\n const containerHeight = height ?? 'auto';\n\n const addSlideEditTags = useMemo(\n () => ({\n ...($?.['slides'] ?? {}),\n ...($?.['slides__parent'] ?? {}),\n 'data-add-direction': 'horizontal'\n }),\n [$]\n );\n\n const flexBasis =\n columns === 1\n ? '100%'\n : `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 {...addSlideEditTags}\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 '@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});","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 =\n | '2x1'\n | '3x1'\n | '4x1'\n | '2x2'\n | '3x2'\n | '4x2';\n\nexport type SlidePreset =\n | 'single-full'\n | 'two-equal'\n | 'two-small-large'\n | 'three-equal'\n | 'three-small-medium-large'\n | 'four-equal';\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 /** Preset-based sizing is deprecated. Use ColumnControl (grid) with layout. */\n preset?: SlidePreset;\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 preset: SlidePreset;\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\n// Minimum slide width (in px) for non-variable width presets (CMS-friendly default)\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, SlidePreset } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS, MAX_SLIDE_HEIGHT_PX } from './types';\nimport { getPresetColumns } from '../utils/viewportLayoutUtils';\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 =\n 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 function mapPresetToGridLayout(preset: SlidePreset | undefined): ColumnControlGridLayout {\n switch (preset) {\n case 'four-equal':\n return '4x1';\n case 'three-equal':\n case 'three-small-medium-large':\n return '3x1';\n case 'two-equal':\n case 'two-small-large':\n return '2x1';\n case 'single-full':\n default:\n return '2x1';\n }\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items'\n}) =>\n React.createElement(\n EmptyPlaceholderWrapper as React.ComponentType<any>,\n { className: emptyBlockParentClass },\n text\n );\n\nexport { getPresetColumns };\n\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 ul,\n ol {\n list-style-position: outside;\n list-style-type: disc;\n margin: 0.5em 0;\n padding-left: 1.25em;\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 margin-top: 16px;\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 overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: none;\n`;\n","import type { ButtonBlockProp, ButtonProps, ButtonsEntry } from '../../button/types';\nimport type { ContentAlignment, CtaStyle, LinkTarget, ContentCardProps } from '../types';\nimport { MAX_MEDIA_HEIGHT_PX } from '../constants';\nimport { extractBynderMedia } from '../../bynder-media';\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 const getTitle = (title: string, isEditing: boolean) => {\n if (title) return title;\n if (isEditing) return 'Enter Title';\n return '';\n};\n\nexport function normalizeContentAlignment(\n alignment?: string | null\n): 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 resolveTarget(target?: 'Yes' | 'No' | null): LinkTarget | undefined {\n if (target === 'Yes') {\n return '_blank';\n }\n return '_self';\n}\n\nexport function getCtaState(\n cta: ButtonBlockProp | undefined,\n ctaStyle: ContentCardProps['cta_style']\n) {\n const ctaStyleNormalized = normalizeCtaStyle(ctaStyle);\n const effectiveCta = getEffectiveCta(cta);\n\n const hasCtaHref = Boolean(effectiveCta?.url);\n const hasCtaLabel = Boolean(effectiveCta?.title);\n\n const isCardLink =\n ctaStyleNormalized === 'card' && hasCtaHref && !hasCtaLabel;\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 =\n Boolean(mediaInfo?.type === 'image' && (mediaInfo?.imageFit ?? 'cover') === 'none');\n\n const useFixedMediaHeight =\n media &&\n !isInlineMedia &&\n (mediaInfo?.type === 'image' || mediaInfo?.type === 'video');\n const mediaHeightValue = useFixedMediaHeight ? MAX_MEDIA_HEIGHT_PX : undefined;\n const mediaMaxHeightValue =\n media && !isInlineMedia && !mediaHeightValue ? MAX_MEDIA_HEIGHT_PX : undefined;\n\n return {\n mediaInfo,\n isInlineMedia,\n mediaHeightValue,\n mediaMaxHeightValue\n };\n}\n","import { ReactElement, useMemo } from 'react';\nimport DOMPurify from 'dompurify';\nimport CsText, { resolveBackgroundColor } from '../text/CsText';\nimport type { ComponentProps } from 'react';\nimport { RichTextWrapper, RichTextInner } from './RichText.styled';\n\ntype CsTextProps = ComponentProps<typeof CsText>;\n\ninterface RichTextProps extends Omit<CsTextProps, 'text_editor' | 'font_color'> {\n text_editor: string;\n font_color?: 'Light' | 'Dark';\n container_alignment?: 'left' | 'center' | 'right';\n container_vertical_alignment?: 'top' | 'center' | 'bottom';\n container_width?: 100 | 75 | 50 | 25;\n container_background_color?: string;\n}\n\n/**\n * Sanitization configuration for allowed tags and attributes\n * Following Contentstack Rich Text Editor restricted toolbar guidelines\n */\nconst SANITIZATION_CONFIG = {\n 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 'ul',\n 'ol',\n 'li',\n 'blockquote'\n ],\n 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/**\n * Sanitize HTML using DOMPurify\n * Removes dangerous content while preserving allowed tags and attributes\n *\n * @param html - Raw HTML content from editor\n * @returns Sanitized HTML safe for rendering\n */\nconst sanitizeHtml = (html: string): string => {\n if (!html || typeof html !== 'string') {\n return '';\n }\n\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: SANITIZATION_CONFIG.ALLOWED_TAGS,\n ALLOWED_ATTR: SANITIZATION_CONFIG.ALLOWED_ATTR,\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\nconst 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\nconst 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 * 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 // Memoize sanitized HTML to avoid recalculation on every render\n const sanitizedHtml = useMemo(() => {\n if (!text_editor || typeof text_editor !== 'string' || !text_editor.trim()) {\n return '';\n }\n return sanitizeHtml(text_editor);\n }, [text_editor]);\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 from 'react';\nimport { Buttons as Button, ButtonBlockProp, ButtonsBlock } from '../button';\nimport { ContentCardProps } from './types';\nimport {\n Card,\n MediaWrapper,\n Content,\n CtaWrapper,\n ContentInner,\n RichTextWrapper\n} from './ContentCard.styled';\nimport { Typography } from '../typography';\nimport {\n getTitle,\n normalizeContentAlignment,\n getCtaState,\n getMediaLayout,\n normalizeCtaStyle\n} from './utils/helpers';\nimport { DEFAULT_MAX_HEIGHT } from './constants';\nimport { BynderMedia } from '../bynder-media';\nimport { RichTextComponent } from '../rich-text';\n\nfunction CardTextBlock({\n title,\n subtitle,\n body,\n contentTitle,\n editTags,\n alignment\n}: Readonly<{\n title: string | undefined;\n subtitle: string;\n body: ContentCardProps['body'];\n contentTitle: string;\n editTags: ContentCardProps['$'];\n alignment: 'left' | 'center' | 'right';\n}>) {\n const bodyHtml = typeof body === 'string' ? body : '';\n \n return (\n <ContentInner data-testid=\"card-content-inner\">\n {title ? (\n <Typography\n variant=\"h3\"\n inputText={contentTitle}\n color=\"inherit\"\n {...(editTags?.title ?? {})}\n />\n ) : null}\n {subtitle ? (\n <Typography\n variant=\"body\"\n inputText={subtitle}\n color=\"inherit\"\n {...(editTags?.subtitle ?? {})}\n />\n ) : null}\n {bodyHtml ? (\n <RichTextWrapper>\n <RichTextComponent\n text_editor={bodyHtml}\n alignment={alignment}\n full_width={true}\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}: Readonly<{\n show: boolean;\n cta: ButtonBlockProp | undefined;\n alignment: 'left' | 'center' | 'right';\n isEditing: boolean;\n editTags: ContentCardProps['$'];\n}>) {\n if (!show || !cta) return null;\n const buttonParent$ : Record<string, unknown> = \n { ...(cta as ButtonsBlock).buttons?.[0]?.$?.button ?? {}, ...(editTags?.button ?? {}) };\n return (\n <CtaWrapper data-testid=\"card-cta-wrapper\">\n <Button {...cta} parent$={buttonParent$} alignment={alignment} isEditing={isEditing} />\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 {\n ctaStyleNormalized,\n effectiveCta,\n isCardLink,\n showButton,\n cardTarget\n } = getCtaState(activeCta, normalizedStyle);\n\n const contentTitle = getTitle(title ?? '', isEditing);\n const { mediaInfo, isInlineMedia, mediaHeightValue, mediaMaxHeightValue } = getMediaLayout(media);\n\n const cardAs = isCardLink ? 'a' : 'article';\n const cardLinkProps = isCardLink\n ? { href: effectiveCta?.url ?? '', target: cardTarget }\n : {};\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 ? <BynderMedia bynder_media={media} $={$?.media} /> : null}\n </MediaWrapper>\n\n <Content data-testid=\"card-content\">\n <CardTextBlock\n title={title}\n subtitle={subtitle}\n body={body}\n contentTitle={contentTitle}\n editTags={$}\n alignment={alignment}\n />\n <CardCtaBlock\n show={showButton}\n cta={activeCta}\n alignment={alignment}\n isEditing={isEditing}\n editTags={$}\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\n","import React from 'react';\nimport { Typography } from '../../typography';\nimport {\n PLACEHOLDER_BRAND_CAPTION,\n PLACEHOLDER_TITLE,\n PLACEHOLDER_SUBTITLE,\n PLACEHOLDER_BODY\n} 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 brandcaption?: string;\n title?: string;\n subtitle?: string;\n body?: string;\n isEditing: boolean;\n editTags?: Record<string, unknown>;\n textColor?: TextColor;\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 let displayValue = field.value;\n if (!isEditing && field.value !== field.placeholder) {\n displayValue = field.value;\n } else if (field.value === '') {\n displayValue = field.placeholder;\n }\n\n const color = textColor === 'white' ? '#FFFFFF' : '#1D1D1B';\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')`\n width: 100%;\n position: relative;\n min-height: 500px;\n overflow: hidden;\n\n .hero-title, .subtitle, .brand-caption, .body {\n margin-bottom: 4px;\n }\n\n @media ${MOBILE_BREAKPOINT} {\n min-height: 400px;\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 = (\n direction: string,\n depth: GradientDepth,\n color: 'black' | 'white'\n): 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\n// Overlay\n\nexport const Overlay = styled.div<{ justifyContent?: string }>`\n position: absolute;\n inset: 0;\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: 400px;\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 = (\n alignment: 'left' | 'center' | 'right'\n) => {\n if (alignment === 'center') return 'center';\n if (alignment === 'right') return 'flex-end';\n return 'flex-start';\n};\n","\nexport 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\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 } 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\n return (\n <Container\n className={className}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {media && (\n <MediaLayer>\n <BynderMedia bynder_media={media} $={$?.media} />\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 justifyContent={justifyContent}>\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$={\n (button as ButtonsBlock).$?.buttons__0 ??\n $?.button ??\n {}\n }\n alignment={resolvedContentAlignment}\n isEditing={isEditing}\n />\n </ButtonWrapper>\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n"]}