@nuskin/marketing-components 1.6.0 → 1.7.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.d.ts +1 -0
- 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/marketing-banner/CsMarketingBanner.d.ts +7 -0
- package/dist/marketing-banner/CsMarketingBanner.stories.d.ts +23 -0
- package/dist/marketing-banner/CsMarketingBanner.styled.d.ts +58 -0
- package/dist/marketing-banner/components/BannerCTA.d.ts +15 -0
- package/dist/marketing-banner/components/BannerMedia.d.ts +16 -0
- package/dist/marketing-banner/components/BannerText.d.ts +17 -0
- package/dist/marketing-banner/components/index.d.ts +3 -0
- package/dist/marketing-banner/constants.d.ts +22 -0
- package/dist/marketing-banner/hooks/index.d.ts +3 -0
- package/dist/marketing-banner/hooks/useCarousel.d.ts +14 -0
- package/dist/marketing-banner/hooks/useMediaLoader.d.ts +12 -0
- package/dist/marketing-banner/hooks/useReducedMotion.d.ts +5 -0
- package/dist/marketing-banner/index.d.ts +3 -0
- package/dist/marketing-banner/specs/CsMarketingBanner.spec.d.ts +5 -0
- package/dist/marketing-banner/specs/csTransform.spec.d.ts +5 -0
- package/dist/marketing-banner/specs/useCarousel.spec.d.ts +5 -0
- package/dist/marketing-banner/specs/useMediaLoader.spec.d.ts +5 -0
- package/dist/marketing-banner/specs/validation.spec.d.ts +5 -0
- package/dist/marketing-banner/types.d.ts +133 -0
- package/dist/marketing-banner/utils/csTransform.d.ts +13 -0
- package/dist/marketing-banner/utils/index.d.ts +2 -0
- package/dist/marketing-banner/utils/validation.d.ts +31 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function e(e,n,t){if(n in e){Object.defineProperty(e,n,{value:t,enumerable:true,configurable:true,writable:true})}else{e[n]=t}return e}function n(n){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};var i=Object.keys(r);if(typeof Object.getOwnPropertySymbols==="function"){i=i.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))}i.forEach(function(t){e(n,t,r[t])})}return n}function t(e,n){if(e==null)return{};var t=r(e,n);var i,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++){i=o[a];if(n.indexOf(i)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,i))continue;t[i]=e[i]}}return t}function r(e,n){if(e==null)return{};var t={};var r=Object.keys(e);var i,a;for(a=0;a<r.length;a++){i=r[a];if(n.indexOf(i)>=0)continue;t[i]=e[i]}return t}function i(e,n){if(!n){n=e.slice(0)}return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}function a(e){"@swc/helpers - typeof";return e&&typeof Symbol!=="undefined"&&e.constructor===Symbol?"symbol":typeof e}function o(){var e=i(["\n width: ",";\n background-color: ",";\n text-align: ",";\n 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"]);o=function n(){return e};return e}var l=Object.create;var d=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty;var f=function(e,n){for(var t in n)d(e,t,{get:n[t],enumerable:!0})},g=function(e,n,t,r){var i=true,o=false,l=undefined;if(n&&(typeof n==="undefined"?"undefined":a(n))=="object"||typeof n=="function")try{var v=function(){var i=g.value;!s.call(e,i)&&i!==t&&d(e,i,{get:function(){return n[i]},enumerable:!(r=c(n,i))||r.enumerable})};for(var f=u(n)[Symbol.iterator](),g;!(i=(g=f.next()).done);i=true)v()}catch(e){o=true;l=e}finally{try{if(!i&&f.return!=null){f.return()}}finally{if(o){throw l}}}return e};var p=function(e,n,t){return t=e!=null?l(v(e)):{},g(n||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)},m=function(e){return g(d({},"__esModule",{value:!0}),e)};var h={};f(h,{CsImage:function(){return et},CsSpacingDivider:function(){return eg},CsTextComponent:function(){return J}});module.exports=m(h);var b=require("react"),x=p(require("@emotion/styled"));var y=require("react");var k="{%language}",w="{%LANGUAGE}",j="{%region}",O="{%REGION}",P=function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return typeof e!="string"?"":(n.region&&(e=e.replace(j,n.region),e=e.replace(O,n.region.toUpperCase())),n.language&&(e=e.replace(k,n.language),e=e.replace(w,n.language.toUpperCase())),e)};var I=function(){if((typeof window==="undefined"?"undefined":a(window))>"u")return;var e,n;var t=new URLSearchParams(window.location.search),r=(e=t.get("region"))!==null&&e!==void 0?e:void 0,i=(n=t.get("language"))!==null&&n!==void 0?n:void 0;if(r||i)return{region:r,language:i}};var C=require("react"),M=require("@mui/material"),S=require("@nuskin/foundation-theme"),_=S.ColorUtils,q=_.getGenomeColor;var T=require("@mui/material"),W=require("@nuskin/foundation-theme"),G=require("react"),z=W.ColorUtils,A=z.getGenomeColor,B=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;var n=(0,T.useTheme)();return(0,G.useMemo)(function(){return A(n,"N10",e?"light":"dark")},[e,n])},L=B;var N=require("react/jsx-runtime"),E=function(){return(0,b.useMemo)(function(){return I()},[])},U=function(e,n){return!n||!e?e:P(e,n)},$=function(e,n){if((typeof window==="undefined"?"undefined":a(window))>"u"||!e||!n)return e;var t=new DOMParser().parseFromString(e,"text/html");return t.querySelectorAll("a").forEach(function(e){var t=e.getAttribute("href");t&&e.setAttribute("href",U(t,n))}),t.body.innerHTML},D=x.default.div(o(),function(e){var n=e.fullWidth;return n?"100%":"auto"},function(e){var n=e.bgColor;return n},function(e){var n=e.alignment;return n},function(e){var n=e.color;return n}),F=function(e){var n,t;var r;var i=(r=e===null||e===void 0?void 0:(t=e.brandColor)===null||t===void 0?void 0:(n=t.colorObj)===null||n===void 0?void 0:n.light)!==null&&r!==void 0?r:e===null||e===void 0?void 0:e.color;return typeof i=="string"&&i.trim()?i:null},R=function(e){try{var n,t,r;var i=(r=JSON.parse(e))===null||r===void 0?void 0:(t=r.brandColor)===null||t===void 0?void 0:(n=t.colorObj)===null||n===void 0?void 0:n.light;return typeof i=="string"&&i.trim()?i:null}catch(e){return null}},V=function(e){if(!e)return"transparent";var n;if((typeof e==="undefined"?"undefined":a(e))=="object")return(n=F(e))!==null&&n!==void 0?n:"transparent";if(typeof e=="string"){var t=e.trim();var r;return t?t.startsWith("{")?(r=R(t))!==null&&r!==void 0?r:"transparent":t:"transparent"}return"transparent"},H=function(e){var t=e.full_width,r=t===void 0?!1:t,i=e.container_background_color,a=e.alignment,o=a===void 0?"left":a,l=e.text_editor,d=e.font_color,c=d===void 0?!1:d,u=e.$;var v=L(c),s=E(),f=(0,b.useMemo)(function(){return V(i)},[i]),g=(0,b.useMemo)(function(){return $(l,s)},[l,s]);return l?(0,N.jsx)(D,{fullWidth:r,bgColor:f,alignment:o,color:v,children:(0,N.jsx)("div",n({dangerouslySetInnerHTML:{__html:g}},u===null||u===void 0?void 0:u.text_editor))}):null},J=H;var K=require("@nuskin/foundation-ui-components");var Q=require("@nuskin/foundation-theme"),X=(0,Q.styled)("div")(function(e){var n=e.image_alignment,t=n===void 0?"center":n,r=e.width,i=e.height;return{display:"flex",justifyContent:({left:"flex-start",right:"flex-end",center:"center"})[t],"& img":{maxWidth:"fit-content",objectFit:"contain",objectPosition:"center"}}});var Y=require("react/jsx-runtime"),Z="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>'),ee=["alt","className","fill","height","id","src","variant","width"],en=function(e){var r=e.image_alignment,i=r===void 0?"center":r,a=e.image,o=e.parent$,l=e.isEditing,d=e.$,c=t(e,["image_alignment","image","parent$","isEditing","$"]),u=null,v=null,s=null;try{var f;var g=typeof a=="string"?JSON.parse(a):a,p=g===null||g===void 0?void 0:(f=g.image)===null||f===void 0?void 0:f[0];(p===null||p===void 0?void 0:p.selected)||(p===null||p===void 0?void 0:p.files)?(u=p===null||p===void 0?void 0:p.selected,v=p===null||p===void 0?void 0:p.files):(g===null||g===void 0?void 0:g.url)&&(s=g)}catch(e){console.warn("[CsImage] Failed to parse image prop:",e)}var m=Z,h="Image not available",b="100%",x="100%";if(u||v){var y;var k=(y=u===null||u===void 0?void 0:u.imageType)!==null&&y!==void 0?y:"transformBaseUrl",w=v===null||v===void 0?void 0:v[k];var j,O,P;(w===null||w===void 0?void 0:w.url)&&(m=w.url,h=(j=u===null||u===void 0?void 0:u.altText)!==null&&j!==void 0?j:"Image",b=(O=u===null||u===void 0?void 0:u.width)!==null&&O!==void 0?O:"100%",x=(P=u===null||u===void 0?void 0:u.height)!==null&&P!==void 0?P:"100%")}else(s===null||s===void 0?void 0:s.url)&&(m=s.url,h=s.title||s.filename||"Image");var I={src:m,alt:h,width:b,height:x};ee.forEach(function(e){c[e]!==void 0&&(I[e]=c[e])});var C=(c===null||c===void 0?void 0:c.full_width)?"container !p-0":"";return(0,Y.jsx)(X,{image_alignment:i,width:I.width,height:I.height,className:C,children:(0,Y.jsx)(K.NsImage,n({},I,(d===null||d===void 0?void 0:d.image)||{}))})},et=en;var er=require("@nuskin/foundation-theme");var ei={thin:1,medium:2,thick:4},ea={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 eo=(0,er.styled)("div")(function(n){var t=n.paddingVertical,r=n.dividerAlign;var i={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}}[t];var a;return a={display:"flex",flexDirection:"column",alignItems:r==="center"?"center":r==="right"?"flex-end":"flex-start",paddingTop:"".concat(i.mobile,"px"),paddingBottom:"".concat(i.mobile,"px")},e(a,"@media ".concat(ea.tablet),{paddingTop:"".concat(i.tablet,"px"),paddingBottom:"".concat(i.tablet,"px")}),e(a,"@media ".concat(ea.desktop),{paddingTop:"".concat(i.desktop,"px"),paddingBottom:"".concat(i.desktop,"px")}),e(a,"@media ".concat(ea.ultra),{paddingTop:"".concat(i.ultra,"px"),paddingBottom:"".concat(i.ultra,"px")}),a}),el=(0,er.styled)("div")(function(e){var n=e.dividerStyle,t=e.dividerThicknessPx,r=e.dividerColor,i=e.dividerGradient,a=e.dividerWidthPercent;var o={width:"".concat(Math.max(0,Math.min(100,a)),"%")};if(i&&n!=="none"){if(o.height="".concat(t,"px"),o.backgroundImage=i,o.backgroundSize="100% 100%",n==="dashed"){var l=Math.max(12,t*4),d=Math.max(6,t*2);o.maskImage="repeating-linear-gradient(90deg, black 0px, black ".concat(l,"px, transparent ").concat(l,"px, transparent ").concat(l+d,"px)"),o.WebkitMaskImage="repeating-linear-gradient(90deg, black 0px, black ".concat(l,"px, transparent ").concat(l,"px, transparent ").concat(l+d,"px)")}else if(n==="dotted"){var c=Math.max(2,t),u=Math.max(8,c*3),v=c/2;o.maskImage="radial-gradient(circle ".concat(v,"px at 50% 50%, black 99%, transparent 100%)"),o.WebkitMaskImage="radial-gradient(circle ".concat(v,"px at 50% 50%, black 99%, transparent 100%)"),o.maskSize="".concat(u,"px ").concat(t,"px"),o.WebkitMaskSize="".concat(u,"px ").concat(t,"px"),o.maskRepeat="repeat-x",o.WebkitMaskRepeat="repeat-x",o.maskPosition="0 center",o.WebkitMaskPosition="0 center"}}else n==="none"?(o.height="".concat(t,"px"),o.backgroundImage=i):(o.borderBottomStyle=n,o.borderBottomWidth="".concat(t,"px"),o.borderBottomColor=r,o.height=0);return o});var ed=function(e){return e?/^#([A-Fa-f0-9]{6})$/.test(e):!1},ec=function(e){if(!e||!/^#([A-Fa-f0-9]{6})$/.test(e))return;var n=parseInt(e.slice(1,3),16),t=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return{r:n,g:t,b:r}},eu=function(e,n){if(!e||e==="none")return;var t;var r=(t=ec(n))!==null&&t!==void 0?t:{r:0,g:0,b:0};switch(e){case"brand_soft":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.3), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",0.8))");case"brand_bold":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.6), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",1.0))");case"neutral_fade":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.4), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",0.4))");default:return}};var ev=require("react/jsx-runtime"),es="#000000",ef=function(e){var n=e.paddingVertical,t=n===void 0?"small":n,r=e.dividerStyle,i=r===void 0?"solid":r,a=e.dividerThickness,o=a===void 0?"thin":a,l=e.dividerColor,d=e.dividerGradientPreset,c=d===void 0?"none":d,u=e.dividerWidthPercent,v=u===void 0?100:u,s=e.dividerAlign,f=s===void 0?"left":s,g=ei[o],p=ed(l)?l:es,m=eu(c,p);return(0,ev.jsx)(eo,{paddingVertical:t,dividerAlign:f,children:i!=="none"&&(0,ev.jsx)(el,{dividerStyle:i,dividerThicknessPx:g,dividerColor:p,dividerGradient:m,dividerWidthPercent:v!==null&&v!==void 0?v:100,"aria-hidden":"true"})})},eg=ef;//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";function n(n,e){if(e==null||e>n.length)e=n.length;for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}function e(n){if(Array.isArray(n))return n}function t(n,e,t){if(e in n){Object.defineProperty(n,e,{value:t,enumerable:true,configurable:true,writable:true})}else{n[e]=t}return n}function r(n,e){var t=n==null?null:typeof Symbol!=="undefined"&&n[Symbol.iterator]||n["@@iterator"];if(t==null)return;var r=[];var i=true;var a=false;var o,l;try{for(t=t.call(n);!(i=(o=t.next()).done);i=true){r.push(o.value);if(e&&r.length===e)break}}catch(n){a=true;l=n}finally{try{if(!i&&t["return"]!=null)t["return"]()}finally{if(a)throw l}}return r}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function a(n){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};var i=Object.keys(r);if(typeof Object.getOwnPropertySymbols==="function"){i=i.concat(Object.getOwnPropertySymbols(r).filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable}))}i.forEach(function(e){t(n,e,r[e])})}return n}function o(n,e){if(n==null)return{};var t=l(n,e);var r,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);for(i=0;i<a.length;i++){r=a[i];if(e.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(n,r))continue;t[r]=n[r]}}return t}function l(n,e){if(n==null)return{};var t={};var r=Object.keys(n);var i,a;for(a=0;a<r.length;a++){i=r[a];if(e.indexOf(i)>=0)continue;t[i]=n[i]}return t}function d(n,t){return e(n)||r(n,t)||f(n,t)||i()}function u(n,e){if(!e){e=n.slice(0)}return Object.freeze(Object.defineProperties(n,{raw:{value:Object.freeze(e)}}))}function c(n){"@swc/helpers - typeof";return n&&typeof Symbol!=="undefined"&&n.constructor===Symbol?"symbol":typeof n}function f(e,t){if(!e)return;if(typeof e==="string")return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor)r=e.constructor.name;if(r==="Map"||r==="Set")return Array.from(r);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return n(e,t)}function s(){var n=u(["\n width: ",";\n background-color: ",";\n text-align: ",";\n 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"]);s=function e(){return n};return n}function v(){var n=u(["\n text-align: ",";\n\n /* Mobile: Always center text */\n @media (max-width: 768px) {\n text-align: center;\n }\n"]);v=function e(){return n};return n}function p(){var n=u(["\n margin: 0 0 0.25rem 0;\n font-weight: 500;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ",";\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 14px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 14px;\n }\n @media (min-width: 1441px) {\n font-size: 16px;\n }\n"]);p=function e(){return n};return n}function m(){var n=u(["\n margin: 0 0 0.75rem 0;\n font-weight: 700;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n color: ",";\n font-size: 24px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 32px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 40px;\n }\n @media (min-width: 1441px) {\n font-size: 48px;\n }\n"]);m=function e(){return n};return n}function g(){var n=u(["\n margin: 0 0 0.5rem 0;\n font-weight: 600;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ",";\n font-size: 16px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 18px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 20px;\n }\n @media (min-width: 1441px) {\n font-size: 22px;\n }\n"]);g=function e(){return n};return n}function h(){var n=u(["\n margin: 0;\n line-height: 1.6;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ",";\n font-size: 14px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 16px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 18px;\n }\n @media (min-width: 1441px) {\n font-size: 20px;\n }\n"]);h=function e(){return n};return n}function x(){var n=u(["\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n"]);x=function e(){return n};return n}function b(){var n=u(["\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n"]);b=function e(){return n};return n}function w(){var n=u(["\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n"]);w=function e(){return n};return n}function y(){var n=u(["\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: #f0f0f0;\n color: #666;\n font-size: 14px;\n"]);y=function e(){return n};return n}function k(){var n=u(["\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: 16px 32px;\n text-decoration: none;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n font-size: 22px;\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease,\n transform 0.1s ease,\n text-decoration 0.2s ease;\n\n /* Variant-specific styling */\n ","\n\n &:active {\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ",";\n outline-offset: 4px;\n }\n\n /* Responsive sizing */\n @media (max-width: 768px) {\n padding: 12px 28px;\n font-size: 18px;\n }\n\n @media (min-width: 1441px) {\n padding: 18px 36px;\n font-size: 24px;\n }\n"]);k=function e(){return n};return n}function j(){var n=u(["\n position: relative;\n width: 100%;\n overflow: hidden;\n"]);j=function e(){return n};return n}function I(){var n=u(["\n position: relative;\n width: 100%;\n"]);I=function e(){return n};return n}function C(){var n=u(["\n display: flex;\n transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(-","%);\n"]);C=function e(){return n};return n}function O(){var n=u(["\n min-width: 100%;\n position: relative;\n"]);O=function e(){return n};return n}function S(){var n=u(["\n position: relative;\n min-height: ",";\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n @media (max-width: 768px) {\n min-height: ",";\n }\n"]);S=function e(){return n};return n}function M(){var n=u(["\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n"]);M=function e(){return n};return n}function T(){var n=u(["\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n justify-content: center;\n padding: 3rem;\n max-width: 600px;\n width: auto;\n\n /* Base positioning from props (applies to desktop/tablet) */\n ","\n\n /* Mobile: Override to always center content */\n @media (max-width: 768px) {\n padding: 2rem;\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n }\n"]);T=function e(){return n};return n}function A(){var n=u(["\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ","\n\n /* Mobile: Override to always use radial gradient */\n @media (max-width: 768px) {\n ","\n }\n"]);A=function e(){return n};return n}function z(){var n=u(["\n position: absolute;\n bottom: 2rem;\n left: 50%;\n transform: translateX(-50%);\n z-index: 3;\n display: flex;\n gap: 0.75rem;\n align-items: center;\n\n @media (max-width: 768px) {\n bottom: 1.5rem;\n }\n"]);z=function e(){return n};return n}function E(){var n=u(["\n width: 12px;\n height: 12px;\n border-radius: 50%;\n border: 2px solid rgba(255, 255, 255, 0.9);\n background-color: ",";\n cursor: pointer;\n padding: 0;\n transition: all 0.3s ease;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.9);\n transform: scale(1.15);\n }\n"]);E=function e(){return n};return n}var L=Object.create;var q=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var N=function(n,e){for(var t in e)q(n,t,{get:e[t],enumerable:!0})},R=function(n,e,t,r){var i=true,a=false,o=undefined;if(e&&(typeof e==="undefined"?"undefined":c(e))=="object"||typeof e=="function")try{var l=function(){var i=u.value;!D.call(n,i)&&i!==t&&q(n,i,{get:function(){return e[i]},enumerable:!(r=P(e,i))||r.enumerable})};for(var d=_(e)[Symbol.iterator](),u;!(i=(u=d.next()).done);i=true)l()}catch(n){a=true;o=n}finally{try{if(!i&&d.return!=null){d.return()}}finally{if(a){throw o}}}return n};var G=function(n,e,t){return t=n!=null?L(U(n)):{},R(e||!n||!n.__esModule?q(t,"default",{value:n,enumerable:!0}):t,n)},B=function(n){return R(q({},"__esModule",{value:!0}),n)};var F={};N(F,{CsImage:function(){return nM},CsMarketingBannerComponent:function(){return el},CsSpacingDivider:function(){return ek},CsTextComponent:function(){return nw},DEFAULT_BANNER_CONFIG:function(){return ed},DEFAULT_CAROUSEL_CONFIG:function(){return eu},DEFAULT_ROTATION_INTERVAL:function(){return ec},hasCTA:function(){return n5},hasMedia:function(){return n2},isCarouselMode:function(){return n1}});module.exports=B(F);var W=require("react"),H=G(require("@emotion/styled"));var $=require("react");var V="{%language}",Y="{%LANGUAGE}",K="{%region}",J="{%REGION}",X=function(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return typeof n!="string"?"":(e.region&&(n=n.replace(K,e.region),n=n.replace(J,e.region.toUpperCase())),e.language&&(n=n.replace(V,e.language),n=n.replace(Y,e.language.toUpperCase())),n)};var Q=function(){if((typeof window==="undefined"?"undefined":c(window))>"u")return;var n,e;var t=new URLSearchParams(window.location.search),r=(n=t.get("region"))!==null&&n!==void 0?n:void 0,i=(e=t.get("language"))!==null&&e!==void 0?e:void 0;if(r||i)return{region:r,language:i}};var Z=require("react"),nn=require("@mui/material"),ne=require("@nuskin/foundation-theme"),nt=ne.ColorUtils,nr=nt.getGenomeColor;var ni=require("@mui/material"),na=require("@nuskin/foundation-theme"),no=require("react"),nl=na.ColorUtils,nd=nl.getGenomeColor,nu=function(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;var e=(0,ni.useTheme)();return(0,no.useMemo)(function(){return nd(e,"N10",n?"light":"dark")},[n,e])},nc=nu;var nf=require("react/jsx-runtime"),ns=function(){return(0,W.useMemo)(function(){return Q()},[])},nv=function(n,e){return!e||!n?n:X(n,e)},np=function(n,e){if((typeof window==="undefined"?"undefined":c(window))>"u"||!n||!e)return n;var t=new DOMParser().parseFromString(n,"text/html");return t.querySelectorAll("a").forEach(function(n){var t=n.getAttribute("href");t&&n.setAttribute("href",nv(t,e))}),t.body.innerHTML},nm=H.default.div(s(),function(n){var e=n.fullWidth;return e?"100%":"auto"},function(n){var e=n.bgColor;return e},function(n){var e=n.alignment;return e},function(n){var e=n.color;return e}),ng=function(n){var e,t;var r;var i=(r=n===null||n===void 0?void 0:(t=n.brandColor)===null||t===void 0?void 0:(e=t.colorObj)===null||e===void 0?void 0:e.light)!==null&&r!==void 0?r:n===null||n===void 0?void 0:n.color;return typeof i=="string"&&i.trim()?i:null},nh=function(n){try{var e,t,r;var i=(r=JSON.parse(n))===null||r===void 0?void 0:(t=r.brandColor)===null||t===void 0?void 0:(e=t.colorObj)===null||e===void 0?void 0:e.light;return typeof i=="string"&&i.trim()?i:null}catch(n){return null}},nx=function(n){if(!n)return"transparent";var e;if((typeof n==="undefined"?"undefined":c(n))=="object")return(e=ng(n))!==null&&e!==void 0?e:"transparent";if(typeof n=="string"){var t=n.trim();var r;return t?t.startsWith("{")?(r=nh(t))!==null&&r!==void 0?r:"transparent":t:"transparent"}return"transparent"},nb=function(n){var e=n.full_width,t=e===void 0?!1:e,r=n.container_background_color,i=n.alignment,o=i===void 0?"left":i,l=n.text_editor,d=n.font_color,u=d===void 0?!1:d,c=n.$;var f=nc(u),s=ns(),v=(0,W.useMemo)(function(){return nx(r)},[r]),p=(0,W.useMemo)(function(){return np(l,s)},[l,s]);return l?(0,nf.jsx)(nm,{fullWidth:t,bgColor:v,alignment:o,color:f,children:(0,nf.jsx)("div",a({dangerouslySetInnerHTML:{__html:p}},c===null||c===void 0?void 0:c.text_editor))}):null},nw=nb;var ny=require("@nuskin/foundation-ui-components");var nk=require("@nuskin/foundation-theme"),nj=(0,nk.styled)("div")(function(n){var e=n.image_alignment,t=e===void 0?"center":e,r=n.width,i=n.height;return{display:"flex",justifyContent:({left:"flex-start",right:"flex-end",center:"center"})[t],"& img":{maxWidth:"fit-content",objectFit:"contain",objectPosition:"center"}}});var nI=require("react/jsx-runtime"),nC="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>'),nO=["alt","className","fill","height","id","src","variant","width"],nS=function(n){var e=n.image_alignment,t=e===void 0?"center":e,r=n.image,i=n.parent$,l=n.isEditing,d=n.$,u=o(n,["image_alignment","image","parent$","isEditing","$"]),c=null,f=null,s=null;try{var v;var p=typeof r=="string"?JSON.parse(r):r,m=p===null||p===void 0?void 0:(v=p.image)===null||v===void 0?void 0:v[0];(m===null||m===void 0?void 0:m.selected)||(m===null||m===void 0?void 0:m.files)?(c=m===null||m===void 0?void 0:m.selected,f=m===null||m===void 0?void 0:m.files):(p===null||p===void 0?void 0:p.url)&&(s=p)}catch(n){console.warn("[CsImage] Failed to parse image prop:",n)}var g=nC,h="Image not available",x="100%",b="100%";if(c||f){var w;var y=(w=c===null||c===void 0?void 0:c.imageType)!==null&&w!==void 0?w:"transformBaseUrl",k=f===null||f===void 0?void 0:f[y];var j,I,C;(k===null||k===void 0?void 0:k.url)&&(g=k.url,h=(j=c===null||c===void 0?void 0:c.altText)!==null&&j!==void 0?j:"Image",x=(I=c===null||c===void 0?void 0:c.width)!==null&&I!==void 0?I:"100%",b=(C=c===null||c===void 0?void 0:c.height)!==null&&C!==void 0?C:"100%")}else(s===null||s===void 0?void 0:s.url)&&(g=s.url,h=s.title||s.filename||"Image");var O={src:g,alt:h,width:x,height:b};nO.forEach(function(n){u[n]!==void 0&&(O[n]=u[n])});var S=(u===null||u===void 0?void 0:u.full_width)?"container !p-0":"";return(0,nI.jsx)(nj,{image_alignment:t,width:O.width,height:O.height,className:S,children:(0,nI.jsx)(ny.NsImage,a({},O,(d===null||d===void 0?void 0:d.image)||{}))})},nM=nS;var nT=G(require("@emotion/styled")),nA=require("react/jsx-runtime"),nz=nT.default.div(v(),function(n){var e=n.textAlignment;return e}),nE=nT.default.p(p(),function(n){var e=n.fontColor;return e}),nL=nT.default.h2(m(),function(n){var e=n.fontColor;return e}),nq=nT.default.h3(g(),function(n){var e=n.fontColor;return e}),nP=nT.default.p(h(),function(n){var e=n.fontColor;return e});function n_(n){var e=n.headerText,t=n.title,r=n.subtitle,i=n.bodyText,a=n.textColor,o=a===void 0?"#ffffff":a,l=n.textAlignment,d=l===void 0?"left":l,u=n.testId;return!e&&!t&&!r&&!i?null:(0,nA.jsxs)(nz,{textAlignment:d,"data-testid":u,children:[e&&(0,nA.jsx)(nE,{fontColor:o,children:e}),t&&(0,nA.jsx)(nL,{fontColor:o,children:t}),r&&(0,nA.jsx)(nq,{fontColor:o,children:r}),i&&(0,nA.jsx)(nP,{fontColor:o,children:i})]})}var nU=G(require("react")),nD=G(require("@emotion/styled"));var nN=require("react");function nR(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};var e=n.enabled,t=e===void 0?!0:e,r=n.threshold,i=r===void 0?.1:r,a=n.rootMargin,o=a===void 0?"50px":a,l=(0,nN.useRef)(null),u=d((0,nN.useState)(!t||(typeof window==="undefined"?"undefined":c(window))>"u"||!("IntersectionObserver"in window)),2),f=u[0],s=u[1],v=d((0,nN.useState)(!1),2),p=v[0],m=v[1];return(0,nN.useEffect)(function(){if((typeof window==="undefined"?"undefined":c(window))>"u"||!("IntersectionObserver"in window)){s(!0);return}if(!t||f)return;var n=l.current;if(!n)return;var e=new IntersectionObserver(function(n){n.forEach(function(n){n.isIntersecting&&(s(!0),e.disconnect())})},{threshold:i,rootMargin:o});return e.observe(n),function(){e.disconnect()}},[t,f,i,o]),{ref:l,shouldLoad:f,hasError:p,handleError:function(){m(!0)}}}var nG=require("react/jsx-runtime"),nB=nD.default.div(x()),nF=nD.default.img(b()),nW=nD.default.video(w()),nH=nD.default.div(y());function n$(n){var e=n.mediaUrl,t=n.fallbackMediaUrl,r=n.mediaType,i=r===void 0?"image":r,a=n.mediaAlt,o=a===void 0?"":a,l=n.onError,u=n.testId;var c=nR({enabled:!0}),f=c.ref,s=c.shouldLoad,v=c.hasError,p=c.handleError,m=d(nU.default.useState(e),2),g=m[0],h=m[1],x=function(){t&&g!==t?h(t):p(),l===null||l===void 0?void 0:l()};return(0,nG.jsx)(nB,{ref:f,"data-testid":u,children:v&&!t?(0,nG.jsx)(nH,{children:"Media unavailable"}):s?i==="video"?(0,nG.jsx)(nW,{src:g,onError:x,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,"data-testid":"".concat(u,"-video"),children:"Your browser does not support the video tag."}):(0,nG.jsx)(nF,{src:g,alt:o,onError:x,loading:"lazy","data-testid":"".concat(u,"-image")}):null})}var nV=G(require("@emotion/styled")),nY=require("react/jsx-runtime"),nK=nV.default.a(k(),function(n){var e=n.variant;return e==="dark"?"\n background-color: #888888;\n color: #ffffff;\n border: 1px solid #888888;\n\n &:hover {\n background-color: #888888;\n color: #ffffff;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n ":"\n background-color: transparent;\n color: #1a1a1a;\n border: 1px solid #888888;\n\n &:hover {\n background-color: transparent;\n color: #1a1a1a;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n "},function(n){var e=n.variant;return e==="dark"?"#ffffff":"#888888"});function nJ(n){var e=n.ctaLabel,t=n.ctaDestination,r=n.variant,i=r===void 0?"dark":r,a=n.onClick,o=n.testId;return(0,nY.jsx)(nK,{href:t,variant:i,onClick:a,"data-testid":o,"aria-label":e,children:e})}var nX=require("react");var nQ=require("react");function nZ(){var n=d((0,nQ.useState)(!1),2),e=n[0],t=n[1];return(0,nQ.useEffect)(function(){if((typeof window==="undefined"?"undefined":c(window))>"u"||!window.matchMedia)return;var n=window.matchMedia("(prefers-reduced-motion: reduce)");t(n.matches);var e=function(n){t(n.matches)};return n.addEventListener("change",e),function(){return n.removeEventListener("change",e)}},[]),e}function n0(n){var e=n.totalSlides,t=n.autoRotate,r=t===void 0?!1:t,i=n.rotationInterval,a=i===void 0?5e3:i,o=n.pauseOnHover,l=o===void 0?!0:o,u=n.initialIndex,c=u===void 0?0:u,f=d((0,nX.useState)(c),2),s=f[0],v=f[1],p=d((0,nX.useState)(!1),2),m=p[0],g=p[1],h=nZ(),x=(0,nX.useCallback)(function(){v(function(n){return(n+1)%e})},[e]),b=(0,nX.useCallback)(function(){v(function(n){return(n-1+e)%e})},[e]),w=(0,nX.useCallback)(function(n){n>=0&&n<e&&v(n)},[e]),y=(0,nX.useCallback)(function(){g(!0)},[]),k=(0,nX.useCallback)(function(){g(!1)},[]),j=(0,nX.useCallback)(function(n){switch(n.key){case"ArrowLeft":n.preventDefault(),b();break;case"ArrowRight":n.preventDefault(),x();break;case"Home":n.preventDefault(),w(0);break;case"End":n.preventDefault(),w(e-1);break}},[x,b,w,e]);return(0,nX.useEffect)(function(){if(!r||m||h)return;var n=setInterval(x,a);return function(){return clearInterval(n)}},[r,m,h,a,x]),{currentIndex:s,isPaused:m,totalSlides:e,goToNext:x,goToPrevious:b,goToSlide:w,pause:y,resume:k,handleKeyDown:j}}function n1(n){return Array.isArray(n.banners)&&n.banners.length>1}function n2(n){return!!n.mediaUrl}function n5(n){return!!(n.ctaLabel&&n.ctaDestination)}var n8=G(require("@emotion/styled")),n4=n8.default.div(j()),n6=n8.default.div(I()),n3=n8.default.div(C(),function(n){var e=n.currentIndex;return e*100}),n9=n8.default.div(O()),n7=n8.default.div(S(),function(n){var e=n.hasMedia;return e?"600px":"auto"},function(n){var e=n.hasMedia;return e?"400px":"auto"}),en=n8.default.div(M()),ee=n8.default.div(T(),function(n){var e=n.position,t=e===void 0?"left":e;return t==="center"?"\n margin: 0 auto;\n align-items: center;\n text-align: center;\n ":t==="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 "}),et=n8.default.div(A(),function(n){var e=n.direction,t=n.depth,r=n.color;var i={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},a=i[t],o=a.start,l=a.end,d=r==="black"?"0, 0, 0":"255, 255, 255";return e==="leftToRight"?"background: linear-gradient(to right, rgba(".concat(d,", ").concat(o,"), rgba(").concat(d,", ").concat(l,"));"):e==="rightToLeft"?"background: linear-gradient(to left, rgba(".concat(d,", ").concat(o,"), rgba(").concat(d,", ").concat(l,"));"):e==="radial"?"background: radial-gradient(circle, rgba(".concat(d,", ").concat(o,"), rgba(").concat(d,", ").concat(l,"));"):""},function(n){var e=n.depth,t=n.color;var r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},i=r[e],a=i.start,o=i.end,l=t==="black"?"0, 0, 0":"255, 255, 255";return"background: radial-gradient(circle, rgba(".concat(l,", ").concat(a,"), rgba(").concat(l,", ").concat(o,"));")}),er=n8.default.div(z()),ei=n8.default.button(E(),function(n){var e=n.active;return e?"rgba(255, 255, 255, 0.9)":"transparent"});var ea=require("react/jsx-runtime"),eo=function(n,e,t){var r,i,a,o;var l=n2(n),d=n5(n),u=(i=(r=n.testId)!==null&&r!==void 0?r:t)!==null&&i!==void 0?i:"banner",c={white:"#ffffff",dark:"#1a1a1a"}[(a=n.textColor)!==null&&a!==void 0?a:"white"],f=n.showGradient===!0,s=(o=n.position)!==null&&o!==void 0?o:"left",v=n.textColor==="dark"?"white":"black",p;s==="left"?p="leftToRight":s==="right"?p="rightToLeft":p="radial";var m;var g,h;return s==="center"?m="center":s==="right"?m="right":m="left",(0,ea.jsx)(n9,{children:(0,ea.jsxs)(n7,{hasMedia:l,children:[l&&n.mediaUrl&&(0,ea.jsx)(en,{children:(0,ea.jsx)(n$,{mediaUrl:n.mediaUrl,fallbackMediaUrl:n.fallbackMediaUrl,mediaType:n.mediaType,mediaAlt:n.mediaAlt,testId:"".concat(u,"-").concat(e,"-media")})}),f&&(0,ea.jsx)(et,{direction:p,depth:(g=n.gradientDepth)!==null&&g!==void 0?g:"md",color:v}),(0,ea.jsxs)(ee,{position:s,children:[(0,ea.jsx)(n_,{headerText:n.headerText,title:n.title,subtitle:n.subtitle,bodyText:n.bodyText,textColor:c,textAlignment:m,testId:"".concat(u,"-").concat(e,"-text")}),d&&n.ctaLabel&&n.ctaDestination&&(0,ea.jsx)(nJ,{ctaLabel:n.ctaLabel,ctaDestination:n.ctaDestination,variant:(h=n.ctaVariant)!==null&&h!==void 0?h:"dark",testId:"".concat(u,"-").concat(e,"-cta")})]})]})},"".concat(u,"-").concat(e))};function el(n){var e=n.banners,t=n.rotationInterval,r=n.testId,i=n1(n),a=n0({totalSlides:e.length,autoRotate:i,rotationInterval:t!==null&&t!==void 0?t:5e3,pauseOnHover:!0,initialIndex:0});return(0,ea.jsxs)(n4,{"data-testid":r!==null&&r!==void 0?r:"cs-marketing-banner",onKeyDown:i?a.handleKeyDown:void 0,onMouseEnter:i?a.pause:void 0,onMouseLeave:i?a.resume:void 0,children:[(0,ea.jsx)(n6,{children:(0,ea.jsx)(n3,{currentIndex:a.currentIndex,totalSlides:e.length,children:e.map(function(n,e){return eo(n,e,r)})})}),i&&(0,ea.jsx)(er,{children:e.map(function(n,e){var t;return(0,ea.jsx)(ei,{active:e===a.currentIndex,onClick:function(){return a.goToSlide(e)},"aria-label":"Go to slide ".concat(e+1)},"".concat(r!==null&&r!==void 0?r:"banner","-indicator-").concat(e,"-").concat((t=n.title)!==null&&t!==void 0?t:""))})})]})}var ed={position:"left",textColor:"white",showGradient:!1,gradientDepth:"md",mediaType:"image",ctaVariant:"dark"},eu={rotationInterval:5e3},ec=5e3;var ef=require("@nuskin/foundation-theme");var es={thin:1,medium:2,thick:4},ev={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 ep=(0,ef.styled)("div")(function(n){var e=n.paddingVertical,r=n.dividerAlign;var i={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];var a;return a={display:"flex",flexDirection:"column",alignItems:r==="center"?"center":r==="right"?"flex-end":"flex-start",paddingTop:"".concat(i.mobile,"px"),paddingBottom:"".concat(i.mobile,"px")},t(a,"@media ".concat(ev.tablet),{paddingTop:"".concat(i.tablet,"px"),paddingBottom:"".concat(i.tablet,"px")}),t(a,"@media ".concat(ev.desktop),{paddingTop:"".concat(i.desktop,"px"),paddingBottom:"".concat(i.desktop,"px")}),t(a,"@media ".concat(ev.ultra),{paddingTop:"".concat(i.ultra,"px"),paddingBottom:"".concat(i.ultra,"px")}),a}),em=(0,ef.styled)("div")(function(n){var e=n.dividerStyle,t=n.dividerThicknessPx,r=n.dividerColor,i=n.dividerGradient,a=n.dividerWidthPercent;var o={width:"".concat(Math.max(0,Math.min(100,a)),"%")};if(i&&e!=="none"){if(o.height="".concat(t,"px"),o.backgroundImage=i,o.backgroundSize="100% 100%",e==="dashed"){var l=Math.max(12,t*4),d=Math.max(6,t*2);o.maskImage="repeating-linear-gradient(90deg, black 0px, black ".concat(l,"px, transparent ").concat(l,"px, transparent ").concat(l+d,"px)"),o.WebkitMaskImage="repeating-linear-gradient(90deg, black 0px, black ".concat(l,"px, transparent ").concat(l,"px, transparent ").concat(l+d,"px)")}else if(e==="dotted"){var u=Math.max(2,t),c=Math.max(8,u*3),f=u/2;o.maskImage="radial-gradient(circle ".concat(f,"px at 50% 50%, black 99%, transparent 100%)"),o.WebkitMaskImage="radial-gradient(circle ".concat(f,"px at 50% 50%, black 99%, transparent 100%)"),o.maskSize="".concat(c,"px ").concat(t,"px"),o.WebkitMaskSize="".concat(c,"px ").concat(t,"px"),o.maskRepeat="repeat-x",o.WebkitMaskRepeat="repeat-x",o.maskPosition="0 center",o.WebkitMaskPosition="0 center"}}else e==="none"?(o.height="".concat(t,"px"),o.backgroundImage=i):(o.borderBottomStyle=e,o.borderBottomWidth="".concat(t,"px"),o.borderBottomColor=r,o.height=0);return o});var eg=function(n){return n?/^#([A-Fa-f0-9]{6})$/.test(n):!1},eh=function(n){if(!n||!/^#([A-Fa-f0-9]{6})$/.test(n))return;var e=parseInt(n.slice(1,3),16),t=parseInt(n.slice(3,5),16),r=parseInt(n.slice(5,7),16);return{r:e,g:t,b:r}},ex=function(n,e){if(!n||n==="none")return;var t;var r=(t=eh(e))!==null&&t!==void 0?t:{r:0,g:0,b:0};switch(n){case"brand_soft":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.3), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",0.8))");case"brand_bold":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.6), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",1.0))");case"neutral_fade":return"linear-gradient(90deg, rgba(".concat(r.r,",").concat(r.g,",").concat(r.b,",0.4), rgba(").concat(r.r,",").concat(r.g,",").concat(r.b,",0.4))");default:return}};var eb=require("react/jsx-runtime"),ew="#000000",ey=function(n){var e=n.paddingVertical,t=e===void 0?"small":e,r=n.dividerStyle,i=r===void 0?"solid":r,a=n.dividerThickness,o=a===void 0?"thin":a,l=n.dividerColor,d=n.dividerGradientPreset,u=d===void 0?"none":d,c=n.dividerWidthPercent,f=c===void 0?100:c,s=n.dividerAlign,v=s===void 0?"left":s,p=es[o],m=eg(l)?l:ew,g=ex(u,m);return(0,eb.jsx)(ep,{paddingVertical:t,dividerAlign:v,children:i!=="none"&&(0,eb.jsx)(em,{dividerStyle:i,dividerThicknessPx:p,dividerColor:m,dividerGradient:g,dividerWidthPercent:f!==null&&f!==void 0?f:100,"aria-hidden":"true"})})},ek=ey;//# sourceMappingURL=index.js.map
|
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/spacing-divider/CsSpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/CsSpacingDivider.tsx"],"names":["O","Object","create","u","defineProperty","j","getOwnPropertyDescriptor","K","getOwnPropertyNames","J","getPrototypeOf","V","prototype","hasOwnProperty","X","e","t","r","get","enumerable","w","o","s","call","Y","__esModule","value","Z","index_exports","__export","CsImage","CsImage_default","CsSpacingDivider","CsSpacingDivider_default","CsTextComponent","CsText_default","module","exports","__toCommonJS","import_react","require","import_styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","getRegionAndLanguageFromLocation","window","params","URLSearchParams","location","search","import_material","import_foundation_theme","L","ColorUtils","getGenomeColor","A","useToggleFontColor","toggleValue","theme","P","useTheme","M","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","f","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","T","styled","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","resolveBackgroundColor","trimmed","startsWith","CsText","full_width","container_background_color","text_editor","font_color","$","fontColor","regionLang","backgroundColor","updatedHtml","k","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","D","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","S","className","N","NsImage","THICKNESS_PX","thin","medium","thick","BREAKPOINTS","mobile","tablet","desktop","ultra","StyledSpacingContainer","paddingVertical","dividerAlign","v","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","R"],"mappings":"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","sourcesContent":["\"use strict\";var O=Object.create;var u=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var X=(e,t)=>{for(var r in t)u(e,r,{get:t[r],enumerable:!0})},w=(e,t,r,o)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let s of K(t))!V.call(e,s)&&s!==r&&u(e,s,{get:()=>t[s],enumerable:!(o=j(t,s))||o.enumerable});return e};var Y=(e,t,r)=>(r=e!=null?O(J(e)):{},w(t||!e||!e.__esModule?u(r,\"default\",{value:e,enumerable:!0}):r,e)),Z=e=>w(u({},\"__esModule\",{value:!0}),e);var Se={};X(Se,{CsImage:()=>F,CsSpacingDivider:()=>z,CsTextComponent:()=>_});module.exports=Z(Se);var f=require(\"react\"),T=Y(require(\"@emotion/styled\"));var ne=require(\"react\");var q=\"{%language}\",ee=\"{%LANGUAGE}\",te=\"{%region}\",re=\"{%REGION}\",b=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(te,t.region),e=e.replace(re,t.region.toUpperCase())),t.language&&(e=e.replace(q,t.language),e=e.replace(ee,t.language.toUpperCase())),e);var y=()=>{if(typeof window>\"u\")return;let e=new URLSearchParams(window.location.search),t=e.get(\"region\")??void 0,r=e.get(\"language\")??void 0;if(t||r)return{region:t,language:r}};var oe=require(\"react\"),ie=require(\"@mui/material\"),L=require(\"@nuskin/foundation-theme\"),{getGenomeColor:Le}=L.ColorUtils;var P=require(\"@mui/material\"),A=require(\"@nuskin/foundation-theme\"),M=require(\"react\"),{getGenomeColor:ae}=A.ColorUtils,se=(e=!1)=>{let t=(0,P.useTheme)();return(0,M.useMemo)(()=>ae(t,\"N10\",e?\"light\":\"dark\"),[e,t])},C=se;var k=require(\"react/jsx-runtime\"),ge=()=>(0,f.useMemo)(()=>y(),[]),le=(e,t)=>!t||!e?e:b(e,t),de=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let o=new DOMParser().parseFromString(e,\"text/html\");return o.querySelectorAll(\"a\").forEach(s=>{let n=s.getAttribute(\"href\");n&&s.setAttribute(\"href\",le(n,t))}),o.body.innerHTML},pe=T.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`,ce=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},me=e=>{try{let r=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof r==\"string\"&&r.trim()?r:null}catch{return null}},ue=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return ce(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?me(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},fe=({full_width:e=!1,container_background_color:t,alignment:r=\"left\",text_editor:o,font_color:s=!1,$:n})=>{let i=C(s),a=ge(),l=(0,f.useMemo)(()=>ue(t),[t]),d=(0,f.useMemo)(()=>de(o,a),[o,a]);return o?(0,k.jsx)(pe,{fullWidth:e,bgColor:l,alignment:r,color:i,children:(0,k.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:d},...n?.text_editor})}):null},_=fe;var N=require(\"@nuskin/foundation-ui-components\");var D=require(\"@nuskin/foundation-theme\"),E=(0,D.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 S=require(\"react/jsx-runtime\"),he=\"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>`),xe=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],be=e=>{let{image_alignment:t=\"center\",image:r,parent$:o,isEditing:s,$:n,...i}=e,a=null,l=null,d=null;try{let g=typeof r==\"string\"?JSON.parse(r):r,p=g?.image?.[0];p?.selected||p?.files?(a=p?.selected,l=p?.files):g?.url&&(d=g)}catch(g){console.warn(\"[CsImage] Failed to parse image prop:\",g)}let c=he,x=\"Image not available\",v=\"100%\",I=\"100%\";if(a||l){let g=a?.imageType??\"transformBaseUrl\",p=l?.[g];p?.url&&(c=p.url,x=a?.altText??\"Image\",v=a?.width??\"100%\",I=a?.height??\"100%\")}else d?.url&&(c=d.url,x=d.title||d.filename||\"Image\");let m={src:c,alt:x,width:v,height:I};xe.forEach(g=>{i[g]!==void 0&&(m[g]=i[g])});let H=i?.full_width?\"container !p-0\":\"\";return(0,S.jsx)(E,{image_alignment:t,width:m.width,height:m.height,className:H,children:(0,S.jsx)(N.NsImage,{...m,...n?.image||{}})})},F=be;var $=require(\"@nuskin/foundation-theme\");var W={thin:1,medium:2,thick:4},h={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 B=(0,$.styled)(\"div\")(({paddingVertical:e,dividerAlign:t})=>{let o={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:`${o.mobile}px`,paddingBottom:`${o.mobile}px`,[`@media ${h.tablet}`]:{paddingTop:`${o.tablet}px`,paddingBottom:`${o.tablet}px`},[`@media ${h.desktop}`]:{paddingTop:`${o.desktop}px`,paddingBottom:`${o.desktop}px`},[`@media ${h.ultra}`]:{paddingTop:`${o.ultra}px`,paddingBottom:`${o.ultra}px`}}}),G=(0,$.styled)(\"div\")(({dividerStyle:e,dividerThicknessPx:t,dividerColor:r,dividerGradient:o,dividerWidthPercent:s})=>{let n={width:`${Math.max(0,Math.min(100,s))}%`};if(o&&e!==\"none\"){if(n.height=`${t}px`,n.backgroundImage=o,n.backgroundSize=\"100% 100%\",e===\"dashed\"){let i=Math.max(12,t*4),a=Math.max(6,t*2);n.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${i}px, transparent ${i}px, transparent ${i+a}px)`,n.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${i}px, transparent ${i}px, transparent ${i+a}px)`}else if(e===\"dotted\"){let i=Math.max(2,t),a=Math.max(8,i*3),l=i/2;n.maskImage=`radial-gradient(circle ${l}px at 50% 50%, black 99%, transparent 100%)`,n.WebkitMaskImage=`radial-gradient(circle ${l}px at 50% 50%, black 99%, transparent 100%)`,n.maskSize=`${a}px ${t}px`,n.WebkitMaskSize=`${a}px ${t}px`,n.maskRepeat=\"repeat-x\",n.WebkitMaskRepeat=\"repeat-x\",n.maskPosition=\"0 center\",n.WebkitMaskPosition=\"0 center\"}}else e===\"none\"?(n.height=`${t}px`,n.backgroundImage=o):(n.borderBottomStyle=e,n.borderBottomWidth=`${t}px`,n.borderBottomColor=r,n.height=0);return n});var U=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,ye=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),o=parseInt(e.slice(5,7),16);return{r:t,g:r,b:o}},Q=(e,t)=>{if(!e||e===\"none\")return;let r=ye(t)??{r:0,g:0,b:0};switch(e){case\"brand_soft\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.3), rgba(${r.r},${r.g},${r.b},0.8))`;case\"brand_bold\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.6), rgba(${r.r},${r.g},${r.b},1.0))`;case\"neutral_fade\":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 R=require(\"react/jsx-runtime\"),Ce=\"#000000\",ke=e=>{let{paddingVertical:t=\"small\",dividerStyle:r=\"solid\",dividerThickness:o=\"thin\",dividerColor:s,dividerGradientPreset:n=\"none\",dividerWidthPercent:i=100,dividerAlign:a=\"left\"}=e,l=W[o],d=U(s)?s:Ce,c=Q(n,d);return(0,R.jsx)(B,{paddingVertical:t,dividerAlign:a,children:r!==\"none\"&&(0,R.jsx)(G,{dividerStyle:r,dividerThicknessPx:l,dividerColor:d,dividerGradient:c,dividerWidthPercent:i??100,\"aria-hidden\":\"true\"})})},z=ke;\n","export * from './text';\nexport * from './image';\nexport * from './spacing-divider';\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 */\nexport const getRegionAndLanguageFromLocation = (): RegionLanguageQuery | undefined => {\n if (typeof window === 'undefined') return undefined;\n\n const params = new URLSearchParams(window.location.search);\n\n const region = params.get('region') ?? undefined;\n const language = params.get('language') ?? undefined;\n\n if (region || language) {\n return { region, language };\n }\n\n return undefined;\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","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 CsSpacingDividerProps {\n paddingVertical?: PaddingScale;\n dividerStyle?: DividerStyle;\n dividerThickness?: DividerThickness;\n dividerColor?: string;\n dividerGradientPreset?: 'none' | 'brand_soft' | 'brand_bold' | 'neutral_fade';\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' | 'brand_soft' | 'brand_bold' | 'neutral_fade',\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 'brand_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 'brand_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 'neutral_fade':\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 {\n StyledSpacingContainer,\n StyledDividerLine\n} from './CsSpacingDivider.styled';\nimport type { CsSpacingDividerProps } from './types';\nimport { THICKNESS_PX } from './types';\nimport { isValidHex, gradientPresetCss } from './utils/utils';\n\nconst DEFAULT_HEX = '#000000';\n\nconst CsSpacingDivider = (props: CsSpacingDividerProps): 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\n paddingVertical={paddingVertical}\n dividerAlign={dividerAlign}\n >\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 CsSpacingDivider;\n\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/components/BannerText.tsx","../src/marketing-banner/components/BannerMedia.tsx","../src/marketing-banner/hooks/useMediaLoader.ts","../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/CsMarketingBanner.styled.tsx","../src/marketing-banner/CsMarketingBanner.tsx","../src/marketing-banner/constants.ts","../src/spacing-divider/CsSpacingDivider.styled.tsx","../src/spacing-divider/types.ts","../src/spacing-divider/utils/utils.ts","../src/spacing-divider/CsSpacingDivider.tsx"],"names":["Te","Object","create","$","defineProperty","Me","getOwnPropertyDescriptor","$e","getOwnPropertyNames","Re","getPrototypeOf","Ie","prototype","hasOwnProperty","Se","e","t","r","get","enumerable","j","o","i","call","w","__esModule","value","Le","index_exports","__export","CsImage","CsImage_default","CsMarketingBannerComponent","CsSpacingDivider","CsSpacingDivider_default","CsTextComponent","CsText_default","DEFAULT_BANNER_CONFIG","DEFAULT_CAROUSEL_CONFIG","DEFAULT_ROTATION_INTERVAL","hasCTA","hasMedia","isCarouselMode","module","exports","__toCommonJS","import_react","require","import_styled","languageReplaceExpression","languageReplaceExpressionUppercase","regionReplaceExpression","regionReplaceExpressionUppercase","replaceRegionAndLanguage","text","replacer","region","replace","toUpperCase","language","getRegionAndLanguageFromLocation","window","params","URLSearchParams","location","search","import_material","import_foundation_theme","X","ColorUtils","getGenomeColor","J","useToggleFontColor","toggleValue","theme","Y","useTheme","Z","useMemo","useToggleFontColor_default","import_jsx_runtime","useRegionLanguage","R","rewriteUrl","url","rewriteLinks","html","doc","DOMParser","parseFromString","querySelectorAll","forEach","link","href","getAttribute","setAttribute","body","innerHTML","Container","q","styled","div","fullWidth","bgColor","alignment","color","extractColorFromObject","obj","brandColor","colorObj","light","trim","parseJsonColor","jsonString","JSON","parse","resolveBackgroundColor","trimmed","startsWith","CsText","full_width","container_background_color","text_editor","font_color","fontColor","regionLang","backgroundColor","updatedHtml","D","jsx","children","dangerouslySetInnerHTML","__html","import_foundation_ui_components","StyledCsImageWrapper","te","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","P","className","ne","NsImage","TextContainer","k","textAlignment","HeaderText","p","Title","h2","Subtitle","h3","BodyText","BannerText","headerText","subtitle","bodyText","textColor","testId","y","jsxs","useMediaLoader","options","enabled","threshold","rootMargin","ref","C","useRef","useState","shouldLoad","setShouldLoad","hasError","setHasError","useEffect","element","current","observer","IntersectionObserver","entries","isIntersecting","disconnect","observe","handleError","MediaContainer","M","StyledImage","img","StyledVideo","video","FallbackMessage","BannerMedia","mediaUrl","fallbackMediaUrl","mediaType","mediaAlt","onError","ie","React","currentUrl","setCurrentUrl","handleMediaError","T","autoPlay","muted","loop","playsInline","loading","CTALink","ae","a","variant","BannerCTA","ctaLabel","ctaDestination","onClick","se","useReducedMotion","I","prefersReducedMotion","setPrefersReducedMotion","matchMedia","mediaQuery","matches","handleChange","event","addEventListener","removeEventListener","useCarousel","totalSlides","autoRotate","rotationInterval","pauseOnHover","initialIndex","x","currentIndex","setCurrentIndex","isPaused","setIsPaused","goToNext","useCallback","prev","goToPrevious","goToSlide","index","pause","resume","handleKeyDown","preventDefault","intervalId","setInterval","clearInterval","Array","isArray","banners","length","banner","BannerContainer","h","CarouselWrapper","CarouselTrack","BannerSlide","BannerContent","MediaWrapper","TextContentWrapper","position","GradientOverlay","direction","depth","opacities","sm","start","end","md","lg","baseColor","CarouselControls","Indicator","button","active","renderBanner","componentTestId","showMedia","showCTA","baseTestId","resolvedTextColor","white","dark","showGradient","gradientColor","gradientDirection","f","gradientDepth","ctaVariant","isCarousel","carousel","onKeyDown","onMouseEnter","onMouseLeave","map","THICKNESS_PX","thin","medium","thick","BREAKPOINTS","mobile","tablet","desktop","ultra","StyledSpacingContainer","Q","paddingVertical","dividerAlign","v","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","K"],"mappings":"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","sourcesContent":["\"use strict\";var Te=Object.create;var $=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Ie=Object.prototype.hasOwnProperty;var Se=(e,t)=>{for(var r in t)$(e,r,{get:t[r],enumerable:!0})},j=(e,t,r,o)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of $e(t))!Ie.call(e,i)&&i!==r&&$(e,i,{get:()=>t[i],enumerable:!(o=Me(t,i))||o.enumerable});return e};var w=(e,t,r)=>(r=e!=null?Te(Re(e)):{},j(t||!e||!e.__esModule?$(r,\"default\",{value:e,enumerable:!0}):r,e)),Le=e=>j($({},\"__esModule\",{value:!0}),e);var ft={};Se(ft,{CsImage:()=>oe,CsMarketingBannerComponent:()=>V,CsSpacingDivider:()=>ke,CsTextComponent:()=>ee,DEFAULT_BANNER_CONFIG:()=>dt,DEFAULT_CAROUSEL_CONFIG:()=>lt,DEFAULT_ROTATION_INTERVAL:()=>pt,hasCTA:()=>H,hasMedia:()=>W,isCarouselMode:()=>O});module.exports=Le(ft);var R=require(\"react\"),q=w(require(\"@emotion/styled\"));var Pe=require(\"react\");var Ae=\"{%language}\",Be=\"{%LANGUAGE}\",Ee=\"{%region}\",De=\"{%REGION}\",A=(e,t={})=>typeof e!=\"string\"?\"\":(t.region&&(e=e.replace(Ee,t.region),e=e.replace(De,t.region.toUpperCase())),t.language&&(e=e.replace(Ae,t.language),e=e.replace(Be,t.language.toUpperCase())),e);var B=()=>{if(typeof window>\"u\")return;let e=new URLSearchParams(window.location.search),t=e.get(\"region\")??void 0,r=e.get(\"language\")??void 0;if(t||r)return{region:t,language:r}};var _e=require(\"react\"),Ue=require(\"@mui/material\"),X=require(\"@nuskin/foundation-theme\"),{getGenomeColor:Ct}=X.ColorUtils;var Y=require(\"@mui/material\"),J=require(\"@nuskin/foundation-theme\"),Z=require(\"react\"),{getGenomeColor:ze}=J.ColorUtils,Fe=(e=!1)=>{let t=(0,Y.useTheme)();return(0,Z.useMemo)(()=>ze(t,\"N10\",e?\"light\":\"dark\"),[e,t])},E=Fe;var D=require(\"react/jsx-runtime\"),Ne=()=>(0,R.useMemo)(()=>B(),[]),Ge=(e,t)=>!t||!e?e:A(e,t),Oe=(e,t)=>{if(typeof window>\"u\"||!e||!t)return e;let o=new DOMParser().parseFromString(e,\"text/html\");return o.querySelectorAll(\"a\").forEach(i=>{let n=i.getAttribute(\"href\");n&&i.setAttribute(\"href\",Ge(n,t))}),o.body.innerHTML},We=q.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`,He=e=>{let t=e?.brandColor?.colorObj?.light??e?.color;return typeof t==\"string\"&&t.trim()?t:null},Ve=e=>{try{let r=JSON.parse(e)?.brandColor?.colorObj?.light;return typeof r==\"string\"&&r.trim()?r:null}catch{return null}},Qe=e=>{if(!e)return\"transparent\";if(typeof e==\"object\")return He(e)??\"transparent\";if(typeof e==\"string\"){let t=e.trim();return t?t.startsWith(\"{\")?Ve(t)??\"transparent\":t:\"transparent\"}return\"transparent\"},Ke=({full_width:e=!1,container_background_color:t,alignment:r=\"left\",text_editor:o,font_color:i=!1,$:n})=>{let a=E(i),s=Ne(),p=(0,R.useMemo)(()=>Qe(t),[t]),l=(0,R.useMemo)(()=>Oe(o,s),[o,s]);return o?(0,D.jsx)(We,{fullWidth:e,bgColor:p,alignment:r,color:a,children:(0,D.jsx)(\"div\",{dangerouslySetInnerHTML:{__html:l},...n?.text_editor})}):null},ee=Ke;var ne=require(\"@nuskin/foundation-ui-components\");var te=require(\"@nuskin/foundation-theme\"),re=(0,te.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 P=require(\"react/jsx-runtime\"),je=\"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>`),Xe=[\"alt\",\"className\",\"fill\",\"height\",\"id\",\"src\",\"variant\",\"width\"],Ye=e=>{let{image_alignment:t=\"center\",image:r,parent$:o,isEditing:i,$:n,...a}=e,s=null,p=null,l=null;try{let u=typeof r==\"string\"?JSON.parse(r):r,d=u?.image?.[0];d?.selected||d?.files?(s=d?.selected,p=d?.files):u?.url&&(l=u)}catch(u){console.warn(\"[CsImage] Failed to parse image prop:\",u)}let c=je,g=\"Image not available\",m=\"100%\",b=\"100%\";if(s||p){let u=s?.imageType??\"transformBaseUrl\",d=p?.[u];d?.url&&(c=d.url,g=s?.altText??\"Image\",m=s?.width??\"100%\",b=s?.height??\"100%\")}else l?.url&&(c=l.url,g=l.title||l.filename||\"Image\");let v={src:c,alt:g,width:m,height:b};Xe.forEach(u=>{a[u]!==void 0&&(v[u]=a[u])});let L=a?.full_width?\"container !p-0\":\"\";return(0,P.jsx)(re,{image_alignment:t,width:v.width,height:v.height,className:L,children:(0,P.jsx)(ne.NsImage,{...v,...n?.image||{}})})},oe=Ye;var k=w(require(\"@emotion/styled\")),y=require(\"react/jsx-runtime\"),Je=k.default.div`\n text-align: ${({textAlignment:e})=>e};\n\n /* Mobile: Always center text */\n @media (max-width: 768px) {\n text-align: center;\n }\n`,Ze=k.default.p`\n margin: 0 0 0.25rem 0;\n font-weight: 500;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({fontColor:e})=>e};\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 14px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 14px;\n }\n @media (min-width: 1441px) {\n font-size: 16px;\n }\n`,qe=k.default.h2`\n margin: 0 0 0.75rem 0;\n font-weight: 700;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n color: ${({fontColor:e})=>e};\n font-size: 24px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 32px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 40px;\n }\n @media (min-width: 1441px) {\n font-size: 48px;\n }\n`,et=k.default.h3`\n margin: 0 0 0.5rem 0;\n font-weight: 600;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({fontColor:e})=>e};\n font-size: 16px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 18px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 20px;\n }\n @media (min-width: 1441px) {\n font-size: 22px;\n }\n`,tt=k.default.p`\n margin: 0;\n line-height: 1.6;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({fontColor:e})=>e};\n font-size: 14px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 16px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 18px;\n }\n @media (min-width: 1441px) {\n font-size: 20px;\n }\n`;function _({headerText:e,title:t,subtitle:r,bodyText:o,textColor:i=\"#ffffff\",textAlignment:n=\"left\",testId:a}){return!e&&!t&&!r&&!o?null:(0,y.jsxs)(Je,{textAlignment:n,\"data-testid\":a,children:[e&&(0,y.jsx)(Ze,{fontColor:i,children:e}),t&&(0,y.jsx)(qe,{fontColor:i,children:t}),r&&(0,y.jsx)(et,{fontColor:i,children:r}),o&&(0,y.jsx)(tt,{fontColor:i,children:o})]})}var ie=w(require(\"react\")),M=w(require(\"@emotion/styled\"));var C=require(\"react\");function U(e={}){let{enabled:t=!0,threshold:r=.1,rootMargin:o=\"50px\"}=e,i=(0,C.useRef)(null),[n,a]=(0,C.useState)(!t||typeof window>\"u\"||!(\"IntersectionObserver\"in window)),[s,p]=(0,C.useState)(!1);return(0,C.useEffect)(()=>{if(typeof window>\"u\"||!(\"IntersectionObserver\"in window)){a(!0);return}if(!t||n)return;let c=i.current;if(!c)return;let g=new IntersectionObserver(m=>{m.forEach(b=>{b.isIntersecting&&(a(!0),g.disconnect())})},{threshold:r,rootMargin:o});return g.observe(c),()=>{g.disconnect()}},[t,n,r,o]),{ref:i,shouldLoad:n,hasError:s,handleError:()=>{p(!0)}}}var T=require(\"react/jsx-runtime\"),rt=M.default.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`,nt=M.default.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,ot=M.default.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`,it=M.default.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: #f0f0f0;\n color: #666;\n font-size: 14px;\n`;function z({mediaUrl:e,fallbackMediaUrl:t,mediaType:r=\"image\",mediaAlt:o=\"\",onError:i,testId:n}){let{ref:a,shouldLoad:s,hasError:p,handleError:l}=U({enabled:!0}),[c,g]=ie.default.useState(e),m=()=>{t&&c!==t?g(t):l(),i?.()};return(0,T.jsx)(rt,{ref:a,\"data-testid\":n,children:p&&!t?(0,T.jsx)(it,{children:\"Media unavailable\"}):s?r===\"video\"?(0,T.jsx)(ot,{src:c,onError:m,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,\"data-testid\":`${n}-video`,children:\"Your browser does not support the video tag.\"}):(0,T.jsx)(nt,{src:c,alt:o,onError:m,loading:\"lazy\",\"data-testid\":`${n}-image`}):null})}var ae=w(require(\"@emotion/styled\")),se=require(\"react/jsx-runtime\"),at=ae.default.a`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: 16px 32px;\n text-decoration: none;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n font-size: 22px;\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease,\n transform 0.1s ease,\n text-decoration 0.2s ease;\n\n /* Variant-specific styling */\n ${({variant:e})=>e===\"dark\"?`\n background-color: #888888;\n color: #ffffff;\n border: 1px solid #888888;\n\n &:hover {\n background-color: #888888;\n color: #ffffff;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n `:`\n background-color: transparent;\n color: #1a1a1a;\n border: 1px solid #888888;\n\n &:hover {\n background-color: transparent;\n color: #1a1a1a;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n `}\n\n &:active {\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${({variant:e})=>e===\"dark\"?\"#ffffff\":\"#888888\"};\n outline-offset: 4px;\n }\n\n /* Responsive sizing */\n @media (max-width: 768px) {\n padding: 12px 28px;\n font-size: 18px;\n }\n\n @media (min-width: 1441px) {\n padding: 18px 36px;\n font-size: 24px;\n }\n`;function F({ctaLabel:e,ctaDestination:t,variant:r=\"dark\",onClick:o,testId:i}){return(0,se.jsx)(at,{href:t,variant:r,onClick:o,\"data-testid\":i,\"aria-label\":e,children:e})}var x=require(\"react\");var I=require(\"react\");function N(){let[e,t]=(0,I.useState)(!1);return(0,I.useEffect)(()=>{if(typeof window>\"u\"||!window.matchMedia)return;let r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");t(r.matches);let o=i=>{t(i.matches)};return r.addEventListener(\"change\",o),()=>r.removeEventListener(\"change\",o)},[]),e}function G(e){let{totalSlides:t,autoRotate:r=!1,rotationInterval:o=5e3,pauseOnHover:i=!0,initialIndex:n=0}=e,[a,s]=(0,x.useState)(n),[p,l]=(0,x.useState)(!1),c=N(),g=(0,x.useCallback)(()=>{s(d=>(d+1)%t)},[t]),m=(0,x.useCallback)(()=>{s(d=>(d-1+t)%t)},[t]),b=(0,x.useCallback)(d=>{d>=0&&d<t&&s(d)},[t]),v=(0,x.useCallback)(()=>{l(!0)},[]),L=(0,x.useCallback)(()=>{l(!1)},[]),u=(0,x.useCallback)(d=>{switch(d.key){case\"ArrowLeft\":d.preventDefault(),m();break;case\"ArrowRight\":d.preventDefault(),g();break;case\"Home\":d.preventDefault(),b(0);break;case\"End\":d.preventDefault(),b(t-1);break}},[g,m,b,t]);return(0,x.useEffect)(()=>{if(!r||p||c)return;let d=setInterval(g,o);return()=>clearInterval(d)},[r,p,c,o,g]),{currentIndex:a,isPaused:p,totalSlides:t,goToNext:g,goToPrevious:m,goToSlide:b,pause:v,resume:L,handleKeyDown:u}}function O(e){return Array.isArray(e.banners)&&e.banners.length>1}function W(e){return!!e.mediaUrl}function H(e){return!!(e.ctaLabel&&e.ctaDestination)}var h=w(require(\"@emotion/styled\")),de=h.default.div`\n position: relative;\n width: 100%;\n overflow: hidden;\n`,le=h.default.div`\n position: relative;\n width: 100%;\n`,pe=h.default.div`\n display: flex;\n transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(-${({currentIndex:e})=>e*100}%);\n`,ge=h.default.div`\n min-width: 100%;\n position: relative;\n`,ce=h.default.div`\n position: relative;\n min-height: ${({hasMedia:e})=>e?\"600px\":\"auto\"};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n @media (max-width: 768px) {\n min-height: ${({hasMedia:e})=>e?\"400px\":\"auto\"};\n }\n`,me=h.default.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n`,fe=h.default.div`\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n justify-content: center;\n padding: 3rem;\n max-width: 600px;\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 @media (max-width: 768px) {\n padding: 2rem;\n max-width: 100%;\n margin: 0 auto;\n align-items: center;\n text-align: center;\n }\n`,ue=h.default.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\n pointer-events: none;\n\n /* Base gradient from props (applies to desktop/tablet) */\n ${({direction:e,depth:t,color:r})=>{let o={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:i,end:n}=o[t],a=r===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return e===\"leftToRight\"?`background: linear-gradient(to right, rgba(${a}, ${i}), rgba(${a}, ${n}));`:e===\"rightToLeft\"?`background: linear-gradient(to left, rgba(${a}, ${i}), rgba(${a}, ${n}));`:e===\"radial\"?`background: radial-gradient(circle, rgba(${a}, ${i}), rgba(${a}, ${n}));`:\"\"}}\n\n /* Mobile: Override to always use radial gradient */\n @media (max-width: 768px) {\n ${({depth:e,color:t})=>{let r={sm:{start:.3,end:0},md:{start:.6,end:0},lg:{start:.9,end:0}},{start:o,end:i}=r[e],n=t===\"black\"?\"0, 0, 0\":\"255, 255, 255\";return`background: radial-gradient(circle, rgba(${n}, ${o}), rgba(${n}, ${i}));`}}\n }\n`,xe=h.default.div`\n position: absolute;\n bottom: 2rem;\n left: 50%;\n transform: translateX(-50%);\n z-index: 3;\n display: flex;\n gap: 0.75rem;\n align-items: center;\n\n @media (max-width: 768px) {\n bottom: 1.5rem;\n }\n`,he=h.default.button`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n border: 2px solid rgba(255, 255, 255, 0.9);\n background-color: ${({active:e})=>e?\"rgba(255, 255, 255, 0.9)\":\"transparent\"};\n cursor: pointer;\n padding: 0;\n transition: all 0.3s ease;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.9);\n transform: scale(1.15);\n }\n`;var f=require(\"react/jsx-runtime\"),st=(e,t,r)=>{let o=W(e),i=H(e),n=e.testId??r??\"banner\",s={white:\"#ffffff\",dark:\"#1a1a1a\"}[e.textColor??\"white\"],p=e.showGradient===!0,l=e.position??\"left\",c=e.textColor===\"dark\"?\"white\":\"black\",g;l===\"left\"?g=\"leftToRight\":l===\"right\"?g=\"rightToLeft\":g=\"radial\";let m;return l===\"center\"?m=\"center\":l===\"right\"?m=\"right\":m=\"left\",(0,f.jsx)(ge,{children:(0,f.jsxs)(ce,{hasMedia:o,children:[o&&e.mediaUrl&&(0,f.jsx)(me,{children:(0,f.jsx)(z,{mediaUrl:e.mediaUrl,fallbackMediaUrl:e.fallbackMediaUrl,mediaType:e.mediaType,mediaAlt:e.mediaAlt,testId:`${n}-${t}-media`})}),p&&(0,f.jsx)(ue,{direction:g,depth:e.gradientDepth??\"md\",color:c}),(0,f.jsxs)(fe,{position:l,children:[(0,f.jsx)(_,{headerText:e.headerText,title:e.title,subtitle:e.subtitle,bodyText:e.bodyText,textColor:s,textAlignment:m,testId:`${n}-${t}-text`}),i&&e.ctaLabel&&e.ctaDestination&&(0,f.jsx)(F,{ctaLabel:e.ctaLabel,ctaDestination:e.ctaDestination,variant:e.ctaVariant??\"dark\",testId:`${n}-${t}-cta`})]})]})},`${n}-${t}`)};function V(e){let{banners:t,rotationInterval:r,testId:o}=e,i=O(e),n=G({totalSlides:t.length,autoRotate:i,rotationInterval:r??5e3,pauseOnHover:!0,initialIndex:0});return(0,f.jsxs)(de,{\"data-testid\":o??\"cs-marketing-banner\",onKeyDown:i?n.handleKeyDown:void 0,onMouseEnter:i?n.pause:void 0,onMouseLeave:i?n.resume:void 0,children:[(0,f.jsx)(le,{children:(0,f.jsx)(pe,{currentIndex:n.currentIndex,totalSlides:t.length,children:t.map((a,s)=>st(a,s,o))})}),i&&(0,f.jsx)(xe,{children:t.map((a,s)=>(0,f.jsx)(he,{active:s===n.currentIndex,onClick:()=>n.goToSlide(s),\"aria-label\":`Go to slide ${s+1}`},`${o??\"banner\"}-indicator-${s}-${a.title??\"\"}`))})]})}var dt={position:\"left\",textColor:\"white\",showGradient:!1,gradientDepth:\"md\",mediaType:\"image\",ctaVariant:\"dark\"},lt={rotationInterval:5e3},pt=5e3;var Q=require(\"@nuskin/foundation-theme\");var be={thin:1,medium:2,thick:4},S={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 ye=(0,Q.styled)(\"div\")(({paddingVertical:e,dividerAlign:t})=>{let o={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:`${o.mobile}px`,paddingBottom:`${o.mobile}px`,[`@media ${S.tablet}`]:{paddingTop:`${o.tablet}px`,paddingBottom:`${o.tablet}px`},[`@media ${S.desktop}`]:{paddingTop:`${o.desktop}px`,paddingBottom:`${o.desktop}px`},[`@media ${S.ultra}`]:{paddingTop:`${o.ultra}px`,paddingBottom:`${o.ultra}px`}}}),Ce=(0,Q.styled)(\"div\")(({dividerStyle:e,dividerThicknessPx:t,dividerColor:r,dividerGradient:o,dividerWidthPercent:i})=>{let n={width:`${Math.max(0,Math.min(100,i))}%`};if(o&&e!==\"none\"){if(n.height=`${t}px`,n.backgroundImage=o,n.backgroundSize=\"100% 100%\",e===\"dashed\"){let a=Math.max(12,t*4),s=Math.max(6,t*2);n.maskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+s}px)`,n.WebkitMaskImage=`repeating-linear-gradient(90deg, black 0px, black ${a}px, transparent ${a}px, transparent ${a+s}px)`}else if(e===\"dotted\"){let a=Math.max(2,t),s=Math.max(8,a*3),p=a/2;n.maskImage=`radial-gradient(circle ${p}px at 50% 50%, black 99%, transparent 100%)`,n.WebkitMaskImage=`radial-gradient(circle ${p}px at 50% 50%, black 99%, transparent 100%)`,n.maskSize=`${s}px ${t}px`,n.WebkitMaskSize=`${s}px ${t}px`,n.maskRepeat=\"repeat-x\",n.WebkitMaskRepeat=\"repeat-x\",n.maskPosition=\"0 center\",n.WebkitMaskPosition=\"0 center\"}}else e===\"none\"?(n.height=`${t}px`,n.backgroundImage=o):(n.borderBottomStyle=e,n.borderBottomWidth=`${t}px`,n.borderBottomColor=r,n.height=0);return n});var ve=e=>e?/^#([A-Fa-f0-9]{6})$/.test(e):!1,gt=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),o=parseInt(e.slice(5,7),16);return{r:t,g:r,b:o}},we=(e,t)=>{if(!e||e===\"none\")return;let r=gt(t)??{r:0,g:0,b:0};switch(e){case\"brand_soft\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.3), rgba(${r.r},${r.g},${r.b},0.8))`;case\"brand_bold\":return`linear-gradient(90deg, rgba(${r.r},${r.g},${r.b},0.6), rgba(${r.r},${r.g},${r.b},1.0))`;case\"neutral_fade\":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 K=require(\"react/jsx-runtime\"),ct=\"#000000\",mt=e=>{let{paddingVertical:t=\"small\",dividerStyle:r=\"solid\",dividerThickness:o=\"thin\",dividerColor:i,dividerGradientPreset:n=\"none\",dividerWidthPercent:a=100,dividerAlign:s=\"left\"}=e,p=be[o],l=ve(i)?i:ct,c=we(n,l);return(0,K.jsx)(ye,{paddingVertical:t,dividerAlign:s,children:r!==\"none\"&&(0,K.jsx)(Ce,{dividerStyle:r,dividerThicknessPx:p,dividerColor:l,dividerGradient:c,dividerWidthPercent:a??100,\"aria-hidden\":\"true\"})})},ke=mt;\n","export * from './text';\nexport * from './image';\nexport * from './marketing-banner';\nexport * from './spacing-divider';\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 */\nexport const getRegionAndLanguageFromLocation = (): RegionLanguageQuery | undefined => {\n if (typeof window === 'undefined') return undefined;\n\n const params = new URLSearchParams(window.location.search);\n\n const region = params.get('region') ?? undefined;\n const language = params.get('language') ?? undefined;\n\n if (region || language) {\n return { region, language };\n }\n\n return undefined;\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 * BannerText Sub-Component\n * Renders text content (title, subtitle, bodyText) with responsive styling\n */\n\nimport React from 'react';\nimport styled from '@emotion/styled';\nimport type { TextAlignment } from '../types';\n\ninterface 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}\n\nconst TextContainer = styled.div<{\n textAlignment: TextAlignment;\n}>`\n text-align: ${({ textAlignment }) => textAlignment};\n\n /* Mobile: Always center text */\n @media (max-width: 768px) {\n text-align: center;\n }\n`;\n\nconst HeaderText = styled.p<{\n fontColor: string;\n}>`\n margin: 0 0 0.25rem 0;\n font-weight: 500;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({ fontColor }) => fontColor};\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 14px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 14px;\n }\n @media (min-width: 1441px) {\n font-size: 16px;\n }\n`;\n\nconst Title = styled.h2<{\n fontColor: string;\n}>`\n margin: 0 0 0.75rem 0;\n font-weight: 700;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n color: ${({ fontColor }) => fontColor};\n font-size: 24px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 32px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 40px;\n }\n @media (min-width: 1441px) {\n font-size: 48px;\n }\n`;\n\nconst Subtitle = styled.h3<{\n fontColor: string;\n}>`\n margin: 0 0 0.5rem 0;\n font-weight: 600;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({ fontColor }) => fontColor};\n font-size: 16px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 18px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 20px;\n }\n @media (min-width: 1441px) {\n font-size: 22px;\n }\n`;\n\nconst BodyText = styled.p<{\n fontColor: string;\n}>`\n margin: 0;\n line-height: 1.6;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n Arial,\n sans-serif;\n color: ${({ fontColor }) => fontColor};\n font-size: 14px;\n\n @media (min-width: 769px) and (max-width: 1024px) {\n font-size: 16px;\n }\n @media (min-width: 1025px) and (max-width: 1440px) {\n font-size: 18px;\n }\n @media (min-width: 1441px) {\n font-size: 20px;\n }\n`;\n\nexport function BannerText({\n headerText,\n title,\n subtitle,\n bodyText,\n textColor = '#ffffff',\n textAlignment = 'left',\n testId\n}: BannerTextProps): React.ReactElement | null {\n if (!headerText && !title && !subtitle && !bodyText) {\n return null;\n }\n\n return (\n <TextContainer textAlignment={textAlignment} data-testid={testId}>\n {headerText && <HeaderText fontColor={textColor}>{headerText}</HeaderText>}\n {title && <Title fontColor={textColor}>{title}</Title>}\n {subtitle && <Subtitle fontColor={textColor}>{subtitle}</Subtitle>}\n {bodyText && <BodyText fontColor={textColor}>{bodyText}</BodyText>}\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 styled from '@emotion/styled';\nimport { useMediaLoader } from '../hooks/useMediaLoader';\nimport type { MediaType } from '../types';\n\ninterface 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}\n\nconst MediaContainer = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`;\n\nconst StyledImage = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nconst StyledVideo = styled.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n`;\n\nconst FallbackMessage = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: #f0f0f0;\n color: #666;\n font-size: 14px;\n`;\n\nexport function BannerMedia({\n mediaUrl,\n fallbackMediaUrl,\n mediaType = 'image',\n mediaAlt = '',\n onError,\n testId\n}: BannerMediaProps): React.ReactElement {\n const { ref, shouldLoad, hasError, handleError } = useMediaLoader({\n enabled: true\n });\n\n const [currentUrl, setCurrentUrl] = React.useState(mediaUrl);\n\n const handleMediaError = () => {\n if (fallbackMediaUrl && currentUrl !== fallbackMediaUrl) {\n setCurrentUrl(fallbackMediaUrl);\n } else {\n handleError();\n }\n onError?.();\n };\n\n const renderMedia = () => {\n if (hasError && !fallbackMediaUrl) {\n return <FallbackMessage>Media unavailable</FallbackMessage>;\n }\n\n if (!shouldLoad) {\n return null;\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 >\n Your browser does not support the video tag.\n </StyledVideo>\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 />\n );\n };\n\n return (\n <MediaContainer ref={ref} data-testid={testId}>\n {renderMedia()}\n </MediaContainer>\n );\n}\n","/**\n * useMediaLoader Hook\n * Provides lazy loading capability using IntersectionObserver\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { UseMediaLoaderReturn } from '../types';\n\ninterface UseMediaLoaderOptions {\n enabled?: boolean;\n threshold?: number;\n rootMargin?: string;\n}\n\nexport function useMediaLoader(options: UseMediaLoaderOptions = {}): UseMediaLoaderReturn {\n const { enabled = true, threshold = 0.1, rootMargin = '50px' } = options;\n\n const ref = useRef<HTMLDivElement>(null);\n // SSR-safe: Load immediately if IntersectionObserver is not available or lazy loading is disabled\n const [shouldLoad, setShouldLoad] = useState(\n !enabled || typeof window === 'undefined' || !('IntersectionObserver' in window)\n );\n const [hasError, setHasError] = useState(false);\n\n useEffect(() => {\n // SSR-safe: Check if window and IntersectionObserver are available\n if (typeof window === 'undefined' || !('IntersectionObserver' in window)) {\n setShouldLoad(true);\n return;\n }\n\n if (!enabled || shouldLoad) return;\n\n const element = ref.current;\n if (!element) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setShouldLoad(true);\n observer.disconnect();\n }\n });\n },\n { threshold, rootMargin }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [enabled, shouldLoad, threshold, rootMargin]);\n\n const handleError = () => {\n setHasError(true);\n };\n\n return {\n ref,\n shouldLoad,\n hasError,\n handleError\n };\n}\n","/**\n * BannerCTA Sub-Component\n * Renders call-to-action button with accessibility support\n */\n\nimport React from 'react';\nimport styled from '@emotion/styled';\nimport type { CTAVariant } from '../types';\n\ninterface 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}\n\nconst CTALink = styled.a<{ variant: CTAVariant }>`\n display: inline-block;\n width: auto;\n max-width: max-content;\n padding: 16px 32px;\n text-decoration: none;\n font-family: 'Lora', Georgia, 'Times New Roman', serif;\n font-size: 22px;\n font-weight: 400;\n border-radius: 50px;\n transition:\n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease,\n transform 0.1s ease,\n text-decoration 0.2s ease;\n\n /* Variant-specific styling */\n ${({ variant }) => {\n if (variant === 'dark') {\n return `\n background-color: #888888;\n color: #ffffff;\n border: 1px solid #888888;\n\n &:hover {\n background-color: #888888;\n color: #ffffff;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n `;\n }\n // Light variant\n return `\n background-color: transparent;\n color: #1a1a1a;\n border: 1px solid #888888;\n\n &:hover {\n background-color: transparent;\n color: #1a1a1a;\n border-color: #ffffff;\n text-decoration: underline;\n transform: translateY(-2px);\n }\n `;\n }}\n\n &:active {\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${({ variant }) => (variant === 'dark' ? '#ffffff' : '#888888')};\n outline-offset: 4px;\n }\n\n /* Responsive sizing */\n @media (max-width: 768px) {\n padding: 12px 28px;\n font-size: 18px;\n }\n\n @media (min-width: 1441px) {\n padding: 18px 36px;\n font-size: 24px;\n }\n`;\n\nexport function BannerCTA({\n ctaLabel,\n ctaDestination,\n variant = 'dark',\n onClick,\n testId\n}: BannerCTAProps): React.ReactElement {\n return (\n <CTALink href={ctaDestination} variant={variant} onClick={onClick} data-testid={testId} aria-label={ctaLabel}>\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/** 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\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\n/** Carousel configuration for multiple banner slides */\nexport interface BannerCarousel {\n banners: MarketingBanner[];\n /** Rotation interval in milliseconds (default: 5000) */\n rotationInterval?: number;\n /** Current slide index (internal state) */\n currentSlideIndex?: 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}\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?: 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 /** Media URL */\n media_url?: string;\n /** Fallback media URL */\n fallback_media_url?: string;\n /** Media type */\n media_type?: 'image' | 'gif' | 'video';\n /** Media alt text */\n media_alt?: string;\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\n/** CS carousel data structure */\nexport interface CSCarouselData {\n banners: CSBannerData[];\n /** Rotation interval in milliseconds */\n rotation_interval?: number;\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 * CsMarketingBanner Styled Components\n * All styling for the Marketing Banner component\n */\n\nimport styled from '@emotion/styled';\nimport type { GradientDirection, GradientDepth } from './types';\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 0.6s cubic-bezier(0.4, 0, 0.2, 1);\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 ? '600px' : 'auto')};\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n @media (max-width: 768px) {\n min-height: ${({ hasMedia }) => (hasMedia ? '400px' : 'auto')};\n }\n`;\n\nexport const MediaWrapper = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n`;\n\nexport const TextContentWrapper = styled.div<{\n position?: 'left' | 'center' | 'right';\n}>`\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n justify-content: center;\n padding: 3rem;\n max-width: 600px;\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 (max-width: 768px) {\n padding: 2rem;\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 position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\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 `background: linear-gradient(to right, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n if (direction === 'rightToLeft') {\n return `background: linear-gradient(to left, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n if (direction === 'radial') {\n return `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }\n return '';\n }}\n\n /* Mobile: Override to always use radial gradient */\n @media (max-width: 768px) {\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 `background: radial-gradient(circle, rgba(${baseColor}, ${start}), rgba(${baseColor}, ${end}));`;\n }}\n }\n`;\n\nexport const CarouselControls = styled.div`\n position: absolute;\n bottom: 2rem;\n left: 50%;\n transform: translateX(-50%);\n z-index: 3;\n display: flex;\n gap: 0.75rem;\n align-items: center;\n\n @media (max-width: 768px) {\n bottom: 1.5rem;\n }\n`;\n\nexport const Indicator = styled.button<{ active: boolean }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n border: 2px solid rgba(255, 255, 255, 0.9);\n background-color: ${({ active }) => (active ? 'rgba(255, 255, 255, 0.9)' : 'transparent')};\n cursor: pointer;\n padding: 0;\n transition: all 0.3s ease;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.9);\n transform: scale(1.15);\n }\n`;\n","/**\n * CsMarketingBanner 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 {\n BannerContainer,\n CarouselWrapper,\n CarouselTrack,\n BannerSlide,\n BannerContent,\n MediaWrapper,\n TextContentWrapper,\n GradientOverlay,\n CarouselControls,\n Indicator\n} from './CsMarketingBanner.styled';\n\nconst renderBanner = (banner: MarketingBanner, index: number, componentTestId?: string) => {\n const showMedia = hasMedia(banner);\n const showCTA = hasCTA(banner);\n\n const baseTestId = banner.testId ?? componentTestId ?? 'banner';\n\n const fontColorMap = {\n white: '#ffffff',\n dark: '#1a1a1a'\n };\n const resolvedTextColor = fontColorMap[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 />\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 />\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 />\n )}\n </TextContentWrapper>\n </BannerContent>\n </BannerSlide>\n );\n};\n\nexport default function CsMarketingBannerComponent(props: Readonly<CsMarketingBannerProps>): React.ReactElement {\n const { banners, rotationInterval, testId } = 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 ?? 'cs-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, 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","/**\n * Default Configurations\n * Marketing Banner Component\n *\n * Simplified API per spec.md:\n * - Fonts hardcoded: Lora for title, Inter for header/subtitle/body\n * - Single textColor prop for all text (white | dark)\n * - Gradient color/direction auto-derived from textColor and position\n * - Object-fit hardcoded to 'cover'\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","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 CsSpacingDividerProps {\n paddingVertical?: PaddingScale;\n dividerStyle?: DividerStyle;\n dividerThickness?: DividerThickness;\n dividerColor?: string;\n dividerGradientPreset?: 'none' | 'brand_soft' | 'brand_bold' | 'neutral_fade';\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' | 'brand_soft' | 'brand_bold' | 'neutral_fade',\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 'brand_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 'brand_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 'neutral_fade':\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 {\n StyledSpacingContainer,\n StyledDividerLine\n} from './CsSpacingDivider.styled';\nimport type { CsSpacingDividerProps } from './types';\nimport { THICKNESS_PX } from './types';\nimport { isValidHex, gradientPresetCss } from './utils/utils';\n\nconst DEFAULT_HEX = '#000000';\n\nconst CsSpacingDivider = (props: CsSpacingDividerProps): 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\n paddingVertical={paddingVertical}\n dividerAlign={dividerAlign}\n >\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 CsSpacingDivider;\n\n"]}
|