@nuskin/marketing-components 1.18.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/spacing-divider/types.d.ts +14 -14
- package/package.json +1 -1
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/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/marketing-banner/components/BannerMedia.tsx","../src/marketing-banner/components/BannerMedia.styled.tsx","../src/marketing-banner/components/BannerCTA.styled.tsx","../src/marketing-banner/components/BannerCTA.tsx","../src/marketing-banner/hooks/useCarousel.ts","../src/marketing-banner/hooks/useReducedMotion.ts","../src/marketing-banner/types.ts","../src/marketing-banner/MarketingBanner.styled.tsx","../src/marketing-banner/MarketingBanner.tsx","../src/utils/bynder-utils.ts","../src/marketing-banner/utils/transform.ts","../src/spacing-divider/SpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/SpacingDivider.tsx","../src/column-control/ColumnControl.tsx","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/column-control/hooks/useColumnControlResize.ts","../src/button/Button.tsx","../src/button/Button.styled.tsx","../src/button/helpers.ts","../src/hero-banner/components/Typography.tsx","../src/hero-banner/constants.ts","../src/hero-banner/components/TypographyFields.tsx","../src/hero-banner/components/Media.tsx","../src/hero-banner/HeroBanner.styled.tsx","../src/hero-banner/helpers.ts","../src/hero-banner/HeroBanner.tsx","../src/rich-text/RichText.tsx"],"names":["On","Object","create","xe","defineProperty","Nn","getOwnPropertyDescriptor","Gn","getOwnPropertyNames","Un","getPrototypeOf","Fn","prototype","hasOwnProperty","Wn","e","t","r","get","enumerable","gt","n","i","call","B","__esModule","value","Hn","index_exports","__export","Button","Button_default","ColumnControl","ColumnControl_default","CsImage","CsImage_default","CsTextComponent","CsText_default","DEFAULT_BANNER_CONFIG","DEFAULT_CAROUSEL_CONFIG","DEFAULT_ROTATION_INTERVAL","DEVICE_SIZES","GAP_PRESET_VALUES","HeroBanner","HeroBanner_default","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","MAX_SLIDE_HEIGHT_PX","MIN_SLIDE_HEIGHT_PX","MIN_SLIDE_WIDTH_PX","MarketingBanner","MarketingBannerComponent","PLACEHOLDER_VALUES","RichTextComponent","RichText_default","SpacingDivider","SpacingDivider_default","getGapPx","hasCTA","hasMedia","isCarouselMode","transformCSMarketingBanner","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","ut","ColorUtils","getGenomeColor","ft","useToggleFontColor","toggleValue","theme","mt","useTheme","ht","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","ye","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","bt","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","De","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","xt","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","Oe","className","Tt","NsImage","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","rotationInterval","header","subtitle","BREAKPOINTS","mobile","tablet","desktop","wide","FONT_STACKS","lora","inter","FONT_SIZES","cta","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","responsiveFontSize","sizes","I","css","centerOnMobile","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","te","textAlignment","HeaderText","p","Title","h2","Subtitle","h3","BodyText","getDisplayText","placeholderValue","isVisualBuilderContext","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","Z","jsxs","header_text","body_text","MediaContainer","j","StyledImage","img","StyledVideo","video","FallbackMessage","PictureElement","picture","SourceElement","source","BannerMedia","mediaUrl","fallbackMediaUrl","mediaAlt","onError","isResponsive","desktopUrl","mobileUrl","ve","React","useState","currentUrl","setCurrentUrl","hasError","setHasError","useEffect","handleMediaError","renderMedia","L","autoPlay","muted","loop","playsInline","bynder_media","srcSet","loading","darkVariant","Ve","lightVariant","CTALink","Dt","a","variant","BannerCTA","ctaLabel","ctaDestination","onClick","Nt","useReducedMotion","Ee","prefersReducedMotion","setPrefersReducedMotion","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","pauseOnHover","initialIndex","w","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","useCallback","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","Array","isArray","banners","banner","BannerContainer","k","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","CarouselControls","Indicator","button","active","renderBanner","componentTestId","showMedia","showCTA","baseTestId","resolvedTextColor","gradientColor","gradientDirection","v","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","getMediaUrl","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParam","searchParams","updatedIo","push","origin","error","addDefaultTransform","has","extractBynderMedia","mediaJson","firstImage","toLowerCase","endsWith","result","transformCSBanner","csData","mediaData","label","cta_label","cta_destination","cta_variant","content_position","text_color","show_gradient","gradient_depth","rotation_interval","THICKNESS_PX","thin","medium","thick","ultra","StyledSpacingContainer","Je","paddingVertical","dividerAlign","none","small","large","flexDirection","alignItems","paddingTop","paddingBottom","StyledDividerLine","dividerStyle","dividerThicknessPx","dividerColor","dividerGradient","dividerWidthPercent","base","Math","max","min","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","dividerThickness","dividerGradientPreset","finalDividerColor","qe","import_react_slick","gap","ULTRA_SMALL","EXTRA_SMALL","SMALL","MEDIUM","LARGE","EXTRA_LARGE","ULTRA_LARGE","SUPER_LARGE","ColumnControlContainer","M","columnHeight","maxColumnHeight","textAlign","padding","boxSizing","overflow","minHeight","margin","maxHeight","bottom","listStyle","li","borderRadius","border","textIndent","cursor","transition","TabletGridContainer","flexWrap","SlideSection","useFlexLayout","stackedVerticalGap","stackedItemHeight","stackedItemMaxHeight","slideWidth","flexBasis","isVariableWidth","flex","minWidth","SlideInner","SlideContentInner","ArrowButton","top","transform","zIndex","fontSize","lineHeight","verticalAlign","outline","outlineOffset","opacity","InnerWrapper","EmptyPlaceholderWrapper","unwrapComponent","mod","EmptyPlaceholder","emptyBlockParentClass","cr","createElement","getPresetColumns","isVariableWidthPreset","windowWidth","getVariableSlideWidth","pos","getSlidesToShowByViewport","presetColumns","getSlidesForRender","isGridLayout","isStackedViewport","isTabletGridViewport","gridSlides","slidesToShow","buildResponsiveSettings","presetSlidesToShow","shouldShowDots","gridSlidesToShow","maxCols","carouselSlidesToShow","breakpoint","settings","slidesToScroll","swipeToSlide","arrows","dots","variableWidth","useColumnControlResize","slideCount","le","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","import_slick","import_slick_theme","Slider","Tr","SliderImport","getViewportLayoutState","gapPx","containerHeight","getSlidesMeta","slides","effectiveShowPagination","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","slide","slideId","id","slideKey","String","T","GridLayoutContent","renderSlides","sliderRef","finalSettings","ot","ref","layout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","effectiveFullWidth","ne","effectiveAutoplayEnabled","showArrowsOnDesktop","responsiveSettings","infinite","speed","autoplay","autoplaySpeed","swipe","draggable","beforeChange","_","next","responsive","useRef","current","slickPrev","slickNext","containerClassName","slides__parent","Fragment","ROUNDED_BORDER_RADIUS","REL_NOOPENER_NOREFERRER","PROTOCOL_HTTP","PROTOCOL_HTTPS","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","isValidDestination","dest","protocol","resolveTarget","target","resolveDisabled","disabled","iconAliasMap","arrow","resolveIconName","iconName","variantDefaults","primary","bg","hover","pressed","disabledBg","disabledText","focusRing","secondary","widthBySize","DEFAULT_BUTTON_WIDTH","getButtonWidth","size","iconSizeByButtonSize","DEFAULT_ICON_SIZE","getIconSize","BUTTON_GAP","BUTTON_MIN_WIDTH","BUTTON_MIN_HEIGHT","DESKTOP_BREAKPOINT","TABLET_BREAKPOINT","MOBILE_BREAKPOINT","DESKTOP_FONT_SIZE","TABLET_FONT_SIZE","MOBILE_FONT_SIZE","DESKTOP_PADDING","TABLET_PADDING","MOBILE_PADDING","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","pe","StyledButton","Fr","NsButton","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$buttonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","open_in_new_tab","button_size","buttonType","buttontype","icon","iconposition","iconPosition","button_state","placeholderText","placeholder_text","resolvedVariant","resolvedSize","resolvedAlignment","resolvedIconPosition","resolvedButtonType","resolvedUrl","hrefProp","variantDefault","buttonWidth","resolvedTarget","resolvedDisabled","buttonBorder","IconName","isValidNsIcon","$e","NsIconVariants","iconSize","renderIcon","iconColor","Y","NsIcon","name","colorOverride","getLabelText","labelTitle","$variant","rel","Typography","placeholder","typographyProps","displayValue","Zr","Kr","NsTypography","PLACEHOLDER_BRAND_CAPTION","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","ARIA_LABEL_HERO_BANNER","IMAGE_LOADING_LAZY","getTypographyFields","brandcaption","noSpacing","editTagKey","weight","TypographyFields","editTags","fields","ce","field","additionalProps","Q","GRADIENT_OPACITIES","getGradientBackground","Overlay","Content","FULL_SIZE_PERCENT","isMediaObject","parseMedia","extracted","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","resolveWidth","widthStr","resolveHeight","heightStr","getGradientColor","gradientDirectionMap","getGradientDirection","isFullSize","mediaWidth","mediaHeight","getImageProps","style","Media","parsedMedia","mediaAttributes","fullSize","renderImage","commonImageProps","O","lt","mediaContent","preload","class_name","content_alignment","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","shouldRenderButton","N","import_dompurify","SANITIZATION_CONFIG","ALLOWED_TAGS","ALLOWED_ATTR","sanitizeHtml","wn","DOMPurify","sanitize","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","RichText","restProps","sanitizedHtml","Rn","fontColorBoolean","In"],"mappings":"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","sourcesContent":["\"use strict\";var On=Object.create;var xe=Object.defineProperty;var Nn=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Un=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty;var Wn=(e,t)=>{for(var r in t)xe(e,r,{get:t[r],enumerable:!0})},gt=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of Gn(t))!Fn.call(e,i)&&i!==r&&xe(e,i,{get:()=>t[i],enumerable:!(n=Nn(t,i))||n.enumerable});return e};var B=(e,t,r)=>(r=e!=null?On(Un(e)):{},gt(t||!e||!e.__esModule?xe(r,\"default\",{value:e,enumerable:!0}):r,e)),Hn=e=>gt(xe({},\"__esModule\",{value:!0}),e);var Si={};Wn(Si,{Button:()=>Ie,ColumnControl:()=>Cr,CsImage:()=>St,CsTextComponent:()=>Te,DEFAULT_BANNER_CONFIG:()=>uo,DEFAULT_CAROUSEL_CONFIG:()=>mo,DEFAULT_ROTATION_INTERVAL:()=>fo,DEVICE_SIZES:()=>x,GAP_PRESET_VALUES:()=>et,HeroBanner:()=>vn,MAX_ALLOWED_COLUMN_CONTROL_ITEMS:()=>re,MAX_SLIDE_HEIGHT_PX:()=>nt,MIN_SLIDE_HEIGHT_PX:()=>Ro,MIN_SLIDE_WIDTH_PX:()=>rt,MarketingBanner:()=>Qe,PLACEHOLDER_VALUES:()=>ee,RichTextComponent:()=>$n,SpacingDivider:()=>rr,getGapPx:()=>tt,hasCTA:()=>Ye,hasMedia:()=>je,isCarouselMode:()=>Ze,transformCSMarketingBanner:()=>Yt});module.exports=Hn(Si);var ye=require(\"react\"),bt=B(require(\"@emotion/styled\"));var Yn=require(\"react\");var Vn=\"{%language}\",zn=\"{%LANGUAGE}\",Kn=\"{%region}\",Xn=\"{%REGION}\",Pe=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(Kn,t.region),e=e.replace(Xn,t.region.toUpperCase())),t.language&&(e=e.replace(Vn,t.language),e=e.replace(zn,t.language.toUpperCase())),e);var _e=\"us\",Le=\"en\";function Zn(e){if(!e?.startsWith?.(\"?\"))return;let t=new URLSearchParams(e),r=t.get(\"region\"),n=t.get(\"language\");if(!(!r&&!n))return{region:r??_e,language:n??Le}}function jn(e){if(!e)return;let t=e.split(\"/\").filter(Boolean);if(t.length<2)return;let[r,n]=t;if(r?.length===2&&n?.length===2)return{region:r,language:n}}var Be=()=>{if(typeof window>\"u\"||!window.location)return{region:_e,language:Le};let{search:e,pathname:t}=window.location;return Zn(e)??jn(t)??{region:_e,language:Le}};var Qn=require(\"react\"),Jn=require(\"@mui/material\"),ut=require(\"@nuskin/foundation-theme\"),{getGenomeColor:$i}=ut.ColorUtils;var mt=require(\"@mui/material\"),ft=require(\"@nuskin/foundation-theme\"),ht=require(\"react\"),{getGenomeColor:qn}=ft.ColorUtils,eo=(e=!1)=>{let t=(0,mt.useTheme)();return(0,ht.useMemo)(()=>qn(t,\"N10\",e?\"light\":\"dark\"),[e,t])},Me=eo;var De=require(\"react/jsx-runtime\"),to=()=>(0,ye.useMemo)(()=>Be(),[]),ro=(e,t)=>!t||!e?e:Pe(e,t),no=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let n=new DOMParser().parseFromString(e,\"text/html\");return n.querySelectorAll(\"a\").forEach(i=>{let o=i.getAttribute(\"href\");o&&i.setAttribute(\"href\",ro(o,t))}),n.body.innerHTML},oo=bt.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`,io=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},ao=e=>{try{let r=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof r==\"string\"&&r.trim()?r:null}catch{return null}},so=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return io(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?ao(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},lo=({full_width:e=!1,container_background_color:t,alignment:r=\"left\",text_editor:n,font_color:i=!1,$:o})=>{let s=Me(i),a=to(),l=(0,ye.useMemo)(()=>so(t),[t]),d=(0,ye.useMemo)(()=>no(n,a),[n,a]);return n?(0,De.jsx)(oo,{fullWidth:e,bgColor:l,alignment:r,color:s,children:(0,De.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:d},...o?.text_editor})}):null},Te=lo;var Tt=require(\"@nuskin/foundation-ui-components\");var xt=require(\"@nuskin/foundation-theme\"),yt=(0,xt.styled)(\"div\")(({image_alignment:e=\"center\",width:t,height:r})=>({display:\"flex\",justifyContent:{left:\"flex-start\",right:\"flex-end\",center:\"center\"}[e],\"& img\":{maxWidth:\"fit-content\",objectFit:\"contain\",objectPosition:\"center\"}}));var Oe=require(\"react/jsx-runtime\"),po=\"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>`),co=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],go=e=>{let{image_alignment:t=\"center\",image:r,parent$:n,isEditing:i,$:o,...s}=e,a=null,l=null,d=null;try{let u=typeof r==\"string\"?JSON.parse(r):r,p=u?.image?.[0];p?.selected||p?.files?(a=p?.selected,l=p?.files):u?.url&&(d=u)}catch(u){console.warn(\"[CsImage] Failed to parse image prop:\",u)}let g=po,c=\"Image not available\",m=\"100%\",b=\"100%\";if(a||l){let u=a?.imageType??\"transformBaseUrl\",p=l?.[u];p?.url&&(g=p.url,c=a?.altText??\"Image\",m=a?.width??\"100%\",b=a?.height??\"100%\")}else d?.url&&(g=d.url,c=d.title||d.filename||\"Image\");let f={src:g,alt:c,width:m,height:b};co.forEach(u=>{s[u]!==void 0&&(f[u]=s[u])});let E=s?.full_width?\"container !p-0\":\"\";return(0,Oe.jsx)(yt,{image_alignment:t,width:f.width,height:f.height,className:E,children:(0,Oe.jsx)(Tt.NsImage,{...f,...o?.image||{}})})},St=go;var uo={position:\"left\",textColor:\"white\",showGradient:!1,gradientDepth:\"md\",mediaType:\"image\",ctaVariant:\"dark\"},mo={rotationInterval:5e3},fo=5e3,ee={header:\"Enter Header\",title:\"Enter Title\",subtitle:\"Enter Subtitle\",body:\"Enter Body Text\"};var te=B(require(\"@emotion/styled\"));var H={mobile:0,tablet:768,desktop:1024,wide:1440},V={lora:\"'Lora', Georgia, 'Times New Roman', serif\",inter:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\"},z={header:{mobile:\"12px\",tablet:\"14px\",desktop:\"14px\",wide:\"16px\"},title:{mobile:\"24px\",tablet:\"32px\",desktop:\"40px\",wide:\"48px\"},subtitle:{mobile:\"16px\",tablet:\"18px\",desktop:\"20px\",wide:\"22px\"},body:{mobile:\"14px\",tablet:\"16px\",desktop:\"18px\",wide:\"20px\"},cta:{mobile:\"18px\",tablet:\"22px\",wide:\"24px\"}},C={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\"},K={bannerHeightDesktop:\"600px\",bannerHeightMobile:\"400px\",textMaxWidth:\"600px\",indicatorSize:\"12px\",indicatorBorder:\"2px\"},h={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\"},Ct={white:h.textWhite,dark:h.textDark},_={fast:\"0.1s ease\",default:\"0.3s ease\",slow:\"0.6s cubic-bezier(0.4, 0, 0.2, 1)\"},ae={background:0,media:0,gradient:1,content:2,controls:3},R={tablet:`@media (min-width: ${H.tablet+1}px) and (max-width: ${H.desktop-1}px)`,desktop:`@media (min-width: ${H.desktop}px) and (max-width: ${H.wide-1}px)`,wide:`@media (min-width: ${H.wide}px)`,mobileAndBelow:`@media (max-width: ${H.tablet}px)`,desktopAndUp:`@media (min-width: ${H.desktop}px)`};var I=require(\"@emotion/react\");var X=e=>I.css`\n font-size: ${e.mobile};\n\n ${R.tablet} {\n font-size: ${e.tablet||e.mobile};\n }\n ${R.desktop} {\n font-size: ${e.desktop||e.tablet||e.mobile};\n }\n ${R.wide} {\n font-size: ${e.wide||e.desktop||e.tablet||e.mobile};\n }\n`,vt=I.css`\n ${R.mobileAndBelow} {\n text-align: center;\n }\n`,Et=(e=[\"background-color\",\"color\",\"border-color\",\"transform\",\"text-decoration\"])=>I.css`\n transition: ${e.map(t=>`${t} ${_.default}`).join(\", \")};\n`;var Se=I.css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`,Qi=I.css`\n ${Se}\n width: 100%;\n height: 100%;\n`,Rt=I.css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`,wt=I.css`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ji=I.css`\n margin: 0;\n padding: 0;\n`;var Ne=(e,t,r,n)=>I.css`\n background: linear-gradient(${e}, rgba(${n}, ${t}), rgba(${n}, ${r}));\n`,Ge=(e,t,r)=>I.css`\n background: radial-gradient(circle, rgba(${r}, ${e}), rgba(${r}, ${t}));\n`;var $t=te.default.div`\n text-align: ${({textAlignment:e})=>e};\n ${vt}\n`,It=te.default.p`\n margin: ${C.headerMargin};\n font-weight: 500;\n font-family: ${V.inter};\n color: ${({fontColor:e})=>e};\n letter-spacing: 0.05em;\n ${X(z.header)}\n`,kt=te.default.h2`\n margin: ${C.titleMargin};\n font-weight: 700;\n font-family: ${V.lora};\n color: ${({fontColor:e})=>e};\n ${X(z.title)}\n`,At=te.default.h3`\n margin: ${C.subtitleMargin};\n font-weight: 600;\n font-family: ${V.inter};\n color: ${({fontColor:e})=>e};\n ${X(z.subtitle)}\n`,_t=te.default.p`\n margin: ${C.bodyMargin};\n line-height: 1.6;\n font-family: ${V.inter};\n color: ${({fontColor:e})=>e};\n ${X(z.body)}\n`;var Z=require(\"react/jsx-runtime\");function Ce(e,t,r){if(r===!0&&(!e||e===t))return t;if(!(r===!1&&e===t))return e}function Ue({headerText:e,title:t,subtitle:r,bodyText:n,textColor:i=\"#ffffff\",textAlignment:o=\"left\",testId:s,$:a,isVisualBuilderContext:l}){let d=Ce(e,ee.header,l),g=Ce(t,ee.title,l),c=Ce(r,ee.subtitle,l),m=Ce(n,ee.body,l);return!d&&!g&&!c&&!m?null:(0,Z.jsxs)($t,{textAlignment:o,\"data-testid\":s,children:[d&&(0,Z.jsx)(It,{fontColor:i,...a?.header_text??{},children:d}),g&&(0,Z.jsx)(kt,{fontColor:i,...a?.title??{},children:g}),c&&(0,Z.jsx)(At,{fontColor:i,...a?.subtitle??{},children:c}),m&&(0,Z.jsx)(_t,{fontColor:i,...a?.body_text??{},children:m})]})}var ve=B(require(\"react\"));var j=B(require(\"@emotion/styled\"));var Lt=j.default.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`,Fe=j.default.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,Pt=j.default.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,Bt=j.default.div`\n ${wt}\n width: 100%;\n height: 100%;\n background-color: ${h.fallbackBg};\n color: ${h.textGray};\n font-size: 14px;\n`,Mt=j.default.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,We=j.default.source`\n display: block;\n`;var L=require(\"react/jsx-runtime\");function He({mediaUrl:e,fallbackMediaUrl:t,mediaType:r=\"image\",mediaAlt:n=\"\",onError:i,testId:o,$:s,isResponsive:a,desktopUrl:l,mobileUrl:d}){let[g,c]=ve.default.useState(e),[m,b]=ve.default.useState(!1);ve.default.useEffect(()=>{c(e),b(!1)},[e]);let f=()=>{t&&g!==t?c(t):b(!0),i?.()},E=()=>m&&!t?(0,L.jsx)(Bt,{}):r===\"video\"?(0,L.jsx)(Pt,{src:g,onError:f,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,\"data-testid\":`${o}-video`,...s?.bynder_media??{}}):a&&d&&l?(0,L.jsxs)(Mt,{children:[(0,L.jsx)(We,{media:\"(max-width: 768px)\",srcSet:d}),(0,L.jsx)(We,{media:\"(min-width: 769px)\",srcSet:l}),(0,L.jsx)(Fe,{src:l,alt:n,onError:f,loading:\"lazy\",\"data-testid\":`${o}-image`,...s?.bynder_media??{}})]}):(0,L.jsx)(Fe,{src:g,alt:n,onError:f,loading:\"lazy\",\"data-testid\":`${o}-image`,...s?.bynder_media??{}});return(0,L.jsx)(Lt,{\"data-testid\":o,...s?.bynder_media??{},children:E()})}var Dt=B(require(\"@emotion/styled\")),Ve=require(\"@emotion/react\");var ho=Ve.css`\n background-color: ${h.ctaDark};\n color: ${h.textWhite};\n border: 1px solid ${h.ctaDark};\n\n &:hover {\n background-color: ${h.ctaDark};\n color: ${h.textWhite};\n border-color: ${h.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${h.textWhite};\n outline-offset: 4px;\n }\n`,bo=Ve.css`\n background-color: transparent;\n color: ${h.textDark};\n border: 1px solid ${h.ctaBorder};\n\n &:hover {\n background-color: transparent;\n color: ${h.textDark};\n border-color: ${h.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${h.ctaBorder};\n outline-offset: 4px;\n }\n`,Ot=Dt.default.a`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: ${C.ctaPaddingDesktop};\n text-decoration: none;\n font-family: ${V.lora};\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color ${_.default},\n color ${_.default},\n border-color ${_.default},\n transform ${_.default},\n text-decoration ${_.default};\n\n ${({variant:e})=>e===\"dark\"?ho:bo}\n\n &:active {\n transform: translateY(0);\n }\n\n ${X(z.cta)}\n\n /* Responsive padding */\n ${R.mobileAndBelow} {\n padding: ${C.ctaPaddingTablet};\n }\n\n ${R.wide} {\n padding: ${C.ctaPaddingWide};\n }\n`;var Nt=require(\"react/jsx-runtime\");function ze({ctaLabel:e,ctaDestination:t,variant:r=\"dark\",onClick:n,testId:i,$:o}){return(0,Nt.jsx)(Ot,{href:t,variant:r,onClick:n,\"data-testid\":i,\"aria-label\":e,...o?.cta??{},children:e})}var w=require(\"react\");var Ee=require(\"react\");function Ke(){let[e,t]=(0,Ee.useState)(!1);return(0,Ee.useEffect)(()=>{if(typeof window>\"u\"||!window.matchMedia)return;let r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");t(r.matches);let n=i=>{t(i.matches)};return r.addEventListener(\"change\",n),()=>r.removeEventListener(\"change\",n)},[]),e}function Xe(e){let{totalSlides:t,autoRotate:r=!1,rotationInterval:n=5e3,pauseOnHover:i=!0,initialIndex:o=0}=e,[s,a]=(0,w.useState)(o),[l,d]=(0,w.useState)(!1),g=Ke(),c=(0,w.useCallback)(()=>{a(p=>(p+1)%t)},[t]),m=(0,w.useCallback)(()=>{a(p=>(p-1+t)%t)},[t]),b=(0,w.useCallback)(p=>{p>=0&&p<t&&a(p)},[t]),f=(0,w.useCallback)(()=>{d(!0)},[]),E=(0,w.useCallback)(()=>{d(!1)},[]),u=(0,w.useCallback)(p=>{switch(p.key){case\"ArrowLeft\":p.preventDefault(),m();break;case\"ArrowRight\":p.preventDefault(),c();break;case\"Home\":p.preventDefault(),b(0);break;case\"End\":p.preventDefault(),b(t-1);break}},[c,m,b,t]);return(0,w.useEffect)(()=>{if(!r||l||g)return;let p=setInterval(c,n);return()=>clearInterval(p)},[r,l,g,n,c]),{currentIndex:s,isPaused:l,totalSlides:t,goToNext:c,goToPrevious:m,goToSlide:b,pause:f,resume:E,handleKeyDown:u}}function Ze(e){return Array.isArray(e.banners)&&e.banners.length>1}function je(e){return!!e.mediaUrl}function Ye(e){return!!(e.ctaLabel&&e.ctaDestination)}var k=B(require(\"@emotion/styled\"));var Gt=k.default.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`,Ut=k.default.div`\n position: relative;\n width: 100%;\n`,Ft=k.default.div`\n display: flex;\n transition: transform ${_.slow};\n transform: translateX(-${({currentIndex:e})=>e*100}%);\n`,Wt=k.default.div`\n min-width: 100%;\n position: relative;\n`,Ht=k.default.div`\n position: relative;\n min-height: ${({hasMedia:e})=>e?K.bannerHeightDesktop:\"auto\"};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${R.mobileAndBelow} {\n min-height: ${({hasMedia:e})=>e?K.bannerHeightMobile:\"auto\"};\n }\n`,Vt=k.default.div`\n ${Se}\n z-index: ${ae.media};\n`,zt=k.default.div`\n position: relative;\n z-index: ${ae.content};\n display: flex;\n flex-direction: column;\n gap: ${C.textGap};\n justify-content: center;\n padding: ${C.desktopPadding};\n max-width: ${K.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 ${R.mobileAndBelow} {\n padding: ${C.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n }\n`,Kt=k.default.div`\n ${Se}\n z-index: ${ae.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({direction:e,depth:t,color:r})=>{let n={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:i,end:o}=n[t],s=r===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?Ne(\"to right\",i,o,s):e===\"rightToLeft\"?Ne(\"to left\",i,o,s):e===\"radial\"?Ge(i,o,s):\"\"}}\n\n /* Mobile: Override to always use radial gradient */\n ${R.mobileAndBelow} {\n ${({depth:e,color:t})=>{let r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:n,end:i}=r[e];return Ge(n,i,t===\"black\"?\"0, 0, 0\":\"255, 255, 255\")}}\n }\n`,Xt=k.default.div`\n position: absolute;\n bottom: ${C.carouselGap};\n ${Rt}\n z-index: ${ae.controls};\n display: flex;\n gap: ${C.carouselGap};\n align-items: center;\n\n ${R.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`,Zt=k.default.button`\n width: ${K.indicatorSize};\n height: ${K.indicatorSize};\n border-radius: 50%;\n border: ${K.indicatorBorder} solid ${h.indicatorBorder};\n background-color: ${({active:e})=>e?h.indicatorActive:h.indicatorInactive};\n cursor: pointer;\n padding: 0;\n ${Et([\"all\"])}\n\n &:hover {\n background-color: ${h.indicatorActive};\n transform: scale(1.15);\n }\n`;var v=require(\"react/jsx-runtime\"),xo=(e,t,r,n)=>{let i=je(e),o=Ye(e),s=e.testId??n??\"banner\",a=Ct[e.textColor??\"white\"],l=e.showGradient===!0,d=e.position??\"left\",g=e.textColor===\"dark\"?\"white\":\"black\",c;d===\"left\"?c=\"leftToRight\":d===\"right\"?c=\"rightToLeft\":c=\"radial\";let m;return d===\"center\"?m=\"center\":d===\"right\"?m=\"right\":m=\"left\",(0,v.jsx)(Wt,{children:(0,v.jsxs)(Ht,{hasMedia:i,children:[i&&e.mediaUrl&&(0,v.jsx)(Vt,{children:(0,v.jsx)(He,{mediaUrl:e.mediaUrl,fallbackMediaUrl:e.fallbackMediaUrl,mediaType:e.mediaType,mediaAlt:e.mediaAlt,testId:`${s}-${r}-media`,$:e.$,isResponsive:e.isResponsive,desktopUrl:e.desktopUrl,mobileUrl:e.mobileUrl})}),l&&(0,v.jsx)(Kt,{direction:c,depth:e.gradientDepth??\"md\",color:g}),(0,v.jsxs)(zt,{position:d,children:[(0,v.jsx)(Ue,{headerText:e.headerText,title:e.title,subtitle:e.subtitle,bodyText:e.bodyText,textColor:a,textAlignment:m,testId:`${s}-${r}-text`,$:e.$,isVisualBuilderContext:t}),o&&e.ctaLabel&&e.ctaDestination&&(0,v.jsx)(ze,{ctaLabel:e.ctaLabel,ctaDestination:e.ctaDestination,variant:e.ctaVariant??\"dark\",testId:`${s}-${r}-cta`,$:e.$})]})]})},`${s}-${r}`)};function Qe(e){let{banners:t,rotationInterval:r,testId:n,isVisualBuilderContext:i=!1}=e,o=Ze(e),s=Xe({totalSlides:t.length,autoRotate:o,rotationInterval:r??5e3,pauseOnHover:!0,initialIndex:0});return(0,v.jsxs)(Gt,{\"data-testid\":n??\"marketing-banner\",onKeyDown:o?s.handleKeyDown:void 0,onMouseEnter:o?s.pause:void 0,onMouseLeave:o?s.resume:void 0,children:[(0,v.jsx)(Ut,{children:(0,v.jsx)(Ft,{currentIndex:s.currentIndex,totalSlides:t.length,children:t.map((a,l)=>xo(a,i,l,n))})}),o&&(0,v.jsx)(Xt,{children:t.map((a,l)=>(0,v.jsx)(Zt,{active:l===s.currentIndex,onClick:()=>s.goToSlide(l),\"aria-label\":`Go to slide ${l+1}`},`${n??\"banner\"}-indicator-${l}-${a.title??\"\"}`))})]})}function yo(e,t,r){let{url:n=\"\",type:i=\"\"}=e??{};return i===\"VIDEO\"?t?n:r?.[0]??\"\":n}function jt(e,t){try{let r=new URL(e),n=r.searchParams.get(\"io\");if(!n)return e;let i=`${n},aspectratio:${t}`,o=[];return o.push(`io=${i}`),o.push(\"quality=95\"),r.searchParams.forEach((s,a)=>{a!==\"io\"&&o.push(`${a}=${s}`)}),`${r.origin}${r.pathname}?${o.join(\"&\")}`}catch(r){return console.warn(\"Failed to generate responsive URL:\",r),e}}function To(e){try{return new URL(e).searchParams.has(\"io\")?e:`${e}?io=transform:fill&quality=95`}catch{return e}}function Re(e){if(!e)return null;try{let r=JSON.parse(e)?.image?.[0],n=r?.selected,i=yo(n,r?.isPublic,r?.previewUrls),o=\"image\";n?.type===\"VIDEO\"?o=\"video\":n?.type===\"IMAGE\"&&i?.toLowerCase().endsWith(\".gif\")&&(o=\"gif\");let s=n?.imageType===\"customTransformation\",a={url:i,type:o,alt:n?.altText??\"\"};return s&&o===\"image\"?(a.isResponsive=!0,a.desktopUrl=jt(i,\"16x9\"),a.mobileUrl=jt(i,\"3x4\"),a.url=a.desktopUrl):o===\"image\"&&(a.url=To(i)),a}catch(t){return console.warn(\"Failed to parse bynder_media JSON:\",t),null}}function So(e){let t=Re(e.bynder_media);return{title:e.title,headerText:e.header_text,subtitle:e.subtitle,bodyText:e.body_text,ctaLabel:e.cta?.label??e.cta_label,ctaDestination:e.cta?.url??e.cta_destination,ctaVariant:e.cta?.variant??e.cta_variant,mediaUrl:t?.url??\"\",fallbackMediaUrl:\"\",mediaType:t?.type??\"image\",mediaAlt:t?.alt??\"\",isResponsive:t?.isResponsive,desktopUrl:t?.desktopUrl,mobileUrl:t?.mobileUrl,position:e.content_position??e.position,textColor:e.text_color,showGradient:e.gradient?.show_gradient??e.show_gradient,gradientDepth:e.gradient?.gradient_depth??e.gradient_depth,$:e.$}}function Yt(e){return{banners:e.banners.map(So),rotationInterval:e.rotation_interval}}var Je=require(\"@nuskin/foundation-theme\");var Qt={thin:1,medium:2,thick:4},we={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 Jt=(0,Je.styled)(\"div\")(({paddingVertical:e,dividerAlign:t})=>{let n={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:`${n.mobile}px`,paddingBottom:`${n.mobile}px`,[`@media ${we.tablet}`]:{paddingTop:`${n.tablet}px`,paddingBottom:`${n.tablet}px`},[`@media ${we.desktop}`]:{paddingTop:`${n.desktop}px`,paddingBottom:`${n.desktop}px`},[`@media ${we.ultra}`]:{paddingTop:`${n.ultra}px`,paddingBottom:`${n.ultra}px`}}}),qt=(0,Je.styled)(\"div\")(({dividerStyle:e,dividerThicknessPx:t,dividerColor:r,dividerGradient:n,dividerWidthPercent:i})=>{let o={width:`${Math.max(0,Math.min(100,i))}%`};if(n&&e!==\"none\"){if(o.height=`${t}px`,o.backgroundImage=n,o.backgroundSize=\"100% 100%\",e===\"dashed\"){let s=Math.max(12,t*4),a=Math.max(6,t*2);o.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${s}px, transparent ${s}px, transparent ${s+a}px)`,o.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${s}px, transparent ${s}px, transparent ${s+a}px)`}else if(e===\"dotted\"){let s=Math.max(2,t),a=Math.max(8,s*3),l=s/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=`${a}px ${t}px`,o.WebkitMaskSize=`${a}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=n):(o.borderBottomStyle=e,o.borderBottomWidth=`${t}px`,o.borderBottomColor=r,o.height=0);return o});var er=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,Co=e=>{if(!e||!/^#([A-Fa-f0-9]{6})$/.test(e))return;let t=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),n=parseInt(e.slice(5,7),16);return{r:t,g:r,b:n}},tr=(e,t)=>{if(!e||e===\"none\")return;let r=Co(t)??{r:0,g:0,b:0};switch(e){case\"soft\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.3), rgba(${r.r},${r.g},${r.b},0.8))`;case\"bold\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.6), rgba(${r.r},${r.g},${r.b},1.0))`;case\"faint\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.4), rgba(${r.r},${r.g},${r.b},0.4))`;default:return}};var qe=require(\"react/jsx-runtime\"),vo=\"#000000\",Eo=e=>{let{paddingVertical:t=\"small\",dividerStyle:r=\"solid\",dividerThickness:n=\"thin\",dividerColor:i,dividerGradientPreset:o=\"none\",dividerWidthPercent:s=100,dividerAlign:a=\"left\"}=e,l=Qt[n],d=er(i)?i:vo,g=tr(o,d);return(0,qe.jsx)(Jt,{paddingVertical:t,dividerAlign:a,children:r!==\"none\"&&(0,qe.jsx)(qt,{dividerStyle:r,dividerThicknessPx:l,dividerColor:d,dividerGradient:g,dividerWidthPercent:s??100,\"aria-hidden\":\"true\"})})},rr=Eo;var ne=require(\"react\"),Tr=B(require(\"react-slick\"));var M=require(\"@nuskin/foundation-theme\");var et={none:0,small:8,medium:12,large:16};function tt(e){return e===void 0?et.large:typeof e==\"number\"?e:et[e]}var x={ULTRA_SMALL:320,EXTRA_SMALL:480,SMALL:600,MEDIUM:768,LARGE:1024,EXTRA_LARGE:1200,ULTRA_LARGE:1440,SUPER_LARGE:1920},rt=280,Ro=320,nt=450,re=4;var nr=(0,M.styled)(\"section\")(({gap:e,height:t,columnHeight:r,maxColumnHeight:n,fullWidth:i})=>({position:\"relative\",width:\"100%\",textAlign:\"center\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${x.MEDIUM}px)`]:{padding:\"0 40px 50px\",...i&&{padding:\"0\"}},[`@media (max-width: ${x.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%\",...r===\"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:r===\"auto\"?\"100%\":r,minHeight:0,...n!=null&&{maxHeight:`${n}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:\"absolute\",bottom:-36,display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin: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: ${x.SMALL}px)`]:{\".slick-dots\":{bottom:-32,gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),or=(0,M.styled)(\"div\")(({gap:e})=>({display:\"flex\",flexWrap:\"wrap\",gap:`${e}px`,width:\"100%\"})),ir=(0,M.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:r,stackedItemMaxHeight:n,slideWidth:i,flexBasis:o,isVariableWidth:s})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:r===\"auto\"?\"100%\":r,minHeight:0,...n!=null&&{maxHeight:n},width:i,flex:e&&o?`0 0 ${o}`:void 0,boxSizing:e?\"border-box\":void 0,minWidth:s?0:rt,position:\"relative\"})),ar=(0,M.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\"})),sr=(0,M.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),lr=(0,M.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\",...t?e===\"prev\"?{left:8}:{right:8}:e===\"prev\"?{left:-60}:{right:-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: ${x.MEDIUM}px)`]:{width:40,height:40,...t?e===\"prev\"?{left:4}:{right:4}:e===\"prev\"?{left:-45}:{right:-45}},[`@media (max-width: ${x.SMALL}px)`]:{width:32,height:32,fontSize:20,...t?e===\"prev\"?{left:2}:{right:2}:e===\"prev\"?{left:-35}:{right:-35}}})),dr=(0,M.styled)(\"div\")({position:\"relative\",height:\"100%\"}),pr=(0,M.styled)(\"div\")({padding:\"10px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\"});var cr=B(require(\"react\"));function D(e){return!e||typeof e==\"function\"?e:typeof e==\"object\"&&e.default?e.default:e}var se=({emptyBlockParentClass:e,text:t=\"Add items to the column control/carousel\"})=>cr.default.createElement(pr,{className:e},t);function gr(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 ur(e,t){return t<=x.MEDIUM?!1:e===\"two-small-large\"||e===\"three-small-medium-large\"}function mr(e,t,r){if(r<=x.MEDIUM)return\"auto\";if(e===\"two-small-large\")return t%2===0?\"33.33%\":\"66.67%\";if(e===\"three-small-medium-large\"){let n=t%3;return n===0||n===2?\"25%\":\"50%\"}return\"auto\"}function fr(e,t){return e>=x.EXTRA_LARGE?Math.min(t,4):e>=x.LARGE?Math.min(t,3):e>=x.SMALL?Math.min(t,2):1}function hr(e){let{isGridLayout:t,isStackedViewport:r,isTabletGridViewport:n,gridSlides:i,presetColumns:o,slidesToShow:s}=e;return t&&(r||n)?i.slice(0,Math.min(o,i.length)):t?i.slice(0,s):i}function br(e){let{isGridLayout:t,presetSlidesToShow:r,gridSlides:n,presetColumns:i,shouldShowDots:o}=e,s=l=>Math.min(n.length,i,l),a=l=>Math.min(r,l);return[{breakpoint:x.SMALL,settings:{slidesToShow:t?1:Math.min(r,1),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}},{breakpoint:x.MEDIUM,settings:{slidesToShow:t?s(2):a(2),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}},{breakpoint:x.LARGE,settings:{slidesToShow:t?s(re):a(3),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}}]}var le=require(\"react\");function xr(e,t){let[r,n]=(0,le.useState)(typeof window<\"u\"?window.innerWidth:0),[i,o]=(0,le.useState)(`carousel-${e}-${t}-${Date.now()}`);return(0,le.useEffect)(()=>{if(typeof window>\"u\")return;let s,a=()=>{clearTimeout(s),s=setTimeout(()=>{n(window.innerWidth),o(`carousel-${e}-${t}-${Date.now()}`)},150)};return window.addEventListener(\"resize\",a),()=>{clearTimeout(s),window.removeEventListener(\"resize\",a)}},[e,t]),{windowWidth:r,carouselKey:i}}var cs=require(\"slick-carousel/slick/slick.css\"),gs=require(\"slick-carousel/slick/slick-theme.css\"),T=require(\"react/jsx-runtime\"),ot=require(\"react\"),Sr=D(Tr.default),$o=D(nr),yr=D(lr),Io=D(dr),ko=D(or),Ao=D(ir),_o=D(ar),Lo=D(sr);function Po(e,t,r,n){let i=t<=x.SMALL,o=e&&t>x.SMALL&&t<=x.LARGE;return{isStackedViewport:i,isTabletGridViewport:o,stackedItemHeight:\"100%\",stackedItemMaxHeight:nt,stackedVerticalGap:e&&i?r:0,containerHeight:n??\"auto\"}}function Bo(e,t,r,n,i){let o=t?e.slice(0,re):e,s=t?Math.min(o.length,r,re):n,a=t?i&&o.length>1:o.length>1;return{gridSlides:o,slidesToShow:s,shouldShowDots:a}}function Mo(e){let{slidesForRender:t,renderSlide:r,presetColumns:n,gap:i,isVariableWidth:o,getSlideWidth:s,stackedVerticalGap:a,stackedItemHeight:l,stackedItemMaxHeight:d,useFlexLayout:g=!1,$:c={}}=e,m=n===1?\"100%\":`calc(50% - ${i/2}px)`;return t.map((b,f)=>{let E;!g&&o&&(E=s(f));let u=b?.id,p=u!=null?String(u):`slide-${f}`;return(0,T.jsx)(Ao,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${f+1} of ${t.length}`,useFlexLayout:g,stackedVerticalGap:a,stackedItemHeight:l,stackedItemMaxHeight:d,slideWidth:E,flexBasis:m,isVariableWidth:o,...c?.[`slides__${f}`]??{},children:(0,T.jsx)(_o,{stackedItemHeight:l,stackedItemMaxHeight:d,children:(0,T.jsx)(Lo,{children:r(b,f)})})},p)})}function Do(e){let{emptyBlockParentClass:t,isStackedViewport:r,isTabletGridViewport:n,renderSlides:i,sliderRef:o,finalSettings:s,carouselKey:a,preset:l,slidesForRender:d,gap:g,$:c={}}=e;return r?(0,T.jsx)(\"div\",{className:\"column-control-container\",children:d.length>0?i():(0,T.jsx)(se,{emptyBlockParentClass:t})}):n?(0,T.jsx)(ko,{className:\"column-control-container\",gap:g,children:d.length>0?i(!0):(0,T.jsx)(se,{emptyBlockParentClass:t})}):d.length>0?(0,ot.createElement)(Sr,{ref:o,...s,key:`${a}-${l}`},i(!0)):(0,T.jsx)(se,{emptyBlockParentClass:t})}function Oo({slides:e,renderSlide:t,preset:r=\"single-full\",layout:n=\"grid\",autoplayEnabled:i=!1,autoplayDuration:o=3,showPagination:s=!0,onSlideChange:a,className:l,slickSettings:d,gap:g=\"medium\",height:c,fullWidth:m,emptyBlockParentClass:b,isEditing:f,parent$:E,$:u}){let p=tt(g),S=n===\"grid\",G=m??S,{windowWidth:y,carouselKey:J}=xr(r,e.length),$=(0,ne.useMemo)(()=>gr(r),[r]),P=fr(y,$),W=ur(r,y),U=(0,ne.useMemo)(()=>be=>mr(r,be,y),[r,y]),oe=S?!1:i,ie=S?!1:s,q=!S&&y>x.LARGE,{isStackedViewport:ge,isTabletGridViewport:A,stackedItemHeight:ue,stackedItemMaxHeight:dt,stackedVerticalGap:kn,containerHeight:An}=Po(S,y,p,c),{gridSlides:me,slidesToShow:fe,shouldShowDots:ke}=Bo(e,S,$,P,ie),_n=(0,ne.useMemo)(()=>br({isGridLayout:S,presetSlidesToShow:P,gridSlides:me,presetColumns:$,shouldShowDots:ke}),[S,P,me,$,ke]),Ln={dots:ke,infinite:!S&&me.length>fe,speed:500,slidesToShow:fe,slidesToScroll:1,autoplay:oe,autoplaySpeed:o*1e3,pauseOnHover:!0,arrows:!1,variableWidth:W,swipe:!S,draggable:!S,beforeChange:(be,Dn)=>{a&&a(Dn)},responsive:_n,...d},he=(0,ne.useRef)(null),Pn=()=>{he.current?.slickPrev()},Bn=()=>{he.current?.slickNext()},pt={...Ln},Mn=[l,S?\"column-control-container\":void 0].filter(Boolean).join(\" \"),Ae=hr({isGridLayout:S,isStackedViewport:ge,isTabletGridViewport:A,gridSlides:me,presetColumns:$,slidesToShow:fe}),ct=(be=!1)=>Mo({slidesForRender:Ae,renderSlide:t,presetColumns:$,gap:p,isVariableWidth:W,getSlideWidth:U,stackedVerticalGap:kn,stackedItemHeight:ue,stackedItemMaxHeight:dt,useFlexLayout:be,$:u});return(0,T.jsx)($o,{gap:p,height:An,columnHeight:ue,maxColumnHeight:dt,isVariableWidth:W,className:Mn,\"aria-label\":n===\"carousel\"?\"Carousel Control\":\"Column Control\",fullWidth:G,...E??{},children:(0,T.jsxs)(Io,{children:[(0,T.jsxs)(\"div\",{...u?.slides??{},...u?.slides__parent??{},\"data-add-direction\":\"horizontal\",children:[n===\"carousel\"&&(0,ot.createElement)(Sr,{ref:he,...pt,key:J},Ae.length>0?ct():(0,T.jsx)(se,{emptyBlockParentClass:b})),n===\"grid\"&&(0,T.jsx)(Do,{emptyBlockParentClass:b,slidesForRender:Ae,isStackedViewport:ge,isTabletGridViewport:A,renderSlides:ct,sliderRef:he,finalSettings:pt,carouselKey:J,preset:r,gap:p,$:u})]}),n===\"carousel\"&&q&&e.length>fe&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(yr,{direction:\"prev\",onClick:Pn,\"aria-label\":\"Previous slide\",fullWidth:G,children:\"\\u2039\"}),(0,T.jsx)(yr,{direction:\"next\",onClick:Bn,\"aria-label\":\"Next slide\",fullWidth:G,children:\"\\u203A\"})]})]})})}var Cr=Oo;var $e=require(\"@nuskin/foundation-ui-components\");var Fr=require(\"@nuskin/foundation-ui-components\"),pe=require(\"@nuskin/foundation-theme\");var vr=\"99px\";var Er=\"noopener noreferrer\";var No=\"http:\",Go=\"https:\",Uo=\"disabled\",it=\"primary\",Rr=\"small\",wr=\"left\",$r=\"left\",Ir=\"square\",kr=\"Enter Label\",Ar=\"No\",de=\"rounded\",_r=\"square\",Lr=\"transparent\";function Pr(e){if(!e||e.trim()===\"\")return!1;let t=e.trim();if(t.startsWith(\"#\")||t.startsWith(\"/\")||t.startsWith(\"//\"))return!0;try{let r=new URL(t);return r.protocol===No||r.protocol===Go}catch{return!1}}function Br(e){return e===\"Yes\"?\"_blank\":\"_self\"}function Mr(e){return e==null?!1:typeof e==\"string\"?e===Uo:e}var Fo={arrow:\"arrowRight\"};function Dr(e){if(e)return Fo[e]??e}var at={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\"}},Wo={large:\"400px\",medium:\"250px\",small:\"130px\"},Ho=\"130px\";function Or(e){return Wo[e]??Ho}var Vo={small:\"small\",medium:\"medium\",large:\"medium\"},zo=\"medium\";function Nr(e){return Vo[e]??zo}var Xo=\"4px\",Zo=\"70px\",jo=\"30px\",Yo=\"769px\",Qo=\"768px\",Jo=\"425px\",qo=\"13px\",ei=\"12px\",ti=\"10px\",ri=\"10px 6px\",ni=\"8px 6px\",oi=\"4px 8px\",ii=500,Gr=400,ai=\"2px\",si=\"Lora, sans-serif\",li=\"transparent\",di=\"center\",pi=\"flex-end\",ci=\"flex-start\",gi=e=>e===\"center\"?di:e===\"right\"?pi:ci,Wr=(0,pe.styled)(\"div\")`\n display: flex;\n justify-content: ${e=>gi(e.alignment)};\n width: 100%;\n`,Hr=(0,pe.styled)(Fr.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 \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: ${Xo};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${si};\n min-width: ${Zo};\n min-height: ${jo};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n width: ${e=>e.$buttonWidth};\n ${e=>e.$buttonType===de&&`border-radius: ${vr};`}\n }\n\n @media (min-width: ${Yo}) {\n && {\n font-size: ${qo};\n padding: ${ri};\n font-weight: ${ii};\n }\n }\n \n @media (max-width: ${Qo}) {\n && {\n font-size: ${ei};\n padding: ${ni};\n font-weight: ${Gr};\n }\n }\n\n @media (max-width: ${Jo}) {\n && {\n font-size: ${ti};\n padding: ${oi};\n font-weight: ${Gr};\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: ${ai} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${li};\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`,Vr=pe.styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`,Ur=`${2}px`,zr=pe.styled.span`\n flex-shrink: 0;\n ${e=>e.position===\"left\"&&`margin-right: ${Ur};`}\n ${e=>e.position===\"right\"&&`margin-left: ${Ur};`}\n`;var Y=require(\"react/jsx-runtime\"),ui=({label:e,open_in_new_tab:t=Ar,variant:r,button_size:n,alignment:i,buttontype:o=Ir,icon:s,iconposition:a,button_state:l,placeholder_text:d=kr,isEditing:g,$:c,parent$:m})=>{let b=r??it,f=n??Rr,E=i??wr,u=a??$r,p=o===de?de:_r,S=e?.href?.trim()??void 0,G=Pr(S)?S:void 0,y=at[b]??at[it],J=Or(f),$=Br(t),P=Mr(l),W=(\"border\"in y?y.border:void 0)??Lr,U=Dr(s),oe=typeof U==\"string\"&&U in $e.NsIconVariants,ie=Nr(f),q=A=>{if(!U||!oe||u!==A)return null;let ue=P?y.disabledText:y.text;return(0,Y.jsx)(zr,{position:A,children:(0,Y.jsx)($e.NsIcon,{name:U,size:ie,colorOverride:ue,...c?.icon??{}})})},ge=()=>{let A=e?.title??\"\";return g?A:A===\"\"||A===d?d:A};return(0,Y.jsx)(Wr,{alignment:E,children:(0,Y.jsxs)(Hr,{$variant:b,$buttonWidth:J,$buttonType:p,$bg:y.bg,$hover:y.hover,$pressed:y.pressed,$text:y.text,$border:W,$disabledBg:y.disabledBg,$disabledText:y.disabledText,$focusRing:y.focusRing,href:G,\"data-variant\":b,...$===\"_blank\"?{target:\"_blank\",rel:Er}:{},\"aria-disabled\":P,disabled:P,...m??{},children:[q(\"left\"),(0,Y.jsx)(Vr,{...e?.$?.title??{},children:ge()}),q(\"right\")]})})},Ie=ui;var Kr=require(\"@nuskin/foundation-ui-components\"),Zr=require(\"react/jsx-runtime\"),Xr=({value:e,placeholder:t,isEditing:r,typographyProps:n})=>{let i=e;return!r&&e!==t?i=e:e===\"\"&&(i=t),(0,Zr.jsx)(Kr.NsTypography,{...n,children:i})};var jr=\"Enter Brand Caption\",Yr=\"Enter Title\",Qr=\"Enter Subtitle\",Jr=\"Enter Body\",qr=\"Hero banner\",en=\"lazy\";var ce=require(\"react/jsx-runtime\"),mi=(e,t,r,n)=>[{value:e,placeholder:jr,variant:\"body-s\",className:\"brand-caption\",noSpacing:!0,editTagKey:\"brandcaption\"},{value:t,placeholder:Yr,variant:\"h2\",className:\"title\",weight:\"bold\",editTagKey:\"title\"},{value:r,placeholder:Qr,variant:\"h5\",className:\"subtitle\",editTagKey:\"subtitle\"},{value:n,placeholder:Jr,variant:\"h6\",className:\"body\",editTagKey:\"body\"}],tn=({brandcaption:e,title:t,subtitle:r,body:n,isEditing:i,editTags:o={}})=>{let s=mi(e,t,r,n);return(0,ce.jsx)(ce.Fragment,{children:s.map(a=>{let l={variant:a.variant,className:a.className,...a.noSpacing&&{noSpacing:!0},...a.weight&&{weight:a.weight},additionalProps:{...o?.[a.editTagKey]??{}}};return(0,ce.jsx)(Xr,{value:a.value,placeholder:a.placeholder,isEditing:i,typographyProps:l},a.editTagKey)})})};var lt=require(\"@nuskin/foundation-ui-components\");var Q=require(\"@nuskin/foundation-theme\"),rn=(0,Q.styled)(\"section\")`\n width: 100%;\n position: relative;\n min-height: 450px;\n overflow: hidden;\n\n .media-layer {\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 .media-layer .media-fill {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .content {\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n }\n\n .title {\n font-size: clamp(22px, 3.5vw, 48px);\n line-height: 1.05;\n margin-bottom: 8px;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .subtitle {\n margin-bottom: 8px;\n font-size: clamp(16px, 2.2vw, 24px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .brand-caption {\n margin-bottom: 8px;\n font-size: clamp(12px, 1.5vw, 16px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .body {\n margin-bottom: 8px;\n font-size: clamp(14px, 1.6vw, 18px);\n line-height: 1.4;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n`,nn={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},fi=(e,t,r)=>{let{start:n,end:i}=nn[t],o=r===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?`background: linear-gradient(to right, rgba(${o}, ${n}), rgba(${o}, ${i}));`:e===\"rightToLeft\"?`background: linear-gradient(to left, rgba(${o}, ${n}), rgba(${o}, ${i}));`:`background: radial-gradient(circle, rgba(${o}, ${n}), rgba(${o}, ${i}));`},on=Q.styled.div`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({direction:e,depth:t,color:r})=>fi(e,t,r)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({depth:e,color:t})=>{let{start:r,end:n}=nn[e],i=t===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return`background: radial-gradient(circle, rgba(${i}, ${r}), rgba(${i}, ${n}));`}}\n }\n`,an=Q.styled.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,st=Q.styled.source`\n display: block;\n`,sn=Q.styled.div`\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n padding: clamp(16px, 4vw, 48px);\n pointer-events: none;\n justify-content: ${({justifyContent:e})=>e??\"flex-start\"};\n\n // Force center alignment on mobile\n @media (max-width: 768px) {\n justify-content: center;\n }\n`,ln=Q.styled.div`\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\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 (max-width: 768px) {\n text-align: center;\n }\n`,dn=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\";var F=\"100%\",pn=\"(max-width: 768px)\",cn=\"(min-width: 769px)\";function hi(e){return typeof e==\"object\"&&e!==null&&\"type\"in e&&\"src\"in e}function gn(e){if(!e)return null;if(hi(e))return{type:e.type,url:e.src??\"\",alt:e.alt??\"\",width:e.width,height:e.height,isResponsive:!1};if(typeof e==\"string\"){let t=Re(e);if(t)return{type:t.type,url:t.url,alt:t.alt,isResponsive:t.isResponsive??!1,desktopUrl:t.desktopUrl,mobileUrl:t.mobileUrl}}return null}function un(e){return e??\"left\"}function mn(e){return e??\"md\"}function fn(e){return e===\"white\"?\"white\":\"black\"}function hn(e){if(!e)return;let t=String(e);return t!==\"\"?t:void 0}function bn(e){if(!e)return;let t=String(e);return t!==\"\"?t:void 0}function xn(e){return e===\"black\"?\"white\":\"black\"}var bi={left:\"leftToRight\",center:\"radial\",right:\"rightToLeft\"};function yn(e){return bi[e]}function Tn(e,t){return String(e)===F&&String(t)===F}function Sn(e,t,r){return e?{variant:\"fill\",className:\"media-fill\"}:{style:{width:String(t),height:String(r)}}}var O=require(\"react/jsx-runtime\"),Cn=({parsedMedia:e,mediaWidth:t,mediaHeight:r,mediaAttributes:n={}})=>{if(!e)return null;let i=Tn(t,r),o=Sn(i,t,r),s=()=>{let l={...o,loading:en,...n};return e.isResponsive&&e.desktopUrl&&e.mobileUrl?(0,O.jsxs)(an,{children:[(0,O.jsx)(st,{media:pn,srcSet:e.mobileUrl}),(0,O.jsx)(st,{media:cn,srcSet:e.desktopUrl}),(0,O.jsx)(lt.NsImage,{src:e.desktopUrl,alt:e.alt,...l})]}):(0,O.jsx)(lt.NsImage,{src:e.url??\"\",alt:e.alt??\"\",...l})},a=e.type===\"image\"||e.type===\"gif\"?s():e.type===\"video\"?(0,O.jsx)(\"video\",{src:e.url,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,preload:\"auto\",width:i?F:t,height:i?F:r,style:{objectFit:\"cover\"},...n}):null;return a?(0,O.jsx)(\"div\",{className:\"media-layer\",children:a}):null};var N=require(\"react/jsx-runtime\"),xi=e=>{let{title:t,subtitle:r,body:n,brandcaption:i,button:o,media:s,class_name:a,content_alignment:l,width:d,height:g,gradient_enabled:c=!1,gradient_depth:m,text_color:b,$:f={},parent$:E={},isEditing:u=!1}=e,p=un(l),S=mn(m),G=fn(b),y=hn(d),J=bn(g),$=gn(s),P=y??F,W=J??F,U=dn(p),oe=xn(G),ie=yn(p),q=o&&(o.label?.title||u);return(0,N.jsxs)(rn,{className:a,textColor:G,\"aria-label\":qr,...E??{},children:[$&&(0,N.jsx)(Cn,{parsedMedia:$,mediaWidth:P,mediaHeight:W,mediaAttributes:f?.media??{}}),c&&(0,N.jsx)(on,{direction:ie,depth:S,color:oe,\"aria-hidden\":\"true\"}),(0,N.jsx)(sn,{justifyContent:U,children:(0,N.jsxs)(ln,{textAlign:p,children:[(0,N.jsx)(tn,{brandcaption:i,title:t,subtitle:r,body:n,isEditing:u,editTags:f}),q&&(0,N.jsx)(Ie,{...o,alignment:p??o?.alignment,parent$:f?.button,isEditing:u})]})})]})},vn=xi;var Rn=require(\"react\"),wn=B(require(\"dompurify\"));var In=require(\"react/jsx-runtime\"),En={ALLOWED_TAGS:[\"p\",\"div\",\"span\",\"a\",\"br\",\"strong\",\"b\",\"em\",\"i\",\"u\",\"h1\",\"h2\",\"h3\",\"ul\",\"ol\",\"li\"],ALLOWED_ATTR:[\"href\",\"target\",\"rel\",\"title\",\"class\",\"style\",\"data-testid\",\"data-cs-id\",\"data-cs-type\",\"data-cslp\"]},yi=e=>!e||typeof e!=\"string\"?\"\":wn.default.sanitize(e,{ALLOWED_TAGS:En.ALLOWED_TAGS,ALLOWED_ATTR:En.ALLOWED_ATTR,KEEP_CONTENT:!0,RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,FORCE_BODY:!1,SANITIZE_DOM:!0,IN_PLACE:!1}),Ti=({text_editor:e,font_color:t,...r})=>{let n=(0,Rn.useMemo)(()=>!e||typeof e!=\"string\"||!e.trim()?\"\":yi(e),[e]),i=t===\"Light\";return n?(0,In.jsx)(Te,{...r,text_editor:n,font_color:i}):null},$n=Ti;\n","export * from './text';\nexport * from './image';\nexport * from './marketing-banner';\nexport * from './spacing-divider';\nexport * from './column-control';\nexport * from './hero-banner';\nexport * from './button';\nexport * from './rich-text';\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\nconst 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 type { TextAlignment } from '../types';\nimport { FONT_STACKS, FONT_SIZES, SPACING } from '../styles/theme';\nimport { responsiveFontSize, centerOnMobile } from '../styles/mixins';\n\nexport const TextContainer = styled.div<{\n textAlignment: TextAlignment;\n}>`\n text-align: ${({ textAlignment }) => textAlignment};\n ${centerOnMobile}\n`;\n\nexport const HeaderText = styled.p<{\n fontColor: string;\n}>`\n margin: ${SPACING.headerMargin};\n font-weight: 500;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n letter-spacing: 0.05em;\n ${responsiveFontSize(FONT_SIZES.header)}\n`;\n\nexport const Title = styled.h2<{\n fontColor: string;\n}>`\n margin: ${SPACING.titleMargin};\n font-weight: 700;\n font-family: ${FONT_STACKS.lora};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.title)}\n`;\n\nexport const Subtitle = styled.h3<{\n fontColor: string;\n}>`\n margin: ${SPACING.subtitleMargin};\n font-weight: 600;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.subtitle)}\n`;\n\nexport const BodyText = styled.p<{\n fontColor: string;\n}>`\n margin: ${SPACING.bodyMargin};\n line-height: 1.6;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.body)}\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 (title, subtitle, bodyText) with responsive styling\n */\n\nimport React from 'react';\nimport type { BannerTextProps } from '../types';\nimport { PLACEHOLDER_VALUES } from '../constants';\nimport { TextContainer, HeaderText, Title, Subtitle, BodyText } from './BannerText.styled';\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isVisualBuilderContext?: boolean\n): string | undefined {\n if (isVisualBuilderContext === true && (!text || text === placeholderValue)) {\n return placeholderValue;\n }\n if (isVisualBuilderContext === 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 isVisualBuilderContext\n}: Readonly<BannerTextProps>): React.ReactElement | null {\n const header = getDisplayText(headerText, PLACEHOLDER_VALUES.header, isVisualBuilderContext);\n const titleDisplay = getDisplayText(title, PLACEHOLDER_VALUES.title, isVisualBuilderContext);\n const subtitleDisplay = getDisplayText(subtitle, PLACEHOLDER_VALUES.subtitle, isVisualBuilderContext);\n const body = getDisplayText(bodyText, PLACEHOLDER_VALUES.body, isVisualBuilderContext);\n\n if (!header && !titleDisplay && !subtitleDisplay && !body) {\n return null;\n }\n\n return (\n <TextContainer textAlignment={textAlignment} data-testid={testId}>\n {header && (\n <HeaderText fontColor={textColor} {...($?.header_text ?? {})}>\n {header}\n </HeaderText>\n )}\n {titleDisplay && (\n <Title fontColor={textColor} {...($?.title ?? {})}>\n {titleDisplay}\n </Title>\n )}\n {subtitleDisplay && (\n <Subtitle fontColor={textColor} {...($?.subtitle ?? {})}>\n {subtitleDisplay}\n </Subtitle>\n )}\n {body && (\n <BodyText fontColor={textColor} {...($?.body_text ?? {})}>\n {body}\n </BodyText>\n )}\n </TextContainer>\n );\n}\n","/**\n * BannerMedia Sub-Component\n * Renders responsive media (image/gif/video) with lazy loading and fallback support\n */\n\nimport React from 'react';\nimport {\n MediaContainer,\n StyledImage,\n StyledVideo,\n FallbackMessage,\n PictureElement,\n SourceElement\n} from './BannerMedia.styled';\nimport type { BannerMediaProps } from '../types';\n\nexport function BannerMedia({\n mediaUrl,\n fallbackMediaUrl,\n mediaType = 'image',\n mediaAlt = '',\n onError,\n testId,\n $,\n isResponsive,\n desktopUrl,\n mobileUrl\n}: Readonly<BannerMediaProps>): React.ReactElement {\n const [currentUrl, setCurrentUrl] = React.useState(mediaUrl);\n const [hasError, setHasError] = React.useState(false);\n\n React.useEffect(() => {\n setCurrentUrl(mediaUrl);\n setHasError(false);\n }, [mediaUrl]);\n\n const handleMediaError = () => {\n if (fallbackMediaUrl && currentUrl !== fallbackMediaUrl) {\n setCurrentUrl(fallbackMediaUrl);\n } else {\n setHasError(true);\n }\n onError?.();\n };\n\n const renderMedia = () => {\n if (hasError && !fallbackMediaUrl) {\n return <FallbackMessage></FallbackMessage>;\n }\n\n if (mediaType === 'video') {\n return (\n <StyledVideo\n src={currentUrl}\n onError={handleMediaError}\n autoPlay\n muted\n loop\n playsInline\n data-testid={`${testId}-video`}\n {...($?.bynder_media ?? {})}\n ></StyledVideo>\n );\n }\n\n if (isResponsive && mobileUrl && desktopUrl) {\n return (\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 data-testid={`${testId}-image`}\n {...($?.bynder_media ?? {})}\n />\n </PictureElement>\n );\n }\n\n return (\n <StyledImage\n src={currentUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n data-testid={`${testId}-image`}\n {...($?.bynder_media ?? {})}\n />\n );\n };\n\n return (\n <MediaContainer data-testid={testId} {...($?.bynder_media ?? {})}>\n {renderMedia()}\n </MediaContainer>\n );\n}\n","import styled from '@emotion/styled';\nimport { COLORS } from '../styles/theme';\nimport { flexCenter } from '../styles/mixins';\n\nexport const MediaContainer = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`;\n\nexport const StyledImage = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nexport const StyledVideo = styled.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nexport const FallbackMessage = styled.div`\n ${flexCenter}\n width: 100%;\n height: 100%;\n background-color: ${COLORS.fallbackBg};\n color: ${COLORS.textGray};\n font-size: 14px;\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","import styled from '@emotion/styled';\nimport { css } from '@emotion/react';\nimport type { CTAVariant } from '../types';\nimport { FONT_STACKS, FONT_SIZES, SPACING, COLORS, MEDIA_QUERIES, TRANSITIONS } from '../styles/theme';\nimport { responsiveFontSize } from '../styles/mixins';\n\nconst darkVariant = css`\n background-color: ${COLORS.ctaDark};\n color: ${COLORS.textWhite};\n border: 1px solid ${COLORS.ctaDark};\n\n &:hover {\n background-color: ${COLORS.ctaDark};\n color: ${COLORS.textWhite};\n border-color: ${COLORS.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${COLORS.textWhite};\n outline-offset: 4px;\n }\n`;\n\nconst lightVariant = css`\n background-color: transparent;\n color: ${COLORS.textDark};\n border: 1px solid ${COLORS.ctaBorder};\n\n &:hover {\n background-color: transparent;\n color: ${COLORS.textDark};\n border-color: ${COLORS.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${COLORS.ctaBorder};\n outline-offset: 4px;\n }\n`;\n\nexport const CTALink = styled.a<{ variant: CTAVariant }>`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: ${SPACING.ctaPaddingDesktop};\n text-decoration: none;\n font-family: ${FONT_STACKS.lora};\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color ${TRANSITIONS.default},\n color ${TRANSITIONS.default},\n border-color ${TRANSITIONS.default},\n transform ${TRANSITIONS.default},\n text-decoration ${TRANSITIONS.default};\n\n ${({ variant }) => (variant === 'dark' ? darkVariant : lightVariant)}\n\n &:active {\n transform: translateY(0);\n }\n\n ${responsiveFontSize(FONT_SIZES.cta)}\n\n /* Responsive padding */\n ${MEDIA_QUERIES.mobileAndBelow} {\n padding: ${SPACING.ctaPaddingTablet};\n }\n\n ${MEDIA_QUERIES.wide} {\n padding: ${SPACING.ctaPaddingWide};\n }\n`;\n","/**\n * BannerCTA Sub-Component\n * Renders call-to-action button with accessibility support\n */\n\nimport React from 'react';\nimport type { BannerCTAProps } from '../types';\nimport { CTALink } from './BannerCTA.styled';\n\nexport function BannerCTA({\n ctaLabel,\n ctaDestination,\n variant = 'dark',\n onClick,\n testId,\n $\n}: Readonly<BannerCTAProps>): React.ReactElement {\n return (\n <CTALink\n href={ctaDestination}\n variant={variant}\n onClick={onClick}\n data-testid={testId}\n aria-label={ctaLabel}\n {...($?.cta ?? {})}\n >\n {ctaLabel}\n </CTALink>\n );\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 [currentIndex, setCurrentIndex] = useState(initialIndex);\n const [isPaused, setIsPaused] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n\n const goToNext = useCallback(() => {\n setCurrentIndex((prev) => (prev + 1) % totalSlides);\n }, [totalSlides]);\n\n const goToPrevious = useCallback(() => {\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 // Auto-rotation effect\n useEffect(() => {\n if (!autoRotate || isPaused || prefersReducedMotion) return;\n\n const intervalId = setInterval(goToNext, rotationInterval);\n return () => clearInterval(intervalId);\n }, [autoRotate, isPaused, prefersReducedMotion, rotationInterval, goToNext]);\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","/**\n * TypeScript Interfaces & Types\n * Marketing Banner Component\n *\n * This file defines the public API contract for the CsMarketingBanner component.\n * All types use camelCase naming per constitution v2.0.0.\n */\n\nimport { ReactElement } from 'react';\n\n// ============================================================================\n// Type Enums\n// ============================================================================\n\n/** ContentStack metadata for Visual Builder live editing */\nexport type CSMetadata = Record<string, any>;\n\n/** Approved font family options */\nexport type FontFamily = 'Lora' | 'Inter';\n\n/** Preset font size options (responsive per breakpoint) */\nexport type FontSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/** Gradient color options */\nexport type GradientColor = 'black' | 'white';\n\n/** Gradient direction options */\nexport type GradientDirection = 'leftToRight' | 'rightToLeft' | 'radial';\n\n/** Gradient depth/intensity options */\nexport type GradientDepth = 'sm' | 'md' | 'lg';\n\n/** Color theme options */\nexport type ColorTheme = 'primary' | 'secondary';\n\n/** Text color options */\nexport type TextColor = 'white' | 'dark';\n\n/** Media type options */\nexport type MediaType = 'image' | 'gif' | 'video';\n\n/** Banner alignment within page layout */\nexport type BannerAlignment = 'left' | 'center' | 'right' | 'fullWidth';\n\n/** Text content alignment */\nexport type TextAlignment = 'left' | 'center' | 'right';\n\n/** Object-fit options for media */\nexport type ObjectFit = 'cover' | 'contain';\n\n/** CTA button variant options */\nexport type CTAVariant = 'dark' | 'light';\n\n// ============================================================================\n// Core Entity Interfaces\n// ============================================================================\n\n/** Single marketing banner configuration */\nexport interface MarketingBanner {\n headerText?: string;\n title?: string;\n /** Subtitle text - Inter font, responsive sizing */\n subtitle?: string;\n /** Body text - Inter font, responsive sizing */\n bodyText?: string;\n ctaLabel?: string;\n ctaDestination?: string;\n ctaVariant?: CTAVariant;\n mediaUrl?: string;\n fallbackMediaUrl?: string;\n mediaType?: MediaType;\n mediaAlt?: string;\n /** Whether responsive images are enabled (Bynder customTransformation) */\n isResponsive?: boolean;\n /** Desktop image URL with 16:9 aspect ratio */\n desktopUrl?: string;\n /** Mobile image URL with 3:4 aspect ratio */\n mobileUrl?: string;\n\n /** Position of content (text + button): left, center, or right */\n position?: 'left' | 'center' | 'right';\n\n /** Text color for all text elements (header, title, subtitle, body) - white or dark */\n textColor?: TextColor;\n\n // Gradient overlay configuration\n /** Show gradient overlay over media */\n showGradient?: boolean;\n /** Gradient depth/intensity */\n gradientDepth?: GradientDepth;\n\n testId?: string;\n\n /** ContentStack metadata for Visual Builder */\n $?: CSMetadata;\n}\n\n/** Carousel configuration for multiple banner slides */\nexport interface BannerCarousel {\n banners: MarketingBanner[];\n /** Rotation interval in milliseconds (default: 5000) */\n rotationInterval?: number;\n testId?: string;\n}\n\n// ============================================================================\n// Component Props Interfaces\n// ============================================================================\n\n/** Main component props for CsMarketingBanner */\nexport interface CsMarketingBannerProps {\n /** Array of banner configurations. If more than one, displays as carousel */\n readonly banners: MarketingBanner[];\n /** Auto-rotation interval in milliseconds (default: 5000) */\n readonly rotationInterval?: number;\n /** Test ID for component */\n readonly testId?: string;\n /** Context indicator: true if component runs in Visual Builder, false if in live app */\n readonly isVisualBuilderContext?: boolean;\n}\n\n/** Props for BannerText sub-component */\nexport interface BannerTextProps {\n readonly headerText?: string;\n readonly title?: string;\n readonly subtitle?: string;\n readonly bodyText?: string;\n readonly textColor?: string;\n readonly textAlignment?: TextAlignment;\n readonly testId?: string;\n readonly $?: CSMetadata;\n readonly isVisualBuilderContext?: boolean;\n}\n\n/** Props for BannerCTA sub-component */\nexport interface BannerCTAProps {\n readonly ctaLabel: string;\n readonly ctaDestination: string;\n readonly variant?: CTAVariant;\n readonly onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;\n readonly testId?: string;\n readonly $?: CSMetadata;\n}\n\n/** Props for BannerMedia sub-component */\nexport interface BannerMediaProps {\n readonly mediaUrl: string;\n readonly fallbackMediaUrl?: string;\n readonly mediaType?: MediaType;\n readonly mediaAlt?: string;\n readonly onError?: () => void;\n readonly testId?: string;\n readonly $?: CSMetadata;\n readonly isResponsive?: boolean;\n readonly desktopUrl?: string;\n readonly mobileUrl?: string;\n}\n\n// ============================================================================\n// CS Data Transformation Interfaces\n// ============================================================================\n\n/** ContentStack CS data structure (snake_case format) */\nexport interface CSBannerData {\n /** Header text (eyebrow) */\n header_text?: string;\n /** Main title */\n title?: string;\n /** Subtitle text */\n subtitle?: string;\n /** Body text */\n body_text?: string;\n /** CTA button label */\n cta_label?: string;\n /** CTA button destination URL */\n cta_destination?: string;\n /** CTA button variant */\n cta_variant?: 'dark' | 'light';\n bynder_media?: any; // Raw Bynder media object from CS, to be processed by extractBynderMedia\n /** Position of content */\n position?: 'left' | 'center' | 'right';\n /** Text color for all text elements */\n text_color?: 'white' | 'dark';\n /** Show gradient overlay */\n show_gradient?: boolean;\n /** Gradient depth/intensity */\n gradient_depth?: 'sm' | 'md' | 'lg';\n\n /** ContentStack nested objects */\n cta?: {\n label?: string;\n url?: string;\n variant?: 'dark' | 'light';\n $?: CSMetadata;\n };\n gradient?: {\n show_gradient?: boolean;\n gradient_depth?: 'sm' | 'md' | 'lg';\n $?: CSMetadata;\n };\n content_position?: 'left' | 'center' | 'right';\n\n /** ContentStack metadata */\n _metadata?: {\n uid?: string;\n $?: CSMetadata;\n };\n $?: CSMetadata;\n isVisualBuilderContext?: boolean;\n}\n\n/** CS carousel data structure */\nexport interface CSCarouselData {\n banners: CSBannerData[];\n /** Rotation interval in milliseconds */\n rotation_interval?: number;\n\n /** ContentStack metadata */\n _metadata?: {\n uid?: string;\n $?: CSMetadata;\n };\n $?: CSMetadata;\n}\n\n// ============================================================================\n// Utility Type Guards\n// ============================================================================\n\nexport function isCarouselMode(props: CsMarketingBannerProps): boolean {\n return Array.isArray(props.banners) && props.banners.length > 1;\n}\n\nexport function hasMedia(banner: MarketingBanner): boolean {\n return Boolean(banner.mediaUrl);\n}\n\nexport function hasCTA(banner: MarketingBanner): boolean {\n return Boolean(banner.ctaLabel && banner.ctaDestination);\n}\n\n// ============================================================================\n// Hook Return Types\n// ============================================================================\n\nexport interface UseCarouselReturn {\n currentIndex: number;\n isPaused: boolean;\n totalSlides: number;\n goToNext: () => void;\n goToPrevious: () => void;\n goToSlide: (index: number) => void;\n pause: () => void;\n resume: () => void;\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\nexport interface UseMediaLoaderReturn {\n ref: React.RefObject<HTMLDivElement>;\n shouldLoad: boolean;\n hasError: boolean;\n handleError: () => void;\n}\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 }\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 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, BannerMedia, BannerCTA } from './components';\nimport { useCarousel } from './hooks';\nimport { isCarouselMode, hasMedia, hasCTA } from './types';\nimport type { CsMarketingBannerProps, MarketingBanner } from './types';\nimport { TEXT_COLOR_MAP } from './styles/theme';\nimport {\n BannerContainer,\n CarouselWrapper,\n CarouselTrack,\n BannerSlide,\n BannerContent,\n MediaWrapper,\n TextContentWrapper,\n GradientOverlay,\n CarouselControls,\n Indicator\n} from './MarketingBanner.styled';\n\nconst renderBanner = (\n banner: MarketingBanner,\n isVisualBuilderContext: boolean,\n index: number,\n componentTestId?: string\n) => {\n const showMedia = hasMedia(banner);\n const showCTA = hasCTA(banner);\n\n const baseTestId = banner.testId ?? componentTestId ?? 'banner';\n const resolvedTextColor = TEXT_COLOR_MAP[banner.textColor ?? 'white'];\n\n const showGradient = banner.showGradient === true;\n const position = banner.position ?? 'left';\n\n // Derive gradient color from text color (inverse)\n const gradientColor = banner.textColor === '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 return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent hasMedia={showMedia}>\n {showMedia && banner.mediaUrl && (\n <MediaWrapper>\n <BannerMedia\n mediaUrl={banner.mediaUrl}\n fallbackMediaUrl={banner.fallbackMediaUrl}\n mediaType={banner.mediaType}\n mediaAlt={banner.mediaAlt}\n testId={`${baseTestId}-${index}-media`}\n $={banner.$}\n isResponsive={banner.isResponsive}\n desktopUrl={banner.desktopUrl}\n mobileUrl={banner.mobileUrl}\n />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay\n direction={gradientDirection}\n depth={banner.gradientDepth ?? 'md'}\n color={gradientColor}\n />\n )}\n\n <TextContentWrapper position={position}>\n <BannerText\n headerText={banner.headerText}\n title={banner.title}\n subtitle={banner.subtitle}\n bodyText={banner.bodyText}\n textColor={resolvedTextColor}\n textAlignment={textAlignment}\n testId={`${baseTestId}-${index}-text`}\n $={banner.$}\n isVisualBuilderContext={isVisualBuilderContext}\n />\n\n {showCTA && banner.ctaLabel && banner.ctaDestination && (\n <BannerCTA\n ctaLabel={banner.ctaLabel}\n ctaDestination={banner.ctaDestination}\n variant={banner.ctaVariant ?? 'dark'}\n testId={`${baseTestId}-${index}-cta`}\n $={banner.$}\n />\n )}\n </TextContentWrapper>\n </BannerContent>\n </BannerSlide>\n );\n};\n\nexport default function MarketingBannerComponent(props: Readonly<CsMarketingBannerProps>): React.ReactElement {\n const { banners, rotationInterval, testId, isVisualBuilderContext = false } = props;\n\n const isCarousel = isCarouselMode(props);\n\n const carousel = useCarousel({\n totalSlides: banners.length,\n autoRotate: isCarousel,\n rotationInterval: rotationInterval ?? 5000,\n pauseOnHover: true,\n initialIndex: 0\n });\n\n return (\n <BannerContainer\n data-testid={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, isVisualBuilderContext, index, testId))}\n </CarouselTrack>\n </CarouselWrapper>\n\n {isCarousel && (\n <CarouselControls>\n {banners.map((banner, index) => (\n <Indicator\n key={`${testId ?? '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","export type BynderMediaType = 'image' | 'gif' | 'video';\n\nexport type BynderMediaExtracted = {\n url: string;\n type: BynderMediaType;\n alt: string;\n isResponsive?: boolean;\n desktopUrl?: string;\n mobileUrl?: string;\n};\n\nexport type BynderImageDataType = {\n /** selected is manually added, using additionalInfo from bynder */\n selected?: {\n url: string;\n fileSize: number | null;\n width: number | null;\n height: number | null;\n imageType?: string;\n type: 'VIDEO' | 'IMAGE';\n altText?: string;\n fit: 'cover' | 'contain' | 'scale-down' | 'none';\n position: string;\n bgColor: string;\n };\n isPublic: boolean;\n __typename?: 'Image';\n id: string;\n name: string;\n description: string | null;\n databaseId: string;\n originalUrl?: string;\n type: 'VIDEO' | 'IMAGE' | 'DOCUMENT';\n url?: string;\n previewUrls?: string[];\n extensions?: string[];\n textMetaproperties?: ({\n name: string;\n value: string;\n } | null)[];\n files: {\n [key: string]: {\n url: string;\n width: number | null;\n height: number | null;\n fileSize: number | null;\n };\n };\n};\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 ioParam = url.searchParams.get('io');\n\n if (!ioParam) return baseUrl;\n\n const updatedIo = `${ioParam},aspectratio:${aspectRatio}`;\n\n const params: string[] = [];\n params.push(`io=${updatedIo}`);\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\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';\n const result: BynderMediaExtracted = {\n url: mediaUrl,\n type: mediaType,\n alt: selected?.altText ?? ''\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","/**\n * CS Data Transformation Utilities\n * Converts snake_case CS data to camelCase component props\n *\n * Handles actual ContentStack data structure with nested objects and metadata\n * Preserves $ metadata for Visual Builder live editing\n */\n\nimport { extractBynderMedia } from '../../utils/bynder-utils';\nimport type { CSBannerData, CSCarouselData, MarketingBanner, BannerCarousel } from '../types';\n\n/**\n * Transform single banner data from CS format to component props format\n */\nfunction transformCSBanner(csData: CSBannerData): MarketingBanner {\n const mediaData = extractBynderMedia((csData as any).bynder_media);\n\n return {\n title: csData.title,\n headerText: csData.header_text,\n subtitle: csData.subtitle,\n bodyText: csData.body_text,\n ctaLabel: csData.cta?.label ?? csData.cta_label,\n ctaDestination: csData.cta?.url ?? csData.cta_destination,\n ctaVariant: csData.cta?.variant ?? csData.cta_variant,\n mediaUrl: mediaData?.url ?? '',\n fallbackMediaUrl: '',\n mediaType: mediaData?.type ?? 'image',\n mediaAlt: mediaData?.alt ?? '',\n isResponsive: mediaData?.isResponsive,\n desktopUrl: mediaData?.desktopUrl,\n mobileUrl: mediaData?.mobileUrl,\n position: csData.content_position ?? csData.position,\n textColor: csData.text_color,\n showGradient: csData.gradient?.show_gradient ?? csData.show_gradient,\n gradientDepth: csData.gradient?.gradient_depth ?? csData.gradient_depth,\n $: csData.$ // Preserve ContentStack metadata for Visual Builder\n };\n}\n\n/**\n * Transform carousel data from CS format to component props format\n */\nexport function transformCSMarketingBanner(csData: CSCarouselData): BannerCarousel {\n return {\n banners: csData.banners.map(transformCSBanner),\n rotationInterval: csData.rotation_interval\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 ({ paddingVertical, dividerAlign }) => {\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[paddingVertical];\n\n return {\n display: 'flex',\n flexDirection: 'column',\n alignItems: dividerAlign === 'center' ? 'center' : dividerAlign === '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 ({ dividerStyle, dividerThicknessPx, dividerColor, dividerGradient, dividerWidthPercent }) => {\n const base: Record<string, any> = {\n width: `${Math.max(0, Math.min(100, dividerWidthPercent))}%`\n };\n \n if (dividerGradient && dividerStyle !== 'none') {\n base.height = `${dividerThicknessPx}px`;\n base.backgroundImage = dividerGradient;\n base.backgroundSize = '100% 100%';\n \n if (dividerStyle === 'dashed') {\n const dashLength = Math.max(12, dividerThicknessPx * 4);\n const gapLength = Math.max(6, dividerThicknessPx * 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 (dividerStyle === 'dotted') {\n const dotSize = Math.max(2, dividerThicknessPx);\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 ${dividerThicknessPx}px`;\n base.WebkitMaskSize = `${spacing}px ${dividerThicknessPx}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 (dividerStyle === 'none') {\n base.height = `${dividerThicknessPx}px`;\n base.backgroundImage = dividerGradient;\n } else {\n base.borderBottomStyle = dividerStyle;\n base.borderBottomWidth = `${dividerThicknessPx}px`;\n base.borderBottomColor = dividerColor;\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 paddingVertical?: PaddingScale;\n dividerStyle?: DividerStyle;\n dividerThickness?: DividerThickness;\n dividerColor?: string;\n dividerGradientPreset?: 'none' | 'soft' | 'bold' | 'faint';\n dividerWidthPercent?: number;\n dividerAlign?: 'left' | 'center' | 'right';\n}\n\nexport interface StyledSpacingProps {\n paddingVertical: PaddingScale;\n dividerAlign: 'left' | 'center' | 'right';\n}\n\nexport interface StyledDividerProps {\n dividerStyle: DividerStyle;\n dividerThicknessPx: number;\n dividerColor: string;\n dividerGradient?: string;\n dividerWidthPercent: 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 paddingVertical = 'small',\n dividerStyle = 'solid',\n dividerThickness = 'thin',\n dividerColor,\n dividerGradientPreset = 'none',\n dividerWidthPercent = 100,\n dividerAlign = 'left'\n } = props;\n\n const dividerThicknessPx = THICKNESS_PX[dividerThickness];\n const finalDividerColor = isValidHex(dividerColor) ? dividerColor! : DEFAULT_HEX;\n const dividerGradient = gradientPresetCss(dividerGradientPreset, finalDividerColor);\n\n return (\n <StyledSpacingContainer paddingVertical={paddingVertical} dividerAlign={dividerAlign}>\n {dividerStyle !== 'none' && (\n <StyledDividerLine\n dividerStyle={dividerStyle}\n dividerThicknessPx={dividerThicknessPx}\n dividerColor={finalDividerColor}\n dividerGradient={dividerGradient}\n dividerWidthPercent={dividerWidthPercent ?? 100}\n aria-hidden=\"true\"\n />\n )}\n </StyledSpacingContainer>\n );\n};\n\nexport default SpacingDivider;\n","import React, { useRef, useMemo } from 'react';\n\nimport SliderImport from 'react-slick';\nimport * as Styled from './ColumnControl.styled';\n\nimport {\n unwrapComponent,\n EmptyPlaceholder,\n getPresetColumns,\n isVariableWidthPreset,\n getVariableSlideWidth,\n getSlidesToShowByViewport,\n getSlidesForRender,\n buildResponsiveSettings\n} from './utils';\nimport { useColumnControlResize } from './hooks/useColumnControlResize';\n\nimport type { ColumnControlProps } from './types';\nimport { DEVICE_SIZES, getGapPx, MAX_SLIDE_HEIGHT_PX, MAX_ALLOWED_COLUMN_CONTROL_ITEMS } from './types';\n\nimport 'slick-carousel/slick/slick.css';\nimport 'slick-carousel/slick/slick-theme.css';\n\nconst Slider = unwrapComponent(SliderImport);\nconst ColumnControlContainer = unwrapComponent(Styled.ColumnControlContainer);\nconst ArrowButton = unwrapComponent(Styled.ArrowButton);\nconst InnerWrapper = unwrapComponent(Styled.InnerWrapper);\nconst TabletGridContainer = unwrapComponent(Styled.TabletGridContainer);\nconst SlideSection = unwrapComponent(Styled.SlideSection);\nconst SlideInner = unwrapComponent(Styled.SlideInner);\nconst SlideContentInner = unwrapComponent(Styled.SlideContentInner);\n\n/** Ref type for react-slick Slider (only the methods we use). */\ninterface SliderRefInstance {\n slickPrev: () => void;\n slickNext: () => void;\n}\n\ninterface GridLayoutContentProps {\n emptyBlockParentClass?: string;\n slidesForRender: unknown[];\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n renderSlides: (useFlexLayout?: boolean) => React.ReactNode;\n sliderRef: React.RefObject<SliderRefInstance | null>;\n finalSettings: object;\n carouselKey: string;\n preset: string;\n gap: number;\n $?: Record<string, unknown>;\n}\n\ninterface ViewportLayoutState {\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n stackedItemHeight: string;\n stackedItemMaxHeight: number;\n stackedVerticalGap: number;\n containerHeight: string;\n}\n\nfunction getViewportLayoutState(\n isGridLayout: boolean,\n windowWidth: number,\n gapPx: number,\n height?: string\n): ViewportLayoutState {\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport =\n isGridLayout && windowWidth > DEVICE_SIZES.SMALL && windowWidth <= DEVICE_SIZES.LARGE;\n\n const stackedItemHeight = '100%';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = isGridLayout && isStackedViewport ? gapPx : 0;\n const containerHeight = height ?? 'auto';\n\n return {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight\n };\n}\n\ninterface SlidesMeta<T> {\n gridSlides: T[];\n slidesToShow: number;\n shouldShowDots: boolean;\n}\n\nfunction getSlidesMeta<T>(\n slides: T[],\n isGridLayout: boolean,\n presetColumns: number,\n presetSlidesToShow: number,\n effectiveShowPagination: boolean\n): SlidesMeta<T> {\n const gridSlides = isGridLayout ? slides.slice(0, MAX_ALLOWED_COLUMN_CONTROL_ITEMS) : slides;\n\n const slidesToShow = isGridLayout\n ? Math.min(gridSlides.length, presetColumns, MAX_ALLOWED_COLUMN_CONTROL_ITEMS)\n : presetSlidesToShow;\n\n const shouldShowDots = isGridLayout\n ? effectiveShowPagination && gridSlides.length > 1\n : gridSlides.length > 1;\n\n return { gridSlides, slidesToShow, shouldShowDots };\n}\n\nfunction 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 flexBasis = presetColumns === 1 ? '100%' : `calc(50% - ${gap / 2}px)`;\n\n return slidesForRender.map((slide, index) => {\n let slideWidth: string | undefined;\n\n if (!useFlexLayout && isVariableWidth) {\n slideWidth = getSlideWidth(index);\n }\n\n const slideId = (slide as { id?: string | number } | null | undefined)?.id;\n const slideKey = slideId != null ? String(slideId) : `slide-${index}`;\n\n return (\n <SlideSection\n key={slideKey}\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={flexBasis}\n isVariableWidth={isVariableWidth}\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\nfunction GridLayoutContent(props: Readonly<GridLayoutContentProps>) {\n const {\n emptyBlockParentClass,\n isStackedViewport,\n isTabletGridViewport,\n renderSlides,\n sliderRef,\n finalSettings,\n carouselKey,\n preset,\n slidesForRender,\n gap,\n $ = {}\n } = props;\n if (isStackedViewport) {\n return (\n <div className=\"column-control-container\">\n {slidesForRender.length > 0 ? (\n renderSlides()\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n )}\n </div>\n );\n }\n if (isTabletGridViewport) {\n return (\n <TabletGridContainer className=\"column-control-container\" gap={gap}>\n {slidesForRender.length > 0 ? (\n renderSlides(true)\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n )}\n </TabletGridContainer>\n );\n }\n // Desktop / wide grid viewport: render using Slider for structure but with grid-safe settings\n return slidesForRender.length > 0 ? (\n <Slider ref={sliderRef} {...finalSettings} key={`${carouselKey}-${preset}`}>\n {renderSlides(true)}\n </Slider>\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n );\n}\n\nfunction ColumnControl<T = unknown>({\n slides,\n renderSlide,\n preset = 'single-full',\n layout = 'grid',\n autoplayEnabled = false,\n autoplayDuration = 3,\n showPagination = true,\n onSlideChange,\n className,\n slickSettings,\n gap = 'medium',\n height,\n fullWidth,\n emptyBlockParentClass,\n isEditing,\n parent$,\n $\n}: ColumnControlProps<T>) {\n const gapPx = getGapPx(gap);\n const isGridLayout = layout === 'grid';\n // Default fullWidth to true when layout is grid\n const effectiveFullWidth = fullWidth ?? isGridLayout;\n\n const { windowWidth, carouselKey } = useColumnControlResize(preset, slides.length);\n\n // Base column count derived purely from preset (ignores viewport).\n const presetColumns = useMemo(() => getPresetColumns(preset), [preset]);\n\n const presetSlidesToShow = getSlidesToShowByViewport(windowWidth, presetColumns);\n\n const isVariableWidth = isVariableWidthPreset(preset, windowWidth);\n\n const getSlideWidth = useMemo(\n () => (index: number) => getVariableSlideWidth(preset, index, windowWidth),\n [preset, windowWidth]\n );\n\n const effectiveAutoplayEnabled = isGridLayout ? false : autoplayEnabled;\n const effectiveShowPagination = isGridLayout ? false : showPagination;\n // Arrows: desktop only (>1024px), never on mobile/tablet\n const showArrowsOnDesktop = !isGridLayout && windowWidth > DEVICE_SIZES.LARGE;\n\n // Stacked = single column only on small mobile\n const {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight\n } = getViewportLayoutState(isGridLayout, windowWidth, gapPx, height);\n\n const { gridSlides, slidesToShow, shouldShowDots } = getSlidesMeta(\n slides,\n isGridLayout,\n presetColumns,\n presetSlidesToShow,\n effectiveShowPagination\n );\n\n const responsiveSettings = useMemo(\n () =>\n buildResponsiveSettings({\n isGridLayout,\n presetSlidesToShow,\n gridSlides,\n presetColumns,\n shouldShowDots\n }),\n [isGridLayout, presetSlidesToShow, gridSlides, presetColumns, shouldShowDots]\n );\n\n const settings = {\n dots: shouldShowDots,\n infinite: !isGridLayout && gridSlides.length > slidesToShow,\n speed: 500,\n slidesToShow,\n slidesToScroll: 1,\n autoplay: effectiveAutoplayEnabled,\n autoplaySpeed: autoplayDuration * 1000,\n pauseOnHover: true,\n arrows: false,\n variableWidth: isVariableWidth,\n swipe: !isGridLayout,\n draggable: !isGridLayout,\n beforeChange: (_: number, next: number) => {\n if (onSlideChange) {\n onSlideChange(next);\n }\n },\n responsive: responsiveSettings,\n ...slickSettings\n };\n\n const sliderRef = useRef<SliderRefInstance | null>(null);\n\n const goToPrevious = () => {\n sliderRef.current?.slickPrev();\n };\n\n const goToNext = () => {\n sliderRef.current?.slickNext();\n };\n\n const finalSettings = {\n ...settings\n };\n\n const containerClassName = [className, isGridLayout ? 'column-control-container' : undefined]\n .filter(Boolean)\n .join(' ');\n\n const slidesForRender = getSlidesForRender({\n isGridLayout,\n isStackedViewport,\n isTabletGridViewport,\n gridSlides,\n presetColumns,\n slidesToShow\n });\n\n const renderSlides = (useFlexLayout = false) =>\n renderSlidesContent({\n slidesForRender,\n renderSlide,\n presetColumns,\n gap: gapPx,\n isVariableWidth,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout,\n $\n });\n\n return (\n <ColumnControlContainer\n gap={gapPx}\n height={containerHeight}\n columnHeight={stackedItemHeight}\n maxColumnHeight={stackedItemMaxHeight}\n isVariableWidth={isVariableWidth}\n className={containerClassName}\n aria-label={layout === 'carousel' ? 'Carousel Control' : 'Column Control'}\n fullWidth={effectiveFullWidth}\n {...(parent$ ?? {})}\n >\n <InnerWrapper>\n <div\n {...($?.['slides'] ?? {})}\n {...($?.['slides__parent'] ?? {})}\n {...{ 'data-add-direction': 'horizontal' }}\n >\n {layout === 'carousel' && (\n <Slider ref={sliderRef} {...finalSettings} key={carouselKey}>\n\n {\n slidesForRender.length > 0 ?\n renderSlides() :\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n }\n </Slider>\n )}\n {layout === 'grid' && (\n <GridLayoutContent\n emptyBlockParentClass={emptyBlockParentClass}\n slidesForRender={slidesForRender}\n isStackedViewport={isStackedViewport}\n isTabletGridViewport={isTabletGridViewport}\n renderSlides={renderSlides}\n sliderRef={sliderRef}\n finalSettings={finalSettings}\n carouselKey={carouselKey}\n preset={preset}\n gap={gapPx}\n $={$}\n />\n )}\n </div>\n\n {layout === 'carousel' && showArrowsOnDesktop && slides.length > slidesToShow && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={goToPrevious}\n aria-label=\"Previous slide\"\n fullWidth={effectiveFullWidth}\n >\n ‹\n </ArrowButton>\n <ArrowButton direction=\"next\" onClick={goToNext} aria-label=\"Next slide\" fullWidth={effectiveFullWidth}>\n ›\n </ArrowButton>\n </>\n )}\n </InnerWrapper>\n </ColumnControlContainer>\n );\n};\n\nexport default ColumnControl as React.FC<ColumnControlProps>;\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, 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 isVariableWidth: boolean;\n fullWidth?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth }) => ({\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: '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 ...(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' ? '100%' : 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: 'absolute',\n // Bring pagination closer to the slides\n bottom: -36,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: 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: -32,\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 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 // Fill parent height so renderSlide content can occupy full slide height\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 boxSizing: useFlexLayout ? 'border-box' : undefined,\n // Prevent slides from shrinking too small for readability (non-variable presets)\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 // 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 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 ...(fullWidth\n ? direction === 'prev'\n ? { left: 8 }\n : { right: 8 }\n : direction === 'prev'\n ? { left: -60 }\n : { right: -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 ...(fullWidth\n ? direction === 'prev'\n ? { left: 4 }\n : { right: 4 }\n : direction === 'prev'\n ? { left: -45 }\n : { right: -45 })\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n width: 32,\n height: 32,\n fontSize: 20,\n ...(fullWidth\n ? direction === 'prev'\n ? { left: 2 }\n : { right: 2 }\n : direction === 'prev'\n ? { left: -35 }\n : { right: -35 })\n }\n}));\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%'\n});\n\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\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 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?: SlidePreset;\n /** Layout mode: grid behaves like stacked list on small/tablet; carousel uses full slider behavior */\n layout?: 'grid' | 'carousel';\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 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 const DEVICE_SIZES = {\n ULTRA_SMALL: 320,\n EXTRA_SMALL: 480,\n SMALL: 600,\n MEDIUM: 768,\n LARGE: 1024,\n EXTRA_LARGE: 1200,\n ULTRA_LARGE: 1440,\n SUPER_LARGE: 1920\n} as const;\n\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/** Max height of a slide/card when height is content-driven. Authoring guide recommends designing for 400px. */\nexport const MAX_SLIDE_HEIGHT_PX = 450;\n\n// Max number of items allowed when using grid/column-control style layout\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 4;\n","import React from 'react';\n\nimport { EmptyPlaceholderWrapper } from './ColumnControl.styled';\nimport type { ColumnControlProps } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS } from './types';\n\nexport function unwrapComponent<T>(mod: T): any {\n if (!mod) return mod;\n\n // already a component/function\n if (typeof mod === 'function') return mod;\n\n // default export wrapped\n if (typeof mod === 'object' && (mod as any).default) {\n return (mod as any).default;\n }\n\n return mod;\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items to the column control/carousel'\n}) =>\n React.createElement(\n EmptyPlaceholderWrapper as React.ComponentType<any>,\n { className: emptyBlockParentClass },\n text\n );\n\nexport function getPresetColumns(preset: ColumnControlProps['preset']): 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\nexport function isVariableWidthPreset(preset: ColumnControlProps['preset'], windowWidth: number): boolean {\n if (windowWidth <= DEVICE_SIZES.MEDIUM) return false;\n return preset === 'two-small-large' || preset === 'three-small-medium-large';\n}\n\nexport function getVariableSlideWidth(\n preset: ColumnControlProps['preset'],\n index: number,\n windowWidth: number\n): string {\n if (windowWidth <= DEVICE_SIZES.MEDIUM) return 'auto';\n\n if (preset === 'two-small-large') {\n return index % 2 === 0 ? '33.33%' : '66.67%';\n }\n\n if (preset === 'three-small-medium-large') {\n const pos = index % 3;\n if (pos === 0 || pos === 2) return '25%';\n return '50%';\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 getSlidesForRender<T>(params: {\n isGridLayout: boolean;\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n gridSlides: T[];\n presetColumns: number;\n slidesToShow: number;\n}): T[] {\n const { isGridLayout, isStackedViewport, isTabletGridViewport, gridSlides, presetColumns, slidesToShow } = params;\n if (isGridLayout && (isStackedViewport || isTabletGridViewport)) {\n return gridSlides.slice(0, Math.min(presetColumns, gridSlides.length));\n }\n if (isGridLayout) return gridSlides.slice(0, slidesToShow);\n return gridSlides;\n}\n\nexport function buildResponsiveSettings(params: {\n isGridLayout: boolean;\n presetSlidesToShow: number;\n gridSlides: unknown[];\n presetColumns: number;\n shouldShowDots: boolean;\n}) {\n const { isGridLayout, presetSlidesToShow, gridSlides, presetColumns, shouldShowDots } = params;\n const gridSlidesToShow = (maxCols: number) => Math.min(gridSlides.length, presetColumns, maxCols);\n const carouselSlidesToShow = (maxCols: number) => Math.min(presetSlidesToShow, maxCols);\n return [\n {\n breakpoint: DEVICE_SIZES.SMALL,\n settings: {\n slidesToShow: isGridLayout ? 1 : Math.min(presetSlidesToShow, 1),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.MEDIUM,\n settings: {\n slidesToShow: isGridLayout ? gridSlidesToShow(2) : carouselSlidesToShow(2),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.LARGE,\n settings: {\n slidesToShow: isGridLayout\n ? gridSlidesToShow(MAX_ALLOWED_COLUMN_CONTROL_ITEMS)\n : carouselSlidesToShow(3),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n }\n ];\n}\n","import { useEffect, useState } from 'react';\n\nimport type { ColumnControlProps } from '../types';\n\nexport interface UseColumnControlResizeResult {\n windowWidth: number;\n carouselKey: string;\n}\n\nexport function useColumnControlResize(\n preset: ColumnControlProps['preset'],\n slideCount: number\n): UseColumnControlResizeResult {\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 from 'react';\nimport { NsIcon, NsIconVariants } from '@nuskin/foundation-ui-components';\nimport { ButtonContainer, StyledButton, StyledLabelText, StyledIconWrapper } from './Button.styled';\nimport {\n getButtonWidth,\n getIconSize,\n isValidDestination,\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 label,\n open_in_new_tab: target = DEFAULT_TARGET,\n variant,\n button_size: size,\n alignment,\n buttontype: buttonType = DEFAULT_BUTTON_TYPE,\n icon,\n iconposition: iconPosition,\n button_state: disabled,\n placeholder_text: placeholderText = DEFAULT_PLACEHOLDER_TEXT,\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 resolvedIconPosition = iconPosition ?? DEFAULT_ICON_POSITION;\n\n const resolvedButtonType: ButtonType =\n buttonType === BUTTON_TYPE_ROUNDED ? BUTTON_TYPE_ROUNDED : BUTTON_TYPE_SQUARE;\n\n const resolvedUrl = label?.href?.trim() ?? undefined;\n const hrefProp = isValidDestination(resolvedUrl) ? resolvedUrl : undefined;\n\n const variantDefault =\n variantDefaults[resolvedVariant as keyof typeof variantDefaults] ?? variantDefaults[DEFAULT_VARIANT];\n const buttonWidth = getButtonWidth(resolvedSize);\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 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}>\n <NsIcon name={IconName} size={iconSize} colorOverride={iconColor} {...($?.icon ?? {})} />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n const labelTitle = label?.title ?? '';\n\n if (isEditing) {\n return labelTitle;\n }\n\n if (labelTitle === '' || labelTitle === placeholderText) {\n return placeholderText;\n }\n\n return labelTitle;\n };\n\n return (\n <ButtonContainer alignment={resolvedAlignment}>\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 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 {renderIcon('left')}\n <StyledLabelText {...(label?.$?.title ?? {})}>{getLabelText()}</StyledLabelText>\n {renderIcon('right')}\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 } from './types';\nimport { ROUNDED_BORDER_RADIUS, ICON_MARGIN, BUTTON_TYPE_ROUNDED } from './helpers';\n\nconst BUTTON_GAP = '4px';\nconst BUTTON_MIN_WIDTH = '70px';\nconst BUTTON_MIN_HEIGHT = '30px';\nconst DESKTOP_BREAKPOINT = '769px';\nconst TABLET_BREAKPOINT = '768px';\nconst MOBILE_BREAKPOINT = '425px';\nconst DESKTOP_FONT_SIZE = '13px';\nconst TABLET_FONT_SIZE = '12px';\nconst MOBILE_FONT_SIZE = '10px';\nconst DESKTOP_PADDING = '10px 6px';\nconst TABLET_PADDING = '8px 6px';\nconst MOBILE_PADDING = '4px 8px';\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): string => {\n if (alignment === 'center') return JUSTIFY_CONTENT_CENTER;\n if (alignment === 'right') return JUSTIFY_CONTENT_FLEX_END;\n return JUSTIFY_CONTENT_FLEX_START;\n};\n\nexport const ButtonContainer = styled('div')<{ alignment: ButtonAlignment }>`\n display: flex;\n justify-content: ${props => getJustifyContent(props.alignment)};\n width: 100%;\n`;\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $buttonWidth: 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 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 \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 min-width: ${BUTTON_MIN_WIDTH};\n min-height: ${BUTTON_MIN_HEIGHT};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n width: ${props => props.$buttonWidth};\n ${props => props.$buttonType === BUTTON_TYPE_ROUNDED && `border-radius: ${ROUNDED_BORDER_RADIUS};`}\n }\n\n @media (min-width: ${DESKTOP_BREAKPOINT}) {\n && {\n font-size: ${DESKTOP_FONT_SIZE};\n padding: ${DESKTOP_PADDING};\n font-weight: ${DESKTOP_FONT_WEIGHT};\n }\n }\n \n @media (max-width: ${TABLET_BREAKPOINT}) {\n && {\n font-size: ${TABLET_FONT_SIZE};\n padding: ${TABLET_PADDING};\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${MOBILE_BREAKPOINT}) {\n && {\n font-size: ${MOBILE_FONT_SIZE};\n padding: ${MOBILE_PADDING};\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\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\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 = '99px';\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 Label';\nexport const DEFAULT_TARGET = 'No';\nexport const BUTTON_TYPE_ROUNDED = 'rounded';\nexport const BUTTON_TYPE_SQUARE = 'square';\nexport const BORDER_COLOR_TRANSPARENT = 'transparent';\n\nexport function isValidDestination(dest?: string): boolean {\n if (!dest || dest.trim() === '') return false;\n \n const trimmed = dest.trim();\n \n if (trimmed.startsWith('#')) return true;\n if (trimmed.startsWith('/')) return true;\n if (trimmed.startsWith('//')) return true;\n \n try {\n const url = new URL(trimmed);\n return url.protocol === PROTOCOL_HTTP || url.protocol === PROTOCOL_HTTPS;\n } catch {\n return false;\n }\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} 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 { NsTypography } from '@nuskin/foundation-ui-components';\n\ninterface TypographyProps {\n value?: string;\n placeholder: string;\n isEditing: boolean;\n typographyProps: React.ComponentProps<typeof NsTypography>;\n}\n\nexport const Typography = ({\n value,\n placeholder,\n isEditing,\n typographyProps\n}: TypographyProps) => {\n\n let displayValue = value;\n\n if (!isEditing && value !== placeholder) {\n displayValue = value;\n } else if (value === '') {\n displayValue = placeholder;\n }\n\n return (\n <NsTypography {...typographyProps}>\n {displayValue}\n </NsTypography>\n );\n};\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// Media loading attribute\nexport const IMAGE_LOADING_LAZY = 'lazy';\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';\n\ninterface TypographyFieldConfig {\n value?: string;\n placeholder: string;\n variant: 'body-s' | 'h2' | 'h5' | 'h6';\n className: string;\n noSpacing?: boolean;\n weight?: 'bold';\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}\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: 'body-s',\n className: 'brand-caption',\n noSpacing: true,\n editTagKey: 'brandcaption'\n },\n {\n value: title,\n placeholder: PLACEHOLDER_TITLE,\n variant: 'h2',\n className: 'title',\n weight: 'bold',\n editTagKey: 'title'\n },\n {\n value: subtitle,\n placeholder: PLACEHOLDER_SUBTITLE,\n variant: 'h5',\n className: 'subtitle',\n editTagKey: 'subtitle'\n },\n {\n value: body,\n placeholder: PLACEHOLDER_BODY,\n variant: 'h6',\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}) => {\n const fields = getTypographyFields(brandcaption, title, subtitle, body);\n\n return (\n <>\n {fields.map((field) => {\n const typographyProps: React.ComponentProps<typeof Typography>['typographyProps'] = {\n variant: field.variant,\n className: field.className,\n ...(field.noSpacing && { noSpacing: true }),\n ...(field.weight && { weight: field.weight }),\n additionalProps: { ...(editTags?.[field.editTagKey] ?? {}) }\n };\n return (\n <Typography\n key={field.editTagKey}\n value={field.value}\n placeholder={field.placeholder}\n isEditing={isEditing}\n typographyProps={typographyProps}\n />\n );\n })}\n </>\n );\n};\n","import React from 'react';\nimport { NsImage } from '@nuskin/foundation-ui-components';\nimport { PictureElement, SourceElement } from '../HeroBanner.styled';\nimport {\n ParsedMedia,\n getImageProps,\n isFullSize,\n FULL_SIZE_PERCENT,\n MOBILE_BREAKPOINT,\n DESKTOP_BREAKPOINT\n} from '../helpers';\nimport { IMAGE_LOADING_LAZY } from '../constants';\n\ninterface MediaProps {\n parsedMedia: ParsedMedia | null;\n mediaWidth: string | number;\n mediaHeight: string | number;\n mediaAttributes?: Record<string, unknown>;\n}\n\nexport const Media: React.FC<MediaProps> = ({\n parsedMedia,\n mediaWidth,\n mediaHeight,\n mediaAttributes = {}\n}) => {\n if (!parsedMedia) return null;\n\n const fullSize = isFullSize(mediaWidth, mediaHeight);\n const imageProps = getImageProps(fullSize, mediaWidth, mediaHeight);\n\n const renderImage = () => {\n const commonImageProps = {\n ...imageProps,\n loading: IMAGE_LOADING_LAZY,\n ...mediaAttributes\n };\n\n if (parsedMedia.isResponsive && parsedMedia.desktopUrl && parsedMedia.mobileUrl) {\n return (\n <PictureElement>\n <SourceElement media={MOBILE_BREAKPOINT} srcSet={parsedMedia.mobileUrl} />\n <SourceElement media={DESKTOP_BREAKPOINT} srcSet={parsedMedia.desktopUrl} />\n <NsImage src={parsedMedia.desktopUrl} alt={parsedMedia.alt} {...commonImageProps} />\n </PictureElement>\n );\n }\n\n return <NsImage src={parsedMedia.url ?? ''} alt={parsedMedia.alt ?? ''} {...commonImageProps} />;\n };\n\n const mediaContent = (() => {\n if (parsedMedia.type === 'image' || parsedMedia.type === 'gif') {\n return renderImage();\n }\n\n if (parsedMedia.type === 'video') {\n return (\n <video\n src={parsedMedia.url}\n autoPlay\n muted\n loop\n playsInline\n preload=\"auto\"\n width={fullSize ? FULL_SIZE_PERCENT : mediaWidth}\n height={fullSize ? FULL_SIZE_PERCENT : mediaHeight}\n style={{ objectFit: 'cover' }}\n {...mediaAttributes}\n />\n );\n }\n\n return null;\n })();\n\n if (!mediaContent) return null;\n\n return (\n <div className=\"media-layer\">\n {mediaContent}\n </div>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nimport { GradientDepth } from './helpers';\n\n// Container\n\nexport const Container = styled('section') <{ textColor?: string }>`\n width: 100%;\n position: relative;\n min-height: 450px;\n overflow: hidden;\n\n .media-layer {\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 .media-layer .media-fill {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .content {\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n }\n\n .title {\n font-size: clamp(22px, 3.5vw, 48px);\n line-height: 1.05;\n margin-bottom: 8px;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .subtitle {\n margin-bottom: 8px;\n font-size: clamp(16px, 2.2vw, 24px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .brand-caption {\n margin-bottom: 8px;\n font-size: clamp(12px, 1.5vw, 16px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .body {\n margin-bottom: 8px;\n font-size: clamp(14px, 1.6vw, 18px);\n line-height: 1.4;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\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// Responsive picture \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// 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: clamp(16px, 4vw, 48px);\n pointer-events: none;\n justify-content: ${({ justifyContent }) => justifyContent ?? 'flex-start'};\n\n // Force center alignment on mobile\n @media (max-width: 768px) {\n justify-content: center;\n }\n`;\n\n// Content\n\nexport const Content = styled.div<{ textAlign?: string }>`\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\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 (max-width: 768px) {\n text-align: center;\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","import { extractBynderMedia } from '../utils/bynder-utils';\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 interface ParsedMedia {\n type: 'image' | 'gif' | 'video';\n url: string;\n alt: string;\n width?: number;\n height?: number;\n isResponsive?: boolean;\n desktopUrl?: string;\n mobileUrl?: string;\n}\n\ninterface MediaObject {\n type?: string;\n src?: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\nfunction isMediaObject(media: unknown): media is MediaObject {\n return typeof media === 'object' && media !== null && 'type' in media && 'src' in media;\n}\n\nexport function parseMedia(media: unknown): ParsedMedia | null {\n if (!media) return null;\n\n // Storybook / direct Media object\n if (isMediaObject(media)) {\n return {\n type: media.type as 'image' | 'gif' | 'video',\n url: media.src ?? '',\n alt: media.alt ?? '',\n width: media.width,\n height: media.height,\n isResponsive: false\n };\n }\n\n // Contentstack JSON string – use bynder-utils \n if (typeof media === 'string') {\n const extracted = extractBynderMedia(media);\n if (extracted) {\n return {\n type: extracted.type,\n url: extracted.url,\n alt: extracted.alt,\n isResponsive: extracted.isResponsive ?? false,\n desktopUrl: extracted.desktopUrl,\n mobileUrl: extracted.mobileUrl\n };\n }\n }\n\n return null;\n}\n\nexport function resolveContentAlignment(contentAlignment?: ContentAlignment): ContentAlignment {\n return contentAlignment ?? 'left';\n}\n\nexport function resolveGradientDepth(gradientDepth?: GradientDepth): GradientDepth {\n return gradientDepth ?? 'md';\n}\n\nexport function resolveTextColor(textColor?: string): TextColor {\n return (textColor === 'white' ? 'white' : 'black') as TextColor;\n}\n\nexport function resolveWidth(width?: string | number): string | undefined {\n if (!width) return undefined;\n const widthStr = String(width);\n return widthStr !== '' ? widthStr : undefined;\n}\n\nexport function resolveHeight(height?: string | number): string | undefined {\n if (!height) return undefined;\n const heightStr = String(height);\n return heightStr !== '' ? heightStr : undefined;\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\nexport function isFullSize(mediaWidth: string | number, mediaHeight: string | number): boolean {\n return String(mediaWidth) === FULL_SIZE_PERCENT && String(mediaHeight) === FULL_SIZE_PERCENT;\n}\n\nexport function getImageProps(\n isFullSize: boolean,\n mediaWidth: string | number,\n mediaHeight: string | number\n): { variant: 'fill'; className: 'media-fill' } | { style: { width: string; height: string } } {\n if (isFullSize) {\n return { variant: 'fill', className: 'media-fill' };\n }\n\n return {\n style: {\n width: String(mediaWidth),\n height: String(mediaHeight)\n }\n };\n}\n","import React from 'react';\nimport { Button } from '../button';\nimport { TypographyFields } from './components/TypographyFields';\nimport { Media } from './components/Media';\nimport { HeroBannerProps } from './types';\nimport { Container, GradientOverlay, Overlay, Content, getJustifyContent } from './HeroBanner.styled';\nimport {\n parseMedia,\n resolveContentAlignment,\n resolveGradientDepth,\n resolveTextColor,\n resolveWidth,\n resolveHeight,\n getGradientColor,\n getGradientDirection,\n FULL_SIZE_PERCENT\n} from './helpers';\nimport { ARIA_LABEL_HERO_BANNER } from './constants';\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 width,\n height,\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 const resolvedWidth = resolveWidth(width);\n const resolvedHeight = resolveHeight(height);\n\n const parsedMedia = parseMedia(media);\n\n const mediaWidth = resolvedWidth ?? FULL_SIZE_PERCENT;\n const mediaHeight = resolvedHeight ?? FULL_SIZE_PERCENT;\n const justifyContent = getJustifyContent(resolvedContentAlignment);\n const gradientColor = getGradientColor(resolvedTextColor);\n const gradientDirection = getGradientDirection(resolvedContentAlignment);\n const shouldRenderButton = button && (button.label?.title || isEditing);\n\n return (\n <Container\n className={className}\n textColor={resolvedTextColor}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {parsedMedia && (\n <Media\n parsedMedia={parsedMedia}\n mediaWidth={mediaWidth}\n mediaHeight={mediaHeight}\n mediaAttributes={$?.media ?? {}}\n />\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 />\n\n {shouldRenderButton && (\n <Button\n {...button}\n alignment={resolvedContentAlignment ?? button?.alignment}\n parent$={$?.button}\n isEditing={isEditing}\n />\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n","import { ReactElement, useMemo } from 'react';\nimport DOMPurify from 'dompurify';\nimport CsText from '../text/CsText';\nimport type { ComponentProps } from 'react';\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}\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 ],\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\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 = ({ text_editor, font_color, ...restProps }: 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 // Pass sanitized HTML to CsText component with all other props\n return <CsText {...restProps} text_editor={sanitizedHtml} font_color={fontColorBoolean} />;\n};\n\nexport default RichText;\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/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/marketing-banner/components/BannerMedia.tsx","../src/marketing-banner/components/BannerMedia.styled.tsx","../src/marketing-banner/components/BannerCTA.styled.tsx","../src/marketing-banner/components/BannerCTA.tsx","../src/marketing-banner/hooks/useCarousel.ts","../src/marketing-banner/hooks/useReducedMotion.ts","../src/marketing-banner/types.ts","../src/marketing-banner/MarketingBanner.styled.tsx","../src/marketing-banner/MarketingBanner.tsx","../src/utils/bynder-utils.ts","../src/marketing-banner/utils/transform.ts","../src/spacing-divider/SpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/SpacingDivider.tsx","../src/column-control/ColumnControl.tsx","../src/column-control/ColumnControl.styled.tsx","../src/column-control/types.ts","../src/column-control/utils.ts","../src/column-control/hooks/useColumnControlResize.ts","../src/button/Button.tsx","../src/button/Button.styled.tsx","../src/button/helpers.ts","../src/hero-banner/components/Typography.tsx","../src/hero-banner/constants.ts","../src/hero-banner/components/TypographyFields.tsx","../src/hero-banner/components/Media.tsx","../src/hero-banner/HeroBanner.styled.tsx","../src/hero-banner/helpers.ts","../src/hero-banner/HeroBanner.tsx","../src/rich-text/RichText.tsx"],"names":["On","Object","create","xe","defineProperty","Nn","getOwnPropertyDescriptor","Un","getOwnPropertyNames","Gn","getPrototypeOf","Fn","prototype","hasOwnProperty","Wn","e","t","r","get","enumerable","gt","n","i","call","B","__esModule","value","Hn","index_exports","__export","Button","Button_default","ColumnControl","ColumnControl_default","CsImage","CsImage_default","CsTextComponent","CsText_default","DEFAULT_BANNER_CONFIG","DEFAULT_CAROUSEL_CONFIG","DEFAULT_ROTATION_INTERVAL","DEVICE_SIZES","GAP_PRESET_VALUES","HeroBanner","HeroBanner_default","MAX_ALLOWED_COLUMN_CONTROL_ITEMS","MAX_SLIDE_HEIGHT_PX","MIN_SLIDE_HEIGHT_PX","MIN_SLIDE_WIDTH_PX","MarketingBanner","MarketingBannerComponent","PLACEHOLDER_VALUES","RichTextComponent","RichText_default","SpacingDivider","SpacingDivider_default","getGapPx","hasCTA","hasMedia","isCarouselMode","transformCSMarketingBanner","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","ut","ColorUtils","getGenomeColor","ft","useToggleFontColor","toggleValue","theme","mt","useTheme","ht","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","ye","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","bt","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","De","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","xt","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","Oe","className","Tt","NsImage","position","textColor","showGradient","gradientDepth","mediaType","ctaVariant","rotationInterval","header","subtitle","BREAKPOINTS","mobile","tablet","desktop","wide","FONT_STACKS","lora","inter","FONT_SIZES","cta","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","responsiveFontSize","sizes","I","css","centerOnMobile","smoothTransition","properties","map","prop","join","absoluteFill","absoluteFullSize","centerHorizontal","flexCenter","resetSpacing","gradientOverlay","direction","startOpacity","endOpacity","baseColor","radialGradientOverlay","TextContainer","te","textAlignment","HeaderText","p","Title","h2","Subtitle","h3","BodyText","getDisplayText","placeholderValue","isVisualBuilderContext","BannerText","headerText","bodyText","testId","titleDisplay","subtitleDisplay","Z","jsxs","header_text","body_text","MediaContainer","j","StyledImage","img","StyledVideo","video","FallbackMessage","PictureElement","picture","SourceElement","source","BannerMedia","mediaUrl","fallbackMediaUrl","mediaAlt","onError","isResponsive","desktopUrl","mobileUrl","ve","React","useState","currentUrl","setCurrentUrl","hasError","setHasError","useEffect","handleMediaError","renderMedia","L","autoPlay","muted","loop","playsInline","bynder_media","srcSet","loading","darkVariant","ze","lightVariant","CTALink","Dt","a","variant","BannerCTA","ctaLabel","ctaDestination","onClick","Nt","useReducedMotion","Ee","prefersReducedMotion","setPrefersReducedMotion","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","options","totalSlides","autoRotate","pauseOnHover","initialIndex","w","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","useCallback","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","Array","isArray","banners","banner","BannerContainer","k","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","MediaWrapper","TextContentWrapper","GradientOverlay","depth","opacities","sm","start","end","md","lg","CarouselControls","Indicator","button","active","renderBanner","componentTestId","showMedia","showCTA","baseTestId","resolvedTextColor","gradientColor","gradientDirection","v","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","getMediaUrl","isPublic","previewUrls","fileType","type","generateResponsiveUrl","baseUrl","aspectRatio","URL","ioParam","searchParams","updatedIo","push","origin","error","addDefaultTransform","has","extractBynderMedia","mediaJson","firstImage","toLowerCase","endsWith","result","transformCSBanner","csData","mediaData","label","cta_label","cta_destination","cta_variant","content_position","text_color","show_gradient","gradient_depth","rotation_interval","THICKNESS_PX","thin","medium","thick","ultra","StyledSpacingContainer","Je","vertical_padding","divider_alignment","none","small","large","flexDirection","alignItems","paddingTop","paddingBottom","StyledDividerLine","divider_style","divider_thickness_px","divider_color","divider_gradient","divider_width_percent","base","Math","max","min","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","qe","import_react_slick","gap","ULTRA_SMALL","EXTRA_SMALL","SMALL","MEDIUM","LARGE","EXTRA_LARGE","ULTRA_LARGE","SUPER_LARGE","ColumnControlContainer","M","columnHeight","maxColumnHeight","textAlign","padding","boxSizing","overflow","minHeight","margin","maxHeight","bottom","listStyle","li","borderRadius","border","textIndent","cursor","transition","TabletGridContainer","flexWrap","SlideSection","useFlexLayout","stackedVerticalGap","stackedItemHeight","stackedItemMaxHeight","slideWidth","flexBasis","isVariableWidth","flex","minWidth","SlideInner","SlideContentInner","ArrowButton","top","transform","zIndex","fontSize","lineHeight","verticalAlign","outline","outlineOffset","opacity","InnerWrapper","EmptyPlaceholderWrapper","unwrapComponent","mod","EmptyPlaceholder","emptyBlockParentClass","cr","createElement","getPresetColumns","isVariableWidthPreset","windowWidth","getVariableSlideWidth","pos","getSlidesToShowByViewport","presetColumns","getSlidesForRender","isGridLayout","isStackedViewport","isTabletGridViewport","gridSlides","slidesToShow","buildResponsiveSettings","presetSlidesToShow","shouldShowDots","gridSlidesToShow","maxCols","carouselSlidesToShow","breakpoint","settings","slidesToScroll","swipeToSlide","arrows","dots","variableWidth","useColumnControlResize","slideCount","le","innerWidth","setWindowWidth","Date","now","carouselKey","setCarouselKey","timeoutId","handleResize","clearTimeout","setTimeout","import_slick","import_slick_theme","Slider","Tr","SliderImport","getViewportLayoutState","gapPx","containerHeight","getSlidesMeta","slides","effectiveShowPagination","renderSlidesContent","slidesForRender","renderSlide","getSlideWidth","slide","slideId","id","slideKey","String","T","GridLayoutContent","renderSlides","sliderRef","finalSettings","ot","ref","layout","autoplayEnabled","autoplayDuration","showPagination","onSlideChange","slickSettings","effectiveFullWidth","ne","effectiveAutoplayEnabled","showArrowsOnDesktop","responsiveSettings","infinite","speed","autoplay","autoplaySpeed","swipe","draggable","beforeChange","_","next","responsive","useRef","current","slickPrev","slickNext","containerClassName","slides__parent","Fragment","ROUNDED_BORDER_RADIUS","REL_NOOPENER_NOREFERRER","PROTOCOL_HTTP","PROTOCOL_HTTPS","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","isValidDestination","dest","protocol","resolveTarget","target","resolveDisabled","disabled","iconAliasMap","arrow","resolveIconName","iconName","variantDefaults","primary","bg","hover","pressed","disabledBg","disabledText","focusRing","secondary","widthBySize","DEFAULT_BUTTON_WIDTH","getButtonWidth","size","iconSizeByButtonSize","DEFAULT_ICON_SIZE","getIconSize","BUTTON_GAP","BUTTON_MIN_WIDTH","BUTTON_MIN_HEIGHT","DESKTOP_BREAKPOINT","TABLET_BREAKPOINT","MOBILE_BREAKPOINT","DESKTOP_FONT_SIZE","TABLET_FONT_SIZE","MOBILE_FONT_SIZE","DESKTOP_PADDING","TABLET_PADDING","MOBILE_PADDING","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","pe","StyledButton","Fr","NsButton","$bg","$hover","$pressed","$text","$border","$disabledBg","$disabledText","$focusRing","$buttonWidth","$buttonType","StyledLabelText","span","ICON_MARGIN_PX","StyledIconWrapper","open_in_new_tab","button_size","buttonType","buttontype","icon","iconposition","iconPosition","button_state","placeholderText","placeholder_text","resolvedVariant","resolvedSize","resolvedAlignment","resolvedIconPosition","resolvedButtonType","resolvedUrl","hrefProp","variantDefault","buttonWidth","resolvedTarget","resolvedDisabled","buttonBorder","IconName","isValidNsIcon","$e","NsIconVariants","iconSize","renderIcon","iconColor","Y","NsIcon","name","colorOverride","getLabelText","labelTitle","$variant","rel","Typography","placeholder","typographyProps","displayValue","Zr","Kr","NsTypography","PLACEHOLDER_BRAND_CAPTION","PLACEHOLDER_TITLE","PLACEHOLDER_SUBTITLE","PLACEHOLDER_BODY","ARIA_LABEL_HERO_BANNER","IMAGE_LOADING_LAZY","getTypographyFields","brandcaption","noSpacing","editTagKey","weight","TypographyFields","editTags","fields","ce","field","additionalProps","Q","GRADIENT_OPACITIES","getGradientBackground","Overlay","Content","FULL_SIZE_PERCENT","isMediaObject","parseMedia","extracted","resolveContentAlignment","contentAlignment","resolveGradientDepth","resolveTextColor","resolveWidth","widthStr","resolveHeight","heightStr","getGradientColor","gradientDirectionMap","getGradientDirection","isFullSize","mediaWidth","mediaHeight","getImageProps","style","Media","parsedMedia","mediaAttributes","fullSize","renderImage","commonImageProps","O","lt","mediaContent","preload","class_name","content_alignment","gradientEnabled","gradient_enabled","resolvedContentAlignment","resolvedGradientDepth","shouldRenderButton","N","import_dompurify","SANITIZATION_CONFIG","ALLOWED_TAGS","ALLOWED_ATTR","sanitizeHtml","wn","DOMPurify","sanitize","KEEP_CONTENT","RETURN_DOM","RETURN_DOM_FRAGMENT","FORCE_BODY","SANITIZE_DOM","IN_PLACE","RichText","restProps","sanitizedHtml","Rn","fontColorBoolean","In"],"mappings":"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","sourcesContent":["\"use strict\";var On=Object.create;var xe=Object.defineProperty;var Nn=Object.getOwnPropertyDescriptor;var Un=Object.getOwnPropertyNames;var Gn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty;var Wn=(e,t)=>{for(var r in t)xe(e,r,{get:t[r],enumerable:!0})},gt=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of Un(t))!Fn.call(e,i)&&i!==r&&xe(e,i,{get:()=>t[i],enumerable:!(n=Nn(t,i))||n.enumerable});return e};var B=(e,t,r)=>(r=e!=null?On(Gn(e)):{},gt(t||!e||!e.__esModule?xe(r,\"default\",{value:e,enumerable:!0}):r,e)),Hn=e=>gt(xe({},\"__esModule\",{value:!0}),e);var Si={};Wn(Si,{Button:()=>Ie,ColumnControl:()=>Cr,CsImage:()=>St,CsTextComponent:()=>Te,DEFAULT_BANNER_CONFIG:()=>uo,DEFAULT_CAROUSEL_CONFIG:()=>mo,DEFAULT_ROTATION_INTERVAL:()=>fo,DEVICE_SIZES:()=>x,GAP_PRESET_VALUES:()=>et,HeroBanner:()=>vn,MAX_ALLOWED_COLUMN_CONTROL_ITEMS:()=>re,MAX_SLIDE_HEIGHT_PX:()=>nt,MIN_SLIDE_HEIGHT_PX:()=>Ro,MIN_SLIDE_WIDTH_PX:()=>rt,MarketingBanner:()=>Qe,PLACEHOLDER_VALUES:()=>ee,RichTextComponent:()=>$n,SpacingDivider:()=>rr,getGapPx:()=>tt,hasCTA:()=>Ye,hasMedia:()=>je,isCarouselMode:()=>Ze,transformCSMarketingBanner:()=>Yt});module.exports=Hn(Si);var ye=require(\"react\"),bt=B(require(\"@emotion/styled\"));var Yn=require(\"react\");var zn=\"{%language}\",Vn=\"{%LANGUAGE}\",Kn=\"{%region}\",Xn=\"{%REGION}\",Pe=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(Kn,t.region),e=e.replace(Xn,t.region.toUpperCase())),t.language&&(e=e.replace(zn,t.language),e=e.replace(Vn,t.language.toUpperCase())),e);var Ae=\"us\",Le=\"en\";function Zn(e){if(!e?.startsWith?.(\"?\"))return;let t=new URLSearchParams(e),r=t.get(\"region\"),n=t.get(\"language\");if(!(!r&&!n))return{region:r??Ae,language:n??Le}}function jn(e){if(!e)return;let t=e.split(\"/\").filter(Boolean);if(t.length<2)return;let[r,n]=t;if(r?.length===2&&n?.length===2)return{region:r,language:n}}var Be=()=>{if(typeof window>\"u\"||!window.location)return{region:Ae,language:Le};let{search:e,pathname:t}=window.location;return Zn(e)??jn(t)??{region:Ae,language:Le}};var Qn=require(\"react\"),Jn=require(\"@mui/material\"),ut=require(\"@nuskin/foundation-theme\"),{getGenomeColor:$i}=ut.ColorUtils;var mt=require(\"@mui/material\"),ft=require(\"@nuskin/foundation-theme\"),ht=require(\"react\"),{getGenomeColor:qn}=ft.ColorUtils,eo=(e=!1)=>{let t=(0,mt.useTheme)();return(0,ht.useMemo)(()=>qn(t,\"N10\",e?\"light\":\"dark\"),[e,t])},Me=eo;var De=require(\"react/jsx-runtime\"),to=()=>(0,ye.useMemo)(()=>Be(),[]),ro=(e,t)=>!t||!e?e:Pe(e,t),no=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let n=new DOMParser().parseFromString(e,\"text/html\");return n.querySelectorAll(\"a\").forEach(i=>{let o=i.getAttribute(\"href\");o&&i.setAttribute(\"href\",ro(o,t))}),n.body.innerHTML},oo=bt.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`,io=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},ao=e=>{try{let r=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof r==\"string\"&&r.trim()?r:null}catch{return null}},so=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return io(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?ao(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},lo=({full_width:e=!1,container_background_color:t,alignment:r=\"left\",text_editor:n,font_color:i=!1,$:o})=>{let s=Me(i),a=to(),l=(0,ye.useMemo)(()=>so(t),[t]),d=(0,ye.useMemo)(()=>no(n,a),[n,a]);return n?(0,De.jsx)(oo,{fullWidth:e,bgColor:l,alignment:r,color:s,children:(0,De.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:d},...o?.text_editor})}):null},Te=lo;var Tt=require(\"@nuskin/foundation-ui-components\");var xt=require(\"@nuskin/foundation-theme\"),yt=(0,xt.styled)(\"div\")(({image_alignment:e=\"center\",width:t,height:r})=>({display:\"flex\",justifyContent:{left:\"flex-start\",right:\"flex-end\",center:\"center\"}[e],\"& img\":{maxWidth:\"fit-content\",objectFit:\"contain\",objectPosition:\"center\"}}));var Oe=require(\"react/jsx-runtime\"),po=\"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>`),co=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],go=e=>{let{image_alignment:t=\"center\",image:r,parent$:n,isEditing:i,$:o,...s}=e,a=null,l=null,d=null;try{let u=typeof r==\"string\"?JSON.parse(r):r,p=u?.image?.[0];p?.selected||p?.files?(a=p?.selected,l=p?.files):u?.url&&(d=u)}catch(u){console.warn(\"[CsImage] Failed to parse image prop:\",u)}let g=po,c=\"Image not available\",m=\"100%\",b=\"100%\";if(a||l){let u=a?.imageType??\"transformBaseUrl\",p=l?.[u];p?.url&&(g=p.url,c=a?.altText??\"Image\",m=a?.width??\"100%\",b=a?.height??\"100%\")}else d?.url&&(g=d.url,c=d.title||d.filename||\"Image\");let f={src:g,alt:c,width:m,height:b};co.forEach(u=>{s[u]!==void 0&&(f[u]=s[u])});let E=s?.full_width?\"container !p-0\":\"\";return(0,Oe.jsx)(yt,{image_alignment:t,width:f.width,height:f.height,className:E,children:(0,Oe.jsx)(Tt.NsImage,{...f,...o?.image||{}})})},St=go;var uo={position:\"left\",textColor:\"white\",showGradient:!1,gradientDepth:\"md\",mediaType:\"image\",ctaVariant:\"dark\"},mo={rotationInterval:5e3},fo=5e3,ee={header:\"Enter Header\",title:\"Enter Title\",subtitle:\"Enter Subtitle\",body:\"Enter Body Text\"};var te=B(require(\"@emotion/styled\"));var H={mobile:0,tablet:768,desktop:1024,wide:1440},z={lora:\"'Lora', Georgia, 'Times New Roman', serif\",inter:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\"},V={header:{mobile:\"12px\",tablet:\"14px\",desktop:\"14px\",wide:\"16px\"},title:{mobile:\"24px\",tablet:\"32px\",desktop:\"40px\",wide:\"48px\"},subtitle:{mobile:\"16px\",tablet:\"18px\",desktop:\"20px\",wide:\"22px\"},body:{mobile:\"14px\",tablet:\"16px\",desktop:\"18px\",wide:\"20px\"},cta:{mobile:\"18px\",tablet:\"22px\",wide:\"24px\"}},C={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\"},K={bannerHeightDesktop:\"600px\",bannerHeightMobile:\"400px\",textMaxWidth:\"600px\",indicatorSize:\"12px\",indicatorBorder:\"2px\"},h={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\"},Ct={white:h.textWhite,dark:h.textDark},A={fast:\"0.1s ease\",default:\"0.3s ease\",slow:\"0.6s cubic-bezier(0.4, 0, 0.2, 1)\"},ae={background:0,media:0,gradient:1,content:2,controls:3},R={tablet:`@media (min-width: ${H.tablet+1}px) and (max-width: ${H.desktop-1}px)`,desktop:`@media (min-width: ${H.desktop}px) and (max-width: ${H.wide-1}px)`,wide:`@media (min-width: ${H.wide}px)`,mobileAndBelow:`@media (max-width: ${H.tablet}px)`,desktopAndUp:`@media (min-width: ${H.desktop}px)`};var I=require(\"@emotion/react\");var X=e=>I.css`\n font-size: ${e.mobile};\n\n ${R.tablet} {\n font-size: ${e.tablet||e.mobile};\n }\n ${R.desktop} {\n font-size: ${e.desktop||e.tablet||e.mobile};\n }\n ${R.wide} {\n font-size: ${e.wide||e.desktop||e.tablet||e.mobile};\n }\n`,vt=I.css`\n ${R.mobileAndBelow} {\n text-align: center;\n }\n`,Et=(e=[\"background-color\",\"color\",\"border-color\",\"transform\",\"text-decoration\"])=>I.css`\n transition: ${e.map(t=>`${t} ${A.default}`).join(\", \")};\n`;var Se=I.css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n`,Qi=I.css`\n ${Se}\n width: 100%;\n height: 100%;\n`,Rt=I.css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`,wt=I.css`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ji=I.css`\n margin: 0;\n padding: 0;\n`;var Ne=(e,t,r,n)=>I.css`\n background: linear-gradient(${e}, rgba(${n}, ${t}), rgba(${n}, ${r}));\n`,Ue=(e,t,r)=>I.css`\n background: radial-gradient(circle, rgba(${r}, ${e}), rgba(${r}, ${t}));\n`;var $t=te.default.div`\n text-align: ${({textAlignment:e})=>e};\n ${vt}\n`,It=te.default.p`\n margin: ${C.headerMargin};\n font-weight: 500;\n font-family: ${z.inter};\n color: ${({fontColor:e})=>e};\n letter-spacing: 0.05em;\n ${X(V.header)}\n`,kt=te.default.h2`\n margin: ${C.titleMargin};\n font-weight: 700;\n font-family: ${z.lora};\n color: ${({fontColor:e})=>e};\n ${X(V.title)}\n`,_t=te.default.h3`\n margin: ${C.subtitleMargin};\n font-weight: 600;\n font-family: ${z.inter};\n color: ${({fontColor:e})=>e};\n ${X(V.subtitle)}\n`,At=te.default.p`\n margin: ${C.bodyMargin};\n line-height: 1.6;\n font-family: ${z.inter};\n color: ${({fontColor:e})=>e};\n ${X(V.body)}\n`;var Z=require(\"react/jsx-runtime\");function Ce(e,t,r){if(r===!0&&(!e||e===t))return t;if(!(r===!1&&e===t))return e}function Ge({headerText:e,title:t,subtitle:r,bodyText:n,textColor:i=\"#ffffff\",textAlignment:o=\"left\",testId:s,$:a,isVisualBuilderContext:l}){let d=Ce(e,ee.header,l),g=Ce(t,ee.title,l),c=Ce(r,ee.subtitle,l),m=Ce(n,ee.body,l);return!d&&!g&&!c&&!m?null:(0,Z.jsxs)($t,{textAlignment:o,\"data-testid\":s,children:[d&&(0,Z.jsx)(It,{fontColor:i,...a?.header_text??{},children:d}),g&&(0,Z.jsx)(kt,{fontColor:i,...a?.title??{},children:g}),c&&(0,Z.jsx)(_t,{fontColor:i,...a?.subtitle??{},children:c}),m&&(0,Z.jsx)(At,{fontColor:i,...a?.body_text??{},children:m})]})}var ve=B(require(\"react\"));var j=B(require(\"@emotion/styled\"));var Lt=j.default.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`,Fe=j.default.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,Pt=j.default.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,Bt=j.default.div`\n ${wt}\n width: 100%;\n height: 100%;\n background-color: ${h.fallbackBg};\n color: ${h.textGray};\n font-size: 14px;\n`,Mt=j.default.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,We=j.default.source`\n display: block;\n`;var L=require(\"react/jsx-runtime\");function He({mediaUrl:e,fallbackMediaUrl:t,mediaType:r=\"image\",mediaAlt:n=\"\",onError:i,testId:o,$:s,isResponsive:a,desktopUrl:l,mobileUrl:d}){let[g,c]=ve.default.useState(e),[m,b]=ve.default.useState(!1);ve.default.useEffect(()=>{c(e),b(!1)},[e]);let f=()=>{t&&g!==t?c(t):b(!0),i?.()},E=()=>m&&!t?(0,L.jsx)(Bt,{}):r===\"video\"?(0,L.jsx)(Pt,{src:g,onError:f,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,\"data-testid\":`${o}-video`,...s?.bynder_media??{}}):a&&d&&l?(0,L.jsxs)(Mt,{children:[(0,L.jsx)(We,{media:\"(max-width: 768px)\",srcSet:d}),(0,L.jsx)(We,{media:\"(min-width: 769px)\",srcSet:l}),(0,L.jsx)(Fe,{src:l,alt:n,onError:f,loading:\"lazy\",\"data-testid\":`${o}-image`,...s?.bynder_media??{}})]}):(0,L.jsx)(Fe,{src:g,alt:n,onError:f,loading:\"lazy\",\"data-testid\":`${o}-image`,...s?.bynder_media??{}});return(0,L.jsx)(Lt,{\"data-testid\":o,...s?.bynder_media??{},children:E()})}var Dt=B(require(\"@emotion/styled\")),ze=require(\"@emotion/react\");var ho=ze.css`\n background-color: ${h.ctaDark};\n color: ${h.textWhite};\n border: 1px solid ${h.ctaDark};\n\n &:hover {\n background-color: ${h.ctaDark};\n color: ${h.textWhite};\n border-color: ${h.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${h.textWhite};\n outline-offset: 4px;\n }\n`,bo=ze.css`\n background-color: transparent;\n color: ${h.textDark};\n border: 1px solid ${h.ctaBorder};\n\n &:hover {\n background-color: transparent;\n color: ${h.textDark};\n border-color: ${h.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${h.ctaBorder};\n outline-offset: 4px;\n }\n`,Ot=Dt.default.a`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: ${C.ctaPaddingDesktop};\n text-decoration: none;\n font-family: ${z.lora};\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color ${A.default},\n color ${A.default},\n border-color ${A.default},\n transform ${A.default},\n text-decoration ${A.default};\n\n ${({variant:e})=>e===\"dark\"?ho:bo}\n\n &:active {\n transform: translateY(0);\n }\n\n ${X(V.cta)}\n\n /* Responsive padding */\n ${R.mobileAndBelow} {\n padding: ${C.ctaPaddingTablet};\n }\n\n ${R.wide} {\n padding: ${C.ctaPaddingWide};\n }\n`;var Nt=require(\"react/jsx-runtime\");function Ve({ctaLabel:e,ctaDestination:t,variant:r=\"dark\",onClick:n,testId:i,$:o}){return(0,Nt.jsx)(Ot,{href:t,variant:r,onClick:n,\"data-testid\":i,\"aria-label\":e,...o?.cta??{},children:e})}var w=require(\"react\");var Ee=require(\"react\");function Ke(){let[e,t]=(0,Ee.useState)(!1);return(0,Ee.useEffect)(()=>{if(typeof window>\"u\"||!window.matchMedia)return;let r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");t(r.matches);let n=i=>{t(i.matches)};return r.addEventListener(\"change\",n),()=>r.removeEventListener(\"change\",n)},[]),e}function Xe(e){let{totalSlides:t,autoRotate:r=!1,rotationInterval:n=5e3,pauseOnHover:i=!0,initialIndex:o=0}=e,[s,a]=(0,w.useState)(o),[l,d]=(0,w.useState)(!1),g=Ke(),c=(0,w.useCallback)(()=>{a(p=>(p+1)%t)},[t]),m=(0,w.useCallback)(()=>{a(p=>(p-1+t)%t)},[t]),b=(0,w.useCallback)(p=>{p>=0&&p<t&&a(p)},[t]),f=(0,w.useCallback)(()=>{d(!0)},[]),E=(0,w.useCallback)(()=>{d(!1)},[]),u=(0,w.useCallback)(p=>{switch(p.key){case\"ArrowLeft\":p.preventDefault(),m();break;case\"ArrowRight\":p.preventDefault(),c();break;case\"Home\":p.preventDefault(),b(0);break;case\"End\":p.preventDefault(),b(t-1);break}},[c,m,b,t]);return(0,w.useEffect)(()=>{if(!r||l||g)return;let p=setInterval(c,n);return()=>clearInterval(p)},[r,l,g,n,c]),{currentIndex:s,isPaused:l,totalSlides:t,goToNext:c,goToPrevious:m,goToSlide:b,pause:f,resume:E,handleKeyDown:u}}function Ze(e){return Array.isArray(e.banners)&&e.banners.length>1}function je(e){return!!e.mediaUrl}function Ye(e){return!!(e.ctaLabel&&e.ctaDestination)}var k=B(require(\"@emotion/styled\"));var Ut=k.default.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`,Gt=k.default.div`\n position: relative;\n width: 100%;\n`,Ft=k.default.div`\n display: flex;\n transition: transform ${A.slow};\n transform: translateX(-${({currentIndex:e})=>e*100}%);\n`,Wt=k.default.div`\n min-width: 100%;\n position: relative;\n`,Ht=k.default.div`\n position: relative;\n min-height: ${({hasMedia:e})=>e?K.bannerHeightDesktop:\"auto\"};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n ${R.mobileAndBelow} {\n min-height: ${({hasMedia:e})=>e?K.bannerHeightMobile:\"auto\"};\n }\n`,zt=k.default.div`\n ${Se}\n z-index: ${ae.media};\n`,Vt=k.default.div`\n position: relative;\n z-index: ${ae.content};\n display: flex;\n flex-direction: column;\n gap: ${C.textGap};\n justify-content: center;\n padding: ${C.desktopPadding};\n max-width: ${K.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 ${R.mobileAndBelow} {\n padding: ${C.mobilePadding};\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n }\n`,Kt=k.default.div`\n ${Se}\n z-index: ${ae.gradient};\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({direction:e,depth:t,color:r})=>{let n={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:i,end:o}=n[t],s=r===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?Ne(\"to right\",i,o,s):e===\"rightToLeft\"?Ne(\"to left\",i,o,s):e===\"radial\"?Ue(i,o,s):\"\"}}\n\n /* Mobile: Override to always use radial gradient */\n ${R.mobileAndBelow} {\n ${({depth:e,color:t})=>{let r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:n,end:i}=r[e];return Ue(n,i,t===\"black\"?\"0, 0, 0\":\"255, 255, 255\")}}\n }\n`,Xt=k.default.div`\n position: absolute;\n bottom: ${C.carouselGap};\n ${Rt}\n z-index: ${ae.controls};\n display: flex;\n gap: ${C.carouselGap};\n align-items: center;\n\n ${R.mobileAndBelow} {\n bottom: 1.5rem;\n }\n`,Zt=k.default.button`\n width: ${K.indicatorSize};\n height: ${K.indicatorSize};\n border-radius: 50%;\n border: ${K.indicatorBorder} solid ${h.indicatorBorder};\n background-color: ${({active:e})=>e?h.indicatorActive:h.indicatorInactive};\n cursor: pointer;\n padding: 0;\n ${Et([\"all\"])}\n\n &:hover {\n background-color: ${h.indicatorActive};\n transform: scale(1.15);\n }\n`;var v=require(\"react/jsx-runtime\"),xo=(e,t,r,n)=>{let i=je(e),o=Ye(e),s=e.testId??n??\"banner\",a=Ct[e.textColor??\"white\"],l=e.showGradient===!0,d=e.position??\"left\",g=e.textColor===\"dark\"?\"white\":\"black\",c;d===\"left\"?c=\"leftToRight\":d===\"right\"?c=\"rightToLeft\":c=\"radial\";let m;return d===\"center\"?m=\"center\":d===\"right\"?m=\"right\":m=\"left\",(0,v.jsx)(Wt,{children:(0,v.jsxs)(Ht,{hasMedia:i,children:[i&&e.mediaUrl&&(0,v.jsx)(zt,{children:(0,v.jsx)(He,{mediaUrl:e.mediaUrl,fallbackMediaUrl:e.fallbackMediaUrl,mediaType:e.mediaType,mediaAlt:e.mediaAlt,testId:`${s}-${r}-media`,$:e.$,isResponsive:e.isResponsive,desktopUrl:e.desktopUrl,mobileUrl:e.mobileUrl})}),l&&(0,v.jsx)(Kt,{direction:c,depth:e.gradientDepth??\"md\",color:g}),(0,v.jsxs)(Vt,{position:d,children:[(0,v.jsx)(Ge,{headerText:e.headerText,title:e.title,subtitle:e.subtitle,bodyText:e.bodyText,textColor:a,textAlignment:m,testId:`${s}-${r}-text`,$:e.$,isVisualBuilderContext:t}),o&&e.ctaLabel&&e.ctaDestination&&(0,v.jsx)(Ve,{ctaLabel:e.ctaLabel,ctaDestination:e.ctaDestination,variant:e.ctaVariant??\"dark\",testId:`${s}-${r}-cta`,$:e.$})]})]})},`${s}-${r}`)};function Qe(e){let{banners:t,rotationInterval:r,testId:n,isVisualBuilderContext:i=!1}=e,o=Ze(e),s=Xe({totalSlides:t.length,autoRotate:o,rotationInterval:r??5e3,pauseOnHover:!0,initialIndex:0});return(0,v.jsxs)(Ut,{\"data-testid\":n??\"marketing-banner\",onKeyDown:o?s.handleKeyDown:void 0,onMouseEnter:o?s.pause:void 0,onMouseLeave:o?s.resume:void 0,children:[(0,v.jsx)(Gt,{children:(0,v.jsx)(Ft,{currentIndex:s.currentIndex,totalSlides:t.length,children:t.map((a,l)=>xo(a,i,l,n))})}),o&&(0,v.jsx)(Xt,{children:t.map((a,l)=>(0,v.jsx)(Zt,{active:l===s.currentIndex,onClick:()=>s.goToSlide(l),\"aria-label\":`Go to slide ${l+1}`},`${n??\"banner\"}-indicator-${l}-${a.title??\"\"}`))})]})}function yo(e,t,r){let{url:n=\"\",type:i=\"\"}=e??{};return i===\"VIDEO\"?t?n:r?.[0]??\"\":n}function jt(e,t){try{let r=new URL(e),n=r.searchParams.get(\"io\");if(!n)return e;let i=`${n},aspectratio:${t}`,o=[];return o.push(`io=${i}`),o.push(\"quality=95\"),r.searchParams.forEach((s,a)=>{a!==\"io\"&&o.push(`${a}=${s}`)}),`${r.origin}${r.pathname}?${o.join(\"&\")}`}catch(r){return console.warn(\"Failed to generate responsive URL:\",r),e}}function To(e){try{return new URL(e).searchParams.has(\"io\")?e:`${e}?io=transform:fill&quality=95`}catch{return e}}function Re(e){if(!e)return null;try{let r=JSON.parse(e)?.image?.[0],n=r?.selected,i=yo(n,r?.isPublic,r?.previewUrls),o=\"image\";n?.type===\"VIDEO\"?o=\"video\":n?.type===\"IMAGE\"&&i?.toLowerCase().endsWith(\".gif\")&&(o=\"gif\");let s=n?.imageType===\"customTransformation\",a={url:i,type:o,alt:n?.altText??\"\"};return s&&o===\"image\"?(a.isResponsive=!0,a.desktopUrl=jt(i,\"16x9\"),a.mobileUrl=jt(i,\"3x4\"),a.url=a.desktopUrl):o===\"image\"&&(a.url=To(i)),a}catch(t){return console.warn(\"Failed to parse bynder_media JSON:\",t),null}}function So(e){let t=Re(e.bynder_media);return{title:e.title,headerText:e.header_text,subtitle:e.subtitle,bodyText:e.body_text,ctaLabel:e.cta?.label??e.cta_label,ctaDestination:e.cta?.url??e.cta_destination,ctaVariant:e.cta?.variant??e.cta_variant,mediaUrl:t?.url??\"\",fallbackMediaUrl:\"\",mediaType:t?.type??\"image\",mediaAlt:t?.alt??\"\",isResponsive:t?.isResponsive,desktopUrl:t?.desktopUrl,mobileUrl:t?.mobileUrl,position:e.content_position??e.position,textColor:e.text_color,showGradient:e.gradient?.show_gradient??e.show_gradient,gradientDepth:e.gradient?.gradient_depth??e.gradient_depth,$:e.$}}function Yt(e){return{banners:e.banners.map(So),rotationInterval:e.rotation_interval}}var Je=require(\"@nuskin/foundation-theme\");var Qt={thin:1,medium:2,thick:4},we={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 Jt=(0,Je.styled)(\"div\")(({vertical_padding:e,divider_alignment:t})=>{let n={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:`${n.mobile}px`,paddingBottom:`${n.mobile}px`,[`@media ${we.tablet}`]:{paddingTop:`${n.tablet}px`,paddingBottom:`${n.tablet}px`},[`@media ${we.desktop}`]:{paddingTop:`${n.desktop}px`,paddingBottom:`${n.desktop}px`},[`@media ${we.ultra}`]:{paddingTop:`${n.ultra}px`,paddingBottom:`${n.ultra}px`}}}),qt=(0,Je.styled)(\"div\")(({divider_style:e,divider_thickness_px:t,divider_color:r,divider_gradient:n,divider_width_percent:i})=>{let o={width:`${Math.max(0,Math.min(100,i))}%`};if(n&&e!==\"none\"){if(o.height=`${t}px`,o.backgroundImage=n,o.backgroundSize=\"100% 100%\",e===\"dashed\"){let s=Math.max(12,t*4),a=Math.max(6,t*2);o.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${s}px, transparent ${s}px, transparent ${s+a}px)`,o.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${s}px, transparent ${s}px, transparent ${s+a}px)`}else if(e===\"dotted\"){let s=Math.max(2,t),a=Math.max(8,s*3),l=s/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=`${a}px ${t}px`,o.WebkitMaskSize=`${a}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=n):(o.borderBottomStyle=e,o.borderBottomWidth=`${t}px`,o.borderBottomColor=r,o.height=0);return o});var er=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,Co=e=>{if(!e||!/^#([A-Fa-f0-9]{6})$/.test(e))return;let t=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),n=parseInt(e.slice(5,7),16);return{r:t,g:r,b:n}},tr=(e,t)=>{if(!e||e===\"none\")return;let r=Co(t)??{r:0,g:0,b:0};switch(e){case\"soft\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.3), rgba(${r.r},${r.g},${r.b},0.8))`;case\"bold\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.6), rgba(${r.r},${r.g},${r.b},1.0))`;case\"faint\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.4), rgba(${r.r},${r.g},${r.b},0.4))`;default:return}};var qe=require(\"react/jsx-runtime\"),vo=\"#000000\",Eo=e=>{let{vertical_padding:t=\"small\",divider_style:r=\"solid\",divider_thickness:n=\"thin\",divider_color:i,divider_gradient_preset:o=\"none\",divider_width_percent:s=100,divider_alignment:a=\"left\"}=e,l=Qt[n],d=er(i)?i:vo,g=tr(o,d);return(0,qe.jsx)(Jt,{vertical_padding:t,divider_alignment:a,children:r!==\"none\"&&(0,qe.jsx)(qt,{divider_style:r,divider_thickness_px:l,divider_color:d,divider_gradient:g,divider_width_percent:s??100,\"aria-hidden\":\"true\"})})},rr=Eo;var ne=require(\"react\"),Tr=B(require(\"react-slick\"));var M=require(\"@nuskin/foundation-theme\");var et={none:0,small:8,medium:12,large:16};function tt(e){return e===void 0?et.large:typeof e==\"number\"?e:et[e]}var x={ULTRA_SMALL:320,EXTRA_SMALL:480,SMALL:600,MEDIUM:768,LARGE:1024,EXTRA_LARGE:1200,ULTRA_LARGE:1440,SUPER_LARGE:1920},rt=280,Ro=320,nt=450,re=4;var nr=(0,M.styled)(\"section\")(({gap:e,height:t,columnHeight:r,maxColumnHeight:n,fullWidth:i})=>({position:\"relative\",width:\"100%\",textAlign:\"center\",padding:\"0 80px 50px\",height:t,boxSizing:\"border-box\",...i&&{padding:\"0\"},[`@media (max-width: ${x.MEDIUM}px)`]:{padding:\"0 40px 50px\",...i&&{padding:\"0\"}},[`@media (max-width: ${x.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%\",...r===\"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:r===\"auto\"?\"100%\":r,minHeight:0,...n!=null&&{maxHeight:`${n}px`},\"& > div\":{height:\"100%\",width:\"100%\",\"& > div\":{height:\"100%\",width:\"100%\"}}},\".slick-dots\":{position:\"absolute\",bottom:-36,display:\"flex\",justifyContent:\"center\",gap:8,listStyle:\"none\",padding:0,margin: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: ${x.SMALL}px)`]:{\".slick-dots\":{bottom:-32,gap:6,li:{width:10,height:10,button:{width:10,height:10}}}}})),or=(0,M.styled)(\"div\")(({gap:e})=>({display:\"flex\",flexWrap:\"wrap\",gap:`${e}px`,width:\"100%\"})),ir=(0,M.styled)(\"section\")(({useFlexLayout:e,stackedVerticalGap:t,stackedItemHeight:r,stackedItemMaxHeight:n,slideWidth:i,flexBasis:o,isVariableWidth:s})=>({maxWidth:\"none\",margin:e?0:`0 0 ${t}px`,height:r===\"auto\"?\"100%\":r,minHeight:0,...n!=null&&{maxHeight:n},width:i,flex:e&&o?`0 0 ${o}`:void 0,boxSizing:e?\"border-box\":void 0,minWidth:s?0:rt,position:\"relative\"})),ar=(0,M.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\"})),sr=(0,M.styled)(\"div\")({maxWidth:\"100%\",width:\"100%\",flex:1,minHeight:0,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"}),lr=(0,M.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\",...t?e===\"prev\"?{left:8}:{right:8}:e===\"prev\"?{left:-60}:{right:-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: ${x.MEDIUM}px)`]:{width:40,height:40,...t?e===\"prev\"?{left:4}:{right:4}:e===\"prev\"?{left:-45}:{right:-45}},[`@media (max-width: ${x.SMALL}px)`]:{width:32,height:32,fontSize:20,...t?e===\"prev\"?{left:2}:{right:2}:e===\"prev\"?{left:-35}:{right:-35}}})),dr=(0,M.styled)(\"div\")({position:\"relative\",height:\"100%\"}),pr=(0,M.styled)(\"div\")({padding:\"10px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\"});var cr=B(require(\"react\"));function D(e){return!e||typeof e==\"function\"?e:typeof e==\"object\"&&e.default?e.default:e}var se=({emptyBlockParentClass:e,text:t=\"Add items to the column control/carousel\"})=>cr.default.createElement(pr,{className:e},t);function gr(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 ur(e,t){return t<=x.MEDIUM?!1:e===\"two-small-large\"||e===\"three-small-medium-large\"}function mr(e,t,r){if(r<=x.MEDIUM)return\"auto\";if(e===\"two-small-large\")return t%2===0?\"33.33%\":\"66.67%\";if(e===\"three-small-medium-large\"){let n=t%3;return n===0||n===2?\"25%\":\"50%\"}return\"auto\"}function fr(e,t){return e>=x.EXTRA_LARGE?Math.min(t,4):e>=x.LARGE?Math.min(t,3):e>=x.SMALL?Math.min(t,2):1}function hr(e){let{isGridLayout:t,isStackedViewport:r,isTabletGridViewport:n,gridSlides:i,presetColumns:o,slidesToShow:s}=e;return t&&(r||n)?i.slice(0,Math.min(o,i.length)):t?i.slice(0,s):i}function br(e){let{isGridLayout:t,presetSlidesToShow:r,gridSlides:n,presetColumns:i,shouldShowDots:o}=e,s=l=>Math.min(n.length,i,l),a=l=>Math.min(r,l);return[{breakpoint:x.SMALL,settings:{slidesToShow:t?1:Math.min(r,1),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}},{breakpoint:x.MEDIUM,settings:{slidesToShow:t?s(2):a(2),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}},{breakpoint:x.LARGE,settings:{slidesToShow:t?s(re):a(3),slidesToScroll:1,swipeToSlide:!t,arrows:!1,dots:o,variableWidth:!1}}]}var le=require(\"react\");function xr(e,t){let[r,n]=(0,le.useState)(typeof window<\"u\"?window.innerWidth:0),[i,o]=(0,le.useState)(`carousel-${e}-${t}-${Date.now()}`);return(0,le.useEffect)(()=>{if(typeof window>\"u\")return;let s,a=()=>{clearTimeout(s),s=setTimeout(()=>{n(window.innerWidth),o(`carousel-${e}-${t}-${Date.now()}`)},150)};return window.addEventListener(\"resize\",a),()=>{clearTimeout(s),window.removeEventListener(\"resize\",a)}},[e,t]),{windowWidth:r,carouselKey:i}}var cs=require(\"slick-carousel/slick/slick.css\"),gs=require(\"slick-carousel/slick/slick-theme.css\"),T=require(\"react/jsx-runtime\"),ot=require(\"react\"),Sr=D(Tr.default),$o=D(nr),yr=D(lr),Io=D(dr),ko=D(or),_o=D(ir),Ao=D(ar),Lo=D(sr);function Po(e,t,r,n){let i=t<=x.SMALL,o=e&&t>x.SMALL&&t<=x.LARGE;return{isStackedViewport:i,isTabletGridViewport:o,stackedItemHeight:\"100%\",stackedItemMaxHeight:nt,stackedVerticalGap:e&&i?r:0,containerHeight:n??\"auto\"}}function Bo(e,t,r,n,i){let o=t?e.slice(0,re):e,s=t?Math.min(o.length,r,re):n,a=t?i&&o.length>1:o.length>1;return{gridSlides:o,slidesToShow:s,shouldShowDots:a}}function Mo(e){let{slidesForRender:t,renderSlide:r,presetColumns:n,gap:i,isVariableWidth:o,getSlideWidth:s,stackedVerticalGap:a,stackedItemHeight:l,stackedItemMaxHeight:d,useFlexLayout:g=!1,$:c={}}=e,m=n===1?\"100%\":`calc(50% - ${i/2}px)`;return t.map((b,f)=>{let E;!g&&o&&(E=s(f));let u=b?.id,p=u!=null?String(u):`slide-${f}`;return(0,T.jsx)(_o,{\"aria-roledescription\":\"slide\",\"aria-label\":`Slide ${f+1} of ${t.length}`,useFlexLayout:g,stackedVerticalGap:a,stackedItemHeight:l,stackedItemMaxHeight:d,slideWidth:E,flexBasis:m,isVariableWidth:o,...c?.[`slides__${f}`]??{},children:(0,T.jsx)(Ao,{stackedItemHeight:l,stackedItemMaxHeight:d,children:(0,T.jsx)(Lo,{children:r(b,f)})})},p)})}function Do(e){let{emptyBlockParentClass:t,isStackedViewport:r,isTabletGridViewport:n,renderSlides:i,sliderRef:o,finalSettings:s,carouselKey:a,preset:l,slidesForRender:d,gap:g,$:c={}}=e;return r?(0,T.jsx)(\"div\",{className:\"column-control-container\",children:d.length>0?i():(0,T.jsx)(se,{emptyBlockParentClass:t})}):n?(0,T.jsx)(ko,{className:\"column-control-container\",gap:g,children:d.length>0?i(!0):(0,T.jsx)(se,{emptyBlockParentClass:t})}):d.length>0?(0,ot.createElement)(Sr,{ref:o,...s,key:`${a}-${l}`},i(!0)):(0,T.jsx)(se,{emptyBlockParentClass:t})}function Oo({slides:e,renderSlide:t,preset:r=\"single-full\",layout:n=\"grid\",autoplayEnabled:i=!1,autoplayDuration:o=3,showPagination:s=!0,onSlideChange:a,className:l,slickSettings:d,gap:g=\"medium\",height:c,fullWidth:m,emptyBlockParentClass:b,isEditing:f,parent$:E,$:u}){let p=tt(g),S=n===\"grid\",U=m??S,{windowWidth:y,carouselKey:J}=xr(r,e.length),$=(0,ne.useMemo)(()=>gr(r),[r]),P=fr(y,$),W=ur(r,y),G=(0,ne.useMemo)(()=>be=>mr(r,be,y),[r,y]),oe=S?!1:i,ie=S?!1:s,q=!S&&y>x.LARGE,{isStackedViewport:ge,isTabletGridViewport:_,stackedItemHeight:ue,stackedItemMaxHeight:dt,stackedVerticalGap:kn,containerHeight:_n}=Po(S,y,p,c),{gridSlides:me,slidesToShow:fe,shouldShowDots:ke}=Bo(e,S,$,P,ie),An=(0,ne.useMemo)(()=>br({isGridLayout:S,presetSlidesToShow:P,gridSlides:me,presetColumns:$,shouldShowDots:ke}),[S,P,me,$,ke]),Ln={dots:ke,infinite:!S&&me.length>fe,speed:500,slidesToShow:fe,slidesToScroll:1,autoplay:oe,autoplaySpeed:o*1e3,pauseOnHover:!0,arrows:!1,variableWidth:W,swipe:!S,draggable:!S,beforeChange:(be,Dn)=>{a&&a(Dn)},responsive:An,...d},he=(0,ne.useRef)(null),Pn=()=>{he.current?.slickPrev()},Bn=()=>{he.current?.slickNext()},pt={...Ln},Mn=[l,S?\"column-control-container\":void 0].filter(Boolean).join(\" \"),_e=hr({isGridLayout:S,isStackedViewport:ge,isTabletGridViewport:_,gridSlides:me,presetColumns:$,slidesToShow:fe}),ct=(be=!1)=>Mo({slidesForRender:_e,renderSlide:t,presetColumns:$,gap:p,isVariableWidth:W,getSlideWidth:G,stackedVerticalGap:kn,stackedItemHeight:ue,stackedItemMaxHeight:dt,useFlexLayout:be,$:u});return(0,T.jsx)($o,{gap:p,height:_n,columnHeight:ue,maxColumnHeight:dt,isVariableWidth:W,className:Mn,\"aria-label\":n===\"carousel\"?\"Carousel Control\":\"Column Control\",fullWidth:U,...E??{},children:(0,T.jsxs)(Io,{children:[(0,T.jsxs)(\"div\",{...u?.slides??{},...u?.slides__parent??{},\"data-add-direction\":\"horizontal\",children:[n===\"carousel\"&&(0,ot.createElement)(Sr,{ref:he,...pt,key:J},_e.length>0?ct():(0,T.jsx)(se,{emptyBlockParentClass:b})),n===\"grid\"&&(0,T.jsx)(Do,{emptyBlockParentClass:b,slidesForRender:_e,isStackedViewport:ge,isTabletGridViewport:_,renderSlides:ct,sliderRef:he,finalSettings:pt,carouselKey:J,preset:r,gap:p,$:u})]}),n===\"carousel\"&&q&&e.length>fe&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(yr,{direction:\"prev\",onClick:Pn,\"aria-label\":\"Previous slide\",fullWidth:U,children:\"\\u2039\"}),(0,T.jsx)(yr,{direction:\"next\",onClick:Bn,\"aria-label\":\"Next slide\",fullWidth:U,children:\"\\u203A\"})]})]})})}var Cr=Oo;var $e=require(\"@nuskin/foundation-ui-components\");var Fr=require(\"@nuskin/foundation-ui-components\"),pe=require(\"@nuskin/foundation-theme\");var vr=\"99px\";var Er=\"noopener noreferrer\";var No=\"http:\",Uo=\"https:\",Go=\"disabled\",it=\"primary\",Rr=\"small\",wr=\"left\",$r=\"left\",Ir=\"square\",kr=\"Enter Label\",_r=\"No\",de=\"rounded\",Ar=\"square\",Lr=\"transparent\";function Pr(e){if(!e||e.trim()===\"\")return!1;let t=e.trim();if(t.startsWith(\"#\")||t.startsWith(\"/\")||t.startsWith(\"//\"))return!0;try{let r=new URL(t);return r.protocol===No||r.protocol===Uo}catch{return!1}}function Br(e){return e===\"Yes\"?\"_blank\":\"_self\"}function Mr(e){return e==null?!1:typeof e==\"string\"?e===Go:e}var Fo={arrow:\"arrowRight\"};function Dr(e){if(e)return Fo[e]??e}var at={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\"}},Wo={large:\"400px\",medium:\"250px\",small:\"130px\"},Ho=\"130px\";function Or(e){return Wo[e]??Ho}var zo={small:\"small\",medium:\"medium\",large:\"medium\"},Vo=\"medium\";function Nr(e){return zo[e]??Vo}var Xo=\"4px\",Zo=\"70px\",jo=\"30px\",Yo=\"769px\",Qo=\"768px\",Jo=\"425px\",qo=\"13px\",ei=\"12px\",ti=\"10px\",ri=\"10px 6px\",ni=\"8px 6px\",oi=\"4px 8px\",ii=500,Ur=400,ai=\"2px\",si=\"Lora, sans-serif\",li=\"transparent\",di=\"center\",pi=\"flex-end\",ci=\"flex-start\",gi=e=>e===\"center\"?di:e===\"right\"?pi:ci,Wr=(0,pe.styled)(\"div\")`\n display: flex;\n justify-content: ${e=>gi(e.alignment)};\n width: 100%;\n`,Hr=(0,pe.styled)(Fr.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 \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: ${Xo};\n text-decoration: none;\n background: var(--btn-bg);\n color: var(--btn-color);\n border: 1px solid var(--btn-border);\n font-family: ${si};\n min-width: ${Zo};\n min-height: ${jo};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n width: ${e=>e.$buttonWidth};\n ${e=>e.$buttonType===de&&`border-radius: ${vr};`}\n }\n\n @media (min-width: ${Yo}) {\n && {\n font-size: ${qo};\n padding: ${ri};\n font-weight: ${ii};\n }\n }\n \n @media (max-width: ${Qo}) {\n && {\n font-size: ${ei};\n padding: ${ni};\n font-weight: ${Ur};\n }\n }\n\n @media (max-width: ${Jo}) {\n && {\n font-size: ${ti};\n padding: ${oi};\n font-weight: ${Ur};\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: ${ai} solid var(--btn-focus);\n background: var(--btn-pressed);\n border: 1px solid ${li};\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`,zr=pe.styled.span`\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-width: 0;\n`,Gr=`${2}px`,Vr=pe.styled.span`\n flex-shrink: 0;\n ${e=>e.position===\"left\"&&`margin-right: ${Gr};`}\n ${e=>e.position===\"right\"&&`margin-left: ${Gr};`}\n`;var Y=require(\"react/jsx-runtime\"),ui=({label:e,open_in_new_tab:t=_r,variant:r,button_size:n,alignment:i,buttontype:o=Ir,icon:s,iconposition:a,button_state:l,placeholder_text:d=kr,isEditing:g,$:c,parent$:m})=>{let b=r??it,f=n??Rr,E=i??wr,u=a??$r,p=o===de?de:Ar,S=e?.href?.trim()??void 0,U=Pr(S)?S:void 0,y=at[b]??at[it],J=Or(f),$=Br(t),P=Mr(l),W=(\"border\"in y?y.border:void 0)??Lr,G=Dr(s),oe=typeof G==\"string\"&&G in $e.NsIconVariants,ie=Nr(f),q=_=>{if(!G||!oe||u!==_)return null;let ue=P?y.disabledText:y.text;return(0,Y.jsx)(Vr,{position:_,children:(0,Y.jsx)($e.NsIcon,{name:G,size:ie,colorOverride:ue,...c?.icon??{}})})},ge=()=>{let _=e?.title??\"\";return g?_:_===\"\"||_===d?d:_};return(0,Y.jsx)(Wr,{alignment:E,children:(0,Y.jsxs)(Hr,{$variant:b,$buttonWidth:J,$buttonType:p,$bg:y.bg,$hover:y.hover,$pressed:y.pressed,$text:y.text,$border:W,$disabledBg:y.disabledBg,$disabledText:y.disabledText,$focusRing:y.focusRing,href:U,\"data-variant\":b,...$===\"_blank\"?{target:\"_blank\",rel:Er}:{},\"aria-disabled\":P,disabled:P,...m??{},children:[q(\"left\"),(0,Y.jsx)(zr,{...e?.$?.title??{},children:ge()}),q(\"right\")]})})},Ie=ui;var Kr=require(\"@nuskin/foundation-ui-components\"),Zr=require(\"react/jsx-runtime\"),Xr=({value:e,placeholder:t,isEditing:r,typographyProps:n})=>{let i=e;return!r&&e!==t?i=e:e===\"\"&&(i=t),(0,Zr.jsx)(Kr.NsTypography,{...n,children:i})};var jr=\"Enter Brand Caption\",Yr=\"Enter Title\",Qr=\"Enter Subtitle\",Jr=\"Enter Body\",qr=\"Hero banner\",en=\"lazy\";var ce=require(\"react/jsx-runtime\"),mi=(e,t,r,n)=>[{value:e,placeholder:jr,variant:\"body-s\",className:\"brand-caption\",noSpacing:!0,editTagKey:\"brandcaption\"},{value:t,placeholder:Yr,variant:\"h2\",className:\"title\",weight:\"bold\",editTagKey:\"title\"},{value:r,placeholder:Qr,variant:\"h5\",className:\"subtitle\",editTagKey:\"subtitle\"},{value:n,placeholder:Jr,variant:\"h6\",className:\"body\",editTagKey:\"body\"}],tn=({brandcaption:e,title:t,subtitle:r,body:n,isEditing:i,editTags:o={}})=>{let s=mi(e,t,r,n);return(0,ce.jsx)(ce.Fragment,{children:s.map(a=>{let l={variant:a.variant,className:a.className,...a.noSpacing&&{noSpacing:!0},...a.weight&&{weight:a.weight},additionalProps:{...o?.[a.editTagKey]??{}}};return(0,ce.jsx)(Xr,{value:a.value,placeholder:a.placeholder,isEditing:i,typographyProps:l},a.editTagKey)})})};var lt=require(\"@nuskin/foundation-ui-components\");var Q=require(\"@nuskin/foundation-theme\"),rn=(0,Q.styled)(\"section\")`\n width: 100%;\n position: relative;\n min-height: 450px;\n overflow: hidden;\n\n .media-layer {\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 .media-layer .media-fill {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .content {\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n }\n\n .title {\n font-size: clamp(22px, 3.5vw, 48px);\n line-height: 1.05;\n margin-bottom: 8px;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .subtitle {\n margin-bottom: 8px;\n font-size: clamp(16px, 2.2vw, 24px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .brand-caption {\n margin-bottom: 8px;\n font-size: clamp(12px, 1.5vw, 16px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n\n .body {\n margin-bottom: 8px;\n font-size: clamp(14px, 1.6vw, 18px);\n line-height: 1.4;\n font-family: 'Lora', serif;\n color: ${({textColor:e})=>e??\"inherit\"};\n }\n`,nn={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},fi=(e,t,r)=>{let{start:n,end:i}=nn[t],o=r===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?`background: linear-gradient(to right, rgba(${o}, ${n}), rgba(${o}, ${i}));`:e===\"rightToLeft\"?`background: linear-gradient(to left, rgba(${o}, ${n}), rgba(${o}, ${i}));`:`background: radial-gradient(circle, rgba(${o}, ${n}), rgba(${o}, ${i}));`},on=Q.styled.div`\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n\n ${({direction:e,depth:t,color:r})=>fi(e,t,r)}\n\n /* Force radial gradient on small screens */\n @media (max-width: 768px) {\n ${({depth:e,color:t})=>{let{start:r,end:n}=nn[e],i=t===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return`background: radial-gradient(circle, rgba(${i}, ${r}), rgba(${i}, ${n}));`}}\n }\n`,an=Q.styled.picture`\n width: 100%;\n height: 100%;\n display: block;\n`,st=Q.styled.source`\n display: block;\n`,sn=Q.styled.div`\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n padding: clamp(16px, 4vw, 48px);\n pointer-events: none;\n justify-content: ${({justifyContent:e})=>e??\"flex-start\"};\n\n // Force center alignment on mobile\n @media (max-width: 768px) {\n justify-content: center;\n }\n`,ln=Q.styled.div`\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\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 (max-width: 768px) {\n text-align: center;\n }\n`,dn=e=>e===\"center\"?\"center\":e===\"right\"?\"flex-end\":\"flex-start\";var F=\"100%\",pn=\"(max-width: 768px)\",cn=\"(min-width: 769px)\";function hi(e){return typeof e==\"object\"&&e!==null&&\"type\"in e&&\"src\"in e}function gn(e){if(!e)return null;if(hi(e))return{type:e.type,url:e.src??\"\",alt:e.alt??\"\",width:e.width,height:e.height,isResponsive:!1};if(typeof e==\"string\"){let t=Re(e);if(t)return{type:t.type,url:t.url,alt:t.alt,isResponsive:t.isResponsive??!1,desktopUrl:t.desktopUrl,mobileUrl:t.mobileUrl}}return null}function un(e){return e??\"left\"}function mn(e){return e??\"md\"}function fn(e){return e===\"white\"?\"white\":\"black\"}function hn(e){if(!e)return;let t=String(e);return t!==\"\"?t:void 0}function bn(e){if(!e)return;let t=String(e);return t!==\"\"?t:void 0}function xn(e){return e===\"black\"?\"white\":\"black\"}var bi={left:\"leftToRight\",center:\"radial\",right:\"rightToLeft\"};function yn(e){return bi[e]}function Tn(e,t){return String(e)===F&&String(t)===F}function Sn(e,t,r){return e?{variant:\"fill\",className:\"media-fill\"}:{style:{width:String(t),height:String(r)}}}var O=require(\"react/jsx-runtime\"),Cn=({parsedMedia:e,mediaWidth:t,mediaHeight:r,mediaAttributes:n={}})=>{if(!e)return null;let i=Tn(t,r),o=Sn(i,t,r),s=()=>{let l={...o,loading:en,...n};return e.isResponsive&&e.desktopUrl&&e.mobileUrl?(0,O.jsxs)(an,{children:[(0,O.jsx)(st,{media:pn,srcSet:e.mobileUrl}),(0,O.jsx)(st,{media:cn,srcSet:e.desktopUrl}),(0,O.jsx)(lt.NsImage,{src:e.desktopUrl,alt:e.alt,...l})]}):(0,O.jsx)(lt.NsImage,{src:e.url??\"\",alt:e.alt??\"\",...l})},a=e.type===\"image\"||e.type===\"gif\"?s():e.type===\"video\"?(0,O.jsx)(\"video\",{src:e.url,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,preload:\"auto\",width:i?F:t,height:i?F:r,style:{objectFit:\"cover\"},...n}):null;return a?(0,O.jsx)(\"div\",{className:\"media-layer\",children:a}):null};var N=require(\"react/jsx-runtime\"),xi=e=>{let{title:t,subtitle:r,body:n,brandcaption:i,button:o,media:s,class_name:a,content_alignment:l,width:d,height:g,gradient_enabled:c=!1,gradient_depth:m,text_color:b,$:f={},parent$:E={},isEditing:u=!1}=e,p=un(l),S=mn(m),U=fn(b),y=hn(d),J=bn(g),$=gn(s),P=y??F,W=J??F,G=dn(p),oe=xn(U),ie=yn(p),q=o&&(o.label?.title||u);return(0,N.jsxs)(rn,{className:a,textColor:U,\"aria-label\":qr,...E??{},children:[$&&(0,N.jsx)(Cn,{parsedMedia:$,mediaWidth:P,mediaHeight:W,mediaAttributes:f?.media??{}}),c&&(0,N.jsx)(on,{direction:ie,depth:S,color:oe,\"aria-hidden\":\"true\"}),(0,N.jsx)(sn,{justifyContent:G,children:(0,N.jsxs)(ln,{textAlign:p,children:[(0,N.jsx)(tn,{brandcaption:i,title:t,subtitle:r,body:n,isEditing:u,editTags:f}),q&&(0,N.jsx)(Ie,{...o,alignment:p??o?.alignment,parent$:f?.button,isEditing:u})]})})]})},vn=xi;var Rn=require(\"react\"),wn=B(require(\"dompurify\"));var In=require(\"react/jsx-runtime\"),En={ALLOWED_TAGS:[\"p\",\"div\",\"span\",\"a\",\"br\",\"strong\",\"b\",\"em\",\"i\",\"u\",\"h1\",\"h2\",\"h3\",\"ul\",\"ol\",\"li\"],ALLOWED_ATTR:[\"href\",\"target\",\"rel\",\"title\",\"class\",\"style\",\"data-testid\",\"data-cs-id\",\"data-cs-type\",\"data-cslp\"]},yi=e=>!e||typeof e!=\"string\"?\"\":wn.default.sanitize(e,{ALLOWED_TAGS:En.ALLOWED_TAGS,ALLOWED_ATTR:En.ALLOWED_ATTR,KEEP_CONTENT:!0,RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,FORCE_BODY:!1,SANITIZE_DOM:!0,IN_PLACE:!1}),Ti=({text_editor:e,font_color:t,...r})=>{let n=(0,Rn.useMemo)(()=>!e||typeof e!=\"string\"||!e.trim()?\"\":yi(e),[e]),i=t===\"Light\";return n?(0,In.jsx)(Te,{...r,text_editor:n,font_color:i}):null},$n=Ti;\n","export * from './text';\nexport * from './image';\nexport * from './marketing-banner';\nexport * from './spacing-divider';\nexport * from './column-control';\nexport * from './hero-banner';\nexport * from './button';\nexport * from './rich-text';\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\nconst 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 type { TextAlignment } from '../types';\nimport { FONT_STACKS, FONT_SIZES, SPACING } from '../styles/theme';\nimport { responsiveFontSize, centerOnMobile } from '../styles/mixins';\n\nexport const TextContainer = styled.div<{\n textAlignment: TextAlignment;\n}>`\n text-align: ${({ textAlignment }) => textAlignment};\n ${centerOnMobile}\n`;\n\nexport const HeaderText = styled.p<{\n fontColor: string;\n}>`\n margin: ${SPACING.headerMargin};\n font-weight: 500;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n letter-spacing: 0.05em;\n ${responsiveFontSize(FONT_SIZES.header)}\n`;\n\nexport const Title = styled.h2<{\n fontColor: string;\n}>`\n margin: ${SPACING.titleMargin};\n font-weight: 700;\n font-family: ${FONT_STACKS.lora};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.title)}\n`;\n\nexport const Subtitle = styled.h3<{\n fontColor: string;\n}>`\n margin: ${SPACING.subtitleMargin};\n font-weight: 600;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.subtitle)}\n`;\n\nexport const BodyText = styled.p<{\n fontColor: string;\n}>`\n margin: ${SPACING.bodyMargin};\n line-height: 1.6;\n font-family: ${FONT_STACKS.inter};\n color: ${({ fontColor }) => fontColor};\n ${responsiveFontSize(FONT_SIZES.body)}\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 (title, subtitle, bodyText) with responsive styling\n */\n\nimport React from 'react';\nimport type { BannerTextProps } from '../types';\nimport { PLACEHOLDER_VALUES } from '../constants';\nimport { TextContainer, HeaderText, Title, Subtitle, BodyText } from './BannerText.styled';\n\nfunction getDisplayText(\n text: string | undefined,\n placeholderValue: string,\n isVisualBuilderContext?: boolean\n): string | undefined {\n if (isVisualBuilderContext === true && (!text || text === placeholderValue)) {\n return placeholderValue;\n }\n if (isVisualBuilderContext === 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 isVisualBuilderContext\n}: Readonly<BannerTextProps>): React.ReactElement | null {\n const header = getDisplayText(headerText, PLACEHOLDER_VALUES.header, isVisualBuilderContext);\n const titleDisplay = getDisplayText(title, PLACEHOLDER_VALUES.title, isVisualBuilderContext);\n const subtitleDisplay = getDisplayText(subtitle, PLACEHOLDER_VALUES.subtitle, isVisualBuilderContext);\n const body = getDisplayText(bodyText, PLACEHOLDER_VALUES.body, isVisualBuilderContext);\n\n if (!header && !titleDisplay && !subtitleDisplay && !body) {\n return null;\n }\n\n return (\n <TextContainer textAlignment={textAlignment} data-testid={testId}>\n {header && (\n <HeaderText fontColor={textColor} {...($?.header_text ?? {})}>\n {header}\n </HeaderText>\n )}\n {titleDisplay && (\n <Title fontColor={textColor} {...($?.title ?? {})}>\n {titleDisplay}\n </Title>\n )}\n {subtitleDisplay && (\n <Subtitle fontColor={textColor} {...($?.subtitle ?? {})}>\n {subtitleDisplay}\n </Subtitle>\n )}\n {body && (\n <BodyText fontColor={textColor} {...($?.body_text ?? {})}>\n {body}\n </BodyText>\n )}\n </TextContainer>\n );\n}\n","/**\n * BannerMedia Sub-Component\n * Renders responsive media (image/gif/video) with lazy loading and fallback support\n */\n\nimport React from 'react';\nimport {\n MediaContainer,\n StyledImage,\n StyledVideo,\n FallbackMessage,\n PictureElement,\n SourceElement\n} from './BannerMedia.styled';\nimport type { BannerMediaProps } from '../types';\n\nexport function BannerMedia({\n mediaUrl,\n fallbackMediaUrl,\n mediaType = 'image',\n mediaAlt = '',\n onError,\n testId,\n $,\n isResponsive,\n desktopUrl,\n mobileUrl\n}: Readonly<BannerMediaProps>): React.ReactElement {\n const [currentUrl, setCurrentUrl] = React.useState(mediaUrl);\n const [hasError, setHasError] = React.useState(false);\n\n React.useEffect(() => {\n setCurrentUrl(mediaUrl);\n setHasError(false);\n }, [mediaUrl]);\n\n const handleMediaError = () => {\n if (fallbackMediaUrl && currentUrl !== fallbackMediaUrl) {\n setCurrentUrl(fallbackMediaUrl);\n } else {\n setHasError(true);\n }\n onError?.();\n };\n\n const renderMedia = () => {\n if (hasError && !fallbackMediaUrl) {\n return <FallbackMessage></FallbackMessage>;\n }\n\n if (mediaType === 'video') {\n return (\n <StyledVideo\n src={currentUrl}\n onError={handleMediaError}\n autoPlay\n muted\n loop\n playsInline\n data-testid={`${testId}-video`}\n {...($?.bynder_media ?? {})}\n ></StyledVideo>\n );\n }\n\n if (isResponsive && mobileUrl && desktopUrl) {\n return (\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 data-testid={`${testId}-image`}\n {...($?.bynder_media ?? {})}\n />\n </PictureElement>\n );\n }\n\n return (\n <StyledImage\n src={currentUrl}\n alt={mediaAlt}\n onError={handleMediaError}\n loading=\"lazy\"\n data-testid={`${testId}-image`}\n {...($?.bynder_media ?? {})}\n />\n );\n };\n\n return (\n <MediaContainer data-testid={testId} {...($?.bynder_media ?? {})}>\n {renderMedia()}\n </MediaContainer>\n );\n}\n","import styled from '@emotion/styled';\nimport { COLORS } from '../styles/theme';\nimport { flexCenter } from '../styles/mixins';\n\nexport const MediaContainer = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`;\n\nexport const StyledImage = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nexport const StyledVideo = styled.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nexport const FallbackMessage = styled.div`\n ${flexCenter}\n width: 100%;\n height: 100%;\n background-color: ${COLORS.fallbackBg};\n color: ${COLORS.textGray};\n font-size: 14px;\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","import styled from '@emotion/styled';\nimport { css } from '@emotion/react';\nimport type { CTAVariant } from '../types';\nimport { FONT_STACKS, FONT_SIZES, SPACING, COLORS, MEDIA_QUERIES, TRANSITIONS } from '../styles/theme';\nimport { responsiveFontSize } from '../styles/mixins';\n\nconst darkVariant = css`\n background-color: ${COLORS.ctaDark};\n color: ${COLORS.textWhite};\n border: 1px solid ${COLORS.ctaDark};\n\n &:hover {\n background-color: ${COLORS.ctaDark};\n color: ${COLORS.textWhite};\n border-color: ${COLORS.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${COLORS.textWhite};\n outline-offset: 4px;\n }\n`;\n\nconst lightVariant = css`\n background-color: transparent;\n color: ${COLORS.textDark};\n border: 1px solid ${COLORS.ctaBorder};\n\n &:hover {\n background-color: transparent;\n color: ${COLORS.textDark};\n border-color: ${COLORS.textWhite};\n text-decoration: underline;\n transform: translateY(-2px);\n }\n\n &:focus-visible {\n outline: 2px solid ${COLORS.ctaBorder};\n outline-offset: 4px;\n }\n`;\n\nexport const CTALink = styled.a<{ variant: CTAVariant }>`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: ${SPACING.ctaPaddingDesktop};\n text-decoration: none;\n font-family: ${FONT_STACKS.lora};\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color ${TRANSITIONS.default},\n color ${TRANSITIONS.default},\n border-color ${TRANSITIONS.default},\n transform ${TRANSITIONS.default},\n text-decoration ${TRANSITIONS.default};\n\n ${({ variant }) => (variant === 'dark' ? darkVariant : lightVariant)}\n\n &:active {\n transform: translateY(0);\n }\n\n ${responsiveFontSize(FONT_SIZES.cta)}\n\n /* Responsive padding */\n ${MEDIA_QUERIES.mobileAndBelow} {\n padding: ${SPACING.ctaPaddingTablet};\n }\n\n ${MEDIA_QUERIES.wide} {\n padding: ${SPACING.ctaPaddingWide};\n }\n`;\n","/**\n * BannerCTA Sub-Component\n * Renders call-to-action button with accessibility support\n */\n\nimport React from 'react';\nimport type { BannerCTAProps } from '../types';\nimport { CTALink } from './BannerCTA.styled';\n\nexport function BannerCTA({\n ctaLabel,\n ctaDestination,\n variant = 'dark',\n onClick,\n testId,\n $\n}: Readonly<BannerCTAProps>): React.ReactElement {\n return (\n <CTALink\n href={ctaDestination}\n variant={variant}\n onClick={onClick}\n data-testid={testId}\n aria-label={ctaLabel}\n {...($?.cta ?? {})}\n >\n {ctaLabel}\n </CTALink>\n );\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 [currentIndex, setCurrentIndex] = useState(initialIndex);\n const [isPaused, setIsPaused] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n\n const goToNext = useCallback(() => {\n setCurrentIndex((prev) => (prev + 1) % totalSlides);\n }, [totalSlides]);\n\n const goToPrevious = useCallback(() => {\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 // Auto-rotation effect\n useEffect(() => {\n if (!autoRotate || isPaused || prefersReducedMotion) return;\n\n const intervalId = setInterval(goToNext, rotationInterval);\n return () => clearInterval(intervalId);\n }, [autoRotate, isPaused, prefersReducedMotion, rotationInterval, goToNext]);\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","/**\n * TypeScript Interfaces & Types\n * Marketing Banner Component\n *\n * This file defines the public API contract for the CsMarketingBanner component.\n * All types use camelCase naming per constitution v2.0.0.\n */\n\nimport { ReactElement } from 'react';\n\n// ============================================================================\n// Type Enums\n// ============================================================================\n\n/** ContentStack metadata for Visual Builder live editing */\nexport type CSMetadata = Record<string, any>;\n\n/** Approved font family options */\nexport type FontFamily = 'Lora' | 'Inter';\n\n/** Preset font size options (responsive per breakpoint) */\nexport type FontSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/** Gradient color options */\nexport type GradientColor = 'black' | 'white';\n\n/** Gradient direction options */\nexport type GradientDirection = 'leftToRight' | 'rightToLeft' | 'radial';\n\n/** Gradient depth/intensity options */\nexport type GradientDepth = 'sm' | 'md' | 'lg';\n\n/** Color theme options */\nexport type ColorTheme = 'primary' | 'secondary';\n\n/** Text color options */\nexport type TextColor = 'white' | 'dark';\n\n/** Media type options */\nexport type MediaType = 'image' | 'gif' | 'video';\n\n/** Banner alignment within page layout */\nexport type BannerAlignment = 'left' | 'center' | 'right' | 'fullWidth';\n\n/** Text content alignment */\nexport type TextAlignment = 'left' | 'center' | 'right';\n\n/** Object-fit options for media */\nexport type ObjectFit = 'cover' | 'contain';\n\n/** CTA button variant options */\nexport type CTAVariant = 'dark' | 'light';\n\n// ============================================================================\n// Core Entity Interfaces\n// ============================================================================\n\n/** Single marketing banner configuration */\nexport interface MarketingBanner {\n headerText?: string;\n title?: string;\n /** Subtitle text - Inter font, responsive sizing */\n subtitle?: string;\n /** Body text - Inter font, responsive sizing */\n bodyText?: string;\n ctaLabel?: string;\n ctaDestination?: string;\n ctaVariant?: CTAVariant;\n mediaUrl?: string;\n fallbackMediaUrl?: string;\n mediaType?: MediaType;\n mediaAlt?: string;\n /** Whether responsive images are enabled (Bynder customTransformation) */\n isResponsive?: boolean;\n /** Desktop image URL with 16:9 aspect ratio */\n desktopUrl?: string;\n /** Mobile image URL with 3:4 aspect ratio */\n mobileUrl?: string;\n\n /** Position of content (text + button): left, center, or right */\n position?: 'left' | 'center' | 'right';\n\n /** Text color for all text elements (header, title, subtitle, body) - white or dark */\n textColor?: TextColor;\n\n // Gradient overlay configuration\n /** Show gradient overlay over media */\n showGradient?: boolean;\n /** Gradient depth/intensity */\n gradientDepth?: GradientDepth;\n\n testId?: string;\n\n /** ContentStack metadata for Visual Builder */\n $?: CSMetadata;\n}\n\n/** Carousel configuration for multiple banner slides */\nexport interface BannerCarousel {\n banners: MarketingBanner[];\n /** Rotation interval in milliseconds (default: 5000) */\n rotationInterval?: number;\n testId?: string;\n}\n\n// ============================================================================\n// Component Props Interfaces\n// ============================================================================\n\n/** Main component props for CsMarketingBanner */\nexport interface CsMarketingBannerProps {\n /** Array of banner configurations. If more than one, displays as carousel */\n readonly banners: MarketingBanner[];\n /** Auto-rotation interval in milliseconds (default: 5000) */\n readonly rotationInterval?: number;\n /** Test ID for component */\n readonly testId?: string;\n /** Context indicator: true if component runs in Visual Builder, false if in live app */\n readonly isVisualBuilderContext?: boolean;\n}\n\n/** Props for BannerText sub-component */\nexport interface BannerTextProps {\n readonly headerText?: string;\n readonly title?: string;\n readonly subtitle?: string;\n readonly bodyText?: string;\n readonly textColor?: string;\n readonly textAlignment?: TextAlignment;\n readonly testId?: string;\n readonly $?: CSMetadata;\n readonly isVisualBuilderContext?: boolean;\n}\n\n/** Props for BannerCTA sub-component */\nexport interface BannerCTAProps {\n readonly ctaLabel: string;\n readonly ctaDestination: string;\n readonly variant?: CTAVariant;\n readonly onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;\n readonly testId?: string;\n readonly $?: CSMetadata;\n}\n\n/** Props for BannerMedia sub-component */\nexport interface BannerMediaProps {\n readonly mediaUrl: string;\n readonly fallbackMediaUrl?: string;\n readonly mediaType?: MediaType;\n readonly mediaAlt?: string;\n readonly onError?: () => void;\n readonly testId?: string;\n readonly $?: CSMetadata;\n readonly isResponsive?: boolean;\n readonly desktopUrl?: string;\n readonly mobileUrl?: string;\n}\n\n// ============================================================================\n// CS Data Transformation Interfaces\n// ============================================================================\n\n/** ContentStack CS data structure (snake_case format) */\nexport interface CSBannerData {\n /** Header text (eyebrow) */\n header_text?: string;\n /** Main title */\n title?: string;\n /** Subtitle text */\n subtitle?: string;\n /** Body text */\n body_text?: string;\n /** CTA button label */\n cta_label?: string;\n /** CTA button destination URL */\n cta_destination?: string;\n /** CTA button variant */\n cta_variant?: 'dark' | 'light';\n bynder_media?: any; // Raw Bynder media object from CS, to be processed by extractBynderMedia\n /** Position of content */\n position?: 'left' | 'center' | 'right';\n /** Text color for all text elements */\n text_color?: 'white' | 'dark';\n /** Show gradient overlay */\n show_gradient?: boolean;\n /** Gradient depth/intensity */\n gradient_depth?: 'sm' | 'md' | 'lg';\n\n /** ContentStack nested objects */\n cta?: {\n label?: string;\n url?: string;\n variant?: 'dark' | 'light';\n $?: CSMetadata;\n };\n gradient?: {\n show_gradient?: boolean;\n gradient_depth?: 'sm' | 'md' | 'lg';\n $?: CSMetadata;\n };\n content_position?: 'left' | 'center' | 'right';\n\n /** ContentStack metadata */\n _metadata?: {\n uid?: string;\n $?: CSMetadata;\n };\n $?: CSMetadata;\n isVisualBuilderContext?: boolean;\n}\n\n/** CS carousel data structure */\nexport interface CSCarouselData {\n banners: CSBannerData[];\n /** Rotation interval in milliseconds */\n rotation_interval?: number;\n\n /** ContentStack metadata */\n _metadata?: {\n uid?: string;\n $?: CSMetadata;\n };\n $?: CSMetadata;\n}\n\n// ============================================================================\n// Utility Type Guards\n// ============================================================================\n\nexport function isCarouselMode(props: CsMarketingBannerProps): boolean {\n return Array.isArray(props.banners) && props.banners.length > 1;\n}\n\nexport function hasMedia(banner: MarketingBanner): boolean {\n return Boolean(banner.mediaUrl);\n}\n\nexport function hasCTA(banner: MarketingBanner): boolean {\n return Boolean(banner.ctaLabel && banner.ctaDestination);\n}\n\n// ============================================================================\n// Hook Return Types\n// ============================================================================\n\nexport interface UseCarouselReturn {\n currentIndex: number;\n isPaused: boolean;\n totalSlides: number;\n goToNext: () => void;\n goToPrevious: () => void;\n goToSlide: (index: number) => void;\n pause: () => void;\n resume: () => void;\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\nexport interface UseMediaLoaderReturn {\n ref: React.RefObject<HTMLDivElement>;\n shouldLoad: boolean;\n hasError: boolean;\n handleError: () => void;\n}\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 }\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 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, BannerMedia, BannerCTA } from './components';\nimport { useCarousel } from './hooks';\nimport { isCarouselMode, hasMedia, hasCTA } from './types';\nimport type { CsMarketingBannerProps, MarketingBanner } from './types';\nimport { TEXT_COLOR_MAP } from './styles/theme';\nimport {\n BannerContainer,\n CarouselWrapper,\n CarouselTrack,\n BannerSlide,\n BannerContent,\n MediaWrapper,\n TextContentWrapper,\n GradientOverlay,\n CarouselControls,\n Indicator\n} from './MarketingBanner.styled';\n\nconst renderBanner = (\n banner: MarketingBanner,\n isVisualBuilderContext: boolean,\n index: number,\n componentTestId?: string\n) => {\n const showMedia = hasMedia(banner);\n const showCTA = hasCTA(banner);\n\n const baseTestId = banner.testId ?? componentTestId ?? 'banner';\n const resolvedTextColor = TEXT_COLOR_MAP[banner.textColor ?? 'white'];\n\n const showGradient = banner.showGradient === true;\n const position = banner.position ?? 'left';\n\n // Derive gradient color from text color (inverse)\n const gradientColor = banner.textColor === '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 return (\n <BannerSlide key={`${baseTestId}-${index}`}>\n <BannerContent hasMedia={showMedia}>\n {showMedia && banner.mediaUrl && (\n <MediaWrapper>\n <BannerMedia\n mediaUrl={banner.mediaUrl}\n fallbackMediaUrl={banner.fallbackMediaUrl}\n mediaType={banner.mediaType}\n mediaAlt={banner.mediaAlt}\n testId={`${baseTestId}-${index}-media`}\n $={banner.$}\n isResponsive={banner.isResponsive}\n desktopUrl={banner.desktopUrl}\n mobileUrl={banner.mobileUrl}\n />\n </MediaWrapper>\n )}\n\n {showGradient && (\n <GradientOverlay\n direction={gradientDirection}\n depth={banner.gradientDepth ?? 'md'}\n color={gradientColor}\n />\n )}\n\n <TextContentWrapper position={position}>\n <BannerText\n headerText={banner.headerText}\n title={banner.title}\n subtitle={banner.subtitle}\n bodyText={banner.bodyText}\n textColor={resolvedTextColor}\n textAlignment={textAlignment}\n testId={`${baseTestId}-${index}-text`}\n $={banner.$}\n isVisualBuilderContext={isVisualBuilderContext}\n />\n\n {showCTA && banner.ctaLabel && banner.ctaDestination && (\n <BannerCTA\n ctaLabel={banner.ctaLabel}\n ctaDestination={banner.ctaDestination}\n variant={banner.ctaVariant ?? 'dark'}\n testId={`${baseTestId}-${index}-cta`}\n $={banner.$}\n />\n )}\n </TextContentWrapper>\n </BannerContent>\n </BannerSlide>\n );\n};\n\nexport default function MarketingBannerComponent(props: Readonly<CsMarketingBannerProps>): React.ReactElement {\n const { banners, rotationInterval, testId, isVisualBuilderContext = false } = props;\n\n const isCarousel = isCarouselMode(props);\n\n const carousel = useCarousel({\n totalSlides: banners.length,\n autoRotate: isCarousel,\n rotationInterval: rotationInterval ?? 5000,\n pauseOnHover: true,\n initialIndex: 0\n });\n\n return (\n <BannerContainer\n data-testid={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, isVisualBuilderContext, index, testId))}\n </CarouselTrack>\n </CarouselWrapper>\n\n {isCarousel && (\n <CarouselControls>\n {banners.map((banner, index) => (\n <Indicator\n key={`${testId ?? '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","export type BynderMediaType = 'image' | 'gif' | 'video';\n\nexport type BynderMediaExtracted = {\n url: string;\n type: BynderMediaType;\n alt: string;\n isResponsive?: boolean;\n desktopUrl?: string;\n mobileUrl?: string;\n};\n\nexport type BynderImageDataType = {\n /** selected is manually added, using additionalInfo from bynder */\n selected?: {\n url: string;\n fileSize: number | null;\n width: number | null;\n height: number | null;\n imageType?: string;\n type: 'VIDEO' | 'IMAGE';\n altText?: string;\n fit: 'cover' | 'contain' | 'scale-down' | 'none';\n position: string;\n bgColor: string;\n };\n isPublic: boolean;\n __typename?: 'Image';\n id: string;\n name: string;\n description: string | null;\n databaseId: string;\n originalUrl?: string;\n type: 'VIDEO' | 'IMAGE' | 'DOCUMENT';\n url?: string;\n previewUrls?: string[];\n extensions?: string[];\n textMetaproperties?: ({\n name: string;\n value: string;\n } | null)[];\n files: {\n [key: string]: {\n url: string;\n width: number | null;\n height: number | null;\n fileSize: number | null;\n };\n };\n};\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 ioParam = url.searchParams.get('io');\n\n if (!ioParam) return baseUrl;\n\n const updatedIo = `${ioParam},aspectratio:${aspectRatio}`;\n\n const params: string[] = [];\n params.push(`io=${updatedIo}`);\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\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';\n const result: BynderMediaExtracted = {\n url: mediaUrl,\n type: mediaType,\n alt: selected?.altText ?? ''\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","/**\n * CS Data Transformation Utilities\n * Converts snake_case CS data to camelCase component props\n *\n * Handles actual ContentStack data structure with nested objects and metadata\n * Preserves $ metadata for Visual Builder live editing\n */\n\nimport { extractBynderMedia } from '../../utils/bynder-utils';\nimport type { CSBannerData, CSCarouselData, MarketingBanner, BannerCarousel } from '../types';\n\n/**\n * Transform single banner data from CS format to component props format\n */\nfunction transformCSBanner(csData: CSBannerData): MarketingBanner {\n const mediaData = extractBynderMedia((csData as any).bynder_media);\n\n return {\n title: csData.title,\n headerText: csData.header_text,\n subtitle: csData.subtitle,\n bodyText: csData.body_text,\n ctaLabel: csData.cta?.label ?? csData.cta_label,\n ctaDestination: csData.cta?.url ?? csData.cta_destination,\n ctaVariant: csData.cta?.variant ?? csData.cta_variant,\n mediaUrl: mediaData?.url ?? '',\n fallbackMediaUrl: '',\n mediaType: mediaData?.type ?? 'image',\n mediaAlt: mediaData?.alt ?? '',\n isResponsive: mediaData?.isResponsive,\n desktopUrl: mediaData?.desktopUrl,\n mobileUrl: mediaData?.mobileUrl,\n position: csData.content_position ?? csData.position,\n textColor: csData.text_color,\n showGradient: csData.gradient?.show_gradient ?? csData.show_gradient,\n gradientDepth: csData.gradient?.gradient_depth ?? csData.gradient_depth,\n $: csData.$ // Preserve ContentStack metadata for Visual Builder\n };\n}\n\n/**\n * Transform carousel data from CS format to component props format\n */\nexport function transformCSMarketingBanner(csData: CSCarouselData): BannerCarousel {\n return {\n banners: csData.banners.map(transformCSBanner),\n rotationInterval: csData.rotation_interval\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, { useRef, useMemo } from 'react';\n\nimport SliderImport from 'react-slick';\nimport * as Styled from './ColumnControl.styled';\n\nimport {\n unwrapComponent,\n EmptyPlaceholder,\n getPresetColumns,\n isVariableWidthPreset,\n getVariableSlideWidth,\n getSlidesToShowByViewport,\n getSlidesForRender,\n buildResponsiveSettings\n} from './utils';\nimport { useColumnControlResize } from './hooks/useColumnControlResize';\n\nimport type { ColumnControlProps } from './types';\nimport { DEVICE_SIZES, getGapPx, MAX_SLIDE_HEIGHT_PX, MAX_ALLOWED_COLUMN_CONTROL_ITEMS } from './types';\n\nimport 'slick-carousel/slick/slick.css';\nimport 'slick-carousel/slick/slick-theme.css';\n\nconst Slider = unwrapComponent(SliderImport);\nconst ColumnControlContainer = unwrapComponent(Styled.ColumnControlContainer);\nconst ArrowButton = unwrapComponent(Styled.ArrowButton);\nconst InnerWrapper = unwrapComponent(Styled.InnerWrapper);\nconst TabletGridContainer = unwrapComponent(Styled.TabletGridContainer);\nconst SlideSection = unwrapComponent(Styled.SlideSection);\nconst SlideInner = unwrapComponent(Styled.SlideInner);\nconst SlideContentInner = unwrapComponent(Styled.SlideContentInner);\n\n/** Ref type for react-slick Slider (only the methods we use). */\ninterface SliderRefInstance {\n slickPrev: () => void;\n slickNext: () => void;\n}\n\ninterface GridLayoutContentProps {\n emptyBlockParentClass?: string;\n slidesForRender: unknown[];\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n renderSlides: (useFlexLayout?: boolean) => React.ReactNode;\n sliderRef: React.RefObject<SliderRefInstance | null>;\n finalSettings: object;\n carouselKey: string;\n preset: string;\n gap: number;\n $?: Record<string, unknown>;\n}\n\ninterface ViewportLayoutState {\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n stackedItemHeight: string;\n stackedItemMaxHeight: number;\n stackedVerticalGap: number;\n containerHeight: string;\n}\n\nfunction getViewportLayoutState(\n isGridLayout: boolean,\n windowWidth: number,\n gapPx: number,\n height?: string\n): ViewportLayoutState {\n const isStackedViewport = windowWidth <= DEVICE_SIZES.SMALL;\n const isTabletGridViewport =\n isGridLayout && windowWidth > DEVICE_SIZES.SMALL && windowWidth <= DEVICE_SIZES.LARGE;\n\n const stackedItemHeight = '100%';\n const stackedItemMaxHeight = MAX_SLIDE_HEIGHT_PX;\n const stackedVerticalGap = isGridLayout && isStackedViewport ? gapPx : 0;\n const containerHeight = height ?? 'auto';\n\n return {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight\n };\n}\n\ninterface SlidesMeta<T> {\n gridSlides: T[];\n slidesToShow: number;\n shouldShowDots: boolean;\n}\n\nfunction getSlidesMeta<T>(\n slides: T[],\n isGridLayout: boolean,\n presetColumns: number,\n presetSlidesToShow: number,\n effectiveShowPagination: boolean\n): SlidesMeta<T> {\n const gridSlides = isGridLayout ? slides.slice(0, MAX_ALLOWED_COLUMN_CONTROL_ITEMS) : slides;\n\n const slidesToShow = isGridLayout\n ? Math.min(gridSlides.length, presetColumns, MAX_ALLOWED_COLUMN_CONTROL_ITEMS)\n : presetSlidesToShow;\n\n const shouldShowDots = isGridLayout\n ? effectiveShowPagination && gridSlides.length > 1\n : gridSlides.length > 1;\n\n return { gridSlides, slidesToShow, shouldShowDots };\n}\n\nfunction 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 flexBasis = presetColumns === 1 ? '100%' : `calc(50% - ${gap / 2}px)`;\n\n return slidesForRender.map((slide, index) => {\n let slideWidth: string | undefined;\n\n if (!useFlexLayout && isVariableWidth) {\n slideWidth = getSlideWidth(index);\n }\n\n const slideId = (slide as { id?: string | number } | null | undefined)?.id;\n const slideKey = slideId != null ? String(slideId) : `slide-${index}`;\n\n return (\n <SlideSection\n key={slideKey}\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={flexBasis}\n isVariableWidth={isVariableWidth}\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\nfunction GridLayoutContent(props: Readonly<GridLayoutContentProps>) {\n const {\n emptyBlockParentClass,\n isStackedViewport,\n isTabletGridViewport,\n renderSlides,\n sliderRef,\n finalSettings,\n carouselKey,\n preset,\n slidesForRender,\n gap,\n $ = {}\n } = props;\n if (isStackedViewport) {\n return (\n <div className=\"column-control-container\">\n {slidesForRender.length > 0 ? (\n renderSlides()\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n )}\n </div>\n );\n }\n if (isTabletGridViewport) {\n return (\n <TabletGridContainer className=\"column-control-container\" gap={gap}>\n {slidesForRender.length > 0 ? (\n renderSlides(true)\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n )}\n </TabletGridContainer>\n );\n }\n // Desktop / wide grid viewport: render using Slider for structure but with grid-safe settings\n return slidesForRender.length > 0 ? (\n <Slider ref={sliderRef} {...finalSettings} key={`${carouselKey}-${preset}`}>\n {renderSlides(true)}\n </Slider>\n ) : (\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n );\n}\n\nfunction ColumnControl<T = unknown>({\n slides,\n renderSlide,\n preset = 'single-full',\n layout = 'grid',\n autoplayEnabled = false,\n autoplayDuration = 3,\n showPagination = true,\n onSlideChange,\n className,\n slickSettings,\n gap = 'medium',\n height,\n fullWidth,\n emptyBlockParentClass,\n isEditing,\n parent$,\n $\n}: ColumnControlProps<T>) {\n const gapPx = getGapPx(gap);\n const isGridLayout = layout === 'grid';\n // Default fullWidth to true when layout is grid\n const effectiveFullWidth = fullWidth ?? isGridLayout;\n\n const { windowWidth, carouselKey } = useColumnControlResize(preset, slides.length);\n\n // Base column count derived purely from preset (ignores viewport).\n const presetColumns = useMemo(() => getPresetColumns(preset), [preset]);\n\n const presetSlidesToShow = getSlidesToShowByViewport(windowWidth, presetColumns);\n\n const isVariableWidth = isVariableWidthPreset(preset, windowWidth);\n\n const getSlideWidth = useMemo(\n () => (index: number) => getVariableSlideWidth(preset, index, windowWidth),\n [preset, windowWidth]\n );\n\n const effectiveAutoplayEnabled = isGridLayout ? false : autoplayEnabled;\n const effectiveShowPagination = isGridLayout ? false : showPagination;\n // Arrows: desktop only (>1024px), never on mobile/tablet\n const showArrowsOnDesktop = !isGridLayout && windowWidth > DEVICE_SIZES.LARGE;\n\n // Stacked = single column only on small mobile\n const {\n isStackedViewport,\n isTabletGridViewport,\n stackedItemHeight,\n stackedItemMaxHeight,\n stackedVerticalGap,\n containerHeight\n } = getViewportLayoutState(isGridLayout, windowWidth, gapPx, height);\n\n const { gridSlides, slidesToShow, shouldShowDots } = getSlidesMeta(\n slides,\n isGridLayout,\n presetColumns,\n presetSlidesToShow,\n effectiveShowPagination\n );\n\n const responsiveSettings = useMemo(\n () =>\n buildResponsiveSettings({\n isGridLayout,\n presetSlidesToShow,\n gridSlides,\n presetColumns,\n shouldShowDots\n }),\n [isGridLayout, presetSlidesToShow, gridSlides, presetColumns, shouldShowDots]\n );\n\n const settings = {\n dots: shouldShowDots,\n infinite: !isGridLayout && gridSlides.length > slidesToShow,\n speed: 500,\n slidesToShow,\n slidesToScroll: 1,\n autoplay: effectiveAutoplayEnabled,\n autoplaySpeed: autoplayDuration * 1000,\n pauseOnHover: true,\n arrows: false,\n variableWidth: isVariableWidth,\n swipe: !isGridLayout,\n draggable: !isGridLayout,\n beforeChange: (_: number, next: number) => {\n if (onSlideChange) {\n onSlideChange(next);\n }\n },\n responsive: responsiveSettings,\n ...slickSettings\n };\n\n const sliderRef = useRef<SliderRefInstance | null>(null);\n\n const goToPrevious = () => {\n sliderRef.current?.slickPrev();\n };\n\n const goToNext = () => {\n sliderRef.current?.slickNext();\n };\n\n const finalSettings = {\n ...settings\n };\n\n const containerClassName = [className, isGridLayout ? 'column-control-container' : undefined]\n .filter(Boolean)\n .join(' ');\n\n const slidesForRender = getSlidesForRender({\n isGridLayout,\n isStackedViewport,\n isTabletGridViewport,\n gridSlides,\n presetColumns,\n slidesToShow\n });\n\n const renderSlides = (useFlexLayout = false) =>\n renderSlidesContent({\n slidesForRender,\n renderSlide,\n presetColumns,\n gap: gapPx,\n isVariableWidth,\n getSlideWidth,\n stackedVerticalGap,\n stackedItemHeight,\n stackedItemMaxHeight,\n useFlexLayout,\n $\n });\n\n return (\n <ColumnControlContainer\n gap={gapPx}\n height={containerHeight}\n columnHeight={stackedItemHeight}\n maxColumnHeight={stackedItemMaxHeight}\n isVariableWidth={isVariableWidth}\n className={containerClassName}\n aria-label={layout === 'carousel' ? 'Carousel Control' : 'Column Control'}\n fullWidth={effectiveFullWidth}\n {...(parent$ ?? {})}\n >\n <InnerWrapper>\n <div\n {...($?.['slides'] ?? {})}\n {...($?.['slides__parent'] ?? {})}\n {...{ 'data-add-direction': 'horizontal' }}\n >\n {layout === 'carousel' && (\n <Slider ref={sliderRef} {...finalSettings} key={carouselKey}>\n\n {\n slidesForRender.length > 0 ?\n renderSlides() :\n <EmptyPlaceholder emptyBlockParentClass={emptyBlockParentClass} />\n }\n </Slider>\n )}\n {layout === 'grid' && (\n <GridLayoutContent\n emptyBlockParentClass={emptyBlockParentClass}\n slidesForRender={slidesForRender}\n isStackedViewport={isStackedViewport}\n isTabletGridViewport={isTabletGridViewport}\n renderSlides={renderSlides}\n sliderRef={sliderRef}\n finalSettings={finalSettings}\n carouselKey={carouselKey}\n preset={preset}\n gap={gapPx}\n $={$}\n />\n )}\n </div>\n\n {layout === 'carousel' && showArrowsOnDesktop && slides.length > slidesToShow && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={goToPrevious}\n aria-label=\"Previous slide\"\n fullWidth={effectiveFullWidth}\n >\n ‹\n </ArrowButton>\n <ArrowButton direction=\"next\" onClick={goToNext} aria-label=\"Next slide\" fullWidth={effectiveFullWidth}>\n ›\n </ArrowButton>\n </>\n )}\n </InnerWrapper>\n </ColumnControlContainer>\n );\n};\n\nexport default ColumnControl as React.FC<ColumnControlProps>;\n","import { styled } from '@nuskin/foundation-theme';\nimport { DEVICE_SIZES, 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 isVariableWidth: boolean;\n fullWidth?: boolean;\n}>(({ gap, height, columnHeight, maxColumnHeight, fullWidth }) => ({\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: '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 ...(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' ? '100%' : 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: 'absolute',\n // Bring pagination closer to the slides\n bottom: -36,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n listStyle: 'none',\n padding: 0,\n margin: 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: -32,\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 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 // Fill parent height so renderSlide content can occupy full slide height\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 boxSizing: useFlexLayout ? 'border-box' : undefined,\n // Prevent slides from shrinking too small for readability (non-variable presets)\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 // 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 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 ...(fullWidth\n ? direction === 'prev'\n ? { left: 8 }\n : { right: 8 }\n : direction === 'prev'\n ? { left: -60 }\n : { right: -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 ...(fullWidth\n ? direction === 'prev'\n ? { left: 4 }\n : { right: 4 }\n : direction === 'prev'\n ? { left: -45 }\n : { right: -45 })\n },\n\n [`@media (max-width: ${DEVICE_SIZES.SMALL}px)`]: {\n width: 32,\n height: 32,\n fontSize: 20,\n ...(fullWidth\n ? direction === 'prev'\n ? { left: 2 }\n : { right: 2 }\n : direction === 'prev'\n ? { left: -35 }\n : { right: -35 })\n }\n}));\n\nexport const InnerWrapper = styled('div')({\n position: 'relative',\n height: '100%'\n});\n\n\nexport const EmptyPlaceholderWrapper = styled('div')({\n padding: '10px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\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 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?: SlidePreset;\n /** Layout mode: grid behaves like stacked list on small/tablet; carousel uses full slider behavior */\n layout?: 'grid' | 'carousel';\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 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 const DEVICE_SIZES = {\n ULTRA_SMALL: 320,\n EXTRA_SMALL: 480,\n SMALL: 600,\n MEDIUM: 768,\n LARGE: 1024,\n EXTRA_LARGE: 1200,\n ULTRA_LARGE: 1440,\n SUPER_LARGE: 1920\n} as const;\n\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/** Max height of a slide/card when height is content-driven. Authoring guide recommends designing for 400px. */\nexport const MAX_SLIDE_HEIGHT_PX = 450;\n\n// Max number of items allowed when using grid/column-control style layout\nexport const MAX_ALLOWED_COLUMN_CONTROL_ITEMS = 4;\n","import React from 'react';\n\nimport { EmptyPlaceholderWrapper } from './ColumnControl.styled';\nimport type { ColumnControlProps } from './types';\nimport { DEVICE_SIZES, MAX_ALLOWED_COLUMN_CONTROL_ITEMS } from './types';\n\nexport function unwrapComponent<T>(mod: T): any {\n if (!mod) return mod;\n\n // already a component/function\n if (typeof mod === 'function') return mod;\n\n // default export wrapped\n if (typeof mod === 'object' && (mod as any).default) {\n return (mod as any).default;\n }\n\n return mod;\n}\n\nexport const EmptyPlaceholder: React.FC<Readonly<{ emptyBlockParentClass?: string; text?: string }>> = ({\n emptyBlockParentClass,\n text = 'Add items to the column control/carousel'\n}) =>\n React.createElement(\n EmptyPlaceholderWrapper as React.ComponentType<any>,\n { className: emptyBlockParentClass },\n text\n );\n\nexport function getPresetColumns(preset: ColumnControlProps['preset']): 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\nexport function isVariableWidthPreset(preset: ColumnControlProps['preset'], windowWidth: number): boolean {\n if (windowWidth <= DEVICE_SIZES.MEDIUM) return false;\n return preset === 'two-small-large' || preset === 'three-small-medium-large';\n}\n\nexport function getVariableSlideWidth(\n preset: ColumnControlProps['preset'],\n index: number,\n windowWidth: number\n): string {\n if (windowWidth <= DEVICE_SIZES.MEDIUM) return 'auto';\n\n if (preset === 'two-small-large') {\n return index % 2 === 0 ? '33.33%' : '66.67%';\n }\n\n if (preset === 'three-small-medium-large') {\n const pos = index % 3;\n if (pos === 0 || pos === 2) return '25%';\n return '50%';\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 getSlidesForRender<T>(params: {\n isGridLayout: boolean;\n isStackedViewport: boolean;\n isTabletGridViewport: boolean;\n gridSlides: T[];\n presetColumns: number;\n slidesToShow: number;\n}): T[] {\n const { isGridLayout, isStackedViewport, isTabletGridViewport, gridSlides, presetColumns, slidesToShow } = params;\n if (isGridLayout && (isStackedViewport || isTabletGridViewport)) {\n return gridSlides.slice(0, Math.min(presetColumns, gridSlides.length));\n }\n if (isGridLayout) return gridSlides.slice(0, slidesToShow);\n return gridSlides;\n}\n\nexport function buildResponsiveSettings(params: {\n isGridLayout: boolean;\n presetSlidesToShow: number;\n gridSlides: unknown[];\n presetColumns: number;\n shouldShowDots: boolean;\n}) {\n const { isGridLayout, presetSlidesToShow, gridSlides, presetColumns, shouldShowDots } = params;\n const gridSlidesToShow = (maxCols: number) => Math.min(gridSlides.length, presetColumns, maxCols);\n const carouselSlidesToShow = (maxCols: number) => Math.min(presetSlidesToShow, maxCols);\n return [\n {\n breakpoint: DEVICE_SIZES.SMALL,\n settings: {\n slidesToShow: isGridLayout ? 1 : Math.min(presetSlidesToShow, 1),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.MEDIUM,\n settings: {\n slidesToShow: isGridLayout ? gridSlidesToShow(2) : carouselSlidesToShow(2),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n },\n {\n breakpoint: DEVICE_SIZES.LARGE,\n settings: {\n slidesToShow: isGridLayout\n ? gridSlidesToShow(MAX_ALLOWED_COLUMN_CONTROL_ITEMS)\n : carouselSlidesToShow(3),\n slidesToScroll: 1,\n swipeToSlide: !isGridLayout,\n arrows: false,\n dots: shouldShowDots,\n variableWidth: false\n }\n }\n ];\n}\n","import { useEffect, useState } from 'react';\n\nimport type { ColumnControlProps } from '../types';\n\nexport interface UseColumnControlResizeResult {\n windowWidth: number;\n carouselKey: string;\n}\n\nexport function useColumnControlResize(\n preset: ColumnControlProps['preset'],\n slideCount: number\n): UseColumnControlResizeResult {\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 from 'react';\nimport { NsIcon, NsIconVariants } from '@nuskin/foundation-ui-components';\nimport { ButtonContainer, StyledButton, StyledLabelText, StyledIconWrapper } from './Button.styled';\nimport {\n getButtonWidth,\n getIconSize,\n isValidDestination,\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 label,\n open_in_new_tab: target = DEFAULT_TARGET,\n variant,\n button_size: size,\n alignment,\n buttontype: buttonType = DEFAULT_BUTTON_TYPE,\n icon,\n iconposition: iconPosition,\n button_state: disabled,\n placeholder_text: placeholderText = DEFAULT_PLACEHOLDER_TEXT,\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 resolvedIconPosition = iconPosition ?? DEFAULT_ICON_POSITION;\n\n const resolvedButtonType: ButtonType =\n buttonType === BUTTON_TYPE_ROUNDED ? BUTTON_TYPE_ROUNDED : BUTTON_TYPE_SQUARE;\n\n const resolvedUrl = label?.href?.trim() ?? undefined;\n const hrefProp = isValidDestination(resolvedUrl) ? resolvedUrl : undefined;\n\n const variantDefault =\n variantDefaults[resolvedVariant as keyof typeof variantDefaults] ?? variantDefaults[DEFAULT_VARIANT];\n const buttonWidth = getButtonWidth(resolvedSize);\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 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}>\n <NsIcon name={IconName} size={iconSize} colorOverride={iconColor} {...($?.icon ?? {})} />\n </StyledIconWrapper>\n );\n };\n\n const getLabelText = () => {\n const labelTitle = label?.title ?? '';\n\n if (isEditing) {\n return labelTitle;\n }\n\n if (labelTitle === '' || labelTitle === placeholderText) {\n return placeholderText;\n }\n\n return labelTitle;\n };\n\n return (\n <ButtonContainer alignment={resolvedAlignment}>\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 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 {renderIcon('left')}\n <StyledLabelText {...(label?.$?.title ?? {})}>{getLabelText()}</StyledLabelText>\n {renderIcon('right')}\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 } from './types';\nimport { ROUNDED_BORDER_RADIUS, ICON_MARGIN, BUTTON_TYPE_ROUNDED } from './helpers';\n\nconst BUTTON_GAP = '4px';\nconst BUTTON_MIN_WIDTH = '70px';\nconst BUTTON_MIN_HEIGHT = '30px';\nconst DESKTOP_BREAKPOINT = '769px';\nconst TABLET_BREAKPOINT = '768px';\nconst MOBILE_BREAKPOINT = '425px';\nconst DESKTOP_FONT_SIZE = '13px';\nconst TABLET_FONT_SIZE = '12px';\nconst MOBILE_FONT_SIZE = '10px';\nconst DESKTOP_PADDING = '10px 6px';\nconst TABLET_PADDING = '8px 6px';\nconst MOBILE_PADDING = '4px 8px';\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): string => {\n if (alignment === 'center') return JUSTIFY_CONTENT_CENTER;\n if (alignment === 'right') return JUSTIFY_CONTENT_FLEX_END;\n return JUSTIFY_CONTENT_FLEX_START;\n};\n\nexport const ButtonContainer = styled('div')<{ alignment: ButtonAlignment }>`\n display: flex;\n justify-content: ${props => getJustifyContent(props.alignment)};\n width: 100%;\n`;\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $buttonWidth: 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 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 \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 min-width: ${BUTTON_MIN_WIDTH};\n min-height: ${BUTTON_MIN_HEIGHT};\n white-space: normal;\n overflow: hidden;\n box-sizing: border-box;\n width: ${props => props.$buttonWidth};\n ${props => props.$buttonType === BUTTON_TYPE_ROUNDED && `border-radius: ${ROUNDED_BORDER_RADIUS};`}\n }\n\n @media (min-width: ${DESKTOP_BREAKPOINT}) {\n && {\n font-size: ${DESKTOP_FONT_SIZE};\n padding: ${DESKTOP_PADDING};\n font-weight: ${DESKTOP_FONT_WEIGHT};\n }\n }\n \n @media (max-width: ${TABLET_BREAKPOINT}) {\n && {\n font-size: ${TABLET_FONT_SIZE};\n padding: ${TABLET_PADDING};\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\n }\n }\n\n @media (max-width: ${MOBILE_BREAKPOINT}) {\n && {\n font-size: ${MOBILE_FONT_SIZE};\n padding: ${MOBILE_PADDING};\n font-weight: ${TABLET_MOBILE_FONT_WEIGHT};\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\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 = '99px';\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 Label';\nexport const DEFAULT_TARGET = 'No';\nexport const BUTTON_TYPE_ROUNDED = 'rounded';\nexport const BUTTON_TYPE_SQUARE = 'square';\nexport const BORDER_COLOR_TRANSPARENT = 'transparent';\n\nexport function isValidDestination(dest?: string): boolean {\n if (!dest || dest.trim() === '') return false;\n \n const trimmed = dest.trim();\n \n if (trimmed.startsWith('#')) return true;\n if (trimmed.startsWith('/')) return true;\n if (trimmed.startsWith('//')) return true;\n \n try {\n const url = new URL(trimmed);\n return url.protocol === PROTOCOL_HTTP || url.protocol === PROTOCOL_HTTPS;\n } catch {\n return false;\n }\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} 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 { NsTypography } from '@nuskin/foundation-ui-components';\n\ninterface TypographyProps {\n value?: string;\n placeholder: string;\n isEditing: boolean;\n typographyProps: React.ComponentProps<typeof NsTypography>;\n}\n\nexport const Typography = ({\n value,\n placeholder,\n isEditing,\n typographyProps\n}: TypographyProps) => {\n\n let displayValue = value;\n\n if (!isEditing && value !== placeholder) {\n displayValue = value;\n } else if (value === '') {\n displayValue = placeholder;\n }\n\n return (\n <NsTypography {...typographyProps}>\n {displayValue}\n </NsTypography>\n );\n};\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// Media loading attribute\nexport const IMAGE_LOADING_LAZY = 'lazy';\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';\n\ninterface TypographyFieldConfig {\n value?: string;\n placeholder: string;\n variant: 'body-s' | 'h2' | 'h5' | 'h6';\n className: string;\n noSpacing?: boolean;\n weight?: 'bold';\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}\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: 'body-s',\n className: 'brand-caption',\n noSpacing: true,\n editTagKey: 'brandcaption'\n },\n {\n value: title,\n placeholder: PLACEHOLDER_TITLE,\n variant: 'h2',\n className: 'title',\n weight: 'bold',\n editTagKey: 'title'\n },\n {\n value: subtitle,\n placeholder: PLACEHOLDER_SUBTITLE,\n variant: 'h5',\n className: 'subtitle',\n editTagKey: 'subtitle'\n },\n {\n value: body,\n placeholder: PLACEHOLDER_BODY,\n variant: 'h6',\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}) => {\n const fields = getTypographyFields(brandcaption, title, subtitle, body);\n\n return (\n <>\n {fields.map((field) => {\n const typographyProps: React.ComponentProps<typeof Typography>['typographyProps'] = {\n variant: field.variant,\n className: field.className,\n ...(field.noSpacing && { noSpacing: true }),\n ...(field.weight && { weight: field.weight }),\n additionalProps: { ...(editTags?.[field.editTagKey] ?? {}) }\n };\n return (\n <Typography\n key={field.editTagKey}\n value={field.value}\n placeholder={field.placeholder}\n isEditing={isEditing}\n typographyProps={typographyProps}\n />\n );\n })}\n </>\n );\n};\n","import React from 'react';\nimport { NsImage } from '@nuskin/foundation-ui-components';\nimport { PictureElement, SourceElement } from '../HeroBanner.styled';\nimport {\n ParsedMedia,\n getImageProps,\n isFullSize,\n FULL_SIZE_PERCENT,\n MOBILE_BREAKPOINT,\n DESKTOP_BREAKPOINT\n} from '../helpers';\nimport { IMAGE_LOADING_LAZY } from '../constants';\n\ninterface MediaProps {\n parsedMedia: ParsedMedia | null;\n mediaWidth: string | number;\n mediaHeight: string | number;\n mediaAttributes?: Record<string, unknown>;\n}\n\nexport const Media: React.FC<MediaProps> = ({\n parsedMedia,\n mediaWidth,\n mediaHeight,\n mediaAttributes = {}\n}) => {\n if (!parsedMedia) return null;\n\n const fullSize = isFullSize(mediaWidth, mediaHeight);\n const imageProps = getImageProps(fullSize, mediaWidth, mediaHeight);\n\n const renderImage = () => {\n const commonImageProps = {\n ...imageProps,\n loading: IMAGE_LOADING_LAZY,\n ...mediaAttributes\n };\n\n if (parsedMedia.isResponsive && parsedMedia.desktopUrl && parsedMedia.mobileUrl) {\n return (\n <PictureElement>\n <SourceElement media={MOBILE_BREAKPOINT} srcSet={parsedMedia.mobileUrl} />\n <SourceElement media={DESKTOP_BREAKPOINT} srcSet={parsedMedia.desktopUrl} />\n <NsImage src={parsedMedia.desktopUrl} alt={parsedMedia.alt} {...commonImageProps} />\n </PictureElement>\n );\n }\n\n return <NsImage src={parsedMedia.url ?? ''} alt={parsedMedia.alt ?? ''} {...commonImageProps} />;\n };\n\n const mediaContent = (() => {\n if (parsedMedia.type === 'image' || parsedMedia.type === 'gif') {\n return renderImage();\n }\n\n if (parsedMedia.type === 'video') {\n return (\n <video\n src={parsedMedia.url}\n autoPlay\n muted\n loop\n playsInline\n preload=\"auto\"\n width={fullSize ? FULL_SIZE_PERCENT : mediaWidth}\n height={fullSize ? FULL_SIZE_PERCENT : mediaHeight}\n style={{ objectFit: 'cover' }}\n {...mediaAttributes}\n />\n );\n }\n\n return null;\n })();\n\n if (!mediaContent) return null;\n\n return (\n <div className=\"media-layer\">\n {mediaContent}\n </div>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nimport { GradientDepth } from './helpers';\n\n// Container\n\nexport const Container = styled('section') <{ textColor?: string }>`\n width: 100%;\n position: relative;\n min-height: 450px;\n overflow: hidden;\n\n .media-layer {\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 .media-layer .media-fill {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .content {\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\n z-index: 3;\n word-break: break-word;\n pointer-events: auto;\n }\n\n .title {\n font-size: clamp(22px, 3.5vw, 48px);\n line-height: 1.05;\n margin-bottom: 8px;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .subtitle {\n margin-bottom: 8px;\n font-size: clamp(16px, 2.2vw, 24px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .brand-caption {\n margin-bottom: 8px;\n font-size: clamp(12px, 1.5vw, 16px);\n line-height: 1.2;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\n }\n\n .body {\n margin-bottom: 8px;\n font-size: clamp(14px, 1.6vw, 18px);\n line-height: 1.4;\n font-family: 'Lora', serif;\n color: ${({ textColor }) => textColor ?? 'inherit'};\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// Responsive picture \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// 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: clamp(16px, 4vw, 48px);\n pointer-events: none;\n justify-content: ${({ justifyContent }) => justifyContent ?? 'flex-start'};\n\n // Force center alignment on mobile\n @media (max-width: 768px) {\n justify-content: center;\n }\n`;\n\n// Content\n\nexport const Content = styled.div<{ textAlign?: string }>`\n max-width: min(520px, 90vw);\n max-height: min(350px, 65vh);\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 (max-width: 768px) {\n text-align: center;\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","import { extractBynderMedia } from '../utils/bynder-utils';\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 interface ParsedMedia {\n type: 'image' | 'gif' | 'video';\n url: string;\n alt: string;\n width?: number;\n height?: number;\n isResponsive?: boolean;\n desktopUrl?: string;\n mobileUrl?: string;\n}\n\ninterface MediaObject {\n type?: string;\n src?: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\nfunction isMediaObject(media: unknown): media is MediaObject {\n return typeof media === 'object' && media !== null && 'type' in media && 'src' in media;\n}\n\nexport function parseMedia(media: unknown): ParsedMedia | null {\n if (!media) return null;\n\n // Storybook / direct Media object\n if (isMediaObject(media)) {\n return {\n type: media.type as 'image' | 'gif' | 'video',\n url: media.src ?? '',\n alt: media.alt ?? '',\n width: media.width,\n height: media.height,\n isResponsive: false\n };\n }\n\n // Contentstack JSON string – use bynder-utils \n if (typeof media === 'string') {\n const extracted = extractBynderMedia(media);\n if (extracted) {\n return {\n type: extracted.type,\n url: extracted.url,\n alt: extracted.alt,\n isResponsive: extracted.isResponsive ?? false,\n desktopUrl: extracted.desktopUrl,\n mobileUrl: extracted.mobileUrl\n };\n }\n }\n\n return null;\n}\n\nexport function resolveContentAlignment(contentAlignment?: ContentAlignment): ContentAlignment {\n return contentAlignment ?? 'left';\n}\n\nexport function resolveGradientDepth(gradientDepth?: GradientDepth): GradientDepth {\n return gradientDepth ?? 'md';\n}\n\nexport function resolveTextColor(textColor?: string): TextColor {\n return (textColor === 'white' ? 'white' : 'black') as TextColor;\n}\n\nexport function resolveWidth(width?: string | number): string | undefined {\n if (!width) return undefined;\n const widthStr = String(width);\n return widthStr !== '' ? widthStr : undefined;\n}\n\nexport function resolveHeight(height?: string | number): string | undefined {\n if (!height) return undefined;\n const heightStr = String(height);\n return heightStr !== '' ? heightStr : undefined;\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\nexport function isFullSize(mediaWidth: string | number, mediaHeight: string | number): boolean {\n return String(mediaWidth) === FULL_SIZE_PERCENT && String(mediaHeight) === FULL_SIZE_PERCENT;\n}\n\nexport function getImageProps(\n isFullSize: boolean,\n mediaWidth: string | number,\n mediaHeight: string | number\n): { variant: 'fill'; className: 'media-fill' } | { style: { width: string; height: string } } {\n if (isFullSize) {\n return { variant: 'fill', className: 'media-fill' };\n }\n\n return {\n style: {\n width: String(mediaWidth),\n height: String(mediaHeight)\n }\n };\n}\n","import React from 'react';\nimport { Button } from '../button';\nimport { TypographyFields } from './components/TypographyFields';\nimport { Media } from './components/Media';\nimport { HeroBannerProps } from './types';\nimport { Container, GradientOverlay, Overlay, Content, getJustifyContent } from './HeroBanner.styled';\nimport {\n parseMedia,\n resolveContentAlignment,\n resolveGradientDepth,\n resolveTextColor,\n resolveWidth,\n resolveHeight,\n getGradientColor,\n getGradientDirection,\n FULL_SIZE_PERCENT\n} from './helpers';\nimport { ARIA_LABEL_HERO_BANNER } from './constants';\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 width,\n height,\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 const resolvedWidth = resolveWidth(width);\n const resolvedHeight = resolveHeight(height);\n\n const parsedMedia = parseMedia(media);\n\n const mediaWidth = resolvedWidth ?? FULL_SIZE_PERCENT;\n const mediaHeight = resolvedHeight ?? FULL_SIZE_PERCENT;\n const justifyContent = getJustifyContent(resolvedContentAlignment);\n const gradientColor = getGradientColor(resolvedTextColor);\n const gradientDirection = getGradientDirection(resolvedContentAlignment);\n const shouldRenderButton = button && (button.label?.title || isEditing);\n\n return (\n <Container\n className={className}\n textColor={resolvedTextColor}\n aria-label={ARIA_LABEL_HERO_BANNER}\n {...(parent$ ?? {})}\n >\n {parsedMedia && (\n <Media\n parsedMedia={parsedMedia}\n mediaWidth={mediaWidth}\n mediaHeight={mediaHeight}\n mediaAttributes={$?.media ?? {}}\n />\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 />\n\n {shouldRenderButton && (\n <Button\n {...button}\n alignment={resolvedContentAlignment ?? button?.alignment}\n parent$={$?.button}\n isEditing={isEditing}\n />\n )}\n </Content>\n </Overlay>\n </Container>\n );\n};\n\nexport default HeroBanner;\n","import { ReactElement, useMemo } from 'react';\nimport DOMPurify from 'dompurify';\nimport CsText from '../text/CsText';\nimport type { ComponentProps } from 'react';\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}\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 ],\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\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 = ({ text_editor, font_color, ...restProps }: 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 // Pass sanitized HTML to CsText component with all other props\n return <CsText {...restProps} text_editor={sanitizedHtml} font_color={fontColorBoolean} />;\n};\n\nexport default RichText;\n"]}
|