@nuskin/react-mysite-elements 1.5.0-ui-fixes.2 → 1.5.0-ui-fixes.3
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.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/gitlab-runner-data/builds/nextgen-development/mysite/npm/react-mysite-elements/dist/index.mjs","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../src/common/card/NsProductCard.tsx","../src/common/card/styles/NsProductCard.Styled.tsx","../src/common/carousel/NsProductCarousel.tsx","../src/common/carousel/NsProductCarousel.styled.ts","../src/common/carousel/ProductTabCarousel.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.styled.tsx","../src/common/carousel/ProductTabCarousel.styled.tsx","../src/common/headers/MysiteHero.tsx","../src/common/headers/MysiteHero.styled.tsx","../src/common/icon/icons/PlaceholderImage.tsx","../src/common/icon/icons/ArrowDownIcon.tsx","../src/common/utils/gtmTracking.ts","../src/common/shopping-dashboard/ShoppingDashboard.styled.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.styled.tsx","../src/common/shopping-dashboard/TranslationKeys/translationResolver.ts","../src/common/shopping-dashboard/TranslationKeys/ShoppingDashboardTranslationKeys.ts","../src/common/shopping-dashboard/utils/marketOptions.ts","../src/common/shopping-dashboard/shared/StatsCard.tsx","../src/common/shopping-dashboard/shared/StatsCard.styled.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.tsx","../src/common/shopping-dashboard/utils/trendUtils.tsx","../src/common/shopping-dashboard/utils/dataUtils.ts","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.styled.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.styled.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.styled.tsx","../src/common/shopping-dashboard/utils/dateConstants.ts","../src/common/shopping-dashboard/utils/dateFormat.ts","../src/common/shopping-dashboard/shared/Signups/SignupsChart.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsChart.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.styled.tsx","../src/common/shopping-dashboard/ShoppingDashboard.tsx","../src/common/shopping-dashboard/MysiteDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.tsx","../src/common/shopping-dashboard/shared/PageHeader.tsx","../src/common/shopping-dashboard/shared/PageHeader.styled.tsx","../src/common/shopping-dashboard/shared/DataTable.tsx","../src/common/shopping-dashboard/shared/DataTable.styled.tsx","../src/common/shopping-dashboard/shared/Pagination.tsx","../src/common/shopping-dashboard/shared/Pagination.styled.tsx","../src/common/shopping-dashboard/shared/FullViewComponents.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.styled.tsx","../src/common/shopping-dashboard/shared/useViewport.ts","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.styled.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.styled.tsx","../src/common/shopping-dashboard/TranslationContext.tsx","../src/common/shopping-dashboard/ProductOfferDashboard.styled.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersPieChart.tsx","../src/common/shopping-dashboard/TranslationKeys/ProductOfferDashboardTranslationKeys.ts","../src/common/shopping-dashboard/ProductOfferDashboard.tsx","../src/common/shopping-dashboard/PoDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersFullView.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersFullView.styled.tsx","../src/common/shopping-dashboard/shared/FilterBar.styled.tsx","../src/common/shopping-dashboard/shared/FilterBar.tsx","../src/common/shopping-dashboard/fixtures/mockDashboardData.ts","../src/common/shopping-dashboard/fixtures/mockProductOfferData.ts"],"names":["dp","Object","create","sn","defineProperty","pp","getOwnPropertyDescriptor","cp","getOwnPropertyNames","up","getPrototypeOf","gp","prototype","hasOwnProperty","ua","e","t","exports","fp","o","n","i","call","get","enumerable","mp","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","Ln","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","isRequired","getShim","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","require_prop_types","Vn","ReactIs","throwOnDirectAccess","useState","NsImage","styled","PriceComponent","ProductCardContainer","isMobile","ImageContainer","bgColor","DefaultImage","ProductTitle","ProductBadgeContainer","AddToCartButton","disabled","isHovered","CartIcon","useMediaQuery","jsx","jsxs","NsProductCard","productTitle","imageDetails","className","button","onCardClick","productStatusBadge","directSellerBadge","mySitePriceComponent","testId","isButtonHovered","setIsButtonHovered","handleImageError","target","noImageFallback","fallbackImage","src","onClick","tabIndex","children","onError","imageSrc","alt","imageAlt","areaLabel","width","title","showButton","buttonText","stopPropagation","onMouseEnter","onMouseLeave","height","viewBox","fill","xmlns","fillRule","clipRule","d","NsProductCard_default","useCallback","useRef","Slider","NsCarouselControl","Box","NsTypography","SlickContainer","ScrollableContainer","CardList","ControlsContainer","ViewAllWrapper","$isMobile","ProductCountWrapper","ArrowsWrapper","$isDisabled","Scrollablewrapper","CustomTypography","ViewAllLink","$disabled","EmptyProductCategories","ControlsHeaderRow","ProductInfoWrapper","CategoryNameWrapper","ProductCardCarousel","entries","renderEntry","settings","showControlButtons","allEntryLabel","allEntryLink","categoryName","emptyProductMessage","productsCountLabel","isInitialDataLoading","history","sliderRef","prev","current","slickPrev","next","slickNext","renderProductEntry","entry","index","directSeller","sliderSettings","dots","infinite","speed","slidesToShow","Math","min","length","slidesToScroll","swipe","draggable","arrows","responsive","breakpoint","shouldShowNavigation","renderCarouselContent","map","ref","variant","preventDefault","push","viewAllLabel","viewAllUrl","useEffect","import_prop_types","zn","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","ar","NsCategoryNavigation","itemArray","controlledValue","onChange","En","internalValue","setInternalValue","orientation","event","newValue","item","label","categoryId","findIndex","content","NsSpinner","getMinHeight","$hasCategories","ProductTabCarouselContainer","TabsContainer","ContentContainer","LoadingContainer","NoTabsContainer","SpinnerContainer","ProductTabCarousel","fetchCategories","fetchProducts","showCustomCategory","emptyProductTabs","getCategoryId","categories","isLoadingInitialData","setIsLoadingInitialData","setCategories","isCategoriesLoaded","setIsCategoriesLoaded","selectedTab","setSelectedTab","products","setProducts","loading","setLoading","shouldShowSpinner","setShouldShowSpinner","checkForExistingSpinners","existingSpinners","document","querySelectorAll","then","data","finally","cat","_","ProductTabCarousel_default","useMemo","Typography","Tooltip","NsLink","getContactTextStyles","hasWhiteBackground","fontSize","fontStyle","fontWeight","lineHeight","letterSpacing","color","textDecoration","getSocialTitleStyles","textTransform","paddingLeft","getSocialIconsStyles","display","flexDirection","gap","alignItems","getContactTextMobileStyles","paddingBottom","wordBreak","overflowWrap","getSocialTitleMobileStyles","marginBottom","transition","opacity","transform","MysiteHeroContainer","bannerProps","isCircularImage","backgroundClip","background","backgroundColor","position","overflow","willChange","backfaceVisibility","top","left","right","boxShadow","paddingTop","justifyContent","fontFamily","headlineFont","padding","objectFit","objectPosition","marginLeft","marginRight","boxSizing","whiteSpace","textOverflow","paragraphFont","WebkitBoxOrient","WebkitLineClamp","MysiteHeroContainerMobile","paddingRight","maxHeight","bottom","pointerEvents","BadgeContainer","Badge","backdropFilter","borderRadius","border","minHeight","ToggleButtonMobile","cursor","margin","StyledSpan","ImgTabIndex","ContactLink","BadgeValue","PlaceholderImage","sx","ArrowDownIcon","trackGTMEvent","eventData","window","url","href","updatedEventData","prefix","includes","dataLayer","console","error","Fragment","renderImageContent","placeholderClass","renderBadges","showBadges","expirationDate","totalSavings","badgeClass","renderMobileContent","isScrolled","renderSocialMediaIcons","shopTitle","socialTitleText","email","phone","component","trim","renderContactLink","renderDesktopContent","shopDescription","arrow","checkIfImageIsCircular","Promise","resolve","reject","imageContext","Image","crossOrigin","onload","canvas","createElement","context","getContext","drawImage","isCircular","getImageData","every","corner","Array","slice","onerror","isWhiteOrNearWhite","hex","replace","toLowerCase","test","fullHex","split","char","join","r","Number","parseInt","substring","g","b","threshold","createContactClickHandler","contactType","contactValue","contact_type","contact_value","click_element","onKeyDown","key","globalThis","protocol","handlers","MysiteHero","socialIcons","setIsScrolled","isDescriptionExpanded","setIsDescriptionExpanded","setHasWhiteBackground","isImageCircular","setIsImageCircular","toggleDescription","debounceTimeout","lastScrollY","scrollY","currentScrollState","isTransitioning","lastUpdateTime","updateScrollState","newState","now","Date","clearTimeout","setTimeout","scrollTo","behavior","handleScroll","currentScrollY","abs","scrollingDown","scrollDownThreshold","scrollUpThreshold","initializeState","initialScrollY","shouldStartCompact","rafId","lastRafTime","throttledScrollHandler","requestAnimationFrame","addEventListener","passive","removeEventListener","cancelAnimationFrame","icon","social_platform","type","social_url","open","containerClass","getCharacterLimit","innerWidth","shouldShowToggle","DashboardContainer","StatsRow","WidgetContainer","TwoColumnGrid","ErrorContainer","CalendarTodayIcon","PublicIcon","ColorUtils","getGenomeColor","HeaderContainer","theme","TitleSection","ShopTitle","DateRangeLabel","FiltersSection","FilterDropdownContainer","FilterLabel","StyledSelect","FilterIcon","LoadingIndicatorContainer","DesktopFiltersContainer","StyledCircularProgress","activeResolver","setTranslationResolver","resolver","getTranslationResolver","resolveTranslation","fallback","result","ShoppingDashboardTranslationKeys","stats","revenue","volume","visits","subtitle","dcSv","conversionRate","trend","increased","decreased","unchanged","details","filter","dateRange","last7days","last30days","last90days","thisMonth","dateRangeLabel","market","all","marketLabel","productSort","units","byUnits","byRevenue","byVolume","signupView","members","retail","brandAffiliates","showAll","showMembers","showRetail","showBrandAffiliates","conversionType","standard","subscription","categorySort","byTrend","widget","topProducts","viewAll","empty","ariaLabel","titleAriaLabel","sortAriaLabel","noImageAriaLabel","unitsSuffix","revenueSuffix","dcSvSuffix","rank","formula","comparison","chartAriaLabel","filterAriaLabel","noData","noChange","tooltipOrders","tooltipVisits","ordersPerSiteVisits","signups","total","totalSignupsInPeriod","noTrendData","topCategories","menu","fullView","navigation","backToDashboard","backAriaLabel","dashboard","statsRow","dashboardFilters","loadingDashboard","dateRangeFilter","marketFilter","filterSuffix","columns","date","status","detailsTitle","orderId","customer","items","bv","orderTotal","totalSv","orderDetailsTitle","notAvailable","product","unitsSold","skuPrefix","noProducts","category","percentOfTotal","allCategoriesTitle","noCategoryData","dataTable","noDataAvailable","sortableColumn","pagination","previousPage","nextPage","goToPage","of","defaults","zeroTrend","noValue","getTranslation","buildDefaultMarketOptions","resolveMarketOptions","markets","useMarketOptions","DashboardHeader","dateRangeLabelProp","isLoading","onDateRangeChange","onMarketChange","marketOptions","handleDateRangeChange","newDateRange","handleMarketChange","newMarket","handleFilterKeyDown","blur","getDateRangeLabelText","as","htmlFor","find","opt","String","option","ShowChartIcon","TrendingUpIcon","TrendingDownIcon","StatsCardContainer","$layout","SplitTitle","SplitRow","LegendColumn","SplitTrend","direction","LegendCaption","StatsTitle","StatsValueContainer","StatsValue","ValueSubtitleWrapper","StatsSubtitle","TrendContainer","TrendIcon","TrendText","StatsCardHeader","Skeleton","SkeletonCard","SkeletonHeader","SkeletonRow","StatsCardWrapper","StatsCardHeaderRow","StatsCardBody","StatsCardSubtitle","ProductRowInfo","ProductRowMetrics","ChartMetricRow","ChartMetricTrend","ChartAreaSkeleton","PieChartLayout","PieCircleSkeleton","LegendList","LegendRowWrapper","LegendRowInfo","DashboardLayout","DashboardHeaderRow","DashboardFilterGroup","StatsGrid","WidgetGrid","FullViewLayout","FullViewMetricCard","FullViewMetricCenter","FullViewChartArea","FullViewTableCard","FullViewTableRow","SummaryCardsGrid","StatsCardSkeleton","ProductRowSkeleton","ProductsListSkeleton","rowKey","ChartWidgetSkeleton","LegendRowSkeleton","CategoriesPieChartSkeleton","FullViewChartSkeleton","FullViewTableSkeleton","StatsCardComponent","caption","layout","trendDirection","trendValue","getTrendAriaLabel","directionText","getTrendChartIcon","iconSize","StatsCard","memo","displayName","ShoppingCartIcon","ArrowUpwardIcon","ArrowDownwardIcon","RemoveIcon","parseTrendPercent","cleanedValue","parsedValue","isFinite","resolveTrendDirection","calculateWeightedRevenueTrend","getRevenue","getTrend","reduce","accumulator","weightedSum","weight","average","formatted","toFixed","getTrendDirectionLabel","getTrendIcon","getTrendColor","calculateTotalPages","itemsPerPage","ceil","paginateItems","currentPage","startIndex","endIndex","sortByNumericProperty","sort","a","aVal","bVal","calculatePercentage","decimalPlaces","usePaginatedItems","totalPages","pageItems","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","format","toLocaleString","ProductsListContainer","WidgetHeader","HeaderActionsContainer","WidgetTitle","SortDropdown","ProductsList","ProductItem","ProductRank","ProductImage","ProductImagePlaceholder","ProductInfo","ProductName","ProductSubtitle","ProductMetrics","ProductValue","ProductTrend","EmptyState","EmptyStateText","Menu","MenuItem","ListItemIcon","ListItemText","MoreVertIcon","VisibilityIcon","IconButton","StyledIconButton","WidgetMenu","widgetId","onFullView","anchorEl","setAnchorEl","buttonId","menuId","handleClick","currentTarget","handleClose","handleFullView","size","onClose","MenuListProps","anchorOrigin","vertical","horizontal","transformOrigin","TopSellingProductsListComponent","maxProducts","onSortChange","onTitleClick","handleSortChange","newSort","formatValue","sortBy","getSubtitle","getTrendValue","getTrendDirection","startsWith","displayedProducts","rankLabel","trendLabel","imageUrl","toUpperCase","TopSellingProductsList","LineChart","Line","XAxis","YAxis","CartesianGrid","ResponsiveContainer","ConversionRateContainer","ChartHeader","TitleRow","ChartTitle","FilterDropdown","MetricDisplay","MetricValue","MetricTrend","FormulaDisplay","ChartContainer","TooltipContainer","TooltipLabel","TooltipValue","TooltipDetails","DAYS_MAP","DATE_RANGE_LABELS","getDaysFromDateRange","getDateRangeLabel","formatDateRangeLabel","formatShortDate","getMonth","getDate","AXIS_MONTH_MAP","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","formatAxisDate","dateStr","parts","formatDisplayDate","formatDateRange","start","end","formatISODate","toISOString","calculateDateRangeFromOption","dateRangeOption","today","year","getFullYear","month","startDate","endDate","CHART_MARGIN","AXIS_TICK","LINE_DOT","ACTIVE_DOT","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionData","conversionFilter","summaryRate","summaryChangePct","onFilterChange","handleFilterChange","newFilter","noDataText","noChangeText","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","stroke","strokeWidth","dot","activeDot","ConversionRateChart","SignupsContainer","Legend","LegendItem","LegendColor","LegendLabel","SERIES_COLORS","SignupsChartComponent","signupData","onViewChange","handleViewChange","newView","totalSignups","latestTotal","previousTotal","totalLabel","membersLabel","retailLabel","brandAffiliatesLabel","SignupsChart","PieChart","Pie","Cell","CategoriesContainer","ChartAndLegendContainer","ChartWrapper","DonutCenterOverlay","DonutCenterLabel","DonutCenterValue","DonutCenterTrend","LegendContainer","LegendInfo","LegendName","LegendValue","LegendPercentage","LegendValueWrapper","LegendTrendInline","LegendTrend","TopCategoriesPieChartComponent","sortedCategories","nextSortedCategories","nextTotalRevenue","sum","nextTrendDirection","nextFormattedTrend","totalRevenue","formattedTrend","getTrendGraphIcon","renderCustomLabel","cx","cy","midAngle","innerRadius","outerRadius","percentage","RADIAN","PI","radius","x","cos","y","sin","textAnchor","dominantBaseline","leadingTrim","nameKey","paddingAngle","labelLine","formatter","TopCategoriesPieChart","EMPTY_TOP_PRODUCTS","EMPTY_CONVERSION_DATA","EMPTY_SIGNUP_DATA","EMPTY_CATEGORIES","ShoppingDashboard","onProductSortChange","onSignupViewChange","onConversionFilterChange","onCategorySortChange","onProductsTitleClick","onConversionTitleClick","onSignupsTitleClick","onCategoriesToTitleClick","resolvedTopProducts","resolvedConversionData","resolvedSignupData","resolvedCategories","metrics","ArrowBackIcon","LanguageIcon","PageHeaderWrapper","BackButtonWrapper","BackButton","LeftSection","Title","DateRange","MobileDateRange","FilterWrapper","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","keys","options","buildMarketFilter","PageHeader","onBack","filters","renderFilterIcon","iconType","TableContainer","Table","TableHeader","TableHeaderCell","sortable","TableBody","TableRow","TableCell","EmptyTableCell","SortIconContainer","isActive","DataTable","onSort","sortColumn","sortDirection","getRowKey","handleSort","columnKey","handleKeyDown","getAriaSort","column","scope","colSpan","row","rowIndex","render","ChevronLeftIcon","ChevronRightIcon","PaginationContainer","PageButton","PageInfo","NavButton","Pagination","onPageChange","totalItems","handlePrevious","handleNext","action","pageNumbers","from","pages","startItem","endItem","goToPageLabel","page","PageContainer","MetricChartCardSection","shadows","MetricSection","palette","text","primary","success","main","secondary","ComparisonText","ChartSection","TableSection","withCard","MobileCardName","MobileCardSubtext","MobileCardDetail","MobileCardStatus","warning","ProductSku","MobileCardsContainer","DesktopTableContainer","MobileProductCard","divider","MobileCardHeader","MobileProductRank","MobileProductDetails","MobileProductName","MobileProductSku","MobileMetricsGrid","MobileMetricItem","MobileMetricLabel","MobileMetricValue","MOBILE_VIEWPORT_QUERY","useIsMobileViewport","noSsr","mapProductToRow","sku","padStart","ProductsFullView","setCurrentPage","setSortColumn","setSortDirection","isMobileView","handleBack","productRows","sortedRows","paginatedRows","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ComparisonTextMobile","OrderIdColumnCell","ConversionRateFullView","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","customerType","paginatedOrders","getChartColor","flexWrap","align","verticalAlign","wrapperStyle","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","ChartWithLegendWrapper","ChartLegendContainer","NameColumnCell","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","point","rawPoint","signupTotal","absoluteChange","first","last","round","hasSignupTrendData","paginatedSignups","connectNulls","signup","muiStyled","SummaryItemRow","SummaryItemInfo","SummaryItemName","SummaryItemSubtext","SummaryItemPercentage","TopSection","SummaryContainer","SummaryItem","ColorDot","dotColor","SummaryInfo","SummaryName","SummaryValue","SummaryPercentage","MobileCategoriesContainer","MobileCategoryCard","SummaryTrendIcon","CategoryNameColumnCell","CategoriesFullView","parseFloat","isNaN","totalRevenueTrendDirection","totalRevenueTrend","paginatedCategories","useTranslationResolver","translate","TranslationProvider","useTranslation","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","view","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","initialDateRange","initialMarket","initialProductSort","initialSignupView","initialConversionFilter","initialCategorySort","historyAdapter","historyStateKey","resetToDashboardOnMount","currentView","setCurrentView","hasIntraDashboardHistoryRef","setDateRange","setMarket","setProductSort","setSignupView","setConversionFilter","setCategorySort","resolvedOrders","resolvedSignups","updateView","readCurrentView","writeCurrentView","mode","nextState","nextLocation","replaceState","pushState","listen","nextView","handlePopState","handleOpenFullView","goBack","back","nextDateRange","nextMarket","handleProductSortChange","nextProductSort","handleSignupViewChange","nextSignupView","handleConversionFilterChange","nextFilter","handleCategorySortChange","nextSort","handleProductsTitleClick","handleConversionTitleClick","handleSignupsTitleClick","handleCategoriesTitleClick","PoDashboardContainer","TopChartsRow","StatsCardStack","BottomChartsRow","ProductOfferDashboardTranslationKeys","offersPurchased","trendUp","trendDown","trendNeutral","comparedTo","offerSort","overall","emptyState","topPerformingOffers","statsCard","conversionChart","topOffers","widgetMenu","filterDateRange","filterMarket","backButton","columnName","columnRevenue","columnPercentage","columnTrend","trendZero","TopPerformingOffersPieChartComponent","offers","sortedOffers","nextSortedOffers","offer","legendTrendDirection","TopPerformingOffersPieChart","EMPTY_TOP_OFFERS","ProductOfferDashboard","dashboardTitle","conversionSummaryRate","conversionSummaryChangePct","onOfferSortChange","onOffersTitleClick","resolvedTopOffers","selectedMarket","SummaryTrend","TableTrendCell","MobileOffersContainer","MobileOfferCard","MobileOfferHeader","MobileOfferName","MobileOfferMetricsGrid","MobileOfferMetricItem","MobileOfferMetricLabel","MobileOfferMetricValue","MobileOfferTrendValue","TopPerformingOffersFullView","paginatedOffers","columnTrendDirection","summaryTrendDirection","trendPercent","isProductOfferDashboardView","PoDashboardWithNavigation","allProducts","allOffers","conversionFullViewData","conversionFullViewRate","conversionFullViewChangePct","initialOfferSort","setOfferSort","resolvedAllProducts","resolvedAllOffers","handleOfferSortChange","handleOffersTitleClick","FilterContainer","FilterBar","mockStats","mockTopProducts","mockConversionData","setDate","mockConversionDataStandard","mockConversionDataSubscription","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","Ja","xo","Zo","Al","Vl","Eo","nt","lf","$g","pi","ma","fa","pe","lt","af","rr","ProductCarousel","Qa","L","Ap","Yo","Ha","xr","ja","Tt","Ir","tn","ta","ho","vg","ot","vi","Cc","rl","Bl","Hc","Aa","za","zl","Va","Ec","Qp","yc","tt","lp","er","nn","Ro","ip","sp","np","cf","an","al","ki","qt","Bo","wc","kg","Do"],"mappings":"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","sourcesContent":["var dp=Object.create;var sn=Object.defineProperty;var pp=Object.getOwnPropertyDescriptor;var cp=Object.getOwnPropertyNames;var up=Object.getPrototypeOf,gp=Object.prototype.hasOwnProperty;var ua=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var fp=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of cp(t))!gp.call(e,i)&&i!==o&&sn(e,i,{get:()=>t[i],enumerable:!(n=pp(t,i))||n.enumerable});return e};var mp=(e,t,o)=>(o=e!=null?dp(up(e)):{},fp(t||!e||!e.__esModule?sn(o,\"default\",{value:e,enumerable:!0}):o,e));var Ln=ua((Gf,Fn)=>{\"use strict\";var Tp=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";Fn.exports=Tp});var Vn=ua((jf,Nn)=>{\"use strict\";var Dp=Ln();function $n(){}function In(){}In.resetWarningCache=$n;Nn.exports=function(){function e(n,i,s,d,p,w){if(w!==Dp){var C=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw C.name=\"Invariant Violation\",C}}e.isRequired=e;function t(){return e}var o={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:In,resetWarningCache:$n};return o.PropTypes=o,o}});var zn=ua((Zf,An)=>{\"use strict\";An.exports=Vn()();var Yf,Jf});import{useState as hp}from\"react\";import{NsImage as xp}from\"@nuskin/foundation-ui-components\";import{styled as Ot}from\"@nuskin/foundation-theme\";var dn=Ot(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,pn=Ot(\"button\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n width: 240px;\n height: ${e=>e.isMobile?\"410px\":\"513px\"};\n overflow: hidden;\n cursor: pointer;\n border: 1px solid #ededed;\n background: var(--color-primary-n-10-primary-white, #fff);\n`,cn=Ot(\"div\")`\n width: '240px';\n height: '240px';\n background: ${e=>e.bgColor??\"#f5f5f5\"};\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 0;\n display: flex;\n align-items: normal;\n justify-content: center;\n position: relative;\n @media (max-width: 560px) {\n width: 200px;\n height: 200px;\n align-items: unset;\n }\n`,un=Ot(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,gn=Ot(\"div\")`\n width: 200px;\n margin-top: 16px;\n max-height: 66px;\n text-align: left;\n font-size: 16px;\n font-family: 'Inter', sans-serif;\n font-weight: 400;\n line-height: 22px;\n overflow: hidden;\n color: #666;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n @media (max-width: 560px) {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n margin-top: 5px;\n max-height: 54px;\n line-height: 18px;\n }\n`,ga=Ot(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,fn=Ot(\"button\")`\n width: 200px;\n height: 40px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0.14px;\n text-transform: none;\n justify-content: flex-start;\n padding-left: 31px;\n overflow: hidden;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n text-overflow: ellipsis;\n margin-top: 8px;\n margin-bottom: 10px;\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n\n color: ${e=>e.disabled?\"#999\":\"#fff\"};\n background-color: ${e=>e.disabled?\"#e0e0e0\":!e.isMobile&&e.isHovered?\"#888\":\"#000\"};\n border: ${e=>e.disabled?\"1px solid #ccc\":\"none\"};\n cursor: ${e=>e.disabled?\"not-allowed\":\"pointer\"};\n opacity: ${e=>e.disabled?.6:1};\n transition: ${e=>e.isMobile?\"none\":\"all 0.3s ease\"};\n\n @media (max-width: 560px) {\n margin: 5px 0;\n }\n`,mn=Ot(\"span\")`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${e=>e.disabled?.5:1};\n`;import{useMediaQuery as bp}from\"@mui/material\";import{jsx as dt,jsxs as hn}from\"react/jsx-runtime\";var yp=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:s,directSellerBadge:d,mySitePriceComponent:p,testId:w})=>{let[C,u]=hp(!1),x=bp(\"(max-width: 560px)\"),g=b=>{let f=b.target,c=t?.fallbackImage;c&&f.src!==c&&(f.src=c)};return hn(pn,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:x,children:[dt(cn,{bgColor:t?.bgColor,onError:g,children:t?.imageSrc?dt(xp,{\"data-testid\":w??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):dt(un,{alt:\"\"})}),dt(gn,{title:e,\"data-testid\":\"product-title\",children:e}),d&&dt(ga,{children:d}),dt(ga,{children:s}),dt(dn,{children:p}),n?.showButton&&hn(fn,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:x,isHovered:C,onClick:b=>{b.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!x&&!n?.disabled&&u(!0)},onMouseLeave:()=>{x||u(!1)},children:[dt(mn,{className:\"cart-icon\",disabled:n?.disabled,children:dt(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:dt(\"path\",{fillRule:\"evenodd\",clipRule:\"evenodd\",d:\"M0 1.86358C0 1.26109 0.488416 0.772675 1.09091 0.772675H3.48173C4.51054 0.772675 5.39955 1.49136 5.61511 2.49733L5.71309 2.95456H22.9091C23.245 2.95456 23.5622 3.10933 23.7689 3.37411C23.9757 3.63889 24.0489 3.98415 23.9674 4.31005L22.4053 10.5583C21.9197 12.5009 20.1743 13.8636 18.172 13.8636H8.05068L8.28444 14.9546H20.7273C21.3298 14.9546 21.8182 15.443 21.8182 16.0455C21.8182 16.648 21.3298 17.1364 20.7273 17.1364H19.6364H8.18182H7.40252C6.88811 17.1364 6.4436 16.777 6.33582 16.274L3.76449 4.27405L3.48173 2.95449H1.09091C0.488416 2.95449 0 2.46608 0 1.86358ZM8.18182 17.1364C6.97683 17.1364 6 18.1132 6 19.3182C6 20.5232 6.97683 21.5 8.18182 21.5C9.3868 21.5 10.3636 20.5232 10.3636 19.3182C10.3636 18.1132 9.3868 17.1364 8.18182 17.1364ZM19.6364 17.1364C18.4314 17.1364 17.4545 18.1132 17.4545 19.3182C17.4545 20.5232 18.4314 21.5 19.6364 21.5C20.8413 21.5 21.8182 20.5232 21.8182 19.3182C21.8182 18.1132 20.8413 17.1364 19.6364 17.1364ZM7.58317 11.6818H18.172C19.1732 11.6818 20.0459 11.0005 20.2887 10.0292L21.5119 5.13638H6.18062L7.58317 11.6818Z\",fill:n?.disabled?\"#999\":\"#ffffff\"})})}),n.buttonText||\"ADD TO CART\"]})]})},fa=yp;import{useCallback as On,useRef as Cp}from\"react\";import vp from\"react-slick\";import kp from\"@mui/material/useMediaQuery\";import{NsCarouselControl as Sp}from\"@nuskin/foundation-ui-components\";import{styled as Oe}from\"@nuskin/foundation-theme\";import No from\"@mui/material/Box\";import{NsTypography as wp}from\"@nuskin/foundation-ui-components\";var xn=Oe(No)`\n padding: 30px 0 60px;\n width: 100%;\n margin: auto;\n margin-top: 50px;\n position: relative;\n\n .slick-list {\n padding-left: 24px;\n padding-right: 24px;\n }\n .slick-slide {\n display: flex;\n justify-content: center;\n padding: 0 12px;\n box-sizing: border-box;\n }\n .slick-prev,\n .slick-next {\n display: none !important;\n }\n\n @media (max-width: 1200px) {\n max-width: 1024px;\n .slick-list {\n padding-left: 12px;\n padding-right: 12px;\n }\n .slick-slide {\n padding: 0 6px;\n }\n }\n @media (max-width: 700px) {\n max-width: 100vw;\n padding: 10px 0 50px;\n .slick-list {\n padding-left: 4px;\n padding-right: 4px;\n }\n .slick-slide {\n padding: 0 2px;\n }\n }\n @media (max-width: 560px) {\n padding: 10px 0 10px;\n margin-top: 25px;\n }\n`,bn=Oe(\"div\")`\n overflow-x: auto;\n display: flex;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n gap: 16px;\n padding: 0 8px 16px;\n width: 100%;\n box-sizing: border-box;\n\n &::-webkit-scrollbar {\n height: 6px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #007bff;\n border-radius: 10px;\n }\n`,yn=Oe(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,wn=Oe(No)`\n position: absolute;\n bottom: calc(100% + 1px);\n right: 1px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n`,Cn=Oe(No)`\n display: flex;\n align-items: center;\n margin-left: auto;\n margin-right: ${({$isMobile:e})=>e?0:\"24px\"};\n\n @media (max-width: 560px) {\n margin-left: 0;\n order: 2;\n }\n`,vn=Oe(No)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`,kn=Oe(No)`\n display: flex;\n align-items: center;\n opacity: ${({$isDisabled:e})=>e?.3:1};\n pointer-events: ${({$isDisabled:e})=>e?\"none\":\"auto\"};\n transition: opacity 0.3s ease;\n\n .carousal-prev-button,\n .carousal-next-button {\n transition: all 0.3s ease;\n border: 2px solid #000000;\n border-radius: 3px;\n padding: 9px;\n cursor: pointer;\n\n svg {\n transition: all 0.3s ease;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n\n &:hover {\n background-color: #f5f5f5;\n border: 2px solid #ddd;\n\n svg {\n opacity: 0.5;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n }\n }\n\n @media (max-width: 560px) {\n display: none;\n }\n`,Ff=Oe(\"div\")`\n @media (max-width: 560px) {\n overflow-y: hidden;\n scrollbar-width: thin;\n scrollbar-color: #007bff #eee;\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: #eee;\n }\n &::-webkit-scrollbar-thumb {\n background-color: red;\n border-radius: 8px;\n border: 2px solid #eee;\n }\n }\n`,Sn=Oe(wp)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`,Tn=Oe(\"a\")`\n color: ${({$disabled:e})=>e?\"#999999\":\"#000000\"};\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n text-decoration: none;\n border-bottom: 1px solid ${({$disabled:e})=>e?\"#999999\":\"#000000\"};\n padding-bottom: 4px;\n transition: all 0.3s ease;\n cursor: ${({$disabled:e})=>e?\"not-allowed\":\"pointer\"};\n pointer-events: ${({$disabled:e})=>e?\"none\":\"auto\"};\n opacity: ${({$disabled:e})=>e?.5:1};\n\n @media (max-width: 560px) {\n font-size: 14px;\n line-height: 18px;\n }\n\n &:hover {\n color: ${({$disabled:e})=>e?\"#999999\":\"#666666\"};\n border-bottom: 1px solid ${({$disabled:e})=>e?\"#999999\":\"#666666\"};\n cursor: ${({$disabled:e})=>e?\"not-allowed\":\"pointer\"};\n }\n`,Dn=Oe(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,Pn=Oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Rn=Oe(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,Mn=Oe(\"div\")`\n font-family: 'Lora';\n font-weight: 400;\n font-size: 22px;\n margin-left: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 13px;\n`;import{jsx as Qe,jsxs as Vo}from\"react/jsx-runtime\";function rr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:s=\"\",categoryName:d,emptyProductMessage:p=\"No Products Available For The Selected Category\",productsCountLabel:w=\"Products\",isInitialDataLoading:C,history:u}){let x=Cp(null),g=kp(\"(max-width: 560px)\"),b=On(()=>{x.current?.slickPrev()},[]),f=On(()=>{x.current?.slickNext()},[]),c=t??((h,P)=>Qe(fa,{productTitle:h.productTitle,imageDetails:h.imageDetails,button:h.button,onCardClick:h.onCardClick,productStatusBadge:h.productStatusBadge,directSellerBadge:h.directSeller,mySitePriceComponent:h.mySitePriceComponent},`${h.productTitle}-${P}`)),v={dots:!0,infinite:!0,speed:500,slidesToShow:Math.min(e?.length??0,4),slidesToScroll:4,swipe:!0,draggable:!0,arrows:!0,responsive:[{breakpoint:1320,settings:{slidesToShow:Math.min(e?.length??0,3),slidesToScroll:3}},{breakpoint:900,settings:{slidesToShow:Math.min(e?.length??0,2),slidesToScroll:2}},{breakpoint:600,settings:{slidesToShow:1,slidesToScroll:1,arrows:!1}}],...o},y=(e?.length??0)>v.slidesToShow,T=()=>e?.length===0&&!C?Qe(Dn,{children:p}):g?Qe(bn,{children:Qe(yn,{children:e.map((h,P)=>h&&c(h,P))})}):Qe(vp,{...v,ref:x,children:e.map((h,P)=>h&&c(h,P))});return Vo(xn,{children:[n&&Vo(wn,{children:[Vo(Pn,{children:[Vo(Rn,{children:[Qe(vn,{children:Vo(Sn,{variant:\"body-m\",children:[e?.length??0,\" \",w]})}),!g&&d&&Qe(Mn,{children:d})]}),Qe(Cn,{$isMobile:g,children:Qe(Tn,{$disabled:(e?.length??0)===0,onClick:h=>{h.preventDefault(),(e?.length??0)>0&&u&&u.push(s)},children:i})})]}),!g&&Qe(kn,{$isDisabled:!y,children:Qe(Sp,{prev:b,next:f,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),T()]})}import{useState as Yt,useEffect as ha,useCallback as $p}from\"react\";import{useMediaQuery as Ip}from\"@mui/material\";var ar=mp(zn());import*as En from\"react\";import Rp from\"@mui/material/Tabs\";import Mp from\"@mui/material/Tab\";import Hn from\"@mui/material/Box\";import{styled as Pp}from\"@nuskin/foundation-theme\";var Bn=Pp.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n background-color: #fff;\n .tabsStyle {\n display: flex;\n padding-top: 8.533px;\n flex-direction: column;\n align-items: flex-start;\n gap: 12.8px;\n border-right: 1px;\n border-color: divider;\n width: 200px;\n & .Mui-selected {\n font-weight: 700;\n font-size: 14px;\n font-family: 'inter', sans-serif;\n font-style: normal;\n font-height: 20px;\n border-radius: 4px;\n }\n & .MuiTabs-indicator {\n left: 0;\n background-color: #5b81a5;\n color: #5b81a5;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n }\n\n .tabContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n min-width: 100%;\n background-color: #fff;\n @media (max-width: 768px) {\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n }\n\n .tabStyle {\n align-items: flex-start;\n display: flex;\n text-align: left;\n font-size: 14px;\n font-family: 'inter' sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n padding: 1px;\n padding-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n text-transform: none;\n }\n @media (max-width: 768px) {\n flex-direction: row;\n\n .tabsStyle {\n width: 100%;\n border-right: none;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 0px;\n }\n\n .tabStyle {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 70px;\n padding: 8px 16px;\n text-align: center;\n margin: 4px;\n background-color: #fff;\n cursor: pointer;\n color: black;\n font-family: Inter;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n }\n\n .tabStyle.Mui-selected {\n background-color: #5b81a5;\n color: #ffffff !important;\n font-weight: 700;\n border-radius: 70px;\n }\n }\n .tabPanel {\n padding: 8px;\n text-align: left;\n }\n`;import{useMediaQuery as Op}from\"@mui/material\";import{jsx as co,jsxs as Fp}from\"react/jsx-runtime\";function Wn(e){let{children:t,value:o,index:n,...i}=e;return co(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&co(Hn,{className:\"tabPanel\",children:t})})}Wn.propTypes={children:ar.default.node,index:ar.default.number.isRequired,value:ar.default.number.isRequired};var ma=({itemArray:e,value:t,onChange:o})=>{let[n,i]=En.useState(0),s=Op(\"(max-width:768px)\"),d=t??n;return co(Bn,{children:Fp(Hn,{className:\"tabContainer\",children:[co(Rp,{orientation:s?\"horizontal\":\"vertical\",variant:\"scrollable\",value:d,onChange:(w,C)=>{o?o(w,C):i(C)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(w=>co(Mp,{label:w.label,className:\"tabStyle\"},w.categoryId))}),e.map(w=>co(Wn,{value:d,index:e.findIndex(C=>C.categoryId===w.categoryId),children:w.content},w.categoryId))]})})};import{NsSpinner as Np}from\"@nuskin/foundation-ui-components\";import{styled as uo}from\"@nuskin/foundation-theme\";var Lp=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",_n=uo(\"div\")`\n display: flex;\n flex-direction: ${({isMobile:e})=>e?\"column\":\"row\"};\n align-items: ${({isMobile:e})=>e?\"stretch\":\"flex-start\"};\n width: 100%;\n max-width: 1920px;\n min-height: ${Lp};\n margin: 0 auto;\n box-sizing: border-box;\n overflow: visible;\n background: #fff;\n padding: ${({isMobile:e})=>e?\"10px 16px 0px 16px\":\"50px 60px 0px 60px\"};\n\n @media (max-width: 768px) {\n padding: 10px 16px 0px 16px;\n min-height: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n padding: 30px 40px 0px 40px;\n gap: 20px;\n }\n\n transform: translateZ(0);\n will-change: auto;\n`,Kn=uo(\"div\")`\n min-width: ${({isMobile:e})=>e?\"100%\":\"auto\"};\n height: ${({isMobile:e})=>e?\"auto\":\"100%\"};\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n\n overflow-x: auto;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-width: 200px;\n margin-right: 20px;\n }\n`,Un=uo(\"div\")`\n flex: 1;\n min-width: 0;\n height: ${({isMobile:e})=>e?\"auto\":\"100%\"};\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n min-height: 300px;\n\n -webkit-overflow-scrolling: touch;\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-height: 400px;\n }\n\n contain: layout style paint;\n transform: translateZ(0);\n`,dm=uo(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n padding: 20px;\n\n @media (max-width: 768px) {\n min-height: 150px;\n padding: 16px;\n }\n`,Gn=uo(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 40px 20px;\n color: #666;\n font-size: 16px;\n\n @media (max-width: 768px) {\n padding: 20px 16px;\n font-size: 14px;\n }\n`,jn=uo(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as Jt,jsxs as zp}from\"react/jsx-runtime\";var Vp=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:s,fetchProducts:d,showCustomCategory:p=!1,emptyProductTabs:w=\"No tabs available\",emptyProductMessage:C,productsCountLabel:u,getCategoryId:x,history:g})=>{let b=Ip(\"(max-width:768px)\"),[f,c]=Yt(!0),[v,y]=Yt([]),[T,h]=Yt(!1),[P,M]=Yt(0),[W,O]=Yt([]),[I,U]=Yt(!1),[R,m]=Yt(!0),k=$p(()=>{let l=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');m(l.length===0)},[]);ha(()=>{I&&k()},[I,k]),ha(()=>{s().then(l=>{y(l),h(!0)})},[s]),ha(()=>{if(T)if(v.length>0){let l=v[P]?.categoryId;x&&x(l),U(!0),d(l).then(O).finally(()=>{U(!1),c(!1)})}else U(!1)},[v,P,d,T]);let S=v.map(l=>({label:l.label,content:\"\",categoryId:l.categoryId}));return zp(_n,{isMobile:b,$hasCategories:v.length>0,children:[p&&(S.length>0?Jt(Kn,{isMobile:b,children:Jt(ma,{itemArray:S,value:P,onChange:(l,D)=>M(D)})}):Jt(Gn,{children:w})),Jt(Un,{isMobile:b,children:I?Jt(jn,{children:R&&Jt(Np,{})}):Jt(rr,{isInitialDataLoading:f,entries:W,allEntryLabel:e,allEntryLink:t,renderEntry:o?l=>o({...l,productStatusBadge:l.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:v[P]?.label,emptyProductMessage:C,productsCountLabel:u,history:g})})]})},Ap=Vp;import{useState as ir,useEffect as Ca,useMemo as Wp}from\"react\";import{Typography as Ft,Box as Lt,useMediaQuery as _p,Tooltip as Kp}from\"@mui/material\";import{NsLink as Up,NsImage as si}from\"@nuskin/foundation-ui-components\";import{styled as kt}from\"@nuskin/foundation-theme\";import{Box as Ao}from\"@mui/material\";import{jsx as wa}from\"react/jsx-runtime\";var xa=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),Jn=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),Zn=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),Yn=e=>({...xa(e),paddingBottom:\"11px\",wordBreak:\"break-all\",overflowWrap:\"break-word\",paddingLeft:\"5px\",\"& a\":{color:\"inherit\",textDecoration:\"none\"},\"@media (max-width: 420px)\":{fontSize:\"11px\",lineHeight:\"15px\",paddingBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"10px\",lineHeight:\"14px\",paddingBottom:\"6px\"},\"@media (max-width: 375px)\":{fontSize:\"8px\",lineHeight:\"12px\",paddingBottom:\"4px\"}}),Bp=e=>({...Jn(e),marginBottom:\"11px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\",\"@media (max-width: 420px)\":{fontSize:\"11px\",lineHeight:\"14px\",marginBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"10px\",lineHeight:\"12px\",marginBottom:\"5px\"},\"@media (max-width: 375px)\":{fontSize:\"8px\",lineHeight:\"11px\",marginBottom:\"4px\"}}),qn=kt(e=>wa(Ao,{...e}))(({bannerProps:e,isCircularImage:t,hasWhiteBackground:o})=>({backgroundClip:\"border-box\",display:\"flex\",background:e?.backgroundColor??\"#383838\",position:\"relative\",overflow:\"hidden\",width:\"100%\",height:\"auto\",flexDirection:\"row\",alignItems:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"transform, opacity\",transform:\"translateZ(0)\",backfaceVisibility:\"hidden\",\"&.scrolled\":{top:0,left:0,right:0,boxShadow:\"0 2px 8px rgba(0,0,0,0.2)\",\".content\":{paddingTop:\"0\",justifyContent:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-title\":{fontSize:\"26px\",lineHeight:\"34px\",marginBottom:\"0\",fontStyle:\"normal\",fontWeight:\"400\",fontFamily:e?.headlineFont??\"Lora\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image\":{width:\"90px\",height:\"90px\",padding:t?\"2px\":\"0px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image\":{\"& > div\":{width:\"90px\",height:\"90px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}}},\".content\":{width:\"70%\",height:\"100%\",marginLeft:\"2%\",marginRight:\"auto\",display:\"flex\",flexDirection:\"column\",position:\"relative\",boxSizing:\"border-box\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image\":{width:\"252px\",height:\"252px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",padding:t?\"3px\":\"0px\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",\"& > div\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}},\".body-title\":{fontSize:\"32px\",lineHeight:\"38px\",marginBottom:\"8px\",fontWeight:\"400\",color:o?\"#000000\":\"#FFFFFF\",overflow:\"hidden\",whiteSpace:\"nowrap\",textOverflow:\"ellipsis\",fontFamily:e?.headlineFont??\"Lora\",paddingLeft:\"5px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-text\":{fontSize:\"16px\",marginBottom:\"12px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"22px\",color:o?\"#000000\":\"#FFFFFF\",fontFamily:e?.paragraphFont??\"inherit\",display:\"-webkit-box\",WebkitBoxOrient:\"vertical\",overflow:\"hidden\",WebkitLineClamp:3,textOverflow:\"ellipsis\",paddingLeft:\"5px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\"},\".social-media\":{display:\"flex\",flexDirection:\"column\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\"},\".email-text\":xa(o),\".phone-text\":xa(o),\".social-title-text\":{...Jn(o),marginBottom:\"8px\"},\".social-icons\":{...Zn(),paddingBottom:\"8px\"}})),Qn=kt(e=>wa(Ao,{...e}))(({bannerProps:e,isCircularImage:t,hasWhiteBackground:o})=>({backgroundClip:\"border-box\",display:\"flex\",background:e?.backgroundColor??\"#383838\",position:\"relative\",overflow:\"hidden\",width:\"100%\",flexDirection:\"column\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"transform, opacity\",transform:\"translateZ(0)\",backfaceVisibility:\"hidden\",\"&.scrolled\":{top:0,left:0,right:0,boxShadow:\"0 2px 8px rgba(0,0,0,0.2)\",\".content-mobile\":{paddingTop:\"5px\",width:\"60%\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-title-mobile\":{fontSize:\"18px\",lineHeight:\"28px\",marginBottom:\"0\",fontStyle:\"normal\",fontWeight:\"400\",fontFamily:e?.headlineFont??\"Lora\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image-mobile\":{width:\"75px\",height:\"75px\",padding:t?\"2px\":\"0px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image-mobile\":{\"& > div\":{width:\"75px !important\",height:\"75px !important\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}}},\".image-content-mobile\":{display:\"flex\",flexDirection:\"row\",width:\"100%\",justifyContent:\"center\",alignItems:\"center\"},\".content-mobile\":{width:\"55%\",height:\"100%\",paddingTop:\"10px\",paddingRight:\"10px\",marginLeft:\"8px\",marginRight:\"auto\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",position:\"relative\",boxSizing:\"border-box\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\"@media (max-width: 420px)\":{paddingTop:\"8px\",width:\"100%\"},\"@media (max-width: 400px)\":{paddingTop:\"6px\",width:\"100%\",height:\"100%\"},\"@media (max-width: 375px)\":{paddingTop:\"4px\",width:\"100%\",height:\"100%\"}},\".bg-image-mobile\":{width:\"144px\",height:\"144px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",objectFit:\"cover\",objectPosition:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",padding:t?\"2px\":\"0px\",\"@media (max-width: 420px)\":{width:\"120px\",height:\"120px\"},\"@media (max-width: 400px)\":{width:\"112px\",height:\"112px\"},\"@media (max-width: 375px)\":{width:\"90px\",height:\"90px\"}},\".placeholder-image-mobile\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",\"& > div\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",width:\"144px\",height:\"144px\",\"@media (max-width: 420px)\":{width:\"120px\",height:\"120px\"},\"@media (max-width: 400px)\":{width:\"110px !important\",height:\"110px !important\"},\"@media (max-width: 375px)\":{width:\"90px\",height:\"90px\"}}},\".body-title-mobile\":{fontSize:\"22px\",lineHeight:\"28px\",marginBottom:\"13px\",fontWeight:\"400\",color:o?\"#000000\":\"#FFFFFF\",fontStyle:\"normal\",overflow:\"hidden\",whiteSpace:\"nowrap\",textOverflow:\"ellipsis\",fontFamily:e?.headlineFont??\"Lora\",paddingLeft:\"5px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\"@media (max-width: 420px)\":{fontSize:\"16px\",lineHeight:\"24px\",marginBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"16px\",lineHeight:\"22px\",marginBottom:\"6px\"},\"@media (max-width: 375px)\":{fontSize:\"14px\",lineHeight:\"20px\",marginBottom:\"4px\"}},\".body-text-mobile\":{fontSize:\"14px\",padding:\"20px 25px 20px 25px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"20px\",color:\"#252525\",backgroundColor:\"#E0E0E0\",fontFamily:e?.paragraphFont??\"inherit\",transition:\"all 0.25s cubic-bezier(0.4, 0, 0.2, 1)\",opacity:1,transform:\"translateY(0)\"},\".expandable-description-mobile\":{backgroundColor:\"#E0E0E0\",position:\"relative\"},\".description-content-mobile\":{fontSize:\"14px\",padding:\"10px 15px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"20px\",color:\"#252525\",fontFamily:e?.paragraphFont??\"inherit\",transition:\"max-height 0.3s ease-in-out, opacity 0.3s ease-in-out\",overflow:\"hidden\",position:\"relative\",\"&.collapsed\":{maxHeight:\"50px\",display:\"-webkit-box\",WebkitLineClamp:2,WebkitBoxOrient:\"vertical\",\"&::after\":{content:'\"\"',position:\"absolute\",bottom:0,left:0,right:0,height:\"20px\",background:\"linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)\",pointerEvents:\"none\"}},\"&.expanded\":{maxHeight:\"none\",whiteSpace:\"normal\",display:\"block\",\"&::after\":{display:\"none\"}}},\".email-text-mobile\":Yn(o),\".phone-text-mobile\":Yn(o),\".social-title-text-mobile\":Bp(o),\".social-icons-mobile\":{...Zn(),paddingBottom:\"10px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\",\"& img\":{width:\"24px\",height:\"24px\",\"@media (max-width: 400px)\":{width:\"20px\",height:\"20px\"},\"@media (max-width: 375px)\":{width:\"18px\",height:\"18px\"}},\"@media (max-width: 420px)\":{paddingBottom:\"8px\"},\"@media (max-width: 400px)\":{paddingBottom:\"4px\"},\"@media (max-width: 375px)\":{paddingBottom:\"3px\"}}})),Xn=kt(Ao)({display:\"flex\",gap:\"12px\",marginBottom:\"16px\",paddingLeft:\"5px\",\"&.mobile-badges\":{flexDirection:\"column\",gap:\"8px\",marginBottom:\"12px\"},\"&.tablet-badges\":{flexDirection:\"row\",gap:\"12px\",marginBottom:\"8px\"}}),ba=kt(e=>wa(Ao,{...e}))(({hasWhiteBackground:e})=>({backgroundColor:\"rgba(255, 255, 255, 0.2)\",backdropFilter:\"blur(10px)\",borderRadius:\"20px\",padding:\"8px 16px\",display:\"flex\",alignItems:\"center\",gap:\"4px\",border:\"1px solid rgba(255, 255, 255, 0.3)\",transition:\"all 0.3s ease\",\"&.mobile-badge\":{padding:\"6px 12px\",borderRadius:\"16px\",fontSize:\"12px\"},\"&.tablet-badge\":{padding:\"8px 16px\",borderRadius:\"20px\",fontSize:\"14px\"},\"&.total-savings-badge\":{backgroundColor:\"#4A6987\",border:\"none\",borderRadius:\"8px\",padding:\"8px 16px\",gap:\"4px\",minHeight:\"32px\",backdropFilter:\"none\",\".badge-value\":{color:\"#FFFFFF\"},\"&:hover\":{backgroundColor:\"#4A6987\",transform:\"none\",boxShadow:\"none\"}},\"&.expiration-badge\":{borderRadius:\"8px\",padding:\"8px 16px\",gap:\"4px\",minHeight:\"32px\"},\"&:hover\":{backgroundColor:\"rgba(255, 255, 255, 0.3)\",transform:\"translateY(-1px)\",boxShadow:\"0 4px 12px rgba(0, 0, 0, 0.1)\"},\".badge-text\":{color:e?\"#000000\":\"#FFFFFF\",fontWeight:\"400\",opacity:.9},\".badge-value\":{color:e?\"#000000\":\"#FFFFFF\",fontWeight:\"600\"}})),ei=kt(\"button\")({backgroundColor:\"#E0E0E0\",border:\"1px solid #252525\",borderRadius:\"10px\",cursor:\"pointer\",width:\"40px\",height:\"20px\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",margin:\"10px auto 5px auto\",transition:\"all 0.2s ease\",\"& .arrow-icon-mobile\":{transition:\"transform 0.3s ease\",\"&.expanded\":{transform:\"rotate(180deg)\"}}}),ti=kt(Ao)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`,oi=kt(\"span\")`\n line-height: 0.5;\n`,ri=kt(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),ya=kt(\"span\")({});import{Box as Ep}from\"@mui/material\";import{jsx as Zt,jsxs as Hp}from\"react/jsx-runtime\";var ai=({width:e,height:t,backgroundColor:o})=>Zt(Ep,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:Zt(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:Hp(\"g\",{id:\"ns_logomark\",children:[Zt(\"path\",{id:\"Vector\",d:\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\",fill:\"#252525\"}),Zt(\"path\",{id:\"Vector_2\",d:\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\",fill:\"#252525\"}),Zt(\"path\",{id:\"Vector_3\",d:\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\",fill:\"#252525\"}),Zt(\"path\",{id:\"Vector_4\",d:\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\",fill:\"#252525\"}),Zt(\"path\",{id:\"Vector_5\",d:\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\",fill:\"#252525\"})]})})});import{jsx as ni}from\"react/jsx-runtime\";var ii=({width:e=16,height:t=16,className:o=\"\"})=>ni(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:ni(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function nr(e){if(typeof window>\"u\")return;let t=window.location.href,o={...e},n=t.includes(\"personal-offer\")?\"postorefront_\":\"mysite_\";o.event=n+e.event;try{window.dataLayer||(console.error(\"GTM dataLayer not available, but event logged\"),window.dataLayer=[]),window.dataLayer.push(o)}catch(i){console.error(\"Failed to track GTM event:\",i)}}import{Fragment as ci,jsx as Z,jsxs as Xe}from\"react/jsx-runtime\";var li=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?Z(oi,{tabIndex:0,children:Z(si,{className:o,src:e.imageSrc,alt:e.imageAlt})}):Z(Lt,{className:n,children:Z(ai,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},di=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let s=o?\"mobile-badge\":\"tablet-badge\";return Xe(Xn,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&Z(ba,{className:`${s} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:Z(ya,{className:\"badge-value\",children:i})}),t&&Z(ba,{className:`${s} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:Z(ya,{className:\"badge-value\",children:t})})]})},Gp=(e,t,o,n,i)=>{let{shopTitle:s,socialTitleText:d,email:p,showBadges:w,expirationDate:C,phone:u,totalSavings:x}=e;return Xe(Lt,{className:\"content-mobile\",children:[Z(Ft,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title-mobile\",children:s}),!t&&Xe(ci,{children:[Z(Ft,{tabIndex:d?.trim()?0:-1,className:\"social-title-text-mobile\",children:d}),p?.trim()&&lr(\"email\",p,\"email-text-mobile\"),u?.trim()&&lr(\"phone\",u,\"phone-text-mobile\"),Z(Lt,{className:\"social-icons-mobile\",children:o}),di(w,C??\"\",n,i,x)]})]})},jp=(e,t,o,n,i)=>{let{shopTitle:s,shopDescription:d,socialTitleText:p,email:w,phone:C,showBadges:u,expirationDate:x,totalSavings:g}=e;return Xe(Lt,{className:\"content\",children:[Z(Ft,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title\",children:s}),!t&&Xe(ci,{children:[d?.length>480?Z(Kp,{title:d,arrow:!0,children:Z(Ft,{tabIndex:d?.trim()?0:-1,className:\"body-text\",children:d})}):Z(Ft,{tabIndex:d?.trim()?0:-1,className:\"body-text\",children:d}),Xe(Lt,{className:\"social-media\",children:[Z(Ft,{tabIndex:p?.trim()?0:-1,className:\"social-title-text\",children:p}),Xe(Lt,{className:\"social-icons\",children:[o,w?.trim()&&lr(\"email\",w,\"email-text\"),C?.trim()&&lr(\"phone\",C,\"phone-text\")]})]}),di(u,x??\"\",n,i,g)]})]})},Yp=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),s=i.getContext(\"2d\");if(!s)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,s.drawImage(n,0,0);let p=[s.getImageData(0,0,1,1).data,s.getImageData(n.width-1,0,1,1).data,s.getImageData(0,n.height-1,1,1).data,s.getImageData(n.width-1,n.height-1,1,1).data].every(w=>Array.prototype.slice.call(w)[3]<10);t(p)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),Jp=e=>{if(!e)return!1;let t=e.replace(\"#\",\"\").toLowerCase();if(!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(t))return!1;let o=t;(t.length===3||t.length===4)&&(o=t.split(\"\").map(p=>p+p).join(\"\"));let n=Number.parseInt(o.substring(0,2),16),i=Number.parseInt(o.substring(2,4),16),s=Number.parseInt(o.substring(4,6),16),d=220;return n>=d&&i>=d&&s>=d},Zp=(e,t)=>({onClick:()=>{nr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),nr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),lr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=Zp(e,t);return Z(Ft,{className:o,children:Z(ri,{href:`${n}${t}`,...i,children:t})})};function pi({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:s,phone:d,bannerProps:p,socialIcons:w,expirationDate:C,showBadges:u=!1,totalSavings:x}){let g=_p(\"(max-width: 560px)\"),[b,f]=ir(!1),[c,v]=ir(!1),[y,T]=ir(!1),[h,P]=ir(!1),M=()=>{v(!c)};Ca(()=>{(async()=>{if(i?.imageSrc){let k=await Yp(i.imageSrc);P(k)}else P(!1)})()},[i?.imageSrc]),Ca(()=>{T(Jp(p?.backgroundColor))},[p?.backgroundColor]),Ca(()=>{let m,k=window.scrollY,S=!1,l=!1,D=0,B=J=>{let Je=Date.now();if(S!==J&&!l){if(Je-D<100)return;l=!0,S=J,D=Je,J&&v(!1),clearTimeout(m),f(J),m=setTimeout(()=>{l=!1,J&&window.scrollY<15&&window.scrollTo({top:g?20:30,behavior:\"smooth\"})},300)}},ce=()=>{let J=window.scrollY;if(l){k=J;return}if(Math.abs(J-k)<.5)return;let He=J>k,so=g?15:25,po=g?8:12;He&&J>so&&!S?B(!0):!He&&J<po&&S&&B(!1),k=J},te=()=>{let J=window.scrollY,He=J>(g?5:10);S=He,f(He),k=J,D=Date.now()},Re=null,wt=0,Ee=()=>{Re||Date.now()-wt<16||(Re=requestAnimationFrame(()=>{ce(),wt=Date.now(),Re=null}))};return te(),window.addEventListener(\"scroll\",Ee,{passive:!0}),()=>{window.removeEventListener(\"scroll\",Ee),Re&&cancelAnimationFrame(Re),clearTimeout(m)}},[g]);let W=Wp(()=>w?.map((m,k)=>Z(ti,{onClick:l=>{l.preventDefault(),nr({event:\"social_click\",social_platform:m.type,social_url:m.url,click_element:\"social_icon\"}),window.open(m.url,\"_blank\")},children:Z(Up,{href:m.url,target:\"_blank\",children:Z(si,{src:`https://www.google.com/s2/favicons?domain=${m?.url}&sz=24`,alt:`${m.type} icon`,width:\"24\",height:\"24\"},m?.type+k)})},m?.type+k)),[w]),O=`${e} ${b?\"scrolled\":\"\"}`,I={shopTitle:t,shopDescription:o,socialTitleText:n,email:s,phone:d,showBadges:u,expirationDate:C,totalSavings:x},U=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,R=g&&o&&o.length>U();return g?Xe(Qn,{className:O,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:h,hasWhiteBackground:y,children:[Xe(Lt,{className:\"image-content-mobile\",children:[li(i,p??{},\"bg-image-mobile\"),Gp(I,b,W,g,y)]}),!b&&Xe(Lt,{className:\"expandable-description-mobile\",children:[Z(Ft,{className:`description-content-mobile ${c||!R?\"expanded\":\"collapsed\"}`,children:o}),R&&Z(ei,{onClick:M,children:Z(ii,{width:16,height:16,className:`arrow-icon-mobile ${c?\"expanded\":\"\"}`})})]})]}):Xe(qn,{className:O,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:h,hasWhiteBackground:y,children:[li(i,p??{},\"bg-image\"),jp(I,b,W,g,y)]})}import{styled as zo}from\"@nuskin/foundation-theme\";var va=zo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 32px;\n }\n`,ui=zo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,gi=zo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,ka=zo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`,fi=zo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import ec from\"@mui/icons-material/CalendarToday\";import tc from\"@mui/icons-material/Public\";import{NsSpinner as oc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as qp,styled as Ke}from\"@nuskin/foundation-theme\";var{getGenomeColor:et}=qp,mi=Ke(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>et(e,\"N20\")};\n border-radius: 12px;\n min-height: 64px;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px 32px;\n }\n`,hi=Ke(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,xi=Ke(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>et(e,\"N100\")};\n margin: 0;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n\n @media (min-width: 1080px) {\n font-size: 16px;\n }\n`,bi=Ke(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>et(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,yi=Ke(\"div\")`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,Sa=Ke(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,Ta=Ke(\"label\")`\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n color: ${({theme:e})=>et(e,\"N80\")};\n white-space: nowrap;\n display: none;\n\n @media (min-width: 1080px) {\n display: block;\n }\n`,Da=Ke(\"select\")`\n display: flex;\n align-items: center;\n gap: 12px;\n height: 40px;\n padding: 8px 12px;\n background-color: transparent;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>et(e,\"N70\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;charset=UTF-8,%3csvg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M5.625 7.3125L9 10.6875L12.375 7.3125\" stroke=\"%235f5f5f\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/%3e%3c/svg%3e');\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 32px;\n min-width: auto;\n\n &:hover {\n background-color: ${({theme:e})=>et(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>et(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>et(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n @media (min-width: 768px) {\n min-width: 160px;\n }\n\n @media (min-width: 1080px) {\n background-color: ${({theme:e})=>et(e,\"N10\")};\n border: 1px solid ${({theme:e})=>et(e,\"N40\")};\n border-radius: 8px;\n min-width: 180px;\n }\n`,Pa=Ke(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>et(e,\"N70\")};\n\n svg {\n width: 16px;\n height: 16px;\n }\n`,wi=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n overflow: hidden;\n\n svg,\n img,\n > * {\n width: 28px !important;\n height: 28px !important;\n max-width: 28px;\n max-height: 28px;\n }\n`,Ci=Ke(\"div\")`\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,qm=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var sr;function Bo(e){sr=e}function Qp(){return sr}function qt(e){if(!sr)return e.fallback;let t;try{t=sr(e.key,e.fallback)}catch{t=void 0}return typeof t==\"string\"&&t.length>0?t:e.fallback}var r={title:{key:\"shoppingDashboard.title\",fallback:\"Shop Performance\"},error:{key:\"shoppingDashboard.error\",fallback:\"Error loading dashboard\"},stats:{revenue:{key:\"shoppingDashboard.stats.revenue\",fallback:\"Total Revenue\"},volume:{key:\"shoppingDashboard.stats.volume\",fallback:\"Volume\"},visits:{key:\"shoppingDashboard.stats.visits\",fallback:\"Site Visits\"},subtitle:{dcSv:{key:\"shoppingDashboard.stats.subtitle.dcSv\",fallback:\"DC-SV\"},conversionRate:{key:\"shoppingDashboard.stats.subtitle.conversionRate\",fallback:\"Conversion Rate\"}},trend:{increased:{key:\"shoppingDashboard.stats.trend.increased\",fallback:\"increased\"},decreased:{key:\"shoppingDashboard.stats.trend.decreased\",fallback:\"decreased\"},unchanged:{key:\"shoppingDashboard.stats.trend.unchanged\",fallback:\"unchanged\"}},details:{key:\"shoppingDashboard.stats.details\",fallback:\"details\"}},filter:{dateRange:{label:{key:\"shoppingDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"shoppingDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"shoppingDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"shoppingDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"shoppingDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},dateRangeLabel:{key:\"shoppingDashboard.filter.dateRangeLabel\",fallback:\"Date Range\"},market:{label:{key:\"shoppingDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"shoppingDashboard.filter.market.all\",fallback:\"All Markets\"}},marketLabel:{key:\"shoppingDashboard.filter.marketLabel\",fallback:\"Market\"},productSort:{label:{key:\"shoppingDashboard.filter.productSort.label\",fallback:\"Sort By\"},units:{key:\"shoppingDashboard.filter.productSort.units\",fallback:\"Units\"},revenue:{key:\"shoppingDashboard.filter.productSort.revenue\",fallback:\"Revenue\"},volume:{key:\"shoppingDashboard.filter.productSort.volume\",fallback:\"Volume\"},byUnits:{key:\"shoppingDashboard.filter.productSort.byUnits\",fallback:\"By: Units\"},byRevenue:{key:\"shoppingDashboard.filter.productSort.byRevenue\",fallback:\"By: Revenue\"},byVolume:{key:\"shoppingDashboard.filter.productSort.byVolume\",fallback:\"By: Volume\"}},signupView:{label:{key:\"shoppingDashboard.filter.signupView.label\",fallback:\"Show\"},all:{key:\"shoppingDashboard.filter.signupView.all\",fallback:\"All\"},members:{key:\"shoppingDashboard.filter.signupView.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.filter.signupView.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.filter.signupView.brandAffiliates\",fallback:\"Brand Affiliates\"},showAll:{key:\"shoppingDashboard.filter.signupView.showAll\",fallback:\"Show: All\"},showMembers:{key:\"shoppingDashboard.filter.signupView.showMembers\",fallback:\"Show: Members\"},showRetail:{key:\"shoppingDashboard.filter.signupView.showRetail\",fallback:\"Show: Retail\"},showBrandAffiliates:{key:\"shoppingDashboard.filter.signupView.showBrandAffiliates\",fallback:\"Show: Brand Affiliates\"}},conversionType:{all:{key:\"shoppingDashboard.filter.conversionType.all\",fallback:\"All\"},standard:{key:\"shoppingDashboard.filter.conversionType.standard\",fallback:\"Standard\"},subscription:{key:\"shoppingDashboard.filter.conversionType.subscription\",fallback:\"Subscription\"}},categorySort:{byRevenue:{key:\"shoppingDashboard.filter.categorySort.byRevenue\",fallback:\"By: Revenue\"},byTrend:{key:\"shoppingDashboard.filter.categorySort.byTrend\",fallback:\"By: Trend\"}}},widget:{topProducts:{title:{key:\"shoppingDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},viewAll:{key:\"shoppingDashboard.widget.topProducts.viewAll\",fallback:\"View All Products\"},units:{key:\"shoppingDashboard.widget.topProducts.units\",fallback:\"Units\"},revenue:{key:\"shoppingDashboard.widget.topProducts.revenue\",fallback:\"Revenue\"},loading:{key:\"shoppingDashboard.widget.topProducts.loading\",fallback:\"Loading products...\"},empty:{key:\"shoppingDashboard.widget.topProducts.empty\",fallback:\"No products available\"},ariaLabel:{key:\"shoppingDashboard.widget.topProducts.ariaLabel\",fallback:\"Top Selling Products widget\"},titleAriaLabel:{key:\"shoppingDashboard.widget.topProducts.titleAriaLabel\",fallback:\"Click to view full top products details page\"},sortAriaLabel:{key:\"shoppingDashboard.widget.topProducts.sortAriaLabel\",fallback:\"Sort products by\"},noImageAriaLabel:{key:\"shoppingDashboard.widget.topProducts.noImageAriaLabel\",fallback:\"No image available\"},unitsSuffix:{key:\"shoppingDashboard.widget.topProducts.unitsSuffix\",fallback:\"units\"},revenueSuffix:{key:\"shoppingDashboard.widget.topProducts.revenueSuffix\",fallback:\"revenue\"},dcSvSuffix:{key:\"shoppingDashboard.widget.topProducts.dcSvSuffix\",fallback:\"DC-SV\"},rank:{key:\"shoppingDashboard.widget.topProducts.rank\",fallback:\"Rank\"},trend:{key:\"shoppingDashboard.widget.topProducts.trend\",fallback:\"Trend\"}},conversionRate:{title:{key:\"shoppingDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},formula:{key:\"shoppingDashboard.widget.conversionRate.formula\",fallback:\"Orders \\xF7 Site visits\"},comparison:{key:\"shoppingDashboard.widget.conversionRate.comparison\",fallback:\"compared to this time last month\"},chartAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.chartAriaLabel\",fallback:\"Conversion Rate chart showing daily rates\"},titleAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.titleAriaLabel\",fallback:\"Click to view full conversion rate details page\"},filterAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.filterAriaLabel\",fallback:\"Filter conversion rate by customer type\"},noData:{key:\"shoppingDashboard.widget.conversionRate.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.widget.conversionRate.noChange\",fallback:\"No change\"},tooltipOrders:{key:\"shoppingDashboard.widget.conversionRate.tooltipOrders\",fallback:\"orders\"},tooltipVisits:{key:\"shoppingDashboard.widget.conversionRate.tooltipVisits\",fallback:\"visits\"},ordersPerSiteVisits:{key:\"shoppingDashboard.widget.conversionRate.ordersPerSiteVisits\",fallback:\"Orders / Site Visits\"}},signups:{title:{key:\"shoppingDashboard.widget.signups.title\",fallback:\"Sign-ups\"},total:{key:\"shoppingDashboard.widget.signups.total\",fallback:\"Total\"},members:{key:\"shoppingDashboard.widget.signups.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.widget.signups.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.widget.signups.brandAffiliates\",fallback:\"Brand Affiliates\"},chartAriaLabel:{key:\"shoppingDashboard.widget.signups.chartAriaLabel\",fallback:\"Signups multi-line chart showing Total, Members, Retail, and Brand Affiliates\"},titleAriaLabel:{key:\"shoppingDashboard.widget.signups.titleAriaLabel\",fallback:\"Click to view full signups details page\"},filterAriaLabel:{key:\"shoppingDashboard.widget.signups.filterAriaLabel\",fallback:\"Filter signups view\"},noData:{key:\"shoppingDashboard.widget.signups.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.widget.signups.noChange\",fallback:\"No change\"},totalSignupsInPeriod:{key:\"shoppingDashboard.widget.signups.totalSignupsInPeriod\",fallback:\"Total sign-ups in period\"},noTrendData:{key:\"shoppingDashboard.widget.signups.noTrendData\",fallback:\"No sign-up trend data available.\"}},topCategories:{title:{key:\"shoppingDashboard.widget.topCategories.title\",fallback:\"Top Categories\"},revenue:{key:\"shoppingDashboard.widget.topCategories.revenue\",fallback:\"Revenue\"},units:{key:\"shoppingDashboard.widget.topCategories.units\",fallback:\"Units\"},empty:{key:\"shoppingDashboard.widget.topCategories.empty\",fallback:\"No category data available\"},chartAriaLabel:{key:\"shoppingDashboard.widget.topCategories.chartAriaLabel\",fallback:\"Top Categories donut chart showing revenue distribution by category\"},titleAriaLabel:{key:\"shoppingDashboard.widget.topCategories.titleAriaLabel\",fallback:\"Click to view full categories details page\"},sortAriaLabel:{key:\"shoppingDashboard.widget.topCategories.sortAriaLabel\",fallback:\"Sort categories by\"}},menu:{ariaLabel:{key:\"shoppingDashboard.widget.menu.ariaLabel\",fallback:\"widget options\"},fullView:{key:\"shoppingDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{backToDashboard:{key:\"shoppingDashboard.navigation.backToDashboard\",fallback:\"Back to Dashboard\"},backAriaLabel:{key:\"shoppingDashboard.navigation.backAriaLabel\",fallback:\"Back to dashboard\"}},ariaLabel:{dashboard:{key:\"shoppingDashboard.ariaLabel.dashboard\",fallback:\"Shopping Dashboard\"},statsRow:{key:\"shoppingDashboard.ariaLabel.statsRow\",fallback:\"Key performance metrics\"},dashboardFilters:{key:\"shoppingDashboard.ariaLabel.dashboardFilters\",fallback:\"Dashboard filters\"},loadingDashboard:{key:\"shoppingDashboard.ariaLabel.loadingDashboard\",fallback:\"Loading dashboard data\"},dateRangeFilter:{key:\"shoppingDashboard.ariaLabel.dateRangeFilter\",fallback:\"Date range filter, currently selected:\"},marketFilter:{key:\"shoppingDashboard.ariaLabel.marketFilter\",fallback:\"Market filter, currently selected:\"},filterSuffix:{key:\"shoppingDashboard.ariaLabel.filterSuffix\",fallback:\"filter\"}},fullView:{signups:{columns:{id:{key:\"shoppingDashboard.fullView.signups.columns.id\",fallback:\"ID\"},name:{key:\"shoppingDashboard.fullView.signups.columns.name\",fallback:\"Name\"},date:{key:\"shoppingDashboard.fullView.signups.columns.date\",fallback:\"Date\"},type:{key:\"shoppingDashboard.fullView.signups.columns.type\",fallback:\"Type\"},email:{key:\"shoppingDashboard.fullView.signups.columns.email\",fallback:\"Email\"},status:{key:\"shoppingDashboard.fullView.signups.columns.status\",fallback:\"Status\"}},detailsTitle:{key:\"shoppingDashboard.fullView.signups.detailsTitle\",fallback:\"Signup Details\"}},conversionRate:{columns:{orderId:{key:\"shoppingDashboard.fullView.conversionRate.columns.orderId\",fallback:\"Order ID\"},date:{key:\"shoppingDashboard.fullView.conversionRate.columns.date\",fallback:\"Date\"},customer:{key:\"shoppingDashboard.fullView.conversionRate.columns.customer\",fallback:\"Customer\"},type:{key:\"shoppingDashboard.fullView.conversionRate.columns.type\",fallback:\"Type\"},items:{key:\"shoppingDashboard.fullView.conversionRate.columns.items\",fallback:\"Items\"},total:{key:\"shoppingDashboard.fullView.conversionRate.columns.total\",fallback:\"Order Total\"},bv:{key:\"shoppingDashboard.fullView.conversionRate.columns.bv\",fallback:\"BV\"},orderTotal:{key:\"shoppingDashboard.fullView.conversionRate.columns.orderTotal\",fallback:\"Order Total\"},totalSv:{key:\"shoppingDashboard.fullView.conversionRate.columns.totalSv\",fallback:\"Total SV\"}},orderDetailsTitle:{key:\"shoppingDashboard.fullView.conversionRate.orderDetailsTitle\",fallback:\"Order Details\"},notAvailable:{key:\"shoppingDashboard.fullView.conversionRate.notAvailable\",fallback:\"N/A\"}},products:{columns:{rank:{key:\"shoppingDashboard.fullView.products.columns.rank\",fallback:\"#\"},product:{key:\"shoppingDashboard.fullView.products.columns.product\",fallback:\"Product\"},unitsSold:{key:\"shoppingDashboard.fullView.products.columns.unitsSold\",fallback:\"Units Sold\"},revenue:{key:\"shoppingDashboard.fullView.products.columns.revenue\",fallback:\"Revenue\"},volume:{key:\"shoppingDashboard.fullView.products.columns.volume\",fallback:\"Volume (DC-SV)\"}},skuPrefix:{key:\"shoppingDashboard.fullView.products.skuPrefix\",fallback:\"SKU\"},noProducts:{key:\"shoppingDashboard.fullView.products.noProducts\",fallback:\"No products available.\"}},categories:{columns:{category:{key:\"shoppingDashboard.fullView.categories.columns.category\",fallback:\"Category\"},revenue:{key:\"shoppingDashboard.fullView.categories.columns.revenue\",fallback:\"Revenue\"},percentOfTotal:{key:\"shoppingDashboard.fullView.categories.columns.percentOfTotal\",fallback:\"% of Total\"},trend:{key:\"shoppingDashboard.fullView.categories.columns.trend\",fallback:\"Trend\"}},allCategoriesTitle:{key:\"shoppingDashboard.fullView.categories.allCategoriesTitle\",fallback:\"All Categories\"},noCategoryData:{key:\"shoppingDashboard.fullView.categories.noCategoryData\",fallback:\"No category data available.\"}}},dataTable:{noDataAvailable:{key:\"shoppingDashboard.dataTable.noDataAvailable\",fallback:\"No data available\"},sortableColumn:{key:\"shoppingDashboard.dataTable.sortableColumn\",fallback:\", sortable column\"}},pagination:{previousPage:{key:\"shoppingDashboard.pagination.previousPage\",fallback:\"Previous page\"},nextPage:{key:\"shoppingDashboard.pagination.nextPage\",fallback:\"Next page\"},goToPage:{key:\"shoppingDashboard.pagination.goToPage\",fallback:\"Go to page\"},of:{key:\"shoppingDashboard.pagination.of\",fallback:\"of\"}},defaults:{zeroTrend:{key:\"shoppingDashboard.defaults.zeroTrend\",fallback:\"+0%\"},noValue:{key:\"shoppingDashboard.defaults.noValue\",fallback:\"--\"}}};function a(e){return qt(e)}import{useMemo as Xp}from\"react\";function vi(){return[{value:\"all\",label:a(r.filter.market.all)}]}function ki(e){return e&&e.length>0?e:vi()}function Ue(e){return Xp(()=>ki(e),[e])}import{jsx as he,jsxs as go}from\"react/jsx-runtime\";var Eo=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:s,markets:d,onDateRangeChange:p,onMarketChange:w})=>{let C=Ue(d),u=f=>{let c=f.target.value;p?.(c)},x=f=>{let c=f.target.value;w?.(c)},g=f=>{f.key===\"Escape\"&&f.target.blur()},b=()=>n||(s?.dateRange?s.dateRange.label:a(r.filter.dateRange.last30days));return go(mi,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[go(hi,{children:[he(xi,{\"data-testid\":\"dashboard-shop-title\",children:e??s?.shopTitle??a(r.title)}),he(bi,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:b()})]}),he(yi,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:go(Ci,{children:[i&&he(wi,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:he(oc,{})}),go(Sa,{children:[he(Ta,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRangeLabel)}),he(Pa,{\"aria-hidden\":\"true\",children:he(ec,{})}),go(Da,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:u,onKeyDown:g,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[he(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),he(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),he(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),he(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),go(Sa,{children:[he(Ta,{htmlFor:\"filter-market\",children:a(r.filter.marketLabel)}),he(Pa,{\"aria-hidden\":\"true\",children:he(tc,{})}),he(Da,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:x,onKeyDown:g,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${C.find(f=>f.value===o)?.label??String(o)}`,children:C.map(f=>he(\"option\",{value:f.value,children:f.label},f.value))})]})]})})]})};import cc from\"react\";import uc from\"@mui/icons-material/ShowChart\";import gc from\"@mui/icons-material/TrendingUp\";import fc from\"@mui/icons-material/TrendingDown\";import{ColorUtils as rc,styled as Se}from\"@nuskin/foundation-theme\";var{getGenomeColor:St}=rc,dr=Se(\"div\")`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-sizing: border-box;\n gap: ${({$layout:e})=>e===\"split\"?\"8px\":\"0\"};\n padding: ${({$layout:e})=>e===\"split\"?\"16px\":\"12px\"};\n background-color: ${({theme:e})=>St(e,\"N20\")};\n border: 1px solid ${({theme:e})=>St(e,\"N30\")};\n border-radius: 8px;\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"120px\"};\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n @media (min-width: 768px) {\n padding: ${({$layout:e})=>e===\"split\"?\"24px\":\"20px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"140px\"};\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"160px\"};\n }\n`,Si=Se(\"div\")`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>St(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,Ti=Se(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,Di=Se(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,Pi=Se(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#9b131a\":St(e,\"N70\")};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`,Ri=Se(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n letter-spacing: 0.12px;\n text-align: right;\n color: ${({theme:e})=>St(e,\"N70\")};\n`,Mi=Se(\"div\")`\n font-size: 20px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>St(e,\"N100\")};\n margin-bottom: 4px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 20px;\n margin-bottom: 6px;\n }\n\n @media (min-width: 1080px) {\n font-size: 20px;\n }\n`,Oi=Se(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-top: 8px;\n width: 100%;\n`,Ra=Se(\"div\")`\n font-size: 24px;\n font-weight: 700;\n line-height: 1.2;\n color: ${({theme:e})=>St(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 28px;\n }\n\n @media (min-width: 1080px) {\n font-size: 32px;\n }\n`,Fi=Se(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,Li=Se(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: normal;\n color: ${({theme:e})=>St(e,\"N70\")};\n padding-bottom: 2px;\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,$i=Se(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#22C55E\":t===\"down\"?\"#DC2626\":St(e,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 14px;\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n`,fh=Se(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ma=Se(\"span\")`\n white-space: nowrap;\n`,Ii=Se(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import j from\"@mui/material/Skeleton\";import{styled as _}from\"@nuskin/foundation-theme\";import Ho from\"@mui/material/Skeleton\";var pr=_(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,cr=_(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 12px;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,Ni=_(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n padding: 14px 0;\n }\n`,Vi=_(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 12px;\n border-radius: 8px;\n min-height: 120px;\n\n @media (min-width: 600px) {\n padding: 20px;\n min-height: 140px;\n }\n @media (min-width: 900px) {\n padding: 24px;\n min-height: 160px;\n }\n`,Ai=_(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,zi=_(\"div\")`\n margin-top: 8px;\n`,Bi=_(Ho)`\n margin-top: 4px;\n`,Ei=_(\"div\")`\n flex: 1;\n min-width: 0;\n`,Hi=_(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,Wi=_(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,_i=_(\"div\")`\n padding-top: 4px;\n`,Ki=_(Ho)`\n border-radius: 8px;\n height: 220px;\n\n @media (min-width: 600px) {\n height: 280px;\n }\n @media (min-width: 900px) {\n height: 340px;\n }\n`,Ui=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n @media (min-width: 600px) {\n flex-direction: row;\n gap: 24px;\n }\n`,Gi=_(Ho)`\n width: 100%;\n height: 200px;\n border-radius: 8px;\n flex-shrink: 0;\n\n @media (min-width: 600px) {\n width: 200px;\n border-radius: 50%;\n }\n`,ji=_(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,Yi=_(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,Ji=_(\"div\")`\n flex: 1;\n`,ac=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n @media (min-width: 600px) {\n gap: 32px;\n }\n @media (min-width: 900px) {\n gap: 40px;\n }\n`,nc=_(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,ic=_(\"div\")`\n display: flex;\n gap: 16px;\n`,lc=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n @media (min-width: 900px) {\n gap: 24px;\n }\n`,sc=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 900px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`,Oa=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,Zi=_(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,qi=_(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,Qi=_(Ho)`\n border-radius: 8px;\n height: 260px;\n\n @media (min-width: 600px) {\n height: 320px;\n }\n @media (min-width: 900px) {\n height: 400px;\n }\n`,Fa=_(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,ur=_(Ho)`\n border-radius: 4px;\n`,Xi=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n`;import{jsx as $,jsxs as q}from\"react/jsx-runtime\";var Wo=()=>q(Vi,{\"data-testid\":\"skeleton-stats-card\",children:[q(Ai,{children:[$(j,{variant:\"text\",width:80,height:18}),$(j,{variant:\"text\",width:48,height:16})]}),q(zi,{children:[$(j,{variant:\"text\",width:120,height:36}),$(Bi,{variant:\"text\",width:100,height:16})]})]}),dc=()=>q(Ni,{children:[$(j,{variant:\"rounded\",width:28,height:28}),$(j,{variant:\"rounded\",width:50,height:50}),q(Ei,{children:[$(j,{variant:\"text\",width:\"70%\",height:18}),$(j,{variant:\"text\",width:\"50%\",height:14})]}),q(Hi,{children:[$(j,{variant:\"text\",width:80,height:18}),$(j,{variant:\"text\",width:48,height:14})]})]}),el=()=>q(pr,{\"data-testid\":\"skeleton-products-list\",children:[q(cr,{children:[$(j,{variant:\"text\",width:160,height:22}),$(j,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>$(dc,{},e))]}),gr=()=>q(pr,{\"data-testid\":\"skeleton-chart-widget\",children:[q(cr,{children:[$(j,{variant:\"text\",width:140,height:22}),$(j,{variant:\"rounded\",width:110,height:32})]}),q(Wi,{children:[$(j,{variant:\"text\",width:100,height:36}),q(_i,{children:[$(j,{variant:\"text\",width:60,height:18}),$(j,{variant:\"text\",width:140,height:14})]})]}),$(Ki,{variant:\"rounded\",width:\"100%\"})]}),pc=()=>q(Yi,{children:[$(j,{variant:\"circular\",width:12,height:12}),q(Ji,{children:[$(j,{variant:\"text\",width:\"60%\",height:16}),$(j,{variant:\"text\",width:\"40%\",height:14})]}),$(j,{variant:\"text\",width:36,height:18})]}),fr=()=>q(pr,{\"data-testid\":\"skeleton-categories-pie\",children:[q(cr,{children:[$(j,{variant:\"text\",width:140,height:22}),$(j,{variant:\"rounded\",width:100,height:32})]}),q(Ui,{children:[$(Gi,{variant:\"circular\"}),$(ji,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>$(pc,{},e))})]})]});var $t=()=>q(Oa,{\"data-testid\":\"skeleton-fullview-chart\",children:[q(Zi,{children:[q(qi,{children:[$(j,{variant:\"text\",width:140,height:52}),$(j,{variant:\"text\",width:80,height:24}),$(j,{variant:\"text\",width:160,height:16})]}),$(Qi,{variant:\"rounded\",width:\"100%\"})]}),q(Fa,{children:[$(j,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>$(ur,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),tl=()=>q(Oa,{\"data-testid\":\"skeleton-fullview-table\",children:[q(Xi,{children:[$(Wo,{}),$(Wo,{}),$(Wo,{})]}),q(Fa,{children:[$(j,{variant:\"text\",width:200,height:24}),$(ur,{variant:\"rounded\",width:\"100%\",height:40}),[\"summary-row-1\",\"summary-row-2\",\"summary-row-3\",\"summary-row-4\",\"summary-row-5\",\"summary-row-6\",\"summary-row-7\",\"summary-row-8\"].map(e=>$(ur,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as Fe,jsxs as It}from\"react/jsx-runtime\";var mc=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:s=\"neutral\",trendValue:d,testId:p,isLoading:w=!1})=>{if(w)return Fe(dr,{$layout:i,\"data-testid\":p,children:Fe(Wo,{})});let C=()=>{let x=a(r.stats.trend.unchanged);return s===\"up\"?x=a(r.stats.trend.increased):s===\"down\"&&(x=a(r.stats.trend.decreased)),`${e} ${x} ${d??\"\"}`},u=x=>s===\"up\"?Fe(gc,{sx:{fontSize:x},\"aria-hidden\":\"true\"}):s===\"down\"?Fe(fc,{sx:{fontSize:x},\"aria-hidden\":\"true\"}):Fe(uc,{sx:{fontSize:x},\"aria-hidden\":\"true\"});return i===\"split\"?It(dr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Fe(Si,{id:`stats-title-${p}`,children:e}),It(Ti,{children:[Fe(Ra,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),(d??n)&&It(Di,{children:[d&&It(Pi,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":C(),\"data-testid\":`stats-trend-${p}`,children:[u(\"18px\"),Fe(Ma,{children:d})]}),n&&Fe(Ri,{\"data-testid\":`stats-caption-${p}`,children:n})]})]})]}):It(dr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Fe(Ii,{children:Fe(Mi,{id:`stats-title-${p}`,children:e})}),It(Oi,{children:[It(Fi,{children:[Fe(Ra,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),o&&Fe(Li,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${p}`,children:o})]}),d&&It($i,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":C(),\"data-testid\":`stats-trend-${p}`,children:[u(\"16px\"),Fe(Ma,{children:d})]})]})]})},Tt=cc.memo(mc);Tt.displayName=\"StatsCard\";import $c from\"react\";import Ic from\"@mui/icons-material/ShoppingCart\";import Nc from\"@mui/icons-material/ShowChart\";import Vc from\"@mui/icons-material/TrendingUp\";import Ac from\"@mui/icons-material/TrendingDown\";import hc from\"@mui/icons-material/ArrowUpward\";import xc from\"@mui/icons-material/ArrowDownward\";import bc from\"@mui/icons-material/Remove\";import{jsx as La}from\"react/jsx-runtime\";function pt(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function Nt(e){let t=pt(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function Vt(e,t,o){let{weightedSum:n,weight:i}=e.reduce((p,w)=>{let C=pt(o(w));return C===null?p:{weightedSum:p.weightedSum+C*t(w),weight:p.weight+t(w)}},{weightedSum:0,weight:0}),s=i>0?n/i:0,d=\"neutral\";return s>0?d=\"up\":s<0&&(d=\"down\"),{direction:d,formatted:`${s>0?\"+\":\"\"}${s.toFixed(1)}%`}}function fo(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function tt(e){switch(e){case\"up\":return La(hc,{});case\"down\":return La(xc,{});case\"neutral\":default:return La(bc,{})}}function yc(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}import{useMemo as ol}from\"react\";function rl(e,t){return Math.ceil(e.length/t)}function al(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function wc(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let s=n[t],d=i[t];return o===\"asc\"?s-d:d-s})}function Cc(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function ct(e,t,o){let n=ol(()=>rl(e,o),[e,o]),i=ol(()=>al(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function E(e,t,o=\"en-US\",n){let i=Number.isFinite(e)?e:0;if(t)try{return new Intl.NumberFormat(o,{style:\"currency\",currency:t,...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return n!==void 0?`$${i.toFixed(n)}`:`$${i.toLocaleString()}`}import{ColorUtils as vc,styled as ue}from\"@nuskin/foundation-theme\";var{getGenomeColor:Q}=vc,mr=ue(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Q(e,\"N30\")};\n border-radius: 12px;\n min-height: 320px;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (min-width: 768px) {\n padding: 20px;\n min-height: 400px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,$a=ue(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,nl=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ia=ue(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>Q(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>Q(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,il=ue(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Q(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Q(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Q(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>Q(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>Q(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,ll=ue(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n overflow: hidden;\n list-style: none;\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n }\n`,sl=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border-radius: 8px;\n transition:\n background-color 0.2s ease,\n box-shadow 0.2s ease;\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n list-style: none;\n\n &:not(:last-child) {\n border-bottom: 1px solid ${({theme:e})=>Q(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>Q(e,\"N30\")};\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.06);\n }\n\n @media (min-width: 768px) {\n padding: 14px;\n gap: 14px;\n }\n`,dl=ue(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>Q(e,\"A10\")};\n color: ${({theme:e})=>Q(e,\"A80\")};\n border-radius: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n vertical-align: middle;\n\n @media (min-width: 768px) {\n min-width: 28px;\n height: 28px;\n font-size: 16px;\n }\n`,pl=ue(\"img\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n object-fit: cover;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n }\n`,cl=ue(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>Q(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>Q(e,\"N70\")};\n font-size: 10px;\n font-weight: 500;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n font-size: 11px;\n }\n`,ul=ue(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,gl=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Q(e,\"N100\")};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n\n @media (min-width: 768px) {\n font-size: 16px;\n max-width: none;\n }\n`,fl=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>Q(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,ml=ue(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,hl=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.2;\n color: ${({theme:e})=>Q(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,xl=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#22C55E\":t===\"down\"?\"#DC2626\":Q(e,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 12px;\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n`,bl=ue(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({theme:e})=>Q(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>Q(e,\"N50\")};\n }\n`,yl=ue(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>Q(e,\"N70\")};\n`;import{useState as Tc}from\"react\";import Dc from\"@mui/material/Menu\";import Pc from\"@mui/material/MenuItem\";import Rc from\"@mui/material/ListItemIcon\";import Mc from\"@mui/material/ListItemText\";import Oc from\"@mui/icons-material/MoreVert\";import Fc from\"@mui/icons-material/Visibility\";import kc from\"@mui/material/IconButton\";import{styled as Sc}from\"@nuskin/foundation-theme\";var wl=Sc(kc)(()=>({padding:\"4px\",color:\"#252525\",\"&:hover\":{backgroundColor:\"rgba(37, 37, 37, 0.08)\"}}));import{Fragment as Lc,jsx as mo,jsxs as Cl}from\"react/jsx-runtime\";var ot=({widgetId:e,onFullView:t})=>{let[o,n]=Tc(null),i=!!o,s=`widget-menu-button-${e}`,d=`widget-menu-${e}`,p=u=>{n(u.currentTarget)},w=()=>{n(null)},C=()=>{w(),t&&t()};return Cl(Lc,{children:[mo(wl,{id:s,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":i?d:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":i?\"true\":void 0,onClick:p,size:\"small\",children:mo(Oc,{fontSize:\"small\"})}),mo(Dc,{id:d,\"data-testid\":`widget-menu-${e}`,anchorEl:o,open:i,onClose:w,MenuListProps:{\"aria-labelledby\":s},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:Cl(Pc,{onClick:C,\"data-testid\":\"widget-menu-item-fullview\",children:[mo(Rc,{children:mo(Fc,{fontSize:\"small\"})}),mo(Mc,{children:a(r.widget.menu.fullView)})]})})]})};import{jsx as re,jsxs as ut}from\"react/jsx-runtime\";var zc=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,onSortChange:i,onTitleClick:s})=>{let d=c=>{let v=c.target.value;i?.(v)},p=(c,v)=>{switch(v){case\"units\":return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return E(c.revenue,c.currencyCode);case\"volume\":return`${c.volume.toLocaleString()} ${a(r.widget.topProducts.dcSvSuffix)}`;default:return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},w=(c,v)=>{switch(v){case\"units\":return`${E(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${E(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${E(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`}},C=(c,v)=>{let y=c.trend;if(!y)return\"\";switch(v){case\"units\":return y.units??\"\";case\"revenue\":return y.revenue??\"\";case\"volume\":return y.volume??\"\";default:return y.units??\"\"}},u=(c,v)=>{let y=C(c,v);return y?y.startsWith(\"+\")?\"up\":y.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\"},x=c=>c===\"up\"?re(Vc,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):c===\"down\"?re(Ac,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):re(Nc,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}),g=e.slice(0,n),b=a(r.widget.topProducts.rank),f=a(r.widget.topProducts.trend);return o&&e.length===0?re(mr,{\"data-testid\":\"widget-top-products\",children:re(el,{})}):e.length===0?ut(mr,{\"data-testid\":\"widget-top-products\",children:[re($a,{children:re(Ia,{children:a(r.widget.topProducts.title)})}),ut(bl,{\"data-testid\":\"products-empty-state\",children:[re(Ic,{}),re(yl,{children:a(r.widget.topProducts.empty)})]})]}):ut(mr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[ut($a,{children:[re(Ia,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),ut(nl,{children:[ut(il,{id:\"product-sort\",\"data-testid\":\"product-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[re(\"option\",{value:\"units\",children:a(r.filter.productSort.byUnits)}),re(\"option\",{value:\"revenue\",children:a(r.filter.productSort.byRevenue)}),re(\"option\",{value:\"volume\",children:a(r.filter.productSort.byVolume)})]}),re(ot,{widgetId:\"top-products\",onFullView:s})]})]}),re(ll,{as:\"ul\",\"data-testid\":\"products-list\",children:g.map((c,v)=>{let y=u(c,t),T=C(c,t);return ut(sl,{as:\"li\",\"data-testid\":`product-item-${v}`,\"aria-label\":`${b} ${c.rank}: ${c.name}, ${p(c,t)}`,children:[re(dl,{\"aria-label\":`${b} ${c.rank}`,children:c.rank}),c.imageUrl?re(pl,{src:c.imageUrl,alt:c.name,loading:\"lazy\",onError:h=>{h.currentTarget.hidden=!0}}):re(cl,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:c.name.substring(0,2).toUpperCase()}),ut(ul,{children:[re(gl,{title:c.name,children:c.name}),re(fl,{children:w(c,t)})]}),ut(ml,{children:[re(hl,{children:p(c,t)}),T&&ut(xl,{as:\"output\",direction:y,\"aria-live\":\"polite\",\"aria-label\":`${f}: ${fo(y)} ${T}`,children:[x(y),re(\"span\",{children:T})]})]})]},c.id)})})]})},ho=$c.memo(zc);ho.displayName=\"TopSellingProductsList\";import _o from\"react\";import{LineChart as _c,Line as Kc,XAxis as Uc,YAxis as Gc,CartesianGrid as jc,Tooltip as Yc,ResponsiveContainer as Jc}from\"recharts\";import{ColorUtils as Bc,styled as Te}from\"@nuskin/foundation-theme\";var{getGenomeColor:le}=Bc,Na=Te(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>le(e,\"N20\")};\n border: 1px solid ${({theme:e})=>le(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,vl=Te(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n padding-bottom: 0;\n border-bottom: none;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,kl=Te(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Sl=Te(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Tl=Te(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>le(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,Dl=Te(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>le(e,\"N20\")};\n border: 1px solid ${({theme:e})=>le(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>le(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>le(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>le(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>le(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Pl=Te(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n`,Rl=Te(\"div\")`\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 36px;\n }\n`,Ml=Te(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n margin: 0;\n padding: 0;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 3px;\n font-size: 13px;\n line-height: 1;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#DC2626\":le(e,\"N70\")};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n\n .change-value {\n font-weight: 600;\n }\n\n .change-percent {\n font-weight: 400;\n }\n }\n\n .comparison-text {\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>le(e,\"N70\")};\n letter-spacing: 0.1px;\n margin: 0;\n padding: 0;\n }\n`,Ol=Te(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin-bottom: 16px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,Fl=Te(\"div\")`\n width: 100%;\n height: 220px;\n margin-top: 0;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({theme:e})=>le(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>le(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,Ll=Te(\"div\")`\n background-color: ${({theme:e})=>le(e,\"N100\")};\n border: 1px solid ${({theme:e})=>le(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,$l=Te(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>le(e,\"N10\")};\n margin-bottom: 4px;\n`,Il=Te(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>le(e,\"A10\")};\n`,Nl=Te(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>le(e,\"N30\")};\n margin-top: 2px;\n`;var Vl={last7days:7,last30days:30,last90days:90,thisMonth:31},Al={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function Ec(e){return Vl[e]??30}function Va(e){return Al[e]??\"Last 30 Days\"}function Hc(e){return Va(e)}function zl(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var Wc={Jan:\"1\",Feb:\"2\",Mar:\"3\",Apr:\"4\",May:\"5\",Jun:\"6\",Jul:\"7\",Aug:\"8\",Sep:\"9\",Oct:\"10\",Nov:\"11\",Dec:\"12\"};function hr(e){let t=e.split(\" \");return t.length!==2?e:`${Wc[t[0]]||t[0]}/${t[1]}`}function Aa(e){let t=new Date(e);return zl(t)}function Bl(e,t){return`${Aa(e)} - ${Aa(t)}`}function za(e){return e.toISOString().split(\"T\")[0]}function ge(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),s,d=new Date(o,n,i);switch(e){case\"last7days\":s=new Date(o,n,i-7);break;case\"last30days\":s=new Date(o,n,i-30);break;case\"last90days\":s=new Date(o,n,i-90);break;case\"thisMonth\":s=new Date(o,n,1),d=new Date(o,n+1,0);break;default:return\"N/A\"}return Bl(za(s),za(d))}import{jsx as se,jsxs as Ge}from\"react/jsx-runtime\";var Zc={top:5,right:10,left:-10,bottom:5},El={fontSize:10},qc={r:3,fill:\"#3B82F6\"},Qc={r:5},Xc=e=>`${e}%`,eu=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Ge(Ll,{children:[se($l,{children:o.date}),Ge(Il,{children:[(o.rate??0).toFixed(2),\"%\"]}),Ge(Nl,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},tu=({conversionData:e,conversionFilter:t,isLoading:o=!1,title:n,summaryRate:i,summaryChangePct:s,onFilterChange:d,onTitleClick:p})=>{let w=_o.useCallback(c=>{let v=c.target.value;d?.(v)},[d]),C=a(r.widget.conversionRate.noData),u=a(r.widget.conversionRate.noChange),x=_o.useMemo(()=>typeof i==\"number\"&&Number.isFinite(i)?i:e.at(-1)?.rate??0,[i,e]),g=_o.useMemo(()=>{if(s!==void 0){if(s===null||Math.abs(s)<.1)return{direction:\"neutral\",value:u};let M=s>0?\"up\":\"down\",W=`${s>0?\"+\":\"\"}${s.toFixed(2)}%`;return{direction:M,value:W}}if(e.length<2)return{direction:\"neutral\",value:C};let c=e.at(-1)?.rate??0,v=e[0].rate;if(v===0)return{direction:\"neutral\",value:u};let y=c-v,T=y/v*100;if(Math.abs(T)<.1)return{direction:\"neutral\",value:u};let h=y>0?\"up\":\"down\",P=`${y>0?\"+\":\"\"}${y.toFixed(2)}%`;return{direction:h,value:P}},[s,e,u,C]),b=_o.useMemo(()=>e.map(c=>({...c,shortDate:hr(c.date)})),[e]);if(o&&e.length===0)return se(Na,{\"data-testid\":\"widget-conversion-rate\",children:se(gr,{})});let f=a(r.widget.conversionRate.chartAriaLabel);return Ge(Na,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":f,children:[se(vl,{children:Ge(kl,{children:[se(Tl,{as:\"button\",onClick:p,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:n??a(r.widget.conversionRate.title)}),Ge(Sl,{children:[Ge(Dl,{id:\"conversion-filter\",\"data-testid\":\"conversion-filter-dropdown\",value:t,onChange:w,disabled:o,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[se(\"option\",{value:\"all\",children:a(r.filter.conversionType.all)}),se(\"option\",{value:\"standard\",children:a(r.filter.conversionType.standard)}),se(\"option\",{value:\"subscription\",children:a(r.filter.conversionType.subscription)})]}),se(ot,{widgetId:\"conversion-rate\",onFullView:p})]})]})}),Ge(Pl,{children:[Ge(Rl,{\"aria-label\":`${a(r.widget.conversionRate.title)}: ${x.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[x.toFixed(2),\"%\"]}),g.value!==C&&Ge(Ml,{as:\"output\",direction:g.direction,\"aria-live\":\"polite\",\"aria-label\":`${fo(g.direction)} ${g.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Ge(\"div\",{className:\"trend-line\",children:[se(\"span\",{\"aria-hidden\":\"true\",children:tt(g.direction)}),se(\"span\",{className:\"change-value\",children:g.value.replace(\"%\",\"\")}),se(\"span\",{className:\"change-percent\",children:\"%\"})]}),se(\"div\",{className:\"comparison-text\",children:a(r.widget.conversionRate.comparison)})]})]}),se(Ol,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),se(Fl,{\"data-testid\":\"conversion-chart\",children:se(Jc,{width:\"100%\",height:\"100%\",minHeight:200,children:Ge(_c,{data:b,margin:Zc,children:[se(jc,{strokeDasharray:\"3 3\"}),se(Uc,{dataKey:\"shortDate\",tick:El,tickLine:!1,interval:\"preserveStartEnd\"}),se(Gc,{tick:El,tickLine:!1,tickFormatter:Xc,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),se(Yc,{content:eu}),se(Kc,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:qc,activeDot:Qc})]})})})]})},xo=_o.memo(tu);xo.displayName=\"ConversionRateChart\";import jo from\"react\";import{LineChart as ru,Line as bo,XAxis as au,YAxis as nu,CartesianGrid as iu,Tooltip as lu,ResponsiveContainer as su}from\"recharts\";import{ColorUtils as ou,styled as Ae}from\"@nuskin/foundation-theme\";var{getGenomeColor:xe}=ou,Ba=Ae(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>xe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>xe(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,Hl=Ae(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,Wl=Ae(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,_l=Ae(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>xe(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>xe(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,Kl=Ae(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>xe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>xe(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>xe(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>xe(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>xe(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>xe(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Ul=Ae(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`,Gl=Ae(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>xe(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,jl=Ae(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#DC2626\":xe(e,\"N70\")};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>xe(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Yl=Ae(\"div\")`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({theme:e})=>xe(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>xe(e,\"N70\")};\n font-size: 10px;\n }\n`,Jl=Ae(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,Ko=Ae(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>xe(e,\"N30\")};\n }\n`,Uo=Ae(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Go=Ae(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>xe(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as cu,jsx as A,jsxs as Le}from\"react/jsx-runtime\";var rt={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},du={top:5,right:10,left:-10,bottom:5},Zl={fontSize:10},yo={r:2},pu=({signupData:e,signupView:t,isLoading:o=!1,title:n,onViewChange:i,onTitleClick:s})=>{let d=jo.useCallback(v=>{let y=v.target.value;i?.(y)},[i]),p=a(r.widget.signups.noData),w=a(r.widget.signups.noChange),C=jo.useMemo(()=>e.length===0?0:e[e.length-1].total,[e]),u=jo.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:p};let v=e[e.length-1].total,y=e[0].total,T=v-y,h=T/y*100;if(Math.abs(h)<.1)return{direction:\"neutral\",value:w};let P=T>0?\"up\":\"down\",M=`${T>0?\"+\":\"\"}${T} (${h.toFixed(1)}%)`;return{direction:P,value:M}},[w,p,e]),x=jo.useMemo(()=>e.map(v=>({...v,shortDate:hr(v.date)})),[e]),g=a(r.widget.signups.total),b=a(r.widget.signups.members),f=a(r.widget.signups.retail),c=a(r.widget.signups.brandAffiliates);return o&&e.length===0?A(Ba,{\"data-testid\":\"widget-signups\",children:A(gr,{})}):Le(Ba,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[Le(Hl,{children:[A(_l,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:n??a(r.widget.signups.title)}),Le(Wl,{children:[Le(Kl,{id:\"signup-view\",\"data-testid\":\"signup-view-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[A(\"option\",{value:\"all\",children:a(r.filter.signupView.showAll)}),A(\"option\",{value:\"members\",children:a(r.filter.signupView.showMembers)}),A(\"option\",{value:\"retail\",children:a(r.filter.signupView.showRetail)}),A(\"option\",{value:\"brandAffiliates\",children:a(r.filter.signupView.showBrandAffiliates)})]}),A(ot,{widgetId:\"signups\",onFullView:s})]})]}),Le(Ul,{\"data-testid\":\"signups-metric-display\",children:[A(Gl,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${g}: ${C.toLocaleString()}`,children:C.toLocaleString()}),u.value!==p&&Le(jl,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:u.direction,\"aria-live\":\"polite\",\"aria-label\":`${fo(u.direction)} ${u.value}`,children:[Le(\"div\",{className:\"trend-line\",children:[A(\"span\",{\"aria-hidden\":\"true\",children:tt(u.direction)}),A(\"span\",{className:\"change-value\",children:u.value.split(\" \")[0]}),A(\"span\",{className:\"change-percent\",children:u.value.split(\" \")[1]})]}),A(\"div\",{className:\"comparison-text\",children:a(r.widget.conversionRate.comparison)})]})]}),A(Yl,{\"data-testid\":\"signups-chart\",children:A(su,{width:\"100%\",height:\"100%\",minHeight:200,children:Le(ru,{data:x,margin:du,children:[A(iu,{strokeDasharray:\"3 3\"}),A(au,{dataKey:\"shortDate\",tick:Zl,tickLine:!1,interval:\"preserveStartEnd\"}),A(nu,{tick:Zl,tickLine:!1}),A(lu,{}),(t===\"all\"||t===\"members\")&&A(bo,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?rt.total:rt.members,strokeWidth:2,dot:yo,name:t===\"all\"?g:b}),t===\"all\"&&Le(cu,{children:[A(bo,{type:\"monotone\",dataKey:\"members\",stroke:rt.members,strokeWidth:2,dot:yo,name:b}),A(bo,{type:\"monotone\",dataKey:\"retail\",stroke:rt.retail,strokeWidth:2,dot:yo,name:f}),A(bo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:rt.brandAffiliates,strokeWidth:2,dot:yo,name:c})]}),t===\"retail\"&&A(bo,{type:\"monotone\",dataKey:\"retail\",stroke:rt.retail,strokeWidth:2,dot:yo,name:f}),t===\"brandAffiliates\"&&A(bo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:rt.brandAffiliates,strokeWidth:2,dot:yo,name:c})]})})}),t===\"all\"&&Le(Jl,{\"data-testid\":\"signups-legend\",children:[Le(Ko,{\"data-testid\":\"legend-total\",children:[A(Uo,{color:rt.total}),A(Go,{children:g})]}),Le(Ko,{\"data-testid\":\"legend-members\",children:[A(Uo,{color:rt.members}),A(Go,{children:b})]}),Le(Ko,{\"data-testid\":\"legend-retail\",children:[A(Uo,{color:rt.retail}),A(Go,{children:f})]}),Le(Ko,{\"data-testid\":\"legend-brandAffiliates\",children:[A(Uo,{color:rt.brandAffiliates}),A(Go,{children:c})]})]})]})},xr=jo.memo(pu);xr.displayName=\"SignupsChart\";import Ea from\"react\";import{PieChart as gu,Pie as fu,Cell as mu,ResponsiveContainer as hu,Tooltip as xu}from\"recharts\";import bu from\"@mui/icons-material/TrendingUp\";import yu from\"@mui/icons-material/TrendingDown\";import{ColorUtils as uu,styled as oe}from\"@nuskin/foundation-theme\";var{getGenomeColor:fe}=uu,At=oe(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>fe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>fe(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,wo=oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,br=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Co=oe(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>fe(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>fe(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,yr=oe(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>fe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>fe(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>fe(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>fe(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>fe(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>fe(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,wr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n justify-content: center;\n flex: 1;\n\n @media (min-width: 768px) {\n flex-direction: row;\n gap: 24px;\n align-items: center;\n justify-content: center;\n }\n`,Cr=oe(\"div\")`\n position: relative;\n width: 100%;\n height: 220px;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 260px;\n height: 260px;\n flex: 0 0 auto;\n }\n\n @media (min-width: 1080px) {\n width: 280px;\n height: 280px;\n flex: 0 0 auto;\n }\n\n /* Style recharts pie labels (percentages inside segments) */\n svg text {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n\n text[class*='recharts'] {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n`,vr=oe(\"div\")`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 96px;\n`,kr=oe(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`,Sr=oe(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>fe(e,\"N100\")};\n`,Tr=oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n margin-top: 4px;\n font-size: 12px;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":fe(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Dr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 0 1 auto;\n\n @media (min-width: 768px) {\n gap: 10px;\n }\n`,Pr=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n @media (min-width: 768px) {\n gap: 10px;\n padding: 6px 0;\n }\n\n &:hover {\n background-color: ${({theme:e})=>fe(e,\"N30\")};\n }\n`,Rr=oe(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Mr=oe(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Or=oe(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>fe(e,\"N100\")};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n font-size: 14px;\n }\n`,Fr=oe(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>fe(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,ql=oe(\"div\")`\n display: none;\n`,Ql=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,Xl=oe(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,es=oe(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,Lr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`,$r=oe(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`;import{jsx as X,jsxs as $e}from\"react/jsx-runtime\";var wu=({categories:e,categorySort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s})=>{let d=Ea.useCallback(f=>{let c=f.target.value;i?.(c)},[i]),{sortedCategories:p,totalRevenue:w,trendDirection:C,formattedTrend:u}=Ea.useMemo(()=>{let f=[...e].sort((T,h)=>t===\"revenue\"?h.revenue-T.revenue:(pt(h.trend?.revenue)??-1/0)-(pt(T.trend?.revenue)??-1/0)),c=f.reduce((T,h)=>T+h.revenue,0),{direction:v,formatted:y}=Vt(f,T=>T.revenue,T=>T.trend?.revenue);return{sortedCategories:f,totalRevenue:c,trendDirection:v,formattedTrend:y}},[e,t]),x=f=>f===\"up\"?X(bu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):f===\"down\"?X(yu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,g=f=>{let{cx:c,cy:v,midAngle:y,innerRadius:T,outerRadius:h,percentage:P}=f,M=Math.PI/180,W=T+(h-T)/2,O=c+W*Math.cos(-y*M),I=v+W*Math.sin(-y*M);return X(\"text\",{x:O,y:I,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"central\",fontSize:\"10\",fontWeight:\"600\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0.2\",style:{lineHeight:\"12px\",leadingTrim:\"none\"},children:`${P}%`})},b=p[0]?.currencyCode;return o&&e.length===0?X(At,{\"data-testid\":\"widget-top-categories\",children:X(fr,{})}):e.length===0?$e(At,{\"data-testid\":\"widget-top-categories\",children:[X(wo,{children:X(Co,{children:n??a(r.widget.topCategories.title)})}),X(Lr,{\"data-testid\":\"categories-empty-state\",children:X($r,{children:a(r.widget.topCategories.empty)})})]}):$e(At,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[$e(wo,{children:[X(Co,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),$e(br,{children:[$e(yr,{id:\"category-sort\",\"data-testid\":\"category-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[X(\"option\",{value:\"revenue\",children:a(r.filter.categorySort.byRevenue)}),X(\"option\",{value:\"trend\",children:a(r.filter.categorySort.byTrend)})]}),X(ot,{widgetId:\"top-categories\",onFullView:s})]})]}),$e(wr,{children:[$e(Cr,{\"data-testid\":\"categories-chart\",children:[X(hu,{width:\"100%\",height:\"100%\",children:$e(gu,{children:[X(fu,{data:p,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:g,labelLine:!1,children:p.map(f=>X(mu,{fill:f.color},`cell-${f.id}`))}),X(xu,{formatter:f=>E(f,b)})]})}),$e(vr,{\"data-testid\":\"categories-donut-center\",children:[X(kr,{children:a(r.stats.revenue)}),X(Sr,{children:E(w,b)}),$e(Tr,{direction:C,children:[x(C),X(\"span\",{children:u})]})]})]}),X(Dr,{\"data-testid\":\"categories-legend-container\",children:p.map((f,c)=>$e(Pr,{\"data-testid\":`category-legend-${c}`,children:[X(Rr,{color:f.color}),$e(Mr,{children:[X(Or,{children:f.name}),$e(Ql,{children:[$e(Fr,{children:[E(f.revenue,f.currencyCode),\" (\",f.percentage,\"%)\"]}),f.trend?.revenue?X(Xl,{direction:Nt(f.trend?.revenue),\"data-testid\":`category-legend-trend-${c}`,\"aria-label\":f.trend.revenue,children:x(Nt(f.trend?.revenue))}):null]})]})]},f.id))})]})]})},Ir=Ea.memo(wu);Ir.displayName=\"TopCategoriesPieChart\";import{jsx as Dt,jsxs as Qt}from\"react/jsx-runtime\";var Cu=[],vu=[],ku=[],Su=[],Ha=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:s=!1,error:d,shopTitle:p,className:w,dateRange:C=\"last30days\",market:u=\"all\",productSort:x=\"units\",signupView:g=\"all\",conversionFilter:b=\"all\",categorySort:f=\"revenue\",markets:c,onDateRangeChange:v,onMarketChange:y,onProductSortChange:T,onSignupViewChange:h,onConversionFilterChange:P,onCategorySortChange:M,onProductsTitleClick:W,onConversionTitleClick:O,onSignupsTitleClick:I,onCategoriesToTitleClick:U})=>{let R=t??Cu,m=o??vu,k=n??ku,S=i??Su;if(d)return Dt(va,{as:\"main\",className:w,\"aria-label\":a(r.ariaLabel.dashboard),children:Qt(fi,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Qt(\"strong\",{children:[a(r.error),\":\"]}),\" \",d]})});let l=D=>D?D.startsWith(\"+\")?\"up\":D.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return Qt(va,{as:\"main\",className:w,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":s,children:[Dt(Eo,{shopTitle:p,dateRange:C,market:u,isLoading:s,stats:e,markets:c,onDateRangeChange:v,onMarketChange:y}),Qt(ui,{as:\"section\",\"data-testid\":\"stats-row\",\"aria-label\":a(r.ariaLabel.statsRow),children:[Dt(Tt,{title:a(r.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:l(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:s}),Dt(Tt,{title:a(r.stats.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.stats.subtitle.dcSv),trendDirection:l(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:s}),Dt(Tt,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.stats.subtitle.conversionRate)}`,trendDirection:l(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:s})]}),Qt(gi,{\"data-testid\":\"widget-container\",children:[Qt(ka,{\"data-testid\":\"widget-row-1\",children:[Dt(ho,{products:R,productSort:x,isLoading:s,maxProducts:5,onSortChange:T,onTitleClick:W}),Dt(xr,{signupData:k,signupView:g,isLoading:s,onViewChange:h,onTitleClick:I})]}),Qt(ka,{\"data-testid\":\"widget-row-2\",children:[Dt(xo,{conversionData:m,conversionFilter:b,isLoading:s,onFilterChange:P,onTitleClick:O}),Dt(Ir,{categories:S,categorySort:f,isLoading:s,onSortChange:M,onTitleClick:U})]})]})]})};import ee from\"react\";import eo,{useState as Ga}from\"react\";import Du from\"@mui/icons-material/ArrowBack\";import Pu from\"@mui/icons-material/CalendarToday\";import Ru from\"@mui/icons-material/Language\";import{ColorUtils as Tu,styled as Ie}from\"@nuskin/foundation-theme\";var{getGenomeColor:ze}=Tu,ts=Ie(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,os=Ie(\"div\")`\n display: flex;\n align-items: center;\n`,rs=Ie(\"button\")`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({theme:e})=>ze(e,\"N70\")};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({theme:e})=>ze(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>ze(e,\"A70\")};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`,as=Ie(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>ze(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`,ns=Ie(\"div\")`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`,is=Ie(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,ls=Ie(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,ss=Ie(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,ds=Ie(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`,ps=Ie(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,cs=Ie(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>ze(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,us=Ie(\"select\")`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({theme:e})=>ze(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>ze(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>ze(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`,gs=Ie(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,fs=Ie(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n`;import{jsx as Be,jsxs as vo}from\"react/jsx-runtime\";function gt(e,t){return{key:\"dateRange\",label:a(t.filter.dateRange.label),value:e,icon:\"calendar\",options:[{value:\"last7days\",label:a(t.filter.dateRange.last7days)},{value:\"last30days\",label:a(t.filter.dateRange.last30days)},{value:\"last90days\",label:a(t.filter.dateRange.last90days)},{value:\"thisMonth\",label:a(t.filter.dateRange.thisMonth)}]}}function ft(e,t,o){return{key:\"market\",label:a(o.filter.market.label),value:e,icon:\"globe\",options:t.map(n=>({value:n.value,label:n.label}))}}var pe=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let s=d=>d?vo(cs,{children:[d===\"calendar\"&&Be(Pu,{}),d===\"globe\"&&Be(Ru,{})]}):null;return vo(ts,{\"data-testid\":\"page-header\",children:[Be(os,{children:vo(rs,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[Be(Du,{}),Be(\"span\",{children:a(r.navigation.backToDashboard)})]})}),Be(gs,{children:Be(fs,{children:e})}),vo(as,{children:[vo(ns,{children:[Be(is,{\"data-testid\":\"page-header-title\",children:e}),Be(ls,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&Be(ds,{\"data-testid\":\"page-header-filters\",children:n.map(d=>vo(ps,{children:[s(d.icon),Be(us,{id:`filter-${d.key}`,value:d.value,onChange:p=>i(d.key,p.target.value),disabled:d.disabled,\"aria-label\":`${d.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${d.key}`,children:d.options.map(p=>Be(\"option\",{value:p.value,children:d.label&&d.key===\"customerType\"?`${d.label} ${p.label}`:p.label},p.value))})]},d.key))}),Be(ss,{children:t})]})]})};import Ou from\"@mui/icons-material/ArrowUpward\";import Fu from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as Mu,styled as Pt}from\"@nuskin/foundation-theme\";var{getGenomeColor:mt}=Mu,ms=Pt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>mt(e,\"N30\")};\n`,hs=Pt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,xs=Pt(\"thead\")`\n background-color: ${({theme:e})=>mt(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>mt(e,\"N40\")};\n`,bs=Pt(\"th\")`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({theme:e})=>mt(e,\"N20\")};\n color: ${({theme:e})=>mt(e,\"N70\")};\n text-align: left;\n cursor: ${({sortable:e})=>e?\"pointer\":\"default\"};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>mt(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>mt(e,\"A70\")};\n outline-offset: -2px;\n }\n`,ys=Pt(\"tbody\")``,Wa=Pt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>mt(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>mt(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,_a=Pt(\"td\")`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>mt(e,\"N70\")};\n text-align: left;\n`,ws=Pt(_a)`\n text-align: center;\n`,Cs=Pt(\"span\")`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({isActive:e})=>e?1:.4};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;import{jsx as at,jsxs as vs}from\"react/jsx-runtime\";var nt=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:s=\"asc\",getRowKey:d})=>{let p=u=>{if(!o||!n)return;n(u,i===u&&s===\"asc\"?\"desc\":\"asc\")},w=(u,x)=>{(u.key===\"Enter\"||u.key===\" \")&&(u.preventDefault(),p(x))},C=u=>{if(i===u)return s===\"asc\"?\"ascending\":\"descending\"};return at(ms,{\"data-testid\":\"data-table\",children:vs(hs,{children:[at(xs,{children:at(\"tr\",{children:e.map(u=>vs(bs,{scope:\"col\",sortable:o&&u.sortable,onClick:()=>u.sortable&&p(u.key),onKeyDown:x=>u.sortable&&w(x,u.key),tabIndex:o&&u.sortable?0:-1,\"aria-sort\":C(u.key),\"aria-label\":`${u.label}${u.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${u.key}`,children:[u.label,o&&u.sortable&&at(Cs,{isActive:i===u.key,children:i===u.key&&s===\"desc\"?at(Fu,{}):at(Ou,{})})]},u.key))})}),at(ys,{children:t.length===0?at(Wa,{\"data-testid\":\"table-empty-row\",children:at(ws,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((u,x)=>at(Wa,{\"data-testid\":`table-row-${x}`,children:e.map(g=>at(_a,{\"data-testid\":`table-cell-${g.key}`,children:g.render?g.render(u[g.key],u):u[g.key]},g.key))},d?d(u,x):x))})]})})};import $u from\"@mui/icons-material/ChevronLeft\";import Iu from\"@mui/icons-material/ChevronRight\";import{ColorUtils as Lu,styled as Nr}from\"@nuskin/foundation-theme\";var{getGenomeColor:it}=Lu,ks=Nr(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,Vr=Nr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?it(e,\"A80\"):it(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":it(e,\"N100\")};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({theme:e,isActive:t})=>t?it(e,\"A70\"):it(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>it(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,Ar=Nr(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>it(e,\"N70\")};\n margin: 0 8px;\n`,Ka=Nr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>it(e,\"N20\")};\n color: ${({theme:e})=>it(e,\"N100\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({theme:e})=>it(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>it(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;import{Fragment as Ss,jsx as Rt,jsxs as zr}from\"react/jsx-runtime\";var lt=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let s=()=>{e>1&&o(e-1)},d=()=>{e<t&&o(e+1)},p=(b,f)=>{(b.key===\"Enter\"||b.key===\" \")&&(b.preventDefault(),f())},C=(()=>{if(t<=7)return Array.from({length:t},(f,c)=>c+1);let b=[];return e<=4?b.push(1,2,3,4,5):e>=t-3?b.push(t-4,t-3,t-2,t-1,t):b.push(e-1,e,e+1),b})(),u=n?(e-1)*n+1:null,x=n?Math.min(e*n,i??1/0):null,g=a(r.pagination.goToPage);return zr(ks,{\"data-testid\":\"pagination\",children:[Rt(Ka,{onClick:s,onKeyDown:b=>p(b,s),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:Rt($u,{})}),t>7&&e>4&&zr(Ss,{children:[Rt(Vr,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${g} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),Rt(Ar,{children:\"...\"})]}),C.map(b=>Rt(Vr,{onClick:()=>o(b),isActive:e===b,\"aria-label\":`${g} ${b}`,\"aria-current\":e===b?\"page\":void 0,\"data-testid\":`pagination-page-${b}`,type:\"button\",children:b},b)),t>7&&e<t-3&&zr(Ss,{children:[Rt(Ar,{children:\"...\"}),Rt(Vr,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${g} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),Rt(Ka,{onClick:d,onKeyDown:b=>p(b,d),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:Rt(Iu,{})}),n&&i&&zr(Ar,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[u,\"-\",x,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as we}from\"@mui/material/styles\";import{Box as zt,Typography as Xt}from\"@mui/material\";import{ColorUtils as Nu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ts}=Nu,me=we(zt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`,Br=we(zt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Ts(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`,Er=we(zt)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`,Hr=we(Xt)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({theme:e})=>e.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`,Wr=we(zt)`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`,Hb=we(Xt)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`,_r=we(zt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,Bt=we(\"h2\")`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`,Kr=we(zt)`\n width: 100%;\n height: 450px;\n margin-bottom: 20px;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 16px;\n }\n`,Et=we(zt)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({withCard:e=!0,theme:t})=>e&&`\n padding: 20px;\n background-color: ${Ts(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,Wb=we(zt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,Ht=we(Xt)`\n text-align: center;\n color: ${({theme:e})=>e.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`,Ds=we(Xt)`\n font-weight: 600;\n font-size: 14px;\n`,Ps=we(Xt)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Rs=we(Xt)`\n font-size: 13px;\n`,Ms=we(Xt)`\n font-size: 13px;\n color: ${({theme:e,status:t})=>t===\"Active\"?e.palette.success.main:e.palette.warning.main};\n`;import{styled as Ce}from\"@mui/material/styles\";import{Box as Wt,Typography as _t}from\"@mui/material\";import{ColorUtils as Vu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ua}=Vu,Os=Ce(Wt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,Fs=Ce(_t)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Ls=Ce(_t)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Ur=Ce(_t)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>Ua(e,\"N70\")};\n`,$s=Ce(Wt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Is=Ce(Wt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Ns=Ce(Wt)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Ua(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Vs=Ce(Wt)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,As=Ce(_t)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,zs=Ce(Wt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,Bs=Ce(_t)`\n font-size: 0.875rem;\n font-weight: 600;\n`,Es=Ce(_t)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Hs=Ce(Wt)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,Gr=Ce(Wt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,jr=Ce(_t)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,Yr=Ce(_t)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>Ua(e,\"N70\")};\n`;import Au from\"@mui/material/useMediaQuery\";var zu=\"(max-width:767px)\";function ht(){return Au(zu,{noSsr:!0})}import{jsx as ae,jsxs as je}from\"react/jsx-runtime\";function Bu(e){return{rank:e.rank,name:e.name,sku:`${a(r.fullView.products.skuPrefix)}-${e.id.replace(\"prod-\",\"\").padStart(3,\"0\")}`,units:e.unitsSold,revenue:e.revenue,volume:e.volume}}var Yo=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onProductSortChange:C})=>{let[u,x]=Ga(1),[g,b]=Ga(n===\"revenue\"?\"revenue\":\"units\"),[f,c]=Ga(\"desc\"),v=10,y=ht(),T=eo.useCallback(()=>d?.(),[d]),h=Ue(i),P=eo.useMemo(()=>[gt(t,r),ft(o,h,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"units\",label:a(r.filter.productSort.units)},{value:\"revenue\",label:a(r.filter.productSort.revenue)},{value:\"volume\",label:a(r.filter.productSort.volume)}]}],[t,o,h,n]),M=eo.useCallback((S,l)=>{S===\"dateRange\"?p?.(l):S===\"market\"?w?.(l):S===\"sort\"&&(C?.(l),x(1))},[p,w,C]),W=eo.useCallback((S,l)=>{b(S),c(l),x(1)},[]),O=eo.useMemo(()=>e.map(Bu),[e]),I=eo.useMemo(()=>[...O].sort((S,l)=>{let D=S[g],B=l[g];return f===\"asc\"?D-B:B-D}),[O,g,f]),{totalPages:U,pageItems:R}=ct(I,u,v),m=e[0]?.currencyCode,k=eo.useMemo(()=>[{key:\"rank\",label:a(r.fullView.products.columns.rank),sortable:!0},{key:\"name\",label:a(r.fullView.products.columns.product),sortable:!0,render:(S,l)=>je(Os,{children:[ae(Fs,{children:l.name}),ae(Ls,{children:l.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:S=>ae(Ur,{children:Number(S).toLocaleString()})},{key:\"revenue\",label:a(r.fullView.products.columns.revenue),sortable:!0,render:S=>ae(Ur,{children:E(Number(S),m)})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:S=>ae(Ur,{children:Number(S).toLocaleString()})}],[m]);return s?je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),ae(tl,{})]}):e.length===0?je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),ae(Ht,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),y?ae($s,{\"data-testid\":\"products-fullview-mobile-cards\",children:R.map(S=>je(Ns,{children:[je(Vs,{children:[je(As,{children:[\"#\",S.rank]}),je(zs,{children:[ae(Bs,{children:S.name}),ae(Es,{children:S.sku})]})]}),je(Hs,{children:[je(Gr,{children:[ae(jr,{children:a(r.widget.topProducts.units)}),ae(Yr,{children:S.units.toLocaleString()})]}),je(Gr,{children:[ae(jr,{children:a(r.widget.topProducts.revenue)}),ae(Yr,{children:E(S.revenue,m)})]}),je(Gr,{children:[ae(jr,{children:a(r.filter.productSort.volume)}),ae(Yr,{children:S.volume.toLocaleString()})]})]})]},S.rank))}):ae(Is,{\"data-testid\":\"products-fullview-desktop-table\",children:ae(nt,{columns:k,data:R,sortable:!0,onSort:W,sortColumn:g,sortDirection:f,getRowKey:S=>S.rank})}),U>1&&ae(lt,{currentPage:u,totalPages:U,onPageChange:x,itemsPerPage:v,totalItems:I.length})]})};import xt,{useState as Wu}from\"react\";import{LineChart as _u,Line as Ku,XAxis as Uu,YAxis as Gu,CartesianGrid as ju,Tooltip as Yu,ResponsiveContainer as Ju,Legend as Zu}from\"recharts\";import qu from\"@mui/icons-material/ArrowUpward\";import Qu from\"@mui/icons-material/ArrowDownward\";import{styled as Ne}from\"@mui/material/styles\";import{Box as to,Typography as Jo}from\"@mui/material\";import{ColorUtils as Eu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Hu}=Eu,Ws=Ne(to)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Hu(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,_s=Ne(to)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,Ks=Ne(to)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,Us=Ne(Jo)`\n font-size: 1rem;\n font-weight: 600;\n`,Gs=Ne(Jo)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,js=Ne(\"a\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`,Ys=Ne(to)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,Jr=Ne(to)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,Zr=Ne(Jo)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,qr=Ne(Jo)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Js=Ne(to)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Zs=Ne(to)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,g0=Ne(Jo)`\n margin-top: 4px;\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n @media (max-width: 767px) {\n font-size: 0.75rem;\n }\n`,qs=Ne(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as H,jsxs as be}from\"react/jsx-runtime\";var Zo=({conversionData:e,orders:t,summaryRate:o,summaryChangePct:n,dateRange:i,market:s,conversionFilter:d,markets:p,isLoading:w=!1,onBack:C,onDateRangeChange:u,onMarketChange:x,onConversionFilterChange:g})=>{let[b,f]=Wu(1),c=10,v=ht(),y=xt.useCallback(()=>C?.(),[C]),T=Ue(p),h=xt.useMemo(()=>typeof o==\"number\"&&Number.isFinite(o)?o:e.at(-1)?.rate??0,[o,e]),P=xt.useMemo(()=>{if(n!==void 0){if(n===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let te=\"neutral\";return n>0?te=\"up\":n<0&&(te=\"down\"),{direction:te,value:`${n>=0?\"+\":\"\"}${n.toFixed(1)}%`}}if(e.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let l=e.at(-1)?.rate??0,D=e[0].rate;if(D===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let B=(l-D)/D*100;if(Math.abs(B)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let ce=\"neutral\";return B>0?ce=\"up\":B<0&&(ce=\"down\"),{direction:ce,value:`${B>=0?\"+\":\"\"}${B.toFixed(1)}%`}},[n,e]),M=xt.useCallback(l=>l===\"standard\"?a(r.filter.conversionType.standard):l===\"subscription\"?a(r.filter.conversionType.subscription):a(r.filter.conversionType.all),[]),W=xt.useMemo(()=>M(d),[d,M]),O=xt.useMemo(()=>[gt(i,r),ft(s,T,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:d,options:[{value:\"all\",label:a(r.filter.conversionType.all)},{value:\"standard\",label:a(r.filter.conversionType.standard)},{value:\"subscription\",label:a(r.filter.conversionType.subscription)}]}],[d,i,s,T]),I=xt.useCallback((l,D)=>{l===\"dateRange\"?u?.(D):l===\"market\"?x?.(D):l===\"customerType\"&&(g?.(D),f(1))},[g,u,x]),U=xt.useMemo(()=>d===\"all\"?t:t.filter(l=>l.customerType.toLowerCase()===d),[t,d]),{totalPages:R,pageItems:m}=ct(U,b,c),k=xt.useMemo(()=>[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:l=>H(qs,{children:l})},{key:\"date\",label:a(r.fullView.conversionRate.columns.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},{key:\"customerType\",label:a(r.fullView.conversionRate.columns.type),sortable:!0},{key:\"items\",label:a(r.fullView.conversionRate.columns.items),sortable:!0},{key:\"total\",label:a(r.fullView.conversionRate.columns.total),sortable:!0,render:(l,D)=>E(Number(l),D.currencyCode,void 0,2)},{key:\"bv\",label:a(r.fullView.conversionRate.columns.bv),sortable:!0}],[]),S=xt.useCallback(()=>d===\"standard\"?\"#2e7d32\":d===\"subscription\"?\"#ed6c02\":\"#1976d2\",[d]);return w?be(me,{\"data-testid\":\"conversion-rate-full-view\",children:[H(pe,{title:a(r.widget.conversionRate.title),dateRange:ge(i),onBack:y,filters:O,onFilterChange:I}),H($t,{})]}):be(me,{\"data-testid\":\"conversion-rate-full-view\",children:[H(pe,{title:a(r.widget.conversionRate.title),dateRange:ge(i),onBack:y,filters:O,onFilterChange:I}),be(Br,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[H(Er,{children:be(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"0px\",flexWrap:\"wrap\"},children:[be(Hr,{\"data-testid\":\"conversion-rate-value\",style:{marginRight:\"6px\"},children:[h.toFixed(1),\"%\"]}),be(Wr,{direction:P.direction,\"data-testid\":\"conversion-rate-trend\",children:[P.direction===\"up\"&&H(qu,{}),P.direction===\"down\"&&H(Qu,{}),H(\"span\",{style:{fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:600,fontSize:\"14px\",lineHeight:\"20px\",letterSpacing:\"0em\"},children:P.value}),H(\"span\",{style:{marginLeft:\"2px\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:400,fontSize:\"12px\",lineHeight:\"16px\",letterSpacing:\"0.01em\",color:\"#5F5F5F\"},children:\"compared to this time last month\"})]})]})}),H(_r,{children:H(Kr,{\"data-testid\":\"conversion-fullview-chart\",children:H(Ju,{width:\"100%\",height:\"100%\",children:be(_u,{data:e,margin:{top:10,right:120,left:0,bottom:60},children:[H(ju,{strokeDasharray:\"3 3\"}),H(Uu,{dataKey:\"date\"}),H(Gu,{tickFormatter:l=>`${l}%`,domain:[0,\"auto\"]}),H(Yu,{formatter:l=>typeof l==\"number\"?`${l.toFixed(2)}%`:typeof l==\"string\"?l:a(r.fullView.conversionRate.notAvailable)}),H(Zu,{layout:\"vertical\",align:\"right\",verticalAlign:\"bottom\",wrapperStyle:{paddingRight:\"40px\",paddingBottom:\"40px\",paddingLeft:\"20px\",paddingTop:\"20px\",fontSize:\"14px\",fontWeight:500,display:\"flex\",justifyContent:\"flex-end\"}}),H(Ku,{type:\"monotone\",dataKey:\"rate\",stroke:S(),strokeWidth:2,name:`${a(r.widget.conversionRate.title)} (${W})`,dot:!1})]})})})})]}),be(Et,{\"data-testid\":\"conversion-fullview-table-section\",children:[be(Bt,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",U.length,\")\"]}),v?H(Js,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:m.map(l=>be(Ws,{children:[be(_s,{children:[be(Ks,{children:[H(Us,{children:l.customerName}),H(Gs,{children:l.date})]}),H(js,{children:l.orderId})]}),be(Ys,{children:[be(Jr,{children:[H(Zr,{children:a(r.fullView.conversionRate.columns.items)}),H(qr,{children:l.items})]}),be(Jr,{children:[H(Zr,{children:a(r.fullView.conversionRate.columns.orderTotal)}),be(qr,{children:[\"$\",l.total.toFixed(2)]})]}),be(Jr,{children:[H(Zr,{children:a(r.fullView.conversionRate.columns.totalSv)}),H(qr,{children:l.bv})]})]})]},l.orderId))}):H(Zs,{\"data-testid\":\"conversion-fullview-desktop-table\",children:H(nt,{columns:k,data:m,getRowKey:l=>l.orderId})}),R>1&&H(lt,{currentPage:b,totalPages:R,onPageChange:f,itemsPerPage:c,totalItems:U.length})]})]})};import oo,{useState as og}from\"react\";import{Box as rg}from\"@mui/material\";import{LineChart as ag,Line as ro,XAxis as ng,YAxis as ig,CartesianGrid as lg,Tooltip as sg,ResponsiveContainer as dg}from\"recharts\";import pg from\"@mui/icons-material/TrendingUp\";import cg from\"@mui/icons-material/TrendingDown\";import{styled as Mt}from\"@mui/material/styles\";import{Box as ko,Typography as Xu}from\"@mui/material\";import{ColorUtils as eg}from\"@nuskin/foundation-theme\";var{getGenomeColor:tg}=eg,Qs=Mt(ko)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Xs=Mt(ko)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,ed=Mt(ko)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n background-color: ${({theme:e})=>tg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,td=Mt(Kr)`\n min-height: 320px;\n\n @media (max-width: 767px) {\n min-height: 260px;\n height: 260px;\n }\n`,od=Mt(Xu)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n`,rd=Mt(ko)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`,qo=Mt(ko)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n }\n`,Kt=Mt(ko)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,ad=Mt(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{Fragment as nd,jsx as F,jsxs as De}from\"react/jsx-runtime\";var Ve={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function Ut(e){if(typeof e==\"number\")return Number.isFinite(e)?e:0;if(typeof e==\"string\"){let t=Number(e.replace(/,/g,\"\"));return Number.isFinite(t)?t:0}return 0}function ug(e){if(Array.isArray(e))return e;let t=e;return Array.isArray(t.daily)?t.daily.map(o=>({date:String(o.date??\"\"),total:Ut(o.total),members:Ut(o.members),retail:Ut(o.retail),brandAffiliates:Ut(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var ja=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:s,isLoading:d=!1,onBack:p,onDateRangeChange:w,onMarketChange:C,onSignupViewChange:u})=>{let[x,g]=og(1),b=10,f=ht(),c=oo.useCallback(()=>p?.(),[p]),v=Ue(s),y=oo.useMemo(()=>ug(e).map(m=>{let k=m,S=Ut(k.members),l=Ut(k.retail),D=Ut(k.brandAffiliates??k.brandAffiliate??k.brand_affiliates??k.brand_affiliate),B=Ut(k.total??k.all??k.signupTotal??k.value);return{...m,total:B>0?B:S+l+D,members:S,retail:l,brandAffiliates:D}}),[e]),T=oo.useMemo(()=>y.length===0?0:y[y.length-1].total,[y]),h=oo.useMemo(()=>{if(y.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let R=y[0].total,m=y[y.length-1].total;if(R<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let k=m-R,S=k/R*100,l=\"neutral\";return S>0?l=\"up\":S<0&&(l=\"down\"),{direction:l,absoluteChange:Math.round(k),percentageChange:`${S>=0?\"+\":\"\"}${S.toFixed(1)}%`}},[y,r]),P=y.length>0,M=oo.useMemo(()=>[gt(o,r),ft(n,v,r),{key:\"signupView\",label:a(r.filter.signupView.label),value:i,options:[{value:\"all\",label:a(r.filter.signupView.all)},{value:\"members\",label:a(r.filter.signupView.members)},{value:\"retail\",label:a(r.filter.signupView.retail)},{value:\"brandAffiliates\",label:a(r.filter.signupView.brandAffiliates)}]}],[o,n,v,i]),W=oo.useCallback((R,m)=>{R===\"dateRange\"?w?.(m):R===\"market\"?C?.(m):R===\"signupView\"&&(u?.(m),g(1))},[w,C,u]),{totalPages:O,pageItems:I}=ct(t,x,b),U=oo.useMemo(()=>[{key:\"id\",label:a(r.fullView.signups.columns.id),sortable:!0},{key:\"name\",label:a(r.fullView.signups.columns.name),sortable:!0,render:R=>F(ad,{children:R})},{key:\"date\",label:a(r.fullView.signups.columns.date),sortable:!0},{key:\"type\",label:a(r.fullView.signups.columns.type),sortable:!0},{key:\"email\",label:a(r.fullView.signups.columns.email),sortable:!0},{key:\"status\",label:a(r.fullView.signups.columns.status),sortable:!0}],[]);return d?De(me,{\"data-testid\":\"signups-full-view\",children:[F(pe,{title:a(r.widget.signups.title),dateRange:ge(o),onBack:c,filters:M,onFilterChange:W}),F($t,{})]}):De(me,{\"data-testid\":\"signups-full-view\",children:[F(pe,{title:a(r.widget.signups.title),dateRange:ge(o),onBack:c,filters:M,onFilterChange:W}),De(Br,{\"data-testid\":\"signups-fullview-metric-chart\",children:[De(Er,{children:[F(Hr,{\"data-testid\":\"signups-total\",children:T.toLocaleString()}),De(Wr,{direction:h.direction,children:[h.direction===\"up\"&&F(pg,{}),h.direction===\"down\"&&F(cg,{}),h.direction!==\"neutral\"&&De(nd,{children:[De(\"span\",{style:{fontWeight:600,lineHeight:1},children:[h.absoluteChange>0?\"+\":\"\",h.absoluteChange]}),F(\"span\",{style:{fontWeight:400,lineHeight:1},children:h.percentageChange})]}),h.direction===\"neutral\"&&F(\"span\",{children:h.percentageChange})]}),F(od,{children:a(r.widget.conversionRate.comparison)})]}),F(_r,{children:P?De(rd,{children:[F(td,{\"data-testid\":\"signups-fullview-chart\",children:F(dg,{width:\"100%\",height:\"100%\",minHeight:240,children:De(ag,{data:y,children:[F(lg,{strokeDasharray:\"3 3\"}),F(ng,{dataKey:\"date\"}),F(ig,{}),F(sg,{}),i===\"all\"&&De(nd,{children:[F(ro,{type:\"monotone\",dataKey:\"total\",stroke:Ve.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),F(ro,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.widget.signups.members),dot:{r:2},connectNulls:!0}),F(ro,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.widget.signups.retail),dot:{r:2},connectNulls:!0}),F(ro,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.widget.signups.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&F(ro,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.widget.signups.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&F(ro,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.widget.signups.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&F(ro,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.widget.signups.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),De(rg,{children:[i===\"all\"&&De(qo,{children:[F(Kt,{style:{color:Ve.total},children:a(r.widget.signups.total)}),F(Kt,{style:{color:Ve.members},children:a(r.widget.signups.members)}),F(Kt,{style:{color:Ve.retail},children:a(r.widget.signups.retail)}),F(Kt,{style:{color:Ve.brandAffiliates},children:a(r.widget.signups.brandAffiliates)})]}),i===\"members\"&&F(qo,{children:F(Kt,{style:{color:Ve.members},children:a(r.widget.signups.members)})}),i===\"retail\"&&F(qo,{children:F(Kt,{style:{color:Ve.retail},children:a(r.widget.signups.retail)})}),i===\"brandAffiliates\"&&F(qo,{children:F(Kt,{style:{color:Ve.brandAffiliates},children:a(r.widget.signups.brandAffiliates)})})]})]}):F(Ht,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),De(Et,{\"data-testid\":\"signups-fullview-table-section\",children:[F(Bt,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),f?F(Qs,{\"data-testid\":\"signups-fullview-mobile-cards\",children:I.map(R=>De(ed,{children:[F(Ds,{children:R.name}),De(Ps,{children:[R.date,\" - \",R.type]}),F(Rs,{children:R.email}),F(Ms,{status:R.status,children:R.status})]},R.id))}):F(Xs,{\"data-testid\":\"signups-fullview-desktop-table\",children:F(nt,{columns:U,data:I,getRowKey:R=>R.id})}),O>1&&F(lt,{currentPage:x,totalPages:O,onPageChange:g,itemsPerPage:b,totalItems:t.length})]})]})};import ao,{useState as fg}from\"react\";import{PieChart as mg,Pie as hg,Cell as xg,ResponsiveContainer as bg,Tooltip as yg}from\"recharts\";import wg from\"@mui/icons-material/TrendingUp\";import Cg from\"@mui/icons-material/TrendingDown\";import{styled as So,ColorUtils as gg}from\"@nuskin/foundation-theme\";import{styled as ye}from\"@mui/material/styles\";import{Box as bt,Typography as To}from\"@mui/material\";var{getGenomeColor:Ya}=gg,Qr=So(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,id=So(\"div\")`\n flex: 1;\n`,ld=So(\"span\")`\n font-weight: 600;\n`,sd=So(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,dd=So(\"span\")`\n font-weight: 600;\n`,pd=ye(bt)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>Ya(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`,cd=ye(bt)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`,ud=ye(bt)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`,gd=ye(To)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,fd=ye(To)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.text.primary};\n`,md=ye(To)`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":t.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,hd=ye(bt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,xd=ye(bt)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({theme:e})=>Ya(e,\"N30\")};\n }\n`,Xr=ye(bt)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,ay=ye(bt)`\n display: none;\n`,bd=ye(To)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`,yd=ye(To)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`,wd=ye(To)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Cd=ye(bt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,vd=ye(bt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,kd=ye(bt)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Ya(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Sd=ye(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Td=So(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as K,jsxs as ve}from\"react/jsx-runtime\";var Ja=({categories:e,dateRange:t,market:o,categorySort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onCategorySortChange:C})=>{let[u,x]=fg(1),g=10,b=ht(),f=ao.useCallback(()=>d?.(),[d]),c=Ue(i),v=ao.useMemo(()=>[gt(t,r),ft(o,c,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.filter.categorySort.byRevenue)},{value:\"trend\",label:a(r.filter.categorySort.byTrend)}]}],[n,t,o,c]),y=ao.useCallback((l,D)=>{l===\"dateRange\"?p?.(D):l===\"market\"?w?.(D):l===\"sort\"&&(C?.(D),x(1))},[C,p,w]),T=l=>{let{cx:D,cy:B,midAngle:ce,innerRadius:te,outerRadius:Re,percentage:wt}=l,Ee=Math.PI/180,J=te+(Re-te)*.45,Je=D+J*Math.cos(-ce*Ee),He=B+J*Math.sin(-ce*Ee);return K(\"text\",{x:Je,y:He,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"middle\",fontSize:\"12\",fontWeight:\"700\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0\",style:{lineHeight:\"14px\",pointerEvents:\"none\"},children:`${wt}%`})},h=l=>l===\"up\"?K(wg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):l===\"down\"?K(Cg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,P=l=>{if(!l)return\"neutral\";let D=Number.parseFloat(l);return Number.isNaN(D)?\"neutral\":D>0?\"up\":D<0?\"down\":\"neutral\"},M=ao.useMemo(()=>[...e].sort((l,D)=>n===\"revenue\"?D.revenue-l.revenue:(pt(D.trend?.revenue)??-1/0)-(pt(l.trend?.revenue)??-1/0)),[e,n]),{totalRevenue:W,totalRevenueTrendDirection:O,totalRevenueTrend:I}=ao.useMemo(()=>{let l=M.reduce((ce,te)=>ce+te.revenue,0),{direction:D,formatted:B}=Vt(M,ce=>ce.revenue,ce=>ce.trend?.revenue);return{totalRevenue:l,totalRevenueTrendDirection:D,totalRevenueTrend:B}},[M]),U=ao.useMemo(()=>M.slice(0,5),[M]),{totalPages:R,pageItems:m}=ct(M,u,g),k=ao.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:(l,D)=>ve(Qr,{children:[K(Xr,{dotColor:D.color}),K(Td,{children:D.name})]})},{key:\"revenue\",label:a(r.fullView.categories.columns.revenue),sortable:!0,render:(l,D)=>E(Number(l),D.currencyCode)},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:l=>`${Number(l)}%`},{key:\"trend\",label:a(r.fullView.categories.columns.trend),render:(l,D)=>D.trend?.revenue??a(r.defaults.noValue)}],[]),S=M[0]?.currencyCode;return s?ve(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),K($t,{})]}):e.length===0?ve(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),K(Ht,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):ve(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),ve(pd,{\"data-testid\":\"categories-fullview-top-section\",children:[ve(cd,{\"data-testid\":\"categories-fullview-chart\",children:[K(bg,{width:\"100%\",height:\"100%\",children:ve(mg,{children:[K(hg,{data:M,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:T,labelLine:!1,children:M.map(l=>K(xg,{fill:l.color},`cell-${l.id}`))}),K(yg,{formatter:l=>E(l,S)})]})}),ve(ud,{\"data-testid\":\"categories-fullview-donut-center\",children:[K(gd,{children:a(r.stats.revenue)}),K(fd,{children:E(W,S)}),ve(md,{direction:O,children:[h(O),K(\"span\",{children:I})]})]})]}),K(hd,{\"data-testid\":\"categories-fullview-summary\",children:U.map(l=>ve(xd,{children:[K(Xr,{dotColor:l.color}),K(bd,{children:l.name}),K(yd,{children:E(l.revenue,l.currencyCode)}),ve(wd,{children:[\"(\",l.percentage,\"%)\"]}),l.trend?.revenue?K(Sd,{direction:P(l.trend.revenue),children:h(P(l.trend.revenue))}):null]},l.id))})]}),ve(Et,{\"data-testid\":\"categories-fullview-table-section\",children:[ve(Bt,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",M.length,\")\"]}),b?K(vd,{children:m.map(l=>ve(kd,{children:[K(Xr,{dotColor:l.color}),ve(id,{children:[K(ld,{children:l.name}),K(sd,{children:E(l.revenue,l.currencyCode)})]}),ve(dd,{children:[l.percentage,\"%\"]})]},l.id))}):K(Cd,{children:K(nt,{columns:k,data:m,sortable:!0,getRowKey:l=>l.id})}),R>1&&K(lt,{currentPage:u,totalPages:R,onPageChange:x,itemsPerPage:g,totalItems:M.length})]})]})};import Dd from\"react\";function Do(e){Bo(e),Dd.useEffect(()=>(Bo(e),()=>{Bo(void 0)}),[e])}var vg=({translate:e,children:t})=>(Do(e),t??null);function kg(){return Dd.useCallback(e=>qt(e),[])}import{jsx as Qo}from\"react/jsx-runtime\";var Sg=\"shoppingDashboardView\",Tg=[],Dg=[],Pg=[],Rg=[],Mg=[],Og=[];function Rd(e){return typeof e==\"object\"&&e!==null}function Fg(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function ea(e,t){if(!Rd(e))return\"dashboard\";let o=e[t];return Fg(o)?o:\"dashboard\"}function Pd(e,t,o){return{...Rd(e)?e:{},[t]:o}}function Lg(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var $g=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,orders:s,signups:d,isLoading:p=!1,error:w,shopTitle:C,className:u,translate:x,initialDateRange:g=\"last30days\",initialMarket:b=\"all\",initialProductSort:f=\"units\",initialSignupView:c=\"all\",initialConversionFilter:v=\"all\",initialCategorySort:y=\"revenue\",markets:T,historyAdapter:h,historyStateKey:P=Sg,resetToDashboardOnMount:M=!0,onDateRangeChange:W,onMarketChange:O,onProductSortChange:I,onSignupViewChange:U,onConversionFilterChange:R,onCategorySortChange:m,onViewChange:k})=>{Do(x);let[S,l]=ee.useState(\"dashboard\"),D=ee.useRef(!1),[B,ce]=ee.useState(g),[te,Re]=ee.useState(b),[wt,Ee]=ee.useState(f),[J,Je]=ee.useState(c),[He,so]=ee.useState(v),[po,tr]=ee.useState(y),or=t??Tg,Mo=o??Dg,Oo=n??Pg,Fo=i??Rg,la=s??Mg,sa=d??Og,Ze=ee.useCallback(V=>{l(V),k?.(V)},[k]),We=ee.useCallback(()=>h?ea(h.location?.state,P):typeof window>\"u\"?\"dashboard\":ea(window.history.state,P),[h,P]),Ct=ee.useCallback((V,Me)=>{if(h){let jt=Pd(h.location?.state,P,V),ln=Lg(h.location,jt);if(Me===\"replace\"){h.replace(ln);return}h.push(ln);return}if(typeof window>\"u\")return;let _e=Pd(window.history.state,P,V);if(Me===\"replace\"){window.history.replaceState(_e,\"\");return}window.history.pushState(_e,\"\")},[h,P]);ee.useEffect(()=>{if(M?(Ct(\"dashboard\",\"replace\"),D.current=!1,Ze(\"dashboard\")):Ze(We()),h)return h.listen((Me,_e)=>{if(_e===\"POP\"){let jt=ea(Me.state,P);D.current=jt!==\"dashboard\",Ze(jt)}});let V=Me=>{let _e=ea(Me.state,P);D.current=_e!==\"dashboard\",Ze(_e)};return window.addEventListener(\"popstate\",V),()=>{window.removeEventListener(\"popstate\",V)}},[h,P,We,M,Ze,Ct]);let ke=ee.useCallback(V=>{D.current=!0,Ct(V,\"push\"),Ze(V)},[Ze,Ct]),qe=ee.useCallback(()=>{if(S!==\"dashboard\"&&D.current){if(h){h.goBack();return}typeof window<\"u\"&&window.history.back();return}D.current=!1,Ct(\"dashboard\",\"replace\"),Ze(\"dashboard\")},[S,h,Ze,Ct]),vt=ee.useCallback(V=>{ce(V),W?.(V)},[W]),st=ee.useCallback(V=>{Re(V),O?.(V)},[O]),Gt=ee.useCallback(V=>{Ee(V),I?.(V)},[I]),Lo=ee.useCallback(V=>{Je(V),U?.(V)},[U]),$o=ee.useCallback(V=>{so(V),R?.(V)},[R]),Io=ee.useCallback(V=>{tr(V),m?.(V)},[m]),da=ee.useCallback(()=>{ke(\"products\")},[ke]),pa=ee.useCallback(()=>{ke(\"conversion-rate\")},[ke]),ca=ee.useCallback(()=>{ke(\"signups\")},[ke]),G=ee.useCallback(()=>{ke(\"categories\")},[ke]);return S===\"products\"?Qo(Yo,{products:or,dateRange:B,market:te,productSort:wt,markets:T,isLoading:p,onBack:qe,onDateRangeChange:vt,onMarketChange:st,onProductSortChange:Gt}):S===\"conversion-rate\"?Qo(Zo,{conversionData:Mo,orders:la,dateRange:B,market:te,conversionFilter:He,markets:T,isLoading:p,onBack:qe,onDateRangeChange:vt,onMarketChange:st,onConversionFilterChange:$o}):S===\"signups\"?Qo(ja,{signupData:Oo,signups:sa,dateRange:B,market:te,signupView:J,markets:T,isLoading:p,onBack:qe,onDateRangeChange:vt,onMarketChange:st,onSignupViewChange:Lo}):S===\"categories\"?Qo(Ja,{categories:Fo,dateRange:B,market:te,categorySort:po,markets:T,isLoading:p,onBack:qe,onDateRangeChange:vt,onMarketChange:st,onCategorySortChange:Io}):Qo(Ha,{stats:e,topProducts:or,conversionData:Mo,signupData:Oo,categories:Fo,isLoading:p,error:w,shopTitle:C,className:u,dateRange:B,market:te,productSort:wt,signupView:J,conversionFilter:He,categorySort:po,markets:T,onDateRangeChange:vt,onMarketChange:st,onProductSortChange:Gt,onSignupViewChange:Lo,onConversionFilterChange:$o,onCategorySortChange:Io,onProductsTitleClick:da,onConversionTitleClick:pa,onSignupsTitleClick:ca,onCategoriesToTitleClick:G})};import{styled as Xo}from\"@nuskin/foundation-theme\";var Za=Xo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,Md=Xo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`,Od=Xo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`,Fd=Xo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`,Ld=Xo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import qa from\"react\";import{PieChart as Ig,Pie as Ng,Cell as Vg,ResponsiveContainer as Ag,Tooltip as zg}from\"recharts\";var L={title:{key:\"productOfferDashboard.title\",fallback:\"Performance Overview\"},error:{key:\"productOfferDashboard.error\",fallback:\"Failed to load dashboard data. Please try again.\"},stats:{revenue:{key:\"productOfferDashboard.stats.revenue\",fallback:\"Total Revenue\"},offersPurchased:{key:\"productOfferDashboard.stats.offersPurchased\",fallback:\"Offers Purchased\"},conversionRate:{key:\"productOfferDashboard.stats.conversionRate\",fallback:\"Conversion Rate\"},trendUp:{key:\"productOfferDashboard.stats.trendUp\",fallback:\"Trending up\"},trendDown:{key:\"productOfferDashboard.stats.trendDown\",fallback:\"Trending down\"},trendNeutral:{key:\"productOfferDashboard.stats.trendNeutral\",fallback:\"No change\"},comparedTo:{key:\"productOfferDashboard.stats.comparedTo\",fallback:\"compared to this time last month\"}},filter:{dateRange:{label:{key:\"productOfferDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"productOfferDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"productOfferDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"productOfferDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"productOfferDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},market:{label:{key:\"productOfferDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"productOfferDashboard.filter.market.all\",fallback:\"All Markets\"}},offerSort:{byRevenue:{key:\"productOfferDashboard.filter.offerSort.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.filter.offerSort.byUnits\",fallback:\"Units\"}},productSort:{byUnits:{key:\"productOfferDashboard.filter.productSort.byUnits\",fallback:\"Units\"},byRevenue:{key:\"productOfferDashboard.filter.productSort.byRevenue\",fallback:\"Revenue\"},byVolume:{key:\"productOfferDashboard.filter.productSort.byVolume\",fallback:\"Volume\"}},conversionFilter:{overall:{key:\"productOfferDashboard.filter.conversionFilter.overall\",fallback:\"Overall\"}}},widget:{topProducts:{title:{key:\"productOfferDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},emptyState:{key:\"productOfferDashboard.widget.topProducts.emptyState\",fallback:\"No products data available\"}},conversionRate:{title:{key:\"productOfferDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},subtitle:{key:\"productOfferDashboard.widget.conversionRate.subtitle\",fallback:\"Orders \\xF7 Site visits\"}},topPerformingOffers:{title:{key:\"productOfferDashboard.widget.topPerformingOffers.title\",fallback:\"Top Performing Offers\"},totalRevenue:{key:\"productOfferDashboard.widget.topPerformingOffers.totalRevenue\",fallback:\"Total revenue\"},emptyState:{key:\"productOfferDashboard.widget.topPerformingOffers.emptyState\",fallback:\"No offers data available\"}},menu:{fullView:{key:\"productOfferDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{back:{key:\"productOfferDashboard.navigation.back\",fallback:\"Back to Dashboard\"}},ariaLabel:{dashboard:{key:\"productOfferDashboard.ariaLabel.dashboard\",fallback:\"Product Offer Performance Dashboard\"},statsCard:{key:\"productOfferDashboard.ariaLabel.statsCard\",fallback:\"Performance metric\"},conversionChart:{key:\"productOfferDashboard.ariaLabel.conversionChart\",fallback:\"Conversion rate chart\"},topProducts:{key:\"productOfferDashboard.ariaLabel.topProducts\",fallback:\"Top selling products\"},topOffers:{key:\"productOfferDashboard.ariaLabel.topOffers\",fallback:\"Top performing offers chart\"},widgetMenu:{key:\"productOfferDashboard.ariaLabel.widgetMenu\",fallback:\"Widget options menu\"},filterDateRange:{key:\"productOfferDashboard.ariaLabel.filterDateRange\",fallback:\"Filter by date range\"},filterMarket:{key:\"productOfferDashboard.ariaLabel.filterMarket\",fallback:\"Filter by market\"},backButton:{key:\"productOfferDashboard.ariaLabel.backButton\",fallback:\"Back to dashboard overview\"}},fullView:{topOffers:{title:{key:\"productOfferDashboard.fullView.topOffers.title\",fallback:\"Top Performing Offers\"},columnName:{key:\"productOfferDashboard.fullView.topOffers.columnName\",fallback:\"Offer Name\"},columnRevenue:{key:\"productOfferDashboard.fullView.topOffers.columnRevenue\",fallback:\"Revenue\"},columnPercentage:{key:\"productOfferDashboard.fullView.topOffers.columnPercentage\",fallback:\"Share\"},columnTrend:{key:\"productOfferDashboard.fullView.topOffers.columnTrend\",fallback:\"Trend\"}}},defaults:{trendZero:{key:\"productOfferDashboard.defaults.trendZero\",fallback:\"+0%\"},noData:{key:\"productOfferDashboard.defaults.noData\",fallback:\"--\"}}};function N(e){return qt(e)}import{jsx as ne,jsxs as Ye}from\"react/jsx-runtime\";var Bg=({offers:e,offerSort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s})=>{let d=qa.useCallback(g=>{let b=g.target.value;i?.(b)},[i]),{sortedOffers:p,totalRevenue:w,trendDirection:C,formattedTrend:u}=qa.useMemo(()=>{let g=[...e].sort((v,y)=>t===\"revenue\"?y.revenue-v.revenue:y.percentage-v.percentage),b=g.reduce((v,y)=>v+y.revenue,0),{direction:f,formatted:c}=Vt(g,v=>v.revenue,v=>v.trend?.revenue);return{sortedOffers:g,totalRevenue:b,trendDirection:f,formattedTrend:c}},[e,t]),x=p[0]?.currencyCode;return o&&e.length===0?ne(At,{\"data-testid\":\"widget-top-offers\",children:ne(fr,{})}):e.length===0?Ye(At,{\"data-testid\":\"widget-top-offers\",children:[ne(wo,{children:ne(Co,{children:n??N(L.widget.topPerformingOffers.title)})}),ne(Lr,{\"data-testid\":\"top-offers-empty-state\",children:ne($r,{children:N(L.widget.topPerformingOffers.emptyState)})})]}):Ye(At,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":N(L.ariaLabel.topOffers),children:[Ye(wo,{children:[ne(Co,{as:\"button\",onClick:s,\"aria-label\":N(L.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??N(L.widget.topPerformingOffers.title)}),Ye(br,{children:[Ye(yr,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":N(L.ariaLabel.topOffers),children:[ne(\"option\",{value:\"revenue\",children:N(L.filter.offerSort.byRevenue)}),ne(\"option\",{value:\"units\",children:N(L.filter.offerSort.byUnits)})]}),ne(ot,{widgetId:\"top-offers\",onFullView:s})]})]}),Ye(wr,{children:[Ye(Cr,{\"data-testid\":\"top-offers-chart\",children:[ne(Ag,{width:\"100%\",height:\"100%\",children:Ye(Ig,{children:[ne(Ng,{data:p,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:p.map(g=>ne(Vg,{fill:g.color},`cell-${g.id}`))}),ne(zg,{formatter:g=>E(g,x)})]})}),Ye(vr,{\"data-testid\":\"top-offers-donut-center\",children:[ne(kr,{children:N(L.widget.topPerformingOffers.totalRevenue)}),ne(Sr,{children:E(w,x)}),ne(Tr,{direction:C,children:u})]})]}),ne(Dr,{\"data-testid\":\"top-offers-legend-container\",children:p.map((g,b)=>{let f=Nt(g.trend?.revenue);return Ye(Pr,{\"data-testid\":`offer-legend-${b}`,children:[ne(Rr,{color:g.color}),Ye(Mr,{children:[ne(Or,{children:g.name}),ne(Fr,{children:E(g.revenue,g.currencyCode)})]}),Ye(ql,{children:[g.percentage,\"%\"]}),g.trend?.revenue?ne(es,{direction:f,\"data-testid\":`offer-legend-trend-${b}`,\"aria-label\":g.trend.revenue,children:tt(f)}):null]},g.id)})})]})]})},ta=qa.memo(Bg);ta.displayName=\"TopPerformingOffersPieChart\";import{jsx as no,jsxs as Po}from\"react/jsx-runtime\";var Eg=[],Hg=[],Wg=[],Qa=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:d,className:p,dateRange:w=\"last30days\",market:C=\"all\",productSort:u=\"units\",conversionFilter:x=\"all\",offerSort:g=\"revenue\",conversionSummaryRate:b,conversionSummaryChangePct:f,markets:c,onDateRangeChange:v,onMarketChange:y,onProductSortChange:T,onConversionFilterChange:h,onOfferSortChange:P,onProductsTitleClick:M,onConversionTitleClick:W,onOffersTitleClick:O})=>{let I=t??Eg,U=o??Hg,R=n??Wg,m=k=>k?k.startsWith(\"+\")&&k!==\"+0%\"?\"up\":k.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return s?no(Za,{as:\"main\",className:p,\"aria-label\":N(L.ariaLabel.dashboard),children:Po(Ld,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Po(\"strong\",{children:[N(L.error),\":\"]}),\" \",s]})}):Po(Za,{as:\"main\",className:p,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":N(L.ariaLabel.dashboard),\"aria-busy\":i,children:[no(Eo,{shopTitle:d??N(L.title),dateRange:w,market:C,isLoading:i,markets:c,stats:e?{shopTitle:e.shopTitle??\"\",dateRange:e.dateRange,selectedMarket:e.selectedMarket,metrics:{revenue:e.metrics.revenue,volume:\"\",siteVisits:\"\",conversionRate:e.metrics.conversionRate},trend:{}}:void 0,onDateRangeChange:v,onMarketChange:y}),Po(Md,{\"data-testid\":\"top-charts-row\",children:[no(xo,{conversionData:U,conversionFilter:x,isLoading:i,summaryRate:b,summaryChangePct:f,onFilterChange:h,onTitleClick:W}),Po(Od,{\"data-testid\":\"stats-card-stack\",children:[no(Tt,{layout:\"split\",title:N(L.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:m(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:N(L.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),no(Tt,{layout:\"split\",title:N(L.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:m(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:N(L.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Po(Fd,{\"data-testid\":\"bottom-charts-row\",children:[no(ho,{products:I,productSort:u,isLoading:i,maxProducts:5,onSortChange:T,onTitleClick:M}),no(ta,{offers:R,offerSort:g,isLoading:i,onSortChange:P,onTitleClick:O})]})]})};import de from\"react\";import io,{useState as Kg}from\"react\";import{PieChart as Ug,Pie as Gg,Cell as jg,ResponsiveContainer as Yg,Tooltip as Jg}from\"recharts\";import{styled as Y}from\"@mui/material/styles\";import{Box as Pe,Typography as yt}from\"@mui/material\";import{ColorUtils as _g}from\"@nuskin/foundation-theme\";var{getGenomeColor:Xa}=_g,$d=Y(Pe)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Xa(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`,Id=Y(Pe)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`,Nd=Y(Pe)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`,Vd=Y(yt)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Ad=Y(yt)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.text.primary};\n`,zd=Y(yt)`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?t.palette.success.main:e===\"down\"?t.palette.error.main:t.palette.text.secondary};\n`,Bd=Y(Pe)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,Ed=Y(Pe)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Xa(e,\"N30\")};\n }\n`,oa=Y(Pe)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,Hd=Y(Pe)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,Wd=Y(yt)`\n font-size: 0.875rem;\n font-weight: 500;\n`,_d=Y(yt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Kd=Y(yt)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,Ud=Y(Pe)`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,Gd=Y(Pe)`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,jd=Y(Pe)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Yd=Y(Pe)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Jd=Y(Pe)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Xa(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Zd=Y(Pe)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,qd=Y(yt)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,Qd=Y(Pe)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,ra=Y(Pe)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,aa=Y(yt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,en=Y(yt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Xd=Y(yt)`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;import{Fragment as Zg,jsx as z,jsxs as ie}from\"react/jsx-runtime\";var tn=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onOfferSortChange:C})=>{let[u,x]=Kg(1),g=10,b=ht(),f=io.useCallback(()=>d?.(),[d]),c=Ue(i),v=io.useMemo(()=>[gt(t,L),ft(o,c,L),{key:\"sort\",label:N(L.filter.offerSort.byRevenue),value:n,options:[{value:\"revenue\",label:N(L.filter.offerSort.byRevenue)},{value:\"units\",label:N(L.filter.offerSort.byUnits)}]}],[t,o,c,n]),y=io.useCallback((m,k)=>{m===\"dateRange\"?p?.(k):m===\"market\"?w?.(k):m===\"sort\"&&(C?.(k),x(1))},[C,p,w]),T=io.useMemo(()=>[...e].sort((m,k)=>n===\"revenue\"?k.revenue-m.revenue:k.percentage-m.percentage),[e,n]),{totalRevenue:h,totalRevenueTrendDirection:P,totalRevenueTrend:M}=io.useMemo(()=>{let m=T.reduce((l,D)=>l+D.revenue,0),{direction:k,formatted:S}=Vt(T,l=>l.revenue,l=>l.trend?.revenue);return{totalRevenue:m,totalRevenueTrendDirection:k,totalRevenueTrend:S}},[T]),W=io.useMemo(()=>T.slice(0,5),[T]),{totalPages:O,pageItems:I}=ct(T,u,g),U=io.useMemo(()=>[{key:\"name\",label:N(L.fullView.topOffers.columnName),sortable:!0,render:(m,k)=>ie(Qr,{children:[z(oa,{dotColor:k.color}),z(\"span\",{children:k.name})]})},{key:\"revenue\",label:N(L.fullView.topOffers.columnRevenue),sortable:!0,render:(m,k)=>E(Number(m),k.currencyCode)},{key:\"percentage\",label:N(L.fullView.topOffers.columnPercentage),sortable:!0,render:m=>`${Number(m)}%`},{key:\"trend\",label:N(L.fullView.topOffers.columnTrend),render:(m,k)=>{if(!k.trend?.revenue)return N(L.defaults.noData);let S=Nt(k.trend.revenue);return ie(Gd,{direction:S,children:[tt(S),z(\"span\",{children:k.trend.revenue})]})}}],[]),R=T[0]?.currencyCode;return s?ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),z($t,{})]}):e.length===0?ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),z(Ht,{\"data-testid\":\"top-offers-fullview-empty\",children:N(L.widget.topPerformingOffers.emptyState)})]}):ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),ie($d,{\"data-testid\":\"top-offers-fullview-top-section\",children:[ie(Id,{\"data-testid\":\"top-offers-fullview-chart\",children:[z(Yg,{width:\"100%\",height:\"100%\",children:ie(Ug,{children:[z(Gg,{data:T,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:T.map(m=>z(jg,{fill:m.color},`cell-${m.id}`))}),z(Jg,{formatter:m=>E(m,R)})]})}),ie(Nd,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[z(Vd,{children:N(L.widget.topPerformingOffers.totalRevenue)}),z(Ad,{children:E(h,R)}),z(zd,{direction:P,children:M})]})]}),z(Bd,{\"data-testid\":\"top-offers-fullview-summary\",children:W.map(m=>{let k=Nt(m.trend?.revenue);return ie(Ed,{children:[z(oa,{dotColor:m.color}),ie(Hd,{children:[z(Wd,{children:m.name}),z(_d,{children:E(m.revenue,m.currencyCode)})]}),ie(Kd,{children:[m.percentage,\"%\"]}),m.trend?.revenue?z(Ud,{direction:k,\"aria-label\":m.trend.revenue,children:tt(k)}):null]},m.id)})})]}),ie(Et,{\"data-testid\":\"top-offers-table\",children:[ie(Bt,{\"data-testid\":\"top-offers-fullview-table-title\",children:[N(L.fullView.topOffers.title),\" (\",T.length,\")\"]}),b?z(Yd,{children:I.map(m=>{let k=pt(m.trend?.revenue),S=\"neutral\";return k!==null&&k>0?S=\"up\":k!==null&&k<0&&(S=\"down\"),ie(Jd,{children:[ie(Zd,{children:[z(oa,{dotColor:m.color}),z(qd,{children:m.name})]}),ie(Qd,{children:[ie(ra,{children:[z(aa,{children:N(L.fullView.topOffers.columnRevenue)}),z(en,{children:E(m.revenue,m.currencyCode)})]}),ie(ra,{children:[z(aa,{children:N(L.fullView.topOffers.columnPercentage)}),ie(en,{children:[m.percentage,\"%\"]})]}),ie(ra,{children:[z(aa,{children:N(L.fullView.topOffers.columnTrend)}),z(Xd,{direction:S,children:m.trend?.revenue?ie(Zg,{children:[tt(S),z(\"span\",{children:m.trend.revenue})]}):N(L.defaults.noData)})]})]})]},m.id)})}):z(jd,{children:z(nt,{columns:U,data:I,sortable:!0,getRowKey:m=>m.id})}),O>1&&z(lt,{currentPage:u,totalPages:O,onPageChange:x,itemsPerPage:g,totalItems:T.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as ia}from\"react/jsx-runtime\";var qg=\"productOfferDashboardView\",Qg=[],Xg=[],ef=[],tf=[];function tp(e){return typeof e==\"object\"&&e!==null}function of(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function na(e,t){if(!tp(e))return\"dashboard\";let o=e[t];return of(o)?o:\"dashboard\"}function ep(e,t,o){return{...tp(e)?e:{},[t]:o}}function rf(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var af=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:d,className:p,allProducts:w,orders:C,allOffers:u,conversionSummaryRate:x,conversionSummaryChangePct:g,conversionFullViewData:b,conversionFullViewRate:f,conversionFullViewChangePct:c,initialDateRange:v=\"last30days\",initialMarket:y=\"all\",initialProductSort:T=\"units\",initialConversionFilter:h=\"all\",initialOfferSort:P=\"revenue\",markets:M,translate:W,historyAdapter:O,historyStateKey:I=qg,resetToDashboardOnMount:U=!0,onDateRangeChange:R,onMarketChange:m,onProductSortChange:k,onConversionFilterChange:S,onOfferSortChange:l,onViewChange:D})=>{Do(W);let[B,ce]=de.useState(\"dashboard\"),te=de.useRef(!1),[Re,wt]=de.useState(v),[Ee,J]=de.useState(y),[Je,He]=de.useState(T),[so,po]=de.useState(h),[tr,or]=de.useState(P),Mo=t??Qg,Oo=o??Xg,Fo=n??ef,la=w??Mo,sa=C??tf,Ze=u??Fo,We=de.useCallback(G=>{ce(G),D?.(G)},[D]),Ct=de.useCallback(()=>O?na(O.location?.state,I):typeof window>\"u\"?\"dashboard\":na(window.history.state,I),[O,I]),ke=de.useCallback((G,V)=>{if(O){let _e=ep(O.location?.state,I,G),jt=rf(O.location,_e);if(V===\"replace\"){O.replace(jt);return}O.push(jt);return}if(typeof window>\"u\")return;let Me=ep(window.history.state,I,G);if(V===\"replace\"){window.history.replaceState(Me,\"\");return}window.history.pushState(Me,\"\")},[O,I]);de.useEffect(()=>{if(U?(ke(\"dashboard\",\"replace\"),te.current=!1,We(\"dashboard\")):We(Ct()),O)return O.listen((V,Me)=>{if(Me===\"POP\"){let _e=na(V.state,I);te.current=_e!==\"dashboard\",We(_e)}});let G=V=>{let Me=na(V.state,I);te.current=Me!==\"dashboard\",We(Me)};return window.addEventListener(\"popstate\",G),()=>{window.removeEventListener(\"popstate\",G)}},[O,I,Ct,U,We,ke]);let qe=de.useCallback(G=>{te.current=!0,ke(G,\"push\"),We(G)},[We,ke]),vt=de.useCallback(()=>{if(B!==\"dashboard\"&&te.current){if(O){O.goBack();return}typeof window<\"u\"&&window.history.back();return}te.current=!1,ke(\"dashboard\",\"replace\"),We(\"dashboard\")},[B,O,We,ke]),st=de.useCallback(G=>{wt(G),R?.(G)},[R]),Gt=de.useCallback(G=>{J(G),m?.(G)},[m]),Lo=de.useCallback(G=>{He(G),k?.(G)},[k]),$o=de.useCallback(G=>{po(G),S?.(G)},[S]),Io=de.useCallback(G=>{or(G),l?.(G)},[l]),da=de.useCallback(()=>{qe(\"products\")},[qe]),pa=de.useCallback(()=>{qe(\"conversion-rate\")},[qe]),ca=de.useCallback(()=>{qe(\"top-offers\")},[qe]);return B===\"products\"?ia(Yo,{products:la,dateRange:Re,market:Ee,productSort:Je,markets:M,isLoading:i,onBack:vt,onDateRangeChange:st,onMarketChange:Gt,onProductSortChange:Lo}):B===\"conversion-rate\"?ia(Zo,{conversionData:b??Oo,orders:sa,summaryRate:f??x,summaryChangePct:c??g,dateRange:Re,market:Ee,conversionFilter:so,markets:M,isLoading:i,onBack:vt,onDateRangeChange:st,onMarketChange:Gt,onConversionFilterChange:$o}):B===\"top-offers\"?ia(tn,{offers:Ze,dateRange:Re,market:Ee,offerSort:tr,markets:M,isLoading:i,onBack:vt,onDateRangeChange:st,onMarketChange:Gt,onOfferSortChange:Io}):ia(Qa,{stats:e,topProducts:Mo,conversionData:Oo,topOffers:Fo,isLoading:i,error:s,dashboardTitle:d,className:p,dateRange:Re,market:Ee,productSort:Je,conversionFilter:so,offerSort:tr,conversionSummaryRate:x,conversionSummaryChangePct:g,markets:M,onDateRangeChange:st,onMarketChange:Gt,onProductSortChange:Lo,onConversionFilterChange:$o,onOfferSortChange:Io,onProductsTitleClick:da,onConversionTitleClick:pa,onOffersTitleClick:ca})};import{ColorUtils as nf,styled as on}from\"@nuskin/foundation-theme\";var{getGenomeColor:lo}=nf,op=on(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,rp=on(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>lo(e,\"N20\")};\n border: 1px solid ${({theme:e})=>lo(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>lo(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>lo(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>lo(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>lo(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,ap=on(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>lo(e,\"N70\")};\n`;import{jsx as rn,jsxs as sf}from\"react/jsx-runtime\";var lf=({filters:e,onChange:t})=>rn(op,{\"data-testid\":\"filter-bar\",children:e.map(o=>sf(ap,{htmlFor:`filter-${o.key}`,children:[o.label,rn(rp,{id:`filter-${o.key}`,value:o.value,onChange:n=>t(o.key,n.target.value),disabled:o.disabled,\"aria-label\":`${o.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${o.key}`,children:o.options.map(n=>rn(\"option\",{value:n.value,children:n.label},n.value))})]},o.key))});var np={shopTitle:\"My NuSkin Shop\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$9,453\",volume:\"1,211\",siteVisits:\"17,935\",conversionRate:\"4.2%\"},trend:{revenue:\"+12.5%\",volume:\"+8.3%\",siteVisits:\"-2.1%\"}},an=[{id:\"prod-001\",rank:1,name:\"ageLOC LumiSpa\",imageUrl:\"\",unitsSold:342,revenue:29580,volume:245,trend:{units:\"+15%\",revenue:\"+12%\",volume:\"+8%\"}},{id:\"prod-002\",rank:2,name:\"Pharmanex LifePak\",imageUrl:\"\",unitsSold:287,revenue:24395,volume:198,trend:{units:\"+8%\",revenue:\"+10%\",volume:\"+5%\"}},{id:\"prod-003\",rank:3,name:\"ageLOC Meta\",imageUrl:\"\",unitsSold:256,revenue:21760,volume:176,trend:{units:\"-3%\",revenue:\"-1%\",volume:\"-2%\"}},{id:\"prod-004\",rank:4,name:\"Nu Skin 180 System\",imageUrl:\"\",unitsSold:198,revenue:17820,volume:142,trend:{units:\"+22%\",revenue:\"+18%\",volume:\"+15%\"}},{id:\"prod-005\",rank:5,name:\"Epoch Baobab Body Butter\",imageUrl:\"\",unitsSold:176,revenue:8800,volume:88,trend:{units:\"+5%\",revenue:\"+3%\",volume:\"+2%\"}}],er=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");return o.setDate(o.getDate()+t),{date:`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][o.getMonth()]} ${o.getDate()}`,rate:Number((4+t%15*.1).toFixed(2)),orders:200+t*13%100,siteVisits:4e3+t*97%2e3}}),df=er.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7)})),pf=er.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3)})),ip=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");o.setDate(o.getDate()+t);let n=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],i=80+t*11%40,s=Math.floor(i*.4),d=Math.floor(i*.35),p=i-s-d;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:s,retail:d,brandAffiliates:p}}),lp=[{id:\"cat-001\",name:\"Favorites\",revenue:45200,percentage:29,color:\"#C95D63\",trend:{revenue:\"+8%\",units:\"+10%\"}},{id:\"cat-002\",name:\"Daily Routine\",revenue:42100,percentage:27,color:\"#6C7A9B\",trend:{revenue:\"+12%\",units:\"+15%\"}},{id:\"cat-003\",name:\"Fit & Trim Body\",revenue:34300,percentage:22,color:\"#E8975E\",trend:{revenue:\"-3%\",units:\"-1%\"}},{id:\"cat-004\",name:\"Dull Skin\",revenue:24900,percentage:16,color:\"#5F8FC4\",trend:{revenue:\"+5%\",units:\"+7%\"}},{id:\"cat-005\",name:\"Acne\",revenue:9400,percentage:6,color:\"#A2C3B3\",trend:{revenue:\"+2%\",units:\"+3%\"}}],nn=Array.from({length:50},(e,t)=>{let o=[\"Sarah\",\"John\",\"Emma\",\"Michael\",\"Olivia\",\"William\",\"Ava\",\"James\"],n=[\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Garcia\",\"Miller\",\"Davis\"],i=new Date(\"2026-03-31\");return i.setDate(i.getDate()-t%30),{orderId:`ORD-${String(1e4+t).padStart(5,\"0\")}`,date:i.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),customerName:`${o[t%o.length]} ${n[t%n.length]}`,customerType:t%3===0?\"Subscription\":\"Standard\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),sp=Array.from({length:30},(e,t)=>{let o=[\"Alice\",\"Bob\",\"Carol\",\"David\",\"Eva\",\"Frank\",\"Grace\",\"Henry\"],n=[\"Anderson\",\"Baker\",\"Clark\",\"Davis\",\"Evans\",\"Fisher\",\"Grant\",\"Hall\"],i=[\"Member\",\"Retail\",\"Brand Affiliate\"],s=new Date(\"2026-03-31\");return s.setDate(s.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:s.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),type:i[t%i.length],email:`${o[t%o.length].toLowerCase()}.${n[t%n.length].toLowerCase()}@example.com`,status:t%4===0?\"Pending\":\"Active\"}});var Ro={shopTitle:\"Performance Overview\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$5,208\",offersPurchased:\"285\",conversionRate:\"4.2%\"},trend:{revenue:\"+2.3%\",offersPurchased:\"+3.7%\"}},_w={...Ro,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},Kw={...Ro,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},Uw={...Ro,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},Gw={...Ro,metrics:{...Ro.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},cf=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,percentage:29,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,percentage:27,color:\"#E8915A\",trend:{revenue:\"+3.1%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,percentage:22,color:\"#C75B5B\",trend:{revenue:\"-1.5%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,percentage:16,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,percentage:6,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\"}}];export{Ja as CategoriesFullView,xo as ConversionRateChart,Zo as ConversionRateFullView,Al as DATE_RANGE_LABELS,Vl as DAYS_MAP,Eo as DashboardHeader,nt as DataTable,lf as FilterBar,$g as MysiteDashboardWithNavigation,pi as MysiteHero,ma as NsCategoryNavigation,fa as NsProductCard,pe as PageHeader,lt as Pagination,af as PoDashboardWithNavigation,rr as ProductCarousel,Qa as ProductOfferDashboard,L as ProductOfferDashboardTranslationKeys,Ap as ProductTabCarousel,Yo as ProductsFullView,Ha as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,xr as SignupsChart,ja as SignupsFullView,Tt as StatsCard,Ir as TopCategoriesPieChart,tn as TopPerformingOffersFullView,ta as TopPerformingOffersPieChart,ho as TopSellingProductsList,vg as TranslationProvider,ot as WidgetMenu,vi as buildDefaultMarketOptions,Cc as calculatePercentage,rl as calculateTotalPages,Bl as formatDateRange,Hc as formatDateRangeLabel,Aa as formatDisplayDate,za as formatISODate,zl as formatShortDate,Va as getDateRangeLabel,Ec as getDaysFromDateRange,a as getTranslation,Qp as getTranslationResolver,yc as getTrendColor,tt as getTrendIcon,lp as mockCategories,er as mockConversionData,nn as mockOrders,Ro as mockProductOfferStats,ip as mockSignupData,sp as mockSignupDetails,np as mockStats,cf as mockTopOffers,an as mockTopProducts,al as paginateItems,ki as resolveMarketOptions,qt as resolveTranslation,Bo as setTranslationResolver,wc as sortByNumericProperty,kg as useTranslation,Do as useTranslationResolver};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import React, { ReactElement, useState } from 'react';\nimport { NsImage } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport {\n PriceComponent,\n ProductCardContainer,\n ImageContainer,\n DefaultImage,\n ProductTitle,\n ProductBadgeContainer,\n AddToCartButton,\n CartIcon,\n} from './styles/NsProductCard.Styled';\nimport { useMediaQuery } from '@mui/material';\nimport { NsCardButton } from './types';\n\ntype NsProductCardProps = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly className?: string;\n readonly button?: NsCardButton & { disabled?: boolean };\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSellerBadge?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n readonly testId?: string;\n};\n\nconst NsProductCard = ({\n productTitle,\n imageDetails,\n className,\n button,\n onCardClick,\n productStatusBadge,\n directSellerBadge,\n mySitePriceComponent,\n testId,\n}: NsProductCardProps): ReactElement => {\n const [isButtonHovered, setIsButtonHovered] = useState(false);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const handleImageError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n const target = e.target as HTMLImageElement;\n const noImageFallback = imageDetails?.fallbackImage;\n if (noImageFallback && target.src !== noImageFallback) {\n target.src = noImageFallback;\n }\n };\n\n return (\n <ProductCardContainer\n className={className}\n onClick={onCardClick}\n tabIndex={0}\n data-testid=\"product-card\"\n isMobile={isMobile}\n >\n <ImageContainer bgColor={imageDetails?.bgColor} onError={handleImageError}>\n {imageDetails?.imageSrc ? (\n <NsImage\n data-testid={testId ?? 'test-product-image'}\n className={imageDetails.className ?? ''}\n src={imageDetails.imageSrc}\n alt={imageDetails.imageAlt}\n aria-label={imageDetails.areaLabel ?? imageDetails.imageAlt}\n width={'100%'}\n />\n ) : (\n <DefaultImage alt=\"\" />\n )}\n </ImageContainer>\n <ProductTitle title={productTitle} data-testid=\"product-title\">\n {productTitle}\n </ProductTitle>\n {directSellerBadge && <ProductBadgeContainer>{directSellerBadge}</ProductBadgeContainer>}\n <ProductBadgeContainer>{productStatusBadge}</ProductBadgeContainer>\n <PriceComponent>{mySitePriceComponent}</PriceComponent>\n {button?.showButton && (\n <AddToCartButton\n tabIndex={0}\n aria-roledescription=\":\"\n aria-label={button.buttonText || 'ADD TO CART'}\n data-testid=\"add-to-cart-button\"\n disabled={button?.disabled ?? false}\n isMobile={isMobile}\n isHovered={isButtonHovered}\n onClick={(e) => {\n e.stopPropagation();\n if (!button?.disabled) {\n button.onClick?.();\n }\n }}\n onMouseEnter={() => {\n if (!isMobile && !button?.disabled) {\n setIsButtonHovered(true);\n }\n }}\n onMouseLeave={() => {\n if (!isMobile) {\n setIsButtonHovered(false);\n }\n }}\n >\n <CartIcon className=\"cart-icon\" disabled={button?.disabled}>\n <svg width=\"24\" height=\"22\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 1.86358C0 1.26109 0.488416 0.772675 1.09091 0.772675H3.48173C4.51054 0.772675 5.39955 1.49136 5.61511 2.49733L5.71309 2.95456H22.9091C23.245 2.95456 23.5622 3.10933 23.7689 3.37411C23.9757 3.63889 24.0489 3.98415 23.9674 4.31005L22.4053 10.5583C21.9197 12.5009 20.1743 13.8636 18.172 13.8636H8.05068L8.28444 14.9546H20.7273C21.3298 14.9546 21.8182 15.443 21.8182 16.0455C21.8182 16.648 21.3298 17.1364 20.7273 17.1364H19.6364H8.18182H7.40252C6.88811 17.1364 6.4436 16.777 6.33582 16.274L3.76449 4.27405L3.48173 2.95449H1.09091C0.488416 2.95449 0 2.46608 0 1.86358ZM8.18182 17.1364C6.97683 17.1364 6 18.1132 6 19.3182C6 20.5232 6.97683 21.5 8.18182 21.5C9.3868 21.5 10.3636 20.5232 10.3636 19.3182C10.3636 18.1132 9.3868 17.1364 8.18182 17.1364ZM19.6364 17.1364C18.4314 17.1364 17.4545 18.1132 17.4545 19.3182C17.4545 20.5232 18.4314 21.5 19.6364 21.5C20.8413 21.5 21.8182 20.5232 21.8182 19.3182C21.8182 18.1132 20.8413 17.1364 19.6364 17.1364ZM7.58317 11.6818H18.172C19.1732 11.6818 20.0459 11.0005 20.2887 10.0292L21.5119 5.13638H6.18062L7.58317 11.6818Z\"\n fill={button?.disabled ? '#999' : '#ffffff'}\n />\n </svg>\n </CartIcon>\n {button.buttonText || 'ADD TO CART'}\n </AddToCartButton>\n )}\n </ProductCardContainer>\n );\n};\n\nexport default NsProductCard;\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PriceComponent = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`;\n\nexport const ProductCardContainer = styled('button')<{ isMobile: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n width: 240px;\n height: ${(props) => (props.isMobile ? '410px' : '513px')};\n overflow: hidden;\n cursor: pointer;\n border: 1px solid #ededed;\n background: var(--color-primary-n-10-primary-white, #fff);\n`;\n\nexport const ImageContainer = styled('div')<{\n bgColor?: string;\n}>`\n width: '240px';\n height: '240px';\n background: ${(props) => props.bgColor ?? '#f5f5f5'};\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 0;\n display: flex;\n align-items: normal;\n justify-content: center;\n position: relative;\n @media (max-width: 560px) {\n width: 200px;\n height: 200px;\n align-items: unset;\n }\n`;\n\nexport const DefaultImage = styled('img')`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`;\n\nexport const ProductTitle = styled('div')`\n width: 200px;\n margin-top: 16px;\n max-height: 66px;\n text-align: left;\n font-size: 16px;\n font-family: 'Inter', sans-serif;\n font-weight: 400;\n line-height: 22px;\n overflow: hidden;\n color: #666;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n @media (max-width: 560px) {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n margin-top: 5px;\n max-height: 54px;\n line-height: 18px;\n }\n`;\n\nexport const ProductBadgeContainer = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`;\n\nexport const AddToCartButton = styled('button')<{\n disabled?: boolean;\n isMobile: boolean;\n isHovered: boolean;\n}>`\n width: 200px;\n height: 40px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0.14px;\n text-transform: none;\n justify-content: flex-start;\n padding-left: 31px;\n overflow: hidden;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n text-overflow: ellipsis;\n margin-top: 8px;\n margin-bottom: 10px;\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n\n color: ${(props) => (props.disabled ? '#999' : '#fff')};\n background-color: ${(props) => {\n if (props.disabled) return '#e0e0e0';\n if (!props.isMobile && props.isHovered) return '#888';\n return '#000';\n }};\n border: ${(props) => (props.disabled ? '1px solid #ccc' : 'none')};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n transition: ${(props) => (props.isMobile ? 'none' : 'all 0.3s ease')};\n\n @media (max-width: 560px) {\n margin: 5px 0;\n }\n`;\n\nexport const CartIcon = styled('span')<{ disabled?: boolean }>`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n`;\n","import React, { ReactElement, useCallback, ReactNode, useRef } from 'react';\nimport Slider from 'react-slick';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport 'slick-carousel/slick/slick.css';\nimport { NsCardButton, NsCarouselControl } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport NsProductCard from '../card/NsProductCard';\nimport {\n SlickContainer,\n ControlsContainer,\n ControlsHeaderRow,\n ScrollableContainer,\n CardList,\n ViewAllWrapper,\n ProductCountWrapper,\n ArrowsWrapper,\n CustomTypography,\n ViewAllLink,\n ProductInfoWrapper,\n CategoryNameWrapper,\n EmptyProductCategories,\n} from './NsProductCarousel.styled';\n\nexport type ProductCardEntry = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly button?: NsCardButton;\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSeller?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n};\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductCardCarouselProps<T = ProductCardEntry> {\n readonly entries: T[];\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly renderEntry?: (entry: T, index: number) => ReactNode;\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly categoryName?: string;\n readonly emptyProductMessage?: string;\n readonly productsCountLabel?: string;\n readonly isInitialDataLoading?: boolean;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nexport default function ProductCardCarousel({\n entries,\n renderEntry,\n settings = {},\n showControlButtons = true,\n allEntryLabel = 'View All',\n allEntryLink = '',\n categoryName,\n emptyProductMessage = 'No Products Available For The Selected Category',\n productsCountLabel = 'Products',\n isInitialDataLoading,\n history,\n}: ProductCardCarouselProps): ReactElement {\n const sliderRef = useRef<Slider>(null);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const prev = useCallback(() => {\n sliderRef.current?.slickPrev();\n }, []);\n\n const next = useCallback(() => {\n sliderRef.current?.slickNext();\n }, []);\n\n const renderProductEntry =\n renderEntry ??\n ((entry: ProductCardEntry, index: number) => (\n <NsProductCard\n key={`${entry.productTitle}-${index}`}\n productTitle={entry.productTitle}\n imageDetails={entry.imageDetails}\n button={entry.button}\n onCardClick={entry.onCardClick}\n productStatusBadge={entry.productStatusBadge}\n directSellerBadge={entry.directSeller}\n mySitePriceComponent={entry.mySitePriceComponent}\n />\n ));\n\n const sliderSettings = {\n dots: true,\n infinite: true,\n speed: 500,\n slidesToShow: Math.min(entries?.length ?? 0, 4),\n slidesToScroll: 4,\n swipe: true,\n draggable: true,\n arrows: true,\n responsive: [\n {\n breakpoint: 1320,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 3),\n slidesToScroll: 3,\n },\n },\n {\n breakpoint: 900,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 2),\n slidesToScroll: 2,\n },\n },\n {\n breakpoint: 600,\n settings: {\n slidesToShow: 1,\n slidesToScroll: 1,\n arrows: false,\n },\n },\n ],\n ...settings,\n };\n\n const shouldShowNavigation = (entries?.length ?? 0) > sliderSettings.slidesToShow;\n\n const renderCarouselContent = () => {\n if (entries?.length === 0 && !isInitialDataLoading) {\n return <EmptyProductCategories>{emptyProductMessage}</EmptyProductCategories>;\n }\n\n if (isMobile) {\n return (\n <ScrollableContainer>\n <CardList>{entries.map((entry, index) => entry && renderProductEntry(entry, index))}</CardList>\n </ScrollableContainer>\n );\n }\n\n return (\n <Slider {...sliderSettings} ref={sliderRef}>\n {entries.map((entry, index) => entry && renderProductEntry(entry, index))}\n </Slider>\n );\n };\n\n return (\n <SlickContainer>\n {showControlButtons && (\n <ControlsContainer>\n <ControlsHeaderRow>\n <ProductInfoWrapper>\n <ProductCountWrapper>\n <CustomTypography variant=\"body-m\">\n {entries?.length ?? 0} {productsCountLabel}\n </CustomTypography>\n </ProductCountWrapper>\n {!isMobile && categoryName && <CategoryNameWrapper>{categoryName}</CategoryNameWrapper>}\n </ProductInfoWrapper>\n <ViewAllWrapper $isMobile={isMobile}>\n <ViewAllLink\n $disabled={(entries?.length ?? 0) === 0}\n onClick={(e) => {\n e.preventDefault();\n if ((entries?.length ?? 0) > 0 && history) {\n history.push(allEntryLink);\n }\n }}\n >\n {allEntryLabel}\n </ViewAllLink>\n </ViewAllWrapper>\n </ControlsHeaderRow>\n {!isMobile && (\n <ArrowsWrapper $isDisabled={!shouldShowNavigation}>\n <NsCarouselControl prev={prev} next={next} viewAllLabel={''} viewAllUrl={''} />\n </ArrowsWrapper>\n )}\n </ControlsContainer>\n )}\n {renderCarouselContent()}\n </SlickContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport Box, { BoxProps } from '@mui/material/Box';\nimport { NsTypography } from '@nuskin/foundation-ui-components';\n\nexport const SlickContainer: React.ComponentType<BoxProps> = styled(Box)`\n padding: 30px 0 60px;\n width: 100%;\n margin: auto;\n margin-top: 50px;\n position: relative;\n\n .slick-list {\n padding-left: 24px;\n padding-right: 24px;\n }\n .slick-slide {\n display: flex;\n justify-content: center;\n padding: 0 12px;\n box-sizing: border-box;\n }\n .slick-prev,\n .slick-next {\n display: none !important;\n }\n\n @media (max-width: 1200px) {\n max-width: 1024px;\n .slick-list {\n padding-left: 12px;\n padding-right: 12px;\n }\n .slick-slide {\n padding: 0 6px;\n }\n }\n @media (max-width: 700px) {\n max-width: 100vw;\n padding: 10px 0 50px;\n .slick-list {\n padding-left: 4px;\n padding-right: 4px;\n }\n .slick-slide {\n padding: 0 2px;\n }\n }\n @media (max-width: 560px) {\n padding: 10px 0 10px;\n margin-top: 25px;\n }\n`;\nexport const ScrollableContainer = styled('div')`\n overflow-x: auto;\n display: flex;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n gap: 16px;\n padding: 0 8px 16px;\n width: 100%;\n box-sizing: border-box;\n\n &::-webkit-scrollbar {\n height: 6px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #007bff;\n border-radius: 10px;\n }\n`;\n\nexport const CardList = styled('div')`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`;\n\nexport const ControlsContainer: React.ComponentType<BoxProps> = styled(Box)`\n position: absolute;\n bottom: calc(100% + 1px);\n right: 1px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n`;\n\nexport const ViewAllWrapper: React.ComponentType<BoxProps & { $isMobile?: boolean }> = styled(Box)<{\n $isMobile?: boolean;\n}>`\n display: flex;\n align-items: center;\n margin-left: auto;\n margin-right: ${({ $isMobile }) => ($isMobile ? 0 : '24px')};\n\n @media (max-width: 560px) {\n margin-left: 0;\n order: 2;\n }\n`;\n\nexport const ProductCountWrapper: React.ComponentType<BoxProps> = styled(Box)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`;\n\nexport const ArrowsWrapper: React.ComponentType<BoxProps & { $isDisabled?: boolean }> = styled(Box)<{\n $isDisabled?: boolean;\n}>`\n display: flex;\n align-items: center;\n opacity: ${({ $isDisabled }) => ($isDisabled ? 0.3 : 1)};\n pointer-events: ${({ $isDisabled }) => ($isDisabled ? 'none' : 'auto')};\n transition: opacity 0.3s ease;\n\n .carousal-prev-button,\n .carousal-next-button {\n transition: all 0.3s ease;\n border: 2px solid #000000;\n border-radius: 3px;\n padding: 9px;\n cursor: pointer;\n\n svg {\n transition: all 0.3s ease;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n\n &:hover {\n background-color: #f5f5f5;\n border: 2px solid #ddd;\n\n svg {\n opacity: 0.5;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n }\n }\n\n @media (max-width: 560px) {\n display: none;\n }\n`;\nexport const Scrollablewrapper = styled('div')`\n @media (max-width: 560px) {\n overflow-y: hidden;\n scrollbar-width: thin;\n scrollbar-color: #007bff #eee;\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: #eee;\n }\n &::-webkit-scrollbar-thumb {\n background-color: red;\n border-radius: 8px;\n border: 2px solid #eee;\n }\n }\n`;\nexport const CustomTypography = styled(NsTypography)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`;\n\nexport const ViewAllLink = styled('a')<{ $disabled?: boolean }>`\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n text-decoration: none;\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n padding-bottom: 4px;\n transition: all 0.3s ease;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n\n @media (max-width: 560px) {\n font-size: 14px;\n line-height: 18px;\n }\n\n &:hover {\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n }\n`;\n\nexport const EmptyProductCategories = styled('div')`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`;\nexport const ControlsHeaderRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const ProductInfoWrapper = styled('div')`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`;\n\nexport const CategoryNameWrapper = styled('div')`\n font-family: 'Lora';\n font-weight: 400;\n font-size: 22px;\n margin-left: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 13px;\n`;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useMediaQuery } from '@mui/material';\n\nimport { NsCategoryNavigation } from '../Nav-Category-Navigation';\nimport { NsSpinner } from '@nuskin/foundation-ui-components';\nimport ProductCardCarousel, { ProductCardEntry } from './NsProductCarousel';\nimport {\n ProductTabCarouselContainer,\n TabsContainer,\n ContentContainer,\n NoTabsContainer,\n SpinnerContainer,\n} from './ProductTabCarousel.styled';\n\ninterface Category {\n label: string;\n categoryId: string;\n}\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductTabCarouselProps {\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly renderEntry?: (entry: ProductCardEntry) => React.ReactNode;\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly fetchCategories: () => Promise<Category[]>;\n readonly fetchProducts: (categoryId: string) => Promise<ProductCardEntry[]>;\n readonly emptyProductTabs?: string;\n readonly emptyProductMessage?: string;\n readonly showCustomCategory?: boolean;\n readonly productsCountLabel?: string;\n readonly getCategoryId?: (categoryId: string) => Promise<Category[]>;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nconst ProductTabCarousel: React.FC<ProductTabCarouselProps> = ({\n allEntryLabel,\n allEntryLink,\n renderEntry,\n settings,\n showControlButtons = true,\n fetchCategories,\n fetchProducts,\n showCustomCategory = false,\n emptyProductTabs = 'No tabs available',\n emptyProductMessage,\n productsCountLabel,\n getCategoryId,\n history,\n}) => {\n const isMobile = useMediaQuery('(max-width:768px)');\n const [isLoadingInitialData, setIsLoadingInitialData] = useState(true);\n const [categories, setCategories] = useState<Category[]>([]);\n const [isCategoriesLoaded, setIsCategoriesLoaded] = useState(false);\n const [selectedTab, setSelectedTab] = useState(0);\n const [products, setProducts] = useState<ProductCardEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [shouldShowSpinner, setShouldShowSpinner] = useState(true);\n\n const checkForExistingSpinners = useCallback(() => {\n const existingSpinners = document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');\n setShouldShowSpinner(existingSpinners.length === 0);\n }, []);\n\n useEffect(() => {\n if (loading) {\n checkForExistingSpinners();\n }\n }, [loading, checkForExistingSpinners]);\n\n useEffect(() => {\n fetchCategories().then((data) => {\n setCategories(data);\n setIsCategoriesLoaded(true);\n });\n }, [fetchCategories]);\n\n useEffect(() => {\n if (!isCategoriesLoaded) return;\n\n if (categories.length > 0) {\n const categoryId = categories[selectedTab]?.categoryId;\n if (getCategoryId) {\n getCategoryId(categoryId);\n }\n\n setLoading(true);\n fetchProducts(categoryId)\n .then(setProducts)\n .finally(() => {\n setLoading(false);\n setIsLoadingInitialData(false);\n });\n } else {\n setLoading(false);\n }\n }, [categories, selectedTab, fetchProducts, isCategoriesLoaded]);\n\n const itemArray = categories.map((cat) => ({\n label: cat.label,\n content: '',\n categoryId: cat.categoryId,\n }));\n\n return (\n <ProductTabCarouselContainer isMobile={isMobile} $hasCategories={categories.length > 0}>\n {showCustomCategory &&\n (itemArray.length > 0 ? (\n <TabsContainer isMobile={isMobile}>\n <NsCategoryNavigation\n itemArray={itemArray}\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n />\n </TabsContainer>\n ) : (\n <NoTabsContainer>{emptyProductTabs}</NoTabsContainer>\n ))}\n <ContentContainer isMobile={isMobile}>\n {loading ? (\n <SpinnerContainer>{shouldShowSpinner && <NsSpinner />}</SpinnerContainer>\n ) : (\n <ProductCardCarousel\n isInitialDataLoading={isLoadingInitialData}\n entries={products}\n allEntryLabel={allEntryLabel}\n allEntryLink={allEntryLink}\n renderEntry={\n renderEntry\n ? (entry) => renderEntry({ ...entry, productStatusBadge: entry.productStatusBadge })\n : undefined\n }\n settings={settings}\n showControlButtons={showControlButtons}\n categoryName={categories[selectedTab]?.label}\n emptyProductMessage={emptyProductMessage}\n productsCountLabel={productsCountLabel}\n history={history}\n />\n )}\n </ContentContainer>\n </ProductTabCarouselContainer>\n );\n};\n\nexport default ProductTabCarousel;\n","import * as React from 'react';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport Box from '@mui/material/Box';\nimport PropTypes from 'prop-types';\nimport { NsCategoryNavigationContainer } from './NsCategoryNavigation.styled';\nimport { useMediaQuery } from '@mui/material';\n\nfunction TabPanel(\n props: Readonly<{\n children?: React.ReactNode;\n value: number;\n index: number;\n [key: string]: unknown;\n }>,\n) {\n const { children, value, index, ...other } = props;\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`vertical-tabpanel-${index}`}\n aria-labelledby={`vertical-tab-${index}`}\n {...other}\n >\n {value === index && <Box className=\"tabPanel\">{children}</Box>}\n </div>\n );\n}\nTabPanel.propTypes = {\n children: PropTypes.node,\n index: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n};\n\ninterface NsCategoryNavigationProps {\n itemArray: { label: string; content: React.ReactNode; categoryId: string }[];\n value?: number;\n onChange?: (event: React.SyntheticEvent, newValue: number) => void;\n}\n\nexport const NsCategoryNavigation: React.FC<Readonly<NsCategoryNavigationProps>> = ({\n itemArray,\n value: controlledValue,\n onChange,\n}) => {\n const [internalValue, setInternalValue] = React.useState(0);\n const isMobile = useMediaQuery('(max-width:768px)');\n const value = controlledValue ?? internalValue;\n const handleChange = (event: React.SyntheticEvent, newValue: number) => {\n if (onChange) {\n onChange(event, newValue);\n } else {\n setInternalValue(newValue);\n }\n };\n\n return (\n <NsCategoryNavigationContainer>\n <Box className=\"tabContainer\">\n <Tabs\n orientation={isMobile ? 'horizontal' : 'vertical'}\n variant=\"scrollable\"\n value={value}\n onChange={handleChange}\n aria-label=\"Vertical tabs example\"\n className=\"tabsStyle\"\n >\n {itemArray.map((item) => (\n <Tab key={item.categoryId} label={item.label} className=\"tabStyle\" />\n ))}\n </Tabs>\n {itemArray.map((item) => (\n <TabPanel\n key={item.categoryId}\n value={value}\n index={itemArray.findIndex((i) => i.categoryId === item.categoryId)}\n >\n {item.content}\n </TabPanel>\n ))}\n </Box>\n </NsCategoryNavigationContainer>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nexport const NsCategoryNavigationContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n background-color: #fff;\n .tabsStyle {\n display: flex;\n padding-top: 8.533px;\n flex-direction: column;\n align-items: flex-start;\n gap: 12.8px;\n border-right: 1px;\n border-color: divider;\n width: 200px;\n & .Mui-selected {\n font-weight: 700;\n font-size: 14px;\n font-family: 'inter', sans-serif;\n font-style: normal;\n font-height: 20px;\n border-radius: 4px;\n }\n & .MuiTabs-indicator {\n left: 0;\n background-color: #5b81a5;\n color: #5b81a5;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n }\n\n .tabContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n min-width: 100%;\n background-color: #fff;\n @media (max-width: 768px) {\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n }\n\n .tabStyle {\n align-items: flex-start;\n display: flex;\n text-align: left;\n font-size: 14px;\n font-family: 'inter' sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n padding: 1px;\n padding-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n text-transform: none;\n }\n @media (max-width: 768px) {\n flex-direction: row;\n\n .tabsStyle {\n width: 100%;\n border-right: none;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 0px;\n }\n\n .tabStyle {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 70px;\n padding: 8px 16px;\n text-align: center;\n margin: 4px;\n background-color: #fff;\n cursor: pointer;\n color: black;\n font-family: Inter;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n }\n\n .tabStyle.Mui-selected {\n background-color: #5b81a5;\n color: #ffffff !important;\n font-weight: 700;\n border-radius: 70px;\n }\n }\n .tabPanel {\n padding: 8px;\n text-align: left;\n }\n`;\n","import { styled } from '@nuskin/foundation-theme';\n\nconst getMinHeight = ({ isMobile, $hasCategories }: { isMobile?: boolean; $hasCategories?: boolean }) => {\n if (isMobile) return 'auto';\n return $hasCategories ? '800px' : 'auto';\n};\n\nexport const ProductTabCarouselContainer = styled('div')<{ isMobile?: boolean; $hasCategories?: boolean }>`\n display: flex;\n flex-direction: ${({ isMobile }) => (isMobile ? 'column' : 'row')};\n align-items: ${({ isMobile }) => (isMobile ? 'stretch' : 'flex-start')};\n width: 100%;\n max-width: 1920px;\n min-height: ${getMinHeight};\n margin: 0 auto;\n box-sizing: border-box;\n overflow: visible;\n background: #fff;\n padding: ${({ isMobile }) => (isMobile ? '10px 16px 0px 16px' : '50px 60px 0px 60px')};\n\n @media (max-width: 768px) {\n padding: 10px 16px 0px 16px;\n min-height: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n padding: 30px 40px 0px 40px;\n gap: 20px;\n }\n\n transform: translateZ(0);\n will-change: auto;\n`;\n\nexport const TabsContainer = styled('div')<{ isMobile?: boolean }>`\n min-width: ${({ isMobile }) => (isMobile ? '100%' : 'auto')};\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n\n overflow-x: auto;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-width: 200px;\n margin-right: 20px;\n }\n`;\n\nexport const ContentContainer = styled('div')<{ isMobile?: boolean }>`\n flex: 1;\n min-width: 0;\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n min-height: 300px;\n\n -webkit-overflow-scrolling: touch;\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-height: 400px;\n }\n\n contain: layout style paint;\n transform: translateZ(0);\n`;\n\nexport const LoadingContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n padding: 20px;\n\n @media (max-width: 768px) {\n min-height: 150px;\n padding: 16px;\n }\n`;\n\nexport const NoTabsContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 40px 20px;\n color: #666;\n font-size: 16px;\n\n @media (max-width: 768px) {\n padding: 20px 16px;\n font-size: 14px;\n }\n`;\nexport const SpinnerContainer = styled('div')`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;\n","import React, { ReactElement, useState, useEffect, useMemo } from 'react';\nimport { Typography, Box, useMediaQuery, Tooltip } from '@mui/material';\nimport { NsLink, NsImage } from '@nuskin/foundation-ui-components';\nimport {\n MysiteHeroContainer,\n MysiteHeroContainerMobile,\n BadgeContainer,\n Badge,\n ToggleButtonMobile,\n StyledSpan,\n ImgTabIndex,\n ContactLink,\n BadgeValue,\n} from '@/common/headers/MysiteHero.styled';\nimport { PlaceholderImage } from '../icon/icons/PlaceholderImage';\nimport { ArrowDownIcon } from '../icon/icons/ArrowDownIcon';\nimport { trackGTMEvent } from '../utils/gtmTracking';\n\ntype MysiteHeroProps = {\n readonly imageDetails?: {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n };\n readonly shopTitle: string;\n readonly shopDescription: string;\n readonly socialTitleText: string;\n readonly email: string;\n readonly phone: string;\n readonly className?: string;\n readonly bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n readonly socialIcons?: {\n type: string;\n url: string;\n }[];\n readonly expirationDate?: string;\n readonly showBadges?: boolean;\n readonly totalSavings?: string;\n};\n\ntype ImageDetails = {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n};\n\ntype BannerProps = {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n};\n\ntype ContentProps = {\n shopTitle: string;\n shopDescription: string;\n socialTitleText: string;\n email: string;\n phone: string;\n showBadges: boolean;\n expirationDate?: string;\n totalSavings?: string;\n};\n\nconst renderImageContent = (imageDetails: ImageDetails | undefined, bannerProps: BannerProps, className: string) => {\n const placeholderClass = className.includes('mobile') ? 'placeholder-image-mobile' : 'placeholder-image';\n return imageDetails?.imageSrc ? (\n <ImgTabIndex tabIndex={0}>\n <NsImage className={className} src={imageDetails.imageSrc} alt={imageDetails.imageAlt} />\n </ImgTabIndex>\n ) : (\n <Box className={placeholderClass}>\n <PlaceholderImage\n width={className.includes('mobile') ? '144px' : '246px'}\n height={className.includes('mobile') ? '144px' : '246px'}\n backgroundColor={bannerProps?.backgroundColor ?? '#5F5F5F'}\n />\n </Box>\n );\n};\n\nconst renderBadges = (\n showBadges: boolean,\n expirationDate: string,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n totalSavings?: string,\n) => {\n if (!showBadges || (!expirationDate && !totalSavings)) return null;\n\n const badgeClass = isMobile ? 'mobile-badge' : 'tablet-badge';\n const containerClass = isMobile ? 'mobile-badges' : 'tablet-badges';\n\n return (\n <BadgeContainer className={containerClass}>\n {totalSavings && (\n <Badge\n className={`${badgeClass} total-savings-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{totalSavings}</BadgeValue>\n </Badge>\n )}\n {expirationDate && (\n <Badge\n className={`${badgeClass} expiration-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{expirationDate}</BadgeValue>\n </Badge>\n )}\n </BadgeContainer>\n );\n};\n\nconst renderMobileContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, socialTitleText, email, showBadges, expirationDate, phone, totalSavings } = props;\n\n return (\n <Box className=\"content-mobile\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title-mobile\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text-mobile\">\n {socialTitleText}\n </Typography>\n {email?.trim() && renderContactLink('email', email, 'email-text-mobile')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text-mobile')}\n <Box className=\"social-icons-mobile\">{renderSocialMediaIcons}</Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst renderDesktopContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, shopDescription, socialTitleText, email, phone, showBadges, expirationDate, totalSavings } =\n props;\n\n return (\n <Box className=\"content\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n {shopDescription?.length > 480 ? (\n <Tooltip title={shopDescription} arrow>\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n </Tooltip>\n ) : (\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n )}\n <Box className=\"social-media\">\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text\">\n {socialTitleText}\n </Typography>\n <Box className=\"social-icons\">\n {renderSocialMediaIcons}\n {email?.trim() && renderContactLink('email', email, 'email-text')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text')}\n </Box>\n </Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst checkIfImageIsCircular = (url: string): Promise<boolean> => {\n return new Promise((resolve, reject) => {\n const imageContext = new Image();\n imageContext.crossOrigin = 'anonymous';\n imageContext.src = url;\n\n imageContext.onload = () => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return reject(new Error('Canvas not supported'));\n\n canvas.width = imageContext.width;\n canvas.height = imageContext.height;\n\n context.drawImage(imageContext, 0, 0);\n\n const corners = [\n context.getImageData(0, 0, 1, 1).data,\n context.getImageData(imageContext.width - 1, 0, 1, 1).data,\n context.getImageData(0, imageContext.height - 1, 1, 1).data,\n context.getImageData(imageContext.width - 1, imageContext.height - 1, 1, 1).data,\n ];\n\n const isCircular = corners.every((corner) => {\n const imageArray = Array.prototype.slice.call(corner);\n const alpha = imageArray[3];\n return alpha < 10;\n });\n resolve(isCircular);\n };\n imageContext.onerror = () => reject(new Error('Failed to load image'));\n });\n};\n\nconst isWhiteOrNearWhite = (color: string | undefined): boolean => {\n if (!color) return false;\n\n const hex = color.replace('#', '').toLowerCase();\n\n /* regex pattern for hex color format: 3 chars (#fff), 4 chars (#ffff), 6 chars (#ffffff), or 8 chars (#ffffffff)*/\n if (!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(hex)) return false;\n\n let fullHex = hex;\n if (hex.length === 3 || hex.length === 4) {\n fullHex = hex\n .split('')\n .map((char) => char + char)\n .join('');\n }\n\n const r = Number.parseInt(fullHex.substring(0, 2), 16);\n const g = Number.parseInt(fullHex.substring(2, 4), 16);\n const b = Number.parseInt(fullHex.substring(4, 6), 16);\n\n const threshold = 220;\n return r >= threshold && g >= threshold && b >= threshold;\n};\n\nconst createContactClickHandler = (contactType: 'email' | 'phone', contactValue: string) => ({\n onClick: () => {\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n globalThis.location.href = `${contactType === 'email' ? 'mailto' : 'tel'}:${contactValue}`;\n }\n },\n});\n\nconst renderContactLink = (contactType: 'email' | 'phone', contactValue: string, className: string) => {\n const protocol = contactType === 'email' ? 'mailto:' : 'tel:';\n const handlers = createContactClickHandler(contactType, contactValue);\n\n return (\n <Typography className={className}>\n <ContactLink href={`${protocol}${contactValue}`} {...handlers}>\n {contactValue}\n </ContactLink>\n </Typography>\n );\n};\nexport default function MysiteHero({\n className,\n shopTitle,\n shopDescription,\n socialTitleText,\n imageDetails,\n email,\n phone,\n bannerProps,\n socialIcons,\n expirationDate,\n showBadges = false,\n totalSavings,\n}: MysiteHeroProps): ReactElement {\n const isMobile = useMediaQuery('(max-width: 560px)');\n const [isScrolled, setIsScrolled] = useState(false);\n const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);\n const [hasWhiteBackground, setHasWhiteBackground] = useState(false);\n const [isImageCircular, setIsImageCircular] = useState(false);\n\n const toggleDescription = () => {\n setIsDescriptionExpanded(!isDescriptionExpanded);\n };\n\n useEffect(() => {\n const checkImage = async () => {\n if (imageDetails?.imageSrc) {\n const isCircular = await checkIfImageIsCircular(imageDetails.imageSrc);\n setIsImageCircular(isCircular);\n } else {\n setIsImageCircular(false);\n }\n };\n\n checkImage();\n }, [imageDetails?.imageSrc]);\n\n useEffect(() => {\n setHasWhiteBackground(isWhiteOrNearWhite(bannerProps?.backgroundColor));\n }, [bannerProps?.backgroundColor]);\n\n useEffect(() => {\n let debounceTimeout: ReturnType<typeof setTimeout>;\n let lastScrollY = window.scrollY;\n let currentScrollState = false;\n let isTransitioning = false;\n let lastUpdateTime = 0;\n\n const updateScrollState = (newState: boolean) => {\n const now = Date.now();\n\n if (currentScrollState !== newState && !isTransitioning) {\n if (now - lastUpdateTime < 100) {\n return;\n }\n\n isTransitioning = true;\n currentScrollState = newState;\n lastUpdateTime = now;\n\n if (newState) {\n setIsDescriptionExpanded(false);\n }\n\n clearTimeout(debounceTimeout);\n setIsScrolled(newState);\n\n debounceTimeout = setTimeout(() => {\n isTransitioning = false;\n\n if (newState && window.scrollY < 15) {\n window.scrollTo({\n top: isMobile ? 20 : 30,\n behavior: 'smooth',\n });\n }\n }, 300);\n }\n };\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n if (isTransitioning) {\n lastScrollY = currentScrollY;\n return;\n }\n\n const scrollDelta = Math.abs(currentScrollY - lastScrollY);\n\n if (scrollDelta < 0.5) {\n return;\n }\n\n const scrollingDown = currentScrollY > lastScrollY;\n\n const scrollDownThreshold = isMobile ? 15 : 25;\n const scrollUpThreshold = isMobile ? 8 : 12;\n\n if (scrollingDown && currentScrollY > scrollDownThreshold && !currentScrollState) {\n updateScrollState(true);\n } else if (!scrollingDown && currentScrollY < scrollUpThreshold && currentScrollState) {\n updateScrollState(false);\n }\n\n lastScrollY = currentScrollY;\n };\n\n const initializeState = () => {\n const initialScrollY = window.scrollY;\n const scrollThreshold = isMobile ? 5 : 10;\n const shouldStartCompact = initialScrollY > scrollThreshold;\n\n currentScrollState = shouldStartCompact;\n setIsScrolled(shouldStartCompact);\n lastScrollY = initialScrollY;\n lastUpdateTime = Date.now();\n };\n\n let rafId: number | null = null;\n let lastRafTime = 0;\n const throttledScrollHandler = () => {\n if (rafId) return;\n\n const now = Date.now();\n if (now - lastRafTime < 16) {\n return;\n }\n\n rafId = requestAnimationFrame(() => {\n handleScroll();\n lastRafTime = Date.now();\n rafId = null;\n });\n };\n\n initializeState();\n window.addEventListener('scroll', throttledScrollHandler, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', throttledScrollHandler);\n if (rafId) cancelAnimationFrame(rafId);\n clearTimeout(debounceTimeout);\n };\n }, [isMobile]);\n\n const renderSocialMediaIcons = useMemo(() => {\n return socialIcons?.map((icon, index) => {\n const handleSocialClick = (e: React.MouseEvent) => {\n e.preventDefault();\n trackGTMEvent({\n event: 'social_click',\n social_platform: icon.type,\n social_url: icon.url,\n click_element: 'social_icon',\n });\n window.open(icon.url, '_blank');\n };\n\n return (\n <StyledSpan key={icon?.type + index} onClick={handleSocialClick}>\n <NsLink href={icon.url} target=\"_blank\">\n <NsImage\n key={icon?.type + index}\n src={`https://www.google.com/s2/favicons?domain=${icon?.url}&sz=24`}\n alt={`${icon.type} icon`}\n width=\"24\"\n height=\"24\"\n />\n </NsLink>\n </StyledSpan>\n );\n });\n }, [socialIcons]);\n\n const containerClass = `${className} ${isScrolled ? 'scrolled' : ''}`;\n const props = {\n shopTitle,\n shopDescription,\n socialTitleText,\n email,\n phone,\n showBadges,\n expirationDate,\n totalSavings,\n };\n\n const getCharacterLimit = () => {\n if (window.innerWidth <= 380) return 50;\n if (window.innerWidth <= 415) return 56;\n if (window.innerWidth <= 460) return 62;\n return 80;\n };\n\n const shouldShowToggle = isMobile && shopDescription && shopDescription.length > getCharacterLimit();\n\n return isMobile ? (\n <MysiteHeroContainerMobile\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n <Box className=\"image-content-mobile\">\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image-mobile')}\n {renderMobileContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </Box>\n {!isScrolled && (\n <Box className=\"expandable-description-mobile\">\n <Typography\n className={`description-content-mobile ${isDescriptionExpanded || !shouldShowToggle ? 'expanded' : 'collapsed'}`}\n >\n {shopDescription}\n </Typography>\n {shouldShowToggle && (\n <ToggleButtonMobile onClick={toggleDescription}>\n <ArrowDownIcon\n width={16}\n height={16}\n className={`arrow-icon-mobile ${isDescriptionExpanded ? 'expanded' : ''}`}\n />\n </ToggleButtonMobile>\n )}\n </Box>\n )}\n </MysiteHeroContainerMobile>\n ) : (\n <MysiteHeroContainer\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image')}\n {renderDesktopContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </MysiteHeroContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport { Box, BoxProps } from '@mui/material';\n\ninterface StyledBoxProps extends BoxProps {\n bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n isCircularImage?: boolean;\n hasWhiteBackground?: boolean;\n}\n\ninterface BadgeProps extends BoxProps {\n hasWhiteBackground?: boolean;\n}\n\nconst getContactTextStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '600',\n lineHeight: '16px',\n letterSpacing: '0.12px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n});\n\nconst getSocialTitleStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '700',\n lineHeight: '16px',\n letterSpacing: '0.48px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n textTransform: 'uppercase' as const,\n paddingLeft: '5px',\n});\n\nconst getSocialIconsStyles = () => ({\n display: 'flex',\n flexDirection: 'row' as const,\n gap: '10px',\n alignItems: 'center',\n});\n\nconst getContactTextMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getContactTextStyles(hasWhiteBackground),\n paddingBottom: '11px',\n wordBreak: 'break-all' as const,\n overflowWrap: 'break-word' as const,\n paddingLeft: '5px',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n },\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '15px',\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '14px',\n paddingBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '12px',\n paddingBottom: '4px',\n },\n});\n\nconst getSocialTitleMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '11px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '14px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '12px',\n marginBottom: '5px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '11px',\n marginBottom: '4px',\n },\n});\n\nexport const MysiteHeroContainer = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n height: 'auto',\n flexDirection: 'row',\n alignItems: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content': {\n paddingTop: '0',\n justifyContent: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title': {\n fontSize: '26px',\n lineHeight: '34px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n\n '.bg-image': {\n width: '90px',\n height: '90px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n '& > div': {\n width: '90px',\n height: '90px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.content': {\n width: '70%',\n height: '100%',\n marginLeft: '2%',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image': {\n width: '252px',\n height: '252px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '3px' : '0px',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n '.body-title': {\n fontSize: '32px',\n lineHeight: '38px',\n marginBottom: '8px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-text': {\n fontSize: '16px',\n marginBottom: '12px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '22px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n WebkitLineClamp: 3,\n textOverflow: 'ellipsis',\n paddingLeft: '5px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.social-media': {\n display: 'flex',\n flexDirection: 'column',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.email-text': getContactTextStyles(hasWhiteBackground),\n '.phone-text': getContactTextStyles(hasWhiteBackground),\n '.social-title-text': {\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '8px',\n },\n '.social-icons': {\n ...getSocialIconsStyles(),\n paddingBottom: '8px',\n },\n }),\n);\n\nexport const MysiteHeroContainerMobile = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n flexDirection: 'column',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content-mobile': {\n paddingTop: '5px',\n width: '60%',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title-mobile': {\n fontSize: '18px',\n lineHeight: '28px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image-mobile': {\n width: '75px',\n height: '75px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image-mobile': {\n '& > div': {\n width: '75px !important',\n height: '75px !important',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.image-content-mobile': {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '.content-mobile': {\n width: '55%',\n height: '100%',\n paddingTop: '10px',\n paddingRight: '10px',\n marginLeft: '8px',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n paddingTop: '8px',\n width: '100%',\n },\n '@media (max-width: 400px)': {\n paddingTop: '6px',\n width: '100%',\n height: '100%',\n },\n '@media (max-width: 375px)': {\n paddingTop: '4px',\n width: '100%',\n height: '100%',\n },\n },\n '.bg-image-mobile': {\n width: '144px',\n height: '144px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n objectFit: 'cover',\n objectPosition: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '2px' : '0px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '112px',\n height: '112px',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n '.placeholder-image-mobile': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n width: '144px',\n height: '144px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '110px !important',\n height: '110px !important',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n },\n '.body-title-mobile': {\n fontSize: '22px',\n lineHeight: '28px',\n marginBottom: '13px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontStyle: 'normal',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n fontSize: '16px',\n lineHeight: '24px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '16px',\n lineHeight: '22px',\n marginBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '14px',\n lineHeight: '20px',\n marginBottom: '4px',\n },\n },\n '.body-text-mobile': {\n fontSize: '14px',\n padding: '20px 25px 20px 25px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n backgroundColor: '#E0E0E0',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.expandable-description-mobile': {\n backgroundColor: '#E0E0E0',\n position: 'relative',\n },\n '.description-content-mobile': {\n fontSize: '14px',\n padding: '10px 15px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'max-height 0.3s ease-in-out, opacity 0.3s ease-in-out',\n overflow: 'hidden',\n position: 'relative',\n '&.collapsed': {\n maxHeight: '50px',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '20px',\n background: 'linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)',\n pointerEvents: 'none',\n },\n },\n '&.expanded': {\n maxHeight: 'none',\n whiteSpace: 'normal',\n display: 'block',\n '&::after': {\n display: 'none',\n },\n },\n },\n '.email-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.phone-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.social-title-text-mobile': getSocialTitleMobileStyles(hasWhiteBackground),\n '.social-icons-mobile': {\n ...getSocialIconsStyles(),\n paddingBottom: '10px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '& img': {\n width: '24px',\n height: '24px',\n '@media (max-width: 400px)': {\n width: '20px',\n height: '20px',\n },\n '@media (max-width: 375px)': {\n width: '18px',\n height: '18px',\n },\n },\n '@media (max-width: 420px)': {\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n paddingBottom: '4px',\n },\n '@media (max-width: 375px)': {\n paddingBottom: '3px',\n },\n },\n }),\n);\n\nexport const BadgeContainer = styled(Box)({\n display: 'flex',\n gap: '12px',\n marginBottom: '16px',\n paddingLeft: '5px',\n\n '&.mobile-badges': {\n flexDirection: 'column',\n gap: '8px',\n marginBottom: '12px',\n },\n\n '&.tablet-badges': {\n flexDirection: 'row',\n gap: '12px',\n marginBottom: '8px',\n },\n});\n\nexport const Badge = styled((props: BadgeProps) => <Box {...props} />)(({ hasWhiteBackground }) => ({\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(10px)',\n borderRadius: '20px',\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n transition: 'all 0.3s ease',\n\n '&.mobile-badge': {\n padding: '6px 12px',\n borderRadius: '16px',\n fontSize: '12px',\n },\n\n '&.tablet-badge': {\n padding: '8px 16px',\n borderRadius: '20px',\n fontSize: '14px',\n },\n\n '&.total-savings-badge': {\n backgroundColor: '#4A6987',\n border: 'none',\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n backdropFilter: 'none',\n '.badge-value': {\n color: '#FFFFFF',\n },\n '&:hover': {\n backgroundColor: '#4A6987',\n transform: 'none',\n boxShadow: 'none',\n },\n },\n\n '&.expiration-badge': {\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n },\n\n '&:hover': {\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n transform: 'translateY(-1px)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n\n '.badge-text': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '400',\n opacity: 0.9,\n },\n\n '.badge-value': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '600',\n },\n}));\nexport const ToggleButtonMobile = styled('button')({\n backgroundColor: '#E0E0E0',\n border: '1px solid #252525',\n borderRadius: '10px',\n cursor: 'pointer',\n width: '40px',\n height: '20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '10px auto 5px auto',\n transition: 'all 0.2s ease',\n '& .arrow-icon-mobile': {\n transition: 'transform 0.3s ease',\n '&.expanded': {\n transform: 'rotate(180deg)',\n },\n },\n});\nexport const StyledSpan = styled(Box)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`;\nexport const ImgTabIndex = styled('span')`\n line-height: 0.5;\n`;\n\nexport const ContactLink = styled('a')({\n fontSize: 'inherit',\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit',\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n});\n\nexport const BadgeValue = styled('span')({});\n","import React from 'react';\nimport { Box } from '@mui/material';\n\ntype PlaceholderImageProps = {\n readonly width: string | number;\n readonly height: string | number;\n readonly backgroundColor: string;\n};\n\nexport const PlaceholderImage: React.FC<PlaceholderImageProps> = ({ width, height, backgroundColor }) => {\n return (\n <Box\n sx={{\n width,\n height,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor,\n }}\n data-testid=\"placeholder-image\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"129\" viewBox=\"0 0 128 129\" fill=\"none\">\n <g id=\"ns_logomark\">\n <path\n id=\"Vector\"\n d=\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_2\"\n d=\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_3\"\n d=\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_4\"\n d=\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_5\"\n d=\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\"\n fill=\"#252525\"\n />\n </g>\n </svg>\n </Box>\n );\n};\n","import React from 'react';\n\ntype ArrowDownIconProps = {\n readonly width?: string | number;\n readonly height?: string | number;\n readonly className?: string;\n};\n\nexport const ArrowDownIcon: React.FC<ArrowDownIconProps> = ({ width = 16, height = 16, className = '' }) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n data-testid=\"arrow-down-icon\"\n >\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n </svg>\n );\n};\n","export interface GTMEvent {\n event: string;\n\n [key: string]: unknown;\n}\n\ndeclare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport function trackGTMEvent(eventData: GTMEvent): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const url = window.location.href;\n const updatedEventData = { ...eventData };\n\n const prefix = url.includes('personal-offer') ? 'postorefront_' : 'mysite_';\n updatedEventData.event = prefix + eventData.event;\n\n try {\n if (window.dataLayer) {\n window.dataLayer.push(updatedEventData);\n } else {\n console.error('GTM dataLayer not available, but event logged');\n window.dataLayer = [];\n window.dataLayer.push(updatedEventData);\n }\n } catch (error) {\n console.error('Failed to track GTM event:', error);\n }\n}\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const DashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 32px;\n }\n`;\n\nexport const StatsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const WidgetContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TwoColumnGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport PublicIcon from '@mui/icons-material/Public';\nimport { NsSpinner } from '@nuskin/foundation-ui-components';\nimport {\n HeaderContainer,\n TitleSection,\n ShopTitle,\n DateRangeLabel,\n FiltersSection,\n FilterDropdownContainer,\n FilterLabel,\n StyledSelect,\n FilterIcon,\n LoadingIndicatorContainer,\n DesktopFiltersContainer,\n} from './DashboardHeader.styled';\nimport type { DateRangeOption, MarketOption, MarketFilterOption, DashboardStats } from '../types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { useMarketOptions } from '../utils/marketOptions';\n\nexport interface DashboardHeaderProps {\n readonly shopTitle?: string;\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly dateRangeLabel?: string;\n readonly isLoading?: boolean;\n readonly stats?: DashboardStats | null;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n}\n\nexport const DashboardHeader: React.FC<DashboardHeaderProps> = ({\n shopTitle,\n dateRange,\n market,\n dateRangeLabel: dateRangeLabelProp,\n isLoading = false,\n stats,\n markets,\n onDateRangeChange,\n onMarketChange,\n}) => {\n const marketOptions = useMarketOptions(markets);\n\n const handleDateRangeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newDateRange = event.target.value as DateRangeOption;\n onDateRangeChange?.(newDateRange);\n };\n\n const handleMarketChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newMarket = event.target.value;\n onMarketChange?.(newMarket);\n };\n\n const handleFilterKeyDown = (event: React.KeyboardEvent<HTMLSelectElement>) => {\n if (event.key === 'Escape') {\n (event.target as HTMLSelectElement).blur();\n }\n };\n\n const getDateRangeLabelText = () => {\n if (dateRangeLabelProp) return dateRangeLabelProp;\n if (stats?.dateRange) return stats.dateRange.label;\n return getTranslation(Keys.filter.dateRange.last30days);\n };\n\n return (\n <HeaderContainer as=\"header\" data-testid=\"dashboard-header\">\n <TitleSection>\n <ShopTitle data-testid=\"dashboard-shop-title\">\n {shopTitle ?? stats?.shopTitle ?? getTranslation(Keys.title)}\n </ShopTitle>\n <DateRangeLabel aria-live=\"polite\" data-testid=\"dashboard-date-range-label\">\n {getDateRangeLabelText()}\n </DateRangeLabel>\n </TitleSection>\n\n <FiltersSection\n aria-label={getTranslation(Keys.ariaLabel.dashboardFilters)}\n data-testid=\"dashboard-filters-section\"\n >\n <DesktopFiltersContainer>\n {isLoading && (\n <LoadingIndicatorContainer\n as=\"output\"\n aria-live=\"polite\"\n aria-label={getTranslation(Keys.ariaLabel.loadingDashboard)}\n data-testid=\"dashboard-loading-indicator\"\n >\n <NsSpinner />\n </LoadingIndicatorContainer>\n )}\n\n <FilterDropdownContainer>\n <FilterLabel htmlFor=\"filter-date-range\">\n {getTranslation(Keys.filter.dateRangeLabel)}\n </FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <CalendarTodayIcon />\n </FilterIcon>\n <StyledSelect\n id=\"filter-date-range\"\n data-testid=\"filter-date-range\"\n value={dateRange}\n onChange={handleDateRangeChange}\n onKeyDown={handleFilterKeyDown}\n disabled={isLoading}\n aria-label={`${getTranslation(Keys.ariaLabel.dateRangeFilter)} ${getTranslation(Keys.filter.dateRange[dateRange])}`}\n >\n <option value=\"last7days\">{getTranslation(Keys.filter.dateRange.last7days)}</option>\n <option value=\"last30days\">{getTranslation(Keys.filter.dateRange.last30days)}</option>\n <option value=\"last90days\">{getTranslation(Keys.filter.dateRange.last90days)}</option>\n <option value=\"thisMonth\">{getTranslation(Keys.filter.dateRange.thisMonth)}</option>\n </StyledSelect>\n </FilterDropdownContainer>\n\n <FilterDropdownContainer>\n <FilterLabel htmlFor=\"filter-market\">{getTranslation(Keys.filter.marketLabel)}</FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <PublicIcon />\n </FilterIcon>\n <StyledSelect\n id=\"filter-market\"\n data-testid=\"filter-market\"\n value={market}\n onChange={handleMarketChange}\n onKeyDown={handleFilterKeyDown}\n disabled={isLoading}\n aria-label={`${getTranslation(Keys.ariaLabel.marketFilter)} ${\n marketOptions.find((opt) => opt.value === market)?.label ?? String(market)\n }`}\n >\n {marketOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </StyledSelect>\n </FilterDropdownContainer>\n </DesktopFiltersContainer>\n </FiltersSection>\n </HeaderContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 12px;\n min-height: 64px;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px 32px;\n }\n`;\n\nexport const TitleSection = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`;\n\nexport const ShopTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n\n @media (min-width: 1080px) {\n font-size: 16px;\n }\n`;\n\nexport const DateRangeLabel = styled('div')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`;\n\nexport const FilterDropdownContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`;\n\nexport const FilterLabel = styled('label')`\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N80')};\n white-space: nowrap;\n display: none;\n\n @media (min-width: 1080px) {\n display: block;\n }\n`;\n\nexport const StyledSelect = styled('select')`\n display: flex;\n align-items: center;\n gap: 12px;\n height: 40px;\n padding: 8px 12px;\n background-color: transparent;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;charset=UTF-8,%3csvg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M5.625 7.3125L9 10.6875L12.375 7.3125\" stroke=\"%235f5f5f\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/%3e%3c/svg%3e');\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 32px;\n min-width: auto;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n @media (min-width: 768px) {\n min-width: 160px;\n }\n\n @media (min-width: 1080px) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N10')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n min-width: 180px;\n }\n`;\n\nexport const FilterIcon = styled('span')`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n width: 16px;\n height: 16px;\n }\n`;\n\nexport const LoadingIndicatorContainer = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n overflow: hidden;\n\n svg,\n img,\n > * {\n width: 28px !important;\n height: 28px !important;\n max-width: 28px;\n max-height: 28px;\n }\n`;\n\nexport const DesktopFiltersContainer = styled('div')`\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`;\n\nexport const StyledCircularProgress = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","export type TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport type TranslateFn = (key: string, fallback: string) => string;\n\nlet activeResolver: TranslateFn | undefined;\n\nexport function setTranslationResolver(resolver: TranslateFn | undefined): void {\n activeResolver = resolver;\n}\n\nexport function getTranslationResolver(): TranslateFn | undefined {\n return activeResolver;\n}\n\nexport function resolveTranslation(entry: TranslationEntry): string {\n if (!activeResolver) {\n return entry.fallback;\n }\n let result: string | undefined;\n try {\n result = activeResolver(entry.key, entry.fallback);\n } catch {\n result = undefined;\n }\n return typeof result === 'string' && result.length > 0 ? result : entry.fallback;\n}\n","import { resolveTranslation } from './translationResolver';\n\nexport const ShoppingDashboardTranslationKeys = {\n title: {\n key: 'shoppingDashboard.title',\n fallback: 'Shop Performance',\n },\n error: {\n key: 'shoppingDashboard.error',\n fallback: 'Error loading dashboard',\n },\n stats: {\n revenue: {\n key: 'shoppingDashboard.stats.revenue',\n fallback: 'Total Revenue',\n },\n volume: {\n key: 'shoppingDashboard.stats.volume',\n fallback: 'Volume',\n },\n visits: {\n key: 'shoppingDashboard.stats.visits',\n fallback: 'Site Visits',\n },\n subtitle: {\n dcSv: {\n key: 'shoppingDashboard.stats.subtitle.dcSv',\n fallback: 'DC-SV',\n },\n conversionRate: {\n key: 'shoppingDashboard.stats.subtitle.conversionRate',\n fallback: 'Conversion Rate',\n },\n },\n trend: {\n increased: {\n key: 'shoppingDashboard.stats.trend.increased',\n fallback: 'increased',\n },\n decreased: {\n key: 'shoppingDashboard.stats.trend.decreased',\n fallback: 'decreased',\n },\n unchanged: {\n key: 'shoppingDashboard.stats.trend.unchanged',\n fallback: 'unchanged',\n },\n },\n details: {\n key: 'shoppingDashboard.stats.details',\n fallback: 'details',\n },\n },\n filter: {\n dateRange: {\n label: {\n key: 'shoppingDashboard.filter.dateRange.label',\n fallback: 'Date Range',\n },\n last7days: {\n key: 'shoppingDashboard.filter.dateRange.last7days',\n fallback: 'Last 7 Days',\n },\n last30days: {\n key: 'shoppingDashboard.filter.dateRange.last30days',\n fallback: 'Last 30 Days',\n },\n last90days: {\n key: 'shoppingDashboard.filter.dateRange.last90days',\n fallback: 'Last 90 Days',\n },\n thisMonth: {\n key: 'shoppingDashboard.filter.dateRange.thisMonth',\n fallback: 'This Month',\n },\n },\n dateRangeLabel: {\n key: 'shoppingDashboard.filter.dateRangeLabel',\n fallback: 'Date Range',\n },\n market: {\n label: {\n key: 'shoppingDashboard.filter.market.label',\n fallback: 'Market',\n },\n all: {\n key: 'shoppingDashboard.filter.market.all',\n fallback: 'All Markets',\n },\n },\n marketLabel: {\n key: 'shoppingDashboard.filter.marketLabel',\n fallback: 'Market',\n },\n productSort: {\n label: {\n key: 'shoppingDashboard.filter.productSort.label',\n fallback: 'Sort By',\n },\n units: {\n key: 'shoppingDashboard.filter.productSort.units',\n fallback: 'Units',\n },\n revenue: {\n key: 'shoppingDashboard.filter.productSort.revenue',\n fallback: 'Revenue',\n },\n volume: {\n key: 'shoppingDashboard.filter.productSort.volume',\n fallback: 'Volume',\n },\n byUnits: {\n key: 'shoppingDashboard.filter.productSort.byUnits',\n fallback: 'By: Units',\n },\n byRevenue: {\n key: 'shoppingDashboard.filter.productSort.byRevenue',\n fallback: 'By: Revenue',\n },\n byVolume: {\n key: 'shoppingDashboard.filter.productSort.byVolume',\n fallback: 'By: Volume',\n },\n },\n signupView: {\n label: {\n key: 'shoppingDashboard.filter.signupView.label',\n fallback: 'Show',\n },\n all: {\n key: 'shoppingDashboard.filter.signupView.all',\n fallback: 'All',\n },\n members: {\n key: 'shoppingDashboard.filter.signupView.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.filter.signupView.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.filter.signupView.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n showAll: {\n key: 'shoppingDashboard.filter.signupView.showAll',\n fallback: 'Show: All',\n },\n showMembers: {\n key: 'shoppingDashboard.filter.signupView.showMembers',\n fallback: 'Show: Members',\n },\n showRetail: {\n key: 'shoppingDashboard.filter.signupView.showRetail',\n fallback: 'Show: Retail',\n },\n showBrandAffiliates: {\n key: 'shoppingDashboard.filter.signupView.showBrandAffiliates',\n fallback: 'Show: Brand Affiliates',\n },\n },\n conversionType: {\n all: {\n key: 'shoppingDashboard.filter.conversionType.all',\n fallback: 'All',\n },\n standard: {\n key: 'shoppingDashboard.filter.conversionType.standard',\n fallback: 'Standard',\n },\n subscription: {\n key: 'shoppingDashboard.filter.conversionType.subscription',\n fallback: 'Subscription',\n },\n },\n categorySort: {\n byRevenue: {\n key: 'shoppingDashboard.filter.categorySort.byRevenue',\n fallback: 'By: Revenue',\n },\n byTrend: {\n key: 'shoppingDashboard.filter.categorySort.byTrend',\n fallback: 'By: Trend',\n },\n },\n },\n widget: {\n topProducts: {\n title: {\n key: 'shoppingDashboard.widget.topProducts.title',\n fallback: 'Top Selling Products',\n },\n viewAll: {\n key: 'shoppingDashboard.widget.topProducts.viewAll',\n fallback: 'View All Products',\n },\n units: {\n key: 'shoppingDashboard.widget.topProducts.units',\n fallback: 'Units',\n },\n revenue: {\n key: 'shoppingDashboard.widget.topProducts.revenue',\n fallback: 'Revenue',\n },\n loading: {\n key: 'shoppingDashboard.widget.topProducts.loading',\n fallback: 'Loading products...',\n },\n empty: {\n key: 'shoppingDashboard.widget.topProducts.empty',\n fallback: 'No products available',\n },\n ariaLabel: {\n key: 'shoppingDashboard.widget.topProducts.ariaLabel',\n fallback: 'Top Selling Products widget',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.titleAriaLabel',\n fallback: 'Click to view full top products details page',\n },\n sortAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.sortAriaLabel',\n fallback: 'Sort products by',\n },\n noImageAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.noImageAriaLabel',\n fallback: 'No image available',\n },\n unitsSuffix: {\n key: 'shoppingDashboard.widget.topProducts.unitsSuffix',\n fallback: 'units',\n },\n revenueSuffix: {\n key: 'shoppingDashboard.widget.topProducts.revenueSuffix',\n fallback: 'revenue',\n },\n dcSvSuffix: {\n key: 'shoppingDashboard.widget.topProducts.dcSvSuffix',\n fallback: 'DC-SV',\n },\n rank: {\n key: 'shoppingDashboard.widget.topProducts.rank',\n fallback: 'Rank',\n },\n trend: {\n key: 'shoppingDashboard.widget.topProducts.trend',\n fallback: 'Trend',\n },\n },\n conversionRate: {\n title: {\n key: 'shoppingDashboard.widget.conversionRate.title',\n fallback: 'Conversion Rate',\n },\n formula: {\n key: 'shoppingDashboard.widget.conversionRate.formula',\n fallback: 'Orders \\u00F7 Site visits',\n },\n comparison: {\n key: 'shoppingDashboard.widget.conversionRate.comparison',\n fallback: 'compared to this time last month',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.chartAriaLabel',\n fallback: 'Conversion Rate chart showing daily rates',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.titleAriaLabel',\n fallback: 'Click to view full conversion rate details page',\n },\n filterAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.filterAriaLabel',\n fallback: 'Filter conversion rate by customer type',\n },\n noData: {\n key: 'shoppingDashboard.widget.conversionRate.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.widget.conversionRate.noChange',\n fallback: 'No change',\n },\n tooltipOrders: {\n key: 'shoppingDashboard.widget.conversionRate.tooltipOrders',\n fallback: 'orders',\n },\n tooltipVisits: {\n key: 'shoppingDashboard.widget.conversionRate.tooltipVisits',\n fallback: 'visits',\n },\n ordersPerSiteVisits: {\n key: 'shoppingDashboard.widget.conversionRate.ordersPerSiteVisits',\n fallback: 'Orders / Site Visits',\n },\n },\n signups: {\n title: {\n key: 'shoppingDashboard.widget.signups.title',\n fallback: 'Sign-ups',\n },\n total: {\n key: 'shoppingDashboard.widget.signups.total',\n fallback: 'Total',\n },\n members: {\n key: 'shoppingDashboard.widget.signups.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.widget.signups.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.widget.signups.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.signups.chartAriaLabel',\n fallback: 'Signups multi-line chart showing Total, Members, Retail, and Brand Affiliates',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.signups.titleAriaLabel',\n fallback: 'Click to view full signups details page',\n },\n filterAriaLabel: {\n key: 'shoppingDashboard.widget.signups.filterAriaLabel',\n fallback: 'Filter signups view',\n },\n noData: {\n key: 'shoppingDashboard.widget.signups.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.widget.signups.noChange',\n fallback: 'No change',\n },\n totalSignupsInPeriod: {\n key: 'shoppingDashboard.widget.signups.totalSignupsInPeriod',\n fallback: 'Total sign-ups in period',\n },\n noTrendData: {\n key: 'shoppingDashboard.widget.signups.noTrendData',\n fallback: 'No sign-up trend data available.',\n },\n },\n topCategories: {\n title: {\n key: 'shoppingDashboard.widget.topCategories.title',\n fallback: 'Top Categories',\n },\n revenue: {\n key: 'shoppingDashboard.widget.topCategories.revenue',\n fallback: 'Revenue',\n },\n units: {\n key: 'shoppingDashboard.widget.topCategories.units',\n fallback: 'Units',\n },\n empty: {\n key: 'shoppingDashboard.widget.topCategories.empty',\n fallback: 'No category data available',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.chartAriaLabel',\n fallback: 'Top Categories donut chart showing revenue distribution by category',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.titleAriaLabel',\n fallback: 'Click to view full categories details page',\n },\n sortAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.sortAriaLabel',\n fallback: 'Sort categories by',\n },\n },\n menu: {\n ariaLabel: {\n key: 'shoppingDashboard.widget.menu.ariaLabel',\n fallback: 'widget options',\n },\n fullView: {\n key: 'shoppingDashboard.widget.menu.fullView',\n fallback: 'Full View',\n },\n },\n },\n navigation: {\n backToDashboard: {\n key: 'shoppingDashboard.navigation.backToDashboard',\n fallback: 'Back to Dashboard',\n },\n backAriaLabel: {\n key: 'shoppingDashboard.navigation.backAriaLabel',\n fallback: 'Back to dashboard',\n },\n },\n ariaLabel: {\n dashboard: {\n key: 'shoppingDashboard.ariaLabel.dashboard',\n fallback: 'Shopping Dashboard',\n },\n statsRow: {\n key: 'shoppingDashboard.ariaLabel.statsRow',\n fallback: 'Key performance metrics',\n },\n dashboardFilters: {\n key: 'shoppingDashboard.ariaLabel.dashboardFilters',\n fallback: 'Dashboard filters',\n },\n loadingDashboard: {\n key: 'shoppingDashboard.ariaLabel.loadingDashboard',\n fallback: 'Loading dashboard data',\n },\n dateRangeFilter: {\n key: 'shoppingDashboard.ariaLabel.dateRangeFilter',\n fallback: 'Date range filter, currently selected:',\n },\n marketFilter: {\n key: 'shoppingDashboard.ariaLabel.marketFilter',\n fallback: 'Market filter, currently selected:',\n },\n filterSuffix: {\n key: 'shoppingDashboard.ariaLabel.filterSuffix',\n fallback: 'filter',\n },\n },\n fullView: {\n signups: {\n columns: {\n id: { key: 'shoppingDashboard.fullView.signups.columns.id', fallback: 'ID' },\n name: { key: 'shoppingDashboard.fullView.signups.columns.name', fallback: 'Name' },\n date: { key: 'shoppingDashboard.fullView.signups.columns.date', fallback: 'Date' },\n type: { key: 'shoppingDashboard.fullView.signups.columns.type', fallback: 'Type' },\n email: { key: 'shoppingDashboard.fullView.signups.columns.email', fallback: 'Email' },\n status: { key: 'shoppingDashboard.fullView.signups.columns.status', fallback: 'Status' },\n },\n detailsTitle: {\n key: 'shoppingDashboard.fullView.signups.detailsTitle',\n fallback: 'Signup Details',\n },\n },\n conversionRate: {\n columns: {\n orderId: { key: 'shoppingDashboard.fullView.conversionRate.columns.orderId', fallback: 'Order ID' },\n date: { key: 'shoppingDashboard.fullView.conversionRate.columns.date', fallback: 'Date' },\n customer: { key: 'shoppingDashboard.fullView.conversionRate.columns.customer', fallback: 'Customer' },\n type: { key: 'shoppingDashboard.fullView.conversionRate.columns.type', fallback: 'Type' },\n items: { key: 'shoppingDashboard.fullView.conversionRate.columns.items', fallback: 'Items' },\n total: { key: 'shoppingDashboard.fullView.conversionRate.columns.total', fallback: 'Order Total' },\n bv: { key: 'shoppingDashboard.fullView.conversionRate.columns.bv', fallback: 'BV' },\n orderTotal: {\n key: 'shoppingDashboard.fullView.conversionRate.columns.orderTotal',\n fallback: 'Order Total',\n },\n totalSv: { key: 'shoppingDashboard.fullView.conversionRate.columns.totalSv', fallback: 'Total SV' },\n },\n orderDetailsTitle: {\n key: 'shoppingDashboard.fullView.conversionRate.orderDetailsTitle',\n fallback: 'Order Details',\n },\n notAvailable: {\n key: 'shoppingDashboard.fullView.conversionRate.notAvailable',\n fallback: 'N/A',\n },\n },\n products: {\n columns: {\n rank: { key: 'shoppingDashboard.fullView.products.columns.rank', fallback: '#' },\n product: { key: 'shoppingDashboard.fullView.products.columns.product', fallback: 'Product' },\n unitsSold: { key: 'shoppingDashboard.fullView.products.columns.unitsSold', fallback: 'Units Sold' },\n revenue: { key: 'shoppingDashboard.fullView.products.columns.revenue', fallback: 'Revenue' },\n volume: { key: 'shoppingDashboard.fullView.products.columns.volume', fallback: 'Volume (DC-SV)' },\n },\n skuPrefix: {\n key: 'shoppingDashboard.fullView.products.skuPrefix',\n fallback: 'SKU',\n },\n noProducts: {\n key: 'shoppingDashboard.fullView.products.noProducts',\n fallback: 'No products available.',\n },\n },\n categories: {\n columns: {\n category: { key: 'shoppingDashboard.fullView.categories.columns.category', fallback: 'Category' },\n revenue: { key: 'shoppingDashboard.fullView.categories.columns.revenue', fallback: 'Revenue' },\n percentOfTotal: {\n key: 'shoppingDashboard.fullView.categories.columns.percentOfTotal',\n fallback: '% of Total',\n },\n trend: { key: 'shoppingDashboard.fullView.categories.columns.trend', fallback: 'Trend' },\n },\n allCategoriesTitle: {\n key: 'shoppingDashboard.fullView.categories.allCategoriesTitle',\n fallback: 'All Categories',\n },\n noCategoryData: {\n key: 'shoppingDashboard.fullView.categories.noCategoryData',\n fallback: 'No category data available.',\n },\n },\n },\n dataTable: {\n noDataAvailable: {\n key: 'shoppingDashboard.dataTable.noDataAvailable',\n fallback: 'No data available',\n },\n sortableColumn: {\n key: 'shoppingDashboard.dataTable.sortableColumn',\n fallback: ', sortable column',\n },\n },\n pagination: {\n previousPage: {\n key: 'shoppingDashboard.pagination.previousPage',\n fallback: 'Previous page',\n },\n nextPage: {\n key: 'shoppingDashboard.pagination.nextPage',\n fallback: 'Next page',\n },\n goToPage: {\n key: 'shoppingDashboard.pagination.goToPage',\n fallback: 'Go to page',\n },\n of: {\n key: 'shoppingDashboard.pagination.of',\n fallback: 'of',\n },\n },\n defaults: {\n zeroTrend: {\n key: 'shoppingDashboard.defaults.zeroTrend',\n fallback: '+0%',\n },\n noValue: {\n key: 'shoppingDashboard.defaults.noValue',\n fallback: '--',\n },\n },\n} as const;\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import { useMemo } from 'react';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport type { MarketFilterOption } from '../types.d';\n\nexport function buildDefaultMarketOptions(): MarketFilterOption[] {\n return [{ value: 'all', label: getTranslation(Keys.filter.market.all) }];\n}\n\nexport function resolveMarketOptions(\n markets: ReadonlyArray<MarketFilterOption> | undefined,\n): ReadonlyArray<MarketFilterOption> {\n if (markets && markets.length > 0) {\n return markets;\n }\n return buildDefaultMarketOptions();\n}\n\nexport function useMarketOptions(\n markets: ReadonlyArray<MarketFilterOption> | undefined,\n): ReadonlyArray<MarketFilterOption> {\n return useMemo(() => resolveMarketOptions(markets), [markets]);\n}\n","import React from 'react';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport {\n StatsCardContainer,\n StatsTitle,\n StatsValueContainer,\n StatsValue,\n StatsSubtitle,\n ValueSubtitleWrapper,\n TrendContainer,\n TrendText,\n StatsCardHeader,\n SplitTitle,\n SplitRow,\n LegendColumn,\n SplitTrend,\n LegendCaption,\n} from './StatsCard.styled';\nimport { StatsCardSkeleton } from './LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface StatsCardProps {\n readonly title: string;\n readonly value: string;\n readonly subtitle?: string;\n readonly caption?: string;\n readonly layout?: 'default' | 'split';\n readonly trendDirection?: 'up' | 'down' | 'neutral';\n readonly trendValue?: string;\n readonly testId?: string;\n readonly isLoading?: boolean;\n}\n\nconst StatsCardComponent: React.FC<StatsCardProps> = ({\n title,\n value,\n subtitle,\n caption,\n layout = 'default',\n trendDirection = 'neutral',\n trendValue,\n testId,\n isLoading = false,\n}) => {\n if (isLoading) {\n return (\n <StatsCardContainer $layout={layout} data-testid={testId}>\n <StatsCardSkeleton />\n </StatsCardContainer>\n );\n }\n\n const getTrendAriaLabel = () => {\n let directionText = getTranslation(Keys.stats.trend.unchanged);\n if (trendDirection === 'up') directionText = getTranslation(Keys.stats.trend.increased);\n else if (trendDirection === 'down') directionText = getTranslation(Keys.stats.trend.decreased);\n\n return `${title} ${directionText} ${trendValue ?? ''}`;\n };\n\n const getTrendChartIcon = (iconSize: string) => {\n if (trendDirection === 'up') {\n return <TrendingUpIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n }\n if (trendDirection === 'down') {\n return <TrendingDownIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n }\n return <ShowChartIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n };\n\n if (layout === 'split') {\n return (\n <StatsCardContainer as=\"article\" $layout=\"split\" aria-label={`${title}: ${value}`} data-testid={testId}>\n <SplitTitle id={`stats-title-${testId}`}>{title}</SplitTitle>\n <SplitRow>\n <StatsValue aria-describedby={`stats-title-${testId}`} data-testid={`stats-value-${testId}`}>\n {value}\n </StatsValue>\n {(trendValue ?? caption) && (\n <LegendColumn>\n {trendValue && (\n <SplitTrend\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={getTrendAriaLabel()}\n data-testid={`stats-trend-${testId}`}\n >\n {getTrendChartIcon('18px')}\n <TrendText>{trendValue}</TrendText>\n </SplitTrend>\n )}\n {caption && (\n <LegendCaption data-testid={`stats-caption-${testId}`}>{caption}</LegendCaption>\n )}\n </LegendColumn>\n )}\n </SplitRow>\n </StatsCardContainer>\n );\n }\n\n return (\n <StatsCardContainer as=\"article\" aria-label={`${title}: ${value}`} data-testid={testId}>\n <StatsCardHeader>\n <StatsTitle id={`stats-title-${testId}`}>{title}</StatsTitle>\n </StatsCardHeader>\n\n <StatsValueContainer>\n <ValueSubtitleWrapper>\n <StatsValue aria-describedby={`stats-title-${testId}`} data-testid={`stats-value-${testId}`}>\n {value}\n </StatsValue>\n {subtitle && (\n <StatsSubtitle\n aria-label={`${title} ${getTranslation(Keys.stats.details)}: ${subtitle}`}\n data-testid={`stats-subtitle-${testId}`}\n >\n {subtitle}\n </StatsSubtitle>\n )}\n </ValueSubtitleWrapper>\n\n {trendValue && (\n <TrendContainer\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={getTrendAriaLabel()}\n data-testid={`stats-trend-${testId}`}\n >\n {getTrendChartIcon('16px')}\n <TrendText>{trendValue}</TrendText>\n </TrendContainer>\n )}\n </StatsValueContainer>\n </StatsCardContainer>\n );\n};\n\nexport const StatsCard = React.memo(StatsCardComponent);\nStatsCard.displayName = 'StatsCard';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const StatsCardContainer = styled('div')<{ $layout?: 'default' | 'split' }>`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-sizing: border-box;\n gap: ${({ $layout }) => ($layout === 'split' ? '8px' : '0')};\n padding: ${({ $layout }) => ($layout === 'split' ? '16px' : '12px')};\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 8px;\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '120px')};\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n @media (min-width: 768px) {\n padding: ${({ $layout }) => ($layout === 'split' ? '24px' : '20px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '140px')};\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '160px')};\n }\n`;\n\nexport const SplitTitle = styled('div')`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`;\n\nexport const SplitRow = styled('div')`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`;\n\nexport const LegendColumn = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`;\n\nexport const SplitTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#9b131a';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`;\n\nexport const LegendCaption = styled('div')`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n letter-spacing: 0.12px;\n text-align: right;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const StatsTitle = styled('div')`\n font-size: 20px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 4px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 20px;\n margin-bottom: 6px;\n }\n\n @media (min-width: 1080px) {\n font-size: 20px;\n }\n`;\n\nexport const StatsValueContainer = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-top: 8px;\n width: 100%;\n`;\n\nexport const StatsValue = styled('div')`\n font-size: 24px;\n font-weight: 700;\n line-height: 1.2;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 28px;\n }\n\n @media (min-width: 1080px) {\n font-size: 32px;\n }\n`;\n\nexport const ValueSubtitleWrapper = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`;\n\nexport const StatsSubtitle = styled('div')`\n font-size: 16px;\n font-weight: 400;\n line-height: normal;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n padding-bottom: 2px;\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`;\n\nexport const TrendContainer = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#22C55E';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 14px;\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n`;\n\nexport const TrendIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const TrendText = styled('span')`\n white-space: nowrap;\n`;\n\nexport const StatsCardHeader = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n","import React from 'react';\nimport Skeleton from '@mui/material/Skeleton';\nimport {\n SkeletonCard,\n SkeletonHeader,\n SkeletonRow,\n StatsCardWrapper,\n StatsCardHeaderRow,\n StatsCardBody,\n StatsCardSubtitle,\n ProductRowInfo,\n ProductRowMetrics,\n ChartMetricRow,\n ChartMetricTrend,\n ChartAreaSkeleton,\n PieChartLayout,\n PieCircleSkeleton,\n LegendList,\n LegendRowWrapper,\n LegendRowInfo,\n DashboardLayout,\n DashboardHeaderRow,\n DashboardFilterGroup,\n StatsGrid,\n WidgetGrid,\n FullViewLayout,\n FullViewMetricCard,\n FullViewMetricCenter,\n FullViewChartArea,\n FullViewTableCard,\n FullViewTableRow,\n SummaryCardsGrid,\n} from './LoadingSkeletons.styled';\n\nexport const StatsCardSkeleton: React.FC = () => (\n <StatsCardWrapper data-testid=\"skeleton-stats-card\">\n <StatsCardHeaderRow>\n <Skeleton variant=\"text\" width={80} height={18} />\n <Skeleton variant=\"text\" width={48} height={16} />\n </StatsCardHeaderRow>\n <StatsCardBody>\n <Skeleton variant=\"text\" width={120} height={36} />\n <StatsCardSubtitle variant=\"text\" width={100} height={16} />\n </StatsCardBody>\n </StatsCardWrapper>\n);\n\nconst ProductRowSkeleton: React.FC = () => (\n <SkeletonRow>\n <Skeleton variant=\"rounded\" width={28} height={28} />\n <Skeleton variant=\"rounded\" width={50} height={50} />\n <ProductRowInfo>\n <Skeleton variant=\"text\" width=\"70%\" height={18} />\n <Skeleton variant=\"text\" width=\"50%\" height={14} />\n </ProductRowInfo>\n <ProductRowMetrics>\n <Skeleton variant=\"text\" width={80} height={18} />\n <Skeleton variant=\"text\" width={48} height={14} />\n </ProductRowMetrics>\n </SkeletonRow>\n);\n\nexport const ProductsListSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-products-list\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={160} height={22} />\n <Skeleton variant=\"rounded\" width={100} height={32} />\n </SkeletonHeader>\n {['product-1', 'product-2', 'product-3', 'product-4', 'product-5'].map((rowKey) => (\n <ProductRowSkeleton key={rowKey} />\n ))}\n </SkeletonCard>\n);\n\nexport const ChartWidgetSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-chart-widget\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={140} height={22} />\n <Skeleton variant=\"rounded\" width={110} height={32} />\n </SkeletonHeader>\n <ChartMetricRow>\n <Skeleton variant=\"text\" width={100} height={36} />\n <ChartMetricTrend>\n <Skeleton variant=\"text\" width={60} height={18} />\n <Skeleton variant=\"text\" width={140} height={14} />\n </ChartMetricTrend>\n </ChartMetricRow>\n <ChartAreaSkeleton variant=\"rounded\" width=\"100%\" />\n </SkeletonCard>\n);\n\nconst LegendRowSkeleton: React.FC = () => (\n <LegendRowWrapper>\n <Skeleton variant=\"circular\" width={12} height={12} />\n <LegendRowInfo>\n <Skeleton variant=\"text\" width=\"60%\" height={16} />\n <Skeleton variant=\"text\" width=\"40%\" height={14} />\n </LegendRowInfo>\n <Skeleton variant=\"text\" width={36} height={18} />\n </LegendRowWrapper>\n);\n\nexport const CategoriesPieChartSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-categories-pie\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={140} height={22} />\n <Skeleton variant=\"rounded\" width={100} height={32} />\n </SkeletonHeader>\n <PieChartLayout>\n <PieCircleSkeleton variant=\"circular\" />\n <LegendList>\n {['legend-1', 'legend-2', 'legend-3', 'legend-4', 'legend-5'].map((rowKey) => (\n <LegendRowSkeleton key={rowKey} />\n ))}\n </LegendList>\n </PieChartLayout>\n </SkeletonCard>\n);\n\nexport const DashboardSkeleton: React.FC = () => (\n <DashboardLayout data-testid=\"skeleton-dashboard\">\n <DashboardHeaderRow>\n <Skeleton variant=\"text\" width={200} height={32} />\n <DashboardFilterGroup>\n <Skeleton variant=\"rounded\" width={140} height={36} />\n <Skeleton variant=\"rounded\" width={140} height={36} />\n </DashboardFilterGroup>\n </DashboardHeaderRow>\n\n <StatsGrid>\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n </StatsGrid>\n\n <WidgetGrid>\n <ProductsListSkeleton />\n <ChartWidgetSkeleton />\n </WidgetGrid>\n\n <WidgetGrid>\n <ChartWidgetSkeleton />\n <CategoriesPieChartSkeleton />\n </WidgetGrid>\n </DashboardLayout>\n);\n\nexport const FullViewChartSkeleton: React.FC = () => (\n <FullViewLayout data-testid=\"skeleton-fullview-chart\">\n <FullViewMetricCard>\n <FullViewMetricCenter>\n <Skeleton variant=\"text\" width={140} height={52} />\n <Skeleton variant=\"text\" width={80} height={24} />\n <Skeleton variant=\"text\" width={160} height={16} />\n </FullViewMetricCenter>\n <FullViewChartArea variant=\"rounded\" width=\"100%\" />\n </FullViewMetricCard>\n\n <FullViewTableCard>\n <Skeleton variant=\"text\" width={200} height={24} />\n {['table-row-1', 'table-row-2', 'table-row-3', 'table-row-4', 'table-row-5'].map((rowKey) => (\n <FullViewTableRow key={rowKey} variant=\"rounded\" width=\"100%\" height={44} />\n ))}\n </FullViewTableCard>\n </FullViewLayout>\n);\n\nexport const FullViewTableSkeleton: React.FC = () => (\n <FullViewLayout data-testid=\"skeleton-fullview-table\">\n <SummaryCardsGrid>\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n </SummaryCardsGrid>\n\n <FullViewTableCard>\n <Skeleton variant=\"text\" width={200} height={24} />\n <FullViewTableRow variant=\"rounded\" width=\"100%\" height={40} />\n {[\n 'summary-row-1',\n 'summary-row-2',\n 'summary-row-3',\n 'summary-row-4',\n 'summary-row-5',\n 'summary-row-6',\n 'summary-row-7',\n 'summary-row-8',\n ].map((rowKey) => (\n <FullViewTableRow key={rowKey} variant=\"rounded\" width=\"100%\" height={44} />\n ))}\n </FullViewTableCard>\n </FullViewLayout>\n);\n","import { styled } from '@nuskin/foundation-theme';\nimport Skeleton from '@mui/material/Skeleton';\n\nexport const SkeletonCard = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const SkeletonHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 12px;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const SkeletonRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n padding: 14px 0;\n }\n`;\n\nexport const StatsCardWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 12px;\n border-radius: 8px;\n min-height: 120px;\n\n @media (min-width: 600px) {\n padding: 20px;\n min-height: 140px;\n }\n @media (min-width: 900px) {\n padding: 24px;\n min-height: 160px;\n }\n`;\n\nexport const StatsCardHeaderRow = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const StatsCardBody = styled('div')`\n margin-top: 8px;\n`;\n\nexport const StatsCardSubtitle = styled(Skeleton)`\n margin-top: 4px;\n`;\n\nexport const ProductRowInfo = styled('div')`\n flex: 1;\n min-width: 0;\n`;\n\nexport const ProductRowMetrics = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`;\n\nexport const ChartMetricRow = styled('div')`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`;\n\nexport const ChartMetricTrend = styled('div')`\n padding-top: 4px;\n`;\n\nexport const ChartAreaSkeleton = styled(Skeleton)`\n border-radius: 8px;\n height: 220px;\n\n @media (min-width: 600px) {\n height: 280px;\n }\n @media (min-width: 900px) {\n height: 340px;\n }\n`;\n\nexport const PieChartLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n @media (min-width: 600px) {\n flex-direction: row;\n gap: 24px;\n }\n`;\n\nexport const PieCircleSkeleton = styled(Skeleton)`\n width: 100%;\n height: 200px;\n border-radius: 8px;\n flex-shrink: 0;\n\n @media (min-width: 600px) {\n width: 200px;\n border-radius: 50%;\n }\n`;\n\nexport const LegendList = styled('div')`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const LegendRowWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`;\n\nexport const LegendRowInfo = styled('div')`\n flex: 1;\n`;\n\nexport const DashboardLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n @media (min-width: 600px) {\n gap: 32px;\n }\n @media (min-width: 900px) {\n gap: 40px;\n }\n`;\n\nexport const DashboardHeaderRow = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`;\n\nexport const DashboardFilterGroup = styled('div')`\n display: flex;\n gap: 16px;\n`;\n\nexport const StatsGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n @media (min-width: 900px) {\n gap: 24px;\n }\n`;\n\nexport const WidgetGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 900px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`;\n\nexport const FullViewLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\n\nexport const FullViewMetricCard = styled('div')`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\n\nexport const FullViewMetricCenter = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`;\n\nexport const FullViewChartArea = styled(Skeleton)`\n border-radius: 8px;\n height: 260px;\n\n @media (min-width: 600px) {\n height: 320px;\n }\n @media (min-width: 900px) {\n height: 400px;\n }\n`;\n\nexport const FullViewTableCard = styled('div')`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const FullViewTableRow = styled(Skeleton)`\n border-radius: 4px;\n`;\n\nexport const SummaryCardsGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n`;\n","import React from 'react';\nimport ShoppingCartIcon from '@mui/icons-material/ShoppingCart';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\nimport {\n ProductsListContainer,\n WidgetHeader,\n WidgetTitle,\n SortDropdown,\n HeaderActionsContainer,\n ProductsList,\n ProductItem,\n ProductRank,\n ProductImage,\n ProductImagePlaceholder,\n ProductInfo,\n ProductName,\n ProductSubtitle,\n ProductMetrics,\n ProductValue,\n ProductTrend,\n EmptyState,\n EmptyStateText,\n} from './TopSellingProductsList.styled';\nimport { WidgetMenu } from '../WidgetMenu';\nimport type { TopProduct, ProductSortOption } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { ProductsListSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface TopSellingProductsListProps {\n readonly products: TopProduct[];\n readonly productSort: ProductSortOption;\n readonly isLoading?: boolean;\n readonly maxProducts?: number;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as ProductSortOption;\n onSortChange?.(newSort);\n };\n\n const formatValue = (product: TopProduct, sortBy: ProductSortOption) => {\n switch (sortBy) {\n case 'units':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'revenue':\n return formatMoney(product.revenue, product.currencyCode);\n case 'volume':\n return `${product.volume.toLocaleString()} ${getTranslation(Keys.widget.topProducts.dcSvSuffix)}`;\n default:\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n }\n };\n\n const getSubtitle = (product: TopProduct, sortBy: ProductSortOption) => {\n switch (sortBy) {\n case 'units':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n case 'revenue':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'volume':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) return '';\n switch (sortBy) {\n case 'units':\n return trend.units ?? '';\n case 'revenue':\n return trend.revenue ?? '';\n case 'volume':\n return trend.volume ?? '';\n default:\n return trend.units ?? '';\n }\n };\n\n const getTrendDirection = (product: TopProduct, sortBy: ProductSortOption): TrendDirection => {\n const trendValue = getTrendValue(product, sortBy);\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+')) return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n const getTrendChartIcon = (direction: TrendDirection) => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n return <ShowChartIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n };\n\n const displayedProducts = products.slice(0, maxProducts);\n const rankLabel = getTranslation(Keys.widget.topProducts.rank);\n const trendLabel = getTranslation(Keys.widget.topProducts.trend);\n\n if (isLoading && products.length === 0) {\n return (\n <ProductsListContainer data-testid=\"widget-top-products\">\n <ProductsListSkeleton />\n </ProductsListContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <ProductsListContainer data-testid=\"widget-top-products\">\n <WidgetHeader>\n <WidgetTitle>{getTranslation(Keys.widget.topProducts.title)}</WidgetTitle>\n </WidgetHeader>\n <EmptyState data-testid=\"products-empty-state\">\n <ShoppingCartIcon />\n <EmptyStateText>{getTranslation(Keys.widget.topProducts.empty)}</EmptyStateText>\n </EmptyState>\n </ProductsListContainer>\n );\n }\n\n return (\n <ProductsListContainer\n as=\"section\"\n data-testid=\"widget-top-products\"\n aria-label={getTranslation(Keys.widget.topProducts.ariaLabel)}\n >\n <WidgetHeader>\n <WidgetTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.topProducts.titleAriaLabel)}\n data-testid=\"widget-title-top-products\"\n >\n {getTranslation(Keys.widget.topProducts.title)}\n </WidgetTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"product-sort\"\n data-testid=\"product-sort-dropdown\"\n value={productSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topProducts.sortAriaLabel)}\n >\n <option value=\"units\">{getTranslation(Keys.filter.productSort.byUnits)}</option>\n <option value=\"revenue\">{getTranslation(Keys.filter.productSort.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.filter.productSort.byVolume)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-products\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </WidgetHeader>\n\n <ProductsList as=\"ul\" data-testid=\"products-list\">\n {displayedProducts.map((product, index) => {\n const trendDirection = getTrendDirection(product, productSort);\n const trendValue = getTrendValue(product, productSort);\n\n return (\n <ProductItem\n as=\"li\"\n key={product.id}\n data-testid={`product-item-${index}`}\n aria-label={`${rankLabel} ${product.rank}: ${product.name}, ${formatValue(product, productSort)}`}\n >\n <ProductRank aria-label={`${rankLabel} ${product.rank}`}>{product.rank}</ProductRank>\n\n {product.imageUrl ? (\n <ProductImage\n src={product.imageUrl}\n alt={product.name}\n loading=\"lazy\"\n onError={(e) => {\n e.currentTarget.hidden = true;\n }}\n />\n ) : (\n <ProductImagePlaceholder\n aria-label={getTranslation(Keys.widget.topProducts.noImageAriaLabel)}\n >\n {product.name.substring(0, 2).toUpperCase()}\n </ProductImagePlaceholder>\n )}\n\n <ProductInfo>\n <ProductName title={product.name}>{product.name}</ProductName>\n <ProductSubtitle>{getSubtitle(product, productSort)}</ProductSubtitle>\n </ProductInfo>\n\n <ProductMetrics>\n <ProductValue>{formatValue(product, productSort)}</ProductValue>\n {trendValue && (\n <ProductTrend\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={`${trendLabel}: ${getTrendDirectionLabel(trendDirection)} ${trendValue}`}\n >\n {getTrendChartIcon(trendDirection)}\n <span>{trendValue}</span>\n </ProductTrend>\n )}\n </ProductMetrics>\n </ProductItem>\n );\n })}\n </ProductsList>\n </ProductsListContainer>\n );\n};\n\nexport const TopSellingProductsList = React.memo(TopSellingProductsListComponent);\nTopSellingProductsList.displayName = 'TopSellingProductsList';\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport type { TrendDirection } from '../shared/types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport function parseTrendPercent(value?: string): number | null {\n if (!value) return null;\n const cleanedValue = value.replace('%', '').trim();\n const parsedValue = Number(cleanedValue);\n return Number.isFinite(parsedValue) ? parsedValue : null;\n}\n\nexport function resolveTrendDirection(value?: string): TrendDirection {\n const parsedValue = parseTrendPercent(value);\n if (parsedValue === null) return 'neutral';\n if (parsedValue > 0) return 'up';\n if (parsedValue < 0) return 'down';\n return 'neutral';\n}\n\nexport function calculateWeightedRevenueTrend<T>(\n items: readonly T[],\n getRevenue: (item: T) => number,\n getTrend: (item: T) => string | undefined,\n): { direction: TrendDirection; formatted: string } {\n const { weightedSum, weight } = items.reduce(\n (accumulator, item) => {\n const trendValue = parseTrendPercent(getTrend(item));\n if (trendValue === null) return accumulator;\n return {\n weightedSum: accumulator.weightedSum + trendValue * getRevenue(item),\n weight: accumulator.weight + getRevenue(item),\n };\n },\n { weightedSum: 0, weight: 0 },\n );\n\n const average = weight > 0 ? weightedSum / weight : 0;\n let direction: TrendDirection = 'neutral';\n if (average > 0) direction = 'up';\n else if (average < 0) direction = 'down';\n\n return { direction, formatted: `${average > 0 ? '+' : ''}${average.toFixed(1)}%` };\n}\n\nexport function getTrendDirectionLabel(direction: TrendDirection): string {\n if (direction === 'up') return getTranslation(Keys.stats.trend.increased);\n if (direction === 'down') return getTranslation(Keys.stats.trend.decreased);\n return getTranslation(Keys.stats.trend.unchanged);\n}\n\nexport function getTrendIcon(direction: TrendDirection): React.ReactNode {\n switch (direction) {\n case 'up':\n return <ArrowUpwardIcon />;\n case 'down':\n return <ArrowDownwardIcon />;\n case 'neutral':\n default:\n return <RemoveIcon />;\n }\n}\n\nexport function getTrendColor(direction: TrendDirection): string {\n switch (direction) {\n case 'up':\n return '#4caf50';\n case 'down':\n return '#f44336';\n case 'neutral':\n default:\n return '#757575';\n }\n}\n","import { useMemo } from 'react';\n\nexport function calculateTotalPages<T>(items: T[], itemsPerPage: number): number {\n return Math.ceil(items.length / itemsPerPage);\n}\n\nexport function paginateItems<T>(items: T[], currentPage: number, itemsPerPage: number): T[] {\n const startIndex = (currentPage - 1) * itemsPerPage;\n const endIndex = startIndex + itemsPerPage;\n return items.slice(startIndex, endIndex);\n}\n\nexport function sortByNumericProperty<T extends Record<string, unknown>>(\n items: T[],\n key: keyof T,\n direction: 'asc' | 'desc' = 'desc',\n): T[] {\n return [...items].sort((a, b) => {\n const aVal = a[key] as number;\n const bVal = b[key] as number;\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n });\n}\n\nexport function calculatePercentage(value: number, total: number, decimalPlaces: number = 1): string {\n if (total === 0) return '0.0';\n return ((value / total) * 100).toFixed(decimalPlaces);\n}\n\nexport function usePaginatedItems<T>(\n items: T[],\n currentPage: number,\n itemsPerPage: number,\n): { totalPages: number; pageItems: T[] } {\n const totalPages = useMemo(() => calculateTotalPages(items, itemsPerPage), [items, itemsPerPage]);\n const pageItems = useMemo(\n () => paginateItems(items, currentPage, itemsPerPage),\n [items, currentPage, itemsPerPage],\n );\n return { totalPages, pageItems };\n}\n\nexport function formatMoney(\n value: number,\n currencyCode?: string,\n locale: string = 'en-US',\n fractionDigits?: number,\n): string {\n const amount = Number.isFinite(value) ? value : 0;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {}\n }\n return fractionDigits !== undefined ? `$${amount.toFixed(fractionDigits)}` : `$${amount.toLocaleString()}`;\n}\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductsListContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n min-height: 320px;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (min-width: 768px) {\n padding: 20px;\n min-height: 400px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const WidgetHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const WidgetTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const SortDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const ProductsList = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n overflow: hidden;\n list-style: none;\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n }\n`;\n\nexport const ProductItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n transition:\n background-color 0.2s ease,\n box-shadow 0.2s ease;\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n list-style: none;\n\n &:not(:last-child) {\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n }\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.06);\n }\n\n @media (min-width: 768px) {\n padding: 14px;\n gap: 14px;\n }\n`;\n\nexport const ProductRank = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'A10')};\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n border-radius: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n vertical-align: middle;\n\n @media (min-width: 768px) {\n min-width: 28px;\n height: 28px;\n font-size: 16px;\n }\n`;\n\nexport const ProductImage = styled('img')`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n object-fit: cover;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n }\n`;\n\nexport const ProductImagePlaceholder = styled('div')`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N40')};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n font-weight: 500;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n font-size: 11px;\n }\n`;\n\nexport const ProductInfo = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`;\n\nexport const ProductName = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n\n @media (min-width: 768px) {\n font-size: 16px;\n max-width: none;\n }\n`;\n\nexport const ProductSubtitle = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`;\n\nexport const ProductMetrics = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`;\n\nexport const ProductValue = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.2;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`;\n\nexport const ProductTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#22C55E';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 12px;\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n`;\n\nexport const EmptyState = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({ theme }) => getGenomeColor(theme, 'N50')};\n }\n`;\n\nexport const EmptyStateText = styled('div')`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React, { useState } from 'react';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport VisibilityIcon from '@mui/icons-material/Visibility';\nimport { StyledIconButton } from './WidgetMenu.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface WidgetMenuProps {\n readonly widgetId?: string;\n readonly onFullView?: () => void;\n}\n\nexport const WidgetMenu: React.FC<WidgetMenuProps> = ({ widgetId, onFullView }) => {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n const buttonId = `widget-menu-button-${widgetId}`;\n const menuId = `widget-menu-${widgetId}`;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleFullView = () => {\n handleClose();\n if (onFullView) {\n onFullView();\n }\n };\n\n return (\n <>\n <StyledIconButton\n id={buttonId}\n data-testid={`widget-menu-button-${widgetId}`}\n aria-label={getTranslation(Keys.widget.menu.ariaLabel)}\n aria-controls={open ? menuId : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={handleClick}\n size=\"small\"\n >\n <MoreVertIcon fontSize=\"small\" />\n </StyledIconButton>\n <Menu\n id={menuId}\n data-testid={`widget-menu-${widgetId}`}\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n 'aria-labelledby': buttonId,\n }}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem onClick={handleFullView} data-testid=\"widget-menu-item-fullview\">\n <ListItemIcon>\n <VisibilityIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.fullView)}</ListItemText>\n </MenuItem>\n </Menu>\n </>\n );\n};\n","import IconButton from '@mui/material/IconButton';\nimport { styled } from '@nuskin/foundation-theme';\n\nexport const StyledIconButton = styled(IconButton)(() => ({\n padding: '4px',\n color: '#252525',\n '&:hover': {\n backgroundColor: 'rgba(37, 37, 37, 0.08)',\n },\n}));\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport {\n ConversionRateContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n FormulaDisplay,\n ChartContainer,\n TooltipContainer,\n TooltipLabel,\n TooltipValue,\n TooltipDetails,\n TitleRow,\n HeaderActionsContainer,\n} from './ConversionRateChart.styled';\nimport type { ConversionDataPoint, ConversionFilterOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateChartProps {\n readonly conversionData: ConversionDataPoint[];\n readonly conversionFilter: ConversionFilterOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\nconst LINE_DOT = { r: 3, fill: '#3B82F6' };\nconst ACTIVE_DOT = { r: 5 };\n\ninterface CustomTooltipProps {\n readonly active?: boolean;\n readonly payload?: Array<{ payload?: unknown }>;\n}\n\nconst rateTickFormatter = (value: number | string): string => `${value}%`;\n\nconst CustomTooltip: React.FC<CustomTooltipProps> = ({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const data = payload[0].payload as ConversionDataPoint;\n return (\n <TooltipContainer>\n <TooltipLabel>{data.date}</TooltipLabel>\n <TooltipValue>{(data.rate ?? 0).toFixed(2)}%</TooltipValue>\n <TooltipDetails>\n {data.orders ?? 0} {getTranslation(Keys.widget.conversionRate.tooltipOrders)} /{' '}\n {(data.siteVisits ?? 0).toLocaleString()} {getTranslation(Keys.widget.conversionRate.tooltipVisits)}\n </TooltipDetails>\n </TooltipContainer>\n );\n};\n\nconst ConversionRateChartComponent: React.FC<ConversionRateChartProps> = ({\n conversionData,\n conversionFilter,\n isLoading = false,\n title,\n summaryRate,\n summaryChangePct,\n onFilterChange,\n onTitleClick,\n}) => {\n const handleFilterChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newFilter = event.target.value as ConversionFilterOption;\n onFilterChange?.(newFilter);\n },\n [onFilterChange],\n );\n\n const noDataText = getTranslation(Keys.widget.conversionRate.noData);\n const noChangeText = getTranslation(Keys.widget.conversionRate.noChange);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null || Math.abs(summaryChangePct) < 0.1) {\n return { direction: 'neutral', value: noChangeText };\n }\n const direction = summaryChangePct > 0 ? 'up' : 'down';\n const formatted = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(2)}%`;\n return { direction, value: formatted };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: noChangeText };\n const change = latestRate - previousRate;\n const percentageChange = (change / previousRate) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change.toFixed(2)}%`;\n return { direction, value: formattedChange };\n }, [summaryChangePct, conversionData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => conversionData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [conversionData],\n );\n\n if (isLoading && conversionData.length === 0) {\n return (\n <ConversionRateContainer data-testid=\"widget-conversion-rate\">\n <ChartWidgetSkeleton />\n </ConversionRateContainer>\n );\n }\n\n const chartAriaLabel = getTranslation(Keys.widget.conversionRate.chartAriaLabel);\n\n return (\n <ConversionRateContainer as=\"section\" data-testid=\"widget-conversion-rate\" aria-label={chartAriaLabel}>\n <ChartHeader>\n <TitleRow>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.conversionRate.titleAriaLabel)}\n data-testid=\"widget-title-conversion-rate\"\n >\n {title ?? getTranslation(Keys.widget.conversionRate.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterDropdown\n id=\"conversion-filter\"\n data-testid=\"conversion-filter-dropdown\"\n value={conversionFilter}\n onChange={handleFilterChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.conversionRate.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.filter.conversionType.all)}</option>\n <option value=\"standard\">{getTranslation(Keys.filter.conversionType.standard)}</option>\n <option value=\"subscription\">\n {getTranslation(Keys.filter.conversionType.subscription)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"conversion-rate\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </TitleRow>\n </ChartHeader>\n\n <MetricDisplay>\n <MetricValue\n aria-label={`${getTranslation(Keys.widget.conversionRate.title)}: ${currentRate.toFixed(2)}%`}\n data-testid=\"conversion-metric-value\"\n >\n {currentRate.toFixed(2)}%\n </MetricValue>\n {trendInfo.value !== noDataText && (\n <MetricTrend\n as=\"output\"\n direction={trendInfo.direction}\n aria-live=\"polite\"\n aria-label={`${getTrendDirectionLabel(trendInfo.direction)} ${trendInfo.value}`}\n data-testid=\"conversion-metric-trend\"\n >\n <div className=\"trend-line\">\n <span aria-hidden=\"true\">{getTrendIcon(trendInfo.direction)}</span>\n <span className=\"change-value\">{trendInfo.value.replace('%', '')}</span>\n <span className=\"change-percent\">%</span>\n </div>\n <div className=\"comparison-text\">{getTranslation(Keys.widget.conversionRate.comparison)}</div>\n </MetricTrend>\n )}\n </MetricDisplay>\n\n <FormulaDisplay data-testid=\"conversion-formula\">\n {getTranslation(Keys.widget.conversionRate.formula)}\n </FormulaDisplay>\n\n <ChartContainer data-testid=\"conversion-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={200}>\n <LineChart data={formattedData} margin={CHART_MARGIN}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"shortDate\" tick={AXIS_TICK} tickLine={false} interval=\"preserveStartEnd\" />\n <YAxis\n tick={AXIS_TICK}\n tickLine={false}\n tickFormatter={rateTickFormatter}\n domain={['dataMin - 0.5', 'dataMax + 0.5']}\n />\n <Tooltip content={CustomTooltip} />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke=\"#3B82F6\"\n strokeWidth={2}\n dot={LINE_DOT}\n activeDot={ACTIVE_DOT}\n />\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n </ConversionRateContainer>\n );\n};\n\nexport const ConversionRateChart = React.memo(ConversionRateChartComponent);\nConversionRateChart.displayName = 'ConversionRateChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionRateContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n padding-bottom: 0;\n border-bottom: none;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const TitleRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 36px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n margin: 0;\n padding: 0;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 3px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n\n .change-value {\n font-weight: 600;\n }\n\n .change-percent {\n font-weight: 400;\n }\n }\n\n .comparison-text {\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.1px;\n margin: 0;\n padding: 0;\n }\n`;\n\nexport const FormulaDisplay = styled('div')`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 16px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 0;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`;\n\nexport const TooltipContainer = styled('div')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`;\n\nexport const TooltipLabel = styled('div')`\n font-size: 11px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N10')};\n margin-bottom: 4px;\n`;\n\nexport const TooltipValue = styled('div')`\n font-size: 13px;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'A10')};\n`;\n\nexport const TooltipDetails = styled('div')`\n font-size: 10px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n margin-top: 2px;\n`;\n","import type { DateRangeOption } from '../types.d';\n\nexport const DAYS_MAP: Record<DateRangeOption, number> = {\n last7days: 7,\n last30days: 30,\n last90days: 90,\n thisMonth: 31,\n};\n\nexport const DATE_RANGE_LABELS: Record<DateRangeOption, string> = {\n last7days: 'Last 7 Days',\n last30days: 'Last 30 Days',\n last90days: 'Last 90 Days',\n thisMonth: 'This Month',\n};\n\nexport function getDaysFromDateRange(dateRange: DateRangeOption): number {\n return DAYS_MAP[dateRange] ?? 30;\n}\n\nexport function getDateRangeLabel(dateRange: DateRangeOption): string {\n return DATE_RANGE_LABELS[dateRange] ?? 'Last 30 Days';\n}\n","import type { DateRangeOption } from '../types.d';\nimport { getDateRangeLabel } from './dateConstants';\n\nexport function formatDateRangeLabel(dateRange: DateRangeOption): string {\n return getDateRangeLabel(dateRange);\n}\n\nexport function formatShortDate(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${months[date.getMonth()]} ${date.getDate()}`;\n}\n\nconst AXIS_MONTH_MAP: Record<string, string> = {\n Jan: '1',\n Feb: '2',\n Mar: '3',\n Apr: '4',\n May: '5',\n Jun: '6',\n Jul: '7',\n Aug: '8',\n Sep: '9',\n Oct: '10',\n Nov: '11',\n Dec: '12',\n};\n\nexport function formatAxisDate(dateStr: string): string {\n const parts = dateStr.split(' ');\n if (parts.length !== 2) return dateStr;\n return `${AXIS_MONTH_MAP[parts[0]] || parts[0]}/${parts[1]}`;\n}\n\nexport function formatDisplayDate(dateStr: string): string {\n const date = new Date(dateStr);\n return formatShortDate(date);\n}\n\nexport function formatDateRange(start: string, end: string): string {\n return `${formatDisplayDate(start)} - ${formatDisplayDate(end)}`;\n}\n\nexport function formatISODate(date: Date): string {\n return date.toISOString().split('T')[0];\n}\n\n/**\n * Extract and format the date range from an array of data objects.\n * Handles various date field names: 'date', 'Date', 'dateTime', etc.\n * Falls back to calculating from dateRange option if no date data is available.\n * @param data Array of objects with date information\n * @param fallbackLabel Fallback label if no dates found\n * @returns Formatted date range string (e.g., \"May 30 - Aug 27\")\n */\nexport function getActualDateRange(data: unknown[], fallbackLabel: string = 'N/A'): string {\n if (!Array.isArray(data) || data.length === 0) return fallbackLabel;\n\n try {\n // Extract first and last dates from data\n const first = data[0] as Record<string, unknown>;\n const last = data[data.length - 1] as Record<string, unknown>;\n\n // Try various date field names\n const dateFieldNames = ['date', 'Date', 'dateTime', 'eventDate', 'timestamp'];\n let startDateStr: string | undefined;\n let endDateStr: string | undefined;\n\n for (const fieldName of dateFieldNames) {\n if (first[fieldName] && !startDateStr) {\n startDateStr = String(first[fieldName]);\n }\n if (last[fieldName] && !endDateStr) {\n endDateStr = String(last[fieldName]);\n }\n }\n\n if (startDateStr && endDateStr) {\n return formatDateRange(startDateStr, endDateStr);\n }\n } catch {\n // Silently fail and return fallback\n }\n\n return fallbackLabel;\n}\n\n/**\n * Calculate and format the date range based on a DateRangeOption.\n * Used for components without time-series data (e.g., TopProducts, TopCategories)\n * @param dateRangeOption The selected date range option\n * @returns Formatted date range string (e.g., \"Aug 28 - Sep 27\" for last30days)\n */\nexport function calculateDateRangeFromOption(dateRangeOption: DateRangeOption): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = today.getMonth();\n const date = today.getDate();\n\n let startDate: Date;\n let endDate = new Date(year, month, date);\n\n switch (dateRangeOption) {\n case 'last7days':\n startDate = new Date(year, month, date - 7);\n break;\n case 'last30days':\n startDate = new Date(year, month, date - 30);\n break;\n case 'last90days':\n startDate = new Date(year, month, date - 90);\n break;\n case 'thisMonth':\n startDate = new Date(year, month, 1);\n endDate = new Date(year, month + 1, 0); // Last day of current month\n break;\n default:\n return 'N/A';\n }\n\n return formatDateRange(formatISODate(startDate), formatISODate(endDate));\n}\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n SignupsContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n ChartContainer,\n Legend,\n LegendItem,\n LegendColor,\n LegendLabel,\n HeaderActionsContainer,\n} from './SignupsChart.styled';\nimport type { SignupDataPoint, SignupViewOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface SignupsChartProps {\n readonly signupData: SignupDataPoint[];\n readonly signupView: SignupViewOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onViewChange?: (view: SignupViewOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst SERIES_COLORS = {\n total: '#3B82F6',\n members: '#7B92A8',\n retail: '#A3B5C7',\n brandAffiliates: '#CBD6E0',\n};\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\nconst LINE_DOT = { r: 2 };\n\nconst SignupsChartComponent: React.FC<SignupsChartProps> = ({\n signupData,\n signupView,\n isLoading = false,\n title,\n onViewChange,\n onTitleClick,\n}) => {\n const handleViewChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newView = event.target.value as SignupViewOption;\n onViewChange?.(newView);\n },\n [onViewChange],\n );\n\n const noDataText = getTranslation(Keys.widget.signups.noData);\n const noChangeText = getTranslation(Keys.widget.signups.noChange);\n\n const totalSignups = React.useMemo(() => {\n if (signupData.length === 0) return 0;\n return signupData[signupData.length - 1].total;\n }, [signupData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (signupData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestTotal = signupData[signupData.length - 1].total;\n const previousTotal = signupData[0].total;\n const change = latestTotal - previousTotal;\n const percentageChange = (change / previousTotal) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change} (${percentageChange.toFixed(1)}%)`;\n return { direction, value: formattedChange };\n }, [noChangeText, noDataText, signupData]);\n\n const formattedData = React.useMemo(\n () => signupData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [signupData],\n );\n const totalLabel = getTranslation(Keys.widget.signups.total);\n const membersLabel = getTranslation(Keys.widget.signups.members);\n const retailLabel = getTranslation(Keys.widget.signups.retail);\n const brandAffiliatesLabel = getTranslation(Keys.widget.signups.brandAffiliates);\n\n if (isLoading && signupData.length === 0) {\n return (\n <SignupsContainer data-testid=\"widget-signups\">\n <ChartWidgetSkeleton />\n </SignupsContainer>\n );\n }\n\n return (\n <SignupsContainer\n as=\"section\"\n data-testid=\"widget-signups\"\n aria-label={getTranslation(Keys.widget.signups.chartAriaLabel)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.signups.titleAriaLabel)}\n data-testid=\"widget-title-signups\"\n >\n {title ?? getTranslation(Keys.widget.signups.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterDropdown\n id=\"signup-view\"\n data-testid=\"signup-view-dropdown\"\n value={signupView}\n onChange={handleViewChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.signups.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.filter.signupView.showAll)}</option>\n <option value=\"members\">{getTranslation(Keys.filter.signupView.showMembers)}</option>\n <option value=\"retail\">{getTranslation(Keys.filter.signupView.showRetail)}</option>\n <option value=\"brandAffiliates\">\n {getTranslation(Keys.filter.signupView.showBrandAffiliates)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"signups\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <MetricDisplay data-testid=\"signups-metric-display\">\n <MetricValue\n data-testid=\"signups-metric-value\"\n aria-label={`${totalLabel}: ${totalSignups.toLocaleString()}`}\n >\n {totalSignups.toLocaleString()}\n </MetricValue>\n {trendInfo.value !== noDataText && (\n <MetricTrend\n as=\"output\"\n data-testid=\"signups-metric-trend\"\n direction={trendInfo.direction}\n aria-live=\"polite\"\n aria-label={`${getTrendDirectionLabel(trendInfo.direction)} ${trendInfo.value}`}\n >\n <div className=\"trend-line\">\n <span aria-hidden=\"true\">{getTrendIcon(trendInfo.direction)}</span>\n <span className=\"change-value\">{trendInfo.value.split(' ')[0]}</span>\n <span className=\"change-percent\">{trendInfo.value.split(' ')[1]}</span>\n </div>\n <div className=\"comparison-text\">{getTranslation(Keys.widget.conversionRate.comparison)}</div>\n </MetricTrend>\n )}\n </MetricDisplay>\n\n <ChartContainer data-testid=\"signups-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={200}>\n <LineChart data={formattedData} margin={CHART_MARGIN}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"shortDate\" tick={AXIS_TICK} tickLine={false} interval=\"preserveStartEnd\" />\n <YAxis tick={AXIS_TICK} tickLine={false} />\n <Tooltip />\n {(signupView === 'all' || signupView === 'members') && (\n <Line\n type=\"monotone\"\n dataKey={signupView === 'all' ? 'total' : 'members'}\n stroke={signupView === 'all' ? SERIES_COLORS.total : SERIES_COLORS.members}\n strokeWidth={2}\n dot={LINE_DOT}\n name={signupView === 'all' ? totalLabel : membersLabel}\n />\n )}\n {signupView === 'all' && (\n <>\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n dot={LINE_DOT}\n name={membersLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n </>\n )}\n {signupView === 'retail' && (\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n )}\n {signupView === 'brandAffiliates' && (\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n\n {signupView === 'all' && (\n <Legend data-testid=\"signups-legend\">\n <LegendItem data-testid=\"legend-total\">\n <LegendColor color={SERIES_COLORS.total} />\n <LegendLabel>{totalLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-members\">\n <LegendColor color={SERIES_COLORS.members} />\n <LegendLabel>{membersLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-retail\">\n <LegendColor color={SERIES_COLORS.retail} />\n <LegendLabel>{retailLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-brandAffiliates\">\n <LegendColor color={SERIES_COLORS.brandAffiliates} />\n <LegendLabel>{brandAffiliatesLabel}</LegendLabel>\n </LegendItem>\n </Legend>\n )}\n </SignupsContainer>\n );\n};\n\nexport const SignupsChart = React.memo(SignupsChartComponent);\nSignupsChart.displayName = 'SignupsChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SignupsContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n`;\n\nexport const Legend = styled('div')`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendLabel = styled('span')`\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendValueWrapper,\n LegendTrendInline,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from './TopCategoriesPieChart.styled';\nimport type { CategoryRevenue, CategorySortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\n\nexport interface TopCategoriesPieChartProps {\n readonly categories: CategoryRevenue[];\n readonly categorySort: CategorySortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: CategorySortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopCategoriesPieChartComponent: React.FC<TopCategoriesPieChartProps> = ({\n categories,\n categorySort,\n isLoading = false,\n title,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as CategorySortOption;\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedCategories, totalRevenue, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedCategories = [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) - (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n });\n\n const nextTotalRevenue = nextSortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedCategories,\n (category) => category.revenue,\n (category) => category.trend?.revenue,\n );\n\n return {\n sortedCategories: nextSortedCategories,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [categories, categorySort]);\n\n const getTrendGraphIcon = (direction: 'up' | 'down' | 'neutral') => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n return null;\n };\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label in the middle of the donut ring\n const radius = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize=\"10\"\n fontWeight=\"600\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0.2\"\n style={{ lineHeight: '12px', leadingTrim: 'none' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading && categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topCategories.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"categories-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topCategories.empty)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-categories\"\n aria-label={getTranslation(Keys.widget.topCategories.chartAriaLabel)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.topCategories.titleAriaLabel)}\n data-testid=\"widget-title-top-categories\"\n >\n {title ?? getTranslation(Keys.widget.topCategories.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"category-sort\"\n data-testid=\"category-sort-dropdown\"\n value={categorySort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n <option value=\"revenue\">{getTranslation(Keys.filter.categorySort.byRevenue)}</option>\n <option value=\"trend\">{getTranslation(Keys.filter.categorySort.byTrend)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-categories\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <ChartAndLegendContainer>\n <ChartWrapper data-testid=\"categories-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"55%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>\n {getTrendGraphIcon(trendDirection)}\n <span>{formattedTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"categories-legend-container\">\n {sortedCategories.map((category, index) => (\n <LegendItem key={category.id} data-testid={`category-legend-${index}`}>\n <LegendColor color={category.color} />\n <LegendInfo>\n <LegendName>{category.name}</LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {formatMoney(category.revenue, category.currencyCode)} ({category.percentage}%)\n </LegendValue>\n {category.trend?.revenue ? (\n <LegendTrendInline\n direction={resolveTrendDirection(category.trend?.revenue)}\n data-testid={`category-legend-trend-${index}`}\n aria-label={category.trend.revenue}\n >\n {getTrendGraphIcon(resolveTrendDirection(category.trend?.revenue))}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\n </LegendItem>\n ))}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopCategoriesPieChart = React.memo(TopCategoriesPieChartComponent);\nTopCategoriesPieChart.displayName = 'TopCategoriesPieChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const CategoriesContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const SortDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const ChartAndLegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n justify-content: center;\n flex: 1;\n\n @media (min-width: 768px) {\n flex-direction: row;\n gap: 24px;\n align-items: center;\n justify-content: center;\n }\n`;\n\nexport const ChartWrapper = styled('div')`\n position: relative;\n width: 100%;\n height: 220px;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 260px;\n height: 260px;\n flex: 0 0 auto;\n }\n\n @media (min-width: 1080px) {\n width: 280px;\n height: 280px;\n flex: 0 0 auto;\n }\n\n /* Style recharts pie labels (percentages inside segments) */\n svg text {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n\n text[class*='recharts'] {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n`;\n\nexport const DonutCenterOverlay = styled('div')`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 96px;\n`;\n\nexport const DonutCenterLabel = styled('div')`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const DonutCenterValue = styled('div')`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n`;\n\nexport const DonutCenterTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n margin-top: 4px;\n font-size: 12px;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 0 1 auto;\n\n @media (min-width: 768px) {\n gap: 10px;\n }\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n @media (min-width: 768px) {\n gap: 10px;\n padding: 6px 0;\n }\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendInfo = styled('div')`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`;\n\nexport const LegendName = styled('div')`\n font-size: 13px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n font-size: 14px;\n }\n`;\n\nexport const LegendValue = styled('div')`\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const LegendPercentage = styled('div')`\n display: none;\n`;\n\nexport const LegendValueWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`;\n\nexport const LegendTrendInline = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendTrend = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const EmptyState = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const EmptyStateText = styled('div')`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport {\n DashboardContainer,\n StatsRow,\n WidgetContainer,\n TwoColumnGrid,\n ErrorContainer,\n} from './ShoppingDashboard.styled';\nimport { DashboardHeader } from './shared/DashboardHeader';\nimport { StatsCard } from './shared/StatsCard';\nimport { TopSellingProductsList } from './shared/TopProducts/TopSellingProductsList';\nimport { ConversionRateChart } from './shared/ConversionRate/ConversionRateChart';\nimport { SignupsChart } from './shared/Signups/SignupsChart';\nimport { TopCategoriesPieChart } from './shared/TopCategories/TopCategoriesPieChart';\nimport type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ProductSortOption,\n SignupViewOption,\n ConversionFilterOption,\n CategorySortOption,\n} from './types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ShoppingDashboardTranslationKeys';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_SIGNUP_DATA: SignupDataPoint[] = [];\nconst EMPTY_CATEGORIES: CategoryRevenue[] = [];\n\nexport interface ShoppingDashboardProps {\n readonly stats?: DashboardStats | null;\n readonly topProducts?: TopProduct[];\n readonly conversionData?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly isLoading?: boolean;\n readonly error?: string | null;\n readonly shopTitle?: string;\n readonly className?: string;\n\n readonly dateRange?: DateRangeOption;\n readonly market?: MarketOption;\n readonly productSort?: ProductSortOption;\n readonly signupView?: SignupViewOption;\n readonly conversionFilter?: ConversionFilterOption;\n readonly categorySort?: CategorySortOption;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n\n readonly onProductsTitleClick?: () => void;\n readonly onConversionTitleClick?: () => void;\n readonly onSignupsTitleClick?: () => void;\n readonly onCategoriesToTitleClick?: () => void;\n}\n\nexport const ShoppingDashboard: React.FC<ShoppingDashboardProps> = ({\n stats,\n topProducts,\n conversionData,\n signupData,\n categories,\n isLoading = false,\n error,\n shopTitle,\n className,\n dateRange = 'last30days',\n market = 'all',\n productSort = 'units',\n signupView = 'all',\n conversionFilter = 'all',\n categorySort = 'revenue',\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onSignupsTitleClick,\n onCategoriesToTitleClick,\n}) => {\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n\n if (error) {\n return (\n <DashboardContainer as=\"main\" className={className} aria-label={getTranslation(Keys.ariaLabel.dashboard)}>\n <ErrorContainer data-testid=\"dashboard-error\" role=\"alert\" aria-live=\"assertive\">\n <strong>{getTranslation(Keys.error)}:</strong> {error}\n </ErrorContainer>\n </DashboardContainer>\n );\n }\n\n const getTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+')) return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n return (\n <DashboardContainer\n as=\"main\"\n className={className}\n data-testid=\"shopping-dashboard\"\n aria-label={getTranslation(Keys.ariaLabel.dashboard)}\n aria-busy={isLoading}\n >\n <DashboardHeader\n shopTitle={shopTitle}\n dateRange={dateRange}\n market={market}\n isLoading={isLoading}\n stats={stats}\n markets={markets}\n onDateRangeChange={onDateRangeChange}\n onMarketChange={onMarketChange}\n />\n\n <StatsRow as=\"section\" data-testid=\"stats-row\" aria-label={getTranslation(Keys.ariaLabel.statsRow)}>\n <StatsCard\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n title={getTranslation(Keys.stats.volume)}\n value={stats?.metrics?.volume ?? '0'}\n subtitle={getTranslation(Keys.stats.subtitle.dcSv)}\n trendDirection={getTrendDirection(stats?.trend?.volume)}\n trendValue={stats?.trend?.volume}\n testId=\"stats-card-volume\"\n isLoading={isLoading}\n />\n <StatsCard\n title={getTranslation(Keys.stats.visits)}\n value={stats?.metrics?.siteVisits ?? '0'}\n subtitle={`${stats?.metrics?.conversionRate ?? '0%'} ${getTranslation(Keys.stats.subtitle.conversionRate)}`}\n trendDirection={getTrendDirection(stats?.trend?.siteVisits)}\n trendValue={stats?.trend?.siteVisits}\n testId=\"stats-card-visits\"\n isLoading={isLoading}\n />\n </StatsRow>\n\n <WidgetContainer data-testid=\"widget-container\">\n <TwoColumnGrid data-testid=\"widget-row-1\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n />\n <SignupsChart\n signupData={resolvedSignupData}\n signupView={signupView}\n isLoading={isLoading}\n onViewChange={onSignupViewChange}\n onTitleClick={onSignupsTitleClick}\n />\n </TwoColumnGrid>\n\n <TwoColumnGrid data-testid=\"widget-row-2\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n isLoading={isLoading}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n />\n <TopCategoriesPieChart\n categories={resolvedCategories}\n categorySort={categorySort}\n isLoading={isLoading}\n onSortChange={onCategorySortChange}\n onTitleClick={onCategoriesToTitleClick}\n />\n </TwoColumnGrid>\n </WidgetContainer>\n </DashboardContainer>\n );\n};\n\nexport default ShoppingDashboard;\n","import React from 'react';\nimport { ShoppingDashboard } from './ShoppingDashboard';\nimport { ProductsFullView } from './shared/TopProducts/ProductsFullView';\nimport { ConversionRateFullView } from './shared/ConversionRate/ConversionRateFullView';\nimport { SignupsFullView } from './shared/Signups/SignupsFullView';\nimport { CategoriesFullView } from './shared/TopCategories/CategoriesFullView';\nimport { useTranslationResolver } from './TranslationContext';\nimport type { TranslateFn } from './TranslationKeys/translationResolver';\nimport type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ProductSortOption,\n SignupViewOption,\n ConversionFilterOption,\n CategorySortOption,\n FullViewWidgetType,\n} from './types.d';\n\ntype ViewMode = 'push' | 'replace';\n\nexport type MysiteDashboardView = 'dashboard' | FullViewWidgetType;\n\nexport interface MysiteDashboardHistoryLocation {\n readonly pathname?: string;\n readonly search?: string;\n readonly hash?: string;\n readonly state?: unknown;\n}\n\nexport interface MysiteDashboardHistoryAdapter {\n readonly location?: MysiteDashboardHistoryLocation;\n push(location: MysiteDashboardHistoryLocation): void;\n replace(location: MysiteDashboardHistoryLocation): void;\n goBack(): void;\n listen(listener: (location: MysiteDashboardHistoryLocation, action: string) => void): () => void;\n}\n\nexport interface MysiteDashboardWithNavigationProps {\n readonly stats?: DashboardStats | null;\n readonly topProducts?: TopProduct[];\n readonly conversionData?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly orders?: OrderHistory[];\n readonly signups?: SignupDetail[];\n readonly isLoading?: boolean;\n readonly error?: string | null;\n readonly shopTitle?: string;\n readonly className?: string;\n\n readonly translate?: TranslateFn;\n\n readonly initialDateRange?: DateRangeOption;\n readonly initialMarket?: MarketOption;\n readonly initialProductSort?: ProductSortOption;\n readonly initialSignupView?: SignupViewOption;\n readonly initialConversionFilter?: ConversionFilterOption;\n readonly initialCategorySort?: CategorySortOption;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n\n readonly historyAdapter?: MysiteDashboardHistoryAdapter;\n readonly historyStateKey?: string;\n readonly resetToDashboardOnMount?: boolean;\n\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n readonly onViewChange?: (view: MysiteDashboardView) => void;\n}\n\nconst DEFAULT_HISTORY_STATE_KEY = 'shoppingDashboardView';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_SIGNUP_DATA: SignupDataPoint[] = [];\nconst EMPTY_CATEGORIES: CategoryRevenue[] = [];\nconst EMPTY_ORDERS: OrderHistory[] = [];\nconst EMPTY_SIGNUPS: SignupDetail[] = [];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMysiteDashboardView(value: unknown): value is MysiteDashboardView {\n return (\n value === 'dashboard' ||\n value === 'products' ||\n value === 'conversion-rate' ||\n value === 'signups' ||\n value === 'categories'\n );\n}\n\nfunction readViewFromState(state: unknown, stateKey: string): MysiteDashboardView {\n if (!isRecord(state)) {\n return 'dashboard';\n }\n\n const view = state[stateKey];\n return isMysiteDashboardView(view) ? view : 'dashboard';\n}\n\nfunction buildStateWithView(state: unknown, stateKey: string, view: MysiteDashboardView): Record<string, unknown> {\n const currentState = isRecord(state) ? state : {};\n\n return {\n ...currentState,\n [stateKey]: view,\n };\n}\n\nfunction buildLocationWithState(\n location: MysiteDashboardHistoryLocation | undefined,\n state: Record<string, unknown>,\n): MysiteDashboardHistoryLocation {\n return {\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n state,\n };\n}\n\nexport const MysiteDashboardWithNavigation: React.FC<MysiteDashboardWithNavigationProps> = ({\n stats,\n topProducts,\n conversionData,\n signupData,\n categories,\n orders,\n signups,\n isLoading = false,\n error,\n shopTitle,\n className,\n translate,\n initialDateRange = 'last30days',\n initialMarket = 'all',\n initialProductSort = 'units',\n initialSignupView = 'all',\n initialConversionFilter = 'all',\n initialCategorySort = 'revenue',\n markets,\n historyAdapter,\n historyStateKey = DEFAULT_HISTORY_STATE_KEY,\n resetToDashboardOnMount = true,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onViewChange,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<MysiteDashboardView>('dashboard');\n const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [signupView, setSignupView] = React.useState<SignupViewOption>(initialSignupView);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [categorySort, setCategorySort] = React.useState<CategorySortOption>(initialCategorySort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedSignups = signups ?? EMPTY_SIGNUPS;\n\n const updateView = React.useCallback(\n (view: MysiteDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): MysiteDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: MysiteDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: FullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleSignupViewChange = React.useCallback(\n (nextSignupView: SignupViewOption) => {\n setSignupView(nextSignupView);\n onSignupViewChange?.(nextSignupView);\n },\n [onSignupViewChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleCategorySortChange = React.useCallback(\n (nextSort: CategorySortOption) => {\n setCategorySort(nextSort);\n onCategorySortChange?.(nextSort);\n },\n [onCategorySortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleSignupsTitleClick = React.useCallback(() => {\n handleOpenFullView('signups');\n }, [handleOpenFullView]);\n\n const handleCategoriesTitleClick = React.useCallback(() => {\n handleOpenFullView('categories');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedTopProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={resolvedConversionData}\n orders={resolvedOrders}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'signups') {\n return (\n <SignupsFullView\n signupData={resolvedSignupData}\n signups={resolvedSignups}\n dateRange={dateRange}\n market={market}\n signupView={signupView}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onSignupViewChange={handleSignupViewChange}\n />\n );\n }\n\n if (currentView === 'categories') {\n return (\n <CategoriesFullView\n categories={resolvedCategories}\n dateRange={dateRange}\n market={market}\n categorySort={categorySort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onCategorySortChange={handleCategorySortChange}\n />\n );\n }\n\n return (\n <ShoppingDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n signupData={resolvedSignupData}\n categories={resolvedCategories}\n isLoading={isLoading}\n error={error}\n shopTitle={shopTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n signupView={signupView}\n conversionFilter={conversionFilter}\n categorySort={categorySort}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onSignupViewChange={handleSignupViewChange}\n onConversionFilterChange={handleConversionFilterChange}\n onCategorySortChange={handleCategorySortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onSignupsTitleClick={handleSignupsTitleClick}\n onCategoriesToTitleClick={handleCategoriesTitleClick}\n />\n );\n};\n\nexport default MysiteDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type { TopProduct, DateRangeOption, MarketOption, MarketFilterOption, ProductSortOption } from '../../types.d';\nimport { FullViewTableSkeleton } from '../LoadingSkeletons';\nimport { PageContainer, EmptyStateText } from '../FullViewComponents.styled';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n ProductInfo,\n ProductName,\n ProductSku,\n MetricValue,\n MobileCardsContainer,\n DesktopTableContainer,\n MobileProductCard,\n MobileCardHeader,\n MobileProductRank,\n MobileProductDetails,\n MobileProductName,\n MobileProductSku,\n MobileMetricsGrid,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n} from './ProductsFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\ninterface ProductRow {\n rank: number;\n name: string;\n sku: string;\n units: number;\n revenue: number;\n volume: number;\n}\n\nexport interface ProductsFullViewProps {\n readonly products: TopProduct[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly productSort: ProductSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n}\n\nfunction mapProductToRow(product: TopProduct): ProductRow {\n return {\n rank: product.rank,\n name: product.name,\n sku: `${getTranslation(Keys.fullView.products.skuPrefix)}-${product.id.replace('prod-', '').padStart(3, '0')}`,\n units: product.unitsSold,\n revenue: product.revenue,\n volume: product.volume,\n };\n}\n\nexport const ProductsFullView: React.FC<ProductsFullViewProps> = ({\n products,\n dateRange,\n market,\n productSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [sortColumn, setSortColumn] = useState<string>(productSort === 'revenue' ? 'revenue' : 'units');\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.productSort.label),\n value: productSort,\n options: [\n { value: 'units', label: getTranslation(Keys.filter.productSort.units) },\n { value: 'revenue', label: getTranslation(Keys.filter.productSort.revenue) },\n { value: 'volume', label: getTranslation(Keys.filter.productSort.volume) },\n ],\n },\n ],\n [dateRange, market, marketOptions, productSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onProductSortChange?.(value as ProductSortOption);\n setCurrentPage(1);\n }\n },\n [onDateRangeChange, onMarketChange, onProductSortChange],\n );\n\n const handleSort = React.useCallback((columnKey: string, direction: 'asc' | 'desc') => {\n setSortColumn(columnKey);\n setSortDirection(direction);\n setCurrentPage(1);\n }, []);\n\n const productRows = React.useMemo(() => products.map(mapProductToRow), [products]);\n\n const sortedRows = React.useMemo(\n () =>\n [...productRows].sort((a, b) => {\n const aVal = a[sortColumn as keyof ProductRow] as number;\n const bVal = b[sortColumn as keyof ProductRow] as number;\n return sortDirection === 'asc' ? aVal - bVal : bVal - aVal;\n }),\n [productRows, sortColumn, sortDirection],\n );\n\n const { totalPages, pageItems: paginatedRows } = usePaginatedItems(sortedRows, currentPage, itemsPerPage);\n\n const currencyCode = products[0]?.currencyCode;\n\n const columns: ColumnDef<ProductRow>[] = React.useMemo(\n () => [\n { key: 'rank', label: getTranslation(Keys.fullView.products.columns.rank), sortable: true },\n {\n key: 'name',\n label: getTranslation(Keys.fullView.products.columns.product),\n sortable: true,\n render: (_: unknown, row: ProductRow) => (\n <ProductInfo>\n <ProductName>{row.name}</ProductName>\n <ProductSku>{row.sku}</ProductSku>\n </ProductInfo>\n ),\n },\n {\n key: 'units',\n label: getTranslation(Keys.fullView.products.columns.unitsSold),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.products.columns.revenue),\n sortable: true,\n render: (value: unknown) => <MetricValue>{formatMoney(Number(value), currencyCode)}</MetricValue>,\n },\n {\n key: 'volume',\n label: getTranslation(Keys.fullView.products.columns.volume),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n ],\n [currencyCode],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewTableSkeleton />\n </PageContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"products-fullview-empty\">\n {getTranslation(Keys.fullView.products.noProducts)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"products-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedRows}\n sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n getRowKey={(row: ProductRow) => row.rank}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCardsContainer data-testid=\"products-fullview-mobile-cards\">\n {paginatedRows.map((row) => (\n <MobileProductCard key={row.rank}>\n <MobileCardHeader>\n <MobileProductRank>#{row.rank}</MobileProductRank>\n <MobileProductDetails>\n <MobileProductName>{row.name}</MobileProductName>\n <MobileProductSku>{row.sku}</MobileProductSku>\n </MobileProductDetails>\n </MobileCardHeader>\n <MobileMetricsGrid>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.widget.topProducts.units)}\n </MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.widget.topProducts.revenue)}\n </MobileMetricLabel>\n <MobileMetricValue>{formatMoney(row.revenue, currencyCode)}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.filter.productSort.volume)}\n </MobileMetricLabel>\n <MobileMetricValue>{row.volume.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n </MobileMetricsGrid>\n </MobileProductCard>\n ))}\n </MobileCardsContainer>\n )}\n\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedRows.length}\n />\n )}\n </PageContainer>\n );\n};\n","import React from 'react';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LanguageIcon from '@mui/icons-material/Language';\nimport {\n PageHeaderWrapper,\n BackButtonWrapper,\n BackButton,\n HeaderContainer,\n LeftSection,\n Title,\n DateRange,\n MobileDateRange,\n FiltersSection,\n FilterWrapper,\n FilterIcon,\n FilterDropdown,\n MobileTitleWrapper,\n MobileTitle,\n} from './PageHeader.styled';\nimport type { FilterConfig } from './types';\nimport type { DateRangeOption, MarketOption, MarketFilterOption } from '../types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport type { FilterConfig } from './types';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport interface DateRangeMarketKeys {\n readonly filter: {\n readonly dateRange: {\n readonly label: TranslationEntry;\n readonly last7days: TranslationEntry;\n readonly last30days: TranslationEntry;\n readonly last90days: TranslationEntry;\n readonly thisMonth: TranslationEntry;\n };\n readonly market: {\n readonly label: TranslationEntry;\n };\n };\n}\n\nexport function buildDateRangeFilter(dateRange: DateRangeOption, keys: DateRangeMarketKeys): FilterConfig {\n return {\n key: 'dateRange',\n label: getTranslation(keys.filter.dateRange.label),\n value: dateRange,\n icon: 'calendar',\n options: [\n { value: 'last7days', label: getTranslation(keys.filter.dateRange.last7days) },\n { value: 'last30days', label: getTranslation(keys.filter.dateRange.last30days) },\n { value: 'last90days', label: getTranslation(keys.filter.dateRange.last90days) },\n { value: 'thisMonth', label: getTranslation(keys.filter.dateRange.thisMonth) },\n ],\n };\n}\n\nexport function buildMarketFilter(\n market: MarketOption,\n marketOptions: ReadonlyArray<MarketFilterOption>,\n keys: DateRangeMarketKeys,\n): FilterConfig {\n return {\n key: 'market',\n label: getTranslation(keys.filter.market.label),\n value: market,\n icon: 'globe',\n options: marketOptions.map((option) => ({ value: option.value, label: option.label })),\n };\n}\n\nexport interface PageHeaderProps {\n readonly title: string;\n readonly dateRange: string;\n readonly onBack: () => void;\n readonly filters?: FilterConfig[];\n readonly onFilterChange?: (filterKey: string, value: string) => void;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ title, dateRange, onBack, filters, onFilterChange }) => {\n const renderFilterIcon = (iconType?: 'calendar' | 'globe') => {\n if (!iconType) return null;\n return (\n <FilterIcon>\n {iconType === 'calendar' && <CalendarTodayIcon />}\n {iconType === 'globe' && <LanguageIcon />}\n </FilterIcon>\n );\n };\n\n return (\n <PageHeaderWrapper data-testid=\"page-header\">\n <BackButtonWrapper>\n <BackButton\n onClick={onBack}\n aria-label={getTranslation(Keys.navigation.backAriaLabel)}\n data-testid=\"page-back-button\"\n type=\"button\"\n >\n <ArrowBackIcon />\n <span>{getTranslation(Keys.navigation.backToDashboard)}</span>\n </BackButton>\n </BackButtonWrapper>\n\n <MobileTitleWrapper>\n <MobileTitle>{title}</MobileTitle>\n </MobileTitleWrapper>\n\n <HeaderContainer>\n <LeftSection>\n <Title data-testid=\"page-header-title\">{title}</Title>\n <DateRange data-testid=\"page-header-date-range\">{dateRange}</DateRange>\n </LeftSection>\n\n {filters && filters.length > 0 && onFilterChange && (\n <FiltersSection data-testid=\"page-header-filters\">\n {filters.map((filter) => (\n <FilterWrapper key={filter.key}>\n {renderFilterIcon(filter.icon)}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onFilterChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {filter.label && filter.key === 'customerType'\n ? `${filter.label} ${option.label}`\n : option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterWrapper>\n ))}\n </FiltersSection>\n )}\n\n <MobileDateRange>{dateRange}</MobileDateRange>\n </HeaderContainer>\n </PageHeaderWrapper>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageHeaderWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const BackButtonWrapper = styled('div')`\n display: flex;\n align-items: center;\n`;\n\nexport const BackButton = styled('button')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`;\n\nexport const LeftSection = styled('div')`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const Title = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const DateRange = styled('p')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n`;\n\nexport const MobileDateRange = styled('p')`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`;\n\nexport const FilterWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const FilterIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n font-size: 16px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`;\n\nexport const MobileTitleWrapper = styled('div')`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const MobileTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n`;\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableHeaderCell,\n TableBody,\n TableRow,\n TableCell,\n EmptyTableCell,\n SortIconContainer,\n} from './DataTable.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ColumnDef<TData = unknown> {\n key: string;\n label: string;\n sortable?: boolean;\n render?: (value: unknown, row: TData) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<TData = unknown> {\n readonly columns: ColumnDef<TData>[];\n readonly data: TData[];\n readonly sortable?: boolean;\n readonly onSort?: (columnKey: string, direction: 'asc' | 'desc') => void;\n readonly sortColumn?: string;\n readonly sortDirection?: 'asc' | 'desc';\n readonly getRowKey?: (row: TData, rowIndex: number) => React.Key;\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n sortable = false,\n onSort,\n sortColumn,\n sortDirection = 'asc',\n getRowKey,\n}: DataTableProps<TData>) => {\n const handleSort = (columnKey: string) => {\n if (!sortable || !onSort) return;\n const newDirection = sortColumn === columnKey && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(columnKey, newDirection);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, columnKey: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSort(columnKey);\n }\n };\n\n const getAriaSort = (columnKey: string): 'ascending' | 'descending' | undefined => {\n if (sortColumn !== columnKey) return undefined;\n return sortDirection === 'asc' ? 'ascending' : 'descending';\n };\n\n return (\n <TableContainer data-testid=\"data-table\">\n <Table>\n <TableHeader>\n <tr>\n {columns.map((column) => (\n <TableHeaderCell\n key={column.key}\n scope=\"col\"\n sortable={sortable && column.sortable}\n onClick={() => column.sortable && handleSort(column.key)}\n onKeyDown={(e) => column.sortable && handleKeyDown(e, column.key)}\n tabIndex={sortable && column.sortable ? 0 : -1}\n aria-sort={getAriaSort(column.key)}\n aria-label={`${column.label}${column.sortable ? getTranslation(Keys.dataTable.sortableColumn) : ''}`}\n data-testid={`table-header-${column.key}`}\n >\n {column.label}\n {sortable && column.sortable && (\n <SortIconContainer isActive={sortColumn === column.key}>\n {sortColumn === column.key && sortDirection === 'desc' ? (\n <ArrowDownwardIcon />\n ) : (\n <ArrowUpwardIcon />\n )}\n </SortIconContainer>\n )}\n </TableHeaderCell>\n ))}\n </tr>\n </TableHeader>\n <TableBody>\n {data.length === 0 ? (\n <TableRow data-testid=\"table-empty-row\">\n <EmptyTableCell colSpan={columns.length}>\n {getTranslation(Keys.dataTable.noDataAvailable)}\n </EmptyTableCell>\n </TableRow>\n ) : (\n data.map((row, rowIndex) => (\n <TableRow\n key={getRowKey ? getRowKey(row, rowIndex) : rowIndex}\n data-testid={`table-row-${rowIndex}`}\n >\n {columns.map((column) => (\n <TableCell key={column.key} data-testid={`table-cell-${column.key}`}>\n {column.render\n ? column.render((row as Record<string, unknown>)[column.key], row)\n : ((row as Record<string, unknown>)[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TableContainer = styled('div')`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n`;\n\nexport const Table = styled('table')`\n width: 100%;\n border-collapse: collapse;\n`;\n\nexport const TableHeader = styled('thead')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-bottom: 2px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n`;\n\nexport const TableHeaderCell = styled('th')<{ sortable?: boolean }>`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n cursor: ${({ sortable }) => (sortable ? 'pointer' : 'default')};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: -2px;\n }\n`;\n\nexport const TableBody = styled('tbody')``;\n\nexport const TableRow = styled('tr')`\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nexport const TableCell = styled('td')`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n`;\n\nexport const EmptyTableCell = styled(TableCell)`\n text-align: center;\n`;\n\nexport const SortIconContainer = styled('span')<{ isActive?: boolean }>`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({ isActive }) => (isActive ? 1 : 0.4)};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;\n","import React from 'react';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport { PaginationContainer, PageButton, PageInfo, NavButton } from './Pagination.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface PaginationProps {\n readonly currentPage: number;\n readonly totalPages: number;\n readonly onPageChange: (page: number) => void;\n readonly itemsPerPage?: number;\n readonly totalItems?: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n}) => {\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, action: () => void) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n action();\n }\n };\n\n const getPageNumbers = (): number[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: number[] = [];\n if (currentPage <= 4) {\n pages.push(1, 2, 3, 4, 5);\n } else if (currentPage >= totalPages - 3) {\n pages.push(totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(currentPage - 1, currentPage, currentPage + 1);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const startItem = itemsPerPage ? (currentPage - 1) * itemsPerPage + 1 : null;\n const endItem = itemsPerPage ? Math.min(currentPage * itemsPerPage, totalItems ?? Infinity) : null;\n const goToPageLabel = getTranslation(Keys.pagination.goToPage);\n\n return (\n <PaginationContainer data-testid=\"pagination\">\n <NavButton\n onClick={handlePrevious}\n onKeyDown={(e) => handleKeyDown(e, handlePrevious)}\n disabled={currentPage === 1}\n aria-label={getTranslation(Keys.pagination.previousPage)}\n data-testid=\"pagination-previous\"\n type=\"button\"\n >\n <ChevronLeftIcon />\n </NavButton>\n\n {totalPages > 7 && currentPage > 4 && (\n <>\n <PageButton\n onClick={() => onPageChange(1)}\n isActive={false}\n aria-label={`${goToPageLabel} 1`}\n data-testid=\"pagination-page-1\"\n type=\"button\"\n >\n 1\n </PageButton>\n <PageInfo>...</PageInfo>\n </>\n )}\n\n {pageNumbers.map((page) => (\n <PageButton\n key={page}\n onClick={() => onPageChange(page)}\n isActive={currentPage === page}\n aria-label={`${goToPageLabel} ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n data-testid={`pagination-page-${page}`}\n type=\"button\"\n >\n {page}\n </PageButton>\n ))}\n\n {totalPages > 7 && currentPage < totalPages - 3 && (\n <>\n <PageInfo>...</PageInfo>\n <PageButton\n onClick={() => onPageChange(totalPages)}\n isActive={false}\n aria-label={`${goToPageLabel} ${totalPages}`}\n data-testid={`pagination-page-${totalPages}`}\n type=\"button\"\n >\n {totalPages}\n </PageButton>\n </>\n )}\n\n <NavButton\n onClick={handleNext}\n onKeyDown={(e) => handleKeyDown(e, handleNext)}\n disabled={currentPage === totalPages}\n aria-label={getTranslation(Keys.pagination.nextPage)}\n data-testid=\"pagination-next\"\n type=\"button\"\n >\n <ChevronRightIcon />\n </NavButton>\n\n {itemsPerPage && totalItems && (\n <PageInfo as=\"output\" aria-live=\"polite\" data-testid=\"pagination-page-info\">\n {startItem}-{endItem} {getTranslation(Keys.pagination.of)} {totalItems}\n </PageInfo>\n )}\n </PaginationContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PaginationContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`;\n\nexport const PageButton = styled('button')<{ isActive?: boolean }>`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A80') : getGenomeColor(theme, 'N20')};\n color: ${({ theme, isActive }) => (isActive ? '#ffffff' : getGenomeColor(theme, 'N100'))};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A70') : getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\nexport const PageInfo = styled('span')`\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n margin: 0 8px;\n`;\n\nexport const NavButton = styled('button')`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`;\n\nexport const MetricChartCardSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const MetricSection = styled(Box)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({ theme }) => theme.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`;\n\nexport const MetricTrend = styled(Box)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`;\n\nexport const ComparisonText = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`;\n\nexport const ChartSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`;\n\nexport const ChartTitle = styled('h2')`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`;\n\nexport const ChartContainer = styled(Box)`\n width: 100%;\n height: 450px;\n margin-bottom: 20px;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 16px;\n }\n`;\n\nexport const TableSection = styled(Box)<{ withCard?: boolean }>`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({ withCard = true, theme }) =>\n withCard &&\n `\n padding: 20px;\n background-color: ${getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`;\n\nexport const LoadingContainer = styled(Box)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`;\n\nexport const EmptyStateText = styled(Typography)`\n text-align: center;\n color: ${({ theme }) => theme.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`;\n\nexport const MobileCardName = styled(Typography)`\n font-weight: 600;\n font-size: 14px;\n`;\n\nexport const MobileCardSubtext = styled(Typography)`\n font-size: 13px;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileCardDetail = styled(Typography)`\n font-size: 13px;\n`;\n\nexport const MobileCardStatus = styled(Typography)<{ status: string }>`\n font-size: 13px;\n color: ${({ theme, status }) => (status === 'Active' ? theme.palette.success.main : theme.palette.warning.main)};\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const ProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const ProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const MobileCardsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileProductCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileCardHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`;\n\nexport const MobileProductRank = styled(Typography)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.primary.main};\n min-width: 24px;\n`;\n\nexport const MobileProductDetails = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const MobileProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n`;\n\nexport const MobileProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import useMediaQuery from '@mui/material/useMediaQuery';\n\nexport const MOBILE_VIEWPORT_QUERY = '(max-width:767px)';\n\nexport function useIsMobileViewport(): boolean {\n return useMediaQuery(MOBILE_VIEWPORT_QUERY, { noSsr: true });\n}\n","import React, { useState } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n ConversionDataPoint,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ConversionFilterOption,\n} from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n ChartContainer,\n TableSection,\n} from '../FullViewComponents.styled';\nimport {\n MobileOrderCard,\n MobileOrderHeader,\n MobileCustomerInfo,\n MobileCustomerName,\n MobileOrderDate,\n MobileOrderId,\n MobileOrderMetrics,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n MobileOrdersContainer,\n DesktopTableContainer,\n OrderIdColumnCell,\n} from './ConversionRateFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateFullViewProps {\n readonly conversionData: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n}\n\nexport const ConversionRateFullView: React.FC<ConversionRateFullViewProps> = ({\n conversionData,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onConversionFilterChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trend = React.useMemo((): { direction: TrendDirection; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null)\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n let direction: TrendDirection = 'neutral';\n if (summaryChangePct > 0) direction = 'up';\n else if (summaryChangePct < 0) direction = 'down';\n return { direction, value: `${summaryChangePct >= 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%` };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const changePercent = ((latestRate - previousRate) / previousRate) * 100;\n if (Math.abs(changePercent) < 0.1) {\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n }\n let direction: TrendDirection = 'neutral';\n if (changePercent > 0) direction = 'up';\n else if (changePercent < 0) direction = 'down';\n return { direction, value: `${changePercent >= 0 ? '+' : ''}${changePercent.toFixed(1)}%` };\n }, [summaryChangePct, conversionData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'standard') return getTranslation(Keys.filter.conversionType.standard);\n if (filter === 'subscription') return getTranslation(Keys.filter.conversionType.subscription);\n return getTranslation(Keys.filter.conversionType.all);\n }, []);\n\n const conversionFilterLabel = React.useMemo(\n () => getConversionFilterLabel(conversionFilter),\n [conversionFilter, getConversionFilterLabel],\n );\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'customerType',\n label: getTranslation(Keys.filter.signupView.label),\n value: conversionFilter,\n options: [\n { value: 'all', label: getTranslation(Keys.filter.conversionType.all) },\n { value: 'standard', label: getTranslation(Keys.filter.conversionType.standard) },\n { value: 'subscription', label: getTranslation(Keys.filter.conversionType.subscription) },\n ],\n },\n ],\n [conversionFilter, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'customerType') {\n onConversionFilterChange?.(value as ConversionFilterOption);\n setCurrentPage(1);\n }\n },\n [onConversionFilterChange, onDateRangeChange, onMarketChange],\n );\n\n const filteredOrders = React.useMemo(() => {\n if (conversionFilter === 'all') return orders;\n return orders.filter((order) => order.customerType.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(filteredOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(\n () => [\n {\n key: 'orderId',\n label: getTranslation(Keys.fullView.conversionRate.columns.orderId),\n sortable: true,\n render: (value) => <OrderIdColumnCell>{value as React.ReactNode}</OrderIdColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.fullView.conversionRate.columns.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n { key: 'customerType', label: getTranslation(Keys.fullView.conversionRate.columns.type), sortable: true },\n { key: 'items', label: getTranslation(Keys.fullView.conversionRate.columns.items), sortable: true },\n {\n key: 'total',\n label: getTranslation(Keys.fullView.conversionRate.columns.total),\n sortable: true,\n render: (value: unknown, row: OrderHistory) =>\n formatMoney(Number(value), row.currencyCode, undefined, 2),\n },\n { key: 'bv', label: getTranslation(Keys.fullView.conversionRate.columns.bv), sortable: true },\n ],\n [],\n );\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'standard') return '#2e7d32';\n if (conversionFilter === 'subscription') return '#ed6c02';\n return '#1976d2';\n }, [conversionFilter]);\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.conversionRate.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.conversionRate.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <MetricChartCardSection data-testid=\"conversion-fullview-metric-chart\">\n <MetricSection>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0px', flexWrap: 'wrap' }}>\n <MetricValue data-testid=\"conversion-rate-value\" style={{ marginRight: '6px' }}>\n {currentRate.toFixed(1)}%\n </MetricValue>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <span\n style={{\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 600,\n fontSize: '14px',\n lineHeight: '20px',\n letterSpacing: '0em',\n }}\n >\n {trend.value}\n </span>\n <span\n style={{\n marginLeft: '2px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 400,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.01em',\n color: '#5F5F5F',\n }}\n >\n compared to this time last month\n </span>\n </MetricTrend>\n </div>\n </MetricSection>\n\n <ChartSection>\n <ChartContainer data-testid=\"conversion-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={conversionData} margin={{ top: 10, right: 120, left: 0, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis tickFormatter={(value) => `${value}%`} domain={[0, 'auto']} />\n <Tooltip\n formatter={(value: unknown) => {\n if (typeof value === 'number') return `${value.toFixed(2)}%`;\n if (typeof value === 'string') return value;\n return getTranslation(Keys.fullView.conversionRate.notAvailable);\n }}\n />\n <Legend\n layout=\"vertical\"\n align=\"right\"\n verticalAlign=\"bottom\"\n wrapperStyle={{\n paddingRight: '40px',\n paddingBottom: '40px',\n paddingLeft: '20px',\n paddingTop: '20px',\n fontSize: '14px',\n fontWeight: 500,\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.widget.conversionRate.title)} (${conversionFilterLabel})`}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"conversion-fullview-table-section\">\n <ChartTitle data-testid=\"conversion-fullview-table-title\">\n {getTranslation(Keys.fullView.conversionRate.orderDetailsTitle)} ({filteredOrders.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"conversion-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedOrders}\n getRowKey={(row: OrderHistory) => row.orderId}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOrdersContainer data-testid=\"conversion-fullview-mobile-orders\">\n {paginatedOrders.map((order) => (\n <MobileOrderCard key={order.orderId}>\n <MobileOrderHeader>\n <MobileCustomerInfo>\n <MobileCustomerName>{order.customerName}</MobileCustomerName>\n <MobileOrderDate>{order.date}</MobileOrderDate>\n </MobileCustomerInfo>\n <MobileOrderId>{order.orderId}</MobileOrderId>\n </MobileOrderHeader>\n <MobileOrderMetrics>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.items)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.items}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.orderTotal)}\n </MobileMetricLabel>\n <MobileMetricValue>${order.total.toFixed(2)}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.totalSv)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.bv}</MobileMetricValue>\n </MobileMetricItem>\n </MobileOrderMetrics>\n </MobileOrderCard>\n ))}\n </MobileOrdersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={filteredOrders.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const MobileOrderCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const MobileOrderHeader = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const MobileCustomerInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const MobileCustomerName = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n`;\n\nexport const MobileOrderDate = styled(Typography)`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileOrderId = styled('a')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const MobileOrderMetrics = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const MobileOrdersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const ComparisonTextMobile = styled(Typography)`\n margin-top: 4px;\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n @media (max-width: 767px) {\n font-size: 0.75rem;\n }\n`;\n\nexport const OrderIdColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { Box } from '@mui/material';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport type {\n SignupDataPoint,\n SignupDetail,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n SignupViewOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n TableSection,\n EmptyStateText,\n MobileCardName,\n MobileCardSubtext,\n MobileCardDetail,\n MobileCardStatus,\n} from '../FullViewComponents.styled';\nimport {\n MobileSignupsContainer,\n DesktopTableContainer,\n MobileSignupCard,\n SignupTrendChartContainer,\n ComparisonTextMobile,\n ChartWithLegendWrapper,\n ChartLegendContainer,\n LegendItem,\n NameColumnCell,\n} from './SignupsFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nconst SERIES_COLORS = { total: '#3B82F6', members: '#7B92A8', retail: '#A3B5C7', brandAffiliates: '#5F7388' };\n\nfunction toNumeric(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/,/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\n/**\n * Transform API response format to SignupDataPoint array\n * Handles both direct array format and nested API response with 'daily' array\n */\nfunction normalizeSignupDataInput(input: unknown): SignupDataPoint[] {\n // If it's already an array, return it\n if (Array.isArray(input)) {\n return input;\n }\n\n // Handle API response format with 'daily' array\n const apiResponse = input as Record<string, unknown>;\n if (Array.isArray(apiResponse.daily)) {\n return (apiResponse.daily as Array<Record<string, unknown>>).map((item) => ({\n date: String(item.date ?? ''),\n total: toNumeric(item.total),\n members: toNumeric(item.members),\n retail: toNumeric(item.retail),\n brandAffiliates: toNumeric(\n item.brandAffiliates ?? item.brandAffiliate ?? item.brand_affiliates ?? item.brand_affiliate,\n ),\n }));\n }\n\n // Fallback to empty array\n return [];\n}\n\nexport interface SignupsFullViewProps {\n /**\n * Signup data - can be either:\n * 1. Direct array of SignupDataPoint (camelCase format)\n * 2. API response object with 'daily' array (snake_case format)\n */\n readonly signupData: SignupDataPoint[] | { daily?: Array<Record<string, unknown>>; [key: string]: unknown };\n readonly signups: SignupDetail[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly signupView: SignupViewOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n}\n\nexport const SignupsFullView: React.FC<SignupsFullViewProps> = ({\n signupData,\n signups,\n dateRange,\n market,\n signupView,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onSignupViewChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const normalizedSignupData = React.useMemo(() => {\n // First, transform API response format to array if needed\n const dataArray = normalizeSignupDataInput(signupData);\n\n // Then, normalize field names and values\n return dataArray.map((point) => {\n const rawPoint = point as unknown as Record<string, unknown>;\n const members = toNumeric(rawPoint.members);\n const retail = toNumeric(rawPoint.retail);\n const brandAffiliates = toNumeric(\n rawPoint.brandAffiliates ??\n rawPoint.brandAffiliate ??\n rawPoint.brand_affiliates ??\n rawPoint.brand_affiliate,\n );\n const total = toNumeric(rawPoint.total ?? rawPoint.all ?? rawPoint.signupTotal ?? rawPoint.value);\n\n return {\n ...point,\n total: total > 0 ? total : members + retail + brandAffiliates,\n members,\n retail,\n brandAffiliates,\n };\n });\n }, [signupData]);\n\n const totalSignups = React.useMemo(() => {\n if (normalizedSignupData.length === 0) return 0;\n return normalizedSignupData[normalizedSignupData.length - 1].total;\n }, [normalizedSignupData]);\n\n const trend = React.useMemo((): {\n direction: 'up' | 'down' | 'neutral';\n absoluteChange: number;\n percentageChange: string;\n } => {\n if (normalizedSignupData.length < 2)\n return {\n direction: 'neutral',\n absoluteChange: 0,\n percentageChange: getTranslation(Keys.defaults.zeroTrend),\n };\n const first = normalizedSignupData[0].total;\n const last = normalizedSignupData[normalizedSignupData.length - 1].total;\n if (first <= 0)\n return {\n direction: 'neutral',\n absoluteChange: 0,\n percentageChange: getTranslation(Keys.defaults.zeroTrend),\n };\n const absoluteChange = last - first;\n const percentageChange = (absoluteChange / first) * 100;\n let direction: 'up' | 'down' | 'neutral' = 'neutral';\n if (percentageChange > 0) direction = 'up';\n else if (percentageChange < 0) direction = 'down';\n return {\n direction,\n absoluteChange: Math.round(absoluteChange),\n percentageChange: `${percentageChange >= 0 ? '+' : ''}${percentageChange.toFixed(1)}%`,\n };\n }, [normalizedSignupData, Keys]);\n\n const hasSignupTrendData = normalizedSignupData.length > 0;\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'signupView',\n label: getTranslation(Keys.filter.signupView.label),\n value: signupView,\n options: [\n { value: 'all', label: getTranslation(Keys.filter.signupView.all) },\n { value: 'members', label: getTranslation(Keys.filter.signupView.members) },\n { value: 'retail', label: getTranslation(Keys.filter.signupView.retail) },\n { value: 'brandAffiliates', label: getTranslation(Keys.filter.signupView.brandAffiliates) },\n ],\n },\n ],\n [dateRange, market, marketOptions, signupView],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'signupView') {\n onSignupViewChange?.(value as SignupViewOption);\n setCurrentPage(1);\n }\n },\n [onDateRangeChange, onMarketChange, onSignupViewChange],\n );\n\n const { totalPages, pageItems: paginatedSignups } = usePaginatedItems(signups, currentPage, itemsPerPage);\n\n const columns: ColumnDef<SignupDetail>[] = React.useMemo(\n () => [\n { key: 'id', label: getTranslation(Keys.fullView.signups.columns.id), sortable: true },\n {\n key: 'name',\n label: getTranslation(Keys.fullView.signups.columns.name),\n sortable: true,\n render: (value) => <NameColumnCell>{value as React.ReactNode}</NameColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.fullView.signups.columns.date), sortable: true },\n { key: 'type', label: getTranslation(Keys.fullView.signups.columns.type), sortable: true },\n { key: 'email', label: getTranslation(Keys.fullView.signups.columns.email), sortable: true },\n { key: 'status', label: getTranslation(Keys.fullView.signups.columns.status), sortable: true },\n ],\n [],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"signups-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.signups.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"signups-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.signups.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <MetricChartCardSection data-testid=\"signups-fullview-metric-chart\">\n <MetricSection>\n <MetricValue data-testid=\"signups-total\">{totalSignups.toLocaleString()}</MetricValue>\n <MetricTrend direction={trend.direction}>\n {trend.direction === 'up' && <TrendingUpIcon />}\n {trend.direction === 'down' && <TrendingDownIcon />}\n {trend.direction !== 'neutral' && (\n <>\n <span style={{ fontWeight: 600, lineHeight: 1 }}>\n {trend.absoluteChange > 0 ? '+' : ''}\n {trend.absoluteChange}\n </span>\n <span style={{ fontWeight: 400, lineHeight: 1 }}>{trend.percentageChange}</span>\n </>\n )}\n {trend.direction === 'neutral' && <span>{trend.percentageChange}</span>}\n </MetricTrend>\n <ComparisonTextMobile>{getTranslation(Keys.widget.conversionRate.comparison)}</ComparisonTextMobile>\n </MetricSection>\n\n <ChartSection>\n {hasSignupTrendData ? (\n <ChartWithLegendWrapper>\n <SignupTrendChartContainer data-testid=\"signups-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={240}>\n <LineChart data={normalizedSignupData}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis />\n <Tooltip />\n {signupView === 'all' && (\n <>\n <Line\n type=\"monotone\"\n dataKey=\"total\"\n stroke={SERIES_COLORS.total}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.total)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.members)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.retail)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n </>\n )}\n {signupView === 'members' && (\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.members)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n {signupView === 'retail' && (\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.retail)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n {signupView === 'brandAffiliates' && (\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </SignupTrendChartContainer>\n <Box>\n {signupView === 'all' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.total }}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.widget.signups.members)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.widget.signups.retail)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.widget.signups.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.widget.signups.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.widget.signups.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.widget.signups.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n </Box>\n </ChartWithLegendWrapper>\n ) : (\n <EmptyStateText data-testid=\"signups-fullview-chart-empty\">\n {getTranslation(Keys.widget.signups.noTrendData)}\n </EmptyStateText>\n )}\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"signups-fullview-table-section\">\n <ChartTitle data-testid=\"signups-fullview-table-title\">{`${getTranslation(Keys.fullView.signups.detailsTitle)} (${signups.length})`}</ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"signups-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedSignups}\n getRowKey={(row: SignupDetail) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileSignupsContainer data-testid=\"signups-fullview-mobile-cards\">\n {paginatedSignups.map((signup) => (\n <MobileSignupCard key={signup.id}>\n <MobileCardName>{signup.name}</MobileCardName>\n <MobileCardSubtext>\n {signup.date} - {signup.type}\n </MobileCardSubtext>\n <MobileCardDetail>{signup.email}</MobileCardDetail>\n <MobileCardStatus status={signup.status}>{signup.status}</MobileCardStatus>\n </MobileSignupCard>\n ))}\n </MobileSignupsContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={signups.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport { ChartContainer } from '../FullViewComponents.styled';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const MobileSignupsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileSignupCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const SignupTrendChartContainer = styled(ChartContainer)`\n min-height: 320px;\n\n @media (max-width: 767px) {\n min-height: 260px;\n height: 260px;\n }\n`;\n\nexport const ComparisonTextMobile = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n`;\n\nexport const ChartWithLegendWrapper = styled(Box)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`;\n\nexport const ChartLegendContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n }\n`;\n\nexport const LegendItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const NameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n CategorySortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n SummaryItemRow,\n SummaryItemInfo,\n SummaryItemName,\n SummaryItemSubtext,\n SummaryItemPercentage,\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrendIcon,\n DesktopTableContainer,\n MobileCategoriesContainer,\n MobileCategoryCard,\n CategoryNameColumnCell,\n} from './CategoriesFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\n\nexport interface CategoriesFullViewProps {\n readonly categories: CategoryRevenue[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly categorySort: CategorySortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n}\n\nexport const CategoriesFullView: React.FC<CategoriesFullViewProps> = ({\n categories,\n dateRange,\n market,\n categorySort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onCategorySortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.productSort.label),\n value: categorySort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.filter.categorySort.byRevenue) },\n { value: 'trend', label: getTranslation(Keys.filter.categorySort.byTrend) },\n ],\n },\n ],\n [categorySort, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onCategorySortChange?.(value as CategorySortOption);\n setCurrentPage(1);\n }\n },\n [onCategorySortChange, onDateRangeChange, onMarketChange],\n );\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label more towards center of the donut ring, slightly inward\n const radius = innerRadius + (outerRadius - innerRadius) * 0.45;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"12\"\n fontWeight=\"700\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0\"\n style={{ lineHeight: '14px', pointerEvents: 'none' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const getTrendIcon = (direction: 'up' | 'down' | 'neutral') => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '16px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '16px' }} aria-hidden=\"true\" />;\n }\n return null;\n };\n\n const resolveTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n const parsed = Number.parseFloat(trendValue);\n if (Number.isNaN(parsed)) return 'neutral';\n if (parsed > 0) return 'up';\n if (parsed < 0) return 'down';\n return 'neutral';\n };\n\n const sortedCategories = React.useMemo(\n () =>\n [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) -\n (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n }),\n [categories, categorySort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedCategories,\n (category) => category.revenue,\n (category) => category.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedCategories]);\n\n const topCategories = React.useMemo(() => sortedCategories.slice(0, 5), [sortedCategories]);\n\n const { totalPages, pageItems: paginatedCategories } = usePaginatedItems(\n sortedCategories,\n currentPage,\n itemsPerPage,\n );\n\n const columns: ColumnDef<CategoryRevenue>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.categories.columns.category),\n sortable: true,\n render: (_: unknown, row: CategoryRevenue) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <CategoryNameColumnCell>{row.name}</CategoryNameColumnCell>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.categories.columns.revenue),\n sortable: true,\n render: (value: unknown, row: CategoryRevenue) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.categories.columns.percentOfTotal),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.categories.columns.trend),\n render: (_: unknown, row: CategoryRevenue) =>\n row.trend?.revenue ?? getTranslation(Keys.defaults.noValue),\n },\n ],\n [],\n );\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"categories-fullview-empty\">\n {getTranslation(Keys.fullView.categories.noCategoryData)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"categories-fullview-top-section\">\n <ChartWrapper data-testid=\"categories-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>\n {getTrendIcon(totalRevenueTrendDirection)}\n <span>{totalRevenueTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"categories-fullview-summary\">\n {topCategories.map((category) => (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{category.name}</SummaryName>\n <SummaryValue>{formatMoney(category.revenue, category.currencyCode)}</SummaryValue>\n <SummaryPercentage>({category.percentage}%)</SummaryPercentage>\n {category.trend?.revenue ? (\n <SummaryTrendIcon direction={resolveTrendDirection(category.trend.revenue)}>\n {getTrendIcon(resolveTrendDirection(category.trend.revenue))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n ))}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"categories-fullview-table-section\">\n <ChartTitle data-testid=\"categories-fullview-table-title\">\n {getTranslation(Keys.fullView.categories.allCategoriesTitle)} ({sortedCategories.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedCategories}\n sortable\n getRowKey={(row: CategoryRevenue) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCategoriesContainer>\n {paginatedCategories.map((category) => (\n <MobileCategoryCard key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryItemInfo>\n <SummaryItemName>{category.name}</SummaryItemName>\n <SummaryItemSubtext>\n {formatMoney(category.revenue, category.currencyCode)}\n </SummaryItemSubtext>\n </SummaryItemInfo>\n <SummaryItemPercentage>{category.percentage}%</SummaryItemPercentage>\n </MobileCategoryCard>\n ))}\n </MobileCategoriesContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedCategories.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled, ColorUtils } from '@nuskin/foundation-theme';\nimport { styled as muiStyled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SummaryItemRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const SummaryItemInfo = styled('div')`\n flex: 1;\n`;\n\nexport const SummaryItemName = styled('span')`\n font-weight: 600;\n`;\n\nexport const SummaryItemSubtext = styled('span')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryItemPercentage = styled('span')`\n font-weight: 600;\n`;\n\nexport const TopSection = muiStyled(Box)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`;\n\nexport const ChartWrapper = muiStyled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = muiStyled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = muiStyled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = muiStyled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = muiStyled(Typography)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const SummaryContainer = muiStyled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`;\n\nexport const SummaryItem = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = muiStyled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = muiStyled(Box)`\n display: none;\n`;\n\nexport const SummaryName = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nexport const SummaryValue = muiStyled(Typography)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`;\n\nexport const SummaryPercentage = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DesktopTableContainer = muiStyled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileCategoriesContainer = muiStyled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileCategoryCard = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const SummaryTrendIcon = muiStyled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const CategoryNameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React from 'react';\nimport {\n resolveTranslation,\n setTranslationResolver,\n type TranslateFn,\n type TranslationEntry,\n} from './TranslationKeys/translationResolver';\n\nexport function useTranslationResolver(translate?: TranslateFn): void {\n setTranslationResolver(translate);\n\n React.useEffect(() => {\n setTranslationResolver(translate);\n return () => {\n setTranslationResolver(undefined);\n };\n }, [translate]);\n}\n\nexport interface TranslationProviderProps {\n readonly translate?: TranslateFn;\n readonly children?: React.ReactNode;\n}\n\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({ translate, children }) => {\n useTranslationResolver(translate);\n return children ?? null;\n};\n\nexport function useTranslation(): (entry: TranslationEntry) => string {\n return React.useCallback((entry: TranslationEntry) => resolveTranslation(entry), []);\n}\n\nexport type { TranslateFn, TranslationEntry };\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PoDashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TopChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const StatsCardStack = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`;\n\nexport const BottomChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendPercentage,\n LegendTrend,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from '../TopCategories/TopCategoriesPieChart.styled';\nimport type { TopPerformingOffer, OfferSortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { getTrendIcon, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\n\nexport interface TopPerformingOffersPieChartProps {\n readonly offers: TopPerformingOffer[];\n readonly offerSort: OfferSortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as OfferSortOption;\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedOffers, totalRevenue, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [offers, offerSort]);\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading && offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topPerformingOffers.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"top-offers-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topPerformingOffers.emptyState)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-offers\"\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n data-testid=\"widget-title-top-offers\"\n >\n {title ?? getTranslation(Keys.widget.topPerformingOffers.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"offer-sort\"\n data-testid=\"offer-sort-dropdown\"\n value={offerSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <option value=\"revenue\">{getTranslation(Keys.filter.offerSort.byRevenue)}</option>\n <option value=\"units\">{getTranslation(Keys.filter.offerSort.byUnits)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-offers\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <ChartAndLegendContainer>\n <ChartWrapper data-testid=\"top-offers-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"55%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>{formattedTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"top-offers-legend-container\">\n {sortedOffers.map((offer, index) => {\n const legendTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{offer.name}</LegendName>\n <LegendValue>{formatMoney(offer.revenue, offer.currencyCode)}</LegendValue>\n </LegendInfo>\n <LegendPercentage>{offer.percentage}%</LegendPercentage>\n {offer.trend?.revenue ? (\n <LegendTrend\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={offer.trend.revenue}\n >\n {getTrendIcon(legendTrendDirection)}\n </LegendTrend>\n ) : null}\n </LegendItem>\n );\n })}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopPerformingOffersPieChart = React.memo(TopPerformingOffersPieChartComponent);\nTopPerformingOffersPieChart.displayName = 'TopPerformingOffersPieChart';\n","import { resolveTranslation } from './translationResolver';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport const ProductOfferDashboardTranslationKeys = {\n title: { key: 'productOfferDashboard.title', fallback: 'Performance Overview' },\n error: { key: 'productOfferDashboard.error', fallback: 'Failed to load dashboard data. Please try again.' },\n\n stats: {\n revenue: { key: 'productOfferDashboard.stats.revenue', fallback: 'Total Revenue' },\n offersPurchased: { key: 'productOfferDashboard.stats.offersPurchased', fallback: 'Offers Purchased' },\n conversionRate: { key: 'productOfferDashboard.stats.conversionRate', fallback: 'Conversion Rate' },\n trendUp: { key: 'productOfferDashboard.stats.trendUp', fallback: 'Trending up' },\n trendDown: { key: 'productOfferDashboard.stats.trendDown', fallback: 'Trending down' },\n trendNeutral: { key: 'productOfferDashboard.stats.trendNeutral', fallback: 'No change' },\n comparedTo: { key: 'productOfferDashboard.stats.comparedTo', fallback: 'compared to this time last month' },\n },\n\n filter: {\n dateRange: {\n label: { key: 'productOfferDashboard.filter.dateRange.label', fallback: 'Date Range' },\n last7days: { key: 'productOfferDashboard.filter.dateRange.last7days', fallback: 'Last 7 Days' },\n last30days: { key: 'productOfferDashboard.filter.dateRange.last30days', fallback: 'Last 30 Days' },\n last90days: { key: 'productOfferDashboard.filter.dateRange.last90days', fallback: 'Last 90 Days' },\n thisMonth: { key: 'productOfferDashboard.filter.dateRange.thisMonth', fallback: 'This Month' },\n },\n market: {\n label: { key: 'productOfferDashboard.filter.market.label', fallback: 'Market' },\n all: { key: 'productOfferDashboard.filter.market.all', fallback: 'All Markets' },\n },\n offerSort: {\n byRevenue: { key: 'productOfferDashboard.filter.offerSort.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.filter.offerSort.byUnits', fallback: 'Units' },\n },\n productSort: {\n byUnits: { key: 'productOfferDashboard.filter.productSort.byUnits', fallback: 'Units' },\n byRevenue: { key: 'productOfferDashboard.filter.productSort.byRevenue', fallback: 'Revenue' },\n byVolume: { key: 'productOfferDashboard.filter.productSort.byVolume', fallback: 'Volume' },\n },\n conversionFilter: {\n overall: { key: 'productOfferDashboard.filter.conversionFilter.overall', fallback: 'Overall' },\n },\n },\n\n widget: {\n topProducts: {\n title: { key: 'productOfferDashboard.widget.topProducts.title', fallback: 'Top Selling Products' },\n emptyState: {\n key: 'productOfferDashboard.widget.topProducts.emptyState',\n fallback: 'No products data available',\n },\n },\n conversionRate: {\n title: { key: 'productOfferDashboard.widget.conversionRate.title', fallback: 'Conversion Rate' },\n subtitle: { key: 'productOfferDashboard.widget.conversionRate.subtitle', fallback: 'Orders ÷ Site visits' },\n },\n topPerformingOffers: {\n title: { key: 'productOfferDashboard.widget.topPerformingOffers.title', fallback: 'Top Performing Offers' },\n totalRevenue: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalRevenue',\n fallback: 'Total revenue',\n },\n emptyState: {\n key: 'productOfferDashboard.widget.topPerformingOffers.emptyState',\n fallback: 'No offers data available',\n },\n },\n menu: {\n fullView: { key: 'productOfferDashboard.widget.menu.fullView', fallback: 'Full View' },\n },\n },\n\n navigation: {\n back: { key: 'productOfferDashboard.navigation.back', fallback: 'Back to Dashboard' },\n },\n\n ariaLabel: {\n dashboard: {\n key: 'productOfferDashboard.ariaLabel.dashboard',\n fallback: 'Product Offer Performance Dashboard',\n },\n statsCard: { key: 'productOfferDashboard.ariaLabel.statsCard', fallback: 'Performance metric' },\n conversionChart: { key: 'productOfferDashboard.ariaLabel.conversionChart', fallback: 'Conversion rate chart' },\n topProducts: { key: 'productOfferDashboard.ariaLabel.topProducts', fallback: 'Top selling products' },\n topOffers: { key: 'productOfferDashboard.ariaLabel.topOffers', fallback: 'Top performing offers chart' },\n widgetMenu: { key: 'productOfferDashboard.ariaLabel.widgetMenu', fallback: 'Widget options menu' },\n filterDateRange: { key: 'productOfferDashboard.ariaLabel.filterDateRange', fallback: 'Filter by date range' },\n filterMarket: { key: 'productOfferDashboard.ariaLabel.filterMarket', fallback: 'Filter by market' },\n backButton: { key: 'productOfferDashboard.ariaLabel.backButton', fallback: 'Back to dashboard overview' },\n },\n\n fullView: {\n topOffers: {\n title: { key: 'productOfferDashboard.fullView.topOffers.title', fallback: 'Top Performing Offers' },\n columnName: { key: 'productOfferDashboard.fullView.topOffers.columnName', fallback: 'Offer Name' },\n columnRevenue: { key: 'productOfferDashboard.fullView.topOffers.columnRevenue', fallback: 'Revenue' },\n columnPercentage: { key: 'productOfferDashboard.fullView.topOffers.columnPercentage', fallback: 'Share' },\n columnTrend: { key: 'productOfferDashboard.fullView.topOffers.columnTrend', fallback: 'Trend' },\n },\n },\n\n defaults: {\n trendZero: { key: 'productOfferDashboard.defaults.trendZero', fallback: '+0%' },\n noData: { key: 'productOfferDashboard.defaults.noData', fallback: '--' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport {\n PoDashboardContainer,\n TopChartsRow,\n StatsCardStack,\n BottomChartsRow,\n ErrorContainer,\n} from './ProductOfferDashboard.styled';\nimport { DashboardHeader } from './shared/DashboardHeader';\nimport { StatsCard } from './shared/StatsCard';\nimport { TopSellingProductsList } from './shared/TopProducts/TopSellingProductsList';\nimport { ConversionRateChart } from './shared/ConversionRate/ConversionRateChart';\nimport { TopPerformingOffersPieChart } from './shared/TopPerformingOffers/TopPerformingOffersPieChart';\nimport type { ProductOfferDashboardProps, TopProduct, ConversionDataPoint, TopPerformingOffer } from './types.d';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ProductOfferDashboardTranslationKeys';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_TOP_OFFERS: TopPerformingOffer[] = [];\n\nexport const ProductOfferDashboard: React.FC<ProductOfferDashboardProps> = ({\n stats,\n topProducts,\n conversionData,\n topOffers,\n isLoading = false,\n error,\n dashboardTitle,\n className,\n dateRange = 'last30days',\n market = 'all',\n productSort = 'units',\n conversionFilter = 'all',\n offerSort = 'revenue',\n conversionSummaryRate,\n conversionSummaryChangePct,\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onConversionFilterChange,\n onOfferSortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onOffersTitleClick,\n}) => {\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n\n const getTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+') && trendValue !== '+0%') return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n if (error) {\n return (\n <PoDashboardContainer as=\"main\" className={className} aria-label={getTranslation(Keys.ariaLabel.dashboard)}>\n <ErrorContainer data-testid=\"dashboard-error\" role=\"alert\" aria-live=\"assertive\">\n <strong>{getTranslation(Keys.error)}:</strong> {error}\n </ErrorContainer>\n </PoDashboardContainer>\n );\n }\n\n return (\n <PoDashboardContainer\n as=\"main\"\n className={className}\n data-testid=\"product-offer-dashboard\"\n aria-label={getTranslation(Keys.ariaLabel.dashboard)}\n aria-busy={isLoading}\n >\n <DashboardHeader\n shopTitle={dashboardTitle ?? getTranslation(Keys.title)}\n dateRange={dateRange}\n market={market}\n isLoading={isLoading}\n markets={markets}\n stats={\n stats\n ? {\n shopTitle: stats.shopTitle ?? '',\n dateRange: stats.dateRange,\n selectedMarket: stats.selectedMarket,\n metrics: {\n revenue: stats.metrics.revenue,\n volume: '',\n siteVisits: '',\n conversionRate: stats.metrics.conversionRate,\n },\n trend: {},\n }\n : undefined\n }\n onDateRangeChange={onDateRangeChange}\n onMarketChange={onMarketChange}\n />\n\n <TopChartsRow data-testid=\"top-charts-row\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n isLoading={isLoading}\n summaryRate={conversionSummaryRate}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n />\n <StatsCardStack data-testid=\"stats-card-stack\">\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.offersPurchased)}\n value={stats?.metrics?.offersPurchased ?? '0'}\n trendDirection={getTrendDirection(stats?.trend?.offersPurchased)}\n trendValue={stats?.trend?.offersPurchased}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-offers-purchased\"\n isLoading={isLoading}\n />\n </StatsCardStack>\n </TopChartsRow>\n\n <BottomChartsRow data-testid=\"bottom-charts-row\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\n onSortChange={onOfferSortChange}\n onTitleClick={onOffersTitleClick}\n />\n </BottomChartsRow>\n </PoDashboardContainer>\n );\n};\n\nexport default ProductOfferDashboard;\n","import React from 'react';\nimport { ProductOfferDashboard } from './ProductOfferDashboard';\nimport { ProductsFullView } from './shared/TopProducts/ProductsFullView';\nimport { ConversionRateFullView } from './shared/ConversionRate/ConversionRateFullView';\nimport { TopPerformingOffersFullView } from './shared/TopPerformingOffers/TopPerformingOffersFullView';\nimport { useTranslationResolver } from './TranslationContext';\nimport type {\n TopProduct,\n ConversionDataPoint,\n TopPerformingOffer,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n ProductSortOption,\n ConversionFilterOption,\n OfferSortOption,\n ProductOfferFullViewWidgetType,\n ProductOfferDashboardView,\n PoDashboardWithNavigationProps,\n ProductOfferDashboardHistoryLocation,\n} from './types.d';\n\ntype ViewMode = 'push' | 'replace';\n\nconst DEFAULT_HISTORY_STATE_KEY = 'productOfferDashboardView';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_TOP_OFFERS: TopPerformingOffer[] = [];\nconst EMPTY_ORDERS: OrderHistory[] = [];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isProductOfferDashboardView(value: unknown): value is ProductOfferDashboardView {\n return value === 'dashboard' || value === 'products' || value === 'conversion-rate' || value === 'top-offers';\n}\n\nfunction readViewFromState(state: unknown, stateKey: string): ProductOfferDashboardView {\n if (!isRecord(state)) {\n return 'dashboard';\n }\n\n const view = state[stateKey];\n return isProductOfferDashboardView(view) ? view : 'dashboard';\n}\n\nfunction buildStateWithView(\n state: unknown,\n stateKey: string,\n view: ProductOfferDashboardView,\n): Record<string, unknown> {\n const currentState = isRecord(state) ? state : {};\n\n return {\n ...currentState,\n [stateKey]: view,\n };\n}\n\nfunction buildLocationWithState(\n location: ProductOfferDashboardHistoryLocation | undefined,\n state: Record<string, unknown>,\n): ProductOfferDashboardHistoryLocation {\n return {\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n state,\n };\n}\n\nexport const PoDashboardWithNavigation: React.FC<PoDashboardWithNavigationProps> = ({\n stats,\n topProducts,\n conversionData,\n topOffers,\n isLoading = false,\n error,\n dashboardTitle,\n className,\n allProducts,\n orders,\n allOffers,\n conversionSummaryRate,\n conversionSummaryChangePct,\n conversionFullViewData,\n conversionFullViewRate,\n conversionFullViewChangePct,\n initialDateRange = 'last30days',\n initialMarket = 'all',\n initialProductSort = 'units',\n initialConversionFilter = 'all',\n initialOfferSort = 'revenue',\n markets,\n translate,\n historyAdapter,\n historyStateKey = DEFAULT_HISTORY_STATE_KEY,\n resetToDashboardOnMount = true,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onConversionFilterChange,\n onOfferSortChange,\n onViewChange,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<ProductOfferDashboardView>('dashboard');\n const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [offerSort, setOfferSort] = React.useState<OfferSortOption>(initialOfferSort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n const resolvedAllProducts = allProducts ?? resolvedTopProducts;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedAllOffers = allOffers ?? resolvedTopOffers;\n\n const updateView = React.useCallback(\n (view: ProductOfferDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): ProductOfferDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: ProductOfferDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: ProductOfferFullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleOfferSortChange = React.useCallback(\n (nextSort: OfferSortOption) => {\n setOfferSort(nextSort);\n onOfferSortChange?.(nextSort);\n },\n [onOfferSortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleOffersTitleClick = React.useCallback(() => {\n handleOpenFullView('top-offers');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedAllProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={conversionFullViewData ?? resolvedConversionData}\n orders={resolvedOrders}\n summaryRate={conversionFullViewRate ?? conversionSummaryRate}\n summaryChangePct={conversionFullViewChangePct ?? conversionSummaryChangePct}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'top-offers') {\n return (\n <TopPerformingOffersFullView\n offers={resolvedAllOffers}\n dateRange={dateRange}\n market={market}\n offerSort={offerSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onOfferSortChange={handleOfferSortChange}\n />\n );\n }\n\n return (\n <ProductOfferDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n topOffers={resolvedTopOffers}\n isLoading={isLoading}\n error={error}\n dashboardTitle={dashboardTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n conversionFilter={conversionFilter}\n offerSort={offerSort}\n conversionSummaryRate={conversionSummaryRate}\n conversionSummaryChangePct={conversionSummaryChangePct}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onConversionFilterChange={handleConversionFilterChange}\n onOfferSortChange={handleOfferSortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onOffersTitleClick={handleOffersTitleClick}\n />\n );\n};\n\nexport default PoDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n TopPerformingOffer,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n OfferSortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { SummaryItemRow } from '../TopCategories/CategoriesFullView.styled';\nimport {\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryInfo,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrend,\n TableTrendCell,\n DesktopTableContainer,\n MobileOffersContainer,\n MobileOfferCard,\n MobileOfferHeader,\n MobileOfferName,\n MobileOfferMetricsGrid,\n MobileOfferMetricItem,\n MobileOfferMetricLabel,\n MobileOfferMetricValue,\n MobileOfferTrendValue,\n} from './TopPerformingOffersFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport {\n getTrendIcon,\n parseTrendPercent,\n resolveTrendDirection,\n calculateWeightedRevenueTrend,\n} from '../../utils/trendUtils';\n\nexport interface TopPerformingOffersFullViewProps {\n readonly offers: TopPerformingOffer[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly offerSort: OfferSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onOfferSortChange?: (sort: OfferSortOption) => void;\n}\n\nexport const TopPerformingOffersFullView: React.FC<TopPerformingOffersFullViewProps> = ({\n offers,\n dateRange,\n market,\n offerSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onOfferSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.offerSort.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.filter.offerSort.byRevenue) },\n { value: 'units', label: getTranslation(Keys.filter.offerSort.byUnits) },\n ],\n },\n ],\n [dateRange, market, marketOptions, offerSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onOfferSortChange?.(value as OfferSortOption);\n setCurrentPage(1);\n }\n },\n [onOfferSortChange, onDateRangeChange, onMarketChange],\n );\n\n const sortedOffers = React.useMemo(\n () =>\n [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers]);\n\n const topOffers = React.useMemo(() => sortedOffers.slice(0, 5), [sortedOffers]);\n\n const { totalPages, pageItems: paginatedOffers } = usePaginatedItems(sortedOffers, currentPage, itemsPerPage);\n\n const columns: ColumnDef<TopPerformingOffer>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.topOffers.columnName),\n sortable: true,\n render: (_: unknown, row: TopPerformingOffer) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <span>{row.name}</span>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.topOffers.columnRevenue),\n sortable: true,\n render: (value: unknown, row: TopPerformingOffer) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.topOffers.columnPercentage),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.topOffers.columnTrend),\n render: (_: unknown, row: TopPerformingOffer) => {\n if (!row.trend?.revenue) return getTranslation(Keys.defaults.noData);\n const columnTrendDirection = resolveTrendDirection(row.trend.revenue);\n return (\n <TableTrendCell direction={columnTrendDirection}>\n {getTrendIcon(columnTrendDirection)}\n <span>{row.trend.revenue}</span>\n </TableTrendCell>\n );\n },\n },\n ],\n [],\n );\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"top-offers-fullview-empty\">\n {getTranslation(Keys.widget.topPerformingOffers.emptyState)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"top-offers-fullview-top-section\">\n <ChartWrapper data-testid=\"top-offers-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>{totalRevenueTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"top-offers-fullview-summary\">\n {topOffers.map((offer) => {\n const summaryTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>{formatMoney(offer.revenue, offer.currencyCode)}</SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{offer.percentage}%</SummaryPercentage>\n {offer.trend?.revenue ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={offer.trend.revenue}>\n {getTrendIcon(summaryTrendDirection)}\n </SummaryTrend>\n ) : null}\n </SummaryItem>\n );\n })}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"top-offers-table\">\n <ChartTitle data-testid=\"top-offers-fullview-table-title\">\n {getTranslation(Keys.fullView.topOffers.title)} ({sortedOffers.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedOffers}\n sortable\n getRowKey={(row: TopPerformingOffer) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOffersContainer>\n {paginatedOffers.map((offer) => {\n const trendPercent = parseTrendPercent(offer.trend?.revenue);\n let trendDirection: 'up' | 'down' | 'neutral' = 'neutral';\n if (trendPercent !== null && trendPercent > 0) trendDirection = 'up';\n else if (trendPercent !== null && trendPercent < 0) trendDirection = 'down';\n\n return (\n <MobileOfferCard key={offer.id}>\n <MobileOfferHeader>\n <ColorDot dotColor={offer.color} />\n <MobileOfferName>{offer.name}</MobileOfferName>\n </MobileOfferHeader>\n <MobileOfferMetricsGrid>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnRevenue)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {formatMoney(offer.revenue, offer.currencyCode)}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnPercentage)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>{offer.percentage}%</MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnTrend)}\n </MobileOfferMetricLabel>\n <MobileOfferTrendValue direction={trendDirection}>\n {offer.trend?.revenue ? (\n <>\n {getTrendIcon(trendDirection)}\n <span>{offer.trend.revenue}</span>\n </>\n ) : (\n getTranslation(Keys.defaults.noData)\n )}\n </MobileOfferTrendValue>\n </MobileOfferMetricItem>\n </MobileOfferMetricsGrid>\n </MobileOfferCard>\n );\n })}\n </MobileOffersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedOffers.length}\n data-testid=\"top-offers-pagination\"\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport type { TrendDirection } from '../types';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TopSection = styled(Box)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const ChartWrapper = styled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = styled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = styled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = styled(Typography)<{ direction: TrendDirection }>`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n`;\n\nexport const SummaryContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`;\n\nexport const SummaryItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = styled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const SummaryName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const SummaryValue = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryPercentage = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`;\n\nexport const SummaryTrend = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const TableTrendCell = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileOffersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileOfferCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileOfferHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const MobileOfferName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n word-break: break-word;\n`;\n\nexport const MobileOfferMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileOfferMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileOfferMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileOfferMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const MobileOfferTrendValue = styled(Typography)<{ direction: TrendDirection }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const FilterContainer = styled('div')`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`;\n\nexport const FilterLabel = styled('label')`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport { FilterContainer, FilterDropdown, FilterLabel } from './FilterBar.styled';\nimport type { FilterConfig } from './types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface FilterBarProps {\n readonly filters: FilterConfig[];\n readonly onChange: (filterKey: string, value: string) => void;\n}\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ filters, onChange }) => {\n return (\n <FilterContainer data-testid=\"filter-bar\">\n {filters.map((filter) => (\n <FilterLabel key={filter.key} htmlFor={`filter-${filter.key}`}>\n {filter.label}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterLabel>\n ))}\n </FilterContainer>\n );\n};\n","import type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n} from '../types.d';\n\nexport const mockStats: DashboardStats = {\n shopTitle: 'My NuSkin Shop',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$9,453',\n volume: '1,211',\n siteVisits: '17,935',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+12.5%',\n volume: '+8.3%',\n siteVisits: '-2.1%',\n },\n};\n\nexport const mockTopProducts: TopProduct[] = [\n {\n id: 'prod-001',\n rank: 1,\n name: 'ageLOC LumiSpa',\n imageUrl: '',\n unitsSold: 342,\n revenue: 29580,\n volume: 245,\n trend: { units: '+15%', revenue: '+12%', volume: '+8%' },\n },\n {\n id: 'prod-002',\n rank: 2,\n name: 'Pharmanex LifePak',\n imageUrl: '',\n unitsSold: 287,\n revenue: 24395,\n volume: 198,\n trend: { units: '+8%', revenue: '+10%', volume: '+5%' },\n },\n {\n id: 'prod-003',\n rank: 3,\n name: 'ageLOC Meta',\n imageUrl: '',\n unitsSold: 256,\n revenue: 21760,\n volume: 176,\n trend: { units: '-3%', revenue: '-1%', volume: '-2%' },\n },\n {\n id: 'prod-004',\n rank: 4,\n name: 'Nu Skin 180 System',\n imageUrl: '',\n unitsSold: 198,\n revenue: 17820,\n volume: 142,\n trend: { units: '+22%', revenue: '+18%', volume: '+15%' },\n },\n {\n id: 'prod-005',\n rank: 5,\n name: 'Epoch Baobab Body Butter',\n imageUrl: '',\n unitsSold: 176,\n revenue: 8800,\n volume: 88,\n trend: { units: '+5%', revenue: '+3%', volume: '+2%' },\n },\n];\n\nexport const mockConversionData: ConversionDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n rate: Number((4 + (i % 15) * 0.1).toFixed(2)),\n orders: 200 + ((i * 13) % 100),\n siteVisits: 4000 + ((i * 97) % 2000),\n };\n});\n\nexport const mockConversionDataStandard: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n}));\n\nexport const mockConversionDataSubscription: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n}));\n\nexport const mockSignupData: SignupDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const total = 80 + ((i * 11) % 40);\n const members = Math.floor(total * 0.4);\n const retail = Math.floor(total * 0.35);\n const brandAffiliates = total - members - retail;\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n total,\n members,\n retail,\n brandAffiliates,\n };\n});\n\nexport const mockCategories: CategoryRevenue[] = [\n {\n id: 'cat-001',\n name: 'Favorites',\n revenue: 45200,\n percentage: 29,\n color: '#C95D63',\n trend: { revenue: '+8%', units: '+10%' },\n },\n {\n id: 'cat-002',\n name: 'Daily Routine',\n revenue: 42100,\n percentage: 27,\n color: '#6C7A9B',\n trend: { revenue: '+12%', units: '+15%' },\n },\n {\n id: 'cat-003',\n name: 'Fit & Trim Body',\n revenue: 34300,\n percentage: 22,\n color: '#E8975E',\n trend: { revenue: '-3%', units: '-1%' },\n },\n {\n id: 'cat-004',\n name: 'Dull Skin',\n revenue: 24900,\n percentage: 16,\n color: '#5F8FC4',\n trend: { revenue: '+5%', units: '+7%' },\n },\n {\n id: 'cat-005',\n name: 'Acne',\n revenue: 9400,\n percentage: 6,\n color: '#A2C3B3',\n trend: { revenue: '+2%', units: '+3%' },\n },\n];\n\nexport const mockOrders: OrderHistory[] = Array.from({ length: 50 }, (_, i) => {\n const firstNames = ['Sarah', 'John', 'Emma', 'Michael', 'Olivia', 'William', 'Ava', 'James'];\n const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n orderId: `ORD-${String(10000 + i).padStart(5, '0')}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n customerName: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n customerType: i % 3 === 0 ? 'Subscription' : 'Standard',\n items: (i % 5) + 1,\n total: Number((50 + ((i * 17) % 200) + (i % 10) * 0.1).toFixed(2)),\n bv: 30 + ((i * 9) % 150),\n };\n});\n\nexport const mockSignupDetails: SignupDetail[] = Array.from({ length: 30 }, (_, i) => {\n const firstNames = ['Alice', 'Bob', 'Carol', 'David', 'Eva', 'Frank', 'Grace', 'Henry'];\n const lastNames = ['Anderson', 'Baker', 'Clark', 'Davis', 'Evans', 'Fisher', 'Grant', 'Hall'];\n const types: ('Member' | 'Retail' | 'Brand Affiliate')[] = ['Member', 'Retail', 'Brand Affiliate'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n id: `SU-${String(1000 + i).padStart(4, '0')}`,\n name: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n type: types[i % types.length],\n email: `${firstNames[i % firstNames.length].toLowerCase()}.${lastNames[i % lastNames.length].toLowerCase()}@example.com`,\n status: i % 4 === 0 ? 'Pending' : 'Active',\n };\n});\n","import type { ProductOfferDashboardStats, TopPerformingOffer } from '../types.d';\n\nexport { mockTopProducts, mockConversionData, mockOrders } from './mockDashboardData';\n\nexport const mockProductOfferStats: ProductOfferDashboardStats = {\n shopTitle: 'Performance Overview',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$5,208',\n offersPurchased: '285',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+2.3%',\n offersPurchased: '+3.7%',\n },\n};\n\nexport const mockProductOfferStatsPositiveTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+5.1%',\n offersPurchased: '+12.5%',\n },\n};\n\nexport const mockProductOfferStatsNegativeTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '-1.8%',\n offersPurchased: '-3.7%',\n },\n};\n\nexport const mockProductOfferStatsNeutralTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockProductOfferStatsZeroOffers: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n metrics: {\n ...mockProductOfferStats.metrics,\n offersPurchased: '0',\n },\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockTopOffers: TopPerformingOffer[] = [\n {\n id: 'offer-1',\n name: 'Winter Skincare Bundle',\n revenue: 2800,\n percentage: 29,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n percentage: 27,\n color: '#E8915A',\n trend: { revenue: '+3.1%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n percentage: 22,\n color: '#C75B5B',\n trend: { revenue: '-1.5%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n percentage: 16,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n percentage: 6,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%' },\n },\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["/gitlab-runner-data/builds/nextgen-development/mysite/npm/react-mysite-elements/dist/index.mjs","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../src/common/card/NsProductCard.tsx","../src/common/card/styles/NsProductCard.Styled.tsx","../src/common/carousel/NsProductCarousel.tsx","../src/common/carousel/NsProductCarousel.styled.ts","../src/common/carousel/ProductTabCarousel.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.styled.tsx","../src/common/carousel/ProductTabCarousel.styled.tsx","../src/common/headers/MysiteHero.tsx","../src/common/headers/MysiteHero.styled.tsx","../src/common/icon/icons/PlaceholderImage.tsx","../src/common/icon/icons/ArrowDownIcon.tsx","../src/common/utils/gtmTracking.ts","../src/common/shopping-dashboard/ShoppingDashboard.styled.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.styled.tsx","../src/common/shopping-dashboard/TranslationKeys/translationResolver.ts","../src/common/shopping-dashboard/TranslationKeys/ShoppingDashboardTranslationKeys.ts","../src/common/shopping-dashboard/utils/marketOptions.ts","../src/common/shopping-dashboard/shared/StatsCard.tsx","../src/common/shopping-dashboard/shared/StatsCard.styled.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.tsx","../src/common/shopping-dashboard/utils/trendUtils.tsx","../src/common/shopping-dashboard/utils/dataUtils.ts","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.styled.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.styled.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.styled.tsx","../src/common/shopping-dashboard/utils/dateConstants.ts","../src/common/shopping-dashboard/utils/dateFormat.ts","../src/common/shopping-dashboard/shared/Signups/SignupsChart.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsChart.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.styled.tsx","../src/common/shopping-dashboard/ShoppingDashboard.tsx","../src/common/shopping-dashboard/MysiteDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.tsx","../src/common/shopping-dashboard/shared/PageHeader.tsx","../src/common/shopping-dashboard/shared/PageHeader.styled.tsx","../src/common/shopping-dashboard/shared/DataTable.tsx","../src/common/shopping-dashboard/shared/DataTable.styled.tsx","../src/common/shopping-dashboard/shared/Pagination.tsx","../src/common/shopping-dashboard/shared/Pagination.styled.tsx","../src/common/shopping-dashboard/shared/FullViewComponents.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.styled.tsx","../src/common/shopping-dashboard/shared/useViewport.ts","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.styled.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.styled.tsx","../src/common/shopping-dashboard/TranslationContext.tsx","../src/common/shopping-dashboard/ProductOfferDashboard.styled.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersPieChart.tsx","../src/common/shopping-dashboard/TranslationKeys/ProductOfferDashboardTranslationKeys.ts","../src/common/shopping-dashboard/ProductOfferDashboard.tsx","../src/common/shopping-dashboard/PoDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersFullView.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersFullView.styled.tsx","../src/common/shopping-dashboard/shared/FilterBar.styled.tsx","../src/common/shopping-dashboard/shared/FilterBar.tsx","../src/common/shopping-dashboard/fixtures/mockDashboardData.ts","../src/common/shopping-dashboard/fixtures/mockProductOfferData.ts"],"names":["up","Object","create","ln","defineProperty","gp","getOwnPropertyDescriptor","fp","getOwnPropertyNames","mp","getPrototypeOf","hp","prototype","hasOwnProperty","ca","e","t","exports","xp","o","n","i","call","get","enumerable","bp","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","Fn","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","isRequired","getShim","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","require_prop_types","Nn","ReactIs","throwOnDirectAccess","useState","NsImage","styled","PriceComponent","ProductCardContainer","isMobile","ImageContainer","bgColor","DefaultImage","ProductTitle","ProductBadgeContainer","AddToCartButton","disabled","isHovered","CartIcon","useMediaQuery","jsx","jsxs","NsProductCard","productTitle","imageDetails","className","button","onCardClick","productStatusBadge","directSellerBadge","mySitePriceComponent","testId","isButtonHovered","setIsButtonHovered","handleImageError","target","noImageFallback","fallbackImage","src","onClick","tabIndex","children","onError","imageSrc","alt","imageAlt","areaLabel","width","title","showButton","buttonText","stopPropagation","onMouseEnter","onMouseLeave","height","viewBox","fill","xmlns","fillRule","clipRule","d","NsProductCard_default","useCallback","useRef","Slider","NsCarouselControl","Box","NsTypography","SlickContainer","ScrollableContainer","CardList","ControlsContainer","ViewAllWrapper","$isMobile","ProductCountWrapper","ArrowsWrapper","$isDisabled","Scrollablewrapper","CustomTypography","ViewAllLink","$disabled","EmptyProductCategories","ControlsHeaderRow","ProductInfoWrapper","CategoryNameWrapper","ProductCardCarousel","entries","renderEntry","settings","showControlButtons","allEntryLabel","allEntryLink","categoryName","emptyProductMessage","productsCountLabel","isInitialDataLoading","history","sliderRef","prev","current","slickPrev","next","slickNext","renderProductEntry","entry","index","directSeller","sliderSettings","dots","infinite","speed","slidesToShow","Math","min","length","slidesToScroll","swipe","draggable","arrows","responsive","breakpoint","shouldShowNavigation","renderCarouselContent","map","ref","variant","preventDefault","push","viewAllLabel","viewAllUrl","useEffect","import_prop_types","An","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","ar","NsCategoryNavigation","itemArray","controlledValue","onChange","Bn","internalValue","setInternalValue","orientation","event","newValue","item","label","categoryId","findIndex","content","NsSpinner","getMinHeight","$hasCategories","ProductTabCarouselContainer","TabsContainer","ContentContainer","LoadingContainer","NoTabsContainer","SpinnerContainer","ProductTabCarousel","fetchCategories","fetchProducts","showCustomCategory","emptyProductTabs","getCategoryId","categories","isLoadingInitialData","setIsLoadingInitialData","setCategories","isCategoriesLoaded","setIsCategoriesLoaded","selectedTab","setSelectedTab","products","setProducts","loading","setLoading","shouldShowSpinner","setShouldShowSpinner","checkForExistingSpinners","existingSpinners","document","querySelectorAll","then","data","finally","cat","_","ProductTabCarousel_default","useMemo","Typography","Tooltip","NsLink","getContactTextStyles","hasWhiteBackground","fontSize","fontStyle","fontWeight","lineHeight","letterSpacing","color","textDecoration","getSocialTitleStyles","textTransform","paddingLeft","getSocialIconsStyles","display","flexDirection","gap","alignItems","getContactTextMobileStyles","paddingBottom","wordBreak","overflowWrap","getSocialTitleMobileStyles","marginBottom","transition","opacity","transform","MysiteHeroContainer","bannerProps","isCircularImage","backgroundClip","background","backgroundColor","position","overflow","willChange","backfaceVisibility","top","left","right","boxShadow","paddingTop","justifyContent","fontFamily","headlineFont","padding","objectFit","objectPosition","marginLeft","marginRight","boxSizing","whiteSpace","textOverflow","paragraphFont","WebkitBoxOrient","WebkitLineClamp","MysiteHeroContainerMobile","paddingRight","maxHeight","bottom","pointerEvents","BadgeContainer","Badge","backdropFilter","borderRadius","border","minHeight","ToggleButtonMobile","cursor","margin","StyledSpan","ImgTabIndex","ContactLink","BadgeValue","PlaceholderImage","sx","ArrowDownIcon","trackGTMEvent","eventData","window","url","href","updatedEventData","prefix","includes","dataLayer","console","error","Fragment","renderImageContent","placeholderClass","renderBadges","showBadges","expirationDate","totalSavings","badgeClass","renderMobileContent","isScrolled","renderSocialMediaIcons","shopTitle","socialTitleText","email","phone","component","trim","renderContactLink","renderDesktopContent","shopDescription","arrow","checkIfImageIsCircular","Promise","resolve","reject","imageContext","Image","crossOrigin","onload","canvas","createElement","context","getContext","drawImage","isCircular","getImageData","every","corner","Array","slice","onerror","isWhiteOrNearWhite","hex","replace","toLowerCase","test","fullHex","split","char","join","r","Number","parseInt","substring","g","b","threshold","createContactClickHandler","contactType","contactValue","contact_type","contact_value","click_element","onKeyDown","key","globalThis","protocol","handlers","MysiteHero","socialIcons","setIsScrolled","isDescriptionExpanded","setIsDescriptionExpanded","setHasWhiteBackground","isImageCircular","setIsImageCircular","toggleDescription","debounceTimeout","lastScrollY","scrollY","currentScrollState","isTransitioning","lastUpdateTime","updateScrollState","newState","now","Date","clearTimeout","setTimeout","scrollTo","behavior","handleScroll","currentScrollY","abs","scrollingDown","scrollDownThreshold","scrollUpThreshold","initializeState","initialScrollY","shouldStartCompact","rafId","lastRafTime","throttledScrollHandler","requestAnimationFrame","addEventListener","passive","removeEventListener","cancelAnimationFrame","icon","social_platform","type","social_url","open","containerClass","getCharacterLimit","innerWidth","shouldShowToggle","DashboardContainer","StatsRow","WidgetContainer","TwoColumnGrid","ErrorContainer","CalendarTodayIcon","PublicIcon","ColorUtils","getGenomeColor","HeaderContainer","theme","TitleSection","ShopTitle","DateRangeLabel","FiltersSection","FilterDropdownContainer","FilterLabel","StyledSelect","FilterIcon","LoadingIndicatorContainer","DesktopFiltersContainer","StyledCircularProgress","activeResolver","setTranslationResolver","resolver","getTranslationResolver","resolveTranslation","fallback","result","ShoppingDashboardTranslationKeys","stats","revenue","volume","visits","subtitle","dcSv","conversionRate","trend","increased","decreased","unchanged","details","filter","dateRange","last7days","last30days","last90days","thisMonth","dateRangeLabel","market","all","marketLabel","productSort","units","byUnits","byRevenue","byVolume","signupView","members","retail","brandAffiliates","showAll","showMembers","showRetail","showBrandAffiliates","conversionType","standard","subscription","categorySort","byTrend","widget","topProducts","viewAll","empty","ariaLabel","titleAriaLabel","sortAriaLabel","noImageAriaLabel","unitsSuffix","revenueSuffix","dcSvSuffix","rank","formula","comparison","chartAriaLabel","filterAriaLabel","noData","noChange","tooltipOrders","tooltipVisits","ordersPerSiteVisits","signups","total","totalSignupsInPeriod","noTrendData","topCategories","menu","fullView","navigation","backToDashboard","backAriaLabel","dashboard","statsRow","dashboardFilters","loadingDashboard","dateRangeFilter","marketFilter","filterSuffix","columns","date","status","detailsTitle","orderId","customer","items","bv","orderTotal","totalSv","orderDetailsTitle","notAvailable","product","unitsSold","skuPrefix","noProducts","category","percentOfTotal","allCategoriesTitle","noCategoryData","dataTable","noDataAvailable","sortableColumn","pagination","previousPage","nextPage","goToPage","of","defaults","zeroTrend","noValue","getTranslation","buildDefaultMarketOptions","resolveMarketOptions","markets","useMarketOptions","DashboardHeader","dateRangeLabelProp","isLoading","onDateRangeChange","onMarketChange","marketOptions","handleDateRangeChange","newDateRange","handleMarketChange","newMarket","handleFilterKeyDown","blur","getDateRangeLabelText","as","htmlFor","find","opt","String","option","ShowChartIcon","TrendingUpIcon","TrendingDownIcon","StatsCardContainer","$layout","SplitTitle","SplitRow","LegendColumn","SplitTrend","direction","LegendCaption","StatsTitle","StatsValueContainer","StatsValue","ValueSubtitleWrapper","StatsSubtitle","TrendContainer","TrendIcon","TrendText","StatsCardHeader","Skeleton","SkeletonCard","SkeletonHeader","SkeletonRow","StatsCardWrapper","StatsCardHeaderRow","StatsCardBody","StatsCardSubtitle","ProductRowInfo","ProductRowMetrics","ChartMetricRow","ChartMetricTrend","ChartAreaSkeleton","PieChartLayout","PieCircleSkeleton","LegendList","LegendRowWrapper","LegendRowInfo","DashboardLayout","DashboardHeaderRow","DashboardFilterGroup","StatsGrid","WidgetGrid","FullViewLayout","FullViewMetricCard","FullViewMetricCenter","FullViewChartArea","FullViewTableCard","FullViewTableRow","SummaryCardsGrid","StatsCardSkeleton","ProductRowSkeleton","ProductsListSkeleton","rowKey","ChartWidgetSkeleton","LegendRowSkeleton","CategoriesPieChartSkeleton","FullViewChartSkeleton","FullViewTableSkeleton","StatsCardComponent","caption","layout","trendDirection","trendValue","getTrendAriaLabel","directionText","getTrendChartIcon","iconSize","StatsCard","memo","displayName","ShoppingCartIcon","ArrowUpwardIcon","ArrowDownwardIcon","RemoveIcon","parseTrendPercent","cleanedValue","parsedValue","isFinite","resolveTrendDirection","calculateWeightedRevenueTrend","getRevenue","getTrend","reduce","accumulator","weightedSum","weight","average","formatted","toFixed","getTrendDirectionLabel","getTrendIcon","getTrendColor","calculateTotalPages","itemsPerPage","ceil","paginateItems","currentPage","startIndex","endIndex","sortByNumericProperty","sort","a","aVal","bVal","calculatePercentage","decimalPlaces","usePaginatedItems","totalPages","pageItems","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","format","toLocaleString","ProductsListContainer","WidgetHeader","HeaderActionsContainer","WidgetTitle","SortDropdown","ProductsList","ProductItem","ProductRank","ProductImage","ProductImagePlaceholder","ProductInfo","ProductName","ProductSubtitle","ProductMetrics","ProductValue","ProductTrend","EmptyState","EmptyStateText","Menu","MenuItem","ListItemIcon","ListItemText","MoreVertIcon","VisibilityIcon","IconButton","StyledIconButton","WidgetMenu","widgetId","onFullView","anchorEl","setAnchorEl","buttonId","menuId","handleClick","currentTarget","handleClose","handleFullView","size","onClose","MenuListProps","anchorOrigin","vertical","horizontal","transformOrigin","TopSellingProductsListComponent","maxProducts","onSortChange","onTitleClick","handleSortChange","newSort","formatValue","sortBy","getSubtitle","getTrendValue","getTrendDirection","startsWith","displayedProducts","rankLabel","trendLabel","imageUrl","toUpperCase","TopSellingProductsList","LineChart","Line","XAxis","YAxis","CartesianGrid","ResponsiveContainer","ConversionRateContainer","ChartHeader","TitleRow","ChartTitle","FilterDropdown","MetricDisplay","MetricValue","MetricTrend","FormulaDisplay","ChartContainer","TooltipContainer","TooltipLabel","TooltipValue","TooltipDetails","DAYS_MAP","DATE_RANGE_LABELS","getDaysFromDateRange","getDateRangeLabel","formatDateRangeLabel","formatShortDate","getMonth","getDate","AXIS_MONTH_MAP","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","formatAxisDate","dateStr","parts","formatDisplayDate","formatDateRange","start","end","formatISODate","toISOString","calculateDateRangeFromOption","dateRangeOption","today","year","getFullYear","month","startDate","endDate","CHART_MARGIN","AXIS_TICK","LINE_DOT","ACTIVE_DOT","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionData","conversionFilter","summaryRate","summaryChangePct","onFilterChange","handleFilterChange","newFilter","noDataText","noChangeText","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","stroke","strokeWidth","dot","activeDot","ConversionRateChart","SignupsContainer","Legend","LegendItem","LegendColor","LegendLabel","SERIES_COLORS","SignupsChartComponent","signupData","onViewChange","handleViewChange","newView","totalSignups","latestTotal","previousTotal","totalLabel","membersLabel","retailLabel","brandAffiliatesLabel","SignupsChart","PieChart","Pie","Cell","CategoriesContainer","ChartAndLegendContainer","ChartWrapper","DonutCenterOverlay","DonutCenterLabel","DonutCenterValue","DonutCenterTrend","LegendContainer","LegendInfo","LegendName","LegendValue","LegendPercentage","LegendValueWrapper","LegendTrendInline","LegendTrend","TopCategoriesPieChartComponent","sortedCategories","nextSortedCategories","nextTotalRevenue","sum","nextTrendDirection","nextFormattedTrend","totalRevenue","formattedTrend","getTrendGraphIcon","renderCustomLabel","cx","cy","midAngle","innerRadius","outerRadius","percentage","RADIAN","PI","radius","x","cos","y","sin","textAnchor","dominantBaseline","leadingTrim","nameKey","paddingAngle","labelLine","formatter","TopCategoriesPieChart","EMPTY_TOP_PRODUCTS","EMPTY_CONVERSION_DATA","EMPTY_SIGNUP_DATA","EMPTY_CATEGORIES","ShoppingDashboard","onProductSortChange","onSignupViewChange","onConversionFilterChange","onCategorySortChange","onProductsTitleClick","onConversionTitleClick","onSignupsTitleClick","onCategoriesToTitleClick","resolvedTopProducts","resolvedConversionData","resolvedSignupData","resolvedCategories","metrics","ArrowBackIcon","LanguageIcon","PageHeaderWrapper","BackButtonWrapper","BackButton","LeftSection","Title","DateRange","MobileDateRange","FilterWrapper","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","keys","options","buildMarketFilter","PageHeader","onBack","filters","renderFilterIcon","iconType","TableContainer","Table","TableHeader","TableHeaderCell","sortable","TableBody","TableRow","TableCell","EmptyTableCell","SortIconContainer","isActive","DataTable","onSort","sortColumn","sortDirection","getRowKey","handleSort","columnKey","handleKeyDown","getAriaSort","column","scope","colSpan","row","rowIndex","render","ChevronLeftIcon","ChevronRightIcon","PaginationContainer","PageButton","PageInfo","NavButton","Pagination","onPageChange","totalItems","handlePrevious","handleNext","action","pageNumbers","from","pages","startItem","endItem","goToPageLabel","page","PageContainer","MetricChartCardSection","shadows","MetricSection","palette","text","primary","success","main","secondary","ComparisonText","ChartSection","TableSection","withCard","MobileCardName","MobileCardSubtext","MobileCardDetail","MobileCardStatus","warning","ProductSku","MobileCardsContainer","DesktopTableContainer","MobileProductCard","divider","MobileCardHeader","MobileProductRank","MobileProductDetails","MobileProductName","MobileProductSku","MobileMetricsGrid","MobileMetricItem","MobileMetricLabel","MobileMetricValue","MOBILE_VIEWPORT_QUERY","useIsMobileViewport","noSsr","mapProductToRow","sku","padStart","ProductsFullView","setCurrentPage","setSortColumn","setSortDirection","isMobileView","handleBack","productRows","sortedRows","paginatedRows","ConversionTrendChartContainer","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ChartWithLegendWrapper","ChartLegendContainer","ComparisonTextMobile","OrderIdColumnCell","ConversionRateFullView","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","customerType","paginatedOrders","getChartColor","flexWrap","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","NameColumnCell","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","point","rawPoint","signupTotal","absoluteChange","first","last","round","hasSignupTrendData","paginatedSignups","connectNulls","signup","muiStyled","SummaryItemRow","SummaryItemInfo","SummaryItemName","SummaryItemSubtext","SummaryItemPercentage","TopSection","SummaryContainer","SummaryItem","ColorDot","dotColor","SummaryInfo","SummaryName","SummaryValue","SummaryPercentage","MobileCategoriesContainer","MobileCategoryCard","SummaryTrendIcon","CategoryNameColumnCell","CategoriesFullView","parseFloat","isNaN","totalRevenueTrendDirection","totalRevenueTrend","paginatedCategories","useTranslationResolver","translate","TranslationProvider","useTranslation","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","view","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","initialDateRange","initialMarket","initialProductSort","initialSignupView","initialConversionFilter","initialCategorySort","historyAdapter","historyStateKey","resetToDashboardOnMount","currentView","setCurrentView","hasIntraDashboardHistoryRef","setDateRange","setMarket","setProductSort","setSignupView","setConversionFilter","setCategorySort","resolvedOrders","resolvedSignups","updateView","readCurrentView","writeCurrentView","mode","nextState","nextLocation","replaceState","pushState","listen","nextView","handlePopState","handleOpenFullView","goBack","back","nextDateRange","nextMarket","handleProductSortChange","nextProductSort","handleSignupViewChange","nextSignupView","handleConversionFilterChange","nextFilter","handleCategorySortChange","nextSort","handleProductsTitleClick","handleConversionTitleClick","handleSignupsTitleClick","handleCategoriesTitleClick","PoDashboardContainer","TopChartsRow","StatsCardStack","BottomChartsRow","ProductOfferDashboardTranslationKeys","offersPurchased","trendUp","trendDown","trendNeutral","comparedTo","offerSort","overall","emptyState","topPerformingOffers","statsCard","conversionChart","topOffers","widgetMenu","filterDateRange","filterMarket","backButton","columnName","columnRevenue","columnPercentage","columnTrend","trendZero","TopPerformingOffersPieChartComponent","offers","sortedOffers","nextSortedOffers","offer","legendTrendDirection","TopPerformingOffersPieChart","EMPTY_TOP_OFFERS","ProductOfferDashboard","dashboardTitle","conversionSummaryRate","conversionSummaryChangePct","onOfferSortChange","onOffersTitleClick","resolvedTopOffers","selectedMarket","SummaryTrend","TableTrendCell","MobileOffersContainer","MobileOfferCard","MobileOfferHeader","MobileOfferName","MobileOfferMetricsGrid","MobileOfferMetricItem","MobileOfferMetricLabel","MobileOfferMetricValue","MobileOfferTrendValue","TopPerformingOffersFullView","paginatedOffers","columnTrendDirection","summaryTrendDirection","trendPercent","isProductOfferDashboardView","PoDashboardWithNavigation","allProducts","allOffers","conversionFullViewData","conversionFullViewRate","conversionFullViewChangePct","initialOfferSort","setOfferSort","resolvedAllProducts","resolvedAllOffers","handleOfferSortChange","handleOffersTitleClick","FilterContainer","FilterBar","mockStats","mockTopProducts","mockConversionData","setDate","mockConversionDataStandard","mockConversionDataSubscription","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","Ya","bo","Zo","Vl","Nl","Eo","nt","df","Ng","di","fa","ga","pe","lt","lf","rr","ProductCarousel","qa","L","Ep","Yo","Ea","xr","Ga","Dt","Ir","en","ea","xo","Sg","ot","Ci","Sc","ol","zl","Kc","Va","Aa","Al","Na","_c","tc","vc","tt","pp","er","an","Ro","dp","cp","sp","gf","rn","rl","vi","Qt","Bo","kc","Tg","Do"],"mappings":"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","sourcesContent":["var up=Object.create;var ln=Object.defineProperty;var gp=Object.getOwnPropertyDescriptor;var fp=Object.getOwnPropertyNames;var mp=Object.getPrototypeOf,hp=Object.prototype.hasOwnProperty;var ca=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var xp=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of fp(t))!hp.call(e,i)&&i!==o&&ln(e,i,{get:()=>t[i],enumerable:!(n=gp(t,i))||n.enumerable});return e};var bp=(e,t,o)=>(o=e!=null?up(mp(e)):{},xp(t||!e||!e.__esModule?ln(o,\"default\",{value:e,enumerable:!0}):o,e));var Fn=ca((Yf,On)=>{\"use strict\";var Rp=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";On.exports=Rp});var Nn=ca((Jf,In)=>{\"use strict\";var Mp=Fn();function Ln(){}function $n(){}$n.resetWarningCache=Ln;In.exports=function(){function e(n,i,s,d,p,w){if(w!==Mp){var C=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw C.name=\"Invariant Violation\",C}}e.isRequired=e;function t(){return e}var o={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:$n,resetWarningCache:Ln};return o.PropTypes=o,o}});var An=ca((Qf,Vn)=>{\"use strict\";Vn.exports=Nn()();var Zf,qf});import{useState as yp}from\"react\";import{NsImage as wp}from\"@nuskin/foundation-ui-components\";import{styled as Ft}from\"@nuskin/foundation-theme\";var sn=Ft(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,dn=Ft(\"button\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n width: 240px;\n height: ${e=>e.isMobile?\"410px\":\"513px\"};\n overflow: hidden;\n cursor: pointer;\n border: 1px solid #ededed;\n background: var(--color-primary-n-10-primary-white, #fff);\n`,pn=Ft(\"div\")`\n width: '240px';\n height: '240px';\n background: ${e=>e.bgColor??\"#f5f5f5\"};\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 0;\n display: flex;\n align-items: normal;\n justify-content: center;\n position: relative;\n @media (max-width: 560px) {\n width: 200px;\n height: 200px;\n align-items: unset;\n }\n`,cn=Ft(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,un=Ft(\"div\")`\n width: 200px;\n margin-top: 16px;\n max-height: 66px;\n text-align: left;\n font-size: 16px;\n font-family: 'Inter', sans-serif;\n font-weight: 400;\n line-height: 22px;\n overflow: hidden;\n color: #666;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n @media (max-width: 560px) {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n margin-top: 5px;\n max-height: 54px;\n line-height: 18px;\n }\n`,ua=Ft(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,gn=Ft(\"button\")`\n width: 200px;\n height: 40px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0.14px;\n text-transform: none;\n justify-content: flex-start;\n padding-left: 31px;\n overflow: hidden;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n text-overflow: ellipsis;\n margin-top: 8px;\n margin-bottom: 10px;\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n\n color: ${e=>e.disabled?\"#999\":\"#fff\"};\n background-color: ${e=>e.disabled?\"#e0e0e0\":!e.isMobile&&e.isHovered?\"#888\":\"#000\"};\n border: ${e=>e.disabled?\"1px solid #ccc\":\"none\"};\n cursor: ${e=>e.disabled?\"not-allowed\":\"pointer\"};\n opacity: ${e=>e.disabled?.6:1};\n transition: ${e=>e.isMobile?\"none\":\"all 0.3s ease\"};\n\n @media (max-width: 560px) {\n margin: 5px 0;\n }\n`,fn=Ft(\"span\")`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${e=>e.disabled?.5:1};\n`;import{useMediaQuery as Cp}from\"@mui/material\";import{jsx as pt,jsxs as mn}from\"react/jsx-runtime\";var vp=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:s,directSellerBadge:d,mySitePriceComponent:p,testId:w})=>{let[C,u]=yp(!1),x=Cp(\"(max-width: 560px)\"),g=b=>{let f=b.target,c=t?.fallbackImage;c&&f.src!==c&&(f.src=c)};return mn(dn,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:x,children:[pt(pn,{bgColor:t?.bgColor,onError:g,children:t?.imageSrc?pt(wp,{\"data-testid\":w??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):pt(cn,{alt:\"\"})}),pt(un,{title:e,\"data-testid\":\"product-title\",children:e}),d&&pt(ua,{children:d}),pt(ua,{children:s}),pt(sn,{children:p}),n?.showButton&&mn(gn,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:x,isHovered:C,onClick:b=>{b.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!x&&!n?.disabled&&u(!0)},onMouseLeave:()=>{x||u(!1)},children:[pt(fn,{className:\"cart-icon\",disabled:n?.disabled,children:pt(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:pt(\"path\",{fillRule:\"evenodd\",clipRule:\"evenodd\",d:\"M0 1.86358C0 1.26109 0.488416 0.772675 1.09091 0.772675H3.48173C4.51054 0.772675 5.39955 1.49136 5.61511 2.49733L5.71309 2.95456H22.9091C23.245 2.95456 23.5622 3.10933 23.7689 3.37411C23.9757 3.63889 24.0489 3.98415 23.9674 4.31005L22.4053 10.5583C21.9197 12.5009 20.1743 13.8636 18.172 13.8636H8.05068L8.28444 14.9546H20.7273C21.3298 14.9546 21.8182 15.443 21.8182 16.0455C21.8182 16.648 21.3298 17.1364 20.7273 17.1364H19.6364H8.18182H7.40252C6.88811 17.1364 6.4436 16.777 6.33582 16.274L3.76449 4.27405L3.48173 2.95449H1.09091C0.488416 2.95449 0 2.46608 0 1.86358ZM8.18182 17.1364C6.97683 17.1364 6 18.1132 6 19.3182C6 20.5232 6.97683 21.5 8.18182 21.5C9.3868 21.5 10.3636 20.5232 10.3636 19.3182C10.3636 18.1132 9.3868 17.1364 8.18182 17.1364ZM19.6364 17.1364C18.4314 17.1364 17.4545 18.1132 17.4545 19.3182C17.4545 20.5232 18.4314 21.5 19.6364 21.5C20.8413 21.5 21.8182 20.5232 21.8182 19.3182C21.8182 18.1132 20.8413 17.1364 19.6364 17.1364ZM7.58317 11.6818H18.172C19.1732 11.6818 20.0459 11.0005 20.2887 10.0292L21.5119 5.13638H6.18062L7.58317 11.6818Z\",fill:n?.disabled?\"#999\":\"#ffffff\"})})}),n.buttonText||\"ADD TO CART\"]})]})},ga=vp;import{useCallback as Mn,useRef as Sp}from\"react\";import Tp from\"react-slick\";import Dp from\"@mui/material/useMediaQuery\";import{NsCarouselControl as Pp}from\"@nuskin/foundation-ui-components\";import{styled as Fe}from\"@nuskin/foundation-theme\";import No from\"@mui/material/Box\";import{NsTypography as kp}from\"@nuskin/foundation-ui-components\";var hn=Fe(No)`\n padding: 30px 0 60px;\n width: 100%;\n margin: auto;\n margin-top: 50px;\n position: relative;\n\n .slick-list {\n padding-left: 24px;\n padding-right: 24px;\n }\n .slick-slide {\n display: flex;\n justify-content: center;\n padding: 0 12px;\n box-sizing: border-box;\n }\n .slick-prev,\n .slick-next {\n display: none !important;\n }\n\n @media (max-width: 1200px) {\n max-width: 1024px;\n .slick-list {\n padding-left: 12px;\n padding-right: 12px;\n }\n .slick-slide {\n padding: 0 6px;\n }\n }\n @media (max-width: 700px) {\n max-width: 100vw;\n padding: 10px 0 50px;\n .slick-list {\n padding-left: 4px;\n padding-right: 4px;\n }\n .slick-slide {\n padding: 0 2px;\n }\n }\n @media (max-width: 560px) {\n padding: 10px 0 10px;\n margin-top: 25px;\n }\n`,xn=Fe(\"div\")`\n overflow-x: auto;\n display: flex;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n gap: 16px;\n padding: 0 8px 16px;\n width: 100%;\n box-sizing: border-box;\n\n &::-webkit-scrollbar {\n height: 6px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #007bff;\n border-radius: 10px;\n }\n`,bn=Fe(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,yn=Fe(No)`\n position: absolute;\n bottom: calc(100% + 1px);\n right: 1px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n`,wn=Fe(No)`\n display: flex;\n align-items: center;\n margin-left: auto;\n margin-right: ${({$isMobile:e})=>e?0:\"24px\"};\n\n @media (max-width: 560px) {\n margin-left: 0;\n order: 2;\n }\n`,Cn=Fe(No)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`,vn=Fe(No)`\n display: flex;\n align-items: center;\n opacity: ${({$isDisabled:e})=>e?.3:1};\n pointer-events: ${({$isDisabled:e})=>e?\"none\":\"auto\"};\n transition: opacity 0.3s ease;\n\n .carousal-prev-button,\n .carousal-next-button {\n transition: all 0.3s ease;\n border: 2px solid #000000;\n border-radius: 3px;\n padding: 9px;\n cursor: pointer;\n\n svg {\n transition: all 0.3s ease;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n\n &:hover {\n background-color: #f5f5f5;\n border: 2px solid #ddd;\n\n svg {\n opacity: 0.5;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n }\n }\n\n @media (max-width: 560px) {\n display: none;\n }\n`,$f=Fe(\"div\")`\n @media (max-width: 560px) {\n overflow-y: hidden;\n scrollbar-width: thin;\n scrollbar-color: #007bff #eee;\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: #eee;\n }\n &::-webkit-scrollbar-thumb {\n background-color: red;\n border-radius: 8px;\n border: 2px solid #eee;\n }\n }\n`,kn=Fe(kp)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`,Sn=Fe(\"a\")`\n color: ${({$disabled:e})=>e?\"#999999\":\"#000000\"};\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n text-decoration: none;\n border-bottom: 1px solid ${({$disabled:e})=>e?\"#999999\":\"#000000\"};\n padding-bottom: 4px;\n transition: all 0.3s ease;\n cursor: ${({$disabled:e})=>e?\"not-allowed\":\"pointer\"};\n pointer-events: ${({$disabled:e})=>e?\"none\":\"auto\"};\n opacity: ${({$disabled:e})=>e?.5:1};\n\n @media (max-width: 560px) {\n font-size: 14px;\n line-height: 18px;\n }\n\n &:hover {\n color: ${({$disabled:e})=>e?\"#999999\":\"#666666\"};\n border-bottom: 1px solid ${({$disabled:e})=>e?\"#999999\":\"#666666\"};\n cursor: ${({$disabled:e})=>e?\"not-allowed\":\"pointer\"};\n }\n`,Tn=Fe(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,Dn=Fe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Pn=Fe(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,Rn=Fe(\"div\")`\n font-family: 'Lora';\n font-weight: 400;\n font-size: 22px;\n margin-left: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 13px;\n`;import{jsx as Qe,jsxs as Vo}from\"react/jsx-runtime\";function rr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:s=\"\",categoryName:d,emptyProductMessage:p=\"No Products Available For The Selected Category\",productsCountLabel:w=\"Products\",isInitialDataLoading:C,history:u}){let x=Sp(null),g=Dp(\"(max-width: 560px)\"),b=Mn(()=>{x.current?.slickPrev()},[]),f=Mn(()=>{x.current?.slickNext()},[]),c=t??((h,P)=>Qe(ga,{productTitle:h.productTitle,imageDetails:h.imageDetails,button:h.button,onCardClick:h.onCardClick,productStatusBadge:h.productStatusBadge,directSellerBadge:h.directSeller,mySitePriceComponent:h.mySitePriceComponent},`${h.productTitle}-${P}`)),v={dots:!0,infinite:!0,speed:500,slidesToShow:Math.min(e?.length??0,4),slidesToScroll:4,swipe:!0,draggable:!0,arrows:!0,responsive:[{breakpoint:1320,settings:{slidesToShow:Math.min(e?.length??0,3),slidesToScroll:3}},{breakpoint:900,settings:{slidesToShow:Math.min(e?.length??0,2),slidesToScroll:2}},{breakpoint:600,settings:{slidesToShow:1,slidesToScroll:1,arrows:!1}}],...o},y=(e?.length??0)>v.slidesToShow,T=()=>e?.length===0&&!C?Qe(Tn,{children:p}):g?Qe(xn,{children:Qe(bn,{children:e.map((h,P)=>h&&c(h,P))})}):Qe(Tp,{...v,ref:x,children:e.map((h,P)=>h&&c(h,P))});return Vo(hn,{children:[n&&Vo(yn,{children:[Vo(Dn,{children:[Vo(Pn,{children:[Qe(Cn,{children:Vo(kn,{variant:\"body-m\",children:[e?.length??0,\" \",w]})}),!g&&d&&Qe(Rn,{children:d})]}),Qe(wn,{$isMobile:g,children:Qe(Sn,{$disabled:(e?.length??0)===0,onClick:h=>{h.preventDefault(),(e?.length??0)>0&&u&&u.push(s)},children:i})})]}),!g&&Qe(vn,{$isDisabled:!y,children:Qe(Pp,{prev:b,next:f,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),T()]})}import{useState as Jt,useEffect as ma,useCallback as Vp}from\"react\";import{useMediaQuery as Ap}from\"@mui/material\";var ar=bp(An());import*as Bn from\"react\";import Fp from\"@mui/material/Tabs\";import Lp from\"@mui/material/Tab\";import En from\"@mui/material/Box\";import{styled as Op}from\"@nuskin/foundation-theme\";var zn=Op.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n background-color: #fff;\n .tabsStyle {\n display: flex;\n padding-top: 8.533px;\n flex-direction: column;\n align-items: flex-start;\n gap: 12.8px;\n border-right: 1px;\n border-color: divider;\n width: 200px;\n & .Mui-selected {\n font-weight: 700;\n font-size: 14px;\n font-family: 'inter', sans-serif;\n font-style: normal;\n font-height: 20px;\n border-radius: 4px;\n }\n & .MuiTabs-indicator {\n left: 0;\n background-color: #5b81a5;\n color: #5b81a5;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n }\n\n .tabContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n min-width: 100%;\n background-color: #fff;\n @media (max-width: 768px) {\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n }\n\n .tabStyle {\n align-items: flex-start;\n display: flex;\n text-align: left;\n font-size: 14px;\n font-family: 'inter' sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n padding: 1px;\n padding-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n text-transform: none;\n }\n @media (max-width: 768px) {\n flex-direction: row;\n\n .tabsStyle {\n width: 100%;\n border-right: none;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 0px;\n }\n\n .tabStyle {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 70px;\n padding: 8px 16px;\n text-align: center;\n margin: 4px;\n background-color: #fff;\n cursor: pointer;\n color: black;\n font-family: Inter;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n }\n\n .tabStyle.Mui-selected {\n background-color: #5b81a5;\n color: #ffffff !important;\n font-weight: 700;\n border-radius: 70px;\n }\n }\n .tabPanel {\n padding: 8px;\n text-align: left;\n }\n`;import{useMediaQuery as $p}from\"@mui/material\";import{jsx as uo,jsxs as Ip}from\"react/jsx-runtime\";function Hn(e){let{children:t,value:o,index:n,...i}=e;return uo(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&uo(En,{className:\"tabPanel\",children:t})})}Hn.propTypes={children:ar.default.node,index:ar.default.number.isRequired,value:ar.default.number.isRequired};var fa=({itemArray:e,value:t,onChange:o})=>{let[n,i]=Bn.useState(0),s=$p(\"(max-width:768px)\"),d=t??n;return uo(zn,{children:Ip(En,{className:\"tabContainer\",children:[uo(Fp,{orientation:s?\"horizontal\":\"vertical\",variant:\"scrollable\",value:d,onChange:(w,C)=>{o?o(w,C):i(C)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(w=>uo(Lp,{label:w.label,className:\"tabStyle\"},w.categoryId))}),e.map(w=>uo(Hn,{value:d,index:e.findIndex(C=>C.categoryId===w.categoryId),children:w.content},w.categoryId))]})})};import{NsSpinner as zp}from\"@nuskin/foundation-ui-components\";import{styled as go}from\"@nuskin/foundation-theme\";var Np=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",Wn=go(\"div\")`\n display: flex;\n flex-direction: ${({isMobile:e})=>e?\"column\":\"row\"};\n align-items: ${({isMobile:e})=>e?\"stretch\":\"flex-start\"};\n width: 100%;\n max-width: 1920px;\n min-height: ${Np};\n margin: 0 auto;\n box-sizing: border-box;\n overflow: visible;\n background: #fff;\n padding: ${({isMobile:e})=>e?\"10px 16px 0px 16px\":\"50px 60px 0px 60px\"};\n\n @media (max-width: 768px) {\n padding: 10px 16px 0px 16px;\n min-height: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n padding: 30px 40px 0px 40px;\n gap: 20px;\n }\n\n transform: translateZ(0);\n will-change: auto;\n`,_n=go(\"div\")`\n min-width: ${({isMobile:e})=>e?\"100%\":\"auto\"};\n height: ${({isMobile:e})=>e?\"auto\":\"100%\"};\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n\n overflow-x: auto;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-width: 200px;\n margin-right: 20px;\n }\n`,Kn=go(\"div\")`\n flex: 1;\n min-width: 0;\n height: ${({isMobile:e})=>e?\"auto\":\"100%\"};\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n min-height: 300px;\n\n -webkit-overflow-scrolling: touch;\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-height: 400px;\n }\n\n contain: layout style paint;\n transform: translateZ(0);\n`,cm=go(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n padding: 20px;\n\n @media (max-width: 768px) {\n min-height: 150px;\n padding: 16px;\n }\n`,Un=go(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 40px 20px;\n color: #666;\n font-size: 16px;\n\n @media (max-width: 768px) {\n padding: 20px 16px;\n font-size: 14px;\n }\n`,Gn=go(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as Zt,jsxs as Hp}from\"react/jsx-runtime\";var Bp=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:s,fetchProducts:d,showCustomCategory:p=!1,emptyProductTabs:w=\"No tabs available\",emptyProductMessage:C,productsCountLabel:u,getCategoryId:x,history:g})=>{let b=Ap(\"(max-width:768px)\"),[f,c]=Jt(!0),[v,y]=Jt([]),[T,h]=Jt(!1),[P,M]=Jt(0),[E,O]=Jt([]),[I,U]=Jt(!1),[R,m]=Jt(!0),k=Vp(()=>{let l=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');m(l.length===0)},[]);ma(()=>{I&&k()},[I,k]),ma(()=>{s().then(l=>{y(l),h(!0)})},[s]),ma(()=>{if(T)if(v.length>0){let l=v[P]?.categoryId;x&&x(l),U(!0),d(l).then(O).finally(()=>{U(!1),c(!1)})}else U(!1)},[v,P,d,T]);let S=v.map(l=>({label:l.label,content:\"\",categoryId:l.categoryId}));return Hp(Wn,{isMobile:b,$hasCategories:v.length>0,children:[p&&(S.length>0?Zt(_n,{isMobile:b,children:Zt(fa,{itemArray:S,value:P,onChange:(l,D)=>M(D)})}):Zt(Un,{children:w})),Zt(Kn,{isMobile:b,children:I?Zt(Gn,{children:R&&Zt(zp,{})}):Zt(rr,{isInitialDataLoading:f,entries:E,allEntryLabel:e,allEntryLink:t,renderEntry:o?l=>o({...l,productStatusBadge:l.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:v[P]?.label,emptyProductMessage:C,productsCountLabel:u,history:g})})]})},Ep=Bp;import{useState as ir,useEffect as wa,useMemo as Up}from\"react\";import{Typography as Lt,Box as $t,useMediaQuery as Gp,Tooltip as jp}from\"@mui/material\";import{NsLink as Yp,NsImage as li}from\"@nuskin/foundation-ui-components\";import{styled as St}from\"@nuskin/foundation-theme\";import{Box as Ao}from\"@mui/material\";import{jsx as ya}from\"react/jsx-runtime\";var ha=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),Yn=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),Jn=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),jn=e=>({...ha(e),paddingBottom:\"11px\",wordBreak:\"break-all\",overflowWrap:\"break-word\",paddingLeft:\"5px\",\"& a\":{color:\"inherit\",textDecoration:\"none\"},\"@media (max-width: 420px)\":{fontSize:\"11px\",lineHeight:\"15px\",paddingBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"10px\",lineHeight:\"14px\",paddingBottom:\"6px\"},\"@media (max-width: 375px)\":{fontSize:\"8px\",lineHeight:\"12px\",paddingBottom:\"4px\"}}),Wp=e=>({...Yn(e),marginBottom:\"11px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\",\"@media (max-width: 420px)\":{fontSize:\"11px\",lineHeight:\"14px\",marginBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"10px\",lineHeight:\"12px\",marginBottom:\"5px\"},\"@media (max-width: 375px)\":{fontSize:\"8px\",lineHeight:\"11px\",marginBottom:\"4px\"}}),Zn=St(e=>ya(Ao,{...e}))(({bannerProps:e,isCircularImage:t,hasWhiteBackground:o})=>({backgroundClip:\"border-box\",display:\"flex\",background:e?.backgroundColor??\"#383838\",position:\"relative\",overflow:\"hidden\",width:\"100%\",height:\"auto\",flexDirection:\"row\",alignItems:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"transform, opacity\",transform:\"translateZ(0)\",backfaceVisibility:\"hidden\",\"&.scrolled\":{top:0,left:0,right:0,boxShadow:\"0 2px 8px rgba(0,0,0,0.2)\",\".content\":{paddingTop:\"0\",justifyContent:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-title\":{fontSize:\"26px\",lineHeight:\"34px\",marginBottom:\"0\",fontStyle:\"normal\",fontWeight:\"400\",fontFamily:e?.headlineFont??\"Lora\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image\":{width:\"90px\",height:\"90px\",padding:t?\"2px\":\"0px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image\":{\"& > div\":{width:\"90px\",height:\"90px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}}},\".content\":{width:\"70%\",height:\"100%\",marginLeft:\"2%\",marginRight:\"auto\",display:\"flex\",flexDirection:\"column\",position:\"relative\",boxSizing:\"border-box\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image\":{width:\"252px\",height:\"252px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",padding:t?\"3px\":\"0px\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",\"& > div\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}},\".body-title\":{fontSize:\"32px\",lineHeight:\"38px\",marginBottom:\"8px\",fontWeight:\"400\",color:o?\"#000000\":\"#FFFFFF\",overflow:\"hidden\",whiteSpace:\"nowrap\",textOverflow:\"ellipsis\",fontFamily:e?.headlineFont??\"Lora\",paddingLeft:\"5px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-text\":{fontSize:\"16px\",marginBottom:\"12px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"22px\",color:o?\"#000000\":\"#FFFFFF\",fontFamily:e?.paragraphFont??\"inherit\",display:\"-webkit-box\",WebkitBoxOrient:\"vertical\",overflow:\"hidden\",WebkitLineClamp:3,textOverflow:\"ellipsis\",paddingLeft:\"5px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\"},\".social-media\":{display:\"flex\",flexDirection:\"column\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\"},\".email-text\":ha(o),\".phone-text\":ha(o),\".social-title-text\":{...Yn(o),marginBottom:\"8px\"},\".social-icons\":{...Jn(),paddingBottom:\"8px\"}})),qn=St(e=>ya(Ao,{...e}))(({bannerProps:e,isCircularImage:t,hasWhiteBackground:o})=>({backgroundClip:\"border-box\",display:\"flex\",background:e?.backgroundColor??\"#383838\",position:\"relative\",overflow:\"hidden\",width:\"100%\",flexDirection:\"column\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"transform, opacity\",transform:\"translateZ(0)\",backfaceVisibility:\"hidden\",\"&.scrolled\":{top:0,left:0,right:0,boxShadow:\"0 2px 8px rgba(0,0,0,0.2)\",\".content-mobile\":{paddingTop:\"5px\",width:\"60%\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".body-title-mobile\":{fontSize:\"18px\",lineHeight:\"28px\",marginBottom:\"0\",fontStyle:\"normal\",fontWeight:\"400\",fontFamily:e?.headlineFont??\"Lora\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"},\".bg-image-mobile\":{width:\"75px\",height:\"75px\",padding:t?\"2px\":\"0px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",objectFit:\"cover\",objectPosition:\"center\"},\".placeholder-image-mobile\":{\"& > div\":{width:\"75px !important\",height:\"75px !important\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"}}},\".image-content-mobile\":{display:\"flex\",flexDirection:\"row\",width:\"100%\",justifyContent:\"center\",alignItems:\"center\"},\".content-mobile\":{width:\"55%\",height:\"100%\",paddingTop:\"10px\",paddingRight:\"10px\",marginLeft:\"8px\",marginRight:\"auto\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",position:\"relative\",boxSizing:\"border-box\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\"@media (max-width: 420px)\":{paddingTop:\"8px\",width:\"100%\"},\"@media (max-width: 400px)\":{paddingTop:\"6px\",width:\"100%\",height:\"100%\"},\"@media (max-width: 375px)\":{paddingTop:\"4px\",width:\"100%\",height:\"100%\"}},\".bg-image-mobile\":{width:\"144px\",height:\"144px\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",objectFit:\"cover\",objectPosition:\"center\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",padding:t?\"2px\":\"0px\",\"@media (max-width: 420px)\":{width:\"120px\",height:\"120px\"},\"@media (max-width: 400px)\":{width:\"112px\",height:\"112px\"},\"@media (max-width: 375px)\":{width:\"90px\",height:\"90px\"}},\".placeholder-image-mobile\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",willChange:\"width, height, transform\",\"& > div\":{transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",width:\"144px\",height:\"144px\",\"@media (max-width: 420px)\":{width:\"120px\",height:\"120px\"},\"@media (max-width: 400px)\":{width:\"110px !important\",height:\"110px !important\"},\"@media (max-width: 375px)\":{width:\"90px\",height:\"90px\"}}},\".body-title-mobile\":{fontSize:\"22px\",lineHeight:\"28px\",marginBottom:\"13px\",fontWeight:\"400\",color:o?\"#000000\":\"#FFFFFF\",fontStyle:\"normal\",overflow:\"hidden\",whiteSpace:\"nowrap\",textOverflow:\"ellipsis\",fontFamily:e?.headlineFont??\"Lora\",paddingLeft:\"5px\",transition:\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\"@media (max-width: 420px)\":{fontSize:\"16px\",lineHeight:\"24px\",marginBottom:\"8px\"},\"@media (max-width: 400px)\":{fontSize:\"16px\",lineHeight:\"22px\",marginBottom:\"6px\"},\"@media (max-width: 375px)\":{fontSize:\"14px\",lineHeight:\"20px\",marginBottom:\"4px\"}},\".body-text-mobile\":{fontSize:\"14px\",padding:\"20px 25px 20px 25px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"20px\",color:\"#252525\",backgroundColor:\"#E0E0E0\",fontFamily:e?.paragraphFont??\"inherit\",transition:\"all 0.25s cubic-bezier(0.4, 0, 0.2, 1)\",opacity:1,transform:\"translateY(0)\"},\".expandable-description-mobile\":{backgroundColor:\"#E0E0E0\",position:\"relative\"},\".description-content-mobile\":{fontSize:\"14px\",padding:\"10px 15px\",fontStyle:\"normal\",fontWeight:\"400\",lineHeight:\"20px\",color:\"#252525\",fontFamily:e?.paragraphFont??\"inherit\",transition:\"max-height 0.3s ease-in-out, opacity 0.3s ease-in-out\",overflow:\"hidden\",position:\"relative\",\"&.collapsed\":{maxHeight:\"50px\",display:\"-webkit-box\",WebkitLineClamp:2,WebkitBoxOrient:\"vertical\",\"&::after\":{content:'\"\"',position:\"absolute\",bottom:0,left:0,right:0,height:\"20px\",background:\"linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)\",pointerEvents:\"none\"}},\"&.expanded\":{maxHeight:\"none\",whiteSpace:\"normal\",display:\"block\",\"&::after\":{display:\"none\"}}},\".email-text-mobile\":jn(o),\".phone-text-mobile\":jn(o),\".social-title-text-mobile\":Wp(o),\".social-icons-mobile\":{...Jn(),paddingBottom:\"10px\",transition:\"opacity 0.3s ease-out, transform 0.3s ease-out\",opacity:1,transform:\"translateY(0)\",\"& img\":{width:\"24px\",height:\"24px\",\"@media (max-width: 400px)\":{width:\"20px\",height:\"20px\"},\"@media (max-width: 375px)\":{width:\"18px\",height:\"18px\"}},\"@media (max-width: 420px)\":{paddingBottom:\"8px\"},\"@media (max-width: 400px)\":{paddingBottom:\"4px\"},\"@media (max-width: 375px)\":{paddingBottom:\"3px\"}}})),Qn=St(Ao)({display:\"flex\",gap:\"12px\",marginBottom:\"16px\",paddingLeft:\"5px\",\"&.mobile-badges\":{flexDirection:\"column\",gap:\"8px\",marginBottom:\"12px\"},\"&.tablet-badges\":{flexDirection:\"row\",gap:\"12px\",marginBottom:\"8px\"}}),xa=St(e=>ya(Ao,{...e}))(({hasWhiteBackground:e})=>({backgroundColor:\"rgba(255, 255, 255, 0.2)\",backdropFilter:\"blur(10px)\",borderRadius:\"20px\",padding:\"8px 16px\",display:\"flex\",alignItems:\"center\",gap:\"4px\",border:\"1px solid rgba(255, 255, 255, 0.3)\",transition:\"all 0.3s ease\",\"&.mobile-badge\":{padding:\"6px 12px\",borderRadius:\"16px\",fontSize:\"12px\"},\"&.tablet-badge\":{padding:\"8px 16px\",borderRadius:\"20px\",fontSize:\"14px\"},\"&.total-savings-badge\":{backgroundColor:\"#4A6987\",border:\"none\",borderRadius:\"8px\",padding:\"8px 16px\",gap:\"4px\",minHeight:\"32px\",backdropFilter:\"none\",\".badge-value\":{color:\"#FFFFFF\"},\"&:hover\":{backgroundColor:\"#4A6987\",transform:\"none\",boxShadow:\"none\"}},\"&.expiration-badge\":{borderRadius:\"8px\",padding:\"8px 16px\",gap:\"4px\",minHeight:\"32px\"},\"&:hover\":{backgroundColor:\"rgba(255, 255, 255, 0.3)\",transform:\"translateY(-1px)\",boxShadow:\"0 4px 12px rgba(0, 0, 0, 0.1)\"},\".badge-text\":{color:e?\"#000000\":\"#FFFFFF\",fontWeight:\"400\",opacity:.9},\".badge-value\":{color:e?\"#000000\":\"#FFFFFF\",fontWeight:\"600\"}})),Xn=St(\"button\")({backgroundColor:\"#E0E0E0\",border:\"1px solid #252525\",borderRadius:\"10px\",cursor:\"pointer\",width:\"40px\",height:\"20px\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",margin:\"10px auto 5px auto\",transition:\"all 0.2s ease\",\"& .arrow-icon-mobile\":{transition:\"transform 0.3s ease\",\"&.expanded\":{transform:\"rotate(180deg)\"}}}),ei=St(Ao)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`,ti=St(\"span\")`\n line-height: 0.5;\n`,oi=St(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),ba=St(\"span\")({});import{Box as _p}from\"@mui/material\";import{jsx as qt,jsxs as Kp}from\"react/jsx-runtime\";var ri=({width:e,height:t,backgroundColor:o})=>qt(_p,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:qt(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:Kp(\"g\",{id:\"ns_logomark\",children:[qt(\"path\",{id:\"Vector\",d:\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\",fill:\"#252525\"}),qt(\"path\",{id:\"Vector_2\",d:\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\",fill:\"#252525\"}),qt(\"path\",{id:\"Vector_3\",d:\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\",fill:\"#252525\"}),qt(\"path\",{id:\"Vector_4\",d:\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\",fill:\"#252525\"}),qt(\"path\",{id:\"Vector_5\",d:\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\",fill:\"#252525\"})]})})});import{jsx as ai}from\"react/jsx-runtime\";var ni=({width:e=16,height:t=16,className:o=\"\"})=>ai(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:ai(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function nr(e){if(typeof window>\"u\")return;let t=window.location.href,o={...e},n=t.includes(\"personal-offer\")?\"postorefront_\":\"mysite_\";o.event=n+e.event;try{window.dataLayer||(console.error(\"GTM dataLayer not available, but event logged\"),window.dataLayer=[]),window.dataLayer.push(o)}catch(i){console.error(\"Failed to track GTM event:\",i)}}import{Fragment as pi,jsx as Z,jsxs as Xe}from\"react/jsx-runtime\";var ii=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?Z(ti,{tabIndex:0,children:Z(li,{className:o,src:e.imageSrc,alt:e.imageAlt})}):Z($t,{className:n,children:Z(ri,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},si=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let s=o?\"mobile-badge\":\"tablet-badge\";return Xe(Qn,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&Z(xa,{className:`${s} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:Z(ba,{className:\"badge-value\",children:i})}),t&&Z(xa,{className:`${s} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:Z(ba,{className:\"badge-value\",children:t})})]})},Jp=(e,t,o,n,i)=>{let{shopTitle:s,socialTitleText:d,email:p,showBadges:w,expirationDate:C,phone:u,totalSavings:x}=e;return Xe($t,{className:\"content-mobile\",children:[Z(Lt,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title-mobile\",children:s}),!t&&Xe(pi,{children:[Z(Lt,{tabIndex:d?.trim()?0:-1,className:\"social-title-text-mobile\",children:d}),p?.trim()&&lr(\"email\",p,\"email-text-mobile\"),u?.trim()&&lr(\"phone\",u,\"phone-text-mobile\"),Z($t,{className:\"social-icons-mobile\",children:o}),si(w,C??\"\",n,i,x)]})]})},Zp=(e,t,o,n,i)=>{let{shopTitle:s,shopDescription:d,socialTitleText:p,email:w,phone:C,showBadges:u,expirationDate:x,totalSavings:g}=e;return Xe($t,{className:\"content\",children:[Z(Lt,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title\",children:s}),!t&&Xe(pi,{children:[d?.length>480?Z(jp,{title:d,arrow:!0,children:Z(Lt,{tabIndex:d?.trim()?0:-1,className:\"body-text\",children:d})}):Z(Lt,{tabIndex:d?.trim()?0:-1,className:\"body-text\",children:d}),Xe($t,{className:\"social-media\",children:[Z(Lt,{tabIndex:p?.trim()?0:-1,className:\"social-title-text\",children:p}),Xe($t,{className:\"social-icons\",children:[o,w?.trim()&&lr(\"email\",w,\"email-text\"),C?.trim()&&lr(\"phone\",C,\"phone-text\")]})]}),si(u,x??\"\",n,i,g)]})]})},qp=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),s=i.getContext(\"2d\");if(!s)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,s.drawImage(n,0,0);let p=[s.getImageData(0,0,1,1).data,s.getImageData(n.width-1,0,1,1).data,s.getImageData(0,n.height-1,1,1).data,s.getImageData(n.width-1,n.height-1,1,1).data].every(w=>Array.prototype.slice.call(w)[3]<10);t(p)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),Qp=e=>{if(!e)return!1;let t=e.replace(\"#\",\"\").toLowerCase();if(!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(t))return!1;let o=t;(t.length===3||t.length===4)&&(o=t.split(\"\").map(p=>p+p).join(\"\"));let n=Number.parseInt(o.substring(0,2),16),i=Number.parseInt(o.substring(2,4),16),s=Number.parseInt(o.substring(4,6),16),d=220;return n>=d&&i>=d&&s>=d},Xp=(e,t)=>({onClick:()=>{nr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),nr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),lr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=Xp(e,t);return Z(Lt,{className:o,children:Z(oi,{href:`${n}${t}`,...i,children:t})})};function di({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:s,phone:d,bannerProps:p,socialIcons:w,expirationDate:C,showBadges:u=!1,totalSavings:x}){let g=Gp(\"(max-width: 560px)\"),[b,f]=ir(!1),[c,v]=ir(!1),[y,T]=ir(!1),[h,P]=ir(!1),M=()=>{v(!c)};wa(()=>{(async()=>{if(i?.imageSrc){let k=await qp(i.imageSrc);P(k)}else P(!1)})()},[i?.imageSrc]),wa(()=>{T(Qp(p?.backgroundColor))},[p?.backgroundColor]),wa(()=>{let m,k=window.scrollY,S=!1,l=!1,D=0,H=J=>{let Je=Date.now();if(S!==J&&!l){if(Je-D<100)return;l=!0,S=J,D=Je,J&&v(!1),clearTimeout(m),f(J),m=setTimeout(()=>{l=!1,J&&window.scrollY<15&&window.scrollTo({top:g?20:30,behavior:\"smooth\"})},300)}},ce=()=>{let J=window.scrollY;if(l){k=J;return}if(Math.abs(J-k)<.5)return;let He=J>k,po=g?15:25,co=g?8:12;He&&J>po&&!S?H(!0):!He&&J<co&&S&&H(!1),k=J},te=()=>{let J=window.scrollY,He=J>(g?5:10);S=He,f(He),k=J,D=Date.now()},Me=null,Ct=0,Ee=()=>{Me||Date.now()-Ct<16||(Me=requestAnimationFrame(()=>{ce(),Ct=Date.now(),Me=null}))};return te(),window.addEventListener(\"scroll\",Ee,{passive:!0}),()=>{window.removeEventListener(\"scroll\",Ee),Me&&cancelAnimationFrame(Me),clearTimeout(m)}},[g]);let E=Up(()=>w?.map((m,k)=>Z(ei,{onClick:l=>{l.preventDefault(),nr({event:\"social_click\",social_platform:m.type,social_url:m.url,click_element:\"social_icon\"}),window.open(m.url,\"_blank\")},children:Z(Yp,{href:m.url,target:\"_blank\",children:Z(li,{src:`https://www.google.com/s2/favicons?domain=${m?.url}&sz=24`,alt:`${m.type} icon`,width:\"24\",height:\"24\"},m?.type+k)})},m?.type+k)),[w]),O=`${e} ${b?\"scrolled\":\"\"}`,I={shopTitle:t,shopDescription:o,socialTitleText:n,email:s,phone:d,showBadges:u,expirationDate:C,totalSavings:x},U=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,R=g&&o&&o.length>U();return g?Xe(qn,{className:O,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:h,hasWhiteBackground:y,children:[Xe($t,{className:\"image-content-mobile\",children:[ii(i,p??{},\"bg-image-mobile\"),Jp(I,b,E,g,y)]}),!b&&Xe($t,{className:\"expandable-description-mobile\",children:[Z(Lt,{className:`description-content-mobile ${c||!R?\"expanded\":\"collapsed\"}`,children:o}),R&&Z(Xn,{onClick:M,children:Z(ni,{width:16,height:16,className:`arrow-icon-mobile ${c?\"expanded\":\"\"}`})})]})]}):Xe(Zn,{className:O,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:h,hasWhiteBackground:y,children:[ii(i,p??{},\"bg-image\"),Zp(I,b,E,g,y)]})}import{styled as zo}from\"@nuskin/foundation-theme\";var Ca=zo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 32px;\n }\n`,ci=zo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,ui=zo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,va=zo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`,gi=zo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import rc from\"@mui/icons-material/CalendarToday\";import ac from\"@mui/icons-material/Public\";import{NsSpinner as nc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as ec,styled as Ke}from\"@nuskin/foundation-theme\";var{getGenomeColor:et}=ec,fi=Ke(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>et(e,\"N20\")};\n border-radius: 12px;\n min-height: 64px;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px 32px;\n }\n`,mi=Ke(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,hi=Ke(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>et(e,\"N100\")};\n margin: 0;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n\n @media (min-width: 1080px) {\n font-size: 16px;\n }\n`,xi=Ke(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>et(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,bi=Ke(\"div\")`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,ka=Ke(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,Sa=Ke(\"label\")`\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n color: ${({theme:e})=>et(e,\"N80\")};\n white-space: nowrap;\n display: none;\n\n @media (min-width: 1080px) {\n display: block;\n }\n`,Ta=Ke(\"select\")`\n display: flex;\n align-items: center;\n gap: 12px;\n height: 40px;\n padding: 8px 12px;\n background-color: transparent;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>et(e,\"N70\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;charset=UTF-8,%3csvg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M5.625 7.3125L9 10.6875L12.375 7.3125\" stroke=\"%235f5f5f\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/%3e%3c/svg%3e');\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 32px;\n min-width: auto;\n\n &:hover {\n background-color: ${({theme:e})=>et(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>et(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>et(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n @media (min-width: 768px) {\n min-width: 160px;\n }\n\n @media (min-width: 1080px) {\n background-color: ${({theme:e})=>et(e,\"N10\")};\n border: 1px solid ${({theme:e})=>et(e,\"N40\")};\n border-radius: 8px;\n min-width: 180px;\n }\n`,Da=Ke(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>et(e,\"N70\")};\n\n svg {\n width: 16px;\n height: 16px;\n }\n`,yi=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n overflow: hidden;\n\n svg,\n img,\n > * {\n width: 28px !important;\n height: 28px !important;\n max-width: 28px;\n max-height: 28px;\n }\n`,wi=Ke(\"div\")`\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,Xm=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var sr;function Bo(e){sr=e}function tc(){return sr}function Qt(e){if(!sr)return e.fallback;let t;try{t=sr(e.key,e.fallback)}catch{t=void 0}return typeof t==\"string\"&&t.length>0?t:e.fallback}var r={title:{key:\"shoppingDashboard.title\",fallback:\"Shop Performance\"},error:{key:\"shoppingDashboard.error\",fallback:\"Error loading dashboard\"},stats:{revenue:{key:\"shoppingDashboard.stats.revenue\",fallback:\"Total Revenue\"},volume:{key:\"shoppingDashboard.stats.volume\",fallback:\"Volume\"},visits:{key:\"shoppingDashboard.stats.visits\",fallback:\"Site Visits\"},subtitle:{dcSv:{key:\"shoppingDashboard.stats.subtitle.dcSv\",fallback:\"DC-SV\"},conversionRate:{key:\"shoppingDashboard.stats.subtitle.conversionRate\",fallback:\"Conversion Rate\"}},trend:{increased:{key:\"shoppingDashboard.stats.trend.increased\",fallback:\"increased\"},decreased:{key:\"shoppingDashboard.stats.trend.decreased\",fallback:\"decreased\"},unchanged:{key:\"shoppingDashboard.stats.trend.unchanged\",fallback:\"unchanged\"}},details:{key:\"shoppingDashboard.stats.details\",fallback:\"details\"}},filter:{dateRange:{label:{key:\"shoppingDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"shoppingDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"shoppingDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"shoppingDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"shoppingDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},dateRangeLabel:{key:\"shoppingDashboard.filter.dateRangeLabel\",fallback:\"Date Range\"},market:{label:{key:\"shoppingDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"shoppingDashboard.filter.market.all\",fallback:\"All Markets\"}},marketLabel:{key:\"shoppingDashboard.filter.marketLabel\",fallback:\"Market\"},productSort:{label:{key:\"shoppingDashboard.filter.productSort.label\",fallback:\"Sort By\"},units:{key:\"shoppingDashboard.filter.productSort.units\",fallback:\"Units\"},revenue:{key:\"shoppingDashboard.filter.productSort.revenue\",fallback:\"Revenue\"},volume:{key:\"shoppingDashboard.filter.productSort.volume\",fallback:\"Volume\"},byUnits:{key:\"shoppingDashboard.filter.productSort.byUnits\",fallback:\"By: Units\"},byRevenue:{key:\"shoppingDashboard.filter.productSort.byRevenue\",fallback:\"By: Revenue\"},byVolume:{key:\"shoppingDashboard.filter.productSort.byVolume\",fallback:\"By: Volume\"}},signupView:{label:{key:\"shoppingDashboard.filter.signupView.label\",fallback:\"Show\"},all:{key:\"shoppingDashboard.filter.signupView.all\",fallback:\"All\"},members:{key:\"shoppingDashboard.filter.signupView.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.filter.signupView.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.filter.signupView.brandAffiliates\",fallback:\"Brand Affiliates\"},showAll:{key:\"shoppingDashboard.filter.signupView.showAll\",fallback:\"Show: All\"},showMembers:{key:\"shoppingDashboard.filter.signupView.showMembers\",fallback:\"Show: Members\"},showRetail:{key:\"shoppingDashboard.filter.signupView.showRetail\",fallback:\"Show: Retail\"},showBrandAffiliates:{key:\"shoppingDashboard.filter.signupView.showBrandAffiliates\",fallback:\"Show: Brand Affiliates\"}},conversionType:{all:{key:\"shoppingDashboard.filter.conversionType.all\",fallback:\"All\"},standard:{key:\"shoppingDashboard.filter.conversionType.standard\",fallback:\"Standard\"},subscription:{key:\"shoppingDashboard.filter.conversionType.subscription\",fallback:\"Subscription\"}},categorySort:{byRevenue:{key:\"shoppingDashboard.filter.categorySort.byRevenue\",fallback:\"By: Revenue\"},byTrend:{key:\"shoppingDashboard.filter.categorySort.byTrend\",fallback:\"By: Trend\"}}},widget:{topProducts:{title:{key:\"shoppingDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},viewAll:{key:\"shoppingDashboard.widget.topProducts.viewAll\",fallback:\"View All Products\"},units:{key:\"shoppingDashboard.widget.topProducts.units\",fallback:\"Units\"},revenue:{key:\"shoppingDashboard.widget.topProducts.revenue\",fallback:\"Revenue\"},loading:{key:\"shoppingDashboard.widget.topProducts.loading\",fallback:\"Loading products...\"},empty:{key:\"shoppingDashboard.widget.topProducts.empty\",fallback:\"No products available\"},ariaLabel:{key:\"shoppingDashboard.widget.topProducts.ariaLabel\",fallback:\"Top Selling Products widget\"},titleAriaLabel:{key:\"shoppingDashboard.widget.topProducts.titleAriaLabel\",fallback:\"Click to view full top products details page\"},sortAriaLabel:{key:\"shoppingDashboard.widget.topProducts.sortAriaLabel\",fallback:\"Sort products by\"},noImageAriaLabel:{key:\"shoppingDashboard.widget.topProducts.noImageAriaLabel\",fallback:\"No image available\"},unitsSuffix:{key:\"shoppingDashboard.widget.topProducts.unitsSuffix\",fallback:\"units\"},revenueSuffix:{key:\"shoppingDashboard.widget.topProducts.revenueSuffix\",fallback:\"revenue\"},dcSvSuffix:{key:\"shoppingDashboard.widget.topProducts.dcSvSuffix\",fallback:\"DC-SV\"},rank:{key:\"shoppingDashboard.widget.topProducts.rank\",fallback:\"Rank\"},trend:{key:\"shoppingDashboard.widget.topProducts.trend\",fallback:\"Trend\"}},conversionRate:{title:{key:\"shoppingDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},formula:{key:\"shoppingDashboard.widget.conversionRate.formula\",fallback:\"Orders \\xF7 Site visits\"},comparison:{key:\"shoppingDashboard.widget.conversionRate.comparison\",fallback:\"compared to this time last month\"},chartAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.chartAriaLabel\",fallback:\"Conversion Rate chart showing daily rates\"},titleAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.titleAriaLabel\",fallback:\"Click to view full conversion rate details page\"},filterAriaLabel:{key:\"shoppingDashboard.widget.conversionRate.filterAriaLabel\",fallback:\"Filter conversion rate by customer type\"},noData:{key:\"shoppingDashboard.widget.conversionRate.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.widget.conversionRate.noChange\",fallback:\"No change\"},tooltipOrders:{key:\"shoppingDashboard.widget.conversionRate.tooltipOrders\",fallback:\"orders\"},tooltipVisits:{key:\"shoppingDashboard.widget.conversionRate.tooltipVisits\",fallback:\"visits\"},ordersPerSiteVisits:{key:\"shoppingDashboard.widget.conversionRate.ordersPerSiteVisits\",fallback:\"Orders / Site Visits\"}},signups:{title:{key:\"shoppingDashboard.widget.signups.title\",fallback:\"Sign-ups\"},total:{key:\"shoppingDashboard.widget.signups.total\",fallback:\"Total\"},members:{key:\"shoppingDashboard.widget.signups.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.widget.signups.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.widget.signups.brandAffiliates\",fallback:\"Brand Affiliates\"},chartAriaLabel:{key:\"shoppingDashboard.widget.signups.chartAriaLabel\",fallback:\"Signups multi-line chart showing Total, Members, Retail, and Brand Affiliates\"},titleAriaLabel:{key:\"shoppingDashboard.widget.signups.titleAriaLabel\",fallback:\"Click to view full signups details page\"},filterAriaLabel:{key:\"shoppingDashboard.widget.signups.filterAriaLabel\",fallback:\"Filter signups view\"},noData:{key:\"shoppingDashboard.widget.signups.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.widget.signups.noChange\",fallback:\"No change\"},totalSignupsInPeriod:{key:\"shoppingDashboard.widget.signups.totalSignupsInPeriod\",fallback:\"Total sign-ups in period\"},noTrendData:{key:\"shoppingDashboard.widget.signups.noTrendData\",fallback:\"No sign-up trend data available.\"}},topCategories:{title:{key:\"shoppingDashboard.widget.topCategories.title\",fallback:\"Top Categories\"},revenue:{key:\"shoppingDashboard.widget.topCategories.revenue\",fallback:\"Revenue\"},units:{key:\"shoppingDashboard.widget.topCategories.units\",fallback:\"Units\"},empty:{key:\"shoppingDashboard.widget.topCategories.empty\",fallback:\"No category data available\"},chartAriaLabel:{key:\"shoppingDashboard.widget.topCategories.chartAriaLabel\",fallback:\"Top Categories donut chart showing revenue distribution by category\"},titleAriaLabel:{key:\"shoppingDashboard.widget.topCategories.titleAriaLabel\",fallback:\"Click to view full categories details page\"},sortAriaLabel:{key:\"shoppingDashboard.widget.topCategories.sortAriaLabel\",fallback:\"Sort categories by\"}},menu:{ariaLabel:{key:\"shoppingDashboard.widget.menu.ariaLabel\",fallback:\"widget options\"},fullView:{key:\"shoppingDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{backToDashboard:{key:\"shoppingDashboard.navigation.backToDashboard\",fallback:\"Back to Dashboard\"},backAriaLabel:{key:\"shoppingDashboard.navigation.backAriaLabel\",fallback:\"Back to dashboard\"}},ariaLabel:{dashboard:{key:\"shoppingDashboard.ariaLabel.dashboard\",fallback:\"Shopping Dashboard\"},statsRow:{key:\"shoppingDashboard.ariaLabel.statsRow\",fallback:\"Key performance metrics\"},dashboardFilters:{key:\"shoppingDashboard.ariaLabel.dashboardFilters\",fallback:\"Dashboard filters\"},loadingDashboard:{key:\"shoppingDashboard.ariaLabel.loadingDashboard\",fallback:\"Loading dashboard data\"},dateRangeFilter:{key:\"shoppingDashboard.ariaLabel.dateRangeFilter\",fallback:\"Date range filter, currently selected:\"},marketFilter:{key:\"shoppingDashboard.ariaLabel.marketFilter\",fallback:\"Market filter, currently selected:\"},filterSuffix:{key:\"shoppingDashboard.ariaLabel.filterSuffix\",fallback:\"filter\"}},fullView:{signups:{columns:{id:{key:\"shoppingDashboard.fullView.signups.columns.id\",fallback:\"ID\"},name:{key:\"shoppingDashboard.fullView.signups.columns.name\",fallback:\"Name\"},date:{key:\"shoppingDashboard.fullView.signups.columns.date\",fallback:\"Date\"},type:{key:\"shoppingDashboard.fullView.signups.columns.type\",fallback:\"Type\"},email:{key:\"shoppingDashboard.fullView.signups.columns.email\",fallback:\"Email\"},status:{key:\"shoppingDashboard.fullView.signups.columns.status\",fallback:\"Status\"}},detailsTitle:{key:\"shoppingDashboard.fullView.signups.detailsTitle\",fallback:\"Signup Details\"}},conversionRate:{columns:{orderId:{key:\"shoppingDashboard.fullView.conversionRate.columns.orderId\",fallback:\"Order ID\"},date:{key:\"shoppingDashboard.fullView.conversionRate.columns.date\",fallback:\"Date\"},customer:{key:\"shoppingDashboard.fullView.conversionRate.columns.customer\",fallback:\"Customer\"},type:{key:\"shoppingDashboard.fullView.conversionRate.columns.type\",fallback:\"Type\"},items:{key:\"shoppingDashboard.fullView.conversionRate.columns.items\",fallback:\"Items\"},total:{key:\"shoppingDashboard.fullView.conversionRate.columns.total\",fallback:\"Order Total\"},bv:{key:\"shoppingDashboard.fullView.conversionRate.columns.bv\",fallback:\"BV\"},orderTotal:{key:\"shoppingDashboard.fullView.conversionRate.columns.orderTotal\",fallback:\"Order Total\"},totalSv:{key:\"shoppingDashboard.fullView.conversionRate.columns.totalSv\",fallback:\"Total SV\"}},orderDetailsTitle:{key:\"shoppingDashboard.fullView.conversionRate.orderDetailsTitle\",fallback:\"Order Details\"},notAvailable:{key:\"shoppingDashboard.fullView.conversionRate.notAvailable\",fallback:\"N/A\"}},products:{columns:{rank:{key:\"shoppingDashboard.fullView.products.columns.rank\",fallback:\"#\"},product:{key:\"shoppingDashboard.fullView.products.columns.product\",fallback:\"Product\"},unitsSold:{key:\"shoppingDashboard.fullView.products.columns.unitsSold\",fallback:\"Units Sold\"},revenue:{key:\"shoppingDashboard.fullView.products.columns.revenue\",fallback:\"Revenue\"},volume:{key:\"shoppingDashboard.fullView.products.columns.volume\",fallback:\"Volume (DC-SV)\"}},skuPrefix:{key:\"shoppingDashboard.fullView.products.skuPrefix\",fallback:\"SKU\"},noProducts:{key:\"shoppingDashboard.fullView.products.noProducts\",fallback:\"No products available.\"}},categories:{columns:{category:{key:\"shoppingDashboard.fullView.categories.columns.category\",fallback:\"Category\"},revenue:{key:\"shoppingDashboard.fullView.categories.columns.revenue\",fallback:\"Revenue\"},percentOfTotal:{key:\"shoppingDashboard.fullView.categories.columns.percentOfTotal\",fallback:\"% of Total\"},trend:{key:\"shoppingDashboard.fullView.categories.columns.trend\",fallback:\"Trend\"}},allCategoriesTitle:{key:\"shoppingDashboard.fullView.categories.allCategoriesTitle\",fallback:\"All Categories\"},noCategoryData:{key:\"shoppingDashboard.fullView.categories.noCategoryData\",fallback:\"No category data available.\"}}},dataTable:{noDataAvailable:{key:\"shoppingDashboard.dataTable.noDataAvailable\",fallback:\"No data available\"},sortableColumn:{key:\"shoppingDashboard.dataTable.sortableColumn\",fallback:\", sortable column\"}},pagination:{previousPage:{key:\"shoppingDashboard.pagination.previousPage\",fallback:\"Previous page\"},nextPage:{key:\"shoppingDashboard.pagination.nextPage\",fallback:\"Next page\"},goToPage:{key:\"shoppingDashboard.pagination.goToPage\",fallback:\"Go to page\"},of:{key:\"shoppingDashboard.pagination.of\",fallback:\"of\"}},defaults:{zeroTrend:{key:\"shoppingDashboard.defaults.zeroTrend\",fallback:\"+0%\"},noValue:{key:\"shoppingDashboard.defaults.noValue\",fallback:\"--\"}}};function a(e){return Qt(e)}import{useMemo as oc}from\"react\";function Ci(){return[{value:\"all\",label:a(r.filter.market.all)}]}function vi(e){return e&&e.length>0?e:Ci()}function Ue(e){return oc(()=>vi(e),[e])}import{jsx as be,jsxs as fo}from\"react/jsx-runtime\";var Eo=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:s,markets:d,onDateRangeChange:p,onMarketChange:w})=>{let C=Ue(d),u=f=>{let c=f.target.value;p?.(c)},x=f=>{let c=f.target.value;w?.(c)},g=f=>{f.key===\"Escape\"&&f.target.blur()},b=()=>n||(s?.dateRange?s.dateRange.label:a(r.filter.dateRange.last30days));return fo(fi,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[fo(mi,{children:[be(hi,{\"data-testid\":\"dashboard-shop-title\",children:e??s?.shopTitle??a(r.title)}),be(xi,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:b()})]}),be(bi,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:fo(wi,{children:[i&&be(yi,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:be(nc,{})}),fo(ka,{children:[be(Sa,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRangeLabel)}),be(Da,{\"aria-hidden\":\"true\",children:be(rc,{})}),fo(Ta,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:u,onKeyDown:g,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[be(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),be(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),be(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),be(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),fo(ka,{children:[be(Sa,{htmlFor:\"filter-market\",children:a(r.filter.marketLabel)}),be(Da,{\"aria-hidden\":\"true\",children:be(ac,{})}),be(Ta,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:x,onKeyDown:g,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${C.find(f=>f.value===o)?.label??String(o)}`,children:C.map(f=>be(\"option\",{value:f.value,children:f.label},f.value))})]})]})})]})};import fc from\"react\";import mc from\"@mui/icons-material/ShowChart\";import hc from\"@mui/icons-material/TrendingUp\";import xc from\"@mui/icons-material/TrendingDown\";import{ColorUtils as ic,styled as Te}from\"@nuskin/foundation-theme\";var{getGenomeColor:Tt}=ic,dr=Te(\"div\")`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-sizing: border-box;\n gap: ${({$layout:e})=>e===\"split\"?\"8px\":\"0\"};\n padding: ${({$layout:e})=>e===\"split\"?\"16px\":\"12px\"};\n background-color: ${({theme:e})=>Tt(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Tt(e,\"N30\")};\n border-radius: 8px;\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"120px\"};\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n @media (min-width: 768px) {\n padding: ${({$layout:e})=>e===\"split\"?\"24px\":\"20px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"140px\"};\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n min-height: ${({$layout:e})=>e===\"split\"?\"127px\":\"160px\"};\n }\n`,ki=Te(\"div\")`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>Tt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,Si=Te(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,Ti=Te(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,Di=Te(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#9b131a\":Tt(e,\"N70\")};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`,Pi=Te(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n letter-spacing: 0.12px;\n text-align: right;\n color: ${({theme:e})=>Tt(e,\"N70\")};\n`,Ri=Te(\"div\")`\n font-size: 20px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>Tt(e,\"N100\")};\n margin-bottom: 4px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 20px;\n margin-bottom: 6px;\n }\n\n @media (min-width: 1080px) {\n font-size: 20px;\n }\n`,Mi=Te(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-top: 8px;\n width: 100%;\n`,Pa=Te(\"div\")`\n font-size: 24px;\n font-weight: 700;\n line-height: 1.2;\n color: ${({theme:e})=>Tt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 28px;\n }\n\n @media (min-width: 1080px) {\n font-size: 32px;\n }\n`,Oi=Te(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,Fi=Te(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: normal;\n color: ${({theme:e})=>Tt(e,\"N70\")};\n padding-bottom: 2px;\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,Li=Te(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#22C55E\":t===\"down\"?\"#DC2626\":Tt(e,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 14px;\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n`,hh=Te(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ra=Te(\"span\")`\n white-space: nowrap;\n`,$i=Te(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import j from\"@mui/material/Skeleton\";import{styled as _}from\"@nuskin/foundation-theme\";import Ho from\"@mui/material/Skeleton\";var pr=_(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,cr=_(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 12px;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,Ii=_(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n padding: 14px 0;\n }\n`,Ni=_(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 12px;\n border-radius: 8px;\n min-height: 120px;\n\n @media (min-width: 600px) {\n padding: 20px;\n min-height: 140px;\n }\n @media (min-width: 900px) {\n padding: 24px;\n min-height: 160px;\n }\n`,Vi=_(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,Ai=_(\"div\")`\n margin-top: 8px;\n`,zi=_(Ho)`\n margin-top: 4px;\n`,Bi=_(\"div\")`\n flex: 1;\n min-width: 0;\n`,Ei=_(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,Hi=_(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,Wi=_(\"div\")`\n padding-top: 4px;\n`,_i=_(Ho)`\n border-radius: 8px;\n height: 220px;\n\n @media (min-width: 600px) {\n height: 280px;\n }\n @media (min-width: 900px) {\n height: 340px;\n }\n`,Ki=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n @media (min-width: 600px) {\n flex-direction: row;\n gap: 24px;\n }\n`,Ui=_(Ho)`\n width: 100%;\n height: 200px;\n border-radius: 8px;\n flex-shrink: 0;\n\n @media (min-width: 600px) {\n width: 200px;\n border-radius: 50%;\n }\n`,Gi=_(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,ji=_(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,Yi=_(\"div\")`\n flex: 1;\n`,lc=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n @media (min-width: 600px) {\n gap: 32px;\n }\n @media (min-width: 900px) {\n gap: 40px;\n }\n`,sc=_(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,dc=_(\"div\")`\n display: flex;\n gap: 16px;\n`,pc=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n @media (min-width: 900px) {\n gap: 24px;\n }\n`,cc=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 900px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`,Ma=_(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,Ji=_(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,Zi=_(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,qi=_(Ho)`\n border-radius: 8px;\n height: 260px;\n\n @media (min-width: 600px) {\n height: 320px;\n }\n @media (min-width: 900px) {\n height: 400px;\n }\n`,Oa=_(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,ur=_(Ho)`\n border-radius: 4px;\n`,Qi=_(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n`;import{jsx as $,jsxs as q}from\"react/jsx-runtime\";var Wo=()=>q(Ni,{\"data-testid\":\"skeleton-stats-card\",children:[q(Vi,{children:[$(j,{variant:\"text\",width:80,height:18}),$(j,{variant:\"text\",width:48,height:16})]}),q(Ai,{children:[$(j,{variant:\"text\",width:120,height:36}),$(zi,{variant:\"text\",width:100,height:16})]})]}),uc=()=>q(Ii,{children:[$(j,{variant:\"rounded\",width:28,height:28}),$(j,{variant:\"rounded\",width:50,height:50}),q(Bi,{children:[$(j,{variant:\"text\",width:\"70%\",height:18}),$(j,{variant:\"text\",width:\"50%\",height:14})]}),q(Ei,{children:[$(j,{variant:\"text\",width:80,height:18}),$(j,{variant:\"text\",width:48,height:14})]})]}),Xi=()=>q(pr,{\"data-testid\":\"skeleton-products-list\",children:[q(cr,{children:[$(j,{variant:\"text\",width:160,height:22}),$(j,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>$(uc,{},e))]}),gr=()=>q(pr,{\"data-testid\":\"skeleton-chart-widget\",children:[q(cr,{children:[$(j,{variant:\"text\",width:140,height:22}),$(j,{variant:\"rounded\",width:110,height:32})]}),q(Hi,{children:[$(j,{variant:\"text\",width:100,height:36}),q(Wi,{children:[$(j,{variant:\"text\",width:60,height:18}),$(j,{variant:\"text\",width:140,height:14})]})]}),$(_i,{variant:\"rounded\",width:\"100%\"})]}),gc=()=>q(ji,{children:[$(j,{variant:\"circular\",width:12,height:12}),q(Yi,{children:[$(j,{variant:\"text\",width:\"60%\",height:16}),$(j,{variant:\"text\",width:\"40%\",height:14})]}),$(j,{variant:\"text\",width:36,height:18})]}),fr=()=>q(pr,{\"data-testid\":\"skeleton-categories-pie\",children:[q(cr,{children:[$(j,{variant:\"text\",width:140,height:22}),$(j,{variant:\"rounded\",width:100,height:32})]}),q(Ki,{children:[$(Ui,{variant:\"circular\"}),$(Gi,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>$(gc,{},e))})]})]});var It=()=>q(Ma,{\"data-testid\":\"skeleton-fullview-chart\",children:[q(Ji,{children:[q(Zi,{children:[$(j,{variant:\"text\",width:140,height:52}),$(j,{variant:\"text\",width:80,height:24}),$(j,{variant:\"text\",width:160,height:16})]}),$(qi,{variant:\"rounded\",width:\"100%\"})]}),q(Oa,{children:[$(j,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>$(ur,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),el=()=>q(Ma,{\"data-testid\":\"skeleton-fullview-table\",children:[q(Qi,{children:[$(Wo,{}),$(Wo,{}),$(Wo,{})]}),q(Oa,{children:[$(j,{variant:\"text\",width:200,height:24}),$(ur,{variant:\"rounded\",width:\"100%\",height:40}),[\"summary-row-1\",\"summary-row-2\",\"summary-row-3\",\"summary-row-4\",\"summary-row-5\",\"summary-row-6\",\"summary-row-7\",\"summary-row-8\"].map(e=>$(ur,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as Le,jsxs as Nt}from\"react/jsx-runtime\";var bc=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:s=\"neutral\",trendValue:d,testId:p,isLoading:w=!1})=>{if(w)return Le(dr,{$layout:i,\"data-testid\":p,children:Le(Wo,{})});let C=()=>{let x=a(r.stats.trend.unchanged);return s===\"up\"?x=a(r.stats.trend.increased):s===\"down\"&&(x=a(r.stats.trend.decreased)),`${e} ${x} ${d??\"\"}`},u=x=>s===\"up\"?Le(hc,{sx:{fontSize:x},\"aria-hidden\":\"true\"}):s===\"down\"?Le(xc,{sx:{fontSize:x},\"aria-hidden\":\"true\"}):Le(mc,{sx:{fontSize:x},\"aria-hidden\":\"true\"});return i===\"split\"?Nt(dr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Le(ki,{id:`stats-title-${p}`,children:e}),Nt(Si,{children:[Le(Pa,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),(d??n)&&Nt(Ti,{children:[d&&Nt(Di,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":C(),\"data-testid\":`stats-trend-${p}`,children:[u(\"18px\"),Le(Ra,{children:d})]}),n&&Le(Pi,{\"data-testid\":`stats-caption-${p}`,children:n})]})]})]}):Nt(dr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Le($i,{children:Le(Ri,{id:`stats-title-${p}`,children:e})}),Nt(Mi,{children:[Nt(Oi,{children:[Le(Pa,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),o&&Le(Fi,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${p}`,children:o})]}),d&&Nt(Li,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":C(),\"data-testid\":`stats-trend-${p}`,children:[u(\"16px\"),Le(Ra,{children:d})]})]})]})},Dt=fc.memo(bc);Dt.displayName=\"StatsCard\";import Vc from\"react\";import Ac from\"@mui/icons-material/ShoppingCart\";import zc from\"@mui/icons-material/ShowChart\";import Bc from\"@mui/icons-material/TrendingUp\";import Ec from\"@mui/icons-material/TrendingDown\";import yc from\"@mui/icons-material/ArrowUpward\";import wc from\"@mui/icons-material/ArrowDownward\";import Cc from\"@mui/icons-material/Remove\";import{jsx as Fa}from\"react/jsx-runtime\";function ct(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function Vt(e){let t=ct(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function At(e,t,o){let{weightedSum:n,weight:i}=e.reduce((p,w)=>{let C=ct(o(w));return C===null?p:{weightedSum:p.weightedSum+C*t(w),weight:p.weight+t(w)}},{weightedSum:0,weight:0}),s=i>0?n/i:0,d=\"neutral\";return s>0?d=\"up\":s<0&&(d=\"down\"),{direction:d,formatted:`${s>0?\"+\":\"\"}${s.toFixed(1)}%`}}function mo(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function tt(e){switch(e){case\"up\":return Fa(yc,{});case\"down\":return Fa(wc,{});case\"neutral\":default:return Fa(Cc,{})}}function vc(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}import{useMemo as tl}from\"react\";function ol(e,t){return Math.ceil(e.length/t)}function rl(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function kc(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let s=n[t],d=i[t];return o===\"asc\"?s-d:d-s})}function Sc(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function ut(e,t,o){let n=tl(()=>ol(e,o),[e,o]),i=tl(()=>rl(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function W(e,t,o=\"en-US\",n){let i=Number.isFinite(e)?e:0;if(t)try{return new Intl.NumberFormat(o,{style:\"currency\",currency:t,...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return n!==void 0?`$${i.toFixed(n)}`:`$${i.toLocaleString()}`}import{ColorUtils as Tc,styled as ue}from\"@nuskin/foundation-theme\";var{getGenomeColor:Q}=Tc,mr=ue(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Q(e,\"N30\")};\n border-radius: 12px;\n min-height: 320px;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (min-width: 768px) {\n padding: 20px;\n min-height: 400px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,La=ue(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,al=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,$a=ue(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>Q(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>Q(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,nl=ue(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Q(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Q(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Q(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>Q(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>Q(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,il=ue(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n overflow: hidden;\n list-style: none;\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n }\n`,ll=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>Q(e,\"N20\")};\n border-radius: 8px;\n transition:\n background-color 0.2s ease,\n box-shadow 0.2s ease;\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n list-style: none;\n\n &:not(:last-child) {\n border-bottom: 1px solid ${({theme:e})=>Q(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>Q(e,\"N30\")};\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.06);\n }\n\n @media (min-width: 768px) {\n padding: 14px;\n gap: 14px;\n }\n`,sl=ue(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>Q(e,\"A10\")};\n color: ${({theme:e})=>Q(e,\"A80\")};\n border-radius: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n vertical-align: middle;\n\n @media (min-width: 768px) {\n min-width: 28px;\n height: 28px;\n font-size: 16px;\n }\n`,dl=ue(\"img\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n object-fit: cover;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n }\n`,pl=ue(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>Q(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>Q(e,\"N70\")};\n font-size: 10px;\n font-weight: 500;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n font-size: 11px;\n }\n`,cl=ue(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,ul=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Q(e,\"N100\")};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n\n @media (min-width: 768px) {\n font-size: 16px;\n max-width: none;\n }\n`,gl=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>Q(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,fl=ue(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,ml=ue(\"div\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.2;\n color: ${({theme:e})=>Q(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,hl=ue(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#22C55E\":t===\"down\"?\"#DC2626\":Q(e,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 12px;\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n`,xl=ue(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({theme:e})=>Q(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>Q(e,\"N50\")};\n }\n`,bl=ue(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>Q(e,\"N70\")};\n`;import{useState as Rc}from\"react\";import Mc from\"@mui/material/Menu\";import Oc from\"@mui/material/MenuItem\";import Fc from\"@mui/material/ListItemIcon\";import Lc from\"@mui/material/ListItemText\";import $c from\"@mui/icons-material/MoreVert\";import Ic from\"@mui/icons-material/Visibility\";import Dc from\"@mui/material/IconButton\";import{styled as Pc}from\"@nuskin/foundation-theme\";var yl=Pc(Dc)(()=>({padding:\"4px\",color:\"#252525\",\"&:hover\":{backgroundColor:\"rgba(37, 37, 37, 0.08)\"}}));import{Fragment as Nc,jsx as ho,jsxs as wl}from\"react/jsx-runtime\";var ot=({widgetId:e,onFullView:t})=>{let[o,n]=Rc(null),i=!!o,s=`widget-menu-button-${e}`,d=`widget-menu-${e}`,p=u=>{n(u.currentTarget)},w=()=>{n(null)},C=()=>{w(),t&&t()};return wl(Nc,{children:[ho(yl,{id:s,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":i?d:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":i?\"true\":void 0,onClick:p,size:\"small\",children:ho($c,{fontSize:\"small\"})}),ho(Mc,{id:d,\"data-testid\":`widget-menu-${e}`,anchorEl:o,open:i,onClose:w,MenuListProps:{\"aria-labelledby\":s},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:wl(Oc,{onClick:C,\"data-testid\":\"widget-menu-item-fullview\",children:[ho(Fc,{children:ho(Ic,{fontSize:\"small\"})}),ho(Lc,{children:a(r.widget.menu.fullView)})]})})]})};import{jsx as re,jsxs as gt}from\"react/jsx-runtime\";var Hc=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,onSortChange:i,onTitleClick:s})=>{let d=c=>{let v=c.target.value;i?.(v)},p=(c,v)=>{switch(v){case\"units\":return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return W(c.revenue,c.currencyCode);case\"volume\":return`${c.volume.toLocaleString()} ${a(r.widget.topProducts.dcSvSuffix)}`;default:return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},w=(c,v)=>{switch(v){case\"units\":return`${W(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${c.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${W(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${W(c.revenue,c.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`}},C=(c,v)=>{let y=c.trend;if(!y)return\"\";switch(v){case\"units\":return y.units??\"\";case\"revenue\":return y.revenue??\"\";case\"volume\":return y.volume??\"\";default:return y.units??\"\"}},u=(c,v)=>{let y=C(c,v);return y?y.startsWith(\"+\")?\"up\":y.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\"},x=c=>c===\"up\"?re(Bc,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):c===\"down\"?re(Ec,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):re(zc,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}),g=e.slice(0,n),b=a(r.widget.topProducts.rank),f=a(r.widget.topProducts.trend);return o&&e.length===0?re(mr,{\"data-testid\":\"widget-top-products\",children:re(Xi,{})}):e.length===0?gt(mr,{\"data-testid\":\"widget-top-products\",children:[re(La,{children:re($a,{children:a(r.widget.topProducts.title)})}),gt(xl,{\"data-testid\":\"products-empty-state\",children:[re(Ac,{}),re(bl,{children:a(r.widget.topProducts.empty)})]})]}):gt(mr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[gt(La,{children:[re($a,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),gt(al,{children:[gt(nl,{id:\"product-sort\",\"data-testid\":\"product-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[re(\"option\",{value:\"units\",children:a(r.filter.productSort.byUnits)}),re(\"option\",{value:\"revenue\",children:a(r.filter.productSort.byRevenue)}),re(\"option\",{value:\"volume\",children:a(r.filter.productSort.byVolume)})]}),re(ot,{widgetId:\"top-products\",onFullView:s})]})]}),re(il,{as:\"ul\",\"data-testid\":\"products-list\",children:g.map((c,v)=>{let y=u(c,t),T=C(c,t);return gt(ll,{as:\"li\",\"data-testid\":`product-item-${v}`,\"aria-label\":`${b} ${c.rank}: ${c.name}, ${p(c,t)}`,children:[re(sl,{\"aria-label\":`${b} ${c.rank}`,children:c.rank}),c.imageUrl?re(dl,{src:c.imageUrl,alt:c.name,loading:\"lazy\",onError:h=>{h.currentTarget.hidden=!0}}):re(pl,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:c.name.substring(0,2).toUpperCase()}),gt(cl,{children:[re(ul,{title:c.name,children:c.name}),re(gl,{children:w(c,t)})]}),gt(fl,{children:[re(ml,{children:p(c,t)}),T&>(hl,{as:\"output\",direction:y,\"aria-live\":\"polite\",\"aria-label\":`${f}: ${mo(y)} ${T}`,children:[x(y),re(\"span\",{children:T})]})]})]},c.id)})})]})},xo=Vc.memo(Hc);xo.displayName=\"TopSellingProductsList\";import _o from\"react\";import{LineChart as Gc,Line as jc,XAxis as Yc,YAxis as Jc,CartesianGrid as Zc,Tooltip as qc,ResponsiveContainer as Qc}from\"recharts\";import{ColorUtils as Wc,styled as De}from\"@nuskin/foundation-theme\";var{getGenomeColor:le}=Wc,Ia=De(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>le(e,\"N20\")};\n border: 1px solid ${({theme:e})=>le(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,Cl=De(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,vl=De(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,kl=De(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Sl=De(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>le(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,Tl=De(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>le(e,\"N20\")};\n border: 1px solid ${({theme:e})=>le(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>le(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>le(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>le(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>le(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Dl=De(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`,Pl=De(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,Rl=De(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#DC2626\":le(e,\"N70\")};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>le(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Ml=De(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>le(e,\"N100\")};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,Ol=De(\"div\")`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({theme:e})=>le(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>le(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,Fl=De(\"div\")`\n background-color: ${({theme:e})=>le(e,\"N100\")};\n border: 1px solid ${({theme:e})=>le(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,Ll=De(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>le(e,\"N10\")};\n margin-bottom: 4px;\n`,$l=De(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>le(e,\"A10\")};\n`,Il=De(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>le(e,\"N30\")};\n margin-top: 2px;\n`;var Nl={last7days:7,last30days:30,last90days:90,thisMonth:31},Vl={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function _c(e){return Nl[e]??30}function Na(e){return Vl[e]??\"Last 30 Days\"}function Kc(e){return Na(e)}function Al(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var Uc={Jan:\"1\",Feb:\"2\",Mar:\"3\",Apr:\"4\",May:\"5\",Jun:\"6\",Jul:\"7\",Aug:\"8\",Sep:\"9\",Oct:\"10\",Nov:\"11\",Dec:\"12\"};function hr(e){let t=e.split(\" \");return t.length!==2?e:`${Uc[t[0]]||t[0]}/${t[1]}`}function Va(e){let t=new Date(e);return Al(t)}function zl(e,t){return`${Va(e)} - ${Va(t)}`}function Aa(e){return e.toISOString().split(\"T\")[0]}function ge(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),s,d=new Date(o,n,i);switch(e){case\"last7days\":s=new Date(o,n,i-7);break;case\"last30days\":s=new Date(o,n,i-30);break;case\"last90days\":s=new Date(o,n,i-90);break;case\"thisMonth\":s=new Date(o,n,1),d=new Date(o,n+1,0);break;default:return\"N/A\"}return zl(Aa(s),Aa(d))}import{jsx as se,jsxs as Ge}from\"react/jsx-runtime\";var Xc={top:5,right:10,left:-10,bottom:5},Bl={fontSize:10},eu={r:3,fill:\"#3B82F6\"},tu={r:5},ou=e=>`${e}%`,ru=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Ge(Fl,{children:[se(Ll,{children:o.date}),Ge($l,{children:[(o.rate??0).toFixed(2),\"%\"]}),Ge(Il,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},au=({conversionData:e,conversionFilter:t,isLoading:o=!1,title:n,summaryRate:i,summaryChangePct:s,onFilterChange:d,onTitleClick:p})=>{let w=_o.useCallback(c=>{let v=c.target.value;d?.(v)},[d]),C=a(r.widget.conversionRate.noData),u=a(r.widget.conversionRate.noChange),x=_o.useMemo(()=>typeof i==\"number\"&&Number.isFinite(i)?i:e.at(-1)?.rate??0,[i,e]),g=_o.useMemo(()=>{if(s!==void 0){if(s===null||Math.abs(s)<.1)return{direction:\"neutral\",value:u};let M=s>0?\"up\":\"down\",E=`${s>0?\"+\":\"\"}${s.toFixed(2)}%`;return{direction:M,value:E}}if(e.length<2)return{direction:\"neutral\",value:C};let c=e.at(-1)?.rate??0,v=e[0].rate;if(v===0)return{direction:\"neutral\",value:u};let y=c-v,T=y/v*100;if(Math.abs(T)<.1)return{direction:\"neutral\",value:u};let h=y>0?\"up\":\"down\",P=`${y>0?\"+\":\"\"}${y.toFixed(2)}%`;return{direction:h,value:P}},[s,e,u,C]),b=_o.useMemo(()=>e.map(c=>({...c,shortDate:hr(c.date)})),[e]);if(o&&e.length===0)return se(Ia,{\"data-testid\":\"widget-conversion-rate\",children:se(gr,{})});let f=a(r.widget.conversionRate.chartAriaLabel);return Ge(Ia,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":f,children:[se(Cl,{children:Ge(vl,{children:[se(Sl,{as:\"button\",onClick:p,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:n??a(r.widget.conversionRate.title)}),Ge(kl,{children:[Ge(Tl,{id:\"conversion-filter\",\"data-testid\":\"conversion-filter-dropdown\",value:t,onChange:w,disabled:o,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[se(\"option\",{value:\"all\",children:a(r.filter.conversionType.all)}),se(\"option\",{value:\"standard\",children:a(r.filter.conversionType.standard)}),se(\"option\",{value:\"subscription\",children:a(r.filter.conversionType.subscription)})]}),se(ot,{widgetId:\"conversion-rate\",onFullView:p})]})]})}),Ge(Dl,{children:[Ge(Pl,{\"aria-label\":`${a(r.widget.conversionRate.title)}: ${x.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[x.toFixed(2),\"%\"]}),g.value!==C&&Ge(Rl,{as:\"output\",direction:g.direction,\"aria-live\":\"polite\",\"aria-label\":`${mo(g.direction)} ${g.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Ge(\"div\",{className:\"trend-line\",children:[se(\"span\",{\"aria-hidden\":\"true\",children:tt(g.direction)}),se(\"span\",{className:\"change-value\",children:g.value.replace(\"%\",\"\")}),se(\"span\",{className:\"change-percent\",children:\"%\"})]}),se(\"div\",{className:\"comparison-text\",children:a(r.widget.conversionRate.comparison)})]})]}),se(Ml,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),se(Ol,{\"data-testid\":\"conversion-chart\",children:se(Qc,{width:\"100%\",height:\"100%\",minHeight:200,children:Ge(Gc,{data:b,margin:Xc,children:[se(Zc,{strokeDasharray:\"3 3\"}),se(Yc,{dataKey:\"shortDate\",tick:Bl,tickLine:!1,interval:\"preserveStartEnd\"}),se(Jc,{tick:Bl,tickLine:!1,tickFormatter:ou,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),se(qc,{content:ru}),se(jc,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:eu,activeDot:tu})]})})})]})},bo=_o.memo(au);bo.displayName=\"ConversionRateChart\";import jo from\"react\";import{LineChart as iu,Line as yo,XAxis as lu,YAxis as su,CartesianGrid as du,Tooltip as pu,ResponsiveContainer as cu}from\"recharts\";import{ColorUtils as nu,styled as Ae}from\"@nuskin/foundation-theme\";var{getGenomeColor:ye}=nu,za=Ae(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ye(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ye(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,El=Ae(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,Hl=Ae(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Wl=Ae(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ye(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>ye(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,_l=Ae(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ye(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ye(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ye(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ye(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>ye(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ye(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Kl=Ae(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`,Ul=Ae(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>ye(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,Gl=Ae(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#DC2626\":ye(e,\"N70\")};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>ye(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,jl=Ae(\"div\")`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({theme:e})=>ye(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>ye(e,\"N70\")};\n font-size: 10px;\n }\n`,Yl=Ae(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,Ko=Ae(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ye(e,\"N30\")};\n }\n`,Uo=Ae(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Go=Ae(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ye(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as fu,jsx as A,jsxs as $e}from\"react/jsx-runtime\";var rt={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},uu={top:5,right:10,left:-10,bottom:5},Jl={fontSize:10},wo={r:2},gu=({signupData:e,signupView:t,isLoading:o=!1,title:n,onViewChange:i,onTitleClick:s})=>{let d=jo.useCallback(v=>{let y=v.target.value;i?.(y)},[i]),p=a(r.widget.signups.noData),w=a(r.widget.signups.noChange),C=jo.useMemo(()=>e.length===0?0:e[e.length-1].total,[e]),u=jo.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:p};let v=e[e.length-1].total,y=e[0].total,T=v-y,h=T/y*100;if(Math.abs(h)<.1)return{direction:\"neutral\",value:w};let P=T>0?\"up\":\"down\",M=`${T>0?\"+\":\"\"}${T} (${h.toFixed(1)}%)`;return{direction:P,value:M}},[w,p,e]),x=jo.useMemo(()=>e.map(v=>({...v,shortDate:hr(v.date)})),[e]),g=a(r.widget.signups.total),b=a(r.widget.signups.members),f=a(r.widget.signups.retail),c=a(r.widget.signups.brandAffiliates);return o&&e.length===0?A(za,{\"data-testid\":\"widget-signups\",children:A(gr,{})}):$e(za,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[$e(El,{children:[A(Wl,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:n??a(r.widget.signups.title)}),$e(Hl,{children:[$e(_l,{id:\"signup-view\",\"data-testid\":\"signup-view-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[A(\"option\",{value:\"all\",children:a(r.filter.signupView.showAll)}),A(\"option\",{value:\"members\",children:a(r.filter.signupView.showMembers)}),A(\"option\",{value:\"retail\",children:a(r.filter.signupView.showRetail)}),A(\"option\",{value:\"brandAffiliates\",children:a(r.filter.signupView.showBrandAffiliates)})]}),A(ot,{widgetId:\"signups\",onFullView:s})]})]}),$e(Kl,{\"data-testid\":\"signups-metric-display\",children:[A(Ul,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${g}: ${C.toLocaleString()}`,children:C.toLocaleString()}),u.value!==p&&$e(Gl,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:u.direction,\"aria-live\":\"polite\",\"aria-label\":`${mo(u.direction)} ${u.value}`,children:[$e(\"div\",{className:\"trend-line\",children:[A(\"span\",{\"aria-hidden\":\"true\",children:tt(u.direction)}),A(\"span\",{className:\"change-value\",children:u.value.split(\" \")[0]}),A(\"span\",{className:\"change-percent\",children:u.value.split(\" \")[1]})]}),A(\"div\",{className:\"comparison-text\",children:a(r.widget.conversionRate.comparison)})]})]}),A(jl,{\"data-testid\":\"signups-chart\",children:A(cu,{width:\"100%\",height:\"100%\",minHeight:200,children:$e(iu,{data:x,margin:uu,children:[A(du,{strokeDasharray:\"3 3\"}),A(lu,{dataKey:\"shortDate\",tick:Jl,tickLine:!1,interval:\"preserveStartEnd\"}),A(su,{tick:Jl,tickLine:!1}),A(pu,{}),(t===\"all\"||t===\"members\")&&A(yo,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?rt.total:rt.members,strokeWidth:2,dot:wo,name:t===\"all\"?g:b}),t===\"all\"&&$e(fu,{children:[A(yo,{type:\"monotone\",dataKey:\"members\",stroke:rt.members,strokeWidth:2,dot:wo,name:b}),A(yo,{type:\"monotone\",dataKey:\"retail\",stroke:rt.retail,strokeWidth:2,dot:wo,name:f}),A(yo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:rt.brandAffiliates,strokeWidth:2,dot:wo,name:c})]}),t===\"retail\"&&A(yo,{type:\"monotone\",dataKey:\"retail\",stroke:rt.retail,strokeWidth:2,dot:wo,name:f}),t===\"brandAffiliates\"&&A(yo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:rt.brandAffiliates,strokeWidth:2,dot:wo,name:c})]})})}),t===\"all\"&&$e(Yl,{\"data-testid\":\"signups-legend\",children:[$e(Ko,{\"data-testid\":\"legend-total\",children:[A(Uo,{color:rt.total}),A(Go,{children:g})]}),$e(Ko,{\"data-testid\":\"legend-members\",children:[A(Uo,{color:rt.members}),A(Go,{children:b})]}),$e(Ko,{\"data-testid\":\"legend-retail\",children:[A(Uo,{color:rt.retail}),A(Go,{children:f})]}),$e(Ko,{\"data-testid\":\"legend-brandAffiliates\",children:[A(Uo,{color:rt.brandAffiliates}),A(Go,{children:c})]})]})]})},xr=jo.memo(gu);xr.displayName=\"SignupsChart\";import Ba from\"react\";import{PieChart as hu,Pie as xu,Cell as bu,ResponsiveContainer as yu,Tooltip as wu}from\"recharts\";import Cu from\"@mui/icons-material/TrendingUp\";import vu from\"@mui/icons-material/TrendingDown\";import{ColorUtils as mu,styled as oe}from\"@nuskin/foundation-theme\";var{getGenomeColor:fe}=mu,zt=oe(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>fe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>fe(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,Co=oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,br=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,vo=oe(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>fe(e,\"N100\")};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({theme:e})=>fe(e,\"A80\")};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`,yr=oe(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>fe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>fe(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>fe(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>fe(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>fe(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>fe(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,wr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n justify-content: center;\n flex: 1;\n\n @media (min-width: 768px) {\n flex-direction: row;\n gap: 24px;\n align-items: center;\n justify-content: center;\n }\n`,Cr=oe(\"div\")`\n position: relative;\n width: 100%;\n height: 220px;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 260px;\n height: 260px;\n flex: 0 0 auto;\n }\n\n @media (min-width: 1080px) {\n width: 280px;\n height: 280px;\n flex: 0 0 auto;\n }\n\n /* Style recharts pie labels (percentages inside segments) */\n svg text {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n\n text[class*='recharts'] {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n`,vr=oe(\"div\")`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 96px;\n`,kr=oe(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`,Sr=oe(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>fe(e,\"N100\")};\n`,Tr=oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n margin-top: 4px;\n font-size: 12px;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":fe(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Dr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 0 1 auto;\n\n @media (min-width: 768px) {\n gap: 10px;\n }\n`,Pr=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n @media (min-width: 768px) {\n gap: 10px;\n padding: 6px 0;\n }\n\n &:hover {\n background-color: ${({theme:e})=>fe(e,\"N30\")};\n }\n`,Rr=oe(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Mr=oe(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Or=oe(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>fe(e,\"N100\")};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n font-size: 14px;\n }\n`,Fr=oe(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>fe(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Zl=oe(\"div\")`\n display: none;\n`,ql=oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,Ql=oe(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Xl=oe(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,Lr=oe(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`,$r=oe(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>fe(e,\"N70\")};\n`;import{jsx as X,jsxs as Ie}from\"react/jsx-runtime\";var ku=({categories:e,categorySort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s})=>{let d=Ba.useCallback(f=>{let c=f.target.value;i?.(c)},[i]),{sortedCategories:p,totalRevenue:w,trendDirection:C,formattedTrend:u}=Ba.useMemo(()=>{let f=[...e].sort((T,h)=>t===\"revenue\"?h.revenue-T.revenue:(ct(h.trend?.revenue)??-1/0)-(ct(T.trend?.revenue)??-1/0)),c=f.reduce((T,h)=>T+h.revenue,0),{direction:v,formatted:y}=At(f,T=>T.revenue,T=>T.trend?.revenue);return{sortedCategories:f,totalRevenue:c,trendDirection:v,formattedTrend:y}},[e,t]),x=f=>f===\"up\"?X(Cu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):f===\"down\"?X(vu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,g=f=>{let{cx:c,cy:v,midAngle:y,innerRadius:T,outerRadius:h,percentage:P}=f,M=Math.PI/180,E=T+(h-T)/2,O=c+E*Math.cos(-y*M),I=v+E*Math.sin(-y*M);return X(\"text\",{x:O,y:I,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"central\",fontSize:\"10\",fontWeight:\"600\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0.2\",style:{lineHeight:\"12px\",leadingTrim:\"none\"},children:`${P}%`})},b=p[0]?.currencyCode;return o&&e.length===0?X(zt,{\"data-testid\":\"widget-top-categories\",children:X(fr,{})}):e.length===0?Ie(zt,{\"data-testid\":\"widget-top-categories\",children:[X(Co,{children:X(vo,{children:n??a(r.widget.topCategories.title)})}),X(Lr,{\"data-testid\":\"categories-empty-state\",children:X($r,{children:a(r.widget.topCategories.empty)})})]}):Ie(zt,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[Ie(Co,{children:[X(vo,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),Ie(br,{children:[Ie(yr,{id:\"category-sort\",\"data-testid\":\"category-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[X(\"option\",{value:\"revenue\",children:a(r.filter.categorySort.byRevenue)}),X(\"option\",{value:\"trend\",children:a(r.filter.categorySort.byTrend)})]}),X(ot,{widgetId:\"top-categories\",onFullView:s})]})]}),Ie(wr,{children:[Ie(Cr,{\"data-testid\":\"categories-chart\",children:[X(yu,{width:\"100%\",height:\"100%\",children:Ie(hu,{children:[X(xu,{data:p,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:g,labelLine:!1,children:p.map(f=>X(bu,{fill:f.color},`cell-${f.id}`))}),X(wu,{formatter:f=>W(f,b)})]})}),Ie(vr,{\"data-testid\":\"categories-donut-center\",children:[X(kr,{children:a(r.stats.revenue)}),X(Sr,{children:W(w,b)}),Ie(Tr,{direction:C,children:[x(C),X(\"span\",{children:u})]})]})]}),X(Dr,{\"data-testid\":\"categories-legend-container\",children:p.map((f,c)=>Ie(Pr,{\"data-testid\":`category-legend-${c}`,children:[X(Rr,{color:f.color}),Ie(Mr,{children:[X(Or,{children:f.name}),Ie(ql,{children:[Ie(Fr,{children:[W(f.revenue,f.currencyCode),\" (\",f.percentage,\"%)\"]}),f.trend?.revenue?X(Ql,{direction:Vt(f.trend?.revenue),\"data-testid\":`category-legend-trend-${c}`,\"aria-label\":f.trend.revenue,children:x(Vt(f.trend?.revenue))}):null]})]})]},f.id))})]})]})},Ir=Ba.memo(ku);Ir.displayName=\"TopCategoriesPieChart\";import{jsx as Pt,jsxs as Xt}from\"react/jsx-runtime\";var Su=[],Tu=[],Du=[],Pu=[],Ea=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:s=!1,error:d,shopTitle:p,className:w,dateRange:C=\"last30days\",market:u=\"all\",productSort:x=\"units\",signupView:g=\"all\",conversionFilter:b=\"all\",categorySort:f=\"revenue\",markets:c,onDateRangeChange:v,onMarketChange:y,onProductSortChange:T,onSignupViewChange:h,onConversionFilterChange:P,onCategorySortChange:M,onProductsTitleClick:E,onConversionTitleClick:O,onSignupsTitleClick:I,onCategoriesToTitleClick:U})=>{let R=t??Su,m=o??Tu,k=n??Du,S=i??Pu;if(d)return Pt(Ca,{as:\"main\",className:w,\"aria-label\":a(r.ariaLabel.dashboard),children:Xt(gi,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Xt(\"strong\",{children:[a(r.error),\":\"]}),\" \",d]})});let l=D=>D?D.startsWith(\"+\")?\"up\":D.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return Xt(Ca,{as:\"main\",className:w,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":s,children:[Pt(Eo,{shopTitle:p,dateRange:C,market:u,isLoading:s,stats:e,markets:c,onDateRangeChange:v,onMarketChange:y}),Xt(ci,{as:\"section\",\"data-testid\":\"stats-row\",\"aria-label\":a(r.ariaLabel.statsRow),children:[Pt(Dt,{title:a(r.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:l(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:s}),Pt(Dt,{title:a(r.stats.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.stats.subtitle.dcSv),trendDirection:l(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:s}),Pt(Dt,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.stats.subtitle.conversionRate)}`,trendDirection:l(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:s})]}),Xt(ui,{\"data-testid\":\"widget-container\",children:[Xt(va,{\"data-testid\":\"widget-row-1\",children:[Pt(xo,{products:R,productSort:x,isLoading:s,maxProducts:5,onSortChange:T,onTitleClick:E}),Pt(xr,{signupData:k,signupView:g,isLoading:s,onViewChange:h,onTitleClick:I})]}),Xt(va,{\"data-testid\":\"widget-row-2\",children:[Pt(bo,{conversionData:m,conversionFilter:b,isLoading:s,onFilterChange:P,onTitleClick:O}),Pt(Ir,{categories:S,categorySort:f,isLoading:s,onSortChange:M,onTitleClick:U})]})]})]})};import ee from\"react\";import to,{useState as Ua}from\"react\";import Mu from\"@mui/icons-material/ArrowBack\";import Ou from\"@mui/icons-material/CalendarToday\";import Fu from\"@mui/icons-material/Language\";import{ColorUtils as Ru,styled as Ne}from\"@nuskin/foundation-theme\";var{getGenomeColor:ze}=Ru,es=Ne(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,ts=Ne(\"div\")`\n display: flex;\n align-items: center;\n`,os=Ne(\"button\")`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({theme:e})=>ze(e,\"N70\")};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({theme:e})=>ze(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>ze(e,\"A70\")};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`,rs=Ne(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>ze(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`,as=Ne(\"div\")`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`,ns=Ne(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,is=Ne(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,ls=Ne(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,ss=Ne(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`,ds=Ne(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,ps=Ne(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>ze(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,cs=Ne(\"select\")`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({theme:e})=>ze(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>ze(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>ze(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`,us=Ne(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,gs=Ne(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>ze(e,\"N100\")};\n margin: 0;\n`;import{jsx as Be,jsxs as ko}from\"react/jsx-runtime\";function ft(e,t){return{key:\"dateRange\",label:a(t.filter.dateRange.label),value:e,icon:\"calendar\",options:[{value:\"last7days\",label:a(t.filter.dateRange.last7days)},{value:\"last30days\",label:a(t.filter.dateRange.last30days)},{value:\"last90days\",label:a(t.filter.dateRange.last90days)},{value:\"thisMonth\",label:a(t.filter.dateRange.thisMonth)}]}}function mt(e,t,o){return{key:\"market\",label:a(o.filter.market.label),value:e,icon:\"globe\",options:t.map(n=>({value:n.value,label:n.label}))}}var pe=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let s=d=>d?ko(ps,{children:[d===\"calendar\"&&Be(Ou,{}),d===\"globe\"&&Be(Fu,{})]}):null;return ko(es,{\"data-testid\":\"page-header\",children:[Be(ts,{children:ko(os,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[Be(Mu,{}),Be(\"span\",{children:a(r.navigation.backToDashboard)})]})}),Be(us,{children:Be(gs,{children:e})}),ko(rs,{children:[ko(as,{children:[Be(ns,{\"data-testid\":\"page-header-title\",children:e}),Be(is,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&Be(ss,{\"data-testid\":\"page-header-filters\",children:n.map(d=>ko(ds,{children:[s(d.icon),Be(cs,{id:`filter-${d.key}`,value:d.value,onChange:p=>i(d.key,p.target.value),disabled:d.disabled,\"aria-label\":`${d.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${d.key}`,children:d.options.map(p=>Be(\"option\",{value:p.value,children:d.label&&d.key===\"customerType\"?`${d.label} ${p.label}`:p.label},p.value))})]},d.key))}),Be(ls,{children:t})]})]})};import $u from\"@mui/icons-material/ArrowUpward\";import Iu from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as Lu,styled as Rt}from\"@nuskin/foundation-theme\";var{getGenomeColor:ht}=Lu,fs=Rt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>ht(e,\"N30\")};\n`,ms=Rt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,hs=Rt(\"thead\")`\n background-color: ${({theme:e})=>ht(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>ht(e,\"N40\")};\n`,xs=Rt(\"th\")`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({theme:e})=>ht(e,\"N20\")};\n color: ${({theme:e})=>ht(e,\"N70\")};\n text-align: left;\n cursor: ${({sortable:e})=>e?\"pointer\":\"default\"};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ht(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>ht(e,\"A70\")};\n outline-offset: -2px;\n }\n`,bs=Rt(\"tbody\")``,Ha=Rt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>ht(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ht(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,Wa=Rt(\"td\")`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>ht(e,\"N70\")};\n text-align: left;\n`,ys=Rt(Wa)`\n text-align: center;\n`,ws=Rt(\"span\")`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({isActive:e})=>e?1:.4};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;import{jsx as at,jsxs as Cs}from\"react/jsx-runtime\";var nt=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:s=\"asc\",getRowKey:d})=>{let p=u=>{if(!o||!n)return;n(u,i===u&&s===\"asc\"?\"desc\":\"asc\")},w=(u,x)=>{(u.key===\"Enter\"||u.key===\" \")&&(u.preventDefault(),p(x))},C=u=>{if(i===u)return s===\"asc\"?\"ascending\":\"descending\"};return at(fs,{\"data-testid\":\"data-table\",children:Cs(ms,{children:[at(hs,{children:at(\"tr\",{children:e.map(u=>Cs(xs,{scope:\"col\",sortable:o&&u.sortable,onClick:()=>u.sortable&&p(u.key),onKeyDown:x=>u.sortable&&w(x,u.key),tabIndex:o&&u.sortable?0:-1,\"aria-sort\":C(u.key),\"aria-label\":`${u.label}${u.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${u.key}`,children:[u.label,o&&u.sortable&&at(ws,{isActive:i===u.key,children:i===u.key&&s===\"desc\"?at(Iu,{}):at($u,{})})]},u.key))})}),at(bs,{children:t.length===0?at(Ha,{\"data-testid\":\"table-empty-row\",children:at(ys,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((u,x)=>at(Ha,{\"data-testid\":`table-row-${x}`,children:e.map(g=>at(Wa,{\"data-testid\":`table-cell-${g.key}`,children:g.render?g.render(u[g.key],u):u[g.key]},g.key))},d?d(u,x):x))})]})})};import Vu from\"@mui/icons-material/ChevronLeft\";import Au from\"@mui/icons-material/ChevronRight\";import{ColorUtils as Nu,styled as Nr}from\"@nuskin/foundation-theme\";var{getGenomeColor:it}=Nu,vs=Nr(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,Vr=Nr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?it(e,\"A80\"):it(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":it(e,\"N100\")};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({theme:e,isActive:t})=>t?it(e,\"A70\"):it(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>it(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,Ar=Nr(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>it(e,\"N70\")};\n margin: 0 8px;\n`,_a=Nr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>it(e,\"N20\")};\n color: ${({theme:e})=>it(e,\"N100\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({theme:e})=>it(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>it(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;import{Fragment as ks,jsx as Mt,jsxs as zr}from\"react/jsx-runtime\";var lt=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let s=()=>{e>1&&o(e-1)},d=()=>{e<t&&o(e+1)},p=(b,f)=>{(b.key===\"Enter\"||b.key===\" \")&&(b.preventDefault(),f())},C=(()=>{if(t<=7)return Array.from({length:t},(f,c)=>c+1);let b=[];return e<=4?b.push(1,2,3,4,5):e>=t-3?b.push(t-4,t-3,t-2,t-1,t):b.push(e-1,e,e+1),b})(),u=n?(e-1)*n+1:null,x=n?Math.min(e*n,i??1/0):null,g=a(r.pagination.goToPage);return zr(vs,{\"data-testid\":\"pagination\",children:[Mt(_a,{onClick:s,onKeyDown:b=>p(b,s),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:Mt(Vu,{})}),t>7&&e>4&&zr(ks,{children:[Mt(Vr,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${g} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),Mt(Ar,{children:\"...\"})]}),C.map(b=>Mt(Vr,{onClick:()=>o(b),isActive:e===b,\"aria-label\":`${g} ${b}`,\"aria-current\":e===b?\"page\":void 0,\"data-testid\":`pagination-page-${b}`,type:\"button\",children:b},b)),t>7&&e<t-3&&zr(ks,{children:[Mt(Ar,{children:\"...\"}),Mt(Vr,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${g} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),Mt(_a,{onClick:d,onKeyDown:b=>p(b,d),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:Mt(Au,{})}),n&&i&&zr(Ar,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[u,\"-\",x,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as Ce}from\"@mui/material/styles\";import{Box as Bt,Typography as eo}from\"@mui/material\";import{ColorUtils as zu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ss}=zu,me=Ce(Bt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`,Br=Ce(Bt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Ss(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`,Er=Ce(Bt)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`,Hr=Ce(eo)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({theme:e})=>e.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`,Wr=Ce(Bt)`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`,_b=Ce(eo)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`,_r=Ce(Bt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,Et=Ce(\"h2\")`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`,Kb=Ce(Bt)`\n width: 90%;\n height: 450px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 0;\n }\n`,Ht=Ce(Bt)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({withCard:e=!0,theme:t})=>e&&`\n padding: 20px;\n background-color: ${Ss(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,Ub=Ce(Bt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,Wt=Ce(eo)`\n text-align: center;\n color: ${({theme:e})=>e.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`,Ts=Ce(eo)`\n font-weight: 600;\n font-size: 14px;\n`,Ds=Ce(eo)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Ps=Ce(eo)`\n font-size: 13px;\n`,Rs=Ce(eo)`\n font-size: 13px;\n color: ${({theme:e,status:t})=>t===\"Active\"?e.palette.success.main:e.palette.warning.main};\n`;import{styled as ve}from\"@mui/material/styles\";import{Box as _t,Typography as Kt}from\"@mui/material\";import{ColorUtils as Bu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ka}=Bu,Ms=ve(_t)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,Os=ve(Kt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Fs=ve(Kt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Kr=ve(Kt)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>Ka(e,\"N70\")};\n`,Ls=ve(_t)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,$s=ve(_t)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Is=ve(_t)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Ka(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Ns=ve(_t)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,Vs=ve(Kt)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,As=ve(_t)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,zs=ve(Kt)`\n font-size: 0.875rem;\n font-weight: 600;\n`,Bs=ve(Kt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Es=ve(_t)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,Ur=ve(_t)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,Gr=ve(Kt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,jr=ve(Kt)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({theme:e})=>Ka(e,\"N70\")};\n`;import Eu from\"@mui/material/useMediaQuery\";var Hu=\"(max-width:767px)\";function xt(){return Eu(Hu,{noSsr:!0})}import{jsx as ae,jsxs as je}from\"react/jsx-runtime\";function Wu(e){return{rank:e.rank,name:e.name,sku:`${a(r.fullView.products.skuPrefix)}-${e.id.replace(\"prod-\",\"\").padStart(3,\"0\")}`,units:e.unitsSold,revenue:e.revenue,volume:e.volume}}var Yo=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onProductSortChange:C})=>{let[u,x]=Ua(1),[g,b]=Ua(n===\"revenue\"?\"revenue\":\"units\"),[f,c]=Ua(\"desc\"),v=10,y=xt(),T=to.useCallback(()=>d?.(),[d]),h=Ue(i),P=to.useMemo(()=>[ft(t,r),mt(o,h,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"units\",label:a(r.filter.productSort.units)},{value:\"revenue\",label:a(r.filter.productSort.revenue)},{value:\"volume\",label:a(r.filter.productSort.volume)}]}],[t,o,h,n]),M=to.useCallback((S,l)=>{S===\"dateRange\"?p?.(l):S===\"market\"?w?.(l):S===\"sort\"&&(C?.(l),x(1))},[p,w,C]),E=to.useCallback((S,l)=>{b(S),c(l),x(1)},[]),O=to.useMemo(()=>e.map(Wu),[e]),I=to.useMemo(()=>[...O].sort((S,l)=>{let D=S[g],H=l[g];return f===\"asc\"?D-H:H-D}),[O,g,f]),{totalPages:U,pageItems:R}=ut(I,u,v),m=e[0]?.currencyCode,k=to.useMemo(()=>[{key:\"rank\",label:a(r.fullView.products.columns.rank),sortable:!0},{key:\"name\",label:a(r.fullView.products.columns.product),sortable:!0,render:(S,l)=>je(Ms,{children:[ae(Os,{children:l.name}),ae(Fs,{children:l.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:S=>ae(Kr,{children:Number(S).toLocaleString()})},{key:\"revenue\",label:a(r.fullView.products.columns.revenue),sortable:!0,render:S=>ae(Kr,{children:W(Number(S),m)})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:S=>ae(Kr,{children:Number(S).toLocaleString()})}],[m]);return s?je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),ae(el,{})]}):e.length===0?je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),ae(Wt,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):je(me,{\"data-testid\":\"products-full-view\",children:[ae(pe,{title:a(r.widget.topProducts.title),dateRange:ge(t),onBack:T,filters:P,onFilterChange:M}),y?ae(Ls,{\"data-testid\":\"products-fullview-mobile-cards\",children:R.map(S=>je(Is,{children:[je(Ns,{children:[je(Vs,{children:[\"#\",S.rank]}),je(As,{children:[ae(zs,{children:S.name}),ae(Bs,{children:S.sku})]})]}),je(Es,{children:[je(Ur,{children:[ae(Gr,{children:a(r.widget.topProducts.units)}),ae(jr,{children:S.units.toLocaleString()})]}),je(Ur,{children:[ae(Gr,{children:a(r.widget.topProducts.revenue)}),ae(jr,{children:W(S.revenue,m)})]}),je(Ur,{children:[ae(Gr,{children:a(r.filter.productSort.volume)}),ae(jr,{children:S.volume.toLocaleString()})]})]})]},S.rank))}):ae($s,{\"data-testid\":\"products-fullview-desktop-table\",children:ae(nt,{columns:k,data:R,sortable:!0,onSort:E,sortColumn:g,sortDirection:f,getRowKey:S=>S.rank})}),U>1&&ae(lt,{currentPage:u,totalPages:U,onPageChange:x,itemsPerPage:v,totalItems:I.length})]})};import bt,{useState as Uu}from\"react\";import{LineChart as Gu,Line as ju,XAxis as Yu,YAxis as Ju,CartesianGrid as Zu,Tooltip as qu,ResponsiveContainer as Qu}from\"recharts\";import Xu from\"@mui/icons-material/ArrowUpward\";import eg from\"@mui/icons-material/ArrowDownward\";import{styled as he}from\"@mui/material/styles\";import{Box as st,Typography as Jo}from\"@mui/material\";import{ColorUtils as _u}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ku}=_u,Hs=he(st)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,Ws=he(st)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Ku(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,_s=he(st)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,Ks=he(st)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,Us=he(Jo)`\n font-size: 1rem;\n font-weight: 600;\n`,Gs=he(Jo)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,js=he(\"a\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`,Ys=he(st)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,Yr=he(st)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,Jr=he(Jo)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Zr=he(Jo)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Js=he(st)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Zs=he(st)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,qs=he(st)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`,Qs=he(st)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`,Xs=he(st)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,h0=he(Jo)`\n margin-top: 4px;\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n @media (max-width: 767px) {\n font-size: 0.75rem;\n }\n`,ed=he(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as B,jsxs as xe}from\"react/jsx-runtime\";var Zo=({conversionData:e,orders:t,summaryRate:o,summaryChangePct:n,dateRange:i,market:s,conversionFilter:d,markets:p,isLoading:w=!1,onBack:C,onDateRangeChange:u,onMarketChange:x,onConversionFilterChange:g})=>{let[b,f]=Uu(1),c=10,v=xt(),y=bt.useCallback(()=>C?.(),[C]),T=Ue(p),h=bt.useMemo(()=>typeof o==\"number\"&&Number.isFinite(o)?o:e.at(-1)?.rate??0,[o,e]),P=bt.useMemo(()=>{if(n!==void 0){if(n===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let te=\"neutral\";return n>0?te=\"up\":n<0&&(te=\"down\"),{direction:te,value:`${n>=0?\"+\":\"\"}${n.toFixed(1)}%`}}if(e.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let l=e.at(-1)?.rate??0,D=e[0].rate;if(D===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let H=(l-D)/D*100;if(Math.abs(H)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let ce=\"neutral\";return H>0?ce=\"up\":H<0&&(ce=\"down\"),{direction:ce,value:`${H>=0?\"+\":\"\"}${H.toFixed(1)}%`}},[n,e]),M=bt.useCallback(l=>l===\"standard\"?a(r.filter.conversionType.standard):l===\"subscription\"?a(r.filter.conversionType.subscription):a(r.filter.conversionType.all),[]),E=bt.useMemo(()=>M(d),[d,M]),O=bt.useMemo(()=>[ft(i,r),mt(s,T,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:d,options:[{value:\"all\",label:a(r.filter.conversionType.all)},{value:\"standard\",label:a(r.filter.conversionType.standard)},{value:\"subscription\",label:a(r.filter.conversionType.subscription)}]}],[d,i,s,T]),I=bt.useCallback((l,D)=>{l===\"dateRange\"?u?.(D):l===\"market\"?x?.(D):l===\"customerType\"&&(g?.(D),f(1))},[g,u,x]),U=bt.useMemo(()=>d===\"all\"?t:t.filter(l=>l.customerType.toLowerCase()===d),[t,d]),{totalPages:R,pageItems:m}=ut(U,b,c),k=bt.useMemo(()=>[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:l=>B(ed,{children:l})},{key:\"date\",label:a(r.fullView.conversionRate.columns.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},{key:\"customerType\",label:a(r.fullView.conversionRate.columns.type),sortable:!0},{key:\"items\",label:a(r.fullView.conversionRate.columns.items),sortable:!0},{key:\"total\",label:a(r.fullView.conversionRate.columns.total),sortable:!0,render:(l,D)=>W(Number(l),D.currencyCode,void 0,2)},{key:\"bv\",label:a(r.fullView.conversionRate.columns.bv),sortable:!0}],[]),S=bt.useCallback(()=>d===\"standard\"?\"#2e7d32\":d===\"subscription\"?\"#ed6c02\":\"#1976d2\",[d]);return w?xe(me,{\"data-testid\":\"conversion-rate-full-view\",children:[B(pe,{title:a(r.widget.conversionRate.title),dateRange:ge(i),onBack:y,filters:O,onFilterChange:I}),B(It,{})]}):xe(me,{\"data-testid\":\"conversion-rate-full-view\",children:[B(pe,{title:a(r.widget.conversionRate.title),dateRange:ge(i),onBack:y,filters:O,onFilterChange:I}),xe(Br,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[B(Er,{children:xe(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"0px\",flexWrap:\"wrap\"},children:[xe(Hr,{\"data-testid\":\"conversion-rate-value\",style:{marginRight:\"6px\"},children:[h.toFixed(1),\"%\"]}),xe(Wr,{direction:P.direction,\"data-testid\":\"conversion-rate-trend\",children:[P.direction===\"up\"&&B(Xu,{}),P.direction===\"down\"&&B(eg,{}),B(\"span\",{style:{fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:600,fontSize:\"14px\",lineHeight:\"20px\",letterSpacing:\"0em\"},children:P.value}),B(\"span\",{style:{marginLeft:\"2px\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:400,fontSize:\"12px\",lineHeight:\"16px\",letterSpacing:\"0.01em\",color:\"#5F5F5F\"},children:\"compared to this time last month\"})]})]})}),B(_r,{children:xe(qs,{children:[B(Hs,{\"data-testid\":\"conversion-fullview-chart\",children:B(Qu,{width:\"100%\",height:\"100%\",children:xe(Gu,{data:e,margin:{top:10,right:10,left:0,bottom:0},children:[B(Zu,{strokeDasharray:\"3 3\"}),B(Yu,{dataKey:\"date\"}),B(Ju,{tickFormatter:l=>`${l}%`,domain:[0,\"auto\"]}),B(qu,{formatter:l=>typeof l==\"number\"?`${l.toFixed(2)}%`:typeof l==\"string\"?l:a(r.fullView.conversionRate.notAvailable)}),B(ju,{type:\"monotone\",dataKey:\"rate\",stroke:S(),strokeWidth:2,name:`${a(r.widget.conversionRate.title)} (${E})`,dot:!1})]})})}),B(Qs,{children:B(Xs,{style:{color:S()},children:`${a(r.widget.conversionRate.title)} (${E})`})})]})})]}),xe(Ht,{\"data-testid\":\"conversion-fullview-table-section\",children:[xe(Et,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",U.length,\")\"]}),v?B(Js,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:m.map(l=>xe(Ws,{children:[xe(_s,{children:[xe(Ks,{children:[B(Us,{children:l.customerName}),B(Gs,{children:l.date})]}),B(js,{children:l.orderId})]}),xe(Ys,{children:[xe(Yr,{children:[B(Jr,{children:a(r.fullView.conversionRate.columns.items)}),B(Zr,{children:l.items})]}),xe(Yr,{children:[B(Jr,{children:a(r.fullView.conversionRate.columns.orderTotal)}),xe(Zr,{children:[\"$\",l.total.toFixed(2)]})]}),xe(Yr,{children:[B(Jr,{children:a(r.fullView.conversionRate.columns.totalSv)}),B(Zr,{children:l.bv})]})]})]},l.orderId))}):B(Zs,{\"data-testid\":\"conversion-fullview-desktop-table\",children:B(nt,{columns:k,data:m,getRowKey:l=>l.orderId})}),R>1&&B(lt,{currentPage:b,totalPages:R,onPageChange:f,itemsPerPage:c,totalItems:U.length})]})]})};import ro,{useState as ag}from\"react\";import{Box as ng}from\"@mui/material\";import{LineChart as ig,Line as ao,XAxis as lg,YAxis as sg,CartesianGrid as dg,Tooltip as pg,ResponsiveContainer as cg}from\"recharts\";import ug from\"@mui/icons-material/TrendingUp\";import gg from\"@mui/icons-material/TrendingDown\";import{styled as Ot}from\"@mui/material/styles\";import{Box as oo,Typography as tg}from\"@mui/material\";import{ColorUtils as og}from\"@nuskin/foundation-theme\";var{getGenomeColor:rg}=og,td=Ot(oo)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,od=Ot(oo)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,rd=Ot(oo)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n background-color: ${({theme:e})=>rg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,ad=Ot(oo)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,nd=Ot(tg)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n`,id=Ot(oo)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`,qo=Ot(oo)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`,Ut=Ot(oo)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,ld=Ot(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{Fragment as sd,jsx as F,jsxs as Pe}from\"react/jsx-runtime\";var Ve={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function Gt(e){if(typeof e==\"number\")return Number.isFinite(e)?e:0;if(typeof e==\"string\"){let t=Number(e.replace(/,/g,\"\"));return Number.isFinite(t)?t:0}return 0}function fg(e){if(Array.isArray(e))return e;let t=e;return Array.isArray(t.daily)?t.daily.map(o=>({date:String(o.date??\"\"),total:Gt(o.total),members:Gt(o.members),retail:Gt(o.retail),brandAffiliates:Gt(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var Ga=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:s,isLoading:d=!1,onBack:p,onDateRangeChange:w,onMarketChange:C,onSignupViewChange:u})=>{let[x,g]=ag(1),b=10,f=xt(),c=ro.useCallback(()=>p?.(),[p]),v=Ue(s),y=ro.useMemo(()=>fg(e).map(m=>{let k=m,S=Gt(k.members),l=Gt(k.retail),D=Gt(k.brandAffiliates??k.brandAffiliate??k.brand_affiliates??k.brand_affiliate),H=Gt(k.total??k.all??k.signupTotal??k.value);return{...m,total:H>0?H:S+l+D,members:S,retail:l,brandAffiliates:D}}),[e]),T=ro.useMemo(()=>y.length===0?0:y[y.length-1].total,[y]),h=ro.useMemo(()=>{if(y.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let R=y[0].total,m=y[y.length-1].total;if(R<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let k=m-R,S=k/R*100,l=\"neutral\";return S>0?l=\"up\":S<0&&(l=\"down\"),{direction:l,absoluteChange:Math.round(k),percentageChange:`${S>=0?\"+\":\"\"}${S.toFixed(1)}%`}},[y,r]),P=y.length>0,M=ro.useMemo(()=>[ft(o,r),mt(n,v,r),{key:\"signupView\",label:a(r.filter.signupView.label),value:i,options:[{value:\"all\",label:a(r.filter.signupView.all)},{value:\"members\",label:a(r.filter.signupView.members)},{value:\"retail\",label:a(r.filter.signupView.retail)},{value:\"brandAffiliates\",label:a(r.filter.signupView.brandAffiliates)}]}],[o,n,v,i]),E=ro.useCallback((R,m)=>{R===\"dateRange\"?w?.(m):R===\"market\"?C?.(m):R===\"signupView\"&&(u?.(m),g(1))},[w,C,u]),{totalPages:O,pageItems:I}=ut(t,x,b),U=ro.useMemo(()=>[{key:\"id\",label:a(r.fullView.signups.columns.id),sortable:!0},{key:\"name\",label:a(r.fullView.signups.columns.name),sortable:!0,render:R=>F(ld,{children:R})},{key:\"date\",label:a(r.fullView.signups.columns.date),sortable:!0},{key:\"type\",label:a(r.fullView.signups.columns.type),sortable:!0},{key:\"email\",label:a(r.fullView.signups.columns.email),sortable:!0},{key:\"status\",label:a(r.fullView.signups.columns.status),sortable:!0}],[]);return d?Pe(me,{\"data-testid\":\"signups-full-view\",children:[F(pe,{title:a(r.widget.signups.title),dateRange:ge(o),onBack:c,filters:M,onFilterChange:E}),F(It,{})]}):Pe(me,{\"data-testid\":\"signups-full-view\",children:[F(pe,{title:a(r.widget.signups.title),dateRange:ge(o),onBack:c,filters:M,onFilterChange:E}),Pe(Br,{\"data-testid\":\"signups-fullview-metric-chart\",children:[Pe(Er,{children:[F(Hr,{\"data-testid\":\"signups-total\",children:T.toLocaleString()}),Pe(Wr,{direction:h.direction,children:[h.direction===\"up\"&&F(ug,{}),h.direction===\"down\"&&F(gg,{}),h.direction!==\"neutral\"&&Pe(sd,{children:[Pe(\"span\",{style:{fontWeight:600,lineHeight:1},children:[h.absoluteChange>0?\"+\":\"\",h.absoluteChange]}),F(\"span\",{style:{fontWeight:400,lineHeight:1},children:h.percentageChange})]}),h.direction===\"neutral\"&&F(\"span\",{children:h.percentageChange})]}),F(nd,{children:a(r.widget.conversionRate.comparison)})]}),F(_r,{children:P?Pe(id,{children:[F(ad,{\"data-testid\":\"signups-fullview-chart\",children:F(cg,{width:\"100%\",height:\"100%\",minHeight:240,children:Pe(ig,{data:y,children:[F(dg,{strokeDasharray:\"3 3\"}),F(lg,{dataKey:\"date\"}),F(sg,{}),F(pg,{}),i===\"all\"&&Pe(sd,{children:[F(ao,{type:\"monotone\",dataKey:\"total\",stroke:Ve.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),F(ao,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.widget.signups.members),dot:{r:2},connectNulls:!0}),F(ao,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.widget.signups.retail),dot:{r:2},connectNulls:!0}),F(ao,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.widget.signups.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&F(ao,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.widget.signups.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&F(ao,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.widget.signups.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&F(ao,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.widget.signups.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),Pe(ng,{children:[i===\"all\"&&Pe(qo,{children:[F(Ut,{style:{color:Ve.total},children:a(r.widget.signups.total)}),F(Ut,{style:{color:Ve.members},children:a(r.widget.signups.members)}),F(Ut,{style:{color:Ve.retail},children:a(r.widget.signups.retail)}),F(Ut,{style:{color:Ve.brandAffiliates},children:a(r.widget.signups.brandAffiliates)})]}),i===\"members\"&&F(qo,{children:F(Ut,{style:{color:Ve.members},children:a(r.widget.signups.members)})}),i===\"retail\"&&F(qo,{children:F(Ut,{style:{color:Ve.retail},children:a(r.widget.signups.retail)})}),i===\"brandAffiliates\"&&F(qo,{children:F(Ut,{style:{color:Ve.brandAffiliates},children:a(r.widget.signups.brandAffiliates)})})]})]}):F(Wt,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),Pe(Ht,{\"data-testid\":\"signups-fullview-table-section\",children:[F(Et,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),f?F(td,{\"data-testid\":\"signups-fullview-mobile-cards\",children:I.map(R=>Pe(rd,{children:[F(Ts,{children:R.name}),Pe(Ds,{children:[R.date,\" - \",R.type]}),F(Ps,{children:R.email}),F(Rs,{status:R.status,children:R.status})]},R.id))}):F(od,{\"data-testid\":\"signups-fullview-desktop-table\",children:F(nt,{columns:U,data:I,getRowKey:R=>R.id})}),O>1&&F(lt,{currentPage:x,totalPages:O,onPageChange:g,itemsPerPage:b,totalItems:t.length})]})]})};import no,{useState as hg}from\"react\";import{PieChart as xg,Pie as bg,Cell as yg,ResponsiveContainer as wg,Tooltip as Cg}from\"recharts\";import vg from\"@mui/icons-material/TrendingUp\";import kg from\"@mui/icons-material/TrendingDown\";import{styled as So,ColorUtils as mg}from\"@nuskin/foundation-theme\";import{styled as we}from\"@mui/material/styles\";import{Box as yt,Typography as To}from\"@mui/material\";var{getGenomeColor:ja}=mg,qr=So(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,dd=So(\"div\")`\n flex: 1;\n`,pd=So(\"span\")`\n font-weight: 600;\n`,cd=So(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ud=So(\"span\")`\n font-weight: 600;\n`,gd=we(yt)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>ja(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`,fd=we(yt)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`,md=we(yt)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`,hd=we(To)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,xd=we(To)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.text.primary};\n`,bd=we(To)`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":t.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,yd=we(yt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,wd=we(yt)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({theme:e})=>ja(e,\"N30\")};\n }\n`,Qr=we(yt)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,iy=we(yt)`\n display: none;\n`,Cd=we(To)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`,vd=we(To)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`,kd=we(To)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Sd=we(yt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Td=we(yt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Dd=we(yt)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>ja(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Pd=we(\"span\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({direction:e})=>e===\"up\"?\"#2e7d32\":e===\"down\"?\"#d32f2f\":\"#757575\"};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Rd=So(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as K,jsxs as ke}from\"react/jsx-runtime\";var Ya=({categories:e,dateRange:t,market:o,categorySort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onCategorySortChange:C})=>{let[u,x]=hg(1),g=10,b=xt(),f=no.useCallback(()=>d?.(),[d]),c=Ue(i),v=no.useMemo(()=>[ft(t,r),mt(o,c,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.filter.categorySort.byRevenue)},{value:\"trend\",label:a(r.filter.categorySort.byTrend)}]}],[n,t,o,c]),y=no.useCallback((l,D)=>{l===\"dateRange\"?p?.(D):l===\"market\"?w?.(D):l===\"sort\"&&(C?.(D),x(1))},[C,p,w]),T=l=>{let{cx:D,cy:H,midAngle:ce,innerRadius:te,outerRadius:Me,percentage:Ct}=l,Ee=Math.PI/180,J=te+(Me-te)*.45,Je=D+J*Math.cos(-ce*Ee),He=H+J*Math.sin(-ce*Ee);return K(\"text\",{x:Je,y:He,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"middle\",fontSize:\"12\",fontWeight:\"700\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0\",style:{lineHeight:\"14px\",pointerEvents:\"none\"},children:`${Ct}%`})},h=l=>l===\"up\"?K(vg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):l===\"down\"?K(kg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,P=l=>{if(!l)return\"neutral\";let D=Number.parseFloat(l);return Number.isNaN(D)?\"neutral\":D>0?\"up\":D<0?\"down\":\"neutral\"},M=no.useMemo(()=>[...e].sort((l,D)=>n===\"revenue\"?D.revenue-l.revenue:(ct(D.trend?.revenue)??-1/0)-(ct(l.trend?.revenue)??-1/0)),[e,n]),{totalRevenue:E,totalRevenueTrendDirection:O,totalRevenueTrend:I}=no.useMemo(()=>{let l=M.reduce((ce,te)=>ce+te.revenue,0),{direction:D,formatted:H}=At(M,ce=>ce.revenue,ce=>ce.trend?.revenue);return{totalRevenue:l,totalRevenueTrendDirection:D,totalRevenueTrend:H}},[M]),U=no.useMemo(()=>M.slice(0,5),[M]),{totalPages:R,pageItems:m}=ut(M,u,g),k=no.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:(l,D)=>ke(qr,{children:[K(Qr,{dotColor:D.color}),K(Rd,{children:D.name})]})},{key:\"revenue\",label:a(r.fullView.categories.columns.revenue),sortable:!0,render:(l,D)=>W(Number(l),D.currencyCode)},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:l=>`${Number(l)}%`},{key:\"trend\",label:a(r.fullView.categories.columns.trend),render:(l,D)=>D.trend?.revenue??a(r.defaults.noValue)}],[]),S=M[0]?.currencyCode;return s?ke(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),K(It,{})]}):e.length===0?ke(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),K(Wt,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):ke(me,{\"data-testid\":\"categories-full-view\",children:[K(pe,{title:a(r.widget.topCategories.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),ke(gd,{\"data-testid\":\"categories-fullview-top-section\",children:[ke(fd,{\"data-testid\":\"categories-fullview-chart\",children:[K(wg,{width:\"100%\",height:\"100%\",children:ke(xg,{children:[K(bg,{data:M,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:T,labelLine:!1,children:M.map(l=>K(yg,{fill:l.color},`cell-${l.id}`))}),K(Cg,{formatter:l=>W(l,S)})]})}),ke(md,{\"data-testid\":\"categories-fullview-donut-center\",children:[K(hd,{children:a(r.stats.revenue)}),K(xd,{children:W(E,S)}),ke(bd,{direction:O,children:[h(O),K(\"span\",{children:I})]})]})]}),K(yd,{\"data-testid\":\"categories-fullview-summary\",children:U.map(l=>ke(wd,{children:[K(Qr,{dotColor:l.color}),K(Cd,{children:l.name}),K(vd,{children:W(l.revenue,l.currencyCode)}),ke(kd,{children:[\"(\",l.percentage,\"%)\"]}),l.trend?.revenue?K(Pd,{direction:P(l.trend.revenue),children:h(P(l.trend.revenue))}):null]},l.id))})]}),ke(Ht,{\"data-testid\":\"categories-fullview-table-section\",children:[ke(Et,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",M.length,\")\"]}),b?K(Td,{children:m.map(l=>ke(Dd,{children:[K(Qr,{dotColor:l.color}),ke(dd,{children:[K(pd,{children:l.name}),K(cd,{children:W(l.revenue,l.currencyCode)})]}),ke(ud,{children:[l.percentage,\"%\"]})]},l.id))}):K(Sd,{children:K(nt,{columns:k,data:m,sortable:!0,getRowKey:l=>l.id})}),R>1&&K(lt,{currentPage:u,totalPages:R,onPageChange:x,itemsPerPage:g,totalItems:M.length})]})]})};import Md from\"react\";function Do(e){Bo(e),Md.useEffect(()=>(Bo(e),()=>{Bo(void 0)}),[e])}var Sg=({translate:e,children:t})=>(Do(e),t??null);function Tg(){return Md.useCallback(e=>Qt(e),[])}import{jsx as Qo}from\"react/jsx-runtime\";var Dg=\"shoppingDashboardView\",Pg=[],Rg=[],Mg=[],Og=[],Fg=[],Lg=[];function Fd(e){return typeof e==\"object\"&&e!==null}function $g(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function Xr(e,t){if(!Fd(e))return\"dashboard\";let o=e[t];return $g(o)?o:\"dashboard\"}function Od(e,t,o){return{...Fd(e)?e:{},[t]:o}}function Ig(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Ng=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,orders:s,signups:d,isLoading:p=!1,error:w,shopTitle:C,className:u,translate:x,initialDateRange:g=\"last30days\",initialMarket:b=\"all\",initialProductSort:f=\"units\",initialSignupView:c=\"all\",initialConversionFilter:v=\"all\",initialCategorySort:y=\"revenue\",markets:T,historyAdapter:h,historyStateKey:P=Dg,resetToDashboardOnMount:M=!0,onDateRangeChange:E,onMarketChange:O,onProductSortChange:I,onSignupViewChange:U,onConversionFilterChange:R,onCategorySortChange:m,onViewChange:k})=>{Do(x);let[S,l]=ee.useState(\"dashboard\"),D=ee.useRef(!1),[H,ce]=ee.useState(g),[te,Me]=ee.useState(b),[Ct,Ee]=ee.useState(f),[J,Je]=ee.useState(c),[He,po]=ee.useState(v),[co,tr]=ee.useState(y),or=t??Pg,Mo=o??Rg,Oo=n??Mg,Fo=i??Og,ia=s??Fg,la=d??Lg,Ze=ee.useCallback(V=>{l(V),k?.(V)},[k]),We=ee.useCallback(()=>h?Xr(h.location?.state,P):typeof window>\"u\"?\"dashboard\":Xr(window.history.state,P),[h,P]),vt=ee.useCallback((V,Oe)=>{if(h){let Yt=Od(h.location?.state,P,V),nn=Ig(h.location,Yt);if(Oe===\"replace\"){h.replace(nn);return}h.push(nn);return}if(typeof window>\"u\")return;let _e=Od(window.history.state,P,V);if(Oe===\"replace\"){window.history.replaceState(_e,\"\");return}window.history.pushState(_e,\"\")},[h,P]);ee.useEffect(()=>{if(M?(vt(\"dashboard\",\"replace\"),D.current=!1,Ze(\"dashboard\")):Ze(We()),h)return h.listen((Oe,_e)=>{if(_e===\"POP\"){let Yt=Xr(Oe.state,P);D.current=Yt!==\"dashboard\",Ze(Yt)}});let V=Oe=>{let _e=Xr(Oe.state,P);D.current=_e!==\"dashboard\",Ze(_e)};return window.addEventListener(\"popstate\",V),()=>{window.removeEventListener(\"popstate\",V)}},[h,P,We,M,Ze,vt]);let Se=ee.useCallback(V=>{D.current=!0,vt(V,\"push\"),Ze(V)},[Ze,vt]),qe=ee.useCallback(()=>{if(S!==\"dashboard\"&&D.current){if(h){h.goBack();return}typeof window<\"u\"&&window.history.back();return}D.current=!1,vt(\"dashboard\",\"replace\"),Ze(\"dashboard\")},[S,h,Ze,vt]),kt=ee.useCallback(V=>{ce(V),E?.(V)},[E]),dt=ee.useCallback(V=>{Me(V),O?.(V)},[O]),jt=ee.useCallback(V=>{Ee(V),I?.(V)},[I]),Lo=ee.useCallback(V=>{Je(V),U?.(V)},[U]),$o=ee.useCallback(V=>{po(V),R?.(V)},[R]),Io=ee.useCallback(V=>{tr(V),m?.(V)},[m]),sa=ee.useCallback(()=>{Se(\"products\")},[Se]),da=ee.useCallback(()=>{Se(\"conversion-rate\")},[Se]),pa=ee.useCallback(()=>{Se(\"signups\")},[Se]),G=ee.useCallback(()=>{Se(\"categories\")},[Se]);return S===\"products\"?Qo(Yo,{products:or,dateRange:H,market:te,productSort:Ct,markets:T,isLoading:p,onBack:qe,onDateRangeChange:kt,onMarketChange:dt,onProductSortChange:jt}):S===\"conversion-rate\"?Qo(Zo,{conversionData:Mo,orders:ia,dateRange:H,market:te,conversionFilter:He,markets:T,isLoading:p,onBack:qe,onDateRangeChange:kt,onMarketChange:dt,onConversionFilterChange:$o}):S===\"signups\"?Qo(Ga,{signupData:Oo,signups:la,dateRange:H,market:te,signupView:J,markets:T,isLoading:p,onBack:qe,onDateRangeChange:kt,onMarketChange:dt,onSignupViewChange:Lo}):S===\"categories\"?Qo(Ya,{categories:Fo,dateRange:H,market:te,categorySort:co,markets:T,isLoading:p,onBack:qe,onDateRangeChange:kt,onMarketChange:dt,onCategorySortChange:Io}):Qo(Ea,{stats:e,topProducts:or,conversionData:Mo,signupData:Oo,categories:Fo,isLoading:p,error:w,shopTitle:C,className:u,dateRange:H,market:te,productSort:Ct,signupView:J,conversionFilter:He,categorySort:co,markets:T,onDateRangeChange:kt,onMarketChange:dt,onProductSortChange:jt,onSignupViewChange:Lo,onConversionFilterChange:$o,onCategorySortChange:Io,onProductsTitleClick:sa,onConversionTitleClick:da,onSignupsTitleClick:pa,onCategoriesToTitleClick:G})};import{styled as Xo}from\"@nuskin/foundation-theme\";var Ja=Xo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,Ld=Xo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`,$d=Xo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`,Id=Xo(\"div\")`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`,Nd=Xo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import Za from\"react\";import{PieChart as Vg,Pie as Ag,Cell as zg,ResponsiveContainer as Bg,Tooltip as Eg}from\"recharts\";var L={title:{key:\"productOfferDashboard.title\",fallback:\"Performance Overview\"},error:{key:\"productOfferDashboard.error\",fallback:\"Failed to load dashboard data. Please try again.\"},stats:{revenue:{key:\"productOfferDashboard.stats.revenue\",fallback:\"Total Revenue\"},offersPurchased:{key:\"productOfferDashboard.stats.offersPurchased\",fallback:\"Offers Purchased\"},conversionRate:{key:\"productOfferDashboard.stats.conversionRate\",fallback:\"Conversion Rate\"},trendUp:{key:\"productOfferDashboard.stats.trendUp\",fallback:\"Trending up\"},trendDown:{key:\"productOfferDashboard.stats.trendDown\",fallback:\"Trending down\"},trendNeutral:{key:\"productOfferDashboard.stats.trendNeutral\",fallback:\"No change\"},comparedTo:{key:\"productOfferDashboard.stats.comparedTo\",fallback:\"compared to this time last month\"}},filter:{dateRange:{label:{key:\"productOfferDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"productOfferDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"productOfferDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"productOfferDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"productOfferDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},market:{label:{key:\"productOfferDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"productOfferDashboard.filter.market.all\",fallback:\"All Markets\"}},offerSort:{byRevenue:{key:\"productOfferDashboard.filter.offerSort.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.filter.offerSort.byUnits\",fallback:\"Units\"}},productSort:{byUnits:{key:\"productOfferDashboard.filter.productSort.byUnits\",fallback:\"Units\"},byRevenue:{key:\"productOfferDashboard.filter.productSort.byRevenue\",fallback:\"Revenue\"},byVolume:{key:\"productOfferDashboard.filter.productSort.byVolume\",fallback:\"Volume\"}},conversionFilter:{overall:{key:\"productOfferDashboard.filter.conversionFilter.overall\",fallback:\"Overall\"}}},widget:{topProducts:{title:{key:\"productOfferDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},emptyState:{key:\"productOfferDashboard.widget.topProducts.emptyState\",fallback:\"No products data available\"}},conversionRate:{title:{key:\"productOfferDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},subtitle:{key:\"productOfferDashboard.widget.conversionRate.subtitle\",fallback:\"Orders \\xF7 Site visits\"}},topPerformingOffers:{title:{key:\"productOfferDashboard.widget.topPerformingOffers.title\",fallback:\"Top Performing Offers\"},totalRevenue:{key:\"productOfferDashboard.widget.topPerformingOffers.totalRevenue\",fallback:\"Total revenue\"},emptyState:{key:\"productOfferDashboard.widget.topPerformingOffers.emptyState\",fallback:\"No offers data available\"}},menu:{fullView:{key:\"productOfferDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{back:{key:\"productOfferDashboard.navigation.back\",fallback:\"Back to Dashboard\"}},ariaLabel:{dashboard:{key:\"productOfferDashboard.ariaLabel.dashboard\",fallback:\"Product Offer Performance Dashboard\"},statsCard:{key:\"productOfferDashboard.ariaLabel.statsCard\",fallback:\"Performance metric\"},conversionChart:{key:\"productOfferDashboard.ariaLabel.conversionChart\",fallback:\"Conversion rate chart\"},topProducts:{key:\"productOfferDashboard.ariaLabel.topProducts\",fallback:\"Top selling products\"},topOffers:{key:\"productOfferDashboard.ariaLabel.topOffers\",fallback:\"Top performing offers chart\"},widgetMenu:{key:\"productOfferDashboard.ariaLabel.widgetMenu\",fallback:\"Widget options menu\"},filterDateRange:{key:\"productOfferDashboard.ariaLabel.filterDateRange\",fallback:\"Filter by date range\"},filterMarket:{key:\"productOfferDashboard.ariaLabel.filterMarket\",fallback:\"Filter by market\"},backButton:{key:\"productOfferDashboard.ariaLabel.backButton\",fallback:\"Back to dashboard overview\"}},fullView:{topOffers:{title:{key:\"productOfferDashboard.fullView.topOffers.title\",fallback:\"Top Performing Offers\"},columnName:{key:\"productOfferDashboard.fullView.topOffers.columnName\",fallback:\"Offer Name\"},columnRevenue:{key:\"productOfferDashboard.fullView.topOffers.columnRevenue\",fallback:\"Revenue\"},columnPercentage:{key:\"productOfferDashboard.fullView.topOffers.columnPercentage\",fallback:\"Share\"},columnTrend:{key:\"productOfferDashboard.fullView.topOffers.columnTrend\",fallback:\"Trend\"}}},defaults:{trendZero:{key:\"productOfferDashboard.defaults.trendZero\",fallback:\"+0%\"},noData:{key:\"productOfferDashboard.defaults.noData\",fallback:\"--\"}}};function N(e){return Qt(e)}import{jsx as ne,jsxs as Ye}from\"react/jsx-runtime\";var Hg=({offers:e,offerSort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s})=>{let d=Za.useCallback(g=>{let b=g.target.value;i?.(b)},[i]),{sortedOffers:p,totalRevenue:w,trendDirection:C,formattedTrend:u}=Za.useMemo(()=>{let g=[...e].sort((v,y)=>t===\"revenue\"?y.revenue-v.revenue:y.percentage-v.percentage),b=g.reduce((v,y)=>v+y.revenue,0),{direction:f,formatted:c}=At(g,v=>v.revenue,v=>v.trend?.revenue);return{sortedOffers:g,totalRevenue:b,trendDirection:f,formattedTrend:c}},[e,t]),x=p[0]?.currencyCode;return o&&e.length===0?ne(zt,{\"data-testid\":\"widget-top-offers\",children:ne(fr,{})}):e.length===0?Ye(zt,{\"data-testid\":\"widget-top-offers\",children:[ne(Co,{children:ne(vo,{children:n??N(L.widget.topPerformingOffers.title)})}),ne(Lr,{\"data-testid\":\"top-offers-empty-state\",children:ne($r,{children:N(L.widget.topPerformingOffers.emptyState)})})]}):Ye(zt,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":N(L.ariaLabel.topOffers),children:[Ye(Co,{children:[ne(vo,{as:\"button\",onClick:s,\"aria-label\":N(L.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??N(L.widget.topPerformingOffers.title)}),Ye(br,{children:[Ye(yr,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":N(L.ariaLabel.topOffers),children:[ne(\"option\",{value:\"revenue\",children:N(L.filter.offerSort.byRevenue)}),ne(\"option\",{value:\"units\",children:N(L.filter.offerSort.byUnits)})]}),ne(ot,{widgetId:\"top-offers\",onFullView:s})]})]}),Ye(wr,{children:[Ye(Cr,{\"data-testid\":\"top-offers-chart\",children:[ne(Bg,{width:\"100%\",height:\"100%\",children:Ye(Vg,{children:[ne(Ag,{data:p,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:p.map(g=>ne(zg,{fill:g.color},`cell-${g.id}`))}),ne(Eg,{formatter:g=>W(g,x)})]})}),Ye(vr,{\"data-testid\":\"top-offers-donut-center\",children:[ne(kr,{children:N(L.widget.topPerformingOffers.totalRevenue)}),ne(Sr,{children:W(w,x)}),ne(Tr,{direction:C,children:u})]})]}),ne(Dr,{\"data-testid\":\"top-offers-legend-container\",children:p.map((g,b)=>{let f=Vt(g.trend?.revenue);return Ye(Pr,{\"data-testid\":`offer-legend-${b}`,children:[ne(Rr,{color:g.color}),Ye(Mr,{children:[ne(Or,{children:g.name}),ne(Fr,{children:W(g.revenue,g.currencyCode)})]}),Ye(Zl,{children:[g.percentage,\"%\"]}),g.trend?.revenue?ne(Xl,{direction:f,\"data-testid\":`offer-legend-trend-${b}`,\"aria-label\":g.trend.revenue,children:tt(f)}):null]},g.id)})})]})]})},ea=Za.memo(Hg);ea.displayName=\"TopPerformingOffersPieChart\";import{jsx as io,jsxs as Po}from\"react/jsx-runtime\";var Wg=[],_g=[],Kg=[],qa=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:d,className:p,dateRange:w=\"last30days\",market:C=\"all\",productSort:u=\"units\",conversionFilter:x=\"all\",offerSort:g=\"revenue\",conversionSummaryRate:b,conversionSummaryChangePct:f,markets:c,onDateRangeChange:v,onMarketChange:y,onProductSortChange:T,onConversionFilterChange:h,onOfferSortChange:P,onProductsTitleClick:M,onConversionTitleClick:E,onOffersTitleClick:O})=>{let I=t??Wg,U=o??_g,R=n??Kg,m=k=>k?k.startsWith(\"+\")&&k!==\"+0%\"?\"up\":k.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return s?io(Ja,{as:\"main\",className:p,\"aria-label\":N(L.ariaLabel.dashboard),children:Po(Nd,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Po(\"strong\",{children:[N(L.error),\":\"]}),\" \",s]})}):Po(Ja,{as:\"main\",className:p,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":N(L.ariaLabel.dashboard),\"aria-busy\":i,children:[io(Eo,{shopTitle:d??N(L.title),dateRange:w,market:C,isLoading:i,markets:c,stats:e?{shopTitle:e.shopTitle??\"\",dateRange:e.dateRange,selectedMarket:e.selectedMarket,metrics:{revenue:e.metrics.revenue,volume:\"\",siteVisits:\"\",conversionRate:e.metrics.conversionRate},trend:{}}:void 0,onDateRangeChange:v,onMarketChange:y}),Po(Ld,{\"data-testid\":\"top-charts-row\",children:[io(bo,{conversionData:U,conversionFilter:x,isLoading:i,summaryRate:b,summaryChangePct:f,onFilterChange:h,onTitleClick:E}),Po($d,{\"data-testid\":\"stats-card-stack\",children:[io(Dt,{layout:\"split\",title:N(L.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:m(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:N(L.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),io(Dt,{layout:\"split\",title:N(L.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:m(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:N(L.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Po(Id,{\"data-testid\":\"bottom-charts-row\",children:[io(xo,{products:I,productSort:u,isLoading:i,maxProducts:5,onSortChange:T,onTitleClick:M}),io(ea,{offers:R,offerSort:g,isLoading:i,onSortChange:P,onTitleClick:O})]})]})};import de from\"react\";import lo,{useState as Gg}from\"react\";import{PieChart as jg,Pie as Yg,Cell as Jg,ResponsiveContainer as Zg,Tooltip as qg}from\"recharts\";import{styled as Y}from\"@mui/material/styles\";import{Box as Re,Typography as wt}from\"@mui/material\";import{ColorUtils as Ug}from\"@nuskin/foundation-theme\";var{getGenomeColor:Qa}=Ug,Vd=Y(Re)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Qa(e,\"N20\")};\n border-radius: 8px;\n box-shadow: ${({theme:e})=>e.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`,Ad=Y(Re)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`,zd=Y(Re)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`,Bd=Y(wt)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Ed=Y(wt)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Hd=Y(wt)`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({direction:e,theme:t})=>e===\"up\"?t.palette.success.main:e===\"down\"?t.palette.error.main:t.palette.text.secondary};\n`,Wd=Y(Re)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,_d=Y(Re)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Qa(e,\"N30\")};\n }\n`,ta=Y(Re)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,Kd=Y(Re)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,Ud=Y(wt)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Gd=Y(wt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,jd=Y(wt)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,Yd=Y(Re)`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,Jd=Y(Re)`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`,Zd=Y(Re)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,qd=Y(Re)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Qd=Y(Re)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Qa(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Xd=Y(Re)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,ep=Y(wt)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,tp=Y(Re)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({theme:e})=>e.palette.divider};\n`,oa=Y(Re)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,ra=Y(wt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,Xa=Y(wt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,op=Y(wt)`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e,direction:t})=>t===\"up\"?e.palette.success.main:t===\"down\"?e.palette.error.main:e.palette.text.secondary};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;import{Fragment as Qg,jsx as z,jsxs as ie}from\"react/jsx-runtime\";var en=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:s=!1,onBack:d,onDateRangeChange:p,onMarketChange:w,onOfferSortChange:C})=>{let[u,x]=Gg(1),g=10,b=xt(),f=lo.useCallback(()=>d?.(),[d]),c=Ue(i),v=lo.useMemo(()=>[ft(t,L),mt(o,c,L),{key:\"sort\",label:N(L.filter.offerSort.byRevenue),value:n,options:[{value:\"revenue\",label:N(L.filter.offerSort.byRevenue)},{value:\"units\",label:N(L.filter.offerSort.byUnits)}]}],[t,o,c,n]),y=lo.useCallback((m,k)=>{m===\"dateRange\"?p?.(k):m===\"market\"?w?.(k):m===\"sort\"&&(C?.(k),x(1))},[C,p,w]),T=lo.useMemo(()=>[...e].sort((m,k)=>n===\"revenue\"?k.revenue-m.revenue:k.percentage-m.percentage),[e,n]),{totalRevenue:h,totalRevenueTrendDirection:P,totalRevenueTrend:M}=lo.useMemo(()=>{let m=T.reduce((l,D)=>l+D.revenue,0),{direction:k,formatted:S}=At(T,l=>l.revenue,l=>l.trend?.revenue);return{totalRevenue:m,totalRevenueTrendDirection:k,totalRevenueTrend:S}},[T]),E=lo.useMemo(()=>T.slice(0,5),[T]),{totalPages:O,pageItems:I}=ut(T,u,g),U=lo.useMemo(()=>[{key:\"name\",label:N(L.fullView.topOffers.columnName),sortable:!0,render:(m,k)=>ie(qr,{children:[z(ta,{dotColor:k.color}),z(\"span\",{children:k.name})]})},{key:\"revenue\",label:N(L.fullView.topOffers.columnRevenue),sortable:!0,render:(m,k)=>W(Number(m),k.currencyCode)},{key:\"percentage\",label:N(L.fullView.topOffers.columnPercentage),sortable:!0,render:m=>`${Number(m)}%`},{key:\"trend\",label:N(L.fullView.topOffers.columnTrend),render:(m,k)=>{if(!k.trend?.revenue)return N(L.defaults.noData);let S=Vt(k.trend.revenue);return ie(Jd,{direction:S,children:[tt(S),z(\"span\",{children:k.trend.revenue})]})}}],[]),R=T[0]?.currencyCode;return s?ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),z(It,{})]}):e.length===0?ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),z(Wt,{\"data-testid\":\"top-offers-fullview-empty\",children:N(L.widget.topPerformingOffers.emptyState)})]}):ie(me,{\"data-testid\":\"top-offers-full-view\",children:[z(pe,{title:N(L.fullView.topOffers.title),dateRange:ge(t),onBack:f,filters:v,onFilterChange:y}),ie(Vd,{\"data-testid\":\"top-offers-fullview-top-section\",children:[ie(Ad,{\"data-testid\":\"top-offers-fullview-chart\",children:[z(Zg,{width:\"100%\",height:\"100%\",children:ie(jg,{children:[z(Yg,{data:T,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:T.map(m=>z(Jg,{fill:m.color},`cell-${m.id}`))}),z(qg,{formatter:m=>W(m,R)})]})}),ie(zd,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[z(Bd,{children:N(L.widget.topPerformingOffers.totalRevenue)}),z(Ed,{children:W(h,R)}),z(Hd,{direction:P,children:M})]})]}),z(Wd,{\"data-testid\":\"top-offers-fullview-summary\",children:E.map(m=>{let k=Vt(m.trend?.revenue);return ie(_d,{children:[z(ta,{dotColor:m.color}),ie(Kd,{children:[z(Ud,{children:m.name}),z(Gd,{children:W(m.revenue,m.currencyCode)})]}),ie(jd,{children:[m.percentage,\"%\"]}),m.trend?.revenue?z(Yd,{direction:k,\"aria-label\":m.trend.revenue,children:tt(k)}):null]},m.id)})})]}),ie(Ht,{\"data-testid\":\"top-offers-table\",children:[ie(Et,{\"data-testid\":\"top-offers-fullview-table-title\",children:[N(L.fullView.topOffers.title),\" (\",T.length,\")\"]}),b?z(qd,{children:I.map(m=>{let k=ct(m.trend?.revenue),S=\"neutral\";return k!==null&&k>0?S=\"up\":k!==null&&k<0&&(S=\"down\"),ie(Qd,{children:[ie(Xd,{children:[z(ta,{dotColor:m.color}),z(ep,{children:m.name})]}),ie(tp,{children:[ie(oa,{children:[z(ra,{children:N(L.fullView.topOffers.columnRevenue)}),z(Xa,{children:W(m.revenue,m.currencyCode)})]}),ie(oa,{children:[z(ra,{children:N(L.fullView.topOffers.columnPercentage)}),ie(Xa,{children:[m.percentage,\"%\"]})]}),ie(oa,{children:[z(ra,{children:N(L.fullView.topOffers.columnTrend)}),z(op,{direction:S,children:m.trend?.revenue?ie(Qg,{children:[tt(S),z(\"span\",{children:m.trend.revenue})]}):N(L.defaults.noData)})]})]})]},m.id)})}):z(Zd,{children:z(nt,{columns:U,data:I,sortable:!0,getRowKey:m=>m.id})}),O>1&&z(lt,{currentPage:u,totalPages:O,onPageChange:x,itemsPerPage:g,totalItems:T.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as na}from\"react/jsx-runtime\";var Xg=\"productOfferDashboardView\",ef=[],tf=[],of=[],rf=[];function ap(e){return typeof e==\"object\"&&e!==null}function af(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function aa(e,t){if(!ap(e))return\"dashboard\";let o=e[t];return af(o)?o:\"dashboard\"}function rp(e,t,o){return{...ap(e)?e:{},[t]:o}}function nf(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var lf=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:d,className:p,allProducts:w,orders:C,allOffers:u,conversionSummaryRate:x,conversionSummaryChangePct:g,conversionFullViewData:b,conversionFullViewRate:f,conversionFullViewChangePct:c,initialDateRange:v=\"last30days\",initialMarket:y=\"all\",initialProductSort:T=\"units\",initialConversionFilter:h=\"all\",initialOfferSort:P=\"revenue\",markets:M,translate:E,historyAdapter:O,historyStateKey:I=Xg,resetToDashboardOnMount:U=!0,onDateRangeChange:R,onMarketChange:m,onProductSortChange:k,onConversionFilterChange:S,onOfferSortChange:l,onViewChange:D})=>{Do(E);let[H,ce]=de.useState(\"dashboard\"),te=de.useRef(!1),[Me,Ct]=de.useState(v),[Ee,J]=de.useState(y),[Je,He]=de.useState(T),[po,co]=de.useState(h),[tr,or]=de.useState(P),Mo=t??ef,Oo=o??tf,Fo=n??of,ia=w??Mo,la=C??rf,Ze=u??Fo,We=de.useCallback(G=>{ce(G),D?.(G)},[D]),vt=de.useCallback(()=>O?aa(O.location?.state,I):typeof window>\"u\"?\"dashboard\":aa(window.history.state,I),[O,I]),Se=de.useCallback((G,V)=>{if(O){let _e=rp(O.location?.state,I,G),Yt=nf(O.location,_e);if(V===\"replace\"){O.replace(Yt);return}O.push(Yt);return}if(typeof window>\"u\")return;let Oe=rp(window.history.state,I,G);if(V===\"replace\"){window.history.replaceState(Oe,\"\");return}window.history.pushState(Oe,\"\")},[O,I]);de.useEffect(()=>{if(U?(Se(\"dashboard\",\"replace\"),te.current=!1,We(\"dashboard\")):We(vt()),O)return O.listen((V,Oe)=>{if(Oe===\"POP\"){let _e=aa(V.state,I);te.current=_e!==\"dashboard\",We(_e)}});let G=V=>{let Oe=aa(V.state,I);te.current=Oe!==\"dashboard\",We(Oe)};return window.addEventListener(\"popstate\",G),()=>{window.removeEventListener(\"popstate\",G)}},[O,I,vt,U,We,Se]);let qe=de.useCallback(G=>{te.current=!0,Se(G,\"push\"),We(G)},[We,Se]),kt=de.useCallback(()=>{if(H!==\"dashboard\"&&te.current){if(O){O.goBack();return}typeof window<\"u\"&&window.history.back();return}te.current=!1,Se(\"dashboard\",\"replace\"),We(\"dashboard\")},[H,O,We,Se]),dt=de.useCallback(G=>{Ct(G),R?.(G)},[R]),jt=de.useCallback(G=>{J(G),m?.(G)},[m]),Lo=de.useCallback(G=>{He(G),k?.(G)},[k]),$o=de.useCallback(G=>{co(G),S?.(G)},[S]),Io=de.useCallback(G=>{or(G),l?.(G)},[l]),sa=de.useCallback(()=>{qe(\"products\")},[qe]),da=de.useCallback(()=>{qe(\"conversion-rate\")},[qe]),pa=de.useCallback(()=>{qe(\"top-offers\")},[qe]);return H===\"products\"?na(Yo,{products:ia,dateRange:Me,market:Ee,productSort:Je,markets:M,isLoading:i,onBack:kt,onDateRangeChange:dt,onMarketChange:jt,onProductSortChange:Lo}):H===\"conversion-rate\"?na(Zo,{conversionData:b??Oo,orders:la,summaryRate:f??x,summaryChangePct:c??g,dateRange:Me,market:Ee,conversionFilter:po,markets:M,isLoading:i,onBack:kt,onDateRangeChange:dt,onMarketChange:jt,onConversionFilterChange:$o}):H===\"top-offers\"?na(en,{offers:Ze,dateRange:Me,market:Ee,offerSort:tr,markets:M,isLoading:i,onBack:kt,onDateRangeChange:dt,onMarketChange:jt,onOfferSortChange:Io}):na(qa,{stats:e,topProducts:Mo,conversionData:Oo,topOffers:Fo,isLoading:i,error:s,dashboardTitle:d,className:p,dateRange:Me,market:Ee,productSort:Je,conversionFilter:po,offerSort:tr,conversionSummaryRate:x,conversionSummaryChangePct:g,markets:M,onDateRangeChange:dt,onMarketChange:jt,onProductSortChange:Lo,onConversionFilterChange:$o,onOfferSortChange:Io,onProductsTitleClick:sa,onConversionTitleClick:da,onOffersTitleClick:pa})};import{ColorUtils as sf,styled as tn}from\"@nuskin/foundation-theme\";var{getGenomeColor:so}=sf,np=tn(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,ip=tn(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>so(e,\"N20\")};\n border: 1px solid ${({theme:e})=>so(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>so(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>so(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>so(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>so(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,lp=tn(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>so(e,\"N70\")};\n`;import{jsx as on,jsxs as pf}from\"react/jsx-runtime\";var df=({filters:e,onChange:t})=>on(np,{\"data-testid\":\"filter-bar\",children:e.map(o=>pf(lp,{htmlFor:`filter-${o.key}`,children:[o.label,on(ip,{id:`filter-${o.key}`,value:o.value,onChange:n=>t(o.key,n.target.value),disabled:o.disabled,\"aria-label\":`${o.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${o.key}`,children:o.options.map(n=>on(\"option\",{value:n.value,children:n.label},n.value))})]},o.key))});var sp={shopTitle:\"My NuSkin Shop\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$9,453\",volume:\"1,211\",siteVisits:\"17,935\",conversionRate:\"4.2%\"},trend:{revenue:\"+12.5%\",volume:\"+8.3%\",siteVisits:\"-2.1%\"}},rn=[{id:\"prod-001\",rank:1,name:\"ageLOC LumiSpa\",imageUrl:\"\",unitsSold:342,revenue:29580,volume:245,trend:{units:\"+15%\",revenue:\"+12%\",volume:\"+8%\"}},{id:\"prod-002\",rank:2,name:\"Pharmanex LifePak\",imageUrl:\"\",unitsSold:287,revenue:24395,volume:198,trend:{units:\"+8%\",revenue:\"+10%\",volume:\"+5%\"}},{id:\"prod-003\",rank:3,name:\"ageLOC Meta\",imageUrl:\"\",unitsSold:256,revenue:21760,volume:176,trend:{units:\"-3%\",revenue:\"-1%\",volume:\"-2%\"}},{id:\"prod-004\",rank:4,name:\"Nu Skin 180 System\",imageUrl:\"\",unitsSold:198,revenue:17820,volume:142,trend:{units:\"+22%\",revenue:\"+18%\",volume:\"+15%\"}},{id:\"prod-005\",rank:5,name:\"Epoch Baobab Body Butter\",imageUrl:\"\",unitsSold:176,revenue:8800,volume:88,trend:{units:\"+5%\",revenue:\"+3%\",volume:\"+2%\"}}],er=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");return o.setDate(o.getDate()+t),{date:`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][o.getMonth()]} ${o.getDate()}`,rate:Number((4+t%15*.1).toFixed(2)),orders:200+t*13%100,siteVisits:4e3+t*97%2e3}}),cf=er.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7)})),uf=er.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3)})),dp=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");o.setDate(o.getDate()+t);let n=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],i=80+t*11%40,s=Math.floor(i*.4),d=Math.floor(i*.35),p=i-s-d;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:s,retail:d,brandAffiliates:p}}),pp=[{id:\"cat-001\",name:\"Favorites\",revenue:45200,percentage:29,color:\"#C95D63\",trend:{revenue:\"+8%\",units:\"+10%\"}},{id:\"cat-002\",name:\"Daily Routine\",revenue:42100,percentage:27,color:\"#6C7A9B\",trend:{revenue:\"+12%\",units:\"+15%\"}},{id:\"cat-003\",name:\"Fit & Trim Body\",revenue:34300,percentage:22,color:\"#E8975E\",trend:{revenue:\"-3%\",units:\"-1%\"}},{id:\"cat-004\",name:\"Dull Skin\",revenue:24900,percentage:16,color:\"#5F8FC4\",trend:{revenue:\"+5%\",units:\"+7%\"}},{id:\"cat-005\",name:\"Acne\",revenue:9400,percentage:6,color:\"#A2C3B3\",trend:{revenue:\"+2%\",units:\"+3%\"}}],an=Array.from({length:50},(e,t)=>{let o=[\"Sarah\",\"John\",\"Emma\",\"Michael\",\"Olivia\",\"William\",\"Ava\",\"James\"],n=[\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Garcia\",\"Miller\",\"Davis\"],i=new Date(\"2026-03-31\");return i.setDate(i.getDate()-t%30),{orderId:`ORD-${String(1e4+t).padStart(5,\"0\")}`,date:i.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),customerName:`${o[t%o.length]} ${n[t%n.length]}`,customerType:t%3===0?\"Subscription\":\"Standard\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),cp=Array.from({length:30},(e,t)=>{let o=[\"Alice\",\"Bob\",\"Carol\",\"David\",\"Eva\",\"Frank\",\"Grace\",\"Henry\"],n=[\"Anderson\",\"Baker\",\"Clark\",\"Davis\",\"Evans\",\"Fisher\",\"Grant\",\"Hall\"],i=[\"Member\",\"Retail\",\"Brand Affiliate\"],s=new Date(\"2026-03-31\");return s.setDate(s.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:s.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),type:i[t%i.length],email:`${o[t%o.length].toLowerCase()}.${n[t%n.length].toLowerCase()}@example.com`,status:t%4===0?\"Pending\":\"Active\"}});var Ro={shopTitle:\"Performance Overview\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$5,208\",offersPurchased:\"285\",conversionRate:\"4.2%\"},trend:{revenue:\"+2.3%\",offersPurchased:\"+3.7%\"}},Uw={...Ro,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},Gw={...Ro,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},jw={...Ro,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},Yw={...Ro,metrics:{...Ro.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},gf=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,percentage:29,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,percentage:27,color:\"#E8915A\",trend:{revenue:\"+3.1%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,percentage:22,color:\"#C75B5B\",trend:{revenue:\"-1.5%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,percentage:16,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,percentage:6,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\"}}];export{Ya as CategoriesFullView,bo as ConversionRateChart,Zo as ConversionRateFullView,Vl as DATE_RANGE_LABELS,Nl as DAYS_MAP,Eo as DashboardHeader,nt as DataTable,df as FilterBar,Ng as MysiteDashboardWithNavigation,di as MysiteHero,fa as NsCategoryNavigation,ga as NsProductCard,pe as PageHeader,lt as Pagination,lf as PoDashboardWithNavigation,rr as ProductCarousel,qa as ProductOfferDashboard,L as ProductOfferDashboardTranslationKeys,Ep as ProductTabCarousel,Yo as ProductsFullView,Ea as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,xr as SignupsChart,Ga as SignupsFullView,Dt as StatsCard,Ir as TopCategoriesPieChart,en as TopPerformingOffersFullView,ea as TopPerformingOffersPieChart,xo as TopSellingProductsList,Sg as TranslationProvider,ot as WidgetMenu,Ci as buildDefaultMarketOptions,Sc as calculatePercentage,ol as calculateTotalPages,zl as formatDateRange,Kc as formatDateRangeLabel,Va as formatDisplayDate,Aa as formatISODate,Al as formatShortDate,Na as getDateRangeLabel,_c as getDaysFromDateRange,a as getTranslation,tc as getTranslationResolver,vc as getTrendColor,tt as getTrendIcon,pp as mockCategories,er as mockConversionData,an as mockOrders,Ro as mockProductOfferStats,dp as mockSignupData,cp as mockSignupDetails,sp as mockStats,gf as mockTopOffers,rn as mockTopProducts,rl as paginateItems,vi as resolveMarketOptions,Qt as resolveTranslation,Bo as setTranslationResolver,kc as sortByNumericProperty,Tg as useTranslation,Do as useTranslationResolver};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import React, { ReactElement, useState } from 'react';\nimport { NsImage } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport {\n PriceComponent,\n ProductCardContainer,\n ImageContainer,\n DefaultImage,\n ProductTitle,\n ProductBadgeContainer,\n AddToCartButton,\n CartIcon,\n} from './styles/NsProductCard.Styled';\nimport { useMediaQuery } from '@mui/material';\nimport { NsCardButton } from './types';\n\ntype NsProductCardProps = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly className?: string;\n readonly button?: NsCardButton & { disabled?: boolean };\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSellerBadge?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n readonly testId?: string;\n};\n\nconst NsProductCard = ({\n productTitle,\n imageDetails,\n className,\n button,\n onCardClick,\n productStatusBadge,\n directSellerBadge,\n mySitePriceComponent,\n testId,\n}: NsProductCardProps): ReactElement => {\n const [isButtonHovered, setIsButtonHovered] = useState(false);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const handleImageError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n const target = e.target as HTMLImageElement;\n const noImageFallback = imageDetails?.fallbackImage;\n if (noImageFallback && target.src !== noImageFallback) {\n target.src = noImageFallback;\n }\n };\n\n return (\n <ProductCardContainer\n className={className}\n onClick={onCardClick}\n tabIndex={0}\n data-testid=\"product-card\"\n isMobile={isMobile}\n >\n <ImageContainer bgColor={imageDetails?.bgColor} onError={handleImageError}>\n {imageDetails?.imageSrc ? (\n <NsImage\n data-testid={testId ?? 'test-product-image'}\n className={imageDetails.className ?? ''}\n src={imageDetails.imageSrc}\n alt={imageDetails.imageAlt}\n aria-label={imageDetails.areaLabel ?? imageDetails.imageAlt}\n width={'100%'}\n />\n ) : (\n <DefaultImage alt=\"\" />\n )}\n </ImageContainer>\n <ProductTitle title={productTitle} data-testid=\"product-title\">\n {productTitle}\n </ProductTitle>\n {directSellerBadge && <ProductBadgeContainer>{directSellerBadge}</ProductBadgeContainer>}\n <ProductBadgeContainer>{productStatusBadge}</ProductBadgeContainer>\n <PriceComponent>{mySitePriceComponent}</PriceComponent>\n {button?.showButton && (\n <AddToCartButton\n tabIndex={0}\n aria-roledescription=\":\"\n aria-label={button.buttonText || 'ADD TO CART'}\n data-testid=\"add-to-cart-button\"\n disabled={button?.disabled ?? false}\n isMobile={isMobile}\n isHovered={isButtonHovered}\n onClick={(e) => {\n e.stopPropagation();\n if (!button?.disabled) {\n button.onClick?.();\n }\n }}\n onMouseEnter={() => {\n if (!isMobile && !button?.disabled) {\n setIsButtonHovered(true);\n }\n }}\n onMouseLeave={() => {\n if (!isMobile) {\n setIsButtonHovered(false);\n }\n }}\n >\n <CartIcon className=\"cart-icon\" disabled={button?.disabled}>\n <svg width=\"24\" height=\"22\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 1.86358C0 1.26109 0.488416 0.772675 1.09091 0.772675H3.48173C4.51054 0.772675 5.39955 1.49136 5.61511 2.49733L5.71309 2.95456H22.9091C23.245 2.95456 23.5622 3.10933 23.7689 3.37411C23.9757 3.63889 24.0489 3.98415 23.9674 4.31005L22.4053 10.5583C21.9197 12.5009 20.1743 13.8636 18.172 13.8636H8.05068L8.28444 14.9546H20.7273C21.3298 14.9546 21.8182 15.443 21.8182 16.0455C21.8182 16.648 21.3298 17.1364 20.7273 17.1364H19.6364H8.18182H7.40252C6.88811 17.1364 6.4436 16.777 6.33582 16.274L3.76449 4.27405L3.48173 2.95449H1.09091C0.488416 2.95449 0 2.46608 0 1.86358ZM8.18182 17.1364C6.97683 17.1364 6 18.1132 6 19.3182C6 20.5232 6.97683 21.5 8.18182 21.5C9.3868 21.5 10.3636 20.5232 10.3636 19.3182C10.3636 18.1132 9.3868 17.1364 8.18182 17.1364ZM19.6364 17.1364C18.4314 17.1364 17.4545 18.1132 17.4545 19.3182C17.4545 20.5232 18.4314 21.5 19.6364 21.5C20.8413 21.5 21.8182 20.5232 21.8182 19.3182C21.8182 18.1132 20.8413 17.1364 19.6364 17.1364ZM7.58317 11.6818H18.172C19.1732 11.6818 20.0459 11.0005 20.2887 10.0292L21.5119 5.13638H6.18062L7.58317 11.6818Z\"\n fill={button?.disabled ? '#999' : '#ffffff'}\n />\n </svg>\n </CartIcon>\n {button.buttonText || 'ADD TO CART'}\n </AddToCartButton>\n )}\n </ProductCardContainer>\n );\n};\n\nexport default NsProductCard;\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PriceComponent = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`;\n\nexport const ProductCardContainer = styled('button')<{ isMobile: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n width: 240px;\n height: ${(props) => (props.isMobile ? '410px' : '513px')};\n overflow: hidden;\n cursor: pointer;\n border: 1px solid #ededed;\n background: var(--color-primary-n-10-primary-white, #fff);\n`;\n\nexport const ImageContainer = styled('div')<{\n bgColor?: string;\n}>`\n width: '240px';\n height: '240px';\n background: ${(props) => props.bgColor ?? '#f5f5f5'};\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 0;\n display: flex;\n align-items: normal;\n justify-content: center;\n position: relative;\n @media (max-width: 560px) {\n width: 200px;\n height: 200px;\n align-items: unset;\n }\n`;\n\nexport const DefaultImage = styled('img')`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`;\n\nexport const ProductTitle = styled('div')`\n width: 200px;\n margin-top: 16px;\n max-height: 66px;\n text-align: left;\n font-size: 16px;\n font-family: 'Inter', sans-serif;\n font-weight: 400;\n line-height: 22px;\n overflow: hidden;\n color: #666;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n @media (max-width: 560px) {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n margin-top: 5px;\n max-height: 54px;\n line-height: 18px;\n }\n`;\n\nexport const ProductBadgeContainer = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`;\n\nexport const AddToCartButton = styled('button')<{\n disabled?: boolean;\n isMobile: boolean;\n isHovered: boolean;\n}>`\n width: 200px;\n height: 40px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0.14px;\n text-transform: none;\n justify-content: flex-start;\n padding-left: 31px;\n overflow: hidden;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n text-overflow: ellipsis;\n margin-top: 8px;\n margin-bottom: 10px;\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n\n color: ${(props) => (props.disabled ? '#999' : '#fff')};\n background-color: ${(props) => {\n if (props.disabled) return '#e0e0e0';\n if (!props.isMobile && props.isHovered) return '#888';\n return '#000';\n }};\n border: ${(props) => (props.disabled ? '1px solid #ccc' : 'none')};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n transition: ${(props) => (props.isMobile ? 'none' : 'all 0.3s ease')};\n\n @media (max-width: 560px) {\n margin: 5px 0;\n }\n`;\n\nexport const CartIcon = styled('span')<{ disabled?: boolean }>`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n`;\n","import React, { ReactElement, useCallback, ReactNode, useRef } from 'react';\nimport Slider from 'react-slick';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport 'slick-carousel/slick/slick.css';\nimport { NsCardButton, NsCarouselControl } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport NsProductCard from '../card/NsProductCard';\nimport {\n SlickContainer,\n ControlsContainer,\n ControlsHeaderRow,\n ScrollableContainer,\n CardList,\n ViewAllWrapper,\n ProductCountWrapper,\n ArrowsWrapper,\n CustomTypography,\n ViewAllLink,\n ProductInfoWrapper,\n CategoryNameWrapper,\n EmptyProductCategories,\n} from './NsProductCarousel.styled';\n\nexport type ProductCardEntry = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly button?: NsCardButton;\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSeller?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n};\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductCardCarouselProps<T = ProductCardEntry> {\n readonly entries: T[];\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly renderEntry?: (entry: T, index: number) => ReactNode;\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly categoryName?: string;\n readonly emptyProductMessage?: string;\n readonly productsCountLabel?: string;\n readonly isInitialDataLoading?: boolean;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nexport default function ProductCardCarousel({\n entries,\n renderEntry,\n settings = {},\n showControlButtons = true,\n allEntryLabel = 'View All',\n allEntryLink = '',\n categoryName,\n emptyProductMessage = 'No Products Available For The Selected Category',\n productsCountLabel = 'Products',\n isInitialDataLoading,\n history,\n}: ProductCardCarouselProps): ReactElement {\n const sliderRef = useRef<Slider>(null);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const prev = useCallback(() => {\n sliderRef.current?.slickPrev();\n }, []);\n\n const next = useCallback(() => {\n sliderRef.current?.slickNext();\n }, []);\n\n const renderProductEntry =\n renderEntry ??\n ((entry: ProductCardEntry, index: number) => (\n <NsProductCard\n key={`${entry.productTitle}-${index}`}\n productTitle={entry.productTitle}\n imageDetails={entry.imageDetails}\n button={entry.button}\n onCardClick={entry.onCardClick}\n productStatusBadge={entry.productStatusBadge}\n directSellerBadge={entry.directSeller}\n mySitePriceComponent={entry.mySitePriceComponent}\n />\n ));\n\n const sliderSettings = {\n dots: true,\n infinite: true,\n speed: 500,\n slidesToShow: Math.min(entries?.length ?? 0, 4),\n slidesToScroll: 4,\n swipe: true,\n draggable: true,\n arrows: true,\n responsive: [\n {\n breakpoint: 1320,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 3),\n slidesToScroll: 3,\n },\n },\n {\n breakpoint: 900,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 2),\n slidesToScroll: 2,\n },\n },\n {\n breakpoint: 600,\n settings: {\n slidesToShow: 1,\n slidesToScroll: 1,\n arrows: false,\n },\n },\n ],\n ...settings,\n };\n\n const shouldShowNavigation = (entries?.length ?? 0) > sliderSettings.slidesToShow;\n\n const renderCarouselContent = () => {\n if (entries?.length === 0 && !isInitialDataLoading) {\n return <EmptyProductCategories>{emptyProductMessage}</EmptyProductCategories>;\n }\n\n if (isMobile) {\n return (\n <ScrollableContainer>\n <CardList>{entries.map((entry, index) => entry && renderProductEntry(entry, index))}</CardList>\n </ScrollableContainer>\n );\n }\n\n return (\n <Slider {...sliderSettings} ref={sliderRef}>\n {entries.map((entry, index) => entry && renderProductEntry(entry, index))}\n </Slider>\n );\n };\n\n return (\n <SlickContainer>\n {showControlButtons && (\n <ControlsContainer>\n <ControlsHeaderRow>\n <ProductInfoWrapper>\n <ProductCountWrapper>\n <CustomTypography variant=\"body-m\">\n {entries?.length ?? 0} {productsCountLabel}\n </CustomTypography>\n </ProductCountWrapper>\n {!isMobile && categoryName && <CategoryNameWrapper>{categoryName}</CategoryNameWrapper>}\n </ProductInfoWrapper>\n <ViewAllWrapper $isMobile={isMobile}>\n <ViewAllLink\n $disabled={(entries?.length ?? 0) === 0}\n onClick={(e) => {\n e.preventDefault();\n if ((entries?.length ?? 0) > 0 && history) {\n history.push(allEntryLink);\n }\n }}\n >\n {allEntryLabel}\n </ViewAllLink>\n </ViewAllWrapper>\n </ControlsHeaderRow>\n {!isMobile && (\n <ArrowsWrapper $isDisabled={!shouldShowNavigation}>\n <NsCarouselControl prev={prev} next={next} viewAllLabel={''} viewAllUrl={''} />\n </ArrowsWrapper>\n )}\n </ControlsContainer>\n )}\n {renderCarouselContent()}\n </SlickContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport Box, { BoxProps } from '@mui/material/Box';\nimport { NsTypography } from '@nuskin/foundation-ui-components';\n\nexport const SlickContainer: React.ComponentType<BoxProps> = styled(Box)`\n padding: 30px 0 60px;\n width: 100%;\n margin: auto;\n margin-top: 50px;\n position: relative;\n\n .slick-list {\n padding-left: 24px;\n padding-right: 24px;\n }\n .slick-slide {\n display: flex;\n justify-content: center;\n padding: 0 12px;\n box-sizing: border-box;\n }\n .slick-prev,\n .slick-next {\n display: none !important;\n }\n\n @media (max-width: 1200px) {\n max-width: 1024px;\n .slick-list {\n padding-left: 12px;\n padding-right: 12px;\n }\n .slick-slide {\n padding: 0 6px;\n }\n }\n @media (max-width: 700px) {\n max-width: 100vw;\n padding: 10px 0 50px;\n .slick-list {\n padding-left: 4px;\n padding-right: 4px;\n }\n .slick-slide {\n padding: 0 2px;\n }\n }\n @media (max-width: 560px) {\n padding: 10px 0 10px;\n margin-top: 25px;\n }\n`;\nexport const ScrollableContainer = styled('div')`\n overflow-x: auto;\n display: flex;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n gap: 16px;\n padding: 0 8px 16px;\n width: 100%;\n box-sizing: border-box;\n\n &::-webkit-scrollbar {\n height: 6px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #007bff;\n border-radius: 10px;\n }\n`;\n\nexport const CardList = styled('div')`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`;\n\nexport const ControlsContainer: React.ComponentType<BoxProps> = styled(Box)`\n position: absolute;\n bottom: calc(100% + 1px);\n right: 1px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n`;\n\nexport const ViewAllWrapper: React.ComponentType<BoxProps & { $isMobile?: boolean }> = styled(Box)<{\n $isMobile?: boolean;\n}>`\n display: flex;\n align-items: center;\n margin-left: auto;\n margin-right: ${({ $isMobile }) => ($isMobile ? 0 : '24px')};\n\n @media (max-width: 560px) {\n margin-left: 0;\n order: 2;\n }\n`;\n\nexport const ProductCountWrapper: React.ComponentType<BoxProps> = styled(Box)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`;\n\nexport const ArrowsWrapper: React.ComponentType<BoxProps & { $isDisabled?: boolean }> = styled(Box)<{\n $isDisabled?: boolean;\n}>`\n display: flex;\n align-items: center;\n opacity: ${({ $isDisabled }) => ($isDisabled ? 0.3 : 1)};\n pointer-events: ${({ $isDisabled }) => ($isDisabled ? 'none' : 'auto')};\n transition: opacity 0.3s ease;\n\n .carousal-prev-button,\n .carousal-next-button {\n transition: all 0.3s ease;\n border: 2px solid #000000;\n border-radius: 3px;\n padding: 9px;\n cursor: pointer;\n\n svg {\n transition: all 0.3s ease;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n\n &:hover {\n background-color: #f5f5f5;\n border: 2px solid #ddd;\n\n svg {\n opacity: 0.5;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n }\n }\n\n @media (max-width: 560px) {\n display: none;\n }\n`;\nexport const Scrollablewrapper = styled('div')`\n @media (max-width: 560px) {\n overflow-y: hidden;\n scrollbar-width: thin;\n scrollbar-color: #007bff #eee;\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: #eee;\n }\n &::-webkit-scrollbar-thumb {\n background-color: red;\n border-radius: 8px;\n border: 2px solid #eee;\n }\n }\n`;\nexport const CustomTypography = styled(NsTypography)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`;\n\nexport const ViewAllLink = styled('a')<{ $disabled?: boolean }>`\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n text-decoration: none;\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n padding-bottom: 4px;\n transition: all 0.3s ease;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n\n @media (max-width: 560px) {\n font-size: 14px;\n line-height: 18px;\n }\n\n &:hover {\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n }\n`;\n\nexport const EmptyProductCategories = styled('div')`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`;\nexport const ControlsHeaderRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const ProductInfoWrapper = styled('div')`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`;\n\nexport const CategoryNameWrapper = styled('div')`\n font-family: 'Lora';\n font-weight: 400;\n font-size: 22px;\n margin-left: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 13px;\n`;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useMediaQuery } from '@mui/material';\n\nimport { NsCategoryNavigation } from '../Nav-Category-Navigation';\nimport { NsSpinner } from '@nuskin/foundation-ui-components';\nimport ProductCardCarousel, { ProductCardEntry } from './NsProductCarousel';\nimport {\n ProductTabCarouselContainer,\n TabsContainer,\n ContentContainer,\n NoTabsContainer,\n SpinnerContainer,\n} from './ProductTabCarousel.styled';\n\ninterface Category {\n label: string;\n categoryId: string;\n}\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductTabCarouselProps {\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly renderEntry?: (entry: ProductCardEntry) => React.ReactNode;\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly fetchCategories: () => Promise<Category[]>;\n readonly fetchProducts: (categoryId: string) => Promise<ProductCardEntry[]>;\n readonly emptyProductTabs?: string;\n readonly emptyProductMessage?: string;\n readonly showCustomCategory?: boolean;\n readonly productsCountLabel?: string;\n readonly getCategoryId?: (categoryId: string) => Promise<Category[]>;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nconst ProductTabCarousel: React.FC<ProductTabCarouselProps> = ({\n allEntryLabel,\n allEntryLink,\n renderEntry,\n settings,\n showControlButtons = true,\n fetchCategories,\n fetchProducts,\n showCustomCategory = false,\n emptyProductTabs = 'No tabs available',\n emptyProductMessage,\n productsCountLabel,\n getCategoryId,\n history,\n}) => {\n const isMobile = useMediaQuery('(max-width:768px)');\n const [isLoadingInitialData, setIsLoadingInitialData] = useState(true);\n const [categories, setCategories] = useState<Category[]>([]);\n const [isCategoriesLoaded, setIsCategoriesLoaded] = useState(false);\n const [selectedTab, setSelectedTab] = useState(0);\n const [products, setProducts] = useState<ProductCardEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [shouldShowSpinner, setShouldShowSpinner] = useState(true);\n\n const checkForExistingSpinners = useCallback(() => {\n const existingSpinners = document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');\n setShouldShowSpinner(existingSpinners.length === 0);\n }, []);\n\n useEffect(() => {\n if (loading) {\n checkForExistingSpinners();\n }\n }, [loading, checkForExistingSpinners]);\n\n useEffect(() => {\n fetchCategories().then((data) => {\n setCategories(data);\n setIsCategoriesLoaded(true);\n });\n }, [fetchCategories]);\n\n useEffect(() => {\n if (!isCategoriesLoaded) return;\n\n if (categories.length > 0) {\n const categoryId = categories[selectedTab]?.categoryId;\n if (getCategoryId) {\n getCategoryId(categoryId);\n }\n\n setLoading(true);\n fetchProducts(categoryId)\n .then(setProducts)\n .finally(() => {\n setLoading(false);\n setIsLoadingInitialData(false);\n });\n } else {\n setLoading(false);\n }\n }, [categories, selectedTab, fetchProducts, isCategoriesLoaded]);\n\n const itemArray = categories.map((cat) => ({\n label: cat.label,\n content: '',\n categoryId: cat.categoryId,\n }));\n\n return (\n <ProductTabCarouselContainer isMobile={isMobile} $hasCategories={categories.length > 0}>\n {showCustomCategory &&\n (itemArray.length > 0 ? (\n <TabsContainer isMobile={isMobile}>\n <NsCategoryNavigation\n itemArray={itemArray}\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n />\n </TabsContainer>\n ) : (\n <NoTabsContainer>{emptyProductTabs}</NoTabsContainer>\n ))}\n <ContentContainer isMobile={isMobile}>\n {loading ? (\n <SpinnerContainer>{shouldShowSpinner && <NsSpinner />}</SpinnerContainer>\n ) : (\n <ProductCardCarousel\n isInitialDataLoading={isLoadingInitialData}\n entries={products}\n allEntryLabel={allEntryLabel}\n allEntryLink={allEntryLink}\n renderEntry={\n renderEntry\n ? (entry) => renderEntry({ ...entry, productStatusBadge: entry.productStatusBadge })\n : undefined\n }\n settings={settings}\n showControlButtons={showControlButtons}\n categoryName={categories[selectedTab]?.label}\n emptyProductMessage={emptyProductMessage}\n productsCountLabel={productsCountLabel}\n history={history}\n />\n )}\n </ContentContainer>\n </ProductTabCarouselContainer>\n );\n};\n\nexport default ProductTabCarousel;\n","import * as React from 'react';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport Box from '@mui/material/Box';\nimport PropTypes from 'prop-types';\nimport { NsCategoryNavigationContainer } from './NsCategoryNavigation.styled';\nimport { useMediaQuery } from '@mui/material';\n\nfunction TabPanel(\n props: Readonly<{\n children?: React.ReactNode;\n value: number;\n index: number;\n [key: string]: unknown;\n }>,\n) {\n const { children, value, index, ...other } = props;\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`vertical-tabpanel-${index}`}\n aria-labelledby={`vertical-tab-${index}`}\n {...other}\n >\n {value === index && <Box className=\"tabPanel\">{children}</Box>}\n </div>\n );\n}\nTabPanel.propTypes = {\n children: PropTypes.node,\n index: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n};\n\ninterface NsCategoryNavigationProps {\n itemArray: { label: string; content: React.ReactNode; categoryId: string }[];\n value?: number;\n onChange?: (event: React.SyntheticEvent, newValue: number) => void;\n}\n\nexport const NsCategoryNavigation: React.FC<Readonly<NsCategoryNavigationProps>> = ({\n itemArray,\n value: controlledValue,\n onChange,\n}) => {\n const [internalValue, setInternalValue] = React.useState(0);\n const isMobile = useMediaQuery('(max-width:768px)');\n const value = controlledValue ?? internalValue;\n const handleChange = (event: React.SyntheticEvent, newValue: number) => {\n if (onChange) {\n onChange(event, newValue);\n } else {\n setInternalValue(newValue);\n }\n };\n\n return (\n <NsCategoryNavigationContainer>\n <Box className=\"tabContainer\">\n <Tabs\n orientation={isMobile ? 'horizontal' : 'vertical'}\n variant=\"scrollable\"\n value={value}\n onChange={handleChange}\n aria-label=\"Vertical tabs example\"\n className=\"tabsStyle\"\n >\n {itemArray.map((item) => (\n <Tab key={item.categoryId} label={item.label} className=\"tabStyle\" />\n ))}\n </Tabs>\n {itemArray.map((item) => (\n <TabPanel\n key={item.categoryId}\n value={value}\n index={itemArray.findIndex((i) => i.categoryId === item.categoryId)}\n >\n {item.content}\n </TabPanel>\n ))}\n </Box>\n </NsCategoryNavigationContainer>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nexport const NsCategoryNavigationContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n background-color: #fff;\n .tabsStyle {\n display: flex;\n padding-top: 8.533px;\n flex-direction: column;\n align-items: flex-start;\n gap: 12.8px;\n border-right: 1px;\n border-color: divider;\n width: 200px;\n & .Mui-selected {\n font-weight: 700;\n font-size: 14px;\n font-family: 'inter', sans-serif;\n font-style: normal;\n font-height: 20px;\n border-radius: 4px;\n }\n & .MuiTabs-indicator {\n left: 0;\n background-color: #5b81a5;\n color: #5b81a5;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n }\n\n .tabContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n min-width: 100%;\n background-color: #fff;\n @media (max-width: 768px) {\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n }\n\n .tabStyle {\n align-items: flex-start;\n display: flex;\n text-align: left;\n font-size: 14px;\n font-family: 'inter' sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n padding: 1px;\n padding-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n text-transform: none;\n }\n @media (max-width: 768px) {\n flex-direction: row;\n\n .tabsStyle {\n width: 100%;\n border-right: none;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 0px;\n }\n\n .tabStyle {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 70px;\n padding: 8px 16px;\n text-align: center;\n margin: 4px;\n background-color: #fff;\n cursor: pointer;\n color: black;\n font-family: Inter;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n }\n\n .tabStyle.Mui-selected {\n background-color: #5b81a5;\n color: #ffffff !important;\n font-weight: 700;\n border-radius: 70px;\n }\n }\n .tabPanel {\n padding: 8px;\n text-align: left;\n }\n`;\n","import { styled } from '@nuskin/foundation-theme';\n\nconst getMinHeight = ({ isMobile, $hasCategories }: { isMobile?: boolean; $hasCategories?: boolean }) => {\n if (isMobile) return 'auto';\n return $hasCategories ? '800px' : 'auto';\n};\n\nexport const ProductTabCarouselContainer = styled('div')<{ isMobile?: boolean; $hasCategories?: boolean }>`\n display: flex;\n flex-direction: ${({ isMobile }) => (isMobile ? 'column' : 'row')};\n align-items: ${({ isMobile }) => (isMobile ? 'stretch' : 'flex-start')};\n width: 100%;\n max-width: 1920px;\n min-height: ${getMinHeight};\n margin: 0 auto;\n box-sizing: border-box;\n overflow: visible;\n background: #fff;\n padding: ${({ isMobile }) => (isMobile ? '10px 16px 0px 16px' : '50px 60px 0px 60px')};\n\n @media (max-width: 768px) {\n padding: 10px 16px 0px 16px;\n min-height: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n padding: 30px 40px 0px 40px;\n gap: 20px;\n }\n\n transform: translateZ(0);\n will-change: auto;\n`;\n\nexport const TabsContainer = styled('div')<{ isMobile?: boolean }>`\n min-width: ${({ isMobile }) => (isMobile ? '100%' : 'auto')};\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n\n overflow-x: auto;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-width: 200px;\n margin-right: 20px;\n }\n`;\n\nexport const ContentContainer = styled('div')<{ isMobile?: boolean }>`\n flex: 1;\n min-width: 0;\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n min-height: 300px;\n\n -webkit-overflow-scrolling: touch;\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-height: 400px;\n }\n\n contain: layout style paint;\n transform: translateZ(0);\n`;\n\nexport const LoadingContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n padding: 20px;\n\n @media (max-width: 768px) {\n min-height: 150px;\n padding: 16px;\n }\n`;\n\nexport const NoTabsContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 40px 20px;\n color: #666;\n font-size: 16px;\n\n @media (max-width: 768px) {\n padding: 20px 16px;\n font-size: 14px;\n }\n`;\nexport const SpinnerContainer = styled('div')`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;\n","import React, { ReactElement, useState, useEffect, useMemo } from 'react';\nimport { Typography, Box, useMediaQuery, Tooltip } from '@mui/material';\nimport { NsLink, NsImage } from '@nuskin/foundation-ui-components';\nimport {\n MysiteHeroContainer,\n MysiteHeroContainerMobile,\n BadgeContainer,\n Badge,\n ToggleButtonMobile,\n StyledSpan,\n ImgTabIndex,\n ContactLink,\n BadgeValue,\n} from '@/common/headers/MysiteHero.styled';\nimport { PlaceholderImage } from '../icon/icons/PlaceholderImage';\nimport { ArrowDownIcon } from '../icon/icons/ArrowDownIcon';\nimport { trackGTMEvent } from '../utils/gtmTracking';\n\ntype MysiteHeroProps = {\n readonly imageDetails?: {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n };\n readonly shopTitle: string;\n readonly shopDescription: string;\n readonly socialTitleText: string;\n readonly email: string;\n readonly phone: string;\n readonly className?: string;\n readonly bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n readonly socialIcons?: {\n type: string;\n url: string;\n }[];\n readonly expirationDate?: string;\n readonly showBadges?: boolean;\n readonly totalSavings?: string;\n};\n\ntype ImageDetails = {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n};\n\ntype BannerProps = {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n};\n\ntype ContentProps = {\n shopTitle: string;\n shopDescription: string;\n socialTitleText: string;\n email: string;\n phone: string;\n showBadges: boolean;\n expirationDate?: string;\n totalSavings?: string;\n};\n\nconst renderImageContent = (imageDetails: ImageDetails | undefined, bannerProps: BannerProps, className: string) => {\n const placeholderClass = className.includes('mobile') ? 'placeholder-image-mobile' : 'placeholder-image';\n return imageDetails?.imageSrc ? (\n <ImgTabIndex tabIndex={0}>\n <NsImage className={className} src={imageDetails.imageSrc} alt={imageDetails.imageAlt} />\n </ImgTabIndex>\n ) : (\n <Box className={placeholderClass}>\n <PlaceholderImage\n width={className.includes('mobile') ? '144px' : '246px'}\n height={className.includes('mobile') ? '144px' : '246px'}\n backgroundColor={bannerProps?.backgroundColor ?? '#5F5F5F'}\n />\n </Box>\n );\n};\n\nconst renderBadges = (\n showBadges: boolean,\n expirationDate: string,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n totalSavings?: string,\n) => {\n if (!showBadges || (!expirationDate && !totalSavings)) return null;\n\n const badgeClass = isMobile ? 'mobile-badge' : 'tablet-badge';\n const containerClass = isMobile ? 'mobile-badges' : 'tablet-badges';\n\n return (\n <BadgeContainer className={containerClass}>\n {totalSavings && (\n <Badge\n className={`${badgeClass} total-savings-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{totalSavings}</BadgeValue>\n </Badge>\n )}\n {expirationDate && (\n <Badge\n className={`${badgeClass} expiration-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{expirationDate}</BadgeValue>\n </Badge>\n )}\n </BadgeContainer>\n );\n};\n\nconst renderMobileContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, socialTitleText, email, showBadges, expirationDate, phone, totalSavings } = props;\n\n return (\n <Box className=\"content-mobile\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title-mobile\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text-mobile\">\n {socialTitleText}\n </Typography>\n {email?.trim() && renderContactLink('email', email, 'email-text-mobile')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text-mobile')}\n <Box className=\"social-icons-mobile\">{renderSocialMediaIcons}</Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst renderDesktopContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, shopDescription, socialTitleText, email, phone, showBadges, expirationDate, totalSavings } =\n props;\n\n return (\n <Box className=\"content\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n {shopDescription?.length > 480 ? (\n <Tooltip title={shopDescription} arrow>\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n </Tooltip>\n ) : (\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n )}\n <Box className=\"social-media\">\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text\">\n {socialTitleText}\n </Typography>\n <Box className=\"social-icons\">\n {renderSocialMediaIcons}\n {email?.trim() && renderContactLink('email', email, 'email-text')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text')}\n </Box>\n </Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst checkIfImageIsCircular = (url: string): Promise<boolean> => {\n return new Promise((resolve, reject) => {\n const imageContext = new Image();\n imageContext.crossOrigin = 'anonymous';\n imageContext.src = url;\n\n imageContext.onload = () => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return reject(new Error('Canvas not supported'));\n\n canvas.width = imageContext.width;\n canvas.height = imageContext.height;\n\n context.drawImage(imageContext, 0, 0);\n\n const corners = [\n context.getImageData(0, 0, 1, 1).data,\n context.getImageData(imageContext.width - 1, 0, 1, 1).data,\n context.getImageData(0, imageContext.height - 1, 1, 1).data,\n context.getImageData(imageContext.width - 1, imageContext.height - 1, 1, 1).data,\n ];\n\n const isCircular = corners.every((corner) => {\n const imageArray = Array.prototype.slice.call(corner);\n const alpha = imageArray[3];\n return alpha < 10;\n });\n resolve(isCircular);\n };\n imageContext.onerror = () => reject(new Error('Failed to load image'));\n });\n};\n\nconst isWhiteOrNearWhite = (color: string | undefined): boolean => {\n if (!color) return false;\n\n const hex = color.replace('#', '').toLowerCase();\n\n /* regex pattern for hex color format: 3 chars (#fff), 4 chars (#ffff), 6 chars (#ffffff), or 8 chars (#ffffffff)*/\n if (!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(hex)) return false;\n\n let fullHex = hex;\n if (hex.length === 3 || hex.length === 4) {\n fullHex = hex\n .split('')\n .map((char) => char + char)\n .join('');\n }\n\n const r = Number.parseInt(fullHex.substring(0, 2), 16);\n const g = Number.parseInt(fullHex.substring(2, 4), 16);\n const b = Number.parseInt(fullHex.substring(4, 6), 16);\n\n const threshold = 220;\n return r >= threshold && g >= threshold && b >= threshold;\n};\n\nconst createContactClickHandler = (contactType: 'email' | 'phone', contactValue: string) => ({\n onClick: () => {\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n globalThis.location.href = `${contactType === 'email' ? 'mailto' : 'tel'}:${contactValue}`;\n }\n },\n});\n\nconst renderContactLink = (contactType: 'email' | 'phone', contactValue: string, className: string) => {\n const protocol = contactType === 'email' ? 'mailto:' : 'tel:';\n const handlers = createContactClickHandler(contactType, contactValue);\n\n return (\n <Typography className={className}>\n <ContactLink href={`${protocol}${contactValue}`} {...handlers}>\n {contactValue}\n </ContactLink>\n </Typography>\n );\n};\nexport default function MysiteHero({\n className,\n shopTitle,\n shopDescription,\n socialTitleText,\n imageDetails,\n email,\n phone,\n bannerProps,\n socialIcons,\n expirationDate,\n showBadges = false,\n totalSavings,\n}: MysiteHeroProps): ReactElement {\n const isMobile = useMediaQuery('(max-width: 560px)');\n const [isScrolled, setIsScrolled] = useState(false);\n const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);\n const [hasWhiteBackground, setHasWhiteBackground] = useState(false);\n const [isImageCircular, setIsImageCircular] = useState(false);\n\n const toggleDescription = () => {\n setIsDescriptionExpanded(!isDescriptionExpanded);\n };\n\n useEffect(() => {\n const checkImage = async () => {\n if (imageDetails?.imageSrc) {\n const isCircular = await checkIfImageIsCircular(imageDetails.imageSrc);\n setIsImageCircular(isCircular);\n } else {\n setIsImageCircular(false);\n }\n };\n\n checkImage();\n }, [imageDetails?.imageSrc]);\n\n useEffect(() => {\n setHasWhiteBackground(isWhiteOrNearWhite(bannerProps?.backgroundColor));\n }, [bannerProps?.backgroundColor]);\n\n useEffect(() => {\n let debounceTimeout: ReturnType<typeof setTimeout>;\n let lastScrollY = window.scrollY;\n let currentScrollState = false;\n let isTransitioning = false;\n let lastUpdateTime = 0;\n\n const updateScrollState = (newState: boolean) => {\n const now = Date.now();\n\n if (currentScrollState !== newState && !isTransitioning) {\n if (now - lastUpdateTime < 100) {\n return;\n }\n\n isTransitioning = true;\n currentScrollState = newState;\n lastUpdateTime = now;\n\n if (newState) {\n setIsDescriptionExpanded(false);\n }\n\n clearTimeout(debounceTimeout);\n setIsScrolled(newState);\n\n debounceTimeout = setTimeout(() => {\n isTransitioning = false;\n\n if (newState && window.scrollY < 15) {\n window.scrollTo({\n top: isMobile ? 20 : 30,\n behavior: 'smooth',\n });\n }\n }, 300);\n }\n };\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n if (isTransitioning) {\n lastScrollY = currentScrollY;\n return;\n }\n\n const scrollDelta = Math.abs(currentScrollY - lastScrollY);\n\n if (scrollDelta < 0.5) {\n return;\n }\n\n const scrollingDown = currentScrollY > lastScrollY;\n\n const scrollDownThreshold = isMobile ? 15 : 25;\n const scrollUpThreshold = isMobile ? 8 : 12;\n\n if (scrollingDown && currentScrollY > scrollDownThreshold && !currentScrollState) {\n updateScrollState(true);\n } else if (!scrollingDown && currentScrollY < scrollUpThreshold && currentScrollState) {\n updateScrollState(false);\n }\n\n lastScrollY = currentScrollY;\n };\n\n const initializeState = () => {\n const initialScrollY = window.scrollY;\n const scrollThreshold = isMobile ? 5 : 10;\n const shouldStartCompact = initialScrollY > scrollThreshold;\n\n currentScrollState = shouldStartCompact;\n setIsScrolled(shouldStartCompact);\n lastScrollY = initialScrollY;\n lastUpdateTime = Date.now();\n };\n\n let rafId: number | null = null;\n let lastRafTime = 0;\n const throttledScrollHandler = () => {\n if (rafId) return;\n\n const now = Date.now();\n if (now - lastRafTime < 16) {\n return;\n }\n\n rafId = requestAnimationFrame(() => {\n handleScroll();\n lastRafTime = Date.now();\n rafId = null;\n });\n };\n\n initializeState();\n window.addEventListener('scroll', throttledScrollHandler, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', throttledScrollHandler);\n if (rafId) cancelAnimationFrame(rafId);\n clearTimeout(debounceTimeout);\n };\n }, [isMobile]);\n\n const renderSocialMediaIcons = useMemo(() => {\n return socialIcons?.map((icon, index) => {\n const handleSocialClick = (e: React.MouseEvent) => {\n e.preventDefault();\n trackGTMEvent({\n event: 'social_click',\n social_platform: icon.type,\n social_url: icon.url,\n click_element: 'social_icon',\n });\n window.open(icon.url, '_blank');\n };\n\n return (\n <StyledSpan key={icon?.type + index} onClick={handleSocialClick}>\n <NsLink href={icon.url} target=\"_blank\">\n <NsImage\n key={icon?.type + index}\n src={`https://www.google.com/s2/favicons?domain=${icon?.url}&sz=24`}\n alt={`${icon.type} icon`}\n width=\"24\"\n height=\"24\"\n />\n </NsLink>\n </StyledSpan>\n );\n });\n }, [socialIcons]);\n\n const containerClass = `${className} ${isScrolled ? 'scrolled' : ''}`;\n const props = {\n shopTitle,\n shopDescription,\n socialTitleText,\n email,\n phone,\n showBadges,\n expirationDate,\n totalSavings,\n };\n\n const getCharacterLimit = () => {\n if (window.innerWidth <= 380) return 50;\n if (window.innerWidth <= 415) return 56;\n if (window.innerWidth <= 460) return 62;\n return 80;\n };\n\n const shouldShowToggle = isMobile && shopDescription && shopDescription.length > getCharacterLimit();\n\n return isMobile ? (\n <MysiteHeroContainerMobile\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n <Box className=\"image-content-mobile\">\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image-mobile')}\n {renderMobileContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </Box>\n {!isScrolled && (\n <Box className=\"expandable-description-mobile\">\n <Typography\n className={`description-content-mobile ${isDescriptionExpanded || !shouldShowToggle ? 'expanded' : 'collapsed'}`}\n >\n {shopDescription}\n </Typography>\n {shouldShowToggle && (\n <ToggleButtonMobile onClick={toggleDescription}>\n <ArrowDownIcon\n width={16}\n height={16}\n className={`arrow-icon-mobile ${isDescriptionExpanded ? 'expanded' : ''}`}\n />\n </ToggleButtonMobile>\n )}\n </Box>\n )}\n </MysiteHeroContainerMobile>\n ) : (\n <MysiteHeroContainer\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image')}\n {renderDesktopContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </MysiteHeroContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport { Box, BoxProps } from '@mui/material';\n\ninterface StyledBoxProps extends BoxProps {\n bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n isCircularImage?: boolean;\n hasWhiteBackground?: boolean;\n}\n\ninterface BadgeProps extends BoxProps {\n hasWhiteBackground?: boolean;\n}\n\nconst getContactTextStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '600',\n lineHeight: '16px',\n letterSpacing: '0.12px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n});\n\nconst getSocialTitleStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '700',\n lineHeight: '16px',\n letterSpacing: '0.48px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n textTransform: 'uppercase' as const,\n paddingLeft: '5px',\n});\n\nconst getSocialIconsStyles = () => ({\n display: 'flex',\n flexDirection: 'row' as const,\n gap: '10px',\n alignItems: 'center',\n});\n\nconst getContactTextMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getContactTextStyles(hasWhiteBackground),\n paddingBottom: '11px',\n wordBreak: 'break-all' as const,\n overflowWrap: 'break-word' as const,\n paddingLeft: '5px',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n },\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '15px',\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '14px',\n paddingBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '12px',\n paddingBottom: '4px',\n },\n});\n\nconst getSocialTitleMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '11px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '14px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '12px',\n marginBottom: '5px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '11px',\n marginBottom: '4px',\n },\n});\n\nexport const MysiteHeroContainer = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n height: 'auto',\n flexDirection: 'row',\n alignItems: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content': {\n paddingTop: '0',\n justifyContent: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title': {\n fontSize: '26px',\n lineHeight: '34px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n\n '.bg-image': {\n width: '90px',\n height: '90px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n '& > div': {\n width: '90px',\n height: '90px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.content': {\n width: '70%',\n height: '100%',\n marginLeft: '2%',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image': {\n width: '252px',\n height: '252px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '3px' : '0px',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n '.body-title': {\n fontSize: '32px',\n lineHeight: '38px',\n marginBottom: '8px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-text': {\n fontSize: '16px',\n marginBottom: '12px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '22px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n WebkitLineClamp: 3,\n textOverflow: 'ellipsis',\n paddingLeft: '5px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.social-media': {\n display: 'flex',\n flexDirection: 'column',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.email-text': getContactTextStyles(hasWhiteBackground),\n '.phone-text': getContactTextStyles(hasWhiteBackground),\n '.social-title-text': {\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '8px',\n },\n '.social-icons': {\n ...getSocialIconsStyles(),\n paddingBottom: '8px',\n },\n }),\n);\n\nexport const MysiteHeroContainerMobile = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n flexDirection: 'column',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content-mobile': {\n paddingTop: '5px',\n width: '60%',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title-mobile': {\n fontSize: '18px',\n lineHeight: '28px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image-mobile': {\n width: '75px',\n height: '75px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image-mobile': {\n '& > div': {\n width: '75px !important',\n height: '75px !important',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.image-content-mobile': {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '.content-mobile': {\n width: '55%',\n height: '100%',\n paddingTop: '10px',\n paddingRight: '10px',\n marginLeft: '8px',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n paddingTop: '8px',\n width: '100%',\n },\n '@media (max-width: 400px)': {\n paddingTop: '6px',\n width: '100%',\n height: '100%',\n },\n '@media (max-width: 375px)': {\n paddingTop: '4px',\n width: '100%',\n height: '100%',\n },\n },\n '.bg-image-mobile': {\n width: '144px',\n height: '144px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n objectFit: 'cover',\n objectPosition: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '2px' : '0px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '112px',\n height: '112px',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n '.placeholder-image-mobile': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n width: '144px',\n height: '144px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '110px !important',\n height: '110px !important',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n },\n '.body-title-mobile': {\n fontSize: '22px',\n lineHeight: '28px',\n marginBottom: '13px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontStyle: 'normal',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n fontSize: '16px',\n lineHeight: '24px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '16px',\n lineHeight: '22px',\n marginBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '14px',\n lineHeight: '20px',\n marginBottom: '4px',\n },\n },\n '.body-text-mobile': {\n fontSize: '14px',\n padding: '20px 25px 20px 25px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n backgroundColor: '#E0E0E0',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.expandable-description-mobile': {\n backgroundColor: '#E0E0E0',\n position: 'relative',\n },\n '.description-content-mobile': {\n fontSize: '14px',\n padding: '10px 15px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'max-height 0.3s ease-in-out, opacity 0.3s ease-in-out',\n overflow: 'hidden',\n position: 'relative',\n '&.collapsed': {\n maxHeight: '50px',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '20px',\n background: 'linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)',\n pointerEvents: 'none',\n },\n },\n '&.expanded': {\n maxHeight: 'none',\n whiteSpace: 'normal',\n display: 'block',\n '&::after': {\n display: 'none',\n },\n },\n },\n '.email-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.phone-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.social-title-text-mobile': getSocialTitleMobileStyles(hasWhiteBackground),\n '.social-icons-mobile': {\n ...getSocialIconsStyles(),\n paddingBottom: '10px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '& img': {\n width: '24px',\n height: '24px',\n '@media (max-width: 400px)': {\n width: '20px',\n height: '20px',\n },\n '@media (max-width: 375px)': {\n width: '18px',\n height: '18px',\n },\n },\n '@media (max-width: 420px)': {\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n paddingBottom: '4px',\n },\n '@media (max-width: 375px)': {\n paddingBottom: '3px',\n },\n },\n }),\n);\n\nexport const BadgeContainer = styled(Box)({\n display: 'flex',\n gap: '12px',\n marginBottom: '16px',\n paddingLeft: '5px',\n\n '&.mobile-badges': {\n flexDirection: 'column',\n gap: '8px',\n marginBottom: '12px',\n },\n\n '&.tablet-badges': {\n flexDirection: 'row',\n gap: '12px',\n marginBottom: '8px',\n },\n});\n\nexport const Badge = styled((props: BadgeProps) => <Box {...props} />)(({ hasWhiteBackground }) => ({\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(10px)',\n borderRadius: '20px',\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n transition: 'all 0.3s ease',\n\n '&.mobile-badge': {\n padding: '6px 12px',\n borderRadius: '16px',\n fontSize: '12px',\n },\n\n '&.tablet-badge': {\n padding: '8px 16px',\n borderRadius: '20px',\n fontSize: '14px',\n },\n\n '&.total-savings-badge': {\n backgroundColor: '#4A6987',\n border: 'none',\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n backdropFilter: 'none',\n '.badge-value': {\n color: '#FFFFFF',\n },\n '&:hover': {\n backgroundColor: '#4A6987',\n transform: 'none',\n boxShadow: 'none',\n },\n },\n\n '&.expiration-badge': {\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n },\n\n '&:hover': {\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n transform: 'translateY(-1px)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n\n '.badge-text': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '400',\n opacity: 0.9,\n },\n\n '.badge-value': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '600',\n },\n}));\nexport const ToggleButtonMobile = styled('button')({\n backgroundColor: '#E0E0E0',\n border: '1px solid #252525',\n borderRadius: '10px',\n cursor: 'pointer',\n width: '40px',\n height: '20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '10px auto 5px auto',\n transition: 'all 0.2s ease',\n '& .arrow-icon-mobile': {\n transition: 'transform 0.3s ease',\n '&.expanded': {\n transform: 'rotate(180deg)',\n },\n },\n});\nexport const StyledSpan = styled(Box)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`;\nexport const ImgTabIndex = styled('span')`\n line-height: 0.5;\n`;\n\nexport const ContactLink = styled('a')({\n fontSize: 'inherit',\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit',\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n});\n\nexport const BadgeValue = styled('span')({});\n","import React from 'react';\nimport { Box } from '@mui/material';\n\ntype PlaceholderImageProps = {\n readonly width: string | number;\n readonly height: string | number;\n readonly backgroundColor: string;\n};\n\nexport const PlaceholderImage: React.FC<PlaceholderImageProps> = ({ width, height, backgroundColor }) => {\n return (\n <Box\n sx={{\n width,\n height,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor,\n }}\n data-testid=\"placeholder-image\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"129\" viewBox=\"0 0 128 129\" fill=\"none\">\n <g id=\"ns_logomark\">\n <path\n id=\"Vector\"\n d=\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_2\"\n d=\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_3\"\n d=\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_4\"\n d=\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_5\"\n d=\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\"\n fill=\"#252525\"\n />\n </g>\n </svg>\n </Box>\n );\n};\n","import React from 'react';\n\ntype ArrowDownIconProps = {\n readonly width?: string | number;\n readonly height?: string | number;\n readonly className?: string;\n};\n\nexport const ArrowDownIcon: React.FC<ArrowDownIconProps> = ({ width = 16, height = 16, className = '' }) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n data-testid=\"arrow-down-icon\"\n >\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n </svg>\n );\n};\n","export interface GTMEvent {\n event: string;\n\n [key: string]: unknown;\n}\n\ndeclare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport function trackGTMEvent(eventData: GTMEvent): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const url = window.location.href;\n const updatedEventData = { ...eventData };\n\n const prefix = url.includes('personal-offer') ? 'postorefront_' : 'mysite_';\n updatedEventData.event = prefix + eventData.event;\n\n try {\n if (window.dataLayer) {\n window.dataLayer.push(updatedEventData);\n } else {\n console.error('GTM dataLayer not available, but event logged');\n window.dataLayer = [];\n window.dataLayer.push(updatedEventData);\n }\n } catch (error) {\n console.error('Failed to track GTM event:', error);\n }\n}\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const DashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 32px;\n }\n`;\n\nexport const StatsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const WidgetContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TwoColumnGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport PublicIcon from '@mui/icons-material/Public';\nimport { NsSpinner } from '@nuskin/foundation-ui-components';\nimport {\n HeaderContainer,\n TitleSection,\n ShopTitle,\n DateRangeLabel,\n FiltersSection,\n FilterDropdownContainer,\n FilterLabel,\n StyledSelect,\n FilterIcon,\n LoadingIndicatorContainer,\n DesktopFiltersContainer,\n} from './DashboardHeader.styled';\nimport type { DateRangeOption, MarketOption, MarketFilterOption, DashboardStats } from '../types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { useMarketOptions } from '../utils/marketOptions';\n\nexport interface DashboardHeaderProps {\n readonly shopTitle?: string;\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly dateRangeLabel?: string;\n readonly isLoading?: boolean;\n readonly stats?: DashboardStats | null;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n}\n\nexport const DashboardHeader: React.FC<DashboardHeaderProps> = ({\n shopTitle,\n dateRange,\n market,\n dateRangeLabel: dateRangeLabelProp,\n isLoading = false,\n stats,\n markets,\n onDateRangeChange,\n onMarketChange,\n}) => {\n const marketOptions = useMarketOptions(markets);\n\n const handleDateRangeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newDateRange = event.target.value as DateRangeOption;\n onDateRangeChange?.(newDateRange);\n };\n\n const handleMarketChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newMarket = event.target.value;\n onMarketChange?.(newMarket);\n };\n\n const handleFilterKeyDown = (event: React.KeyboardEvent<HTMLSelectElement>) => {\n if (event.key === 'Escape') {\n (event.target as HTMLSelectElement).blur();\n }\n };\n\n const getDateRangeLabelText = () => {\n if (dateRangeLabelProp) return dateRangeLabelProp;\n if (stats?.dateRange) return stats.dateRange.label;\n return getTranslation(Keys.filter.dateRange.last30days);\n };\n\n return (\n <HeaderContainer as=\"header\" data-testid=\"dashboard-header\">\n <TitleSection>\n <ShopTitle data-testid=\"dashboard-shop-title\">\n {shopTitle ?? stats?.shopTitle ?? getTranslation(Keys.title)}\n </ShopTitle>\n <DateRangeLabel aria-live=\"polite\" data-testid=\"dashboard-date-range-label\">\n {getDateRangeLabelText()}\n </DateRangeLabel>\n </TitleSection>\n\n <FiltersSection\n aria-label={getTranslation(Keys.ariaLabel.dashboardFilters)}\n data-testid=\"dashboard-filters-section\"\n >\n <DesktopFiltersContainer>\n {isLoading && (\n <LoadingIndicatorContainer\n as=\"output\"\n aria-live=\"polite\"\n aria-label={getTranslation(Keys.ariaLabel.loadingDashboard)}\n data-testid=\"dashboard-loading-indicator\"\n >\n <NsSpinner />\n </LoadingIndicatorContainer>\n )}\n\n <FilterDropdownContainer>\n <FilterLabel htmlFor=\"filter-date-range\">\n {getTranslation(Keys.filter.dateRangeLabel)}\n </FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <CalendarTodayIcon />\n </FilterIcon>\n <StyledSelect\n id=\"filter-date-range\"\n data-testid=\"filter-date-range\"\n value={dateRange}\n onChange={handleDateRangeChange}\n onKeyDown={handleFilterKeyDown}\n disabled={isLoading}\n aria-label={`${getTranslation(Keys.ariaLabel.dateRangeFilter)} ${getTranslation(Keys.filter.dateRange[dateRange])}`}\n >\n <option value=\"last7days\">{getTranslation(Keys.filter.dateRange.last7days)}</option>\n <option value=\"last30days\">{getTranslation(Keys.filter.dateRange.last30days)}</option>\n <option value=\"last90days\">{getTranslation(Keys.filter.dateRange.last90days)}</option>\n <option value=\"thisMonth\">{getTranslation(Keys.filter.dateRange.thisMonth)}</option>\n </StyledSelect>\n </FilterDropdownContainer>\n\n <FilterDropdownContainer>\n <FilterLabel htmlFor=\"filter-market\">{getTranslation(Keys.filter.marketLabel)}</FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <PublicIcon />\n </FilterIcon>\n <StyledSelect\n id=\"filter-market\"\n data-testid=\"filter-market\"\n value={market}\n onChange={handleMarketChange}\n onKeyDown={handleFilterKeyDown}\n disabled={isLoading}\n aria-label={`${getTranslation(Keys.ariaLabel.marketFilter)} ${\n marketOptions.find((opt) => opt.value === market)?.label ?? String(market)\n }`}\n >\n {marketOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </StyledSelect>\n </FilterDropdownContainer>\n </DesktopFiltersContainer>\n </FiltersSection>\n </HeaderContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 12px;\n min-height: 64px;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px 32px;\n }\n`;\n\nexport const TitleSection = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`;\n\nexport const ShopTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n\n @media (min-width: 1080px) {\n font-size: 16px;\n }\n`;\n\nexport const DateRangeLabel = styled('div')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`;\n\nexport const FilterDropdownContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`;\n\nexport const FilterLabel = styled('label')`\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N80')};\n white-space: nowrap;\n display: none;\n\n @media (min-width: 1080px) {\n display: block;\n }\n`;\n\nexport const StyledSelect = styled('select')`\n display: flex;\n align-items: center;\n gap: 12px;\n height: 40px;\n padding: 8px 12px;\n background-color: transparent;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;charset=UTF-8,%3csvg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M5.625 7.3125L9 10.6875L12.375 7.3125\" stroke=\"%235f5f5f\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/%3e%3c/svg%3e');\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 32px;\n min-width: auto;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n @media (min-width: 768px) {\n min-width: 160px;\n }\n\n @media (min-width: 1080px) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N10')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n min-width: 180px;\n }\n`;\n\nexport const FilterIcon = styled('span')`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n width: 16px;\n height: 16px;\n }\n`;\n\nexport const LoadingIndicatorContainer = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n overflow: hidden;\n\n svg,\n img,\n > * {\n width: 28px !important;\n height: 28px !important;\n max-width: 28px;\n max-height: 28px;\n }\n`;\n\nexport const DesktopFiltersContainer = styled('div')`\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`;\n\nexport const StyledCircularProgress = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","export type TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport type TranslateFn = (key: string, fallback: string) => string;\n\nlet activeResolver: TranslateFn | undefined;\n\nexport function setTranslationResolver(resolver: TranslateFn | undefined): void {\n activeResolver = resolver;\n}\n\nexport function getTranslationResolver(): TranslateFn | undefined {\n return activeResolver;\n}\n\nexport function resolveTranslation(entry: TranslationEntry): string {\n if (!activeResolver) {\n return entry.fallback;\n }\n let result: string | undefined;\n try {\n result = activeResolver(entry.key, entry.fallback);\n } catch {\n result = undefined;\n }\n return typeof result === 'string' && result.length > 0 ? result : entry.fallback;\n}\n","import { resolveTranslation } from './translationResolver';\n\nexport const ShoppingDashboardTranslationKeys = {\n title: {\n key: 'shoppingDashboard.title',\n fallback: 'Shop Performance',\n },\n error: {\n key: 'shoppingDashboard.error',\n fallback: 'Error loading dashboard',\n },\n stats: {\n revenue: {\n key: 'shoppingDashboard.stats.revenue',\n fallback: 'Total Revenue',\n },\n volume: {\n key: 'shoppingDashboard.stats.volume',\n fallback: 'Volume',\n },\n visits: {\n key: 'shoppingDashboard.stats.visits',\n fallback: 'Site Visits',\n },\n subtitle: {\n dcSv: {\n key: 'shoppingDashboard.stats.subtitle.dcSv',\n fallback: 'DC-SV',\n },\n conversionRate: {\n key: 'shoppingDashboard.stats.subtitle.conversionRate',\n fallback: 'Conversion Rate',\n },\n },\n trend: {\n increased: {\n key: 'shoppingDashboard.stats.trend.increased',\n fallback: 'increased',\n },\n decreased: {\n key: 'shoppingDashboard.stats.trend.decreased',\n fallback: 'decreased',\n },\n unchanged: {\n key: 'shoppingDashboard.stats.trend.unchanged',\n fallback: 'unchanged',\n },\n },\n details: {\n key: 'shoppingDashboard.stats.details',\n fallback: 'details',\n },\n },\n filter: {\n dateRange: {\n label: {\n key: 'shoppingDashboard.filter.dateRange.label',\n fallback: 'Date Range',\n },\n last7days: {\n key: 'shoppingDashboard.filter.dateRange.last7days',\n fallback: 'Last 7 Days',\n },\n last30days: {\n key: 'shoppingDashboard.filter.dateRange.last30days',\n fallback: 'Last 30 Days',\n },\n last90days: {\n key: 'shoppingDashboard.filter.dateRange.last90days',\n fallback: 'Last 90 Days',\n },\n thisMonth: {\n key: 'shoppingDashboard.filter.dateRange.thisMonth',\n fallback: 'This Month',\n },\n },\n dateRangeLabel: {\n key: 'shoppingDashboard.filter.dateRangeLabel',\n fallback: 'Date Range',\n },\n market: {\n label: {\n key: 'shoppingDashboard.filter.market.label',\n fallback: 'Market',\n },\n all: {\n key: 'shoppingDashboard.filter.market.all',\n fallback: 'All Markets',\n },\n },\n marketLabel: {\n key: 'shoppingDashboard.filter.marketLabel',\n fallback: 'Market',\n },\n productSort: {\n label: {\n key: 'shoppingDashboard.filter.productSort.label',\n fallback: 'Sort By',\n },\n units: {\n key: 'shoppingDashboard.filter.productSort.units',\n fallback: 'Units',\n },\n revenue: {\n key: 'shoppingDashboard.filter.productSort.revenue',\n fallback: 'Revenue',\n },\n volume: {\n key: 'shoppingDashboard.filter.productSort.volume',\n fallback: 'Volume',\n },\n byUnits: {\n key: 'shoppingDashboard.filter.productSort.byUnits',\n fallback: 'By: Units',\n },\n byRevenue: {\n key: 'shoppingDashboard.filter.productSort.byRevenue',\n fallback: 'By: Revenue',\n },\n byVolume: {\n key: 'shoppingDashboard.filter.productSort.byVolume',\n fallback: 'By: Volume',\n },\n },\n signupView: {\n label: {\n key: 'shoppingDashboard.filter.signupView.label',\n fallback: 'Show',\n },\n all: {\n key: 'shoppingDashboard.filter.signupView.all',\n fallback: 'All',\n },\n members: {\n key: 'shoppingDashboard.filter.signupView.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.filter.signupView.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.filter.signupView.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n showAll: {\n key: 'shoppingDashboard.filter.signupView.showAll',\n fallback: 'Show: All',\n },\n showMembers: {\n key: 'shoppingDashboard.filter.signupView.showMembers',\n fallback: 'Show: Members',\n },\n showRetail: {\n key: 'shoppingDashboard.filter.signupView.showRetail',\n fallback: 'Show: Retail',\n },\n showBrandAffiliates: {\n key: 'shoppingDashboard.filter.signupView.showBrandAffiliates',\n fallback: 'Show: Brand Affiliates',\n },\n },\n conversionType: {\n all: {\n key: 'shoppingDashboard.filter.conversionType.all',\n fallback: 'All',\n },\n standard: {\n key: 'shoppingDashboard.filter.conversionType.standard',\n fallback: 'Standard',\n },\n subscription: {\n key: 'shoppingDashboard.filter.conversionType.subscription',\n fallback: 'Subscription',\n },\n },\n categorySort: {\n byRevenue: {\n key: 'shoppingDashboard.filter.categorySort.byRevenue',\n fallback: 'By: Revenue',\n },\n byTrend: {\n key: 'shoppingDashboard.filter.categorySort.byTrend',\n fallback: 'By: Trend',\n },\n },\n },\n widget: {\n topProducts: {\n title: {\n key: 'shoppingDashboard.widget.topProducts.title',\n fallback: 'Top Selling Products',\n },\n viewAll: {\n key: 'shoppingDashboard.widget.topProducts.viewAll',\n fallback: 'View All Products',\n },\n units: {\n key: 'shoppingDashboard.widget.topProducts.units',\n fallback: 'Units',\n },\n revenue: {\n key: 'shoppingDashboard.widget.topProducts.revenue',\n fallback: 'Revenue',\n },\n loading: {\n key: 'shoppingDashboard.widget.topProducts.loading',\n fallback: 'Loading products...',\n },\n empty: {\n key: 'shoppingDashboard.widget.topProducts.empty',\n fallback: 'No products available',\n },\n ariaLabel: {\n key: 'shoppingDashboard.widget.topProducts.ariaLabel',\n fallback: 'Top Selling Products widget',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.titleAriaLabel',\n fallback: 'Click to view full top products details page',\n },\n sortAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.sortAriaLabel',\n fallback: 'Sort products by',\n },\n noImageAriaLabel: {\n key: 'shoppingDashboard.widget.topProducts.noImageAriaLabel',\n fallback: 'No image available',\n },\n unitsSuffix: {\n key: 'shoppingDashboard.widget.topProducts.unitsSuffix',\n fallback: 'units',\n },\n revenueSuffix: {\n key: 'shoppingDashboard.widget.topProducts.revenueSuffix',\n fallback: 'revenue',\n },\n dcSvSuffix: {\n key: 'shoppingDashboard.widget.topProducts.dcSvSuffix',\n fallback: 'DC-SV',\n },\n rank: {\n key: 'shoppingDashboard.widget.topProducts.rank',\n fallback: 'Rank',\n },\n trend: {\n key: 'shoppingDashboard.widget.topProducts.trend',\n fallback: 'Trend',\n },\n },\n conversionRate: {\n title: {\n key: 'shoppingDashboard.widget.conversionRate.title',\n fallback: 'Conversion Rate',\n },\n formula: {\n key: 'shoppingDashboard.widget.conversionRate.formula',\n fallback: 'Orders \\u00F7 Site visits',\n },\n comparison: {\n key: 'shoppingDashboard.widget.conversionRate.comparison',\n fallback: 'compared to this time last month',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.chartAriaLabel',\n fallback: 'Conversion Rate chart showing daily rates',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.titleAriaLabel',\n fallback: 'Click to view full conversion rate details page',\n },\n filterAriaLabel: {\n key: 'shoppingDashboard.widget.conversionRate.filterAriaLabel',\n fallback: 'Filter conversion rate by customer type',\n },\n noData: {\n key: 'shoppingDashboard.widget.conversionRate.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.widget.conversionRate.noChange',\n fallback: 'No change',\n },\n tooltipOrders: {\n key: 'shoppingDashboard.widget.conversionRate.tooltipOrders',\n fallback: 'orders',\n },\n tooltipVisits: {\n key: 'shoppingDashboard.widget.conversionRate.tooltipVisits',\n fallback: 'visits',\n },\n ordersPerSiteVisits: {\n key: 'shoppingDashboard.widget.conversionRate.ordersPerSiteVisits',\n fallback: 'Orders / Site Visits',\n },\n },\n signups: {\n title: {\n key: 'shoppingDashboard.widget.signups.title',\n fallback: 'Sign-ups',\n },\n total: {\n key: 'shoppingDashboard.widget.signups.total',\n fallback: 'Total',\n },\n members: {\n key: 'shoppingDashboard.widget.signups.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.widget.signups.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.widget.signups.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.signups.chartAriaLabel',\n fallback: 'Signups multi-line chart showing Total, Members, Retail, and Brand Affiliates',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.signups.titleAriaLabel',\n fallback: 'Click to view full signups details page',\n },\n filterAriaLabel: {\n key: 'shoppingDashboard.widget.signups.filterAriaLabel',\n fallback: 'Filter signups view',\n },\n noData: {\n key: 'shoppingDashboard.widget.signups.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.widget.signups.noChange',\n fallback: 'No change',\n },\n totalSignupsInPeriod: {\n key: 'shoppingDashboard.widget.signups.totalSignupsInPeriod',\n fallback: 'Total sign-ups in period',\n },\n noTrendData: {\n key: 'shoppingDashboard.widget.signups.noTrendData',\n fallback: 'No sign-up trend data available.',\n },\n },\n topCategories: {\n title: {\n key: 'shoppingDashboard.widget.topCategories.title',\n fallback: 'Top Categories',\n },\n revenue: {\n key: 'shoppingDashboard.widget.topCategories.revenue',\n fallback: 'Revenue',\n },\n units: {\n key: 'shoppingDashboard.widget.topCategories.units',\n fallback: 'Units',\n },\n empty: {\n key: 'shoppingDashboard.widget.topCategories.empty',\n fallback: 'No category data available',\n },\n chartAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.chartAriaLabel',\n fallback: 'Top Categories donut chart showing revenue distribution by category',\n },\n titleAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.titleAriaLabel',\n fallback: 'Click to view full categories details page',\n },\n sortAriaLabel: {\n key: 'shoppingDashboard.widget.topCategories.sortAriaLabel',\n fallback: 'Sort categories by',\n },\n },\n menu: {\n ariaLabel: {\n key: 'shoppingDashboard.widget.menu.ariaLabel',\n fallback: 'widget options',\n },\n fullView: {\n key: 'shoppingDashboard.widget.menu.fullView',\n fallback: 'Full View',\n },\n },\n },\n navigation: {\n backToDashboard: {\n key: 'shoppingDashboard.navigation.backToDashboard',\n fallback: 'Back to Dashboard',\n },\n backAriaLabel: {\n key: 'shoppingDashboard.navigation.backAriaLabel',\n fallback: 'Back to dashboard',\n },\n },\n ariaLabel: {\n dashboard: {\n key: 'shoppingDashboard.ariaLabel.dashboard',\n fallback: 'Shopping Dashboard',\n },\n statsRow: {\n key: 'shoppingDashboard.ariaLabel.statsRow',\n fallback: 'Key performance metrics',\n },\n dashboardFilters: {\n key: 'shoppingDashboard.ariaLabel.dashboardFilters',\n fallback: 'Dashboard filters',\n },\n loadingDashboard: {\n key: 'shoppingDashboard.ariaLabel.loadingDashboard',\n fallback: 'Loading dashboard data',\n },\n dateRangeFilter: {\n key: 'shoppingDashboard.ariaLabel.dateRangeFilter',\n fallback: 'Date range filter, currently selected:',\n },\n marketFilter: {\n key: 'shoppingDashboard.ariaLabel.marketFilter',\n fallback: 'Market filter, currently selected:',\n },\n filterSuffix: {\n key: 'shoppingDashboard.ariaLabel.filterSuffix',\n fallback: 'filter',\n },\n },\n fullView: {\n signups: {\n columns: {\n id: { key: 'shoppingDashboard.fullView.signups.columns.id', fallback: 'ID' },\n name: { key: 'shoppingDashboard.fullView.signups.columns.name', fallback: 'Name' },\n date: { key: 'shoppingDashboard.fullView.signups.columns.date', fallback: 'Date' },\n type: { key: 'shoppingDashboard.fullView.signups.columns.type', fallback: 'Type' },\n email: { key: 'shoppingDashboard.fullView.signups.columns.email', fallback: 'Email' },\n status: { key: 'shoppingDashboard.fullView.signups.columns.status', fallback: 'Status' },\n },\n detailsTitle: {\n key: 'shoppingDashboard.fullView.signups.detailsTitle',\n fallback: 'Signup Details',\n },\n },\n conversionRate: {\n columns: {\n orderId: { key: 'shoppingDashboard.fullView.conversionRate.columns.orderId', fallback: 'Order ID' },\n date: { key: 'shoppingDashboard.fullView.conversionRate.columns.date', fallback: 'Date' },\n customer: { key: 'shoppingDashboard.fullView.conversionRate.columns.customer', fallback: 'Customer' },\n type: { key: 'shoppingDashboard.fullView.conversionRate.columns.type', fallback: 'Type' },\n items: { key: 'shoppingDashboard.fullView.conversionRate.columns.items', fallback: 'Items' },\n total: { key: 'shoppingDashboard.fullView.conversionRate.columns.total', fallback: 'Order Total' },\n bv: { key: 'shoppingDashboard.fullView.conversionRate.columns.bv', fallback: 'BV' },\n orderTotal: {\n key: 'shoppingDashboard.fullView.conversionRate.columns.orderTotal',\n fallback: 'Order Total',\n },\n totalSv: { key: 'shoppingDashboard.fullView.conversionRate.columns.totalSv', fallback: 'Total SV' },\n },\n orderDetailsTitle: {\n key: 'shoppingDashboard.fullView.conversionRate.orderDetailsTitle',\n fallback: 'Order Details',\n },\n notAvailable: {\n key: 'shoppingDashboard.fullView.conversionRate.notAvailable',\n fallback: 'N/A',\n },\n },\n products: {\n columns: {\n rank: { key: 'shoppingDashboard.fullView.products.columns.rank', fallback: '#' },\n product: { key: 'shoppingDashboard.fullView.products.columns.product', fallback: 'Product' },\n unitsSold: { key: 'shoppingDashboard.fullView.products.columns.unitsSold', fallback: 'Units Sold' },\n revenue: { key: 'shoppingDashboard.fullView.products.columns.revenue', fallback: 'Revenue' },\n volume: { key: 'shoppingDashboard.fullView.products.columns.volume', fallback: 'Volume (DC-SV)' },\n },\n skuPrefix: {\n key: 'shoppingDashboard.fullView.products.skuPrefix',\n fallback: 'SKU',\n },\n noProducts: {\n key: 'shoppingDashboard.fullView.products.noProducts',\n fallback: 'No products available.',\n },\n },\n categories: {\n columns: {\n category: { key: 'shoppingDashboard.fullView.categories.columns.category', fallback: 'Category' },\n revenue: { key: 'shoppingDashboard.fullView.categories.columns.revenue', fallback: 'Revenue' },\n percentOfTotal: {\n key: 'shoppingDashboard.fullView.categories.columns.percentOfTotal',\n fallback: '% of Total',\n },\n trend: { key: 'shoppingDashboard.fullView.categories.columns.trend', fallback: 'Trend' },\n },\n allCategoriesTitle: {\n key: 'shoppingDashboard.fullView.categories.allCategoriesTitle',\n fallback: 'All Categories',\n },\n noCategoryData: {\n key: 'shoppingDashboard.fullView.categories.noCategoryData',\n fallback: 'No category data available.',\n },\n },\n },\n dataTable: {\n noDataAvailable: {\n key: 'shoppingDashboard.dataTable.noDataAvailable',\n fallback: 'No data available',\n },\n sortableColumn: {\n key: 'shoppingDashboard.dataTable.sortableColumn',\n fallback: ', sortable column',\n },\n },\n pagination: {\n previousPage: {\n key: 'shoppingDashboard.pagination.previousPage',\n fallback: 'Previous page',\n },\n nextPage: {\n key: 'shoppingDashboard.pagination.nextPage',\n fallback: 'Next page',\n },\n goToPage: {\n key: 'shoppingDashboard.pagination.goToPage',\n fallback: 'Go to page',\n },\n of: {\n key: 'shoppingDashboard.pagination.of',\n fallback: 'of',\n },\n },\n defaults: {\n zeroTrend: {\n key: 'shoppingDashboard.defaults.zeroTrend',\n fallback: '+0%',\n },\n noValue: {\n key: 'shoppingDashboard.defaults.noValue',\n fallback: '--',\n },\n },\n} as const;\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import { useMemo } from 'react';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport type { MarketFilterOption } from '../types.d';\n\nexport function buildDefaultMarketOptions(): MarketFilterOption[] {\n return [{ value: 'all', label: getTranslation(Keys.filter.market.all) }];\n}\n\nexport function resolveMarketOptions(\n markets: ReadonlyArray<MarketFilterOption> | undefined,\n): ReadonlyArray<MarketFilterOption> {\n if (markets && markets.length > 0) {\n return markets;\n }\n return buildDefaultMarketOptions();\n}\n\nexport function useMarketOptions(\n markets: ReadonlyArray<MarketFilterOption> | undefined,\n): ReadonlyArray<MarketFilterOption> {\n return useMemo(() => resolveMarketOptions(markets), [markets]);\n}\n","import React from 'react';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport {\n StatsCardContainer,\n StatsTitle,\n StatsValueContainer,\n StatsValue,\n StatsSubtitle,\n ValueSubtitleWrapper,\n TrendContainer,\n TrendText,\n StatsCardHeader,\n SplitTitle,\n SplitRow,\n LegendColumn,\n SplitTrend,\n LegendCaption,\n} from './StatsCard.styled';\nimport { StatsCardSkeleton } from './LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface StatsCardProps {\n readonly title: string;\n readonly value: string;\n readonly subtitle?: string;\n readonly caption?: string;\n readonly layout?: 'default' | 'split';\n readonly trendDirection?: 'up' | 'down' | 'neutral';\n readonly trendValue?: string;\n readonly testId?: string;\n readonly isLoading?: boolean;\n}\n\nconst StatsCardComponent: React.FC<StatsCardProps> = ({\n title,\n value,\n subtitle,\n caption,\n layout = 'default',\n trendDirection = 'neutral',\n trendValue,\n testId,\n isLoading = false,\n}) => {\n if (isLoading) {\n return (\n <StatsCardContainer $layout={layout} data-testid={testId}>\n <StatsCardSkeleton />\n </StatsCardContainer>\n );\n }\n\n const getTrendAriaLabel = () => {\n let directionText = getTranslation(Keys.stats.trend.unchanged);\n if (trendDirection === 'up') directionText = getTranslation(Keys.stats.trend.increased);\n else if (trendDirection === 'down') directionText = getTranslation(Keys.stats.trend.decreased);\n\n return `${title} ${directionText} ${trendValue ?? ''}`;\n };\n\n const getTrendChartIcon = (iconSize: string) => {\n if (trendDirection === 'up') {\n return <TrendingUpIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n }\n if (trendDirection === 'down') {\n return <TrendingDownIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n }\n return <ShowChartIcon sx={{ fontSize: iconSize }} aria-hidden=\"true\" />;\n };\n\n if (layout === 'split') {\n return (\n <StatsCardContainer as=\"article\" $layout=\"split\" aria-label={`${title}: ${value}`} data-testid={testId}>\n <SplitTitle id={`stats-title-${testId}`}>{title}</SplitTitle>\n <SplitRow>\n <StatsValue aria-describedby={`stats-title-${testId}`} data-testid={`stats-value-${testId}`}>\n {value}\n </StatsValue>\n {(trendValue ?? caption) && (\n <LegendColumn>\n {trendValue && (\n <SplitTrend\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={getTrendAriaLabel()}\n data-testid={`stats-trend-${testId}`}\n >\n {getTrendChartIcon('18px')}\n <TrendText>{trendValue}</TrendText>\n </SplitTrend>\n )}\n {caption && (\n <LegendCaption data-testid={`stats-caption-${testId}`}>{caption}</LegendCaption>\n )}\n </LegendColumn>\n )}\n </SplitRow>\n </StatsCardContainer>\n );\n }\n\n return (\n <StatsCardContainer as=\"article\" aria-label={`${title}: ${value}`} data-testid={testId}>\n <StatsCardHeader>\n <StatsTitle id={`stats-title-${testId}`}>{title}</StatsTitle>\n </StatsCardHeader>\n\n <StatsValueContainer>\n <ValueSubtitleWrapper>\n <StatsValue aria-describedby={`stats-title-${testId}`} data-testid={`stats-value-${testId}`}>\n {value}\n </StatsValue>\n {subtitle && (\n <StatsSubtitle\n aria-label={`${title} ${getTranslation(Keys.stats.details)}: ${subtitle}`}\n data-testid={`stats-subtitle-${testId}`}\n >\n {subtitle}\n </StatsSubtitle>\n )}\n </ValueSubtitleWrapper>\n\n {trendValue && (\n <TrendContainer\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={getTrendAriaLabel()}\n data-testid={`stats-trend-${testId}`}\n >\n {getTrendChartIcon('16px')}\n <TrendText>{trendValue}</TrendText>\n </TrendContainer>\n )}\n </StatsValueContainer>\n </StatsCardContainer>\n );\n};\n\nexport const StatsCard = React.memo(StatsCardComponent);\nStatsCard.displayName = 'StatsCard';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const StatsCardContainer = styled('div')<{ $layout?: 'default' | 'split' }>`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-sizing: border-box;\n gap: ${({ $layout }) => ($layout === 'split' ? '8px' : '0')};\n padding: ${({ $layout }) => ($layout === 'split' ? '16px' : '12px')};\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 8px;\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '120px')};\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n @media (min-width: 768px) {\n padding: ${({ $layout }) => ($layout === 'split' ? '24px' : '20px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '140px')};\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n min-height: ${({ $layout }) => ($layout === 'split' ? '127px' : '160px')};\n }\n`;\n\nexport const SplitTitle = styled('div')`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`;\n\nexport const SplitRow = styled('div')`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`;\n\nexport const LegendColumn = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`;\n\nexport const SplitTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#9b131a';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`;\n\nexport const LegendCaption = styled('div')`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n letter-spacing: 0.12px;\n text-align: right;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const StatsTitle = styled('div')`\n font-size: 20px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 4px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 20px;\n margin-bottom: 6px;\n }\n\n @media (min-width: 1080px) {\n font-size: 20px;\n }\n`;\n\nexport const StatsValueContainer = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-top: 8px;\n width: 100%;\n`;\n\nexport const StatsValue = styled('div')`\n font-size: 24px;\n font-weight: 700;\n line-height: 1.2;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 28px;\n }\n\n @media (min-width: 1080px) {\n font-size: 32px;\n }\n`;\n\nexport const ValueSubtitleWrapper = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`;\n\nexport const StatsSubtitle = styled('div')`\n font-size: 16px;\n font-weight: 400;\n line-height: normal;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n padding-bottom: 2px;\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`;\n\nexport const TrendContainer = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#22C55E';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 14px;\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n`;\n\nexport const TrendIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const TrendText = styled('span')`\n white-space: nowrap;\n`;\n\nexport const StatsCardHeader = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n","import React from 'react';\nimport Skeleton from '@mui/material/Skeleton';\nimport {\n SkeletonCard,\n SkeletonHeader,\n SkeletonRow,\n StatsCardWrapper,\n StatsCardHeaderRow,\n StatsCardBody,\n StatsCardSubtitle,\n ProductRowInfo,\n ProductRowMetrics,\n ChartMetricRow,\n ChartMetricTrend,\n ChartAreaSkeleton,\n PieChartLayout,\n PieCircleSkeleton,\n LegendList,\n LegendRowWrapper,\n LegendRowInfo,\n DashboardLayout,\n DashboardHeaderRow,\n DashboardFilterGroup,\n StatsGrid,\n WidgetGrid,\n FullViewLayout,\n FullViewMetricCard,\n FullViewMetricCenter,\n FullViewChartArea,\n FullViewTableCard,\n FullViewTableRow,\n SummaryCardsGrid,\n} from './LoadingSkeletons.styled';\n\nexport const StatsCardSkeleton: React.FC = () => (\n <StatsCardWrapper data-testid=\"skeleton-stats-card\">\n <StatsCardHeaderRow>\n <Skeleton variant=\"text\" width={80} height={18} />\n <Skeleton variant=\"text\" width={48} height={16} />\n </StatsCardHeaderRow>\n <StatsCardBody>\n <Skeleton variant=\"text\" width={120} height={36} />\n <StatsCardSubtitle variant=\"text\" width={100} height={16} />\n </StatsCardBody>\n </StatsCardWrapper>\n);\n\nconst ProductRowSkeleton: React.FC = () => (\n <SkeletonRow>\n <Skeleton variant=\"rounded\" width={28} height={28} />\n <Skeleton variant=\"rounded\" width={50} height={50} />\n <ProductRowInfo>\n <Skeleton variant=\"text\" width=\"70%\" height={18} />\n <Skeleton variant=\"text\" width=\"50%\" height={14} />\n </ProductRowInfo>\n <ProductRowMetrics>\n <Skeleton variant=\"text\" width={80} height={18} />\n <Skeleton variant=\"text\" width={48} height={14} />\n </ProductRowMetrics>\n </SkeletonRow>\n);\n\nexport const ProductsListSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-products-list\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={160} height={22} />\n <Skeleton variant=\"rounded\" width={100} height={32} />\n </SkeletonHeader>\n {['product-1', 'product-2', 'product-3', 'product-4', 'product-5'].map((rowKey) => (\n <ProductRowSkeleton key={rowKey} />\n ))}\n </SkeletonCard>\n);\n\nexport const ChartWidgetSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-chart-widget\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={140} height={22} />\n <Skeleton variant=\"rounded\" width={110} height={32} />\n </SkeletonHeader>\n <ChartMetricRow>\n <Skeleton variant=\"text\" width={100} height={36} />\n <ChartMetricTrend>\n <Skeleton variant=\"text\" width={60} height={18} />\n <Skeleton variant=\"text\" width={140} height={14} />\n </ChartMetricTrend>\n </ChartMetricRow>\n <ChartAreaSkeleton variant=\"rounded\" width=\"100%\" />\n </SkeletonCard>\n);\n\nconst LegendRowSkeleton: React.FC = () => (\n <LegendRowWrapper>\n <Skeleton variant=\"circular\" width={12} height={12} />\n <LegendRowInfo>\n <Skeleton variant=\"text\" width=\"60%\" height={16} />\n <Skeleton variant=\"text\" width=\"40%\" height={14} />\n </LegendRowInfo>\n <Skeleton variant=\"text\" width={36} height={18} />\n </LegendRowWrapper>\n);\n\nexport const CategoriesPieChartSkeleton: React.FC = () => (\n <SkeletonCard data-testid=\"skeleton-categories-pie\">\n <SkeletonHeader>\n <Skeleton variant=\"text\" width={140} height={22} />\n <Skeleton variant=\"rounded\" width={100} height={32} />\n </SkeletonHeader>\n <PieChartLayout>\n <PieCircleSkeleton variant=\"circular\" />\n <LegendList>\n {['legend-1', 'legend-2', 'legend-3', 'legend-4', 'legend-5'].map((rowKey) => (\n <LegendRowSkeleton key={rowKey} />\n ))}\n </LegendList>\n </PieChartLayout>\n </SkeletonCard>\n);\n\nexport const DashboardSkeleton: React.FC = () => (\n <DashboardLayout data-testid=\"skeleton-dashboard\">\n <DashboardHeaderRow>\n <Skeleton variant=\"text\" width={200} height={32} />\n <DashboardFilterGroup>\n <Skeleton variant=\"rounded\" width={140} height={36} />\n <Skeleton variant=\"rounded\" width={140} height={36} />\n </DashboardFilterGroup>\n </DashboardHeaderRow>\n\n <StatsGrid>\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n </StatsGrid>\n\n <WidgetGrid>\n <ProductsListSkeleton />\n <ChartWidgetSkeleton />\n </WidgetGrid>\n\n <WidgetGrid>\n <ChartWidgetSkeleton />\n <CategoriesPieChartSkeleton />\n </WidgetGrid>\n </DashboardLayout>\n);\n\nexport const FullViewChartSkeleton: React.FC = () => (\n <FullViewLayout data-testid=\"skeleton-fullview-chart\">\n <FullViewMetricCard>\n <FullViewMetricCenter>\n <Skeleton variant=\"text\" width={140} height={52} />\n <Skeleton variant=\"text\" width={80} height={24} />\n <Skeleton variant=\"text\" width={160} height={16} />\n </FullViewMetricCenter>\n <FullViewChartArea variant=\"rounded\" width=\"100%\" />\n </FullViewMetricCard>\n\n <FullViewTableCard>\n <Skeleton variant=\"text\" width={200} height={24} />\n {['table-row-1', 'table-row-2', 'table-row-3', 'table-row-4', 'table-row-5'].map((rowKey) => (\n <FullViewTableRow key={rowKey} variant=\"rounded\" width=\"100%\" height={44} />\n ))}\n </FullViewTableCard>\n </FullViewLayout>\n);\n\nexport const FullViewTableSkeleton: React.FC = () => (\n <FullViewLayout data-testid=\"skeleton-fullview-table\">\n <SummaryCardsGrid>\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n <StatsCardSkeleton />\n </SummaryCardsGrid>\n\n <FullViewTableCard>\n <Skeleton variant=\"text\" width={200} height={24} />\n <FullViewTableRow variant=\"rounded\" width=\"100%\" height={40} />\n {[\n 'summary-row-1',\n 'summary-row-2',\n 'summary-row-3',\n 'summary-row-4',\n 'summary-row-5',\n 'summary-row-6',\n 'summary-row-7',\n 'summary-row-8',\n ].map((rowKey) => (\n <FullViewTableRow key={rowKey} variant=\"rounded\" width=\"100%\" height={44} />\n ))}\n </FullViewTableCard>\n </FullViewLayout>\n);\n","import { styled } from '@nuskin/foundation-theme';\nimport Skeleton from '@mui/material/Skeleton';\n\nexport const SkeletonCard = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const SkeletonHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 12px;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const SkeletonRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n padding: 14px 0;\n }\n`;\n\nexport const StatsCardWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 12px;\n border-radius: 8px;\n min-height: 120px;\n\n @media (min-width: 600px) {\n padding: 20px;\n min-height: 140px;\n }\n @media (min-width: 900px) {\n padding: 24px;\n min-height: 160px;\n }\n`;\n\nexport const StatsCardHeaderRow = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const StatsCardBody = styled('div')`\n margin-top: 8px;\n`;\n\nexport const StatsCardSubtitle = styled(Skeleton)`\n margin-top: 4px;\n`;\n\nexport const ProductRowInfo = styled('div')`\n flex: 1;\n min-width: 0;\n`;\n\nexport const ProductRowMetrics = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`;\n\nexport const ChartMetricRow = styled('div')`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`;\n\nexport const ChartMetricTrend = styled('div')`\n padding-top: 4px;\n`;\n\nexport const ChartAreaSkeleton = styled(Skeleton)`\n border-radius: 8px;\n height: 220px;\n\n @media (min-width: 600px) {\n height: 280px;\n }\n @media (min-width: 900px) {\n height: 340px;\n }\n`;\n\nexport const PieChartLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n @media (min-width: 600px) {\n flex-direction: row;\n gap: 24px;\n }\n`;\n\nexport const PieCircleSkeleton = styled(Skeleton)`\n width: 100%;\n height: 200px;\n border-radius: 8px;\n flex-shrink: 0;\n\n @media (min-width: 600px) {\n width: 200px;\n border-radius: 50%;\n }\n`;\n\nexport const LegendList = styled('div')`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const LegendRowWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`;\n\nexport const LegendRowInfo = styled('div')`\n flex: 1;\n`;\n\nexport const DashboardLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n @media (min-width: 600px) {\n gap: 32px;\n }\n @media (min-width: 900px) {\n gap: 40px;\n }\n`;\n\nexport const DashboardHeaderRow = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`;\n\nexport const DashboardFilterGroup = styled('div')`\n display: flex;\n gap: 16px;\n`;\n\nexport const StatsGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n @media (min-width: 900px) {\n gap: 24px;\n }\n`;\n\nexport const WidgetGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 900px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 24px;\n }\n`;\n\nexport const FullViewLayout = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\n\nexport const FullViewMetricCard = styled('div')`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`;\n\nexport const FullViewMetricCenter = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`;\n\nexport const FullViewChartArea = styled(Skeleton)`\n border-radius: 8px;\n height: 260px;\n\n @media (min-width: 600px) {\n height: 320px;\n }\n @media (min-width: 900px) {\n height: 400px;\n }\n`;\n\nexport const FullViewTableCard = styled('div')`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const FullViewTableRow = styled(Skeleton)`\n border-radius: 4px;\n`;\n\nexport const SummaryCardsGrid = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n\n @media (min-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n`;\n","import React from 'react';\nimport ShoppingCartIcon from '@mui/icons-material/ShoppingCart';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\nimport {\n ProductsListContainer,\n WidgetHeader,\n WidgetTitle,\n SortDropdown,\n HeaderActionsContainer,\n ProductsList,\n ProductItem,\n ProductRank,\n ProductImage,\n ProductImagePlaceholder,\n ProductInfo,\n ProductName,\n ProductSubtitle,\n ProductMetrics,\n ProductValue,\n ProductTrend,\n EmptyState,\n EmptyStateText,\n} from './TopSellingProductsList.styled';\nimport { WidgetMenu } from '../WidgetMenu';\nimport type { TopProduct, ProductSortOption } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { ProductsListSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface TopSellingProductsListProps {\n readonly products: TopProduct[];\n readonly productSort: ProductSortOption;\n readonly isLoading?: boolean;\n readonly maxProducts?: number;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as ProductSortOption;\n onSortChange?.(newSort);\n };\n\n const formatValue = (product: TopProduct, sortBy: ProductSortOption) => {\n switch (sortBy) {\n case 'units':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'revenue':\n return formatMoney(product.revenue, product.currencyCode);\n case 'volume':\n return `${product.volume.toLocaleString()} ${getTranslation(Keys.widget.topProducts.dcSvSuffix)}`;\n default:\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n }\n };\n\n const getSubtitle = (product: TopProduct, sortBy: ProductSortOption) => {\n switch (sortBy) {\n case 'units':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n case 'revenue':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'volume':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) return '';\n switch (sortBy) {\n case 'units':\n return trend.units ?? '';\n case 'revenue':\n return trend.revenue ?? '';\n case 'volume':\n return trend.volume ?? '';\n default:\n return trend.units ?? '';\n }\n };\n\n const getTrendDirection = (product: TopProduct, sortBy: ProductSortOption): TrendDirection => {\n const trendValue = getTrendValue(product, sortBy);\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+')) return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n const getTrendChartIcon = (direction: TrendDirection) => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n return <ShowChartIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n };\n\n const displayedProducts = products.slice(0, maxProducts);\n const rankLabel = getTranslation(Keys.widget.topProducts.rank);\n const trendLabel = getTranslation(Keys.widget.topProducts.trend);\n\n if (isLoading && products.length === 0) {\n return (\n <ProductsListContainer data-testid=\"widget-top-products\">\n <ProductsListSkeleton />\n </ProductsListContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <ProductsListContainer data-testid=\"widget-top-products\">\n <WidgetHeader>\n <WidgetTitle>{getTranslation(Keys.widget.topProducts.title)}</WidgetTitle>\n </WidgetHeader>\n <EmptyState data-testid=\"products-empty-state\">\n <ShoppingCartIcon />\n <EmptyStateText>{getTranslation(Keys.widget.topProducts.empty)}</EmptyStateText>\n </EmptyState>\n </ProductsListContainer>\n );\n }\n\n return (\n <ProductsListContainer\n as=\"section\"\n data-testid=\"widget-top-products\"\n aria-label={getTranslation(Keys.widget.topProducts.ariaLabel)}\n >\n <WidgetHeader>\n <WidgetTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.topProducts.titleAriaLabel)}\n data-testid=\"widget-title-top-products\"\n >\n {getTranslation(Keys.widget.topProducts.title)}\n </WidgetTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"product-sort\"\n data-testid=\"product-sort-dropdown\"\n value={productSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topProducts.sortAriaLabel)}\n >\n <option value=\"units\">{getTranslation(Keys.filter.productSort.byUnits)}</option>\n <option value=\"revenue\">{getTranslation(Keys.filter.productSort.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.filter.productSort.byVolume)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-products\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </WidgetHeader>\n\n <ProductsList as=\"ul\" data-testid=\"products-list\">\n {displayedProducts.map((product, index) => {\n const trendDirection = getTrendDirection(product, productSort);\n const trendValue = getTrendValue(product, productSort);\n\n return (\n <ProductItem\n as=\"li\"\n key={product.id}\n data-testid={`product-item-${index}`}\n aria-label={`${rankLabel} ${product.rank}: ${product.name}, ${formatValue(product, productSort)}`}\n >\n <ProductRank aria-label={`${rankLabel} ${product.rank}`}>{product.rank}</ProductRank>\n\n {product.imageUrl ? (\n <ProductImage\n src={product.imageUrl}\n alt={product.name}\n loading=\"lazy\"\n onError={(e) => {\n e.currentTarget.hidden = true;\n }}\n />\n ) : (\n <ProductImagePlaceholder\n aria-label={getTranslation(Keys.widget.topProducts.noImageAriaLabel)}\n >\n {product.name.substring(0, 2).toUpperCase()}\n </ProductImagePlaceholder>\n )}\n\n <ProductInfo>\n <ProductName title={product.name}>{product.name}</ProductName>\n <ProductSubtitle>{getSubtitle(product, productSort)}</ProductSubtitle>\n </ProductInfo>\n\n <ProductMetrics>\n <ProductValue>{formatValue(product, productSort)}</ProductValue>\n {trendValue && (\n <ProductTrend\n as=\"output\"\n direction={trendDirection}\n aria-live=\"polite\"\n aria-label={`${trendLabel}: ${getTrendDirectionLabel(trendDirection)} ${trendValue}`}\n >\n {getTrendChartIcon(trendDirection)}\n <span>{trendValue}</span>\n </ProductTrend>\n )}\n </ProductMetrics>\n </ProductItem>\n );\n })}\n </ProductsList>\n </ProductsListContainer>\n );\n};\n\nexport const TopSellingProductsList = React.memo(TopSellingProductsListComponent);\nTopSellingProductsList.displayName = 'TopSellingProductsList';\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport type { TrendDirection } from '../shared/types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport function parseTrendPercent(value?: string): number | null {\n if (!value) return null;\n const cleanedValue = value.replace('%', '').trim();\n const parsedValue = Number(cleanedValue);\n return Number.isFinite(parsedValue) ? parsedValue : null;\n}\n\nexport function resolveTrendDirection(value?: string): TrendDirection {\n const parsedValue = parseTrendPercent(value);\n if (parsedValue === null) return 'neutral';\n if (parsedValue > 0) return 'up';\n if (parsedValue < 0) return 'down';\n return 'neutral';\n}\n\nexport function calculateWeightedRevenueTrend<T>(\n items: readonly T[],\n getRevenue: (item: T) => number,\n getTrend: (item: T) => string | undefined,\n): { direction: TrendDirection; formatted: string } {\n const { weightedSum, weight } = items.reduce(\n (accumulator, item) => {\n const trendValue = parseTrendPercent(getTrend(item));\n if (trendValue === null) return accumulator;\n return {\n weightedSum: accumulator.weightedSum + trendValue * getRevenue(item),\n weight: accumulator.weight + getRevenue(item),\n };\n },\n { weightedSum: 0, weight: 0 },\n );\n\n const average = weight > 0 ? weightedSum / weight : 0;\n let direction: TrendDirection = 'neutral';\n if (average > 0) direction = 'up';\n else if (average < 0) direction = 'down';\n\n return { direction, formatted: `${average > 0 ? '+' : ''}${average.toFixed(1)}%` };\n}\n\nexport function getTrendDirectionLabel(direction: TrendDirection): string {\n if (direction === 'up') return getTranslation(Keys.stats.trend.increased);\n if (direction === 'down') return getTranslation(Keys.stats.trend.decreased);\n return getTranslation(Keys.stats.trend.unchanged);\n}\n\nexport function getTrendIcon(direction: TrendDirection): React.ReactNode {\n switch (direction) {\n case 'up':\n return <ArrowUpwardIcon />;\n case 'down':\n return <ArrowDownwardIcon />;\n case 'neutral':\n default:\n return <RemoveIcon />;\n }\n}\n\nexport function getTrendColor(direction: TrendDirection): string {\n switch (direction) {\n case 'up':\n return '#4caf50';\n case 'down':\n return '#f44336';\n case 'neutral':\n default:\n return '#757575';\n }\n}\n","import { useMemo } from 'react';\n\nexport function calculateTotalPages<T>(items: T[], itemsPerPage: number): number {\n return Math.ceil(items.length / itemsPerPage);\n}\n\nexport function paginateItems<T>(items: T[], currentPage: number, itemsPerPage: number): T[] {\n const startIndex = (currentPage - 1) * itemsPerPage;\n const endIndex = startIndex + itemsPerPage;\n return items.slice(startIndex, endIndex);\n}\n\nexport function sortByNumericProperty<T extends Record<string, unknown>>(\n items: T[],\n key: keyof T,\n direction: 'asc' | 'desc' = 'desc',\n): T[] {\n return [...items].sort((a, b) => {\n const aVal = a[key] as number;\n const bVal = b[key] as number;\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n });\n}\n\nexport function calculatePercentage(value: number, total: number, decimalPlaces: number = 1): string {\n if (total === 0) return '0.0';\n return ((value / total) * 100).toFixed(decimalPlaces);\n}\n\nexport function usePaginatedItems<T>(\n items: T[],\n currentPage: number,\n itemsPerPage: number,\n): { totalPages: number; pageItems: T[] } {\n const totalPages = useMemo(() => calculateTotalPages(items, itemsPerPage), [items, itemsPerPage]);\n const pageItems = useMemo(\n () => paginateItems(items, currentPage, itemsPerPage),\n [items, currentPage, itemsPerPage],\n );\n return { totalPages, pageItems };\n}\n\nexport function formatMoney(\n value: number,\n currencyCode?: string,\n locale: string = 'en-US',\n fractionDigits?: number,\n): string {\n const amount = Number.isFinite(value) ? value : 0;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {}\n }\n return fractionDigits !== undefined ? `$${amount.toFixed(fractionDigits)}` : `$${amount.toLocaleString()}`;\n}\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductsListContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n min-height: 320px;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (min-width: 768px) {\n padding: 20px;\n min-height: 400px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const WidgetHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const WidgetTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const SortDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const ProductsList = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n overflow: hidden;\n list-style: none;\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n gap: 14px;\n }\n`;\n\nexport const ProductItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n transition:\n background-color 0.2s ease,\n box-shadow 0.2s ease;\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n list-style: none;\n\n &:not(:last-child) {\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n }\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.06);\n }\n\n @media (min-width: 768px) {\n padding: 14px;\n gap: 14px;\n }\n`;\n\nexport const ProductRank = styled('div')`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'A10')};\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n border-radius: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n vertical-align: middle;\n\n @media (min-width: 768px) {\n min-width: 28px;\n height: 28px;\n font-size: 16px;\n }\n`;\n\nexport const ProductImage = styled('img')`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n object-fit: cover;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n }\n`;\n\nexport const ProductImagePlaceholder = styled('div')`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N40')};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n font-weight: 500;\n\n @media (min-width: 768px) {\n width: 50px;\n height: 50px;\n font-size: 11px;\n }\n`;\n\nexport const ProductInfo = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`;\n\nexport const ProductName = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n\n @media (min-width: 768px) {\n font-size: 16px;\n max-width: none;\n }\n`;\n\nexport const ProductSubtitle = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`;\n\nexport const ProductMetrics = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`;\n\nexport const ProductValue = styled('div')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.2;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`;\n\nexport const ProductTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#22C55E';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 12px;\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n`;\n\nexport const EmptyState = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({ theme }) => getGenomeColor(theme, 'N50')};\n }\n`;\n\nexport const EmptyStateText = styled('div')`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React, { useState } from 'react';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport VisibilityIcon from '@mui/icons-material/Visibility';\nimport { StyledIconButton } from './WidgetMenu.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface WidgetMenuProps {\n readonly widgetId?: string;\n readonly onFullView?: () => void;\n}\n\nexport const WidgetMenu: React.FC<WidgetMenuProps> = ({ widgetId, onFullView }) => {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n const buttonId = `widget-menu-button-${widgetId}`;\n const menuId = `widget-menu-${widgetId}`;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleFullView = () => {\n handleClose();\n if (onFullView) {\n onFullView();\n }\n };\n\n return (\n <>\n <StyledIconButton\n id={buttonId}\n data-testid={`widget-menu-button-${widgetId}`}\n aria-label={getTranslation(Keys.widget.menu.ariaLabel)}\n aria-controls={open ? menuId : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={handleClick}\n size=\"small\"\n >\n <MoreVertIcon fontSize=\"small\" />\n </StyledIconButton>\n <Menu\n id={menuId}\n data-testid={`widget-menu-${widgetId}`}\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n 'aria-labelledby': buttonId,\n }}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem onClick={handleFullView} data-testid=\"widget-menu-item-fullview\">\n <ListItemIcon>\n <VisibilityIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.fullView)}</ListItemText>\n </MenuItem>\n </Menu>\n </>\n );\n};\n","import IconButton from '@mui/material/IconButton';\nimport { styled } from '@nuskin/foundation-theme';\n\nexport const StyledIconButton = styled(IconButton)(() => ({\n padding: '4px',\n color: '#252525',\n '&:hover': {\n backgroundColor: 'rgba(37, 37, 37, 0.08)',\n },\n}));\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport {\n ConversionRateContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n FormulaDisplay,\n ChartContainer,\n TooltipContainer,\n TooltipLabel,\n TooltipValue,\n TooltipDetails,\n TitleRow,\n HeaderActionsContainer,\n} from './ConversionRateChart.styled';\nimport type { ConversionDataPoint, ConversionFilterOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateChartProps {\n readonly conversionData: ConversionDataPoint[];\n readonly conversionFilter: ConversionFilterOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\nconst LINE_DOT = { r: 3, fill: '#3B82F6' };\nconst ACTIVE_DOT = { r: 5 };\n\ninterface CustomTooltipProps {\n readonly active?: boolean;\n readonly payload?: Array<{ payload?: unknown }>;\n}\n\nconst rateTickFormatter = (value: number | string): string => `${value}%`;\n\nconst CustomTooltip: React.FC<CustomTooltipProps> = ({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const data = payload[0].payload as ConversionDataPoint;\n return (\n <TooltipContainer>\n <TooltipLabel>{data.date}</TooltipLabel>\n <TooltipValue>{(data.rate ?? 0).toFixed(2)}%</TooltipValue>\n <TooltipDetails>\n {data.orders ?? 0} {getTranslation(Keys.widget.conversionRate.tooltipOrders)} /{' '}\n {(data.siteVisits ?? 0).toLocaleString()} {getTranslation(Keys.widget.conversionRate.tooltipVisits)}\n </TooltipDetails>\n </TooltipContainer>\n );\n};\n\nconst ConversionRateChartComponent: React.FC<ConversionRateChartProps> = ({\n conversionData,\n conversionFilter,\n isLoading = false,\n title,\n summaryRate,\n summaryChangePct,\n onFilterChange,\n onTitleClick,\n}) => {\n const handleFilterChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newFilter = event.target.value as ConversionFilterOption;\n onFilterChange?.(newFilter);\n },\n [onFilterChange],\n );\n\n const noDataText = getTranslation(Keys.widget.conversionRate.noData);\n const noChangeText = getTranslation(Keys.widget.conversionRate.noChange);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null || Math.abs(summaryChangePct) < 0.1) {\n return { direction: 'neutral', value: noChangeText };\n }\n const direction = summaryChangePct > 0 ? 'up' : 'down';\n const formatted = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(2)}%`;\n return { direction, value: formatted };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: noChangeText };\n const change = latestRate - previousRate;\n const percentageChange = (change / previousRate) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change.toFixed(2)}%`;\n return { direction, value: formattedChange };\n }, [summaryChangePct, conversionData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => conversionData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [conversionData],\n );\n\n if (isLoading && conversionData.length === 0) {\n return (\n <ConversionRateContainer data-testid=\"widget-conversion-rate\">\n <ChartWidgetSkeleton />\n </ConversionRateContainer>\n );\n }\n\n const chartAriaLabel = getTranslation(Keys.widget.conversionRate.chartAriaLabel);\n\n return (\n <ConversionRateContainer as=\"section\" data-testid=\"widget-conversion-rate\" aria-label={chartAriaLabel}>\n <ChartHeader>\n <TitleRow>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.conversionRate.titleAriaLabel)}\n data-testid=\"widget-title-conversion-rate\"\n >\n {title ?? getTranslation(Keys.widget.conversionRate.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterDropdown\n id=\"conversion-filter\"\n data-testid=\"conversion-filter-dropdown\"\n value={conversionFilter}\n onChange={handleFilterChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.conversionRate.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.filter.conversionType.all)}</option>\n <option value=\"standard\">{getTranslation(Keys.filter.conversionType.standard)}</option>\n <option value=\"subscription\">\n {getTranslation(Keys.filter.conversionType.subscription)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"conversion-rate\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </TitleRow>\n </ChartHeader>\n\n <MetricDisplay>\n <MetricValue\n aria-label={`${getTranslation(Keys.widget.conversionRate.title)}: ${currentRate.toFixed(2)}%`}\n data-testid=\"conversion-metric-value\"\n >\n {currentRate.toFixed(2)}%\n </MetricValue>\n {trendInfo.value !== noDataText && (\n <MetricTrend\n as=\"output\"\n direction={trendInfo.direction}\n aria-live=\"polite\"\n aria-label={`${getTrendDirectionLabel(trendInfo.direction)} ${trendInfo.value}`}\n data-testid=\"conversion-metric-trend\"\n >\n <div className=\"trend-line\">\n <span aria-hidden=\"true\">{getTrendIcon(trendInfo.direction)}</span>\n <span className=\"change-value\">{trendInfo.value.replace('%', '')}</span>\n <span className=\"change-percent\">%</span>\n </div>\n <div className=\"comparison-text\">{getTranslation(Keys.widget.conversionRate.comparison)}</div>\n </MetricTrend>\n )}\n </MetricDisplay>\n\n <FormulaDisplay data-testid=\"conversion-formula\">\n {getTranslation(Keys.widget.conversionRate.formula)}\n </FormulaDisplay>\n\n <ChartContainer data-testid=\"conversion-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={200}>\n <LineChart data={formattedData} margin={CHART_MARGIN}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"shortDate\" tick={AXIS_TICK} tickLine={false} interval=\"preserveStartEnd\" />\n <YAxis\n tick={AXIS_TICK}\n tickLine={false}\n tickFormatter={rateTickFormatter}\n domain={['dataMin - 0.5', 'dataMax + 0.5']}\n />\n <Tooltip content={CustomTooltip} />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke=\"#3B82F6\"\n strokeWidth={2}\n dot={LINE_DOT}\n activeDot={ACTIVE_DOT}\n />\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n </ConversionRateContainer>\n );\n};\n\nexport const ConversionRateChart = React.memo(ConversionRateChartComponent);\nConversionRateChart.displayName = 'ConversionRateChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionRateContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const TitleRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`;\n\nexport const FormulaDisplay = styled('div')`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`;\n\nexport const TooltipContainer = styled('div')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`;\n\nexport const TooltipLabel = styled('div')`\n font-size: 11px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N10')};\n margin-bottom: 4px;\n`;\n\nexport const TooltipValue = styled('div')`\n font-size: 13px;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'A10')};\n`;\n\nexport const TooltipDetails = styled('div')`\n font-size: 10px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n margin-top: 2px;\n`;\n","import type { DateRangeOption } from '../types.d';\n\nexport const DAYS_MAP: Record<DateRangeOption, number> = {\n last7days: 7,\n last30days: 30,\n last90days: 90,\n thisMonth: 31,\n};\n\nexport const DATE_RANGE_LABELS: Record<DateRangeOption, string> = {\n last7days: 'Last 7 Days',\n last30days: 'Last 30 Days',\n last90days: 'Last 90 Days',\n thisMonth: 'This Month',\n};\n\nexport function getDaysFromDateRange(dateRange: DateRangeOption): number {\n return DAYS_MAP[dateRange] ?? 30;\n}\n\nexport function getDateRangeLabel(dateRange: DateRangeOption): string {\n return DATE_RANGE_LABELS[dateRange] ?? 'Last 30 Days';\n}\n","import type { DateRangeOption } from '../types.d';\nimport { getDateRangeLabel } from './dateConstants';\n\nexport function formatDateRangeLabel(dateRange: DateRangeOption): string {\n return getDateRangeLabel(dateRange);\n}\n\nexport function formatShortDate(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${months[date.getMonth()]} ${date.getDate()}`;\n}\n\nconst AXIS_MONTH_MAP: Record<string, string> = {\n Jan: '1',\n Feb: '2',\n Mar: '3',\n Apr: '4',\n May: '5',\n Jun: '6',\n Jul: '7',\n Aug: '8',\n Sep: '9',\n Oct: '10',\n Nov: '11',\n Dec: '12',\n};\n\nexport function formatAxisDate(dateStr: string): string {\n const parts = dateStr.split(' ');\n if (parts.length !== 2) return dateStr;\n return `${AXIS_MONTH_MAP[parts[0]] || parts[0]}/${parts[1]}`;\n}\n\nexport function formatDisplayDate(dateStr: string): string {\n const date = new Date(dateStr);\n return formatShortDate(date);\n}\n\nexport function formatDateRange(start: string, end: string): string {\n return `${formatDisplayDate(start)} - ${formatDisplayDate(end)}`;\n}\n\nexport function formatISODate(date: Date): string {\n return date.toISOString().split('T')[0];\n}\n\n/**\n * Extract and format the date range from an array of data objects.\n * Handles various date field names: 'date', 'Date', 'dateTime', etc.\n * Falls back to calculating from dateRange option if no date data is available.\n * @param data Array of objects with date information\n * @param fallbackLabel Fallback label if no dates found\n * @returns Formatted date range string (e.g., \"May 30 - Aug 27\")\n */\nexport function getActualDateRange(data: unknown[], fallbackLabel: string = 'N/A'): string {\n if (!Array.isArray(data) || data.length === 0) return fallbackLabel;\n\n try {\n // Extract first and last dates from data\n const first = data[0] as Record<string, unknown>;\n const last = data[data.length - 1] as Record<string, unknown>;\n\n // Try various date field names\n const dateFieldNames = ['date', 'Date', 'dateTime', 'eventDate', 'timestamp'];\n let startDateStr: string | undefined;\n let endDateStr: string | undefined;\n\n for (const fieldName of dateFieldNames) {\n if (first[fieldName] && !startDateStr) {\n startDateStr = String(first[fieldName]);\n }\n if (last[fieldName] && !endDateStr) {\n endDateStr = String(last[fieldName]);\n }\n }\n\n if (startDateStr && endDateStr) {\n return formatDateRange(startDateStr, endDateStr);\n }\n } catch {\n // Silently fail and return fallback\n }\n\n return fallbackLabel;\n}\n\n/**\n * Calculate and format the date range based on a DateRangeOption.\n * Used for components without time-series data (e.g., TopProducts, TopCategories)\n * @param dateRangeOption The selected date range option\n * @returns Formatted date range string (e.g., \"Aug 28 - Sep 27\" for last30days)\n */\nexport function calculateDateRangeFromOption(dateRangeOption: DateRangeOption): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = today.getMonth();\n const date = today.getDate();\n\n let startDate: Date;\n let endDate = new Date(year, month, date);\n\n switch (dateRangeOption) {\n case 'last7days':\n startDate = new Date(year, month, date - 7);\n break;\n case 'last30days':\n startDate = new Date(year, month, date - 30);\n break;\n case 'last90days':\n startDate = new Date(year, month, date - 90);\n break;\n case 'thisMonth':\n startDate = new Date(year, month, 1);\n endDate = new Date(year, month + 1, 0); // Last day of current month\n break;\n default:\n return 'N/A';\n }\n\n return formatDateRange(formatISODate(startDate), formatISODate(endDate));\n}\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n SignupsContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n ChartContainer,\n Legend,\n LegendItem,\n LegendColor,\n LegendLabel,\n HeaderActionsContainer,\n} from './SignupsChart.styled';\nimport type { SignupDataPoint, SignupViewOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface SignupsChartProps {\n readonly signupData: SignupDataPoint[];\n readonly signupView: SignupViewOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onViewChange?: (view: SignupViewOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst SERIES_COLORS = {\n total: '#3B82F6',\n members: '#7B92A8',\n retail: '#A3B5C7',\n brandAffiliates: '#CBD6E0',\n};\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\nconst LINE_DOT = { r: 2 };\n\nconst SignupsChartComponent: React.FC<SignupsChartProps> = ({\n signupData,\n signupView,\n isLoading = false,\n title,\n onViewChange,\n onTitleClick,\n}) => {\n const handleViewChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newView = event.target.value as SignupViewOption;\n onViewChange?.(newView);\n },\n [onViewChange],\n );\n\n const noDataText = getTranslation(Keys.widget.signups.noData);\n const noChangeText = getTranslation(Keys.widget.signups.noChange);\n\n const totalSignups = React.useMemo(() => {\n if (signupData.length === 0) return 0;\n return signupData[signupData.length - 1].total;\n }, [signupData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (signupData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestTotal = signupData[signupData.length - 1].total;\n const previousTotal = signupData[0].total;\n const change = latestTotal - previousTotal;\n const percentageChange = (change / previousTotal) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change} (${percentageChange.toFixed(1)}%)`;\n return { direction, value: formattedChange };\n }, [noChangeText, noDataText, signupData]);\n\n const formattedData = React.useMemo(\n () => signupData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [signupData],\n );\n const totalLabel = getTranslation(Keys.widget.signups.total);\n const membersLabel = getTranslation(Keys.widget.signups.members);\n const retailLabel = getTranslation(Keys.widget.signups.retail);\n const brandAffiliatesLabel = getTranslation(Keys.widget.signups.brandAffiliates);\n\n if (isLoading && signupData.length === 0) {\n return (\n <SignupsContainer data-testid=\"widget-signups\">\n <ChartWidgetSkeleton />\n </SignupsContainer>\n );\n }\n\n return (\n <SignupsContainer\n as=\"section\"\n data-testid=\"widget-signups\"\n aria-label={getTranslation(Keys.widget.signups.chartAriaLabel)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.signups.titleAriaLabel)}\n data-testid=\"widget-title-signups\"\n >\n {title ?? getTranslation(Keys.widget.signups.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterDropdown\n id=\"signup-view\"\n data-testid=\"signup-view-dropdown\"\n value={signupView}\n onChange={handleViewChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.signups.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.filter.signupView.showAll)}</option>\n <option value=\"members\">{getTranslation(Keys.filter.signupView.showMembers)}</option>\n <option value=\"retail\">{getTranslation(Keys.filter.signupView.showRetail)}</option>\n <option value=\"brandAffiliates\">\n {getTranslation(Keys.filter.signupView.showBrandAffiliates)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"signups\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <MetricDisplay data-testid=\"signups-metric-display\">\n <MetricValue\n data-testid=\"signups-metric-value\"\n aria-label={`${totalLabel}: ${totalSignups.toLocaleString()}`}\n >\n {totalSignups.toLocaleString()}\n </MetricValue>\n {trendInfo.value !== noDataText && (\n <MetricTrend\n as=\"output\"\n data-testid=\"signups-metric-trend\"\n direction={trendInfo.direction}\n aria-live=\"polite\"\n aria-label={`${getTrendDirectionLabel(trendInfo.direction)} ${trendInfo.value}`}\n >\n <div className=\"trend-line\">\n <span aria-hidden=\"true\">{getTrendIcon(trendInfo.direction)}</span>\n <span className=\"change-value\">{trendInfo.value.split(' ')[0]}</span>\n <span className=\"change-percent\">{trendInfo.value.split(' ')[1]}</span>\n </div>\n <div className=\"comparison-text\">{getTranslation(Keys.widget.conversionRate.comparison)}</div>\n </MetricTrend>\n )}\n </MetricDisplay>\n\n <ChartContainer data-testid=\"signups-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={200}>\n <LineChart data={formattedData} margin={CHART_MARGIN}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"shortDate\" tick={AXIS_TICK} tickLine={false} interval=\"preserveStartEnd\" />\n <YAxis tick={AXIS_TICK} tickLine={false} />\n <Tooltip />\n {(signupView === 'all' || signupView === 'members') && (\n <Line\n type=\"monotone\"\n dataKey={signupView === 'all' ? 'total' : 'members'}\n stroke={signupView === 'all' ? SERIES_COLORS.total : SERIES_COLORS.members}\n strokeWidth={2}\n dot={LINE_DOT}\n name={signupView === 'all' ? totalLabel : membersLabel}\n />\n )}\n {signupView === 'all' && (\n <>\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n dot={LINE_DOT}\n name={membersLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n </>\n )}\n {signupView === 'retail' && (\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n )}\n {signupView === 'brandAffiliates' && (\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n\n {signupView === 'all' && (\n <Legend data-testid=\"signups-legend\">\n <LegendItem data-testid=\"legend-total\">\n <LegendColor color={SERIES_COLORS.total} />\n <LegendLabel>{totalLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-members\">\n <LegendColor color={SERIES_COLORS.members} />\n <LegendLabel>{membersLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-retail\">\n <LegendColor color={SERIES_COLORS.retail} />\n <LegendLabel>{retailLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-brandAffiliates\">\n <LegendColor color={SERIES_COLORS.brandAffiliates} />\n <LegendLabel>{brandAffiliatesLabel}</LegendLabel>\n </LegendItem>\n </Legend>\n )}\n </SignupsContainer>\n );\n};\n\nexport const SignupsChart = React.memo(SignupsChartComponent);\nSignupsChart.displayName = 'SignupsChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SignupsContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n`;\n\nexport const Legend = styled('div')`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendLabel = styled('span')`\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendValueWrapper,\n LegendTrendInline,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from './TopCategoriesPieChart.styled';\nimport type { CategoryRevenue, CategorySortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\n\nexport interface TopCategoriesPieChartProps {\n readonly categories: CategoryRevenue[];\n readonly categorySort: CategorySortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: CategorySortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopCategoriesPieChartComponent: React.FC<TopCategoriesPieChartProps> = ({\n categories,\n categorySort,\n isLoading = false,\n title,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as CategorySortOption;\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedCategories, totalRevenue, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedCategories = [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) - (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n });\n\n const nextTotalRevenue = nextSortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedCategories,\n (category) => category.revenue,\n (category) => category.trend?.revenue,\n );\n\n return {\n sortedCategories: nextSortedCategories,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [categories, categorySort]);\n\n const getTrendGraphIcon = (direction: 'up' | 'down' | 'neutral') => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n return null;\n };\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label in the middle of the donut ring\n const radius = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize=\"10\"\n fontWeight=\"600\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0.2\"\n style={{ lineHeight: '12px', leadingTrim: 'none' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading && categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topCategories.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"categories-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topCategories.empty)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-categories\"\n aria-label={getTranslation(Keys.widget.topCategories.chartAriaLabel)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.topCategories.titleAriaLabel)}\n data-testid=\"widget-title-top-categories\"\n >\n {title ?? getTranslation(Keys.widget.topCategories.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"category-sort\"\n data-testid=\"category-sort-dropdown\"\n value={categorySort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n <option value=\"revenue\">{getTranslation(Keys.filter.categorySort.byRevenue)}</option>\n <option value=\"trend\">{getTranslation(Keys.filter.categorySort.byTrend)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-categories\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <ChartAndLegendContainer>\n <ChartWrapper data-testid=\"categories-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"55%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>\n {getTrendGraphIcon(trendDirection)}\n <span>{formattedTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"categories-legend-container\">\n {sortedCategories.map((category, index) => (\n <LegendItem key={category.id} data-testid={`category-legend-${index}`}>\n <LegendColor color={category.color} />\n <LegendInfo>\n <LegendName>{category.name}</LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {formatMoney(category.revenue, category.currencyCode)} ({category.percentage}%)\n </LegendValue>\n {category.trend?.revenue ? (\n <LegendTrendInline\n direction={resolveTrendDirection(category.trend?.revenue)}\n data-testid={`category-legend-trend-${index}`}\n aria-label={category.trend.revenue}\n >\n {getTrendGraphIcon(resolveTrendDirection(category.trend?.revenue))}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\n </LegendItem>\n ))}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopCategoriesPieChart = React.memo(TopCategoriesPieChartComponent);\nTopCategoriesPieChart.displayName = 'TopCategoriesPieChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const CategoriesContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const SortDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const ChartAndLegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n justify-content: center;\n flex: 1;\n\n @media (min-width: 768px) {\n flex-direction: row;\n gap: 24px;\n align-items: center;\n justify-content: center;\n }\n`;\n\nexport const ChartWrapper = styled('div')`\n position: relative;\n width: 100%;\n height: 220px;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 260px;\n height: 260px;\n flex: 0 0 auto;\n }\n\n @media (min-width: 1080px) {\n width: 280px;\n height: 280px;\n flex: 0 0 auto;\n }\n\n /* Style recharts pie labels (percentages inside segments) */\n svg text {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n\n text[class*='recharts'] {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n`;\n\nexport const DonutCenterOverlay = styled('div')`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 96px;\n`;\n\nexport const DonutCenterLabel = styled('div')`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const DonutCenterValue = styled('div')`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n`;\n\nexport const DonutCenterTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n margin-top: 4px;\n font-size: 12px;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 0 1 auto;\n\n @media (min-width: 768px) {\n gap: 10px;\n }\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n @media (min-width: 768px) {\n gap: 10px;\n padding: 6px 0;\n }\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendInfo = styled('div')`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`;\n\nexport const LegendName = styled('div')`\n font-size: 13px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n font-size: 14px;\n }\n`;\n\nexport const LegendValue = styled('div')`\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const LegendPercentage = styled('div')`\n display: none;\n`;\n\nexport const LegendValueWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`;\n\nexport const LegendTrendInline = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendTrend = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const EmptyState = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const EmptyStateText = styled('div')`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport {\n DashboardContainer,\n StatsRow,\n WidgetContainer,\n TwoColumnGrid,\n ErrorContainer,\n} from './ShoppingDashboard.styled';\nimport { DashboardHeader } from './shared/DashboardHeader';\nimport { StatsCard } from './shared/StatsCard';\nimport { TopSellingProductsList } from './shared/TopProducts/TopSellingProductsList';\nimport { ConversionRateChart } from './shared/ConversionRate/ConversionRateChart';\nimport { SignupsChart } from './shared/Signups/SignupsChart';\nimport { TopCategoriesPieChart } from './shared/TopCategories/TopCategoriesPieChart';\nimport type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ProductSortOption,\n SignupViewOption,\n ConversionFilterOption,\n CategorySortOption,\n} from './types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ShoppingDashboardTranslationKeys';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_SIGNUP_DATA: SignupDataPoint[] = [];\nconst EMPTY_CATEGORIES: CategoryRevenue[] = [];\n\nexport interface ShoppingDashboardProps {\n readonly stats?: DashboardStats | null;\n readonly topProducts?: TopProduct[];\n readonly conversionData?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly isLoading?: boolean;\n readonly error?: string | null;\n readonly shopTitle?: string;\n readonly className?: string;\n\n readonly dateRange?: DateRangeOption;\n readonly market?: MarketOption;\n readonly productSort?: ProductSortOption;\n readonly signupView?: SignupViewOption;\n readonly conversionFilter?: ConversionFilterOption;\n readonly categorySort?: CategorySortOption;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n\n readonly onProductsTitleClick?: () => void;\n readonly onConversionTitleClick?: () => void;\n readonly onSignupsTitleClick?: () => void;\n readonly onCategoriesToTitleClick?: () => void;\n}\n\nexport const ShoppingDashboard: React.FC<ShoppingDashboardProps> = ({\n stats,\n topProducts,\n conversionData,\n signupData,\n categories,\n isLoading = false,\n error,\n shopTitle,\n className,\n dateRange = 'last30days',\n market = 'all',\n productSort = 'units',\n signupView = 'all',\n conversionFilter = 'all',\n categorySort = 'revenue',\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onSignupsTitleClick,\n onCategoriesToTitleClick,\n}) => {\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n\n if (error) {\n return (\n <DashboardContainer as=\"main\" className={className} aria-label={getTranslation(Keys.ariaLabel.dashboard)}>\n <ErrorContainer data-testid=\"dashboard-error\" role=\"alert\" aria-live=\"assertive\">\n <strong>{getTranslation(Keys.error)}:</strong> {error}\n </ErrorContainer>\n </DashboardContainer>\n );\n }\n\n const getTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+')) return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n return (\n <DashboardContainer\n as=\"main\"\n className={className}\n data-testid=\"shopping-dashboard\"\n aria-label={getTranslation(Keys.ariaLabel.dashboard)}\n aria-busy={isLoading}\n >\n <DashboardHeader\n shopTitle={shopTitle}\n dateRange={dateRange}\n market={market}\n isLoading={isLoading}\n stats={stats}\n markets={markets}\n onDateRangeChange={onDateRangeChange}\n onMarketChange={onMarketChange}\n />\n\n <StatsRow as=\"section\" data-testid=\"stats-row\" aria-label={getTranslation(Keys.ariaLabel.statsRow)}>\n <StatsCard\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n title={getTranslation(Keys.stats.volume)}\n value={stats?.metrics?.volume ?? '0'}\n subtitle={getTranslation(Keys.stats.subtitle.dcSv)}\n trendDirection={getTrendDirection(stats?.trend?.volume)}\n trendValue={stats?.trend?.volume}\n testId=\"stats-card-volume\"\n isLoading={isLoading}\n />\n <StatsCard\n title={getTranslation(Keys.stats.visits)}\n value={stats?.metrics?.siteVisits ?? '0'}\n subtitle={`${stats?.metrics?.conversionRate ?? '0%'} ${getTranslation(Keys.stats.subtitle.conversionRate)}`}\n trendDirection={getTrendDirection(stats?.trend?.siteVisits)}\n trendValue={stats?.trend?.siteVisits}\n testId=\"stats-card-visits\"\n isLoading={isLoading}\n />\n </StatsRow>\n\n <WidgetContainer data-testid=\"widget-container\">\n <TwoColumnGrid data-testid=\"widget-row-1\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n />\n <SignupsChart\n signupData={resolvedSignupData}\n signupView={signupView}\n isLoading={isLoading}\n onViewChange={onSignupViewChange}\n onTitleClick={onSignupsTitleClick}\n />\n </TwoColumnGrid>\n\n <TwoColumnGrid data-testid=\"widget-row-2\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n isLoading={isLoading}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n />\n <TopCategoriesPieChart\n categories={resolvedCategories}\n categorySort={categorySort}\n isLoading={isLoading}\n onSortChange={onCategorySortChange}\n onTitleClick={onCategoriesToTitleClick}\n />\n </TwoColumnGrid>\n </WidgetContainer>\n </DashboardContainer>\n );\n};\n\nexport default ShoppingDashboard;\n","import React from 'react';\nimport { ShoppingDashboard } from './ShoppingDashboard';\nimport { ProductsFullView } from './shared/TopProducts/ProductsFullView';\nimport { ConversionRateFullView } from './shared/ConversionRate/ConversionRateFullView';\nimport { SignupsFullView } from './shared/Signups/SignupsFullView';\nimport { CategoriesFullView } from './shared/TopCategories/CategoriesFullView';\nimport { useTranslationResolver } from './TranslationContext';\nimport type { TranslateFn } from './TranslationKeys/translationResolver';\nimport type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ProductSortOption,\n SignupViewOption,\n ConversionFilterOption,\n CategorySortOption,\n FullViewWidgetType,\n} from './types.d';\n\ntype ViewMode = 'push' | 'replace';\n\nexport type MysiteDashboardView = 'dashboard' | FullViewWidgetType;\n\nexport interface MysiteDashboardHistoryLocation {\n readonly pathname?: string;\n readonly search?: string;\n readonly hash?: string;\n readonly state?: unknown;\n}\n\nexport interface MysiteDashboardHistoryAdapter {\n readonly location?: MysiteDashboardHistoryLocation;\n push(location: MysiteDashboardHistoryLocation): void;\n replace(location: MysiteDashboardHistoryLocation): void;\n goBack(): void;\n listen(listener: (location: MysiteDashboardHistoryLocation, action: string) => void): () => void;\n}\n\nexport interface MysiteDashboardWithNavigationProps {\n readonly stats?: DashboardStats | null;\n readonly topProducts?: TopProduct[];\n readonly conversionData?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly orders?: OrderHistory[];\n readonly signups?: SignupDetail[];\n readonly isLoading?: boolean;\n readonly error?: string | null;\n readonly shopTitle?: string;\n readonly className?: string;\n\n readonly translate?: TranslateFn;\n\n readonly initialDateRange?: DateRangeOption;\n readonly initialMarket?: MarketOption;\n readonly initialProductSort?: ProductSortOption;\n readonly initialSignupView?: SignupViewOption;\n readonly initialConversionFilter?: ConversionFilterOption;\n readonly initialCategorySort?: CategorySortOption;\n\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n\n readonly historyAdapter?: MysiteDashboardHistoryAdapter;\n readonly historyStateKey?: string;\n readonly resetToDashboardOnMount?: boolean;\n\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n readonly onViewChange?: (view: MysiteDashboardView) => void;\n}\n\nconst DEFAULT_HISTORY_STATE_KEY = 'shoppingDashboardView';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_SIGNUP_DATA: SignupDataPoint[] = [];\nconst EMPTY_CATEGORIES: CategoryRevenue[] = [];\nconst EMPTY_ORDERS: OrderHistory[] = [];\nconst EMPTY_SIGNUPS: SignupDetail[] = [];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMysiteDashboardView(value: unknown): value is MysiteDashboardView {\n return (\n value === 'dashboard' ||\n value === 'products' ||\n value === 'conversion-rate' ||\n value === 'signups' ||\n value === 'categories'\n );\n}\n\nfunction readViewFromState(state: unknown, stateKey: string): MysiteDashboardView {\n if (!isRecord(state)) {\n return 'dashboard';\n }\n\n const view = state[stateKey];\n return isMysiteDashboardView(view) ? view : 'dashboard';\n}\n\nfunction buildStateWithView(state: unknown, stateKey: string, view: MysiteDashboardView): Record<string, unknown> {\n const currentState = isRecord(state) ? state : {};\n\n return {\n ...currentState,\n [stateKey]: view,\n };\n}\n\nfunction buildLocationWithState(\n location: MysiteDashboardHistoryLocation | undefined,\n state: Record<string, unknown>,\n): MysiteDashboardHistoryLocation {\n return {\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n state,\n };\n}\n\nexport const MysiteDashboardWithNavigation: React.FC<MysiteDashboardWithNavigationProps> = ({\n stats,\n topProducts,\n conversionData,\n signupData,\n categories,\n orders,\n signups,\n isLoading = false,\n error,\n shopTitle,\n className,\n translate,\n initialDateRange = 'last30days',\n initialMarket = 'all',\n initialProductSort = 'units',\n initialSignupView = 'all',\n initialConversionFilter = 'all',\n initialCategorySort = 'revenue',\n markets,\n historyAdapter,\n historyStateKey = DEFAULT_HISTORY_STATE_KEY,\n resetToDashboardOnMount = true,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onViewChange,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<MysiteDashboardView>('dashboard');\n const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [signupView, setSignupView] = React.useState<SignupViewOption>(initialSignupView);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [categorySort, setCategorySort] = React.useState<CategorySortOption>(initialCategorySort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedSignups = signups ?? EMPTY_SIGNUPS;\n\n const updateView = React.useCallback(\n (view: MysiteDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): MysiteDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: MysiteDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: FullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleSignupViewChange = React.useCallback(\n (nextSignupView: SignupViewOption) => {\n setSignupView(nextSignupView);\n onSignupViewChange?.(nextSignupView);\n },\n [onSignupViewChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleCategorySortChange = React.useCallback(\n (nextSort: CategorySortOption) => {\n setCategorySort(nextSort);\n onCategorySortChange?.(nextSort);\n },\n [onCategorySortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleSignupsTitleClick = React.useCallback(() => {\n handleOpenFullView('signups');\n }, [handleOpenFullView]);\n\n const handleCategoriesTitleClick = React.useCallback(() => {\n handleOpenFullView('categories');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedTopProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={resolvedConversionData}\n orders={resolvedOrders}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'signups') {\n return (\n <SignupsFullView\n signupData={resolvedSignupData}\n signups={resolvedSignups}\n dateRange={dateRange}\n market={market}\n signupView={signupView}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onSignupViewChange={handleSignupViewChange}\n />\n );\n }\n\n if (currentView === 'categories') {\n return (\n <CategoriesFullView\n categories={resolvedCategories}\n dateRange={dateRange}\n market={market}\n categorySort={categorySort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onCategorySortChange={handleCategorySortChange}\n />\n );\n }\n\n return (\n <ShoppingDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n signupData={resolvedSignupData}\n categories={resolvedCategories}\n isLoading={isLoading}\n error={error}\n shopTitle={shopTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n signupView={signupView}\n conversionFilter={conversionFilter}\n categorySort={categorySort}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onSignupViewChange={handleSignupViewChange}\n onConversionFilterChange={handleConversionFilterChange}\n onCategorySortChange={handleCategorySortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onSignupsTitleClick={handleSignupsTitleClick}\n onCategoriesToTitleClick={handleCategoriesTitleClick}\n />\n );\n};\n\nexport default MysiteDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type { TopProduct, DateRangeOption, MarketOption, MarketFilterOption, ProductSortOption } from '../../types.d';\nimport { FullViewTableSkeleton } from '../LoadingSkeletons';\nimport { PageContainer, EmptyStateText } from '../FullViewComponents.styled';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n ProductInfo,\n ProductName,\n ProductSku,\n MetricValue,\n MobileCardsContainer,\n DesktopTableContainer,\n MobileProductCard,\n MobileCardHeader,\n MobileProductRank,\n MobileProductDetails,\n MobileProductName,\n MobileProductSku,\n MobileMetricsGrid,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n} from './ProductsFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\ninterface ProductRow {\n rank: number;\n name: string;\n sku: string;\n units: number;\n revenue: number;\n volume: number;\n}\n\nexport interface ProductsFullViewProps {\n readonly products: TopProduct[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly productSort: ProductSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onProductSortChange?: (sort: ProductSortOption) => void;\n}\n\nfunction mapProductToRow(product: TopProduct): ProductRow {\n return {\n rank: product.rank,\n name: product.name,\n sku: `${getTranslation(Keys.fullView.products.skuPrefix)}-${product.id.replace('prod-', '').padStart(3, '0')}`,\n units: product.unitsSold,\n revenue: product.revenue,\n volume: product.volume,\n };\n}\n\nexport const ProductsFullView: React.FC<ProductsFullViewProps> = ({\n products,\n dateRange,\n market,\n productSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [sortColumn, setSortColumn] = useState<string>(productSort === 'revenue' ? 'revenue' : 'units');\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.productSort.label),\n value: productSort,\n options: [\n { value: 'units', label: getTranslation(Keys.filter.productSort.units) },\n { value: 'revenue', label: getTranslation(Keys.filter.productSort.revenue) },\n { value: 'volume', label: getTranslation(Keys.filter.productSort.volume) },\n ],\n },\n ],\n [dateRange, market, marketOptions, productSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onProductSortChange?.(value as ProductSortOption);\n setCurrentPage(1);\n }\n },\n [onDateRangeChange, onMarketChange, onProductSortChange],\n );\n\n const handleSort = React.useCallback((columnKey: string, direction: 'asc' | 'desc') => {\n setSortColumn(columnKey);\n setSortDirection(direction);\n setCurrentPage(1);\n }, []);\n\n const productRows = React.useMemo(() => products.map(mapProductToRow), [products]);\n\n const sortedRows = React.useMemo(\n () =>\n [...productRows].sort((a, b) => {\n const aVal = a[sortColumn as keyof ProductRow] as number;\n const bVal = b[sortColumn as keyof ProductRow] as number;\n return sortDirection === 'asc' ? aVal - bVal : bVal - aVal;\n }),\n [productRows, sortColumn, sortDirection],\n );\n\n const { totalPages, pageItems: paginatedRows } = usePaginatedItems(sortedRows, currentPage, itemsPerPage);\n\n const currencyCode = products[0]?.currencyCode;\n\n const columns: ColumnDef<ProductRow>[] = React.useMemo(\n () => [\n { key: 'rank', label: getTranslation(Keys.fullView.products.columns.rank), sortable: true },\n {\n key: 'name',\n label: getTranslation(Keys.fullView.products.columns.product),\n sortable: true,\n render: (_: unknown, row: ProductRow) => (\n <ProductInfo>\n <ProductName>{row.name}</ProductName>\n <ProductSku>{row.sku}</ProductSku>\n </ProductInfo>\n ),\n },\n {\n key: 'units',\n label: getTranslation(Keys.fullView.products.columns.unitsSold),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.products.columns.revenue),\n sortable: true,\n render: (value: unknown) => <MetricValue>{formatMoney(Number(value), currencyCode)}</MetricValue>,\n },\n {\n key: 'volume',\n label: getTranslation(Keys.fullView.products.columns.volume),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n ],\n [currencyCode],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewTableSkeleton />\n </PageContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"products-fullview-empty\">\n {getTranslation(Keys.fullView.products.noProducts)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"products-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedRows}\n sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n getRowKey={(row: ProductRow) => row.rank}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCardsContainer data-testid=\"products-fullview-mobile-cards\">\n {paginatedRows.map((row) => (\n <MobileProductCard key={row.rank}>\n <MobileCardHeader>\n <MobileProductRank>#{row.rank}</MobileProductRank>\n <MobileProductDetails>\n <MobileProductName>{row.name}</MobileProductName>\n <MobileProductSku>{row.sku}</MobileProductSku>\n </MobileProductDetails>\n </MobileCardHeader>\n <MobileMetricsGrid>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.widget.topProducts.units)}\n </MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.widget.topProducts.revenue)}\n </MobileMetricLabel>\n <MobileMetricValue>{formatMoney(row.revenue, currencyCode)}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.filter.productSort.volume)}\n </MobileMetricLabel>\n <MobileMetricValue>{row.volume.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n </MobileMetricsGrid>\n </MobileProductCard>\n ))}\n </MobileCardsContainer>\n )}\n\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedRows.length}\n />\n )}\n </PageContainer>\n );\n};\n","import React from 'react';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LanguageIcon from '@mui/icons-material/Language';\nimport {\n PageHeaderWrapper,\n BackButtonWrapper,\n BackButton,\n HeaderContainer,\n LeftSection,\n Title,\n DateRange,\n MobileDateRange,\n FiltersSection,\n FilterWrapper,\n FilterIcon,\n FilterDropdown,\n MobileTitleWrapper,\n MobileTitle,\n} from './PageHeader.styled';\nimport type { FilterConfig } from './types';\nimport type { DateRangeOption, MarketOption, MarketFilterOption } from '../types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport type { FilterConfig } from './types';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport interface DateRangeMarketKeys {\n readonly filter: {\n readonly dateRange: {\n readonly label: TranslationEntry;\n readonly last7days: TranslationEntry;\n readonly last30days: TranslationEntry;\n readonly last90days: TranslationEntry;\n readonly thisMonth: TranslationEntry;\n };\n readonly market: {\n readonly label: TranslationEntry;\n };\n };\n}\n\nexport function buildDateRangeFilter(dateRange: DateRangeOption, keys: DateRangeMarketKeys): FilterConfig {\n return {\n key: 'dateRange',\n label: getTranslation(keys.filter.dateRange.label),\n value: dateRange,\n icon: 'calendar',\n options: [\n { value: 'last7days', label: getTranslation(keys.filter.dateRange.last7days) },\n { value: 'last30days', label: getTranslation(keys.filter.dateRange.last30days) },\n { value: 'last90days', label: getTranslation(keys.filter.dateRange.last90days) },\n { value: 'thisMonth', label: getTranslation(keys.filter.dateRange.thisMonth) },\n ],\n };\n}\n\nexport function buildMarketFilter(\n market: MarketOption,\n marketOptions: ReadonlyArray<MarketFilterOption>,\n keys: DateRangeMarketKeys,\n): FilterConfig {\n return {\n key: 'market',\n label: getTranslation(keys.filter.market.label),\n value: market,\n icon: 'globe',\n options: marketOptions.map((option) => ({ value: option.value, label: option.label })),\n };\n}\n\nexport interface PageHeaderProps {\n readonly title: string;\n readonly dateRange: string;\n readonly onBack: () => void;\n readonly filters?: FilterConfig[];\n readonly onFilterChange?: (filterKey: string, value: string) => void;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ title, dateRange, onBack, filters, onFilterChange }) => {\n const renderFilterIcon = (iconType?: 'calendar' | 'globe') => {\n if (!iconType) return null;\n return (\n <FilterIcon>\n {iconType === 'calendar' && <CalendarTodayIcon />}\n {iconType === 'globe' && <LanguageIcon />}\n </FilterIcon>\n );\n };\n\n return (\n <PageHeaderWrapper data-testid=\"page-header\">\n <BackButtonWrapper>\n <BackButton\n onClick={onBack}\n aria-label={getTranslation(Keys.navigation.backAriaLabel)}\n data-testid=\"page-back-button\"\n type=\"button\"\n >\n <ArrowBackIcon />\n <span>{getTranslation(Keys.navigation.backToDashboard)}</span>\n </BackButton>\n </BackButtonWrapper>\n\n <MobileTitleWrapper>\n <MobileTitle>{title}</MobileTitle>\n </MobileTitleWrapper>\n\n <HeaderContainer>\n <LeftSection>\n <Title data-testid=\"page-header-title\">{title}</Title>\n <DateRange data-testid=\"page-header-date-range\">{dateRange}</DateRange>\n </LeftSection>\n\n {filters && filters.length > 0 && onFilterChange && (\n <FiltersSection data-testid=\"page-header-filters\">\n {filters.map((filter) => (\n <FilterWrapper key={filter.key}>\n {renderFilterIcon(filter.icon)}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onFilterChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {filter.label && filter.key === 'customerType'\n ? `${filter.label} ${option.label}`\n : option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterWrapper>\n ))}\n </FiltersSection>\n )}\n\n <MobileDateRange>{dateRange}</MobileDateRange>\n </HeaderContainer>\n </PageHeaderWrapper>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageHeaderWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const BackButtonWrapper = styled('div')`\n display: flex;\n align-items: center;\n`;\n\nexport const BackButton = styled('button')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`;\n\nexport const LeftSection = styled('div')`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const Title = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const DateRange = styled('p')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n`;\n\nexport const MobileDateRange = styled('p')`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`;\n\nexport const FilterWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const FilterIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n font-size: 16px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`;\n\nexport const MobileTitleWrapper = styled('div')`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const MobileTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n`;\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableHeaderCell,\n TableBody,\n TableRow,\n TableCell,\n EmptyTableCell,\n SortIconContainer,\n} from './DataTable.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ColumnDef<TData = unknown> {\n key: string;\n label: string;\n sortable?: boolean;\n render?: (value: unknown, row: TData) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<TData = unknown> {\n readonly columns: ColumnDef<TData>[];\n readonly data: TData[];\n readonly sortable?: boolean;\n readonly onSort?: (columnKey: string, direction: 'asc' | 'desc') => void;\n readonly sortColumn?: string;\n readonly sortDirection?: 'asc' | 'desc';\n readonly getRowKey?: (row: TData, rowIndex: number) => React.Key;\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n sortable = false,\n onSort,\n sortColumn,\n sortDirection = 'asc',\n getRowKey,\n}: DataTableProps<TData>) => {\n const handleSort = (columnKey: string) => {\n if (!sortable || !onSort) return;\n const newDirection = sortColumn === columnKey && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(columnKey, newDirection);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, columnKey: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSort(columnKey);\n }\n };\n\n const getAriaSort = (columnKey: string): 'ascending' | 'descending' | undefined => {\n if (sortColumn !== columnKey) return undefined;\n return sortDirection === 'asc' ? 'ascending' : 'descending';\n };\n\n return (\n <TableContainer data-testid=\"data-table\">\n <Table>\n <TableHeader>\n <tr>\n {columns.map((column) => (\n <TableHeaderCell\n key={column.key}\n scope=\"col\"\n sortable={sortable && column.sortable}\n onClick={() => column.sortable && handleSort(column.key)}\n onKeyDown={(e) => column.sortable && handleKeyDown(e, column.key)}\n tabIndex={sortable && column.sortable ? 0 : -1}\n aria-sort={getAriaSort(column.key)}\n aria-label={`${column.label}${column.sortable ? getTranslation(Keys.dataTable.sortableColumn) : ''}`}\n data-testid={`table-header-${column.key}`}\n >\n {column.label}\n {sortable && column.sortable && (\n <SortIconContainer isActive={sortColumn === column.key}>\n {sortColumn === column.key && sortDirection === 'desc' ? (\n <ArrowDownwardIcon />\n ) : (\n <ArrowUpwardIcon />\n )}\n </SortIconContainer>\n )}\n </TableHeaderCell>\n ))}\n </tr>\n </TableHeader>\n <TableBody>\n {data.length === 0 ? (\n <TableRow data-testid=\"table-empty-row\">\n <EmptyTableCell colSpan={columns.length}>\n {getTranslation(Keys.dataTable.noDataAvailable)}\n </EmptyTableCell>\n </TableRow>\n ) : (\n data.map((row, rowIndex) => (\n <TableRow\n key={getRowKey ? getRowKey(row, rowIndex) : rowIndex}\n data-testid={`table-row-${rowIndex}`}\n >\n {columns.map((column) => (\n <TableCell key={column.key} data-testid={`table-cell-${column.key}`}>\n {column.render\n ? column.render((row as Record<string, unknown>)[column.key], row)\n : ((row as Record<string, unknown>)[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TableContainer = styled('div')`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n`;\n\nexport const Table = styled('table')`\n width: 100%;\n border-collapse: collapse;\n`;\n\nexport const TableHeader = styled('thead')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-bottom: 2px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n`;\n\nexport const TableHeaderCell = styled('th')<{ sortable?: boolean }>`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n cursor: ${({ sortable }) => (sortable ? 'pointer' : 'default')};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: -2px;\n }\n`;\n\nexport const TableBody = styled('tbody')``;\n\nexport const TableRow = styled('tr')`\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nexport const TableCell = styled('td')`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n`;\n\nexport const EmptyTableCell = styled(TableCell)`\n text-align: center;\n`;\n\nexport const SortIconContainer = styled('span')<{ isActive?: boolean }>`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({ isActive }) => (isActive ? 1 : 0.4)};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;\n","import React from 'react';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport { PaginationContainer, PageButton, PageInfo, NavButton } from './Pagination.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface PaginationProps {\n readonly currentPage: number;\n readonly totalPages: number;\n readonly onPageChange: (page: number) => void;\n readonly itemsPerPage?: number;\n readonly totalItems?: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n}) => {\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, action: () => void) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n action();\n }\n };\n\n const getPageNumbers = (): number[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: number[] = [];\n if (currentPage <= 4) {\n pages.push(1, 2, 3, 4, 5);\n } else if (currentPage >= totalPages - 3) {\n pages.push(totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(currentPage - 1, currentPage, currentPage + 1);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const startItem = itemsPerPage ? (currentPage - 1) * itemsPerPage + 1 : null;\n const endItem = itemsPerPage ? Math.min(currentPage * itemsPerPage, totalItems ?? Infinity) : null;\n const goToPageLabel = getTranslation(Keys.pagination.goToPage);\n\n return (\n <PaginationContainer data-testid=\"pagination\">\n <NavButton\n onClick={handlePrevious}\n onKeyDown={(e) => handleKeyDown(e, handlePrevious)}\n disabled={currentPage === 1}\n aria-label={getTranslation(Keys.pagination.previousPage)}\n data-testid=\"pagination-previous\"\n type=\"button\"\n >\n <ChevronLeftIcon />\n </NavButton>\n\n {totalPages > 7 && currentPage > 4 && (\n <>\n <PageButton\n onClick={() => onPageChange(1)}\n isActive={false}\n aria-label={`${goToPageLabel} 1`}\n data-testid=\"pagination-page-1\"\n type=\"button\"\n >\n 1\n </PageButton>\n <PageInfo>...</PageInfo>\n </>\n )}\n\n {pageNumbers.map((page) => (\n <PageButton\n key={page}\n onClick={() => onPageChange(page)}\n isActive={currentPage === page}\n aria-label={`${goToPageLabel} ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n data-testid={`pagination-page-${page}`}\n type=\"button\"\n >\n {page}\n </PageButton>\n ))}\n\n {totalPages > 7 && currentPage < totalPages - 3 && (\n <>\n <PageInfo>...</PageInfo>\n <PageButton\n onClick={() => onPageChange(totalPages)}\n isActive={false}\n aria-label={`${goToPageLabel} ${totalPages}`}\n data-testid={`pagination-page-${totalPages}`}\n type=\"button\"\n >\n {totalPages}\n </PageButton>\n </>\n )}\n\n <NavButton\n onClick={handleNext}\n onKeyDown={(e) => handleKeyDown(e, handleNext)}\n disabled={currentPage === totalPages}\n aria-label={getTranslation(Keys.pagination.nextPage)}\n data-testid=\"pagination-next\"\n type=\"button\"\n >\n <ChevronRightIcon />\n </NavButton>\n\n {itemsPerPage && totalItems && (\n <PageInfo as=\"output\" aria-live=\"polite\" data-testid=\"pagination-page-info\">\n {startItem}-{endItem} {getTranslation(Keys.pagination.of)} {totalItems}\n </PageInfo>\n )}\n </PaginationContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PaginationContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`;\n\nexport const PageButton = styled('button')<{ isActive?: boolean }>`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A80') : getGenomeColor(theme, 'N20')};\n color: ${({ theme, isActive }) => (isActive ? '#ffffff' : getGenomeColor(theme, 'N100'))};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A70') : getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\nexport const PageInfo = styled('span')`\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n margin: 0 8px;\n`;\n\nexport const NavButton = styled('button')`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`;\n\nexport const MetricChartCardSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const MetricSection = styled(Box)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({ theme }) => theme.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`;\n\nexport const MetricTrend = styled(Box)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`;\n\nexport const ComparisonText = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`;\n\nexport const ChartSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`;\n\nexport const ChartTitle = styled('h2')`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`;\n\nexport const ChartContainer = styled(Box)`\n width: 90%;\n height: 450px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 0;\n }\n`;\n\nexport const TableSection = styled(Box)<{ withCard?: boolean }>`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({ withCard = true, theme }) =>\n withCard &&\n `\n padding: 20px;\n background-color: ${getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`;\n\nexport const LoadingContainer = styled(Box)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`;\n\nexport const EmptyStateText = styled(Typography)`\n text-align: center;\n color: ${({ theme }) => theme.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`;\n\nexport const MobileCardName = styled(Typography)`\n font-weight: 600;\n font-size: 14px;\n`;\n\nexport const MobileCardSubtext = styled(Typography)`\n font-size: 13px;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileCardDetail = styled(Typography)`\n font-size: 13px;\n`;\n\nexport const MobileCardStatus = styled(Typography)<{ status: string }>`\n font-size: 13px;\n color: ${({ theme, status }) => (status === 'Active' ? theme.palette.success.main : theme.palette.warning.main)};\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const ProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const ProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const MobileCardsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileProductCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileCardHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`;\n\nexport const MobileProductRank = styled(Typography)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.primary.main};\n min-width: 24px;\n`;\n\nexport const MobileProductDetails = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const MobileProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n`;\n\nexport const MobileProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import useMediaQuery from '@mui/material/useMediaQuery';\n\nexport const MOBILE_VIEWPORT_QUERY = '(max-width:767px)';\n\nexport function useIsMobileViewport(): boolean {\n return useMediaQuery(MOBILE_VIEWPORT_QUERY, { noSsr: true });\n}\n","import React, { useState } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n ConversionDataPoint,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ConversionFilterOption,\n} from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n TableSection,\n} from '../FullViewComponents.styled';\nimport {\n MobileOrderCard,\n MobileOrderHeader,\n MobileCustomerInfo,\n MobileCustomerName,\n MobileOrderDate,\n MobileOrderId,\n MobileOrderMetrics,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n MobileOrdersContainer,\n DesktopTableContainer,\n OrderIdColumnCell,\n ConversionTrendChartContainer,\n ChartWithLegendWrapper,\n ChartLegendContainer,\n LegendItem,\n} from './ConversionRateFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateFullViewProps {\n readonly conversionData: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n}\n\nexport const ConversionRateFullView: React.FC<ConversionRateFullViewProps> = ({\n conversionData,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onConversionFilterChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trend = React.useMemo((): { direction: TrendDirection; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null)\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n let direction: TrendDirection = 'neutral';\n if (summaryChangePct > 0) direction = 'up';\n else if (summaryChangePct < 0) direction = 'down';\n return { direction, value: `${summaryChangePct >= 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%` };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const changePercent = ((latestRate - previousRate) / previousRate) * 100;\n if (Math.abs(changePercent) < 0.1) {\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n }\n let direction: TrendDirection = 'neutral';\n if (changePercent > 0) direction = 'up';\n else if (changePercent < 0) direction = 'down';\n return { direction, value: `${changePercent >= 0 ? '+' : ''}${changePercent.toFixed(1)}%` };\n }, [summaryChangePct, conversionData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'standard') return getTranslation(Keys.filter.conversionType.standard);\n if (filter === 'subscription') return getTranslation(Keys.filter.conversionType.subscription);\n return getTranslation(Keys.filter.conversionType.all);\n }, []);\n\n const conversionFilterLabel = React.useMemo(\n () => getConversionFilterLabel(conversionFilter),\n [conversionFilter, getConversionFilterLabel],\n );\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'customerType',\n label: getTranslation(Keys.filter.signupView.label),\n value: conversionFilter,\n options: [\n { value: 'all', label: getTranslation(Keys.filter.conversionType.all) },\n { value: 'standard', label: getTranslation(Keys.filter.conversionType.standard) },\n { value: 'subscription', label: getTranslation(Keys.filter.conversionType.subscription) },\n ],\n },\n ],\n [conversionFilter, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'customerType') {\n onConversionFilterChange?.(value as ConversionFilterOption);\n setCurrentPage(1);\n }\n },\n [onConversionFilterChange, onDateRangeChange, onMarketChange],\n );\n\n const filteredOrders = React.useMemo(() => {\n if (conversionFilter === 'all') return orders;\n return orders.filter((order) => order.customerType.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(filteredOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(\n () => [\n {\n key: 'orderId',\n label: getTranslation(Keys.fullView.conversionRate.columns.orderId),\n sortable: true,\n render: (value) => <OrderIdColumnCell>{value as React.ReactNode}</OrderIdColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.fullView.conversionRate.columns.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n { key: 'customerType', label: getTranslation(Keys.fullView.conversionRate.columns.type), sortable: true },\n { key: 'items', label: getTranslation(Keys.fullView.conversionRate.columns.items), sortable: true },\n {\n key: 'total',\n label: getTranslation(Keys.fullView.conversionRate.columns.total),\n sortable: true,\n render: (value: unknown, row: OrderHistory) =>\n formatMoney(Number(value), row.currencyCode, undefined, 2),\n },\n { key: 'bv', label: getTranslation(Keys.fullView.conversionRate.columns.bv), sortable: true },\n ],\n [],\n );\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'standard') return '#2e7d32';\n if (conversionFilter === 'subscription') return '#ed6c02';\n return '#1976d2';\n }, [conversionFilter]);\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.conversionRate.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.conversionRate.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <MetricChartCardSection data-testid=\"conversion-fullview-metric-chart\">\n <MetricSection>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0px', flexWrap: 'wrap' }}>\n <MetricValue data-testid=\"conversion-rate-value\" style={{ marginRight: '6px' }}>\n {currentRate.toFixed(1)}%\n </MetricValue>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <span\n style={{\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 600,\n fontSize: '14px',\n lineHeight: '20px',\n letterSpacing: '0em',\n }}\n >\n {trend.value}\n </span>\n <span\n style={{\n marginLeft: '2px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 400,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.01em',\n color: '#5F5F5F',\n }}\n >\n compared to this time last month\n </span>\n </MetricTrend>\n </div>\n </MetricSection>\n\n <ChartSection>\n <ChartWithLegendWrapper>\n <ConversionTrendChartContainer data-testid=\"conversion-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={conversionData} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis tickFormatter={(value) => `${value}%`} domain={[0, 'auto']} />\n <Tooltip\n formatter={(value: unknown) => {\n if (typeof value === 'number') return `${value.toFixed(2)}%`;\n if (typeof value === 'string') return value;\n return getTranslation(Keys.fullView.conversionRate.notAvailable);\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.widget.conversionRate.title)} (${conversionFilterLabel})`}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </ConversionTrendChartContainer>\n <ChartLegendContainer>\n <LegendItem style={{ color: getChartColor() }}>\n {`${getTranslation(Keys.widget.conversionRate.title)} (${conversionFilterLabel})`}\n </LegendItem>\n </ChartLegendContainer>\n </ChartWithLegendWrapper>\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"conversion-fullview-table-section\">\n <ChartTitle data-testid=\"conversion-fullview-table-title\">\n {getTranslation(Keys.fullView.conversionRate.orderDetailsTitle)} ({filteredOrders.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"conversion-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedOrders}\n getRowKey={(row: OrderHistory) => row.orderId}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOrdersContainer data-testid=\"conversion-fullview-mobile-orders\">\n {paginatedOrders.map((order) => (\n <MobileOrderCard key={order.orderId}>\n <MobileOrderHeader>\n <MobileCustomerInfo>\n <MobileCustomerName>{order.customerName}</MobileCustomerName>\n <MobileOrderDate>{order.date}</MobileOrderDate>\n </MobileCustomerInfo>\n <MobileOrderId>{order.orderId}</MobileOrderId>\n </MobileOrderHeader>\n <MobileOrderMetrics>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.items)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.items}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.orderTotal)}\n </MobileMetricLabel>\n <MobileMetricValue>${order.total.toFixed(2)}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.totalSv)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.bv}</MobileMetricValue>\n </MobileMetricItem>\n </MobileOrderMetrics>\n </MobileOrderCard>\n ))}\n </MobileOrdersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={filteredOrders.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionTrendChartContainer = styled(Box)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`;\n\nexport const MobileOrderCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const MobileOrderHeader = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const MobileCustomerInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const MobileCustomerName = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n`;\n\nexport const MobileOrderDate = styled(Typography)`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileOrderId = styled('a')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const MobileOrderMetrics = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const MobileOrdersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const ChartWithLegendWrapper = styled(Box)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`;\n\nexport const ChartLegendContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`;\n\nexport const LegendItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const ComparisonTextMobile = styled(Typography)`\n margin-top: 4px;\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n @media (max-width: 767px) {\n font-size: 0.75rem;\n }\n`;\n\nexport const OrderIdColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { Box } from '@mui/material';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport type {\n SignupDataPoint,\n SignupDetail,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n SignupViewOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n TableSection,\n EmptyStateText,\n MobileCardName,\n MobileCardSubtext,\n MobileCardDetail,\n MobileCardStatus,\n} from '../FullViewComponents.styled';\nimport {\n MobileSignupsContainer,\n DesktopTableContainer,\n MobileSignupCard,\n SignupTrendChartContainer,\n ComparisonTextMobile,\n ChartWithLegendWrapper,\n ChartLegendContainer,\n LegendItem,\n NameColumnCell,\n} from './SignupsFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nconst SERIES_COLORS = { total: '#3B82F6', members: '#7B92A8', retail: '#A3B5C7', brandAffiliates: '#5F7388' };\n\nfunction toNumeric(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/,/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\n/**\n * Transform API response format to SignupDataPoint array\n * Handles both direct array format and nested API response with 'daily' array\n */\nfunction normalizeSignupDataInput(input: unknown): SignupDataPoint[] {\n // If it's already an array, return it\n if (Array.isArray(input)) {\n return input;\n }\n\n // Handle API response format with 'daily' array\n const apiResponse = input as Record<string, unknown>;\n if (Array.isArray(apiResponse.daily)) {\n return (apiResponse.daily as Array<Record<string, unknown>>).map((item) => ({\n date: String(item.date ?? ''),\n total: toNumeric(item.total),\n members: toNumeric(item.members),\n retail: toNumeric(item.retail),\n brandAffiliates: toNumeric(\n item.brandAffiliates ?? item.brandAffiliate ?? item.brand_affiliates ?? item.brand_affiliate,\n ),\n }));\n }\n\n // Fallback to empty array\n return [];\n}\n\nexport interface SignupsFullViewProps {\n /**\n * Signup data - can be either:\n * 1. Direct array of SignupDataPoint (camelCase format)\n * 2. API response object with 'daily' array (snake_case format)\n */\n readonly signupData: SignupDataPoint[] | { daily?: Array<Record<string, unknown>>; [key: string]: unknown };\n readonly signups: SignupDetail[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly signupView: SignupViewOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n}\n\nexport const SignupsFullView: React.FC<SignupsFullViewProps> = ({\n signupData,\n signups,\n dateRange,\n market,\n signupView,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onSignupViewChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const normalizedSignupData = React.useMemo(() => {\n // First, transform API response format to array if needed\n const dataArray = normalizeSignupDataInput(signupData);\n\n // Then, normalize field names and values\n return dataArray.map((point) => {\n const rawPoint = point as unknown as Record<string, unknown>;\n const members = toNumeric(rawPoint.members);\n const retail = toNumeric(rawPoint.retail);\n const brandAffiliates = toNumeric(\n rawPoint.brandAffiliates ??\n rawPoint.brandAffiliate ??\n rawPoint.brand_affiliates ??\n rawPoint.brand_affiliate,\n );\n const total = toNumeric(rawPoint.total ?? rawPoint.all ?? rawPoint.signupTotal ?? rawPoint.value);\n\n return {\n ...point,\n total: total > 0 ? total : members + retail + brandAffiliates,\n members,\n retail,\n brandAffiliates,\n };\n });\n }, [signupData]);\n\n const totalSignups = React.useMemo(() => {\n if (normalizedSignupData.length === 0) return 0;\n return normalizedSignupData[normalizedSignupData.length - 1].total;\n }, [normalizedSignupData]);\n\n const trend = React.useMemo((): {\n direction: 'up' | 'down' | 'neutral';\n absoluteChange: number;\n percentageChange: string;\n } => {\n if (normalizedSignupData.length < 2)\n return {\n direction: 'neutral',\n absoluteChange: 0,\n percentageChange: getTranslation(Keys.defaults.zeroTrend),\n };\n const first = normalizedSignupData[0].total;\n const last = normalizedSignupData[normalizedSignupData.length - 1].total;\n if (first <= 0)\n return {\n direction: 'neutral',\n absoluteChange: 0,\n percentageChange: getTranslation(Keys.defaults.zeroTrend),\n };\n const absoluteChange = last - first;\n const percentageChange = (absoluteChange / first) * 100;\n let direction: 'up' | 'down' | 'neutral' = 'neutral';\n if (percentageChange > 0) direction = 'up';\n else if (percentageChange < 0) direction = 'down';\n return {\n direction,\n absoluteChange: Math.round(absoluteChange),\n percentageChange: `${percentageChange >= 0 ? '+' : ''}${percentageChange.toFixed(1)}%`,\n };\n }, [normalizedSignupData, Keys]);\n\n const hasSignupTrendData = normalizedSignupData.length > 0;\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'signupView',\n label: getTranslation(Keys.filter.signupView.label),\n value: signupView,\n options: [\n { value: 'all', label: getTranslation(Keys.filter.signupView.all) },\n { value: 'members', label: getTranslation(Keys.filter.signupView.members) },\n { value: 'retail', label: getTranslation(Keys.filter.signupView.retail) },\n { value: 'brandAffiliates', label: getTranslation(Keys.filter.signupView.brandAffiliates) },\n ],\n },\n ],\n [dateRange, market, marketOptions, signupView],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'signupView') {\n onSignupViewChange?.(value as SignupViewOption);\n setCurrentPage(1);\n }\n },\n [onDateRangeChange, onMarketChange, onSignupViewChange],\n );\n\n const { totalPages, pageItems: paginatedSignups } = usePaginatedItems(signups, currentPage, itemsPerPage);\n\n const columns: ColumnDef<SignupDetail>[] = React.useMemo(\n () => [\n { key: 'id', label: getTranslation(Keys.fullView.signups.columns.id), sortable: true },\n {\n key: 'name',\n label: getTranslation(Keys.fullView.signups.columns.name),\n sortable: true,\n render: (value) => <NameColumnCell>{value as React.ReactNode}</NameColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.fullView.signups.columns.date), sortable: true },\n { key: 'type', label: getTranslation(Keys.fullView.signups.columns.type), sortable: true },\n { key: 'email', label: getTranslation(Keys.fullView.signups.columns.email), sortable: true },\n { key: 'status', label: getTranslation(Keys.fullView.signups.columns.status), sortable: true },\n ],\n [],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"signups-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.signups.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"signups-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.signups.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <MetricChartCardSection data-testid=\"signups-fullview-metric-chart\">\n <MetricSection>\n <MetricValue data-testid=\"signups-total\">{totalSignups.toLocaleString()}</MetricValue>\n <MetricTrend direction={trend.direction}>\n {trend.direction === 'up' && <TrendingUpIcon />}\n {trend.direction === 'down' && <TrendingDownIcon />}\n {trend.direction !== 'neutral' && (\n <>\n <span style={{ fontWeight: 600, lineHeight: 1 }}>\n {trend.absoluteChange > 0 ? '+' : ''}\n {trend.absoluteChange}\n </span>\n <span style={{ fontWeight: 400, lineHeight: 1 }}>{trend.percentageChange}</span>\n </>\n )}\n {trend.direction === 'neutral' && <span>{trend.percentageChange}</span>}\n </MetricTrend>\n <ComparisonTextMobile>{getTranslation(Keys.widget.conversionRate.comparison)}</ComparisonTextMobile>\n </MetricSection>\n\n <ChartSection>\n {hasSignupTrendData ? (\n <ChartWithLegendWrapper>\n <SignupTrendChartContainer data-testid=\"signups-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" minHeight={240}>\n <LineChart data={normalizedSignupData}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis />\n <Tooltip />\n {signupView === 'all' && (\n <>\n <Line\n type=\"monotone\"\n dataKey=\"total\"\n stroke={SERIES_COLORS.total}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.total)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.members)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.retail)}\n dot={{ r: 2 }}\n connectNulls\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n </>\n )}\n {signupView === 'members' && (\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.members)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n {signupView === 'retail' && (\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.retail)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n {signupView === 'brandAffiliates' && (\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n name={getTranslation(Keys.widget.signups.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </SignupTrendChartContainer>\n <Box>\n {signupView === 'all' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.total }}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.widget.signups.members)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.widget.signups.retail)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.widget.signups.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.widget.signups.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.widget.signups.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.widget.signups.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n </Box>\n </ChartWithLegendWrapper>\n ) : (\n <EmptyStateText data-testid=\"signups-fullview-chart-empty\">\n {getTranslation(Keys.widget.signups.noTrendData)}\n </EmptyStateText>\n )}\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"signups-fullview-table-section\">\n <ChartTitle data-testid=\"signups-fullview-table-title\">{`${getTranslation(Keys.fullView.signups.detailsTitle)} (${signups.length})`}</ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"signups-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedSignups}\n getRowKey={(row: SignupDetail) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileSignupsContainer data-testid=\"signups-fullview-mobile-cards\">\n {paginatedSignups.map((signup) => (\n <MobileSignupCard key={signup.id}>\n <MobileCardName>{signup.name}</MobileCardName>\n <MobileCardSubtext>\n {signup.date} - {signup.type}\n </MobileCardSubtext>\n <MobileCardDetail>{signup.email}</MobileCardDetail>\n <MobileCardStatus status={signup.status}>{signup.status}</MobileCardStatus>\n </MobileSignupCard>\n ))}\n </MobileSignupsContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={signups.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const MobileSignupsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileSignupCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const SignupTrendChartContainer = styled(Box)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`;\n\nexport const ComparisonTextMobile = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n`;\n\nexport const ChartWithLegendWrapper = styled(Box)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`;\n\nexport const ChartLegendContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`;\n\nexport const LegendItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const NameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n CategorySortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n SummaryItemRow,\n SummaryItemInfo,\n SummaryItemName,\n SummaryItemSubtext,\n SummaryItemPercentage,\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrendIcon,\n DesktopTableContainer,\n MobileCategoriesContainer,\n MobileCategoryCard,\n CategoryNameColumnCell,\n} from './CategoriesFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\n\nexport interface CategoriesFullViewProps {\n readonly categories: CategoryRevenue[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly categorySort: CategorySortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onCategorySortChange?: (sort: CategorySortOption) => void;\n}\n\nexport const CategoriesFullView: React.FC<CategoriesFullViewProps> = ({\n categories,\n dateRange,\n market,\n categorySort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onCategorySortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.productSort.label),\n value: categorySort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.filter.categorySort.byRevenue) },\n { value: 'trend', label: getTranslation(Keys.filter.categorySort.byTrend) },\n ],\n },\n ],\n [categorySort, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onCategorySortChange?.(value as CategorySortOption);\n setCurrentPage(1);\n }\n },\n [onCategorySortChange, onDateRangeChange, onMarketChange],\n );\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label more towards center of the donut ring, slightly inward\n const radius = innerRadius + (outerRadius - innerRadius) * 0.45;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"12\"\n fontWeight=\"700\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0\"\n style={{ lineHeight: '14px', pointerEvents: 'none' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const getTrendIcon = (direction: 'up' | 'down' | 'neutral') => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '16px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '16px' }} aria-hidden=\"true\" />;\n }\n return null;\n };\n\n const resolveTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n const parsed = Number.parseFloat(trendValue);\n if (Number.isNaN(parsed)) return 'neutral';\n if (parsed > 0) return 'up';\n if (parsed < 0) return 'down';\n return 'neutral';\n };\n\n const sortedCategories = React.useMemo(\n () =>\n [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) -\n (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n }),\n [categories, categorySort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedCategories,\n (category) => category.revenue,\n (category) => category.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedCategories]);\n\n const topCategories = React.useMemo(() => sortedCategories.slice(0, 5), [sortedCategories]);\n\n const { totalPages, pageItems: paginatedCategories } = usePaginatedItems(\n sortedCategories,\n currentPage,\n itemsPerPage,\n );\n\n const columns: ColumnDef<CategoryRevenue>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.categories.columns.category),\n sortable: true,\n render: (_: unknown, row: CategoryRevenue) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <CategoryNameColumnCell>{row.name}</CategoryNameColumnCell>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.categories.columns.revenue),\n sortable: true,\n render: (value: unknown, row: CategoryRevenue) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.categories.columns.percentOfTotal),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.categories.columns.trend),\n render: (_: unknown, row: CategoryRevenue) =>\n row.trend?.revenue ?? getTranslation(Keys.defaults.noValue),\n },\n ],\n [],\n );\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"categories-fullview-empty\">\n {getTranslation(Keys.fullView.categories.noCategoryData)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"categories-fullview-top-section\">\n <ChartWrapper data-testid=\"categories-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>\n {getTrendIcon(totalRevenueTrendDirection)}\n <span>{totalRevenueTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"categories-fullview-summary\">\n {topCategories.map((category) => (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{category.name}</SummaryName>\n <SummaryValue>{formatMoney(category.revenue, category.currencyCode)}</SummaryValue>\n <SummaryPercentage>({category.percentage}%)</SummaryPercentage>\n {category.trend?.revenue ? (\n <SummaryTrendIcon direction={resolveTrendDirection(category.trend.revenue)}>\n {getTrendIcon(resolveTrendDirection(category.trend.revenue))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n ))}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"categories-fullview-table-section\">\n <ChartTitle data-testid=\"categories-fullview-table-title\">\n {getTranslation(Keys.fullView.categories.allCategoriesTitle)} ({sortedCategories.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedCategories}\n sortable\n getRowKey={(row: CategoryRevenue) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCategoriesContainer>\n {paginatedCategories.map((category) => (\n <MobileCategoryCard key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryItemInfo>\n <SummaryItemName>{category.name}</SummaryItemName>\n <SummaryItemSubtext>\n {formatMoney(category.revenue, category.currencyCode)}\n </SummaryItemSubtext>\n </SummaryItemInfo>\n <SummaryItemPercentage>{category.percentage}%</SummaryItemPercentage>\n </MobileCategoryCard>\n ))}\n </MobileCategoriesContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedCategories.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled, ColorUtils } from '@nuskin/foundation-theme';\nimport { styled as muiStyled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SummaryItemRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const SummaryItemInfo = styled('div')`\n flex: 1;\n`;\n\nexport const SummaryItemName = styled('span')`\n font-weight: 600;\n`;\n\nexport const SummaryItemSubtext = styled('span')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryItemPercentage = styled('span')`\n font-weight: 600;\n`;\n\nexport const TopSection = muiStyled(Box)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`;\n\nexport const ChartWrapper = muiStyled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = muiStyled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = muiStyled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = muiStyled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = muiStyled(Typography)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const SummaryContainer = muiStyled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`;\n\nexport const SummaryItem = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = muiStyled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = muiStyled(Box)`\n display: none;\n`;\n\nexport const SummaryName = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nexport const SummaryValue = muiStyled(Typography)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`;\n\nexport const SummaryPercentage = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DesktopTableContainer = muiStyled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileCategoriesContainer = muiStyled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileCategoryCard = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const SummaryTrendIcon = muiStyled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const CategoryNameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React from 'react';\nimport {\n resolveTranslation,\n setTranslationResolver,\n type TranslateFn,\n type TranslationEntry,\n} from './TranslationKeys/translationResolver';\n\nexport function useTranslationResolver(translate?: TranslateFn): void {\n setTranslationResolver(translate);\n\n React.useEffect(() => {\n setTranslationResolver(translate);\n return () => {\n setTranslationResolver(undefined);\n };\n }, [translate]);\n}\n\nexport interface TranslationProviderProps {\n readonly translate?: TranslateFn;\n readonly children?: React.ReactNode;\n}\n\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({ translate, children }) => {\n useTranslationResolver(translate);\n return children ?? null;\n};\n\nexport function useTranslation(): (entry: TranslationEntry) => string {\n return React.useCallback((entry: TranslationEntry) => resolveTranslation(entry), []);\n}\n\nexport type { TranslateFn, TranslationEntry };\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PoDashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TopChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const StatsCardStack = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`;\n\nexport const BottomChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendPercentage,\n LegendTrend,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from '../TopCategories/TopCategoriesPieChart.styled';\nimport type { TopPerformingOffer, OfferSortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { getTrendIcon, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\n\nexport interface TopPerformingOffersPieChartProps {\n readonly offers: TopPerformingOffer[];\n readonly offerSort: OfferSortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\n onSortChange,\n onTitleClick,\n}) => {\n const handleSortChange = React.useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value as OfferSortOption;\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedOffers, totalRevenue, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [offers, offerSort]);\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading && offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topPerformingOffers.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"top-offers-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topPerformingOffers.emptyState)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-offers\"\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n data-testid=\"widget-title-top-offers\"\n >\n {title ?? getTranslation(Keys.widget.topPerformingOffers.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"offer-sort\"\n data-testid=\"offer-sort-dropdown\"\n value={offerSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <option value=\"revenue\">{getTranslation(Keys.filter.offerSort.byRevenue)}</option>\n <option value=\"units\">{getTranslation(Keys.filter.offerSort.byUnits)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-offers\" onFullView={onTitleClick} />\n </HeaderActionsContainer>\n </ChartHeader>\n\n <ChartAndLegendContainer>\n <ChartWrapper data-testid=\"top-offers-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"55%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>{formattedTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"top-offers-legend-container\">\n {sortedOffers.map((offer, index) => {\n const legendTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{offer.name}</LegendName>\n <LegendValue>{formatMoney(offer.revenue, offer.currencyCode)}</LegendValue>\n </LegendInfo>\n <LegendPercentage>{offer.percentage}%</LegendPercentage>\n {offer.trend?.revenue ? (\n <LegendTrend\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={offer.trend.revenue}\n >\n {getTrendIcon(legendTrendDirection)}\n </LegendTrend>\n ) : null}\n </LegendItem>\n );\n })}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopPerformingOffersPieChart = React.memo(TopPerformingOffersPieChartComponent);\nTopPerformingOffersPieChart.displayName = 'TopPerformingOffersPieChart';\n","import { resolveTranslation } from './translationResolver';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport const ProductOfferDashboardTranslationKeys = {\n title: { key: 'productOfferDashboard.title', fallback: 'Performance Overview' },\n error: { key: 'productOfferDashboard.error', fallback: 'Failed to load dashboard data. Please try again.' },\n\n stats: {\n revenue: { key: 'productOfferDashboard.stats.revenue', fallback: 'Total Revenue' },\n offersPurchased: { key: 'productOfferDashboard.stats.offersPurchased', fallback: 'Offers Purchased' },\n conversionRate: { key: 'productOfferDashboard.stats.conversionRate', fallback: 'Conversion Rate' },\n trendUp: { key: 'productOfferDashboard.stats.trendUp', fallback: 'Trending up' },\n trendDown: { key: 'productOfferDashboard.stats.trendDown', fallback: 'Trending down' },\n trendNeutral: { key: 'productOfferDashboard.stats.trendNeutral', fallback: 'No change' },\n comparedTo: { key: 'productOfferDashboard.stats.comparedTo', fallback: 'compared to this time last month' },\n },\n\n filter: {\n dateRange: {\n label: { key: 'productOfferDashboard.filter.dateRange.label', fallback: 'Date Range' },\n last7days: { key: 'productOfferDashboard.filter.dateRange.last7days', fallback: 'Last 7 Days' },\n last30days: { key: 'productOfferDashboard.filter.dateRange.last30days', fallback: 'Last 30 Days' },\n last90days: { key: 'productOfferDashboard.filter.dateRange.last90days', fallback: 'Last 90 Days' },\n thisMonth: { key: 'productOfferDashboard.filter.dateRange.thisMonth', fallback: 'This Month' },\n },\n market: {\n label: { key: 'productOfferDashboard.filter.market.label', fallback: 'Market' },\n all: { key: 'productOfferDashboard.filter.market.all', fallback: 'All Markets' },\n },\n offerSort: {\n byRevenue: { key: 'productOfferDashboard.filter.offerSort.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.filter.offerSort.byUnits', fallback: 'Units' },\n },\n productSort: {\n byUnits: { key: 'productOfferDashboard.filter.productSort.byUnits', fallback: 'Units' },\n byRevenue: { key: 'productOfferDashboard.filter.productSort.byRevenue', fallback: 'Revenue' },\n byVolume: { key: 'productOfferDashboard.filter.productSort.byVolume', fallback: 'Volume' },\n },\n conversionFilter: {\n overall: { key: 'productOfferDashboard.filter.conversionFilter.overall', fallback: 'Overall' },\n },\n },\n\n widget: {\n topProducts: {\n title: { key: 'productOfferDashboard.widget.topProducts.title', fallback: 'Top Selling Products' },\n emptyState: {\n key: 'productOfferDashboard.widget.topProducts.emptyState',\n fallback: 'No products data available',\n },\n },\n conversionRate: {\n title: { key: 'productOfferDashboard.widget.conversionRate.title', fallback: 'Conversion Rate' },\n subtitle: { key: 'productOfferDashboard.widget.conversionRate.subtitle', fallback: 'Orders ÷ Site visits' },\n },\n topPerformingOffers: {\n title: { key: 'productOfferDashboard.widget.topPerformingOffers.title', fallback: 'Top Performing Offers' },\n totalRevenue: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalRevenue',\n fallback: 'Total revenue',\n },\n emptyState: {\n key: 'productOfferDashboard.widget.topPerformingOffers.emptyState',\n fallback: 'No offers data available',\n },\n },\n menu: {\n fullView: { key: 'productOfferDashboard.widget.menu.fullView', fallback: 'Full View' },\n },\n },\n\n navigation: {\n back: { key: 'productOfferDashboard.navigation.back', fallback: 'Back to Dashboard' },\n },\n\n ariaLabel: {\n dashboard: {\n key: 'productOfferDashboard.ariaLabel.dashboard',\n fallback: 'Product Offer Performance Dashboard',\n },\n statsCard: { key: 'productOfferDashboard.ariaLabel.statsCard', fallback: 'Performance metric' },\n conversionChart: { key: 'productOfferDashboard.ariaLabel.conversionChart', fallback: 'Conversion rate chart' },\n topProducts: { key: 'productOfferDashboard.ariaLabel.topProducts', fallback: 'Top selling products' },\n topOffers: { key: 'productOfferDashboard.ariaLabel.topOffers', fallback: 'Top performing offers chart' },\n widgetMenu: { key: 'productOfferDashboard.ariaLabel.widgetMenu', fallback: 'Widget options menu' },\n filterDateRange: { key: 'productOfferDashboard.ariaLabel.filterDateRange', fallback: 'Filter by date range' },\n filterMarket: { key: 'productOfferDashboard.ariaLabel.filterMarket', fallback: 'Filter by market' },\n backButton: { key: 'productOfferDashboard.ariaLabel.backButton', fallback: 'Back to dashboard overview' },\n },\n\n fullView: {\n topOffers: {\n title: { key: 'productOfferDashboard.fullView.topOffers.title', fallback: 'Top Performing Offers' },\n columnName: { key: 'productOfferDashboard.fullView.topOffers.columnName', fallback: 'Offer Name' },\n columnRevenue: { key: 'productOfferDashboard.fullView.topOffers.columnRevenue', fallback: 'Revenue' },\n columnPercentage: { key: 'productOfferDashboard.fullView.topOffers.columnPercentage', fallback: 'Share' },\n columnTrend: { key: 'productOfferDashboard.fullView.topOffers.columnTrend', fallback: 'Trend' },\n },\n },\n\n defaults: {\n trendZero: { key: 'productOfferDashboard.defaults.trendZero', fallback: '+0%' },\n noData: { key: 'productOfferDashboard.defaults.noData', fallback: '--' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport {\n PoDashboardContainer,\n TopChartsRow,\n StatsCardStack,\n BottomChartsRow,\n ErrorContainer,\n} from './ProductOfferDashboard.styled';\nimport { DashboardHeader } from './shared/DashboardHeader';\nimport { StatsCard } from './shared/StatsCard';\nimport { TopSellingProductsList } from './shared/TopProducts/TopSellingProductsList';\nimport { ConversionRateChart } from './shared/ConversionRate/ConversionRateChart';\nimport { TopPerformingOffersPieChart } from './shared/TopPerformingOffers/TopPerformingOffersPieChart';\nimport type { ProductOfferDashboardProps, TopProduct, ConversionDataPoint, TopPerformingOffer } from './types.d';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ProductOfferDashboardTranslationKeys';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_TOP_OFFERS: TopPerformingOffer[] = [];\n\nexport const ProductOfferDashboard: React.FC<ProductOfferDashboardProps> = ({\n stats,\n topProducts,\n conversionData,\n topOffers,\n isLoading = false,\n error,\n dashboardTitle,\n className,\n dateRange = 'last30days',\n market = 'all',\n productSort = 'units',\n conversionFilter = 'all',\n offerSort = 'revenue',\n conversionSummaryRate,\n conversionSummaryChangePct,\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onConversionFilterChange,\n onOfferSortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onOffersTitleClick,\n}) => {\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n\n const getTrendDirection = (trendValue?: string): 'up' | 'down' | 'neutral' => {\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+') && trendValue !== '+0%') return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n if (error) {\n return (\n <PoDashboardContainer as=\"main\" className={className} aria-label={getTranslation(Keys.ariaLabel.dashboard)}>\n <ErrorContainer data-testid=\"dashboard-error\" role=\"alert\" aria-live=\"assertive\">\n <strong>{getTranslation(Keys.error)}:</strong> {error}\n </ErrorContainer>\n </PoDashboardContainer>\n );\n }\n\n return (\n <PoDashboardContainer\n as=\"main\"\n className={className}\n data-testid=\"product-offer-dashboard\"\n aria-label={getTranslation(Keys.ariaLabel.dashboard)}\n aria-busy={isLoading}\n >\n <DashboardHeader\n shopTitle={dashboardTitle ?? getTranslation(Keys.title)}\n dateRange={dateRange}\n market={market}\n isLoading={isLoading}\n markets={markets}\n stats={\n stats\n ? {\n shopTitle: stats.shopTitle ?? '',\n dateRange: stats.dateRange,\n selectedMarket: stats.selectedMarket,\n metrics: {\n revenue: stats.metrics.revenue,\n volume: '',\n siteVisits: '',\n conversionRate: stats.metrics.conversionRate,\n },\n trend: {},\n }\n : undefined\n }\n onDateRangeChange={onDateRangeChange}\n onMarketChange={onMarketChange}\n />\n\n <TopChartsRow data-testid=\"top-charts-row\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n isLoading={isLoading}\n summaryRate={conversionSummaryRate}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n />\n <StatsCardStack data-testid=\"stats-card-stack\">\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.offersPurchased)}\n value={stats?.metrics?.offersPurchased ?? '0'}\n trendDirection={getTrendDirection(stats?.trend?.offersPurchased)}\n trendValue={stats?.trend?.offersPurchased}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-offers-purchased\"\n isLoading={isLoading}\n />\n </StatsCardStack>\n </TopChartsRow>\n\n <BottomChartsRow data-testid=\"bottom-charts-row\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\n onSortChange={onOfferSortChange}\n onTitleClick={onOffersTitleClick}\n />\n </BottomChartsRow>\n </PoDashboardContainer>\n );\n};\n\nexport default ProductOfferDashboard;\n","import React from 'react';\nimport { ProductOfferDashboard } from './ProductOfferDashboard';\nimport { ProductsFullView } from './shared/TopProducts/ProductsFullView';\nimport { ConversionRateFullView } from './shared/ConversionRate/ConversionRateFullView';\nimport { TopPerformingOffersFullView } from './shared/TopPerformingOffers/TopPerformingOffersFullView';\nimport { useTranslationResolver } from './TranslationContext';\nimport type {\n TopProduct,\n ConversionDataPoint,\n TopPerformingOffer,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n ProductSortOption,\n ConversionFilterOption,\n OfferSortOption,\n ProductOfferFullViewWidgetType,\n ProductOfferDashboardView,\n PoDashboardWithNavigationProps,\n ProductOfferDashboardHistoryLocation,\n} from './types.d';\n\ntype ViewMode = 'push' | 'replace';\n\nconst DEFAULT_HISTORY_STATE_KEY = 'productOfferDashboardView';\n\nconst EMPTY_TOP_PRODUCTS: TopProduct[] = [];\nconst EMPTY_CONVERSION_DATA: ConversionDataPoint[] = [];\nconst EMPTY_TOP_OFFERS: TopPerformingOffer[] = [];\nconst EMPTY_ORDERS: OrderHistory[] = [];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isProductOfferDashboardView(value: unknown): value is ProductOfferDashboardView {\n return value === 'dashboard' || value === 'products' || value === 'conversion-rate' || value === 'top-offers';\n}\n\nfunction readViewFromState(state: unknown, stateKey: string): ProductOfferDashboardView {\n if (!isRecord(state)) {\n return 'dashboard';\n }\n\n const view = state[stateKey];\n return isProductOfferDashboardView(view) ? view : 'dashboard';\n}\n\nfunction buildStateWithView(\n state: unknown,\n stateKey: string,\n view: ProductOfferDashboardView,\n): Record<string, unknown> {\n const currentState = isRecord(state) ? state : {};\n\n return {\n ...currentState,\n [stateKey]: view,\n };\n}\n\nfunction buildLocationWithState(\n location: ProductOfferDashboardHistoryLocation | undefined,\n state: Record<string, unknown>,\n): ProductOfferDashboardHistoryLocation {\n return {\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n state,\n };\n}\n\nexport const PoDashboardWithNavigation: React.FC<PoDashboardWithNavigationProps> = ({\n stats,\n topProducts,\n conversionData,\n topOffers,\n isLoading = false,\n error,\n dashboardTitle,\n className,\n allProducts,\n orders,\n allOffers,\n conversionSummaryRate,\n conversionSummaryChangePct,\n conversionFullViewData,\n conversionFullViewRate,\n conversionFullViewChangePct,\n initialDateRange = 'last30days',\n initialMarket = 'all',\n initialProductSort = 'units',\n initialConversionFilter = 'all',\n initialOfferSort = 'revenue',\n markets,\n translate,\n historyAdapter,\n historyStateKey = DEFAULT_HISTORY_STATE_KEY,\n resetToDashboardOnMount = true,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onConversionFilterChange,\n onOfferSortChange,\n onViewChange,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<ProductOfferDashboardView>('dashboard');\n const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [offerSort, setOfferSort] = React.useState<OfferSortOption>(initialOfferSort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n const resolvedAllProducts = allProducts ?? resolvedTopProducts;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedAllOffers = allOffers ?? resolvedTopOffers;\n\n const updateView = React.useCallback(\n (view: ProductOfferDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): ProductOfferDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: ProductOfferDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: ProductOfferFullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleOfferSortChange = React.useCallback(\n (nextSort: OfferSortOption) => {\n setOfferSort(nextSort);\n onOfferSortChange?.(nextSort);\n },\n [onOfferSortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleOffersTitleClick = React.useCallback(() => {\n handleOpenFullView('top-offers');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedAllProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={conversionFullViewData ?? resolvedConversionData}\n orders={resolvedOrders}\n summaryRate={conversionFullViewRate ?? conversionSummaryRate}\n summaryChangePct={conversionFullViewChangePct ?? conversionSummaryChangePct}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'top-offers') {\n return (\n <TopPerformingOffersFullView\n offers={resolvedAllOffers}\n dateRange={dateRange}\n market={market}\n offerSort={offerSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onOfferSortChange={handleOfferSortChange}\n />\n );\n }\n\n return (\n <ProductOfferDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n topOffers={resolvedTopOffers}\n isLoading={isLoading}\n error={error}\n dashboardTitle={dashboardTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n conversionFilter={conversionFilter}\n offerSort={offerSort}\n conversionSummaryRate={conversionSummaryRate}\n conversionSummaryChangePct={conversionSummaryChangePct}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onConversionFilterChange={handleConversionFilterChange}\n onOfferSortChange={handleOfferSortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onOffersTitleClick={handleOffersTitleClick}\n />\n );\n};\n\nexport default PoDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n TopPerformingOffer,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n OfferSortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { SummaryItemRow } from '../TopCategories/CategoriesFullView.styled';\nimport {\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryInfo,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrend,\n TableTrendCell,\n DesktopTableContainer,\n MobileOffersContainer,\n MobileOfferCard,\n MobileOfferHeader,\n MobileOfferName,\n MobileOfferMetricsGrid,\n MobileOfferMetricItem,\n MobileOfferMetricLabel,\n MobileOfferMetricValue,\n MobileOfferTrendValue,\n} from './TopPerformingOffersFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport {\n getTrendIcon,\n parseTrendPercent,\n resolveTrendDirection,\n calculateWeightedRevenueTrend,\n} from '../../utils/trendUtils';\n\nexport interface TopPerformingOffersFullViewProps {\n readonly offers: TopPerformingOffer[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly offerSort: OfferSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onOfferSortChange?: (sort: OfferSortOption) => void;\n}\n\nexport const TopPerformingOffersFullView: React.FC<TopPerformingOffersFullViewProps> = ({\n offers,\n dateRange,\n market,\n offerSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onOfferSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.filter.offerSort.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.filter.offerSort.byRevenue) },\n { value: 'units', label: getTranslation(Keys.filter.offerSort.byUnits) },\n ],\n },\n ],\n [dateRange, market, marketOptions, offerSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onOfferSortChange?.(value as OfferSortOption);\n setCurrentPage(1);\n }\n },\n [onOfferSortChange, onDateRangeChange, onMarketChange],\n );\n\n const sortedOffers = React.useMemo(\n () =>\n [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers]);\n\n const topOffers = React.useMemo(() => sortedOffers.slice(0, 5), [sortedOffers]);\n\n const { totalPages, pageItems: paginatedOffers } = usePaginatedItems(sortedOffers, currentPage, itemsPerPage);\n\n const columns: ColumnDef<TopPerformingOffer>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.topOffers.columnName),\n sortable: true,\n render: (_: unknown, row: TopPerformingOffer) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <span>{row.name}</span>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.topOffers.columnRevenue),\n sortable: true,\n render: (value: unknown, row: TopPerformingOffer) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.topOffers.columnPercentage),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.topOffers.columnTrend),\n render: (_: unknown, row: TopPerformingOffer) => {\n if (!row.trend?.revenue) return getTranslation(Keys.defaults.noData);\n const columnTrendDirection = resolveTrendDirection(row.trend.revenue);\n return (\n <TableTrendCell direction={columnTrendDirection}>\n {getTrendIcon(columnTrendDirection)}\n <span>{row.trend.revenue}</span>\n </TableTrendCell>\n );\n },\n },\n ],\n [],\n );\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"top-offers-fullview-empty\">\n {getTranslation(Keys.widget.topPerformingOffers.emptyState)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"top-offers-fullview-top-section\">\n <ChartWrapper data-testid=\"top-offers-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>{totalRevenueTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"top-offers-fullview-summary\">\n {topOffers.map((offer) => {\n const summaryTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>{formatMoney(offer.revenue, offer.currencyCode)}</SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{offer.percentage}%</SummaryPercentage>\n {offer.trend?.revenue ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={offer.trend.revenue}>\n {getTrendIcon(summaryTrendDirection)}\n </SummaryTrend>\n ) : null}\n </SummaryItem>\n );\n })}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"top-offers-table\">\n <ChartTitle data-testid=\"top-offers-fullview-table-title\">\n {getTranslation(Keys.fullView.topOffers.title)} ({sortedOffers.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedOffers}\n sortable\n getRowKey={(row: TopPerformingOffer) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOffersContainer>\n {paginatedOffers.map((offer) => {\n const trendPercent = parseTrendPercent(offer.trend?.revenue);\n let trendDirection: 'up' | 'down' | 'neutral' = 'neutral';\n if (trendPercent !== null && trendPercent > 0) trendDirection = 'up';\n else if (trendPercent !== null && trendPercent < 0) trendDirection = 'down';\n\n return (\n <MobileOfferCard key={offer.id}>\n <MobileOfferHeader>\n <ColorDot dotColor={offer.color} />\n <MobileOfferName>{offer.name}</MobileOfferName>\n </MobileOfferHeader>\n <MobileOfferMetricsGrid>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnRevenue)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {formatMoney(offer.revenue, offer.currencyCode)}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnPercentage)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>{offer.percentage}%</MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnTrend)}\n </MobileOfferMetricLabel>\n <MobileOfferTrendValue direction={trendDirection}>\n {offer.trend?.revenue ? (\n <>\n {getTrendIcon(trendDirection)}\n <span>{offer.trend.revenue}</span>\n </>\n ) : (\n getTranslation(Keys.defaults.noData)\n )}\n </MobileOfferTrendValue>\n </MobileOfferMetricItem>\n </MobileOfferMetricsGrid>\n </MobileOfferCard>\n );\n })}\n </MobileOffersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedOffers.length}\n data-testid=\"top-offers-pagination\"\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport type { TrendDirection } from '../types';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TopSection = styled(Box)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const ChartWrapper = styled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = styled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = styled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = styled(Typography)<{ direction: TrendDirection }>`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n`;\n\nexport const SummaryContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`;\n\nexport const SummaryItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = styled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const SummaryName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const SummaryValue = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryPercentage = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`;\n\nexport const SummaryTrend = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const TableTrendCell = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileOffersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileOfferCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileOfferHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const MobileOfferName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n word-break: break-word;\n`;\n\nexport const MobileOfferMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileOfferMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileOfferMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileOfferMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const MobileOfferTrendValue = styled(Typography)<{ direction: TrendDirection }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const FilterContainer = styled('div')`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`;\n\nexport const FilterLabel = styled('label')`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport { FilterContainer, FilterDropdown, FilterLabel } from './FilterBar.styled';\nimport type { FilterConfig } from './types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface FilterBarProps {\n readonly filters: FilterConfig[];\n readonly onChange: (filterKey: string, value: string) => void;\n}\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ filters, onChange }) => {\n return (\n <FilterContainer data-testid=\"filter-bar\">\n {filters.map((filter) => (\n <FilterLabel key={filter.key} htmlFor={`filter-${filter.key}`}>\n {filter.label}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterLabel>\n ))}\n </FilterContainer>\n );\n};\n","import type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n} from '../types.d';\n\nexport const mockStats: DashboardStats = {\n shopTitle: 'My NuSkin Shop',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$9,453',\n volume: '1,211',\n siteVisits: '17,935',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+12.5%',\n volume: '+8.3%',\n siteVisits: '-2.1%',\n },\n};\n\nexport const mockTopProducts: TopProduct[] = [\n {\n id: 'prod-001',\n rank: 1,\n name: 'ageLOC LumiSpa',\n imageUrl: '',\n unitsSold: 342,\n revenue: 29580,\n volume: 245,\n trend: { units: '+15%', revenue: '+12%', volume: '+8%' },\n },\n {\n id: 'prod-002',\n rank: 2,\n name: 'Pharmanex LifePak',\n imageUrl: '',\n unitsSold: 287,\n revenue: 24395,\n volume: 198,\n trend: { units: '+8%', revenue: '+10%', volume: '+5%' },\n },\n {\n id: 'prod-003',\n rank: 3,\n name: 'ageLOC Meta',\n imageUrl: '',\n unitsSold: 256,\n revenue: 21760,\n volume: 176,\n trend: { units: '-3%', revenue: '-1%', volume: '-2%' },\n },\n {\n id: 'prod-004',\n rank: 4,\n name: 'Nu Skin 180 System',\n imageUrl: '',\n unitsSold: 198,\n revenue: 17820,\n volume: 142,\n trend: { units: '+22%', revenue: '+18%', volume: '+15%' },\n },\n {\n id: 'prod-005',\n rank: 5,\n name: 'Epoch Baobab Body Butter',\n imageUrl: '',\n unitsSold: 176,\n revenue: 8800,\n volume: 88,\n trend: { units: '+5%', revenue: '+3%', volume: '+2%' },\n },\n];\n\nexport const mockConversionData: ConversionDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n rate: Number((4 + (i % 15) * 0.1).toFixed(2)),\n orders: 200 + ((i * 13) % 100),\n siteVisits: 4000 + ((i * 97) % 2000),\n };\n});\n\nexport const mockConversionDataStandard: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n}));\n\nexport const mockConversionDataSubscription: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n}));\n\nexport const mockSignupData: SignupDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const total = 80 + ((i * 11) % 40);\n const members = Math.floor(total * 0.4);\n const retail = Math.floor(total * 0.35);\n const brandAffiliates = total - members - retail;\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n total,\n members,\n retail,\n brandAffiliates,\n };\n});\n\nexport const mockCategories: CategoryRevenue[] = [\n {\n id: 'cat-001',\n name: 'Favorites',\n revenue: 45200,\n percentage: 29,\n color: '#C95D63',\n trend: { revenue: '+8%', units: '+10%' },\n },\n {\n id: 'cat-002',\n name: 'Daily Routine',\n revenue: 42100,\n percentage: 27,\n color: '#6C7A9B',\n trend: { revenue: '+12%', units: '+15%' },\n },\n {\n id: 'cat-003',\n name: 'Fit & Trim Body',\n revenue: 34300,\n percentage: 22,\n color: '#E8975E',\n trend: { revenue: '-3%', units: '-1%' },\n },\n {\n id: 'cat-004',\n name: 'Dull Skin',\n revenue: 24900,\n percentage: 16,\n color: '#5F8FC4',\n trend: { revenue: '+5%', units: '+7%' },\n },\n {\n id: 'cat-005',\n name: 'Acne',\n revenue: 9400,\n percentage: 6,\n color: '#A2C3B3',\n trend: { revenue: '+2%', units: '+3%' },\n },\n];\n\nexport const mockOrders: OrderHistory[] = Array.from({ length: 50 }, (_, i) => {\n const firstNames = ['Sarah', 'John', 'Emma', 'Michael', 'Olivia', 'William', 'Ava', 'James'];\n const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n orderId: `ORD-${String(10000 + i).padStart(5, '0')}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n customerName: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n customerType: i % 3 === 0 ? 'Subscription' : 'Standard',\n items: (i % 5) + 1,\n total: Number((50 + ((i * 17) % 200) + (i % 10) * 0.1).toFixed(2)),\n bv: 30 + ((i * 9) % 150),\n };\n});\n\nexport const mockSignupDetails: SignupDetail[] = Array.from({ length: 30 }, (_, i) => {\n const firstNames = ['Alice', 'Bob', 'Carol', 'David', 'Eva', 'Frank', 'Grace', 'Henry'];\n const lastNames = ['Anderson', 'Baker', 'Clark', 'Davis', 'Evans', 'Fisher', 'Grant', 'Hall'];\n const types: ('Member' | 'Retail' | 'Brand Affiliate')[] = ['Member', 'Retail', 'Brand Affiliate'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n id: `SU-${String(1000 + i).padStart(4, '0')}`,\n name: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n type: types[i % types.length],\n email: `${firstNames[i % firstNames.length].toLowerCase()}.${lastNames[i % lastNames.length].toLowerCase()}@example.com`,\n status: i % 4 === 0 ? 'Pending' : 'Active',\n };\n});\n","import type { ProductOfferDashboardStats, TopPerformingOffer } from '../types.d';\n\nexport { mockTopProducts, mockConversionData, mockOrders } from './mockDashboardData';\n\nexport const mockProductOfferStats: ProductOfferDashboardStats = {\n shopTitle: 'Performance Overview',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$5,208',\n offersPurchased: '285',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+2.3%',\n offersPurchased: '+3.7%',\n },\n};\n\nexport const mockProductOfferStatsPositiveTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+5.1%',\n offersPurchased: '+12.5%',\n },\n};\n\nexport const mockProductOfferStatsNegativeTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '-1.8%',\n offersPurchased: '-3.7%',\n },\n};\n\nexport const mockProductOfferStatsNeutralTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockProductOfferStatsZeroOffers: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n metrics: {\n ...mockProductOfferStats.metrics,\n offersPurchased: '0',\n },\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockTopOffers: TopPerformingOffer[] = [\n {\n id: 'offer-1',\n name: 'Winter Skincare Bundle',\n revenue: 2800,\n percentage: 29,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n percentage: 27,\n color: '#E8915A',\n trend: { revenue: '+3.1%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n percentage: 22,\n color: '#C75B5B',\n trend: { revenue: '-1.5%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n percentage: 16,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n percentage: 6,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%' },\n },\n];\n"]}
|