@nuskin/react-mysite-elements 1.6.0-ui-fixes.1 → 1.6.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.
@@ -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/utils/comparisonTextUtils.ts","../src/common/shopping-dashboard/utils/conversionFilter.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/utils/conversionSeries.ts","../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/hooks/useScrollToTopOnViewChange.ts","../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/hooks/useProductOfferWidgetExports.ts","../src/common/shopping-dashboard/utils/excelExport.ts","../src/common/shopping-dashboard/utils/productOfferExport.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":["qp","Object","create","On","defineProperty","Qp","getOwnPropertyDescriptor","ec","getOwnPropertyNames","tc","getPrototypeOf","oc","prototype","hasOwnProperty","La","e","t","exports","rc","o","n","i","call","get","enumerable","ac","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","ei","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","ai","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","ii","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","xr","NsCategoryNavigation","itemArray","controlledValue","onChange","si","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","CalendarMonthIcon","LanguageIcon","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","visits","trend","increased","decreased","unchanged","details","filter","dateRange","last7days","last30days","last90days","thisMonth","market","all","productSort","signupView","showAll","showMembers","showRetail","showBrandAffiliates","conversionType","retail","member","widget","topProducts","viewAll","empty","ariaLabel","titleAriaLabel","sortAriaLabel","noImageAriaLabel","unitsSuffix","revenueSuffix","rank","conversionRate","formula","comparison","chartAriaLabel","filterAriaLabel","tooltipOrders","tooltipVisits","ordersPerSiteVisits","signups","total","totalSignupsInPeriod","noTrendData","compareTo","topCategories","menu","fullView","viewDetails","exportData","navigation","backToDashboard","backAriaLabel","dashboard","statsRow","dashboardFilters","loadingDashboard","dateRangeFilter","marketFilter","filterSuffix","columns","status","detailsTitle","orderId","customer","items","bv","totalSv","orderDetailsTitle","notAvailable","product","unitsSold","volume","skuPrefix","noProducts","category","percentOfTotal","allCategoriesTitle","noCategoryData","dataTable","noDataAvailable","sortableColumn","pagination","previousPage","nextPage","goToPage","of","defaults","zeroTrend","noValue","noData","noChange","byRevenue","byUnits","byVolume","byTrend","members","brandAffiliates","units","date","dcSv","getTranslation","buildDefaultMarketOptions","resolveMarketOptions","markets","useMarketOptions","DashboardHeader","dateRangeLabel","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","subtitle","caption","layout","trendDirection","trendValue","getTrendAriaLabel","directionText","getTrendChartIcon","iconSize","StatsCard","memo","displayName","ShoppingCartIcon","parseTrendPercent","cleanedValue","parsedValue","isFinite","resolveTrendDirection","calculateWeightedRevenueTrend","getRevenue","getTrend","reduce","accumulator","weightedSum","weight","average","formatted","toFixed","getTrendDirectionLabel","getTrendIcon","getTrendColor","renderPieChartLabel","options","cx","cy","midAngle","innerRadius","outerRadius","percentage","RADIAN","PI","radius","x","cos","y","sin","textAnchor","dominantBaseline","calculateTotalPages","itemsPerPage","ceil","paginateItems","currentPage","startIndex","endIndex","sortByNumericProperty","sort","a","aVal","bVal","calculatePercentage","decimalPlaces","usePaginatedItems","totalPages","pageItems","getLocaleFromMarketCode","marketCode","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","currencyDisplay","minimumFractionDigits","maximumFractionDigits","format","capitalizeFirstLetter","text","charAt","toUpperCase","getSignupValueByView","dataPoint","view","ProductsListContainer","WidgetHeader","HeaderActionsContainer","WidgetTitle","SortDropdown","ProductsList","ProductItem","ProductRank","ProductImage","ProductImagePlaceholder","ProductInfo","ProductName","ProductSubtitle","ProductMetrics","ProductValue","ProductTrend","EmptyState","EmptyStateText","Menu","MenuItem","ListItemIcon","ListItemText","MoreVertIcon","VisibilityIcon","FileDownloadIcon","IconButton","StyledIconButton","WidgetMenu","widgetId","onFullView","onExport","anchorEl","setAnchorEl","buttonId","menuId","handleClick","currentTarget","handleClose","handleFullView","handleExport","size","onClose","MenuListProps","anchorOrigin","vertical","horizontal","transformOrigin","TopSellingProductsListComponent","maxProducts","onSortChange","onTitleClick","handleSortChange","newSort","formatValue","sortBy","toLocaleString","getSubtitle","getTrendValue","getTrendDirection","displayedProducts","rankLabel","trendLabel","imageUrl","TopSellingProductsList","LineChart","Line","XAxis","YAxis","CartesianGrid","ResponsiveContainer","ConversionRateContainer","ChartHeader","TitleRow","ChartTitle","FilterDropdown","MetricDisplay","MetricValue","MetricTrend","FormulaDisplay","ChartContainer","TooltipContainer","TooltipLabel","TooltipValue","TooltipDetails","DEFAULT_DATE_RANGE","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","getComparedToText","keys","matchesConversionFilter","point","priceTypes","some","priceType","filterConversionData","conversionData","CHART_MARGIN","AXIS_TICK","HollowDot","fillOpacity","stroke","strokeWidth","ActiveHollowDot","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionFilter","summaryRate","summaryChangePct","onFilterChange","handleFilterChange","newFilter","noDataText","noChangeText","filteredData","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","dot","activeDot","ConversionRateChart","SignupsContainer","Legend","LegendItem","LegendColor","LegendLabel","SERIES_COLORS","dotComponentCache","Map","HollowDotFactory","strokeColor","has","set","SignupsChartComponent","signupData","onViewChange","handleViewChange","newView","totalSignups","lastDataPoint","latestValue","previousValue","totalLabel","membersLabel","retailLabel","brandAffiliatesLabel","SignupsChart","PieChart","Pie","Cell","KeyboardArrowDownIcon","CategoriesContainer","SortMenuButton","ChartAndLegendContainer","ChartWrapper","DonutCenterOverlay","DonutCenterLabel","DonutCenterValue","DonutCenterTrend","LegendContainer","LegendInfo","LegendName","LegendValue","LegendPercentage","LegendValueWrapper","LegendTrendInline","LegendTrend","TopCategoriesPieChartComponent","categorySort","sortedCategories","sortAnchorEl","setSortAnchorEl","isSortMenuOpen","handleSortButtonClick","handleSortMenuClose","handleSortSelect","nextSortedCategories","nextTotalRevenue","sum","nextTotalVolume","nextTrendDirection","nextFormattedTrend","totalRevenue","totalVolume","formattedTrend","getTrendGraphIcon","renderCustomLabel","selected","nameKey","paddingAngle","labelLine","formatter","displayValue","displayPercentage","volumeSharePct","displayTrend","TopCategoriesPieChart","EMPTY_TOP_PRODUCTS","EMPTY_CONVERSION_DATA","EMPTY_SIGNUP_DATA","EMPTY_CATEGORIES","ShoppingDashboard","categoriesSummaryChangePct","conversionSummaryChangePct","onProductSortChange","onSignupViewChange","onConversionFilterChange","onCategorySortChange","onProductsTitleClick","onConversionTitleClick","onSignupsTitleClick","onCategoriesToTitleClick","onProductsExport","onConversionExport","onSignupsExport","onCategoriesExport","resolvedTopProducts","resolvedConversionData","resolvedSignupData","resolvedCategories","startsWith","metrics","ArrowBackIcon","CalendarTodayIcon","PageHeaderWrapper","BackButtonWrapper","BackButton","LeftSection","Title","DateRange","MobileDateRange","FilterWrapper","$breakToNewLineOnMobile","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","buildMarketFilter","PageHeader","onBack","filters","renderFilterIcon","iconType","ArrowUpwardIcon","ArrowDownwardIcon","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","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","PRICE_TYPE_SERIES_PREFIX","PRICE_TYPE_COLORS","FALLBACK_COLORS","priceTypeSeriesKey","priceTypeColor","collectPriceTypes","forEach","ratesByPriceType","localeCompare","toSeriesPoint","series","MetricValueWithSpacing","ConversionTrendChartContainer","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ChartWithLegendWrapper","ChartLegendContainer","$color","ComparisonTextMobile","OrderIdColumnCell","TrendValueText","TrendComparisonText","MetricSectionWrapper","ConversionRateFullView","priceTypeTrend","orderColumnsVariant","priceTypeSeries","chartData","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","paginatedOrders","showTotalSvOnly","getChartColor","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","shouldForwardProp","prop","$legendColor","NameColumnCell","TrendAbsoluteChangeText","TrendPercentageChangeText","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","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","summaryValue","summaryPercentage","summaryTrend","useTranslationResolver","translate","TranslationProvider","useTranslation","scrollWindowToTop","scrollingElement","documentElement","scrollTop","useScrollToTopOnViewChange","previousViewRef","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","conversionPriceTypeTrend","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","INVALID_SHEET_NAME_CHARS","normalizeExcelFileName","fileName","trimmedFileName","resolvedFileName","endsWith","normalizeExcelSheetName","sheetName","normalizedSheetName","exportRowsToExcel","rows","Workbook","workbook","worksheet","buffer","addWorksheet","header","worksheetRow","addRow","xlsx","writeBuffer","downloadExcelBuffer","blob","Blob","Uint8Array","URL","createObjectURL","link","download","body","appendChild","click","removeChild","revokeObjectURL","topProductColumns","topOfferColumns","conversionOrderColumns","exportTopProducts","exportTopPerformingOffers","exportConversionRate","useProductOfferWidgetExports","topProductsExportData","topOffersExportData","conversionExportData","showTopProductsExportOption","showTopOffersExportOption","showConversionExportOption","offerRows","sourceOrderRows","orderRows","canExportProducts","canExportOffers","canExportConversion","onTopProductsExport","onTopOffersExport","EMPTY_TOP_OFFERS","ProductOfferDashboard","dashboardTitle","conversionSummaryRate","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","mockConversionDataRetail","mockConversionDataMember","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","customerType","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","bn","vo","nr","is","ns","Jo","dt","Tg","Li","Ia","Na","be","ct","ef","hr","ProductCarousel","Tn","$","Dc","rr","nn","Vr","hn","Mt","qr","Dn","ya","wo","ug","lt","Ui","pu","Sl","dr","vn","Cn","ss","Du","tn","on","ls","Ot","en","Su","Hc","su","Ke","Jp","Sa","Zp","Lo","Yp","Xp","Gp","lf","jp","xp","bp","Dl","Ki","Ue","vr","du","kn","mg","Oo"],"mappings":"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","sourcesContent":["var qp=Object.create;var On=Object.defineProperty;var Qp=Object.getOwnPropertyDescriptor;var ec=Object.getOwnPropertyNames;var tc=Object.getPrototypeOf,oc=Object.prototype.hasOwnProperty;var La=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var rc=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of ec(t))!oc.call(e,i)&&i!==o&&On(e,i,{get:()=>t[i],enumerable:!(n=Qp(t,i))||n.enumerable});return e};var ac=(e,t,o)=>(o=e!=null?qp(tc(e)):{},rc(t||!e||!e.__esModule?On(o,\"default\",{value:e,enumerable:!0}):o,e));var ei=La((Wf,Qn)=>{\"use strict\";var gc=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";Qn.exports=gc});var ai=La((_f,ri)=>{\"use strict\";var fc=ei();function ti(){}function oi(){}oi.resetWarningCache=ti;ri.exports=function(){function e(n,i,l,s,d,b){if(b!==fc){var g=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 g.name=\"Invariant Violation\",g}}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:oi,resetWarningCache:ti};return o.PropTypes=o,o}});var ii=La((Gf,ni)=>{\"use strict\";ni.exports=ai()();var Uf,Kf});import{useState as nc}from\"react\";import{NsImage as ic}from\"@nuskin/foundation-ui-components\";import{styled as Vt}from\"@nuskin/foundation-theme\";var Fn=Vt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,Ln=Vt(\"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`,$n=Vt(\"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`,Nn=Vt(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,In=Vt(\"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`,$a=Vt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,Vn=Vt(\"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`,En=Vt(\"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 lc}from\"@mui/material\";import{jsx as ht,jsxs as An}from\"react/jsx-runtime\";var sc=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:l,directSellerBadge:s,mySitePriceComponent:d,testId:b})=>{let[g,c]=nc(!1),f=lc(\"(max-width: 560px)\"),x=C=>{let S=C.target,h=t?.fallbackImage;h&&S.src!==h&&(S.src=h)};return An(Ln,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:f,children:[ht($n,{bgColor:t?.bgColor,onError:x,children:t?.imageSrc?ht(ic,{\"data-testid\":b??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):ht(Nn,{alt:\"\"})}),ht(In,{title:e,\"data-testid\":\"product-title\",children:e}),s&&ht($a,{children:s}),ht($a,{children:l}),ht(Fn,{children:d}),n?.showButton&&An(Vn,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:f,isHovered:g,onClick:C=>{C.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!f&&!n?.disabled&&c(!0)},onMouseLeave:()=>{f||c(!1)},children:[ht(En,{className:\"cart-icon\",disabled:n?.disabled,children:ht(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:ht(\"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\"]})]})},Na=sc;import{useCallback as qn,useRef as pc}from\"react\";import cc from\"react-slick\";import uc from\"@mui/material/useMediaQuery\";import{NsCarouselControl as mc}from\"@nuskin/foundation-ui-components\";import{styled as Ae}from\"@nuskin/foundation-theme\";import Ko from\"@mui/material/Box\";import{NsTypography as dc}from\"@nuskin/foundation-ui-components\";var zn=Ae(Ko)`\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=Ae(\"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`,Hn=Ae(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,Wn=Ae(Ko)`\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=Ae(Ko)`\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`,Un=Ae(Ko)`\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=Ae(Ko)`\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`,Pf=Ae(\"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`,Gn=Ae(dc)`\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`,jn=Ae(\"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`,Yn=Ae(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,Jn=Ae(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Zn=Ae(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,Xn=Ae(\"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 nt,jsxs as Go}from\"react/jsx-runtime\";function hr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:l=\"\",categoryName:s,emptyProductMessage:d=\"No Products Available For The Selected Category\",productsCountLabel:b=\"Products\",isInitialDataLoading:g,history:c}){let f=pc(null),x=uc(\"(max-width: 560px)\"),C=qn(()=>{f.current?.slickPrev()},[]),S=qn(()=>{f.current?.slickNext()},[]),h=t??((y,k)=>nt(Na,{productTitle:y.productTitle,imageDetails:y.imageDetails,button:y.button,onCardClick:y.onCardClick,productStatusBadge:y.productStatusBadge,directSellerBadge:y.directSeller,mySitePriceComponent:y.mySitePriceComponent},`${y.productTitle}-${k}`)),O={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},m=(e?.length??0)>O.slidesToShow,v=()=>e?.length===0&&!g?nt(Yn,{children:d}):x?nt(Bn,{children:nt(Hn,{children:e.map((y,k)=>y&&h(y,k))})}):nt(cc,{...O,ref:f,children:e.map((y,k)=>y&&h(y,k))});return Go(zn,{children:[n&&Go(Wn,{children:[Go(Jn,{children:[Go(Zn,{children:[nt(Un,{children:Go(Gn,{variant:\"body-m\",children:[e?.length??0,\" \",b]})}),!x&&s&&nt(Xn,{children:s})]}),nt(_n,{$isMobile:x,children:nt(jn,{$disabled:(e?.length??0)===0,onClick:y=>{y.preventDefault(),(e?.length??0)>0&&c&&c.push(l)},children:i})})]}),!x&&nt(Kn,{$isDisabled:!m,children:nt(mc,{prev:C,next:S,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),v()]})}import{useState as to,useEffect as Va,useCallback as vc}from\"react\";import{useMediaQuery as kc}from\"@mui/material\";var xr=ac(ii());import*as si from\"react\";import xc from\"@mui/material/Tabs\";import bc from\"@mui/material/Tab\";import di from\"@mui/material/Box\";import{styled as hc}from\"@nuskin/foundation-theme\";var li=hc.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 yc}from\"@mui/material\";import{jsx as ho,jsxs as wc}from\"react/jsx-runtime\";function pi(e){let{children:t,value:o,index:n,...i}=e;return ho(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&ho(di,{className:\"tabPanel\",children:t})})}pi.propTypes={children:xr.default.node,index:xr.default.number.isRequired,value:xr.default.number.isRequired};var Ia=({itemArray:e,value:t,onChange:o})=>{let[n,i]=si.useState(0),l=yc(\"(max-width:768px)\"),s=t??n;return ho(li,{children:wc(di,{className:\"tabContainer\",children:[ho(xc,{orientation:l?\"horizontal\":\"vertical\",variant:\"scrollable\",value:s,onChange:(b,g)=>{o?o(b,g):i(g)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(b=>ho(bc,{label:b.label,className:\"tabStyle\"},b.categoryId))}),e.map(b=>ho(pi,{value:s,index:e.findIndex(g=>g.categoryId===b.categoryId),children:b.content},b.categoryId))]})})};import{NsSpinner as Tc}from\"@nuskin/foundation-ui-components\";import{styled as xo}from\"@nuskin/foundation-theme\";var Cc=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",ci=xo(\"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: ${Cc};\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`,ui=xo(\"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`,mi=xo(\"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`,nh=xo(\"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`,gi=xo(\"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`,fi=xo(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as oo,jsxs as Pc}from\"react/jsx-runtime\";var Sc=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:l,fetchProducts:s,showCustomCategory:d=!1,emptyProductTabs:b=\"No tabs available\",emptyProductMessage:g,productsCountLabel:c,getCategoryId:f,history:x})=>{let C=kc(\"(max-width:768px)\"),[S,h]=to(!0),[O,m]=to([]),[v,y]=to(!1),[k,F]=to(0),[R,D]=to([]),[W,B]=to(!1),[L,M]=to(!0),u=vc(()=>{let w=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');M(w.length===0)},[]);Va(()=>{W&&u()},[W,u]),Va(()=>{l().then(w=>{m(w),y(!0)})},[l]),Va(()=>{if(v)if(O.length>0){let w=O[k]?.categoryId;f&&f(w),B(!0),s(w).then(D).finally(()=>{B(!1),h(!1)})}else B(!1)},[O,k,s,v]);let p=O.map(w=>({label:w.label,content:\"\",categoryId:w.categoryId}));return Pc(ci,{isMobile:C,$hasCategories:O.length>0,children:[d&&(p.length>0?oo(ui,{isMobile:C,children:oo(Ia,{itemArray:p,value:k,onChange:(w,G)=>F(G)})}):oo(gi,{children:b})),oo(mi,{isMobile:C,children:W?oo(fi,{children:L&&oo(Tc,{})}):oo(hr,{isInitialDataLoading:S,entries:R,allEntryLabel:e,allEntryLink:t,renderEntry:o?w=>o({...w,productStatusBadge:w.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:O[k]?.label,emptyProductMessage:g,productsCountLabel:c,history:x})})]})},Dc=Sc;import{useState as yr,useEffect as Ha,useMemo as Fc}from\"react\";import{Typography as Et,Box as At,useMediaQuery as Lc,Tooltip as $c}from\"@mui/material\";import{NsLink as Nc,NsImage as Oi}from\"@nuskin/foundation-ui-components\";import{styled as Dt}from\"@nuskin/foundation-theme\";import{Box as jo}from\"@mui/material\";import{jsx as Ba}from\"react/jsx-runtime\";var Ea=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),xi=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),bi=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),hi=e=>({...Ea(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\"}}),Rc=e=>({...xi(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\"}}),yi=Dt(e=>Ba(jo,{...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\":Ea(o),\".phone-text\":Ea(o),\".social-title-text\":{...xi(o),marginBottom:\"8px\"},\".social-icons\":{...bi(),paddingBottom:\"8px\"}})),wi=Dt(e=>Ba(jo,{...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\":hi(o),\".phone-text-mobile\":hi(o),\".social-title-text-mobile\":Rc(o),\".social-icons-mobile\":{...bi(),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\"}}})),Ci=Dt(jo)({display:\"flex\",gap:\"12px\",marginBottom:\"16px\",paddingLeft:\"5px\",\"&.mobile-badges\":{flexDirection:\"column\",gap:\"8px\",marginBottom:\"12px\"},\"&.tablet-badges\":{flexDirection:\"row\",gap:\"12px\",marginBottom:\"8px\"}}),Aa=Dt(e=>Ba(jo,{...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\"}})),vi=Dt(\"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)\"}}}),ki=Dt(jo)`\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=Dt(\"span\")`\n line-height: 0.5;\n`,Si=Dt(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),za=Dt(\"span\")({});import{Box as Mc}from\"@mui/material\";import{jsx as ro,jsxs as Oc}from\"react/jsx-runtime\";var Di=({width:e,height:t,backgroundColor:o})=>ro(Mc,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:ro(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:Oc(\"g\",{id:\"ns_logomark\",children:[ro(\"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\"}),ro(\"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\"}),ro(\"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\"}),ro(\"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\"}),ro(\"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 Pi}from\"react/jsx-runtime\";var Ri=({width:e=16,height:t=16,className:o=\"\"})=>Pi(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:Pi(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function br(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 $i,jsx as ae,jsxs as it}from\"react/jsx-runtime\";var Mi=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?ae(Ti,{tabIndex:0,children:ae(Oi,{className:o,src:e.imageSrc,alt:e.imageAlt})}):ae(At,{className:n,children:ae(Di,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},Fi=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let l=o?\"mobile-badge\":\"tablet-badge\";return it(Ci,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&ae(Aa,{className:`${l} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:ae(za,{className:\"badge-value\",children:i})}),t&&ae(Aa,{className:`${l} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:ae(za,{className:\"badge-value\",children:t})})]})},Ic=(e,t,o,n,i)=>{let{shopTitle:l,socialTitleText:s,email:d,showBadges:b,expirationDate:g,phone:c,totalSavings:f}=e;return it(At,{className:\"content-mobile\",children:[ae(Et,{component:\"h1\",tabIndex:l?.trim()?0:-1,className:\"body-title-mobile\",children:l}),!t&&it($i,{children:[ae(Et,{tabIndex:s?.trim()?0:-1,className:\"social-title-text-mobile\",children:s}),d?.trim()&&wr(\"email\",d,\"email-text-mobile\"),c?.trim()&&wr(\"phone\",c,\"phone-text-mobile\"),ae(At,{className:\"social-icons-mobile\",children:o}),Fi(b,g??\"\",n,i,f)]})]})},Vc=(e,t,o,n,i)=>{let{shopTitle:l,shopDescription:s,socialTitleText:d,email:b,phone:g,showBadges:c,expirationDate:f,totalSavings:x}=e;return it(At,{className:\"content\",children:[ae(Et,{component:\"h1\",tabIndex:l?.trim()?0:-1,className:\"body-title\",children:l}),!t&&it($i,{children:[s?.length>480?ae($c,{title:s,arrow:!0,children:ae(Et,{tabIndex:s?.trim()?0:-1,className:\"body-text\",children:s})}):ae(Et,{tabIndex:s?.trim()?0:-1,className:\"body-text\",children:s}),it(At,{className:\"social-media\",children:[ae(Et,{tabIndex:d?.trim()?0:-1,className:\"social-title-text\",children:d}),it(At,{className:\"social-icons\",children:[o,b?.trim()&&wr(\"email\",b,\"email-text\"),g?.trim()&&wr(\"phone\",g,\"phone-text\")]})]}),Fi(c,f??\"\",n,i,x)]})]})},Ec=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),l=i.getContext(\"2d\");if(!l)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,l.drawImage(n,0,0);let d=[l.getImageData(0,0,1,1).data,l.getImageData(n.width-1,0,1,1).data,l.getImageData(0,n.height-1,1,1).data,l.getImageData(n.width-1,n.height-1,1,1).data].every(b=>Array.prototype.slice.call(b)[3]<10);t(d)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),Ac=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(d=>d+d).join(\"\"));let n=Number.parseInt(o.substring(0,2),16),i=Number.parseInt(o.substring(2,4),16),l=Number.parseInt(o.substring(4,6),16),s=220;return n>=s&&i>=s&&l>=s},zc=(e,t)=>({onClick:()=>{br({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),br({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),wr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=zc(e,t);return ae(Et,{className:o,children:ae(Si,{href:`${n}${t}`,...i,children:t})})};function Li({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:l,phone:s,bannerProps:d,socialIcons:b,expirationDate:g,showBadges:c=!1,totalSavings:f}){let x=Lc(\"(max-width: 560px)\"),[C,S]=yr(!1),[h,O]=yr(!1),[m,v]=yr(!1),[y,k]=yr(!1),F=()=>{O(!h)};Ha(()=>{(async()=>{if(i?.imageSrc){let u=await Ec(i.imageSrc);k(u)}else k(!1)})()},[i?.imageSrc]),Ha(()=>{v(Ac(d?.backgroundColor))},[d?.backgroundColor]),Ha(()=>{let M,u=window.scrollY,p=!1,w=!1,G=0,T=I=>{let Re=Date.now();if(p!==I&&!w){if(Re-G<100)return;w=!0,p=I,G=Re,I&&O(!1),clearTimeout(M),S(I),M=setTimeout(()=>{w=!1,I&&window.scrollY<15&&window.scrollTo({top:x?20:30,behavior:\"smooth\"})},300)}},A=()=>{let I=window.scrollY;if(w){u=I;return}if(Math.abs(I-u)<.5)return;let Ee=I>u,Je=x?15:25,$o=x?8:12;Ee&&I>Je&&!p?T(!0):!Ee&&I<$o&&p&&T(!1),u=I},te=()=>{let I=window.scrollY,Ee=I>(x?5:10);p=Ee,S(Ee),u=I,G=Date.now()},P=null,E=0,X=()=>{P||Date.now()-E<16||(P=requestAnimationFrame(()=>{A(),E=Date.now(),P=null}))};return te(),window.addEventListener(\"scroll\",X,{passive:!0}),()=>{window.removeEventListener(\"scroll\",X),P&&cancelAnimationFrame(P),clearTimeout(M)}},[x]);let R=Fc(()=>b?.map((M,u)=>ae(ki,{onClick:w=>{w.preventDefault(),br({event:\"social_click\",social_platform:M.type,social_url:M.url,click_element:\"social_icon\"}),window.open(M.url,\"_blank\")},children:ae(Nc,{href:M.url,target:\"_blank\",children:ae(Oi,{src:`https://www.google.com/s2/favicons?domain=${M?.url}&sz=24`,alt:`${M.type} icon`,width:\"24\",height:\"24\"},M?.type+u)})},M?.type+u)),[b]),D=`${e} ${C?\"scrolled\":\"\"}`,W={shopTitle:t,shopDescription:o,socialTitleText:n,email:l,phone:s,showBadges:c,expirationDate:g,totalSavings:f},B=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,L=x&&o&&o.length>B();return x?it(wi,{className:D,\"data-testid\":\"my-site-shop-header\",bannerProps:d,isCircularImage:y,hasWhiteBackground:m,children:[it(At,{className:\"image-content-mobile\",children:[Mi(i,d??{},\"bg-image-mobile\"),Ic(W,C,R,x,m)]}),!C&&it(At,{className:\"expandable-description-mobile\",children:[ae(Et,{className:`description-content-mobile ${h||!L?\"expanded\":\"collapsed\"}`,children:o}),L&&ae(vi,{onClick:F,children:ae(Ri,{width:16,height:16,className:`arrow-icon-mobile ${h?\"expanded\":\"\"}`})})]})]}):it(yi,{className:D,\"data-testid\":\"my-site-shop-header\",bannerProps:d,isCircularImage:y,hasWhiteBackground:m,children:[Mi(i,d??{},\"bg-image\"),Vc(W,C,R,x,m)]})}import{styled as Yo}from\"@nuskin/foundation-theme\";var Wa=Yo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 20px;\n width: 100%;\n box-sizing: border-box;\n padding: 16px;\n\n @media (min-width: 768px) {\n gap: 24px;\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n padding: 24px;\n }\n`,Ni=Yo(\"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`,Ii=Yo(\"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`,_a=Yo(\"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`,Vi=Yo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import _c from\"@mui/icons-material/CalendarMonth\";import Uc from\"@mui/icons-material/Language\";import{NsSpinner as Kc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as Bc,styled as Ze}from\"@nuskin/foundation-theme\";var{getGenomeColor:zt}=Bc,Ei=Ze(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 16px;\n background-color: ${({theme:e})=>zt(e,\"N20\")};\n border-radius: 12px;\n min-height: auto;\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: 16px 20px;\n gap: 16px;\n }\n\n @media (min-width: 1080px) {\n padding: 16px 24px;\n gap: 20px;\n }\n`,Ai=Ze(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,zi=Ze(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>zt(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=Ze(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>zt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Hi=Ze(\"div\")`\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 24px;\n width: 100%;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,Ua=Ze(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,Ka=Ze(\"label\")`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: 0 !important;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n`,Pt=Ze(\"select\")`\n min-width: 120px;\n height: 32px;\n padding: 6px 24px 6px 8px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>zt(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 white-space: nowrap;\n flex-shrink: 0;\n\n &:hover {\n background-color: ${({theme:e})=>zt(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>zt(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>zt(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 background-position: right 8px center;\n }\n`,Ga=Ze(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>zt(e,\"N70\")};\n\n svg {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n`,Wi=Ze(\"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`,_i=Ze(\"div\")`\n display: flex;\n flex-wrap: nowrap;\n gap: 24px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,jh=Ze(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var Cr;function vr(e){Cr=e}function Hc(){return Cr}function Ue(e){if(!Cr)return e.fallback;let t;try{t=Cr(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\"},visits:{key:\"shoppingDashboard.stats.visits\",fallback:\"Site Visits\"},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\"}},market:{label:{key:\"shoppingDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"shoppingDashboard.filter.market.all\",fallback:\"All Markets\"}},productSort:{label:{key:\"shoppingDashboard.filter.productSort.label\",fallback:\"Sort By\"}},signupView:{label:{key:\"shoppingDashboard.filter.signupView.label\",fallback:\"Show\"},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:\"Overall\"},retail:{key:\"shoppingDashboard.filter.conversionType.retail\",fallback:\"Retail\"},member:{key:\"shoppingDashboard.filter.conversionType.member\",fallback:\"Member\"}}},widget:{topProducts:{title:{key:\"shoppingDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},viewAll:{key:\"shoppingDashboard.widget.topProducts.viewAll\",fallback:\"View All Products\"},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\"},rank:{key:\"shoppingDashboard.widget.topProducts.rank\",fallback:\"Rank\"}},conversionRate:{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\"},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\"},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\"},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.\"}},compareTo:{last7days:{key:\"shoppingDashboard.widget.compareTo.last7days\",fallback:\"compared to this time 7 days ago\"},last30days:{key:\"shoppingDashboard.widget.compareTo.last30days\",fallback:\"compared to this time last month\"},last90days:{key:\"shoppingDashboard.widget.compareTo.last90days\",fallback:\"compared to this time 90 days ago\"},thisMonth:{key:\"shoppingDashboard.widget.compareTo.thisMonth\",fallback:\"compared to this time last month\"}},topCategories:{title:{key:\"shoppingDashboard.widget.topCategories.title\",fallback:\"Top Categories\"},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\"},viewDetails:{key:\"shoppingDashboard.widget.menu.viewDetails\",fallback:\"View Details\"},exportData:{key:\"shoppingDashboard.widget.menu.exportData\",fallback:\"Export Data\"}}},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\"},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\"},customer:{key:\"shoppingDashboard.fullView.conversionRate.columns.customer\",fallback:\"Customer\"},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\"},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\"},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\"},percentOfTotal:{key:\"shoppingDashboard.fullView.categories.columns.percentOfTotal\",fallback:\"% of Total\"}},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:\"--\"},noData:{key:\"shoppingDashboard.defaults.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.defaults.noChange\",fallback:\"No change\"},byRevenue:{key:\"shoppingDashboard.defaults.byRevenue\",fallback:\"By: Revenue\"},byUnits:{key:\"shoppingDashboard.defaults.byUnits\",fallback:\"By: Units\"},byVolume:{key:\"shoppingDashboard.defaults.byVolume\",fallback:\"By: Volume\"},byTrend:{key:\"shoppingDashboard.defaults.byTrend\",fallback:\"By: Trend\"},all:{key:\"shoppingDashboard.defaults.all\",fallback:\"All\"},members:{key:\"shoppingDashboard.defaults.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.defaults.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.defaults.brandAffiliates\",fallback:\"Brand Affiliates\"},revenue:{key:\"shoppingDashboard.defaults.revenue\",fallback:\"Revenue\"},units:{key:\"shoppingDashboard.defaults.units\",fallback:\"Units\"},volume:{key:\"shoppingDashboard.defaults.volume\",fallback:\"Volume\"},conversionRate:{key:\"shoppingDashboard.defaults.conversionRate\",fallback:\"Conversion Rate\"},trend:{key:\"shoppingDashboard.defaults.trend\",fallback:\"Trend\"},date:{key:\"shoppingDashboard.defaults.date\",fallback:\"Date\"},type:{key:\"shoppingDashboard.defaults.type\",fallback:\"Type\"},dcSv:{key:\"shoppingDashboard.defaults.dcSv\",fallback:\"DC-SV\"}}};function a(e){return Ue(e)}import{useMemo as Wc}from\"react\";function Ui(){return[{value:\"all\",label:a(r.filter.market.all)}]}function Ki(e){return e&&e.length>0?e:Ui()}function Xe(e){return Wc(()=>Ki(e),[e])}import{jsx as Te,jsxs as bo}from\"react/jsx-runtime\";var Jo=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:l,markets:s,onDateRangeChange:d,onMarketChange:b})=>{let g=Xe(s),c=S=>{let h=S.target.value;d?.(h)},f=S=>{let h=S.target.value;b?.(h)},x=S=>{S.key===\"Escape\"&&S.target.blur()},C=()=>n||(l?.dateRange?l.dateRange.label:a(r.filter.dateRange.last30days));return bo(Ei,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[bo(Ai,{children:[Te(zi,{\"data-testid\":\"dashboard-shop-title\",children:e??l?.shopTitle??a(r.title)}),Te(Bi,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:C()})]}),Te(Hi,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:bo(_i,{children:[i&&Te(Wi,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:Te(Kc,{})}),bo(Ua,{children:[Te(Ka,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRange.label)}),Te(Ga,{\"aria-hidden\":\"true\",children:Te(_c,{})}),bo(Pt,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:c,onKeyDown:x,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[Te(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),Te(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),Te(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),Te(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),bo(Ua,{children:[Te(Ka,{htmlFor:\"filter-market\",children:a(r.filter.market.label)}),Te(Ga,{\"aria-hidden\":\"true\",children:Te(Uc,{})}),Te(Pt,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:f,onKeyDown:x,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${g.find(S=>S.value===o)?.label??String(o)}`,children:g.map(S=>Te(\"option\",{value:S.value,children:S.label},S.value))})]})]})})]})};import eu from\"react\";import tu from\"@mui/icons-material/ShowChart\";import ou from\"@mui/icons-material/TrendingUp\";import ru from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Gc,styled as Le}from\"@nuskin/foundation-theme\";var{getGenomeColor:Rt}=Gc,kr=Le(\"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\"?\"12px\":\"10px\"};\n background-color: ${({theme:e})=>Rt(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Rt(e,\"N30\")};\n border-radius: 8px;\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\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\"?\"16px\":\"12px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\n }\n\n @media (min-width: 1080px) {\n padding: ${({$layout:e})=>e===\"split\"?\"16px\":\"14px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\n }\n`,Gi=Le(\"div\")`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>Rt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,ji=Le(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,Yi=Le(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,Ji=Le(\"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\":Rt(e,\"N70\")};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`,Zi=Le(\"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})=>Rt(e,\"N70\")};\n`,Xi=Le(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.2;\n letter-spacing: 0;\n color: ${({theme:e})=>Rt(e,\"N100\")};\n margin-bottom: 2px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n @media (min-width: 1080px) {\n font-size: 14px;\n }\n`,qi=Le(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: space-between;\n gap: 2px;\n margin-top: 10px;\n width: 100%;\n`,ja=Le(\"div\")`\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>Rt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 24px;\n }\n\n @media (min-width: 1080px) {\n font-size: 28px;\n }\n`,Qi=Le(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,el=Le(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 1;\n color: ${({theme:e})=>Rt(e,\"N70\")};\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,tl=Le(\"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\":Rt(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`,px=Le(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ya=Le(\"span\")`\n white-space: nowrap;\n`,ol=Le(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import Q from\"@mui/material/Skeleton\";import{styled as J}from\"@nuskin/foundation-theme\";import Zo from\"@mui/material/Skeleton\";var Tr=J(\"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`,Sr=J(\"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`,rl=J(\"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`,al=J(\"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`,nl=J(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,il=J(\"div\")`\n margin-top: 8px;\n`,ll=J(Zo)`\n margin-top: 4px;\n`,sl=J(\"div\")`\n flex: 1;\n min-width: 0;\n`,dl=J(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,pl=J(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,cl=J(\"div\")`\n padding-top: 4px;\n`,ul=J(Zo)`\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`,ml=J(\"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`,gl=J(Zo)`\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`,fl=J(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,hl=J(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,xl=J(\"div\")`\n flex: 1;\n`,jc=J(\"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`,Yc=J(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,Jc=J(\"div\")`\n display: flex;\n gap: 16px;\n`,Zc=J(\"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`,Xc=J(\"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`,Ja=J(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,bl=J(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,yl=J(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,wl=J(Zo)`\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`,Za=J(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,Dr=J(Zo)`\n border-radius: 4px;\n`,Cl=J(\"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 z,jsxs as ne}from\"react/jsx-runtime\";var Xo=()=>ne(al,{\"data-testid\":\"skeleton-stats-card\",children:[ne(nl,{children:[z(Q,{variant:\"text\",width:80,height:18}),z(Q,{variant:\"text\",width:48,height:16})]}),ne(il,{children:[z(Q,{variant:\"text\",width:120,height:36}),z(ll,{variant:\"text\",width:100,height:16})]})]}),qc=()=>ne(rl,{children:[z(Q,{variant:\"rounded\",width:28,height:28}),z(Q,{variant:\"rounded\",width:50,height:50}),ne(sl,{children:[z(Q,{variant:\"text\",width:\"70%\",height:18}),z(Q,{variant:\"text\",width:\"50%\",height:14})]}),ne(dl,{children:[z(Q,{variant:\"text\",width:80,height:18}),z(Q,{variant:\"text\",width:48,height:14})]})]}),vl=()=>ne(Tr,{\"data-testid\":\"skeleton-products-list\",children:[ne(Sr,{children:[z(Q,{variant:\"text\",width:160,height:22}),z(Q,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>z(qc,{},e))]}),Pr=()=>ne(Tr,{\"data-testid\":\"skeleton-chart-widget\",children:[ne(Sr,{children:[z(Q,{variant:\"text\",width:140,height:22}),z(Q,{variant:\"rounded\",width:110,height:32})]}),ne(pl,{children:[z(Q,{variant:\"text\",width:100,height:36}),ne(cl,{children:[z(Q,{variant:\"text\",width:60,height:18}),z(Q,{variant:\"text\",width:140,height:14})]})]}),z(ul,{variant:\"rounded\",width:\"100%\"})]}),Qc=()=>ne(hl,{children:[z(Q,{variant:\"circular\",width:12,height:12}),ne(xl,{children:[z(Q,{variant:\"text\",width:\"60%\",height:16}),z(Q,{variant:\"text\",width:\"40%\",height:14})]}),z(Q,{variant:\"text\",width:36,height:18})]}),Rr=()=>ne(Tr,{\"data-testid\":\"skeleton-categories-pie\",children:[ne(Sr,{children:[z(Q,{variant:\"text\",width:140,height:22}),z(Q,{variant:\"rounded\",width:100,height:32})]}),ne(ml,{children:[z(gl,{variant:\"circular\"}),z(fl,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>z(Qc,{},e))})]})]});var Bt=()=>ne(Ja,{\"data-testid\":\"skeleton-fullview-chart\",children:[ne(bl,{children:[ne(yl,{children:[z(Q,{variant:\"text\",width:140,height:52}),z(Q,{variant:\"text\",width:80,height:24}),z(Q,{variant:\"text\",width:160,height:16})]}),z(wl,{variant:\"rounded\",width:\"100%\"})]}),ne(Za,{children:[z(Q,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>z(Dr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),kl=()=>ne(Ja,{\"data-testid\":\"skeleton-fullview-table\",children:[ne(Cl,{children:[z(Xo,{}),z(Xo,{}),z(Xo,{})]}),ne(Za,{children:[z(Q,{variant:\"text\",width:200,height:24}),z(Dr,{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=>z(Dr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as ze,jsxs as Ht}from\"react/jsx-runtime\";var au=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:l=\"neutral\",trendValue:s,testId:d,isLoading:b=!1})=>{if(b)return ze(kr,{$layout:i,\"data-testid\":d,children:ze(Xo,{})});let g=()=>{let f=a(r.stats.trend.unchanged);return l===\"up\"?f=a(r.stats.trend.increased):l===\"down\"&&(f=a(r.stats.trend.decreased)),`${e} ${f} ${s??\"\"}`},c=f=>l===\"up\"?ze(ou,{sx:{fontSize:f},\"aria-hidden\":\"true\"}):l===\"down\"?ze(ru,{sx:{fontSize:f},\"aria-hidden\":\"true\"}):ze(tu,{sx:{fontSize:f},\"aria-hidden\":\"true\"});return i===\"split\"?Ht(kr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":d,children:[ze(Gi,{id:`stats-title-${d}`,children:e}),Ht(ji,{children:[ze(ja,{\"aria-describedby\":`stats-title-${d}`,\"data-testid\":`stats-value-${d}`,children:t}),(s??n)&&Ht(Yi,{children:[s&&Ht(Ji,{as:\"output\",direction:l,\"aria-live\":\"polite\",\"aria-label\":g(),\"data-testid\":`stats-trend-${d}`,children:[c(\"18px\"),ze(Ya,{children:s})]}),n&&ze(Zi,{\"data-testid\":`stats-caption-${d}`,children:n})]})]})]}):Ht(kr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":d,children:[ze(ol,{children:ze(Xi,{id:`stats-title-${d}`,children:e})}),Ht(qi,{children:[Ht(Qi,{children:[ze(ja,{\"aria-describedby\":`stats-title-${d}`,\"data-testid\":`stats-value-${d}`,children:t}),o&&ze(el,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${d}`,children:o})]}),s&&Ht(tl,{as:\"output\",direction:l,\"aria-live\":\"polite\",\"aria-label\":g(),\"data-testid\":`stats-trend-${d}`,children:[c(\"16px\"),ze(Ya,{children:s})]})]})]})},Mt=eu.memo(au);Mt.displayName=\"StatsCard\";import Cu from\"react\";import vu from\"@mui/icons-material/ShoppingCart\";import nu from\"@mui/icons-material/ShowChart\";import iu from\"@mui/icons-material/TrendingUp\";import lu from\"@mui/icons-material/TrendingDown\";import{jsx as Mr}from\"react/jsx-runtime\";function Or(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function xt(e){let t=Or(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function Wt(e,t,o){let{weightedSum:n,weight:i}=e.reduce((d,b)=>{let g=Or(o(b));return g===null?d:{weightedSum:d.weightedSum+g*t(b),weight:d.weight+t(b)}},{weightedSum:0,weight:0}),l=i>0?n/i:0,s=\"neutral\";return l>0?s=\"up\":l<0&&(s=\"down\"),{direction:s,formatted:`${l>0?\"+\":\"\"}${l.toFixed(1)}%`}}function yo(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function Ke(e){switch(e){case\"up\":return Mr(iu,{});case\"down\":return Mr(lu,{});case\"neutral\":default:return Mr(nu,{})}}function su(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}function Fr(e,t){let{cx:o,cy:n,midAngle:i,innerRadius:l,outerRadius:s,percentage:d}=e,b=Math.PI/180,g=l+(s-l)/2,c=o+g*Math.cos(-i*b),f=n+g*Math.sin(-i*b);return Mr(\"text\",{x:c,y:f,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"middle\",fontSize:t?.fontSize??\"10\",fontWeight:t?.fontWeight??\"600\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0.2\",children:`${d}%`})}import{useMemo as Tl}from\"react\";function Sl(e,t){return Math.ceil(e.length/t)}function Dl(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function du(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let l=n[t],s=i[t];return o===\"asc\"?l-s:s-l})}function pu(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function bt(e,t,o){let n=Tl(()=>Sl(e,o),[e,o]),i=Tl(()=>Dl(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function j(e){switch(e){case\"IN\":return\"en-IN\";case\"CA\":return\"en-CA\";case\"US\":default:return\"en-US\"}}function Y(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,currencyDisplay:\"narrowSymbol\",...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return`$${n!==void 0?i.toFixed(n):new Intl.NumberFormat(o,{minimumFractionDigits:0,maximumFractionDigits:2}).format(i)}`}function qo(e){return!e||e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function _t(e,t){switch(t){case\"members\":return e.members;case\"retail\":return e.retail;case\"brandAffiliates\":return e.brandAffiliates;case\"all\":default:return e.total}}import{ColorUtils as cu,styled as ye}from\"@nuskin/foundation-theme\";var{getGenomeColor:ie}=cu,Lr=ye(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ie(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ie(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`,Xa=ye(\"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`,Pl=ye(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,qa=ye(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ie(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})=>ie(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`,Ex=ye(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ie(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ie(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ie(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ie(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>ie(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ie(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Rl=ye(\"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`,Ml=ye(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>ie(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})=>ie(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>ie(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`,Ol=ye(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>ie(e,\"A10\")};\n color: ${({theme:e})=>ie(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`,Fl=ye(\"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`,Ll=ye(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>ie(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>ie(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`,$l=ye(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,Nl=ye(\"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})=>ie(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`,Il=ye(\"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})=>ie(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,Vl=ye(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,El=ye(\"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})=>ie(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Al=ye(\"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\":ie(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`,zl=ye(\"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})=>ie(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>ie(e,\"N50\")};\n }\n`,Bl=ye(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>ie(e,\"N70\")};\n`;import{useState as fu}from\"react\";import hu from\"@mui/material/Menu\";import _l from\"@mui/material/MenuItem\";import Ul from\"@mui/material/ListItemIcon\";import Kl from\"@mui/material/ListItemText\";import xu from\"@mui/icons-material/MoreVert\";import bu from\"@mui/icons-material/Visibility\";import yu from\"@mui/icons-material/FileDownload\";import uu from\"@mui/material/IconButton\";import{styled as mu,ColorUtils as gu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Hl}=gu,Wl=mu(uu)(({theme:e})=>({padding:\"4px\",color:Hl(e,\"N100\"),\"&:hover\":{backgroundColor:Hl(e,\"N20\")}}));import{Fragment as wu,jsx as Ut,jsxs as $r}from\"react/jsx-runtime\";var lt=({widgetId:e,onFullView:t,onExport:o})=>{let[n,i]=fu(null),l=!!n,s=`widget-menu-button-${e}`,d=`widget-menu-${e}`,b=x=>{i(x.currentTarget)},g=()=>{i(null)},c=()=>{g(),t&&t()},f=()=>{g(),o&&o()};return $r(wu,{children:[Ut(Wl,{id:s,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":l?d:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":l?\"true\":void 0,onClick:b,size:\"small\",children:Ut(xu,{fontSize:\"small\"})}),$r(hu,{id:d,\"data-testid\":`widget-menu-${e}`,anchorEl:n,open:l,onClose:g,MenuListProps:{\"aria-labelledby\":s},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[$r(_l,{onClick:c,\"data-testid\":\"widget-menu-item-viewdetails\",children:[Ut(Ul,{children:Ut(bu,{fontSize:\"small\"})}),Ut(Kl,{children:a(r.widget.menu.viewDetails)})]}),o&&$r(_l,{onClick:f,\"data-testid\":\"widget-menu-item-export\",children:[Ut(Ul,{children:Ut(yu,{fontSize:\"small\"})}),Ut(Kl,{children:a(r.widget.menu.exportData)})]})]})]})};import{jsx as xe,jsxs as yt}from\"react/jsx-runtime\";var ku=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,market:i,onSortChange:l,onTitleClick:s,onExport:d})=>{let b=m=>{let v=m.target.value;l?.(v)},g=(m,v)=>{switch(v){case\"units\":return`${m.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return Y(m.revenue,m.currencyCode,j(i));case\"volume\":return`${m.volume.toLocaleString()} ${a(r.defaults.dcSv)}`;default:return`${m.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},c=(m,v)=>{switch(v){case\"units\":return`${Y(m.revenue,m.currencyCode,j(i))} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${m.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${Y(m.revenue,m.currencyCode,j(i))} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${Y(m.revenue,m.currencyCode,j(i))} ${a(r.widget.topProducts.revenueSuffix)}`}},f=(m,v)=>{let y=m.trend;if(!y)return\"\";let k=\"\";switch(v){case\"units\":k=y.units??\"\";break;case\"revenue\":k=y.revenue??\"\";break;case\"volume\":k=y.volume??\"\";break;default:k=y.units??\"\"}return k},x=(m,v)=>{let y=f(m,v);return xt(y)},C=m=>Ke(m),S=e.slice(0,n),h=a(r.widget.topProducts.rank),O=a(r.defaults.trend);return o&&e.length===0?xe(Lr,{\"data-testid\":\"widget-top-products\",children:xe(vl,{})}):e.length===0?yt(Lr,{\"data-testid\":\"widget-top-products\",children:[xe(Xa,{children:xe(qa,{children:a(r.widget.topProducts.title)})}),yt(zl,{\"data-testid\":\"products-empty-state\",children:[xe(vu,{}),xe(Bl,{children:a(r.widget.topProducts.empty)})]})]}):yt(Lr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[yt(Xa,{children:[xe(qa,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),yt(Pl,{children:[yt(Pt,{id:\"product-sort\",\"data-testid\":\"product-sort-dropdown\",value:t,onChange:b,disabled:o,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[xe(\"option\",{value:\"units\",children:a(r.defaults.byUnits)}),xe(\"option\",{value:\"revenue\",children:a(r.defaults.byRevenue)}),xe(\"option\",{value:\"volume\",children:a(r.defaults.byVolume)})]}),xe(lt,{widgetId:\"top-products\",onFullView:s,onExport:d})]})]}),xe(Rl,{as:\"ul\",\"data-testid\":\"products-list\",children:S.map((m,v)=>{let y=x(m,t),k=f(m,t);return yt(Ml,{as:\"li\",\"data-testid\":`product-item-${v}`,\"aria-label\":`${h} ${m.rank}: ${m.name}, ${g(m,t)}`,children:[xe(Ol,{\"aria-label\":`${h} ${m.rank}`,children:m.rank}),m.imageUrl?xe(Fl,{src:m.imageUrl,alt:m.name,loading:\"lazy\",onError:F=>{F.currentTarget.hidden=!0}}):xe(Ll,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:m.name.substring(0,2).toUpperCase()}),yt($l,{children:[xe(Nl,{title:m.name,children:m.name}),xe(Il,{children:c(m,t)})]}),yt(Vl,{children:[xe(El,{children:g(m,t)}),k&&yt(Al,{as:\"output\",direction:y,\"aria-live\":\"polite\",\"aria-label\":`${O}: ${yo(y)} ${k}`,children:[C(y),xe(\"span\",{children:k})]})]})]},m.id)})})]})},wo=Cu.memo(ku);wo.displayName=\"TopSellingProductsList\";import Co from\"react\";import{LineChart as Mu,Line as Ou,XAxis as Fu,YAxis as Lu,CartesianGrid as $u,Tooltip as Nu,ResponsiveContainer as Iu}from\"recharts\";import{ColorUtils as Tu,styled as $e}from\"@nuskin/foundation-theme\";var{getGenomeColor:ge}=Tu,Qa=$e(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ge(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ge(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`,Gl=$e(\"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`,jl=$e(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Yl=$e(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Jl=$e(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ge(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})=>ge(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`,mb=$e(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ge(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ge(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ge(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ge(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>ge(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ge(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Zl=$e(\"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`,Xl=$e(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>ge(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,ql=$e(\"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\":ge(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})=>ge(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Ql=$e(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>ge(e,\"N100\")};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,es=$e(\"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})=>ge(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>ge(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,ts=$e(\"div\")`\n background-color: ${({theme:e})=>ge(e,\"N100\")};\n border: 1px solid ${({theme:e})=>ge(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,os=$e(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>ge(e,\"N10\")};\n margin-bottom: 4px;\n`,rs=$e(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>ge(e,\"A10\")};\n`,as=$e(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>ge(e,\"N30\")};\n margin-top: 2px;\n`;var qe=\"last30days\",ns={last7days:7,last30days:30,last90days:90,thisMonth:31},is={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function Su(e){return ns[e]??30}function en(e){return is[e]??\"Last 30 Days\"}function Du(e){return en(e)}function ls(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var Pu={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 Nr(e){let t=e.split(\" \");return t.length!==2?e:`${Pu[t[0]]||t[0]}/${t[1]}`}function tn(e){let t=new Date(e);return ls(t)}function ss(e,t){return`${tn(e)} - ${tn(t)}`}function on(e){return e.toISOString().split(\"T\")[0]}function we(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),l,s=new Date(o,n,i);switch(e){case\"last7days\":l=new Date(o,n,i-7);break;case\"last30days\":l=new Date(o,n,i-30);break;case\"last90days\":l=new Date(o,n,i-90);break;case\"thisMonth\":l=new Date(o,n,1),s=new Date(o,n+1,0);break;default:return\"N/A\"}return ss(on(l),on(s))}function Ot(e){let t=r.widget.compareTo;switch(e){case\"last7days\":return Ue(t.last7days);case\"last30days\":return Ue(t.last30days);case\"last90days\":return Ue(t.last90days);case\"thisMonth\":return Ue(t.thisMonth);default:return Ue(t.last30days)}}function Ru(e,t){return t===\"all\"||e.priceTypes===void 0?!0:e.priceTypes.some(o=>o.toLowerCase()===t)}function Ir(e,t){return e.filter(o=>Ru(o,t))}import{jsx as oe,jsxs as Qe}from\"react/jsx-runtime\";var Vu={top:5,right:10,left:-10,bottom:5},ds={fontSize:10},Eu=e=>{let{cx:t,cy:o,r:n=3}=e;return oe(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},Au=e=>{let{cx:t,cy:o,r:n=5}=e;return oe(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},zu=e=>`${e}%`,Bu=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Qe(ts,{children:[oe(os,{children:o.date}),Qe(rs,{children:[(o.rate??0).toFixed(2),\"%\"]}),Qe(as,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},Hu=({conversionData:e,conversionFilter:t,dateRange:o=qe,isLoading:n=!1,title:i,summaryRate:l,summaryChangePct:s,onFilterChange:d,onTitleClick:b,onExport:g})=>{let c=Co.useCallback(v=>{let y=v.target.value;d?.(y)},[d]),f=a(r.defaults.noData),x=a(r.defaults.noChange),C=Co.useMemo(()=>Ir(e,t),[e,t]),S=Co.useMemo(()=>typeof l==\"number\"&&Number.isFinite(l)?l:C.at(-1)?.rate??0,[l,C]),h=Co.useMemo(()=>{if(s!==void 0){if(s===null||Math.abs(s)<.1)return{direction:\"neutral\",value:x};let W=s>0?\"up\":\"down\",B=`${s>0?\"+\":\"\"}${s.toFixed(2)}%`;return{direction:W,value:B}}if(C.length<2)return{direction:\"neutral\",value:f};let v=C.at(-1)?.rate??0,y=C[0].rate;if(y===0)return{direction:\"neutral\",value:x};let k=v-y,F=k/y*100;if(Math.abs(F)<.1)return{direction:\"neutral\",value:x};let R=k>0?\"up\":\"down\",D=`${k>0?\"+\":\"\"}${k.toFixed(2)}%`;return{direction:R,value:D}},[s,C,x,f]),O=Co.useMemo(()=>C.map(v=>({...v,shortDate:Nr(v.date)})),[C]);if(n&&e.length===0)return oe(Qa,{\"data-testid\":\"widget-conversion-rate\",children:oe(Pr,{})});let m=a(r.widget.conversionRate.chartAriaLabel);return Qe(Qa,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":m,children:[oe(Gl,{children:Qe(jl,{children:[oe(Jl,{as:\"button\",onClick:b,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:i??a(r.defaults.conversionRate)}),Qe(Yl,{children:[Qe(Pt,{id:\"conversion-filter\",\"data-testid\":\"conversion-filter-dropdown\",value:t,onChange:c,disabled:n,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[oe(\"option\",{value:\"all\",children:a(r.filter.conversionType.all)}),oe(\"option\",{value:\"retail\",children:a(r.filter.conversionType.retail)}),oe(\"option\",{value:\"member\",children:a(r.filter.conversionType.member)})]}),oe(lt,{widgetId:\"conversion-rate\",onFullView:b,onExport:g})]})]})}),Qe(Zl,{children:[Qe(Xl,{\"aria-label\":`${a(r.defaults.conversionRate)}: ${S.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[S.toFixed(2),\"%\"]}),h.value!==f&&Qe(ql,{as:\"output\",direction:h.direction,\"aria-live\":\"polite\",\"aria-label\":`${yo(h.direction)} ${h.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Qe(\"div\",{className:\"trend-line\",children:[oe(\"span\",{\"aria-hidden\":\"true\",children:Ke(h.direction)}),oe(\"span\",{className:\"change-value\",children:h.value.replace(\"%\",\"\")}),oe(\"span\",{className:\"change-percent\",children:\"%\"})]}),oe(\"div\",{className:\"comparison-text\",children:Ot(o)})]})]}),oe(Ql,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),oe(es,{\"data-testid\":\"conversion-chart\",children:oe(Iu,{width:\"100%\",height:\"100%\",minHeight:200,children:Qe(Mu,{data:O,margin:Vu,children:[oe($u,{strokeDasharray:\"3 3\"}),oe(Fu,{dataKey:\"shortDate\",tick:ds,tickLine:!1,interval:\"preserveStartEnd\"}),oe(Lu,{tick:ds,tickLine:!1,tickFormatter:zu,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),oe(Nu,{content:Bu}),oe(Ou,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:oe(Eu,{}),activeDot:oe(Au,{})})]})})})]})},vo=Co.memo(Hu);vo.displayName=\"ConversionRateChart\";import or from\"react\";import{LineChart as _u,Line as ko,XAxis as Uu,YAxis as Ku,CartesianGrid as Gu,Tooltip as ju,ResponsiveContainer as Yu}from\"recharts\";import{ColorUtils as Wu,styled as Ge}from\"@nuskin/foundation-theme\";var{getGenomeColor:Se}=Wu,rn=Ge(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>Se(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Se(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`,ps=Ge(\"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`,cs=Ge(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,us=Ge(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>Se(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})=>Se(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`,Eb=Ge(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>Se(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Se(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Se(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Se(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>Se(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>Se(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,ms=Ge(\"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`,gs=Ge(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>Se(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,fs=Ge(\"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\":Se(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})=>Se(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,hs=Ge(\"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})=>Se(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>Se(e,\"N70\")};\n font-size: 10px;\n }\n`,xs=Ge(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,Qo=Ge(\"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})=>Se(e,\"N30\")};\n }\n`,er=Ge(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,tr=Ge(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Se(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as Xu,jsx as _,jsxs as Be}from\"react/jsx-runtime\";var Ce={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},Ju={top:5,right:10,left:-10,bottom:5},bs={fontSize:10},an=new Map,To=e=>{if(an.has(e))return an.get(e);let t=o=>{let{cx:n=0,cy:i=0,r:l=2}=o;return _(\"circle\",{cx:n,cy:i,r:l,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:e,strokeWidth:\"1.5\",style:{pointerEvents:\"none\"}})};return t.displayName=\"HollowDot\",an.set(e,t),t},Zu=({signupData:e,signupView:t,dateRange:o=qe,isLoading:n=!1,title:i,onViewChange:l,onTitleClick:s,onExport:d})=>{let b=or.useCallback(v=>{let y=v.target.value;l?.(y)},[l]),g=a(r.defaults.noData),c=a(r.defaults.noChange),f=or.useMemo(()=>{if(e.length===0)return 0;let v=e[e.length-1];return _t(v,t)},[e,t]),x=or.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:g};let v=_t(e[e.length-1],t),y=_t(e[0],t),k=v-y,F=y===0?0:k/y*100;if(Math.abs(F)<.1)return{direction:\"neutral\",value:c};let R=k>0?\"up\":\"down\",D=`${k>0?\"+\":\"\"}${k} (${F.toFixed(1)}%)`;return{direction:R,value:D}},[c,g,e,t]),C=or.useMemo(()=>e.map(v=>({...v,shortDate:Nr(v.date)})),[e]),S=a(r.widget.signups.total),h=a(r.defaults.members),O=a(r.defaults.retail),m=a(r.defaults.brandAffiliates);return n&&e.length===0?_(rn,{\"data-testid\":\"widget-signups\",children:_(Pr,{})}):Be(rn,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[Be(ps,{children:[_(us,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:i??a(r.widget.signups.title)}),Be(cs,{children:[Be(Pt,{id:\"signup-view\",\"data-testid\":\"signup-view-dropdown\",value:t,onChange:b,disabled:n,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[_(\"option\",{value:\"all\",children:a(r.filter.signupView.showAll)}),_(\"option\",{value:\"members\",children:a(r.filter.signupView.showMembers)}),_(\"option\",{value:\"retail\",children:a(r.filter.signupView.showRetail)}),_(\"option\",{value:\"brandAffiliates\",children:a(r.filter.signupView.showBrandAffiliates)})]}),_(lt,{widgetId:\"signups\",onFullView:s,onExport:d})]})]}),Be(ms,{\"data-testid\":\"signups-metric-display\",children:[_(gs,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${S}: ${f.toLocaleString()}`,children:f.toLocaleString()}),x.value!==g&&Be(fs,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:x.direction,\"aria-live\":\"polite\",\"aria-label\":`${yo(x.direction)} ${x.value}`,children:[Be(\"div\",{className:\"trend-line\",children:[_(\"span\",{\"aria-hidden\":\"true\",children:Ke(x.direction)}),_(\"span\",{className:\"change-value\",children:x.value.split(\" \")[0]}),_(\"span\",{className:\"change-percent\",children:x.value.split(\" \")[1]})]}),_(\"div\",{className:\"comparison-text\",children:Ot(o)})]})]}),_(hs,{\"data-testid\":\"signups-chart\",children:_(Yu,{width:\"100%\",height:\"100%\",minHeight:200,children:Be(_u,{data:C,margin:Ju,children:[_(Gu,{strokeDasharray:\"3 3\"}),_(Uu,{dataKey:\"shortDate\",tick:bs,tickLine:!1,interval:\"preserveStartEnd\"}),_(Ku,{tick:bs,tickLine:!1}),_(ju,{}),(t===\"all\"||t===\"members\")&&_(ko,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?Ce.total:Ce.members,strokeWidth:2,dot:To(t===\"all\"?Ce.total:Ce.members),name:t===\"all\"?S:h}),t===\"all\"&&Be(Xu,{children:[_(ko,{type:\"monotone\",dataKey:\"members\",stroke:Ce.members,strokeWidth:2,dot:To(Ce.members),name:h}),_(ko,{type:\"monotone\",dataKey:\"retail\",stroke:Ce.retail,strokeWidth:2,dot:To(Ce.retail),name:O}),_(ko,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ce.brandAffiliates,strokeWidth:2,dot:To(Ce.brandAffiliates),name:m})]}),t===\"retail\"&&_(ko,{type:\"monotone\",dataKey:\"retail\",stroke:Ce.retail,strokeWidth:2,dot:To(Ce.retail),name:O}),t===\"brandAffiliates\"&&_(ko,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ce.brandAffiliates,strokeWidth:2,dot:To(Ce.brandAffiliates),name:m})]})})}),t===\"all\"&&Be(xs,{\"data-testid\":\"signups-legend\",children:[Be(Qo,{\"data-testid\":\"legend-total\",children:[_(er,{color:Ce.total}),_(tr,{children:S})]}),Be(Qo,{\"data-testid\":\"legend-members\",children:[_(er,{color:Ce.members}),_(tr,{children:h})]}),Be(Qo,{\"data-testid\":\"legend-retail\",children:[_(er,{color:Ce.retail}),_(tr,{children:O})]}),Be(Qo,{\"data-testid\":\"legend-brandAffiliates\",children:[_(er,{color:Ce.brandAffiliates}),_(tr,{children:m})]})]})]})},Vr=or.memo(Zu);Vr.displayName=\"SignupsChart\";import Po from\"react\";import{PieChart as Qu,Pie as em,Cell as tm,ResponsiveContainer as om,Tooltip as rm}from\"recharts\";import am from\"@mui/icons-material/TrendingUp\";import nm from\"@mui/icons-material/TrendingDown\";import im from\"@mui/icons-material/KeyboardArrowDown\";import lm from\"@mui/material/Menu\";import Ss from\"@mui/material/MenuItem\";import{ColorUtils as qu,styled as le}from\"@nuskin/foundation-theme\";var{getGenomeColor:de}=qu,Kt=le(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>de(e,\"N20\")};\n border: 1px solid ${({theme:e})=>de(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`,So=le(\"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`,Er=le(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Do=le(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>de(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})=>de(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`,ys=le(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>de(e,\"N20\")};\n border: 1px solid ${({theme:e})=>de(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>de(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>de(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>de(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>de(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,ws=le(\"button\")`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>de(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({theme:e})=>de(e,\"N20\")};\n }\n\n &:focus-visible {\n background-color: ${({theme:e})=>de(e,\"N20\")};\n outline: 2px solid ${({theme:e})=>de(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({theme:e})=>de(e,\"N70\")};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\n`,Ar=le(\"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`,zr=le(\"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`,Br=le(\"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`,Hr=le(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>de(e,\"N70\")};\n`,Wr=le(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>de(e,\"N100\")};\n`,_r=le(\"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\":de(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Ur=le(\"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`,Kr=le(\"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})=>de(e,\"N30\")};\n }\n`,Gr=le(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,jr=le(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Yr=le(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>de(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`,Jr=le(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>de(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Cs=le(\"div\")`\n display: none;\n`,vs=le(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,ks=le(\"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`,Ts=le(\"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`,Zr=le(\"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})=>de(e,\"N70\")};\n`,Xr=le(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>de(e,\"N70\")};\n`;import{Fragment as dm,jsx as ee,jsxs as Ne}from\"react/jsx-runtime\";var sm=({categories:e,categorySort:t,isLoading:o=!1,title:n,market:i,summaryChangePct:l,onSortChange:s,onTitleClick:d,onExport:b})=>{let[g,c]=Po.useState(null),f=!!g,x=Po.useCallback(D=>{c(D.currentTarget)},[]),C=Po.useCallback(()=>{c(null)},[]),S=Po.useCallback(D=>{c(null),s?.(D)},[s]),{sortedCategories:h,totalRevenue:O,totalVolume:m,trendDirection:v,formattedTrend:y}=Po.useMemo(()=>{let D=[...e].sort((u,p)=>t===\"revenue\"?p.revenue-u.revenue:(p.volume??0)-(u.volume??0)),W=D.reduce((u,p)=>u+p.revenue,0),B=D.reduce((u,p)=>u+(p.volume??0),0),L,M;if(l!=null)Math.abs(l)<.1?(M=\"0%\",L=\"neutral\"):(L=l>0?\"up\":\"down\",M=`${l>0?\"+\":\"\"}${l.toFixed(1)}%`);else{let{direction:u,formatted:p}=Wt(D,w=>t===\"volume\"?w.volume??0:w.revenue,w=>t===\"volume\"?w.trend?.volume:w.trend?.revenue);L=u,M=p}return{sortedCategories:D,totalRevenue:W,totalVolume:B,trendDirection:L,formattedTrend:M}},[e,t,l]),k=D=>D===\"up\"?ee(am,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):D===\"down\"?ee(nm,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,F=D=>Fr(D,{fontSize:\"10\",fontWeight:\"600\"}),R=h[0]?.currencyCode;return o&&e.length===0?ee(Kt,{\"data-testid\":\"widget-top-categories\",children:ee(Rr,{})}):e.length===0?Ne(Kt,{\"data-testid\":\"widget-top-categories\",children:[ee(So,{children:ee(Do,{children:n??a(r.widget.topCategories.title)})}),ee(Zr,{\"data-testid\":\"categories-empty-state\",children:ee(Xr,{children:a(r.widget.topCategories.empty)})})]}):Ne(Kt,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[Ne(So,{children:[ee(Do,{as:\"button\",onClick:d,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),Ne(Er,{children:[Ne(ws,{id:\"category-sort-button\",\"data-testid\":\"category-sort-dropdown\",onClick:x,disabled:o,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":f?\"category-sort-menu\":void 0,\"aria-expanded\":f?\"true\":void 0,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[t===\"volume\"?a(r.defaults.byVolume):a(r.defaults.byRevenue),ee(im,{fontSize:\"small\"})]}),Ne(lm,{id:\"category-sort-menu\",\"data-testid\":\"category-sort-menu\",anchorEl:g,open:f,onClose:C,MenuListProps:{\"aria-labelledby\":\"category-sort-button\"},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[ee(Ss,{\"data-testid\":\"category-sort-option-revenue\",selected:t===\"revenue\",onClick:()=>S(\"revenue\"),children:a(r.defaults.byRevenue)}),ee(Ss,{\"data-testid\":\"category-sort-option-volume\",selected:t===\"volume\",onClick:()=>S(\"volume\"),children:a(r.defaults.byVolume)})]}),ee(lt,{widgetId:\"top-categories\",onFullView:d,onExport:b})]})]}),Ne(Ar,{children:[Ne(zr,{\"data-testid\":\"categories-chart\",children:[ee(om,{width:\"100%\",height:\"100%\",children:Ne(Qu,{children:[ee(em,{data:h,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:t===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,label:F,labelLine:!1,children:h.map(D=>ee(tm,{fill:D.color},`cell-${D.id}`))}),ee(rm,{formatter:D=>Y(D,R,j(i))})]})}),Ne(Br,{\"data-testid\":\"categories-donut-center\",children:[ee(Hr,{children:t===\"volume\"?a(r.defaults.volume):a(r.stats.revenue)}),ee(Wr,{children:t===\"volume\"?Ne(dm,{children:[m.toFixed(1),ee(\"br\",{}),a(r.defaults.dcSv)]}):Y(O,R,j(i))}),Ne(_r,{direction:v,children:[k(v),ee(\"span\",{children:y})]})]})]}),ee(Ur,{\"data-testid\":\"categories-legend-container\",children:h.map((D,W)=>{let B=t===\"volume\"?D.volume:D.revenue,L=t===\"volume\"?D.volumeSharePct:D.percentage,M=t===\"volume\"?D.trend?.volume:D.trend?.revenue;return Ne(Kr,{\"data-testid\":`category-legend-${W}`,children:[ee(Gr,{color:D.color}),Ne(jr,{children:[ee(Yr,{children:D.name.charAt(0).toUpperCase()+D.name.slice(1)}),Ne(vs,{children:[ee(Jr,{children:t===\"volume\"?`${B?.toFixed(1)} (${L}%)`:`${Y(B??0,D.currencyCode,j(i))} (${L}%)`}),M?ee(ks,{direction:xt(M),\"data-testid\":`category-legend-trend-${W}`,\"aria-label\":M,children:k(xt(M))}):null]})]})]},D.id)})})]})]})},qr=Po.memo(sm);qr.displayName=\"TopCategoriesPieChart\";import{jsx as Ft,jsxs as ao}from\"react/jsx-runtime\";var pm=[],cm=[],um=[],mm=[],nn=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:l=!1,error:s,shopTitle:d,className:b,dateRange:g=qe,market:c=\"all\",productSort:f=\"units\",signupView:x=\"all\",conversionFilter:C=\"all\",categorySort:S=\"revenue\",categoriesSummaryChangePct:h,conversionSummaryChangePct:O,markets:m,onDateRangeChange:v,onMarketChange:y,onProductSortChange:k,onSignupViewChange:F,onConversionFilterChange:R,onCategorySortChange:D,onProductsTitleClick:W,onConversionTitleClick:B,onSignupsTitleClick:L,onCategoriesToTitleClick:M,onProductsExport:u,onConversionExport:p,onSignupsExport:w,onCategoriesExport:G})=>{let T=t??pm,A=o??cm,te=n??um,P=i??mm;if(s)return Ft(Wa,{as:\"main\",className:b,\"aria-label\":a(r.ariaLabel.dashboard),children:ao(Vi,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[ao(\"strong\",{children:[a(r.error),\":\"]}),\" \",s]})});let E=X=>X?X.startsWith(\"+\")?\"up\":X.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return ao(Wa,{as:\"main\",className:b,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":l,children:[Ft(Jo,{shopTitle:d,dateRange:g,market:c,isLoading:l,stats:e,markets:m,onDateRangeChange:v,onMarketChange:y}),ao(Ni,{as:\"section\",\"data-testid\":\"stats-row\",\"aria-label\":a(r.ariaLabel.statsRow),children:[Ft(Mt,{title:a(r.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:E(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:l}),Ft(Mt,{title:a(r.defaults.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.defaults.dcSv),trendDirection:E(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:l}),Ft(Mt,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.defaults.conversionRate)}`,trendDirection:E(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:l})]}),ao(Ii,{\"data-testid\":\"widget-container\",children:[ao(_a,{\"data-testid\":\"widget-row-1\",children:[Ft(wo,{products:T,productSort:f,isLoading:l,maxProducts:5,market:c,onSortChange:k,onTitleClick:W,onExport:u}),Ft(Vr,{signupData:te,signupView:x,dateRange:g,isLoading:l,onViewChange:F,onTitleClick:L,onExport:w})]}),ao(_a,{\"data-testid\":\"widget-row-2\",children:[Ft(vo,{conversionData:A,conversionFilter:C,dateRange:g,isLoading:l,summaryChangePct:O,onFilterChange:R,onTitleClick:B,onExport:p}),Ft(qr,{categories:P,categorySort:S,isLoading:l,market:c,summaryChangePct:h,onSortChange:D,onTitleClick:M,onExport:G})]})]})]})};import se from\"react\";import lo,{useState as cn}from\"react\";import fm from\"@mui/icons-material/ArrowBack\";import hm from\"@mui/icons-material/CalendarToday\";import xm from\"@mui/icons-material/Language\";import{ColorUtils as gm,styled as He}from\"@nuskin/foundation-theme\";var{getGenomeColor:je}=gm,Ds=He(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 12px;\n`,Ps=He(\"div\")`\n display: flex;\n align-items: center;\n`,Rs=He(\"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})=>je(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})=>je(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>je(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`,Ms=He(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>je(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-start;\n gap: 16px;\n }\n`,Os=He(\"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`,Fs=He(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>je(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=He(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>je(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,$s=He(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>je(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,Ns=He(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-wrap: wrap;\n align-items: center;\n gap: 16px 24px;\n flex: 1 1 auto;\n min-width: 0;\n }\n`,Is=He(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n\n @media (max-width: 767px) {\n flex-basis: ${({$breakToNewLineOnMobile:e})=>e?\"100%\":\"auto\"};\n min-width: 0;\n }\n`,Vs=He(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>je(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,Es=He(\"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})=>je(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})=>je(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>je(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>je(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`,As=He(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 16px;\n }\n`,zs=He(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>je(e,\"N100\")};\n margin: 0;\n`;import{jsx as et,jsxs as no}from\"react/jsx-runtime\";function wt(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 Ct(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 be=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let l=s=>s?no(Vs,{children:[s===\"calendar\"&&et(hm,{}),s===\"globe\"&&et(xm,{})]}):null;return no(Ds,{\"data-testid\":\"page-header\",children:[et(Ps,{children:no(Rs,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[et(fm,{}),et(\"span\",{children:a(r.navigation.backToDashboard)})]})}),no(As,{children:[et(zs,{children:e}),et($s,{children:t})]}),no(Ms,{children:[no(Os,{children:[et(Fs,{\"data-testid\":\"page-header-title\",children:e}),et(Ls,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&et(Ns,{\"data-testid\":\"page-header-filters\",children:n.map(s=>no(Is,{$breakToNewLineOnMobile:!s.icon,children:[l(s.icon),et(Es,{id:`filter-${s.key}`,value:s.value,onChange:d=>i(s.key,d.target.value),disabled:s.disabled,\"aria-label\":`${s.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${s.key}`,children:s.options.map(d=>et(\"option\",{value:d.value,children:s.label&&s.key===\"customerType\"?`${s.label} ${d.label}`:d.label},d.value))})]},s.key))})]})]})};import ym from\"@mui/icons-material/ArrowUpward\";import wm from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as bm,styled as Lt}from\"@nuskin/foundation-theme\";var{getGenomeColor:vt}=bm,Bs=Lt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>vt(e,\"N30\")};\n`,Hs=Lt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,Ws=Lt(\"thead\")`\n background-color: ${({theme:e})=>vt(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>vt(e,\"N40\")};\n`,_s=Lt(\"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})=>vt(e,\"N20\")};\n color: ${({theme:e})=>vt(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})=>vt(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>vt(e,\"A70\")};\n outline-offset: -2px;\n }\n`,Us=Lt(\"tbody\")``,ln=Lt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>vt(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>vt(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,sn=Lt(\"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})=>vt(e,\"N70\")};\n text-align: left;\n`,Ks=Lt(sn)`\n text-align: center;\n`,Gs=Lt(\"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 st,jsxs as js}from\"react/jsx-runtime\";var dt=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:l=\"asc\",getRowKey:s})=>{let d=c=>{if(!o||!n)return;n(c,i===c&&l===\"asc\"?\"desc\":\"asc\")},b=(c,f)=>{(c.key===\"Enter\"||c.key===\" \")&&(c.preventDefault(),d(f))},g=c=>{if(i===c)return l===\"asc\"?\"ascending\":\"descending\"};return st(Bs,{\"data-testid\":\"data-table\",children:js(Hs,{children:[st(Ws,{children:st(\"tr\",{children:e.map(c=>js(_s,{scope:\"col\",sortable:o&&c.sortable,onClick:()=>c.sortable&&d(c.key),onKeyDown:f=>c.sortable&&b(f,c.key),tabIndex:o&&c.sortable?0:-1,\"aria-sort\":g(c.key),\"aria-label\":`${c.label}${c.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${c.key}`,children:[c.label,o&&c.sortable&&st(Gs,{isActive:i===c.key,children:i===c.key&&l===\"desc\"?st(wm,{}):st(ym,{})})]},c.key))})}),st(Us,{children:t.length===0?st(ln,{\"data-testid\":\"table-empty-row\",children:st(Ks,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((c,f)=>st(ln,{\"data-testid\":`table-row-${f}`,children:e.map(x=>st(sn,{\"data-testid\":`table-cell-${x.key}`,children:x.render?x.render(c[x.key],c):c[x.key]},x.key))},s?s(c,f):f))})]})})};import vm from\"@mui/icons-material/ChevronLeft\";import km from\"@mui/icons-material/ChevronRight\";import{ColorUtils as Cm,styled as Qr}from\"@nuskin/foundation-theme\";var{getGenomeColor:pt}=Cm,Ys=Qr(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,ea=Qr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?pt(e,\"A80\"):pt(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":pt(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?pt(e,\"A70\"):pt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>pt(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,ta=Qr(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>pt(e,\"N70\")};\n margin: 0 8px;\n`,dn=Qr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>pt(e,\"N20\")};\n color: ${({theme:e})=>pt(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})=>pt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>pt(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 Js,jsx as $t,jsxs as oa}from\"react/jsx-runtime\";var ct=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let l=()=>{e>1&&o(e-1)},s=()=>{e<t&&o(e+1)},d=(C,S)=>{(C.key===\"Enter\"||C.key===\" \")&&(C.preventDefault(),S())},g=(()=>{if(t<=7)return Array.from({length:t},(S,h)=>h+1);let C=[];return e<=4?C.push(1,2,3,4,5):e>=t-3?C.push(t-4,t-3,t-2,t-1,t):C.push(e-1,e,e+1),C})(),c=n?(e-1)*n+1:null,f=n?Math.min(e*n,i??1/0):null,x=a(r.pagination.goToPage);return oa(Ys,{\"data-testid\":\"pagination\",children:[$t(dn,{onClick:l,onKeyDown:C=>d(C,l),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:$t(vm,{})}),t>7&&e>4&&oa(Js,{children:[$t(ea,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${x} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),$t(ta,{children:\"...\"})]}),g.map(C=>$t(ea,{onClick:()=>o(C),isActive:e===C,\"aria-label\":`${x} ${C}`,\"aria-current\":e===C?\"page\":void 0,\"data-testid\":`pagination-page-${C}`,type:\"button\",children:C},C)),t>7&&e<t-3&&oa(Js,{children:[$t(ta,{children:\"...\"}),$t(ea,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${x} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),$t(dn,{onClick:s,onKeyDown:C=>d(C,s),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:$t(km,{})}),n&&i&&oa(ta,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[c,\"-\",f,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as Me}from\"@mui/material/styles\";import{Box as Gt,Typography as io}from\"@mui/material\";import{ColorUtils as Tm}from\"@nuskin/foundation-theme\";var{getGenomeColor:Zs}=Tm,ve=Me(Gt)`\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`,ra=Me(Gt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Zs(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`,aa=Me(Gt)`\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`,na=Me(io)`\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`,ia=Me(Gt)`\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`,ty=Me(io)`\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`,la=Me(Gt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,jt=Me(\"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`,oy=Me(Gt)`\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`,Yt=Me(Gt)`\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: ${Zs(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,ry=Me(Gt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,Jt=Me(io)`\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`,Xs=Me(io)`\n font-weight: 600;\n font-size: 14px;\n`,qs=Me(io)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Qs=Me(io)`\n font-size: 13px;\n`,ed=Me(io)`\n font-size: 13px;\n color: ${({theme:e,status:t})=>t===\"Active\"?e.palette.success.main:e.palette.warning.main};\n`;import{styled as Oe}from\"@mui/material/styles\";import{Box as Zt,Typography as Xt}from\"@mui/material\";import{ColorUtils as Sm}from\"@nuskin/foundation-theme\";var{getGenomeColor:pn}=Sm,td=Oe(Zt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,od=Oe(Xt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,rd=Oe(Xt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,sa=Oe(Xt)`\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})=>pn(e,\"N70\")};\n`,ad=Oe(Zt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,nd=Oe(Zt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,id=Oe(Zt)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>pn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,ld=Oe(Zt)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,sd=Oe(Xt)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,dd=Oe(Zt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,pd=Oe(Xt)`\n font-size: 0.875rem;\n font-weight: 600;\n`,cd=Oe(Xt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ud=Oe(Zt)`\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`,da=Oe(Zt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,pa=Oe(Xt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,ca=Oe(Xt)`\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})=>pn(e,\"N70\")};\n`;import Dm from\"@mui/material/useMediaQuery\";var Pm=\"(max-width:767px)\";function kt(){return Dm(Pm,{noSsr:!0})}import{jsx as ce,jsxs as tt}from\"react/jsx-runtime\";function Rm(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 rr=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:l=!1,onBack:s,onDateRangeChange:d,onMarketChange:b,onProductSortChange:g})=>{let[c,f]=cn(1),[x,C]=cn(n===\"revenue\"?\"revenue\":\"units\"),[S,h]=cn(\"desc\"),O=10,m=kt(),v=lo.useCallback(()=>s?.(),[s]),y=Xe(i),k=lo.useMemo(()=>[wt(t,r),Ct(o,y,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"units\",label:a(r.defaults.units)},{value:\"revenue\",label:a(r.defaults.revenue)},{value:\"volume\",label:a(r.defaults.volume)}]}],[t,o,y,n]),F=lo.useCallback((p,w)=>{p===\"dateRange\"?d?.(w):p===\"market\"?b?.(w):p===\"sort\"&&(g?.(w),f(1))},[d,b,g]),R=lo.useCallback((p,w)=>{C(p),h(w),f(1)},[]),D=lo.useMemo(()=>e.map(Rm),[e]),W=lo.useMemo(()=>[...D].sort((p,w)=>{let G=p[x],T=w[x];return S===\"asc\"?G-T:T-G}),[D,x,S]),{totalPages:B,pageItems:L}=bt(W,c,O),M=e[0]?.currencyCode,u=lo.useMemo(()=>[{key:\"rank\",label:a(r.fullView.products.columns.rank),sortable:!0},{key:\"name\",label:a(r.fullView.products.columns.product),sortable:!0,render:(p,w)=>tt(td,{children:[ce(od,{children:w.name}),ce(rd,{children:w.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:p=>ce(sa,{children:Number(p).toLocaleString()})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:p=>ce(sa,{children:Y(Number(p),M,j(o))})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:p=>ce(sa,{children:Number(p).toLocaleString()})}],[M,o]);return l?tt(ve,{\"data-testid\":\"products-full-view\",children:[ce(be,{title:a(r.widget.topProducts.title),dateRange:we(t),onBack:v,filters:k,onFilterChange:F}),ce(kl,{})]}):e.length===0?tt(ve,{\"data-testid\":\"products-full-view\",children:[ce(be,{title:a(r.widget.topProducts.title),dateRange:we(t),onBack:v,filters:k,onFilterChange:F}),ce(Jt,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):tt(ve,{\"data-testid\":\"products-full-view\",children:[ce(be,{title:a(r.widget.topProducts.title),dateRange:we(t),onBack:v,filters:k,onFilterChange:F}),m?ce(ad,{\"data-testid\":\"products-fullview-mobile-cards\",children:L.map(p=>tt(id,{children:[tt(ld,{children:[tt(sd,{children:[\"#\",p.rank]}),tt(dd,{children:[ce(pd,{children:p.name}),ce(cd,{children:p.sku})]})]}),tt(ud,{children:[tt(da,{children:[ce(pa,{children:a(r.defaults.units)}),ce(ca,{children:p.units.toLocaleString()})]}),tt(da,{children:[ce(pa,{children:a(r.defaults.revenue)}),ce(ca,{children:Y(p.revenue,M,j(o))})]}),tt(da,{children:[ce(pa,{children:a(r.defaults.volume)}),ce(ca,{children:p.volume.toLocaleString()})]})]})]},p.rank))}):ce(nd,{\"data-testid\":\"products-fullview-desktop-table\",children:ce(dt,{columns:u,data:L,sortable:!0,onSort:R,sortColumn:x,sortDirection:S,getRowKey:p=>p.rank})}),B>1&&ce(ct,{currentPage:c,totalPages:B,onPageChange:f,itemsPerPage:O,totalItems:W.length})]})};import Ye,{useState as $m}from\"react\";import{LineChart as Nm,Line as Ld,XAxis as Im,YAxis as Vm,CartesianGrid as Em,Tooltip as Am,ResponsiveContainer as zm}from\"recharts\";import Bm from\"@mui/icons-material/ArrowUpward\";import Hm from\"@mui/icons-material/ArrowDownward\";var Mm=\"rate__\",Om={retail:\"#2e7d32\",member:\"#ed6c02\"},md=[\"#1976d2\",\"#9c27b0\",\"#00897b\",\"#c2185b\"];function un(e){return`${Mm}${e}`}function mn(e,t){return Om[e.toLowerCase()]??md[t%md.length]}function gd(e){let t=[];return e.forEach(o=>{Object.keys(o.ratesByPriceType??{}).forEach(n=>{t.includes(n)||t.push(n)})}),t.sort((o,n)=>o.localeCompare(n))}function gn(e,t){let o={};return t.forEach(n=>{o[un(n)]=e.ratesByPriceType?.[n]??0}),{...e,...o}}import{styled as ue}from\"@mui/material/styles\";import{Box as ot,Typography as ar}from\"@mui/material\";import{ColorUtils as Fm}from\"@nuskin/foundation-theme\";var{getGenomeColor:Lm}=Fm,fd=ue(na)`\n margin-right: 6px;\n`,hd=ue(ot)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,xd=ue(ot)`\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})=>Lm(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,bd=ue(ot)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,yd=ue(ot)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,wd=ue(ar)`\n font-size: 1rem;\n font-weight: 600;\n`,Cd=ue(ar)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,vd=ue(\"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`,kd=ue(ot)`\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`,ua=ue(ot)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,ma=ue(ar)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ga=ue(ar)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Td=ue(ot)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Sd=ue(ot)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Dd=ue(ot)`\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`,Pd=ue(ot)`\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`,fn=ue(ot)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({$color:e})=>e??\"inherit\"};\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`,Oy=ue(ar)`\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`,Rd=ue(\"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`,Md=ue(\"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`,Od=ue(\"span\")`\n margin-left: 2px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 400;\n font-size: 12px;\n line-height: 16px;\n letter-spacing: 0.01em;\n color: #5f5f5f;\n`,Fd=ue(ot)`\n display: flex;\n align-items: center;\n gap: 0;\n flex-wrap: wrap;\n`;import{jsx as K,jsxs as ke}from\"react/jsx-runtime\";var nr=({conversionData:e,priceTypeTrend:t,orders:o,summaryRate:n,summaryChangePct:i,dateRange:l,market:s,conversionFilter:d,markets:b,orderColumnsVariant:g=\"default\",isLoading:c=!1,onBack:f,onDateRangeChange:x,onMarketChange:C,onConversionFilterChange:S})=>{let[h,O]=$m(1),m=10,v=kt(),y=Ye.useCallback(()=>f?.(),[f]),k=Xe(b),F=Ye.useMemo(()=>Ir(e,d),[e,d]),R=Ye.useMemo(()=>d===\"all\"?gd(t??[]):[],[d,t]),D=Ye.useMemo(()=>R.length>0?(t??[]).map(P=>gn(P,R)):F.map(P=>gn(P,R)),[R,t,F]),W=Ye.useMemo(()=>typeof n==\"number\"&&Number.isFinite(n)?n:F.at(-1)?.rate??0,[n,F]),B=Ye.useMemo(()=>{if(i!==void 0){if(i===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let Re=\"neutral\";return i>0?Re=\"up\":i<0&&(Re=\"down\"),{direction:Re,value:`${i>=0?\"+\":\"\"}${i.toFixed(1)}%`}}if(F.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let P=F.at(-1)?.rate??0,E=F[0].rate;if(E===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let X=(P-E)/E*100;if(Math.abs(X)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let I=\"neutral\";return X>0?I=\"up\":X<0&&(I=\"down\"),{direction:I,value:`${X>=0?\"+\":\"\"}${X.toFixed(1)}%`}},[i,F]),L=Ye.useCallback(P=>P===\"retail\"?a(r.filter.conversionType.retail):P===\"member\"?a(r.filter.conversionType.member):a(r.filter.conversionType.all),[]),M=Ye.useMemo(()=>L(d),[d,L]),u=Ye.useMemo(()=>[wt(l,r),Ct(s,k,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:d,options:[{value:\"all\",label:a(r.filter.conversionType.all)},{value:\"retail\",label:a(r.filter.conversionType.retail)},{value:\"member\",label:a(r.filter.conversionType.member)}]}],[d,l,s,k]),p=Ye.useCallback((P,E)=>{P===\"dateRange\"?x?.(E):P===\"market\"?C?.(E):P===\"customerType\"&&(S?.(E),O(1))},[S,x,C]),w=Ye.useMemo(()=>d===\"all\"?o:o.filter(P=>P.priceType?.toLowerCase()===d),[o,d]),{totalPages:G,pageItems:T}=bt(w,h,m),A=Ye.useMemo(()=>{let P=g===\"sv\";return[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:E=>K(Rd,{children:E})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},...P?[]:[{key:\"customerType\",label:a(r.defaults.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:(E,X)=>Y(Number(E),X.currencyCode,j(s),2)},{key:\"bv\",label:a(P?r.fullView.conversionRate.columns.totalSv:r.fullView.conversionRate.columns.bv),sortable:!0}]},[s,g]),te=Ye.useCallback(()=>d===\"retail\"?\"#2e7d32\":d===\"member\"?\"#ed6c02\":\"#1976d2\",[d]);return c?ke(ve,{\"data-testid\":\"conversion-rate-full-view\",children:[K(be,{title:a(r.defaults.conversionRate),dateRange:we(l),onBack:y,filters:u,onFilterChange:p}),K(Bt,{})]}):ke(ve,{\"data-testid\":\"conversion-rate-full-view\",children:[K(be,{title:a(r.defaults.conversionRate),dateRange:we(l),onBack:y,filters:u,onFilterChange:p}),ke(ra,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[K(aa,{children:ke(Fd,{children:[ke(fd,{\"data-testid\":\"conversion-rate-value\",children:[W.toFixed(1),\"%\"]}),ke(ia,{direction:B.direction,\"data-testid\":\"conversion-rate-trend\",children:[B.direction===\"up\"&&K(Bm,{}),B.direction===\"down\"&&K(Hm,{}),K(Md,{children:B.value}),K(Od,{children:Ot(l)})]})]})}),K(la,{children:ke(Dd,{children:[K(hd,{\"data-testid\":\"conversion-fullview-chart\",children:K(zm,{width:\"100%\",height:\"100%\",children:ke(Nm,{data:D,margin:{top:10,right:10,left:0,bottom:0},children:[K(Em,{strokeDasharray:\"3 3\"}),K(Im,{dataKey:\"date\"}),K(Vm,{tickFormatter:P=>`${P}%`,domain:[0,\"auto\"]}),K(Am,{formatter:P=>typeof P==\"number\"?`${P.toFixed(2)}%`:typeof P==\"string\"?P:a(r.fullView.conversionRate.notAvailable)}),R.length>0?R.map((P,E)=>K(Ld,{type:\"monotone\",dataKey:un(P),stroke:mn(P,E),strokeWidth:2,name:P,dot:!1},P)):K(Ld,{type:\"monotone\",dataKey:\"rate\",stroke:te(),strokeWidth:2,name:`${a(r.defaults.conversionRate)} (${M})`,dot:!1})]})})}),K(Pd,{children:R.length>0?R.map((P,E)=>K(fn,{$color:mn(P,E),children:P},P)):K(fn,{$color:te(),children:`${a(r.defaults.conversionRate)} (${M})`})})]})})]}),ke(Yt,{\"data-testid\":\"conversion-fullview-table-section\",children:[ke(jt,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",w.length,\")\"]}),v?K(Td,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:T.map(P=>ke(xd,{children:[ke(bd,{children:[ke(yd,{children:[K(wd,{children:P.customerName}),K(Cd,{children:P.date})]}),K(vd,{children:P.orderId})]}),ke(kd,{children:[ke(ua,{children:[K(ma,{children:a(r.fullView.conversionRate.columns.items)}),K(ga,{children:P.items})]}),ke(ua,{children:[K(ma,{children:a(r.fullView.conversionRate.columns.total)}),ke(ga,{children:[\"$\",P.total.toFixed(2)]})]}),ke(ua,{children:[K(ma,{children:a(r.fullView.conversionRate.columns.totalSv)}),K(ga,{children:P.bv})]})]})]},P.orderId))}):K(Sd,{\"data-testid\":\"conversion-fullview-desktop-table\",children:K(dt,{columns:A,data:T,getRowKey:P=>P.orderId})}),G>1&&K(ct,{currentPage:h,totalPages:G,onPageChange:O,itemsPerPage:m,totalItems:w.length})]})]})};import po,{useState as Km}from\"react\";import{Box as Gm}from\"@mui/material\";import{LineChart as jm,Line as co,XAxis as Ym,YAxis as Jm,CartesianGrid as Zm,Tooltip as Xm,ResponsiveContainer as qm}from\"recharts\";import Qm from\"@mui/icons-material/TrendingUp\";import eg from\"@mui/icons-material/TrendingDown\";import{styled as ut}from\"@mui/material/styles\";import{Box as so,Typography as Wm}from\"@mui/material\";import{ColorUtils as _m}from\"@nuskin/foundation-theme\";var{getGenomeColor:Um}=_m,$d=ut(so)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Nd=ut(so)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Id=ut(so)`\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})=>Um(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,Vd=ut(so)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,Ed=ut(Wm)`\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`,Ad=ut(so)`\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`,ir=ut(so)`\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`,qt=ut(so,{shouldForwardProp:e=>e!==\"$legendColor\"})`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({$legendColor:e,theme:t})=>e??t.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`,zd=ut(\"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`,Bd=ut(\"span\")`\n font-weight: 600;\n line-height: 1;\n`,Hd=ut(\"span\")`\n font-weight: 400;\n line-height: 1;\n`;import{Fragment as Wd,jsx as V,jsxs as Ie}from\"react/jsx-runtime\";var We={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function Qt(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 tg(e){if(e==null||typeof e!=\"object\")return[];if(Array.isArray(e))return e;let t=e;return Array.isArray(t.daily)?t.daily.map(o=>({date:String(o.date??\"\"),total:Qt(o.total),members:Qt(o.members),retail:Qt(o.retail),brandAffiliates:Qt(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var hn=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:l,isLoading:s=!1,onBack:d,onDateRangeChange:b,onMarketChange:g,onSignupViewChange:c})=>{let[f,x]=Km(1),C=10,S=kt(),h=po.useCallback(()=>d?.(),[d]),O=Xe(l),m=po.useMemo(()=>tg(e).map(M=>{let u=M,p=Qt(u.members),w=Qt(u.retail),G=Qt(u.brandAffiliates??u.brandAffiliate??u.brand_affiliates??u.brand_affiliate),T=Qt(u.total??u.all??u.signupTotal??u.value);return{...M,total:T>0?T:p+w+G,members:p,retail:w,brandAffiliates:G}}),[e]),v=po.useMemo(()=>{if(m.length===0)return 0;let L=m[m.length-1];return _t(L,i)},[m,i]),y=po.useMemo(()=>{if(m.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let L=_t(m[0],i),M=_t(m[m.length-1],i);if(L<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let u=M-L,p=u/L*100,w=\"neutral\";return p>0?w=\"up\":p<0&&(w=\"down\"),{direction:w,absoluteChange:Math.round(u),percentageChange:`${p>=0?\"+\":\"\"}${p.toFixed(1)}%`}},[m,i,r]),k=m.length>0,F=po.useMemo(()=>[wt(o,r),Ct(n,O,r),{key:\"signupView\",label:a(r.filter.signupView.label),value:i,options:[{value:\"all\",label:a(r.defaults.all)},{value:\"members\",label:a(r.defaults.members)},{value:\"retail\",label:a(r.defaults.retail)},{value:\"brandAffiliates\",label:a(r.defaults.brandAffiliates)}]}],[o,n,O,i]),R=po.useCallback((L,M)=>{L===\"dateRange\"?b?.(M):L===\"market\"?g?.(M):L===\"signupView\"&&(c?.(M),x(1))},[b,g,c]),{totalPages:D,pageItems:W}=bt(t,f,C),B=po.useMemo(()=>[{key:\"id\",label:a(r.fullView.signups.columns.id),sortable:!0},{key:\"name\",label:a(r.fullView.signups.columns.name),sortable:!0,render:L=>V(zd,{children:L})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"type\",label:a(r.defaults.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 s?Ie(ve,{\"data-testid\":\"signups-full-view\",children:[V(be,{title:a(r.widget.signups.title),dateRange:we(o),onBack:h,filters:F,onFilterChange:R}),V(Bt,{})]}):Ie(ve,{\"data-testid\":\"signups-full-view\",children:[V(be,{title:a(r.widget.signups.title),dateRange:we(o),onBack:h,filters:F,onFilterChange:R}),Ie(ra,{\"data-testid\":\"signups-fullview-metric-chart\",children:[Ie(aa,{children:[V(na,{\"data-testid\":\"signups-total\",children:v.toLocaleString()}),Ie(ia,{direction:y.direction,children:[y.direction===\"up\"&&V(Qm,{}),y.direction===\"down\"&&V(eg,{}),y.direction!==\"neutral\"&&Ie(Wd,{children:[Ie(Bd,{children:[y.absoluteChange>0?\"+\":\"\",y.absoluteChange]}),V(Hd,{children:y.percentageChange})]}),y.direction===\"neutral\"&&V(\"span\",{children:y.percentageChange})]}),V(Ed,{children:Ot(o)})]}),V(la,{children:k?Ie(Ad,{children:[V(Vd,{\"data-testid\":\"signups-fullview-chart\",children:V(qm,{width:\"100%\",height:\"100%\",minHeight:240,children:Ie(jm,{data:m,children:[V(Zm,{strokeDasharray:\"3 3\"}),V(Ym,{dataKey:\"date\"}),V(Jm,{}),V(Xm,{}),i===\"all\"&&Ie(Wd,{children:[V(co,{type:\"monotone\",dataKey:\"total\",stroke:We.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),V(co,{type:\"monotone\",dataKey:\"members\",stroke:We.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),V(co,{type:\"monotone\",dataKey:\"retail\",stroke:We.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),V(co,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:We.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&V(co,{type:\"monotone\",dataKey:\"members\",stroke:We.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&V(co,{type:\"monotone\",dataKey:\"retail\",stroke:We.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&V(co,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:We.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),Ie(Gm,{children:[i===\"all\"&&Ie(ir,{children:[V(qt,{$legendColor:We.total,children:a(r.widget.signups.total)}),\" \",V(qt,{$legendColor:We.members,children:a(r.defaults.members)}),V(qt,{$legendColor:We.retail,children:a(r.defaults.retail)}),V(qt,{$legendColor:We.brandAffiliates,children:a(r.defaults.brandAffiliates)})]}),i===\"members\"&&V(ir,{children:V(qt,{$legendColor:We.members,children:a(r.defaults.members)})}),i===\"retail\"&&V(ir,{children:V(qt,{$legendColor:We.retail,children:a(r.defaults.retail)})}),i===\"brandAffiliates\"&&V(ir,{children:V(qt,{$legendColor:We.brandAffiliates,children:a(r.defaults.brandAffiliates)})})]})]}):V(Jt,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),Ie(Yt,{\"data-testid\":\"signups-fullview-table-section\",children:[V(jt,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),S?V($d,{\"data-testid\":\"signups-fullview-mobile-cards\",children:W.map(L=>Ie(Id,{children:[V(Xs,{children:L.name}),Ie(qs,{children:[L.date,\" - \",L.type]}),V(Qs,{children:L.email}),V(ed,{status:L.status,children:L.status})]},L.id))}):V(Nd,{\"data-testid\":\"signups-fullview-desktop-table\",children:V(dt,{columns:B,data:W,getRowKey:L=>L.id})}),D>1&&V(ct,{currentPage:f,totalPages:D,onPageChange:x,itemsPerPage:C,totalItems:t.length})]})]})};import uo,{useState as rg}from\"react\";import{PieChart as ag,Pie as ng,Cell as ig,ResponsiveContainer as lg,Tooltip as sg}from\"recharts\";import dg from\"@mui/icons-material/TrendingUp\";import pg from\"@mui/icons-material/TrendingDown\";import{styled as Ro,ColorUtils as og}from\"@nuskin/foundation-theme\";import{styled as De}from\"@mui/material/styles\";import{Box as Tt,Typography as Mo}from\"@mui/material\";var{getGenomeColor:xn}=og,fa=Ro(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,_d=Ro(\"div\")`\n flex: 1;\n`,Ud=Ro(\"span\")`\n font-weight: 600;\n`,Kd=Ro(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Gd=Ro(\"span\")`\n font-weight: 600;\n`,jd=De(Tt)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>xn(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`,Yd=De(Tt)`\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`,Jd=De(Tt)`\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 /* Donut hole shrinks on mobile (fixed 220px chart height), so the\n overlay must be narrower to avoid overlapping the colored ring. */\n @media (max-width: 767px) {\n width: 96px;\n }\n`,Zd=De(Mo)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n\n @media (max-width: 767px) {\n font-size: 0.6875rem;\n }\n`,Xd=De(Mo)`\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\n @media (max-width: 767px) {\n font-size: 1rem;\n }\n`,qd=De(Mo)`\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\n @media (max-width: 767px) {\n font-size: 0.75rem;\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n }\n`,Qd=De(Tt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,ep=De(Tt)`\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})=>xn(e,\"N30\")};\n }\n`,ha=De(Tt)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,Tw=De(Tt)`\n display: none;\n`,tp=De(Mo)`\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`,op=De(Mo)`\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`,rp=De(Mo)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,ap=De(Tt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,np=De(Tt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,ip=De(Tt)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>xn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,lp=De(\"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`,sp=Ro(\"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 cg,jsx as Z,jsxs as Pe}from\"react/jsx-runtime\";var bn=({categories:e,dateRange:t,market:o,categorySort:n,summaryChangePct:i,markets:l,isLoading:s=!1,onBack:d,onDateRangeChange:b,onMarketChange:g,onCategorySortChange:c})=>{let[f,x]=rg(1),C=10,S=kt(),h=uo.useCallback(()=>d?.(),[d]),O=Xe(l),m=uo.useMemo(()=>[wt(t,r),Ct(o,O,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.defaults.byRevenue)},{value:\"volume\",label:a(r.defaults.byVolume)}]}],[n,t,o,O]),v=uo.useCallback((T,A)=>{T===\"dateRange\"?b?.(A):T===\"market\"?g?.(A):T===\"sort\"&&(c?.(A),x(1))},[c,b,g]),y=T=>Fr(T,{fontSize:\"12\",fontWeight:\"700\"}),k=T=>T===\"up\"?Z(dg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):T===\"down\"?Z(pg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,F=T=>{if(!T)return\"neutral\";let A=Number.parseFloat(T);return Number.isNaN(A)?\"neutral\":A>0?\"up\":A<0?\"down\":\"neutral\"},R=uo.useMemo(()=>[...e].sort((T,A)=>n===\"revenue\"?A.revenue-T.revenue:(A.volume??0)-(T.volume??0)),[e,n]),{totalRevenue:D,totalVolume:W,totalRevenueTrendDirection:B,totalRevenueTrend:L}=uo.useMemo(()=>{let T=R.reduce((E,X)=>E+X.revenue,0),A=R.reduce((E,X)=>E+(X.volume??0),0),te,P;if(i!=null)Math.abs(i)<.1?(P=\"0%\",te=\"neutral\"):(te=i>0?\"up\":\"down\",P=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:E,formatted:X}=Wt(R,I=>n===\"volume\"?I.volume??0:I.revenue,I=>n===\"volume\"?I.trend?.volume:I.trend?.revenue);te=E,P=X}return{totalRevenue:T,totalVolume:A,totalRevenueTrendDirection:te,totalRevenueTrend:P}},[R,i,n]),M=uo.useMemo(()=>R.slice(0,5),[R]),{totalPages:u,pageItems:p}=bt(R,f,C),w=R[0]?.currencyCode,G=uo.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:(A,te)=>Pe(fa,{children:[Z(ha,{dotColor:te.color}),Z(sp,{children:qo(te.name)})]})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:(A,te)=>Y(Number(A),te.currencyCode,j(o))},{key:\"volume\",label:a(r.defaults.volume),sortable:!0,render:A=>`${Number(A??0).toLocaleString()} ${a(r.defaults.dcSv)}`},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:A=>`${Number(A)}%`}],[w,o]);return s?Pe(ve,{\"data-testid\":\"categories-full-view\",children:[Z(be,{title:a(r.widget.topCategories.title),dateRange:we(t),onBack:h,filters:m,onFilterChange:v}),Z(Bt,{})]}):e.length===0?Pe(ve,{\"data-testid\":\"categories-full-view\",children:[Z(be,{title:a(r.widget.topCategories.title),dateRange:we(t),onBack:h,filters:m,onFilterChange:v}),Z(Jt,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):Pe(ve,{\"data-testid\":\"categories-full-view\",children:[Z(be,{title:a(r.widget.topCategories.title),dateRange:we(t),onBack:h,filters:m,onFilterChange:v}),Pe(jd,{\"data-testid\":\"categories-fullview-top-section\",children:[Pe(Yd,{\"data-testid\":\"categories-fullview-chart\",children:[Z(lg,{width:\"100%\",height:\"100%\",children:Pe(ag,{children:[Z(ng,{data:R,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:n===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,label:y,labelLine:!1,children:R.map(T=>Z(ig,{fill:T.color},`cell-${T.id}`))}),Z(sg,{formatter:T=>Y(T,w,j(o))})]})}),Pe(Jd,{\"data-testid\":\"categories-fullview-donut-center\",children:[Z(Zd,{children:n===\"volume\"?a(r.defaults.volume):a(r.stats.revenue)}),Z(Xd,{children:n===\"volume\"?Pe(cg,{children:[W.toFixed(1),Z(\"br\",{}),a(r.defaults.dcSv)]}):Y(D,w,j(o))}),Pe(qd,{direction:B,children:[k(B),Z(\"span\",{children:L})]})]})]}),Z(Qd,{\"data-testid\":\"categories-fullview-summary\",children:M.map(T=>{let A=n===\"volume\"?T.volume:T.revenue,te=n===\"volume\"?T.volumeSharePct:T.percentage,P=n===\"volume\"?T.trend?.volume:T.trend?.revenue;return Pe(ep,{children:[Z(ha,{dotColor:T.color}),Z(tp,{children:qo(T.name)}),Z(op,{children:n===\"volume\"?(A??0).toFixed(1):Y(A??0,T.currencyCode,j(o))}),Pe(rp,{children:[\"(\",te,\"%)\"]}),P?Z(lp,{direction:F(P),children:k(F(P))}):null]},T.id)})})]}),Pe(Yt,{\"data-testid\":\"categories-fullview-table-section\",children:[Pe(jt,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",R.length,\")\"]}),S?Z(np,{children:p.map(T=>Pe(ip,{children:[Z(ha,{dotColor:T.color}),Pe(_d,{children:[Z(Ud,{children:T.name}),Z(Kd,{children:Y(T.revenue,T.currencyCode,j(o))})]}),Pe(Gd,{children:[T.percentage,\"%\"]})]},T.id))}):Z(ap,{children:Z(dt,{columns:G,data:p,sortable:!0,getRowKey:T=>T.id})}),u>1&&Z(ct,{currentPage:f,totalPages:u,onPageChange:x,itemsPerPage:C,totalItems:R.length})]})]})};import dp from\"react\";function Oo(e){dp.useEffect(()=>{if(e!==void 0)return vr(e),()=>{vr(void 0)}},[e])}var ug=({translate:e,children:t})=>(Oo(e),t??null);function mg(){return dp.useCallback(e=>Ue(e),[])}import pp from\"react\";function gg(){if(typeof window>\"u\")return;if(typeof window.scrollTo==\"function\"){window.scrollTo({top:0,left:0,behavior:\"auto\"});return}let e=window.document?.scrollingElement??window.document?.documentElement;e&&(e.scrollTop=0)}function xa(e){let t=pp.useRef(e);pp.useEffect(()=>{t.current!==e&&(t.current=e,gg())},[e])}import{jsx as lr}from\"react/jsx-runtime\";var fg=\"shoppingDashboardView\",hg=[],xg=[],bg=[],yg=[],wg=[],Cg=[];function up(e){return typeof e==\"object\"&&e!==null}function vg(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function ba(e,t){if(!up(e))return\"dashboard\";let o=e[t];return vg(o)?o:\"dashboard\"}function cp(e,t,o){return{...up(e)?e:{},[t]:o}}function kg(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Tg=({stats:e,topProducts:t,conversionData:o,conversionPriceTypeTrend:n,signupData:i,categories:l,categoriesSummaryChangePct:s,conversionSummaryChangePct:d,orders:b,signups:g,isLoading:c=!1,error:f,shopTitle:x,className:C,translate:S,initialDateRange:h=qe,initialMarket:O=\"all\",initialProductSort:m=\"units\",initialSignupView:v=\"all\",initialConversionFilter:y=\"all\",initialCategorySort:k=\"revenue\",markets:F,historyAdapter:R,historyStateKey:D=fg,resetToDashboardOnMount:W=!0,onDateRangeChange:B,onMarketChange:L,onProductSortChange:M,onSignupViewChange:u,onConversionFilterChange:p,onCategorySortChange:w,onViewChange:G,onProductsExport:T,onConversionExport:A,onSignupsExport:te,onCategoriesExport:P})=>{Oo(S);let[E,X]=se.useState(\"dashboard\");xa(E);let I=se.useRef(!1),[Re,Ee]=se.useState(h),[Je,$o]=se.useState(O),[eo,Da]=se.useState(m),[No,Pa]=se.useState(v),[Io,Ra]=se.useState(y),[Vo,Ma]=se.useState(k),Eo=t??hg,Ao=o??xg,zo=i??bg,Bo=l??yg,ur=b??wg,mr=g??Cg,he=se.useCallback(H=>{X(H),G?.(H)},[G]),Ho=se.useCallback(()=>R?ba(R.location?.state,D):typeof window>\"u\"?\"dashboard\":ba(window.history.state,D),[R,D]),_e=se.useCallback((H,at)=>{if(R){let fr=cp(R.location?.state,D,H),Mn=kg(R.location,fr);if(at===\"replace\"){R.replace(Mn);return}R.push(Mn);return}if(typeof window>\"u\")return;let ft=cp(window.history.state,D,H);if(at===\"replace\"){window.history.replaceState(ft,\"\");return}window.history.pushState(ft,\"\")},[R,D]);se.useEffect(()=>{if(W?(_e(\"dashboard\",\"replace\"),I.current=!1,he(\"dashboard\")):he(Ho()),R)return R.listen((at,ft)=>{if(ft===\"POP\"){let fr=ba(at.state,D);I.current=fr!==\"dashboard\",he(fr)}});let H=at=>{let ft=ba(at.state,D);I.current=ft!==\"dashboard\",he(ft)};return window.addEventListener(\"popstate\",H),()=>{window.removeEventListener(\"popstate\",H)}},[R,D,Ho,W,he,_e]);let Fe=se.useCallback(H=>{I.current=!0,_e(H,\"push\"),he(H)},[he,_e]),Nt=se.useCallback(()=>{if(E!==\"dashboard\"&&I.current){if(R){R.goBack();return}typeof window<\"u\"&&window.history.back();return}I.current=!1,_e(\"dashboard\",\"replace\"),he(\"dashboard\")},[E,R,he,_e]),mt=se.useCallback(H=>{Ee(H),B?.(H)},[B]),gt=se.useCallback(H=>{$o(H),L?.(H)},[L]),Wo=se.useCallback(H=>{Da(H),M?.(H)},[M]),_o=se.useCallback(H=>{Pa(H),u?.(H)},[u]),Uo=se.useCallback(H=>{Ra(H),p?.(H)},[p]),gr=se.useCallback(H=>{Ma(H),w?.(H)},[w]),Oa=se.useCallback(()=>{Fe(\"products\")},[Fe]),Fa=se.useCallback(()=>{Fe(\"conversion-rate\")},[Fe]),q=se.useCallback(()=>{Fe(\"signups\")},[Fe]),It=se.useCallback(()=>{Fe(\"categories\")},[Fe]);return E===\"products\"?lr(rr,{products:Eo,dateRange:Re,market:Je,productSort:eo,markets:F,isLoading:c,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onProductSortChange:Wo}):E===\"conversion-rate\"?lr(nr,{conversionData:Ao,priceTypeTrend:n,orders:ur,dateRange:Re,market:Je,conversionFilter:Io,markets:F,isLoading:c,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onConversionFilterChange:Uo}):E===\"signups\"?lr(hn,{signupData:zo,signups:mr,dateRange:Re,market:Je,signupView:No,markets:F,isLoading:c,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onSignupViewChange:_o}):E===\"categories\"?lr(bn,{categories:Bo,dateRange:Re,market:Je,categorySort:Vo,summaryChangePct:s,markets:F,isLoading:c,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onCategorySortChange:gr}):lr(nn,{stats:e,topProducts:Eo,conversionData:Ao,signupData:zo,categories:Bo,categoriesSummaryChangePct:s,conversionSummaryChangePct:d,isLoading:c,error:f,shopTitle:x,className:C,dateRange:Re,market:Je,productSort:eo,signupView:No,conversionFilter:Io,categorySort:Vo,markets:F,onDateRangeChange:mt,onMarketChange:gt,onProductSortChange:Wo,onSignupViewChange:_o,onConversionFilterChange:Uo,onCategorySortChange:gr,onProductsTitleClick:Oa,onConversionTitleClick:Fa,onSignupsTitleClick:q,onCategoriesToTitleClick:It,onProductsExport:T,onConversionExport:A,onSignupsExport:te,onCategoriesExport:P})};import{styled as sr}from\"@nuskin/foundation-theme\";var yn=sr(\"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`,mp=sr(\"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`,gp=sr(\"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`,fp=sr(\"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`,hp=sr(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import wn from\"react\";import{PieChart as Sg,Pie as Dg,Cell as Pg,ResponsiveContainer as Rg,Tooltip as Mg}from\"recharts\";var $={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\"},byVolume:{key:\"productOfferDashboard.filter.offerSort.byVolume\",fallback:\"Volume\"}},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\"},totalVolume:{key:\"productOfferDashboard.widget.topPerformingOffers.totalVolume\",fallback:\"Total volume\"},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:\"--\"},byRevenue:{key:\"productOfferDashboard.defaults.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.defaults.byUnits\",fallback:\"Units\"},byVolume:{key:\"productOfferDashboard.defaults.byVolume\",fallback:\"Volume\"},volume:{key:\"productOfferDashboard.defaults.volume\",fallback:\"Volume\"},dcSv:{key:\"productOfferDashboard.defaults.dcSv\",fallback:\"DC-SV\"}}};function N(e){return Ue(e)}import{jsx as me,jsxs as rt}from\"react/jsx-runtime\";var Og=({offers:e,offerSort:t,isLoading:o=!1,title:n,market:i,onSortChange:l,onTitleClick:s,onExport:d})=>{let b=wn.useCallback(h=>{let O=h.target.value;l?.(O)},[l]),{sortedOffers:g,totalRevenue:c,totalVolume:f,trendDirection:x,formattedTrend:C}=wn.useMemo(()=>{let h=[...e].sort((k,F)=>t===\"revenue\"?F.revenue-k.revenue:(F.volume??0)-(k.volume??0)),O=h.reduce((k,F)=>k+F.revenue,0),m=h.reduce((k,F)=>k+(F.volume??0),0),{direction:v,formatted:y}=Wt(h,k=>t===\"volume\"?k.volume??0:k.revenue,k=>t===\"volume\"?k.trend?.volume:k.trend?.revenue);return{sortedOffers:h,totalRevenue:O,totalVolume:m,trendDirection:v,formattedTrend:y}},[e,t]),S=g[0]?.currencyCode;return o&&e.length===0?me(Kt,{\"data-testid\":\"widget-top-offers\",children:me(Rr,{})}):e.length===0?rt(Kt,{\"data-testid\":\"widget-top-offers\",children:[me(So,{children:me(Do,{children:n??N($.widget.topPerformingOffers.title)})}),me(Zr,{\"data-testid\":\"top-offers-empty-state\",children:me(Xr,{children:N($.widget.topPerformingOffers.emptyState)})})]}):rt(Kt,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":N($.ariaLabel.topOffers),children:[rt(So,{children:[me(Do,{as:\"button\",onClick:s,\"aria-label\":N($.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??N($.widget.topPerformingOffers.title)}),rt(Er,{children:[rt(ys,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:b,disabled:o,\"aria-label\":N($.ariaLabel.topOffers),children:[me(\"option\",{value:\"revenue\",children:N($.defaults.byRevenue)}),me(\"option\",{value:\"volume\",children:N($.defaults.byVolume)})]}),me(lt,{widgetId:\"top-offers\",onFullView:s,onExport:d})]})]}),rt(Ar,{children:[rt(zr,{\"data-testid\":\"top-offers-chart\",children:[me(Rg,{width:\"100%\",height:\"100%\",children:rt(Sg,{children:[me(Dg,{data:g,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:t===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,children:g.map(h=>me(Pg,{fill:h.color},`cell-${h.id}`))}),me(Mg,{formatter:h=>t===\"volume\"?`${h.toFixed(1)} ${N($.defaults.dcSv)}`:Y(h,S,j(i))})]})}),rt(Br,{\"data-testid\":\"top-offers-donut-center\",children:[me(Hr,{children:t===\"volume\"?N($.widget.topPerformingOffers.totalVolume):N($.widget.topPerformingOffers.totalRevenue)}),me(Wr,{children:t===\"volume\"?`${f.toFixed(1)} ${N($.defaults.dcSv)}`:Y(c,S,j(i))}),me(_r,{direction:x,children:C})]})]}),me(Ur,{\"data-testid\":\"top-offers-legend-container\",children:g.map((h,O)=>{let m=t===\"volume\"?h.trend?.volume:h.trend?.revenue,v=t===\"volume\"?h.volumeSharePct??h.percentage:h.percentage,y=xt(m);return rt(Kr,{\"data-testid\":`offer-legend-${O}`,children:[me(Gr,{color:h.color}),rt(jr,{children:[me(Yr,{children:qo(h.name)}),me(Jr,{children:t===\"volume\"?`${(h.volume??0).toFixed(1)} ${N($.defaults.dcSv)}`:Y(h.revenue,h.currencyCode,j(i))})]}),rt(Cs,{children:[v,\"%\"]}),m?me(Ts,{direction:y,\"data-testid\":`offer-legend-trend-${O}`,\"aria-label\":m,children:Ke(y)}):null]},h.id)})})]})]})},ya=wn.memo(Og);ya.displayName=\"TopPerformingOffersPieChart\";import wa from\"react\";var Fg=/[\\\\/?*[\\]:]/g;function xp(e){let t=e.trim(),o=t.length>0?t:\"export\";return o.toLowerCase().endsWith(\".xlsx\")?o:`${o}.xlsx`}function bp(e){let t=e.replace(Fg,\" \").trim();return(t.length>0?t:\"Export\").slice(0,31)}async function dr({rows:e,columns:t,fileName:o,sheetName:n}){let{Workbook:i}=await import(\"exceljs\"),l=new i,s=l.addWorksheet(bp(n));s.columns=t.map(b=>({header:b.header,key:b.header})),e.forEach(b=>{let g={};t.forEach(c=>{g[c.header]=c.value(b)??\"\"}),s.addRow(g)});let d=await l.xlsx.writeBuffer();Lg(d,xp(o))}function Lg(e,t){let o=new Blob([new Uint8Array(e)],{type:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"}),n=URL.createObjectURL(o),i=document.createElement(\"a\");i.href=n,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(n)}var $g=[{header:\"Rank\",value:e=>e.rank},{header:\"Product ID\",value:e=>e.id},{header:\"Product Name\",value:e=>e.name},{header:\"Units Sold\",value:e=>e.unitsSold},{header:\"Total Revenue\",value:e=>e.revenue},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Volume DC-SV\",value:e=>e.volume},{header:\"Trend\",value:e=>e.trend?.units??e.trend?.revenue??e.trend?.volume}],Ng=[{header:\"Offer ID\",value:e=>e.id},{header:\"Offer Name\",value:e=>e.name},{header:\"Total Revenue\",value:e=>e.revenue},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Total Volume\",value:e=>e.volume??e.units},{header:\"Share %\",value:e=>e.percentage},{header:\"Trend\",value:e=>e.trend?.revenue??e.trend?.units}],Ig=[{header:\"Order ID\",value:e=>e.orderId},{header:\"Date\",value:e=>e.date},{header:\"Customer\",value:e=>e.customerName},{header:\"Items\",value:e=>e.items},{header:\"Total\",value:e=>e.total},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Total SV\",value:e=>e.bv}];function Cn(e){return dr({rows:e,columns:$g,fileName:\"top-selling-products\",sheetName:\"Top Selling Products\"})}function vn(e){return dr({rows:e,columns:Ng,fileName:\"top-performing-offers\",sheetName:\"Top Performing Offers\"})}function yp(e){return dr({rows:e,columns:Ig,fileName:\"conversion-rate-orders\",sheetName:\"Order Details\"})}function kn({topProducts:e,topOffers:t,orders:o,conversionFilter:n=\"all\",topProductsExportData:i,topOffersExportData:l,conversionExportData:s,showTopProductsExportOption:d=!0,showTopOffersExportOption:b=!0,showConversionExportOption:g=!0,isLoading:c=!1}){let f=i??e,x=l??t,C=s??o??[],S=wa.useMemo(()=>n===\"all\"?C:C.filter(F=>F.priceType?.toLowerCase()===n),[C,n]),h=d&&!c&&f.length>0,O=b&&!c&&x.length>0,m=g&&!c&&S.length>0,v=wa.useCallback(()=>Cn(f),[f]),y=wa.useCallback(()=>vn(x),[x]),k=wa.useCallback(()=>yp(S),[S]);return{onTopProductsExport:h?v:void 0,onTopOffersExport:O?y:void 0,onConversionExport:m?k:void 0}}import{jsx as mo,jsxs as Fo}from\"react/jsx-runtime\";var Vg=[],Eg=[],Ag=[],Tn=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:l,dashboardTitle:s,className:d,dateRange:b=qe,market:g=\"all\",productSort:c=\"units\",conversionFilter:f=\"all\",offerSort:x=\"revenue\",conversionSummaryRate:C,conversionSummaryChangePct:S,orders:h,topProductsExportData:O,topOffersExportData:m,conversionExportData:v,showTopProductsExportOption:y=!0,showTopOffersExportOption:k=!0,showConversionExportOption:F=!0,markets:R,onDateRangeChange:D,onMarketChange:W,onProductSortChange:B,onConversionFilterChange:L,onOfferSortChange:M,onProductsTitleClick:u,onConversionTitleClick:p,onOffersTitleClick:w})=>{let G=t??Vg,T=o??Eg,A=n??Ag,{onTopProductsExport:te,onTopOffersExport:P,onConversionExport:E}=kn({topProducts:G,topOffers:A,orders:h,conversionFilter:f,topProductsExportData:O,topOffersExportData:m,conversionExportData:v,showTopProductsExportOption:y,showTopOffersExportOption:k,showConversionExportOption:F,isLoading:i}),X=I=>I?I.startsWith(\"+\")&&I!==\"+0%\"?\"up\":I.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return l?mo(yn,{as:\"main\",className:d,\"aria-label\":N($.ariaLabel.dashboard),children:Fo(hp,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Fo(\"strong\",{children:[N($.error),\":\"]}),\" \",l]})}):Fo(yn,{as:\"main\",className:d,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":N($.ariaLabel.dashboard),\"aria-busy\":i,children:[mo(Jo,{shopTitle:s??N($.title),dateRange:b,market:g,isLoading:i,markets:R,stats:e?{shopTitle:e.shopTitle??\"\",dateRange:e.dateRange,selectedMarket:e.selectedMarket,metrics:{revenue:e.metrics.revenue,volume:\"\",siteVisits:\"\",conversionRate:e.metrics.conversionRate},trend:e.trend??{}}:void 0,onDateRangeChange:D,onMarketChange:W}),Fo(mp,{\"data-testid\":\"top-charts-row\",children:[mo(vo,{conversionData:T,conversionFilter:f,dateRange:b,isLoading:i,summaryRate:C,summaryChangePct:S,onFilterChange:L,onTitleClick:p,onExport:E}),Fo(gp,{\"data-testid\":\"stats-card-stack\",children:[mo(Mt,{layout:\"split\",title:N($.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:X(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:N($.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),mo(Mt,{layout:\"split\",title:N($.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:X(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:N($.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Fo(fp,{\"data-testid\":\"bottom-charts-row\",children:[mo(wo,{products:G,productSort:c,isLoading:i,maxProducts:5,market:g,onSortChange:B,onTitleClick:u,onExport:te}),mo(ya,{offers:A,offerSort:x,isLoading:i,market:g,onSortChange:M,onTitleClick:w,onExport:P})]})]})};import fe from\"react\";import go,{useState as Bg}from\"react\";import{PieChart as Hg,Pie as Wg,Cell as _g,ResponsiveContainer as Ug,Tooltip as Kg}from\"recharts\";import{styled as re}from\"@mui/material/styles\";import{Box as Ve,Typography as St}from\"@mui/material\";import{ColorUtils as zg}from\"@nuskin/foundation-theme\";var{getGenomeColor:Sn}=zg,wp=re(Ve)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Sn(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`,Cp=re(Ve)`\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`,vp=re(Ve)`\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`,kp=re(St)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Tp=re(St)`\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`,Sp=re(St)`\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`,Dp=re(Ve)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,Pp=re(Ve)`\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})=>Sn(e,\"N30\")};\n }\n`,Ca=re(Ve)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,Rp=re(Ve)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,Mp=re(St)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Op=re(St)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Fp=re(St)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,Lp=re(Ve)`\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`,$p=re(Ve)`\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`,Np=re(Ve)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Ip=re(Ve)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Vp=re(Ve)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Sn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Ep=re(Ve)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ap=re(St)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,zp=re(Ve)`\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`,pr=re(Ve)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,cr=re(St)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,va=re(St)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Bp=re(St)`\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 Gg,jsx as U,jsxs as pe}from\"react/jsx-runtime\";var Dn=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:l=!1,onBack:s,onDateRangeChange:d,onMarketChange:b,onOfferSortChange:g})=>{let[c,f]=Bg(1),x=10,C=kt(),S=go.useCallback(()=>s?.(),[s]),h=Xe(i),O=go.useMemo(()=>[wt(t,$),Ct(o,h,$),{key:\"sort\",label:N($.defaults.byRevenue),value:n,options:[{value:\"revenue\",label:N($.defaults.byRevenue)},{value:\"volume\",label:N($.defaults.byVolume)}]}],[t,o,h,n]),m=go.useCallback((u,p)=>{u===\"dateRange\"?d?.(p):u===\"market\"?b?.(p):u===\"sort\"&&(g?.(p),f(1))},[g,d,b]),v=go.useMemo(()=>[...e].sort((u,p)=>n===\"revenue\"?p.revenue-u.revenue:(p.volume??0)-(u.volume??0)),[e,n]),{totalRevenue:y,totalVolume:k,totalRevenueTrendDirection:F,totalRevenueTrend:R}=go.useMemo(()=>{let u=v.reduce((T,A)=>T+A.revenue,0),p=v.reduce((T,A)=>T+(A.volume??0),0),{direction:w,formatted:G}=Wt(v,T=>n===\"volume\"?T.volume??0:T.revenue,T=>n===\"volume\"?T.trend?.volume:T.trend?.revenue);return{totalRevenue:u,totalVolume:p,totalRevenueTrendDirection:w,totalRevenueTrend:G}},[v,n]),D=go.useMemo(()=>v.slice(0,5),[v]),{totalPages:W,pageItems:B}=bt(v,c,x),L=go.useMemo(()=>[{key:\"name\",label:N($.fullView.topOffers.columnName),sortable:!0,render:(u,p)=>pe(fa,{children:[U(Ca,{dotColor:p.color}),U(\"span\",{children:p.name})]})},{key:\"revenue\",label:N($.fullView.topOffers.columnRevenue),sortable:!0,render:(u,p)=>Y(Number(u),p.currencyCode,j(o))},{key:\"volume\",label:N($.defaults.volume),sortable:!0,render:u=>`${Number(u??0).toLocaleString()} ${N($.defaults.dcSv)}`},{key:\"percentage\",label:N($.fullView.topOffers.columnPercentage),sortable:!0,render:u=>`${Number(u)}%`},{key:\"trend\",label:N($.fullView.topOffers.columnTrend),render:(u,p)=>{if(!p.trend?.revenue)return N($.defaults.noData);let w=xt(p.trend.revenue);return pe($p,{direction:w,children:[Ke(w),U(\"span\",{children:p.trend.revenue})]})}}],[o]),M=v[0]?.currencyCode;return l?pe(ve,{\"data-testid\":\"top-offers-full-view\",children:[U(be,{title:N($.fullView.topOffers.title),dateRange:we(t),onBack:S,filters:O,onFilterChange:m}),U(Bt,{})]}):e.length===0?pe(ve,{\"data-testid\":\"top-offers-full-view\",children:[U(be,{title:N($.fullView.topOffers.title),dateRange:we(t),onBack:S,filters:O,onFilterChange:m}),U(Jt,{\"data-testid\":\"top-offers-fullview-empty\",children:N($.widget.topPerformingOffers.emptyState)})]}):pe(ve,{\"data-testid\":\"top-offers-full-view\",children:[U(be,{title:N($.fullView.topOffers.title),dateRange:we(t),onBack:S,filters:O,onFilterChange:m}),pe(wp,{\"data-testid\":\"top-offers-fullview-top-section\",children:[pe(Cp,{\"data-testid\":\"top-offers-fullview-chart\",children:[U(Ug,{width:\"100%\",height:\"100%\",children:pe(Hg,{children:[U(Wg,{data:v,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:n===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,children:v.map(u=>U(_g,{fill:u.color},`cell-${u.id}`))}),U(Kg,{formatter:u=>n===\"volume\"?`${u.toFixed(1)} ${N($.defaults.dcSv)}`:Y(u,M,j(o))})]})}),pe(vp,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[U(kp,{children:n===\"volume\"?N($.widget.topPerformingOffers.totalVolume):N($.widget.topPerformingOffers.totalRevenue)}),U(Tp,{children:n===\"volume\"?`${k.toFixed(1)} ${N($.defaults.dcSv)}`:Y(y,M,j(o))}),U(Sp,{direction:F,children:R})]})]}),U(Dp,{\"data-testid\":\"top-offers-fullview-summary\",children:D.map(u=>{let p=n===\"volume\"?u.trend?.volume:u.trend?.revenue,w=n===\"volume\"?u.volumeSharePct??u.percentage:u.percentage,G=xt(p);return pe(Pp,{children:[U(Ca,{dotColor:u.color}),pe(Rp,{children:[U(Mp,{children:u.name}),U(Op,{children:n===\"volume\"?`${(u.volume??0).toFixed(1)} ${N($.defaults.dcSv)}`:Y(u.revenue,u.currencyCode,j(o))})]}),pe(Fp,{children:[w,\"%\"]}),p?U(Lp,{direction:G,\"aria-label\":p,children:Ke(G)}):null]},u.id)})})]}),pe(Yt,{\"data-testid\":\"top-offers-table\",children:[pe(jt,{\"data-testid\":\"top-offers-fullview-table-title\",children:[N($.fullView.topOffers.title),\" (\",v.length,\")\"]}),C?U(Ip,{children:B.map(u=>{let p=Or(u.trend?.revenue),w=\"neutral\";return p!==null&&p>0?w=\"up\":p!==null&&p<0&&(w=\"down\"),pe(Vp,{children:[pe(Ep,{children:[U(Ca,{dotColor:u.color}),U(Ap,{children:u.name})]}),pe(zp,{children:[pe(pr,{children:[U(cr,{children:N($.fullView.topOffers.columnRevenue)}),U(va,{children:Y(u.revenue,u.currencyCode,j(o))})]}),pe(pr,{children:[U(cr,{children:N($.defaults.volume)}),U(va,{children:`${Number(u.volume??0).toLocaleString()} ${N($.defaults.dcSv)}`})]}),pe(pr,{children:[U(cr,{children:N($.fullView.topOffers.columnPercentage)}),pe(va,{children:[u.percentage,\"%\"]})]}),pe(pr,{children:[U(cr,{children:N($.fullView.topOffers.columnTrend)}),U(Bp,{direction:w,children:u.trend?.revenue?pe(Gg,{children:[Ke(w),U(\"span\",{children:u.trend.revenue})]}):N($.defaults.noData)})]})]})]},u.id)})}):U(Np,{children:U(dt,{columns:L,data:B,sortable:!0,getRowKey:u=>u.id})}),W>1&&U(ct,{currentPage:c,totalPages:W,onPageChange:f,itemsPerPage:x,totalItems:v.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as Ta}from\"react/jsx-runtime\";var jg=\"productOfferDashboardView\",Yg=[],Jg=[],Zg=[],Xg=[];function Wp(e){return typeof e==\"object\"&&e!==null}function qg(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function ka(e,t){if(!Wp(e))return\"dashboard\";let o=e[t];return qg(o)?o:\"dashboard\"}function Hp(e,t,o){return{...Wp(e)?e:{},[t]:o}}function Qg(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var ef=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:l,dashboardTitle:s,className:d,allProducts:b,orders:g,allOffers:c,conversionSummaryRate:f,conversionSummaryChangePct:x,conversionFullViewData:C,conversionFullViewRate:S,conversionFullViewChangePct:h,topProductsExportData:O,topOffersExportData:m,conversionExportData:v,showTopProductsExportOption:y=!0,showTopOffersExportOption:k=!0,showConversionExportOption:F=!0,initialDateRange:R=qe,initialMarket:D=\"all\",initialProductSort:W=\"units\",initialConversionFilter:B=\"all\",initialOfferSort:L=\"revenue\",markets:M,translate:u,historyAdapter:p,historyStateKey:w=jg,resetToDashboardOnMount:G=!0,onDateRangeChange:T,onMarketChange:A,onProductSortChange:te,onConversionFilterChange:P,onOfferSortChange:E,onViewChange:X})=>{Oo(u);let[I,Re]=fe.useState(\"dashboard\");xa(I);let Ee=fe.useRef(!1),[Je,$o]=fe.useState(R),[eo,Da]=fe.useState(D),[No,Pa]=fe.useState(W),[Io,Ra]=fe.useState(B),[Vo,Ma]=fe.useState(L),Eo=t??Yg,Ao=o??Jg,zo=n??Zg,Bo=b??Eo,ur=g??Xg,mr=c??zo,he=fe.useCallback(q=>{Re(q),X?.(q)},[X]),Ho=fe.useCallback(()=>p?ka(p.location?.state,w):typeof window>\"u\"?\"dashboard\":ka(window.history.state,w),[p,w]),_e=fe.useCallback((q,It)=>{if(p){let at=Hp(p.location?.state,w,q),ft=Qg(p.location,at);if(It===\"replace\"){p.replace(ft);return}p.push(ft);return}if(typeof window>\"u\")return;let H=Hp(window.history.state,w,q);if(It===\"replace\"){window.history.replaceState(H,\"\");return}window.history.pushState(H,\"\")},[p,w]);fe.useEffect(()=>{if(G?(_e(\"dashboard\",\"replace\"),Ee.current=!1,he(\"dashboard\")):he(Ho()),p)return p.listen((It,H)=>{if(H===\"POP\"){let at=ka(It.state,w);Ee.current=at!==\"dashboard\",he(at)}});let q=It=>{let H=ka(It.state,w);Ee.current=H!==\"dashboard\",he(H)};return window.addEventListener(\"popstate\",q),()=>{window.removeEventListener(\"popstate\",q)}},[p,w,Ho,G,he,_e]);let Fe=fe.useCallback(q=>{Ee.current=!0,_e(q,\"push\"),he(q)},[he,_e]),Nt=fe.useCallback(()=>{if(I!==\"dashboard\"&&Ee.current){if(p){p.goBack();return}typeof window<\"u\"&&window.history.back();return}Ee.current=!1,_e(\"dashboard\",\"replace\"),he(\"dashboard\")},[I,p,he,_e]),mt=fe.useCallback(q=>{$o(q),T?.(q)},[T]),gt=fe.useCallback(q=>{Da(q),A?.(q)},[A]),Wo=fe.useCallback(q=>{Pa(q),te?.(q)},[te]),_o=fe.useCallback(q=>{Ra(q),P?.(q)},[P]),Uo=fe.useCallback(q=>{Ma(q),E?.(q)},[E]),gr=fe.useCallback(()=>{Fe(\"products\")},[Fe]),Oa=fe.useCallback(()=>{Fe(\"conversion-rate\")},[Fe]),Fa=fe.useCallback(()=>{Fe(\"top-offers\")},[Fe]);return I===\"products\"?Ta(rr,{products:Bo,dateRange:Je,market:eo,productSort:No,markets:M,isLoading:i,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onProductSortChange:Wo}):I===\"conversion-rate\"?Ta(nr,{conversionData:C??Ao,orders:ur,summaryRate:S??f,summaryChangePct:h??x,dateRange:Je,market:eo,conversionFilter:Io,markets:M,orderColumnsVariant:\"sv\",isLoading:i,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onConversionFilterChange:_o}):I===\"top-offers\"?Ta(Dn,{offers:mr,dateRange:Je,market:eo,offerSort:Vo,markets:M,isLoading:i,onBack:Nt,onDateRangeChange:mt,onMarketChange:gt,onOfferSortChange:Uo}):Ta(Tn,{stats:e,topProducts:Eo,conversionData:Ao,topOffers:zo,isLoading:i,error:l,dashboardTitle:s,className:d,dateRange:Je,market:eo,productSort:No,conversionFilter:Io,offerSort:Vo,conversionSummaryRate:f,conversionSummaryChangePct:x,topProductsExportData:O??Bo,topOffersExportData:m??mr,orders:ur,conversionExportData:v,showTopProductsExportOption:y,showTopOffersExportOption:k,showConversionExportOption:F,markets:M,onDateRangeChange:mt,onMarketChange:gt,onProductSortChange:Wo,onConversionFilterChange:_o,onOfferSortChange:Uo,onProductsTitleClick:gr,onConversionTitleClick:Oa,onOffersTitleClick:Fa})};import{ColorUtils as tf,styled as Pn}from\"@nuskin/foundation-theme\";var{getGenomeColor:fo}=tf,_p=Pn(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,Up=Pn(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>fo(e,\"N20\")};\n border: 1px solid ${({theme:e})=>fo(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>fo(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>fo(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>fo(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>fo(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,Kp=Pn(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>fo(e,\"N70\")};\n`;import{jsx as Rn,jsxs as rf}from\"react/jsx-runtime\";var of=({filters:e,onChange:t})=>Rn(_p,{\"data-testid\":\"filter-bar\",children:e.map(o=>rf(Kp,{htmlFor:`filter-${o.key}`,children:[o.label,Rn(Up,{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 Gp={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%\"}},jp=[{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%\"}}],Sa=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,priceTypes:t%3===0?[\"Retail\",\"Member\"]:[\"Retail\"]}}),af=Sa.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7),priceTypes:[\"Retail\"]})),nf=Sa.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3),priceTypes:[\"Member\"]})),Yp=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,l=Math.floor(i*.4),s=Math.floor(i*.35),d=i-l-s;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:l,retail:s,brandAffiliates:d}}),Jp=[{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%\"}}],Zp=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\",priceType:t%3===0?\"Member\":\"Retail\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),Xp=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\"],l=new Date(\"2026-03-31\");return l.setDate(l.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:l.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 Lo={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%\"}},kv={...Lo,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},Tv={...Lo,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},Sv={...Lo,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},Dv={...Lo,metrics:{...Lo.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},lf=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,volume:120.5,percentage:29,volumeSharePct:18,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\",volume:\"-2.0%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,volume:90,percentage:27,volumeSharePct:14,color:\"#E8915A\",trend:{revenue:\"+3.1%\",volume:\"+1.4%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,volume:210.4,percentage:22,volumeSharePct:32,color:\"#C75B5B\",trend:{revenue:\"-1.5%\",volume:\"+5.6%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,volume:60,percentage:16,volumeSharePct:9,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\",volume:\"+0.9%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,volume:180,percentage:6,volumeSharePct:27,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\",volume:\"+6.1%\"}}];export{bn as CategoriesFullView,vo as ConversionRateChart,nr as ConversionRateFullView,is as DATE_RANGE_LABELS,ns as DAYS_MAP,Jo as DashboardHeader,dt as DataTable,of as FilterBar,Tg as MysiteDashboardWithNavigation,Li as MysiteHero,Ia as NsCategoryNavigation,Na as NsProductCard,be as PageHeader,ct as Pagination,ef as PoDashboardWithNavigation,hr as ProductCarousel,Tn as ProductOfferDashboard,$ as ProductOfferDashboardTranslationKeys,Dc as ProductTabCarousel,rr as ProductsFullView,nn as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,Vr as SignupsChart,hn as SignupsFullView,Mt as StatsCard,qr as TopCategoriesPieChart,Dn as TopPerformingOffersFullView,ya as TopPerformingOffersPieChart,wo as TopSellingProductsList,ug as TranslationProvider,lt as WidgetMenu,Ui as buildDefaultMarketOptions,pu as calculatePercentage,Sl as calculateTotalPages,dr as exportRowsToExcel,vn as exportTopPerformingOffers,Cn as exportTopProducts,ss as formatDateRange,Du as formatDateRangeLabel,tn as formatDisplayDate,on as formatISODate,ls as formatShortDate,Ot as getComparedToText,en as getDateRangeLabel,Su as getDaysFromDateRange,a as getTranslation,Hc as getTranslationResolver,su as getTrendColor,Ke as getTrendIcon,Jp as mockCategories,Sa as mockConversionData,Zp as mockOrders,Lo as mockProductOfferStats,Yp as mockSignupData,Xp as mockSignupDetails,Gp as mockStats,lf as mockTopOffers,jp as mockTopProducts,xp as normalizeExcelFileName,bp as normalizeExcelSheetName,Dl as paginateItems,Ki as resolveMarketOptions,Ue as resolveTranslation,vr as setTranslationResolver,du as sortByNumericProperty,kn as useProductOfferWidgetExports,mg as useTranslation,Oo 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\n/**\n * `MysiteHero`'s prop contract, and the single definition of that shape.\n * `@nuskin/react-mysite-sdk`'s `buildHeroProps` imports this as its return type\n * so the producer and the consumer can never drift.\n */\nexport type 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: 20px;\n width: 100%;\n box-sizing: border-box;\n padding: 16px;\n\n @media (min-width: 768px) {\n gap: 24px;\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n padding: 24px;\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 CalendarMonthIcon from '@mui/icons-material/CalendarMonth';\nimport LanguageIcon from '@mui/icons-material/Language';\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.dateRange.label)}\n </FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <CalendarMonthIcon />\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.market.label)}</FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <LanguageIcon />\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: 12px 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 12px;\n min-height: auto;\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: 16px 20px;\n gap: 16px;\n }\n\n @media (min-width: 1080px) {\n padding: 16px 24px;\n gap: 20px;\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: nowrap;\n align-items: center;\n gap: 24px;\n width: 100%;\n flex-shrink: 0;\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\n// Kept in the DOM (visually hidden) so the select stays labelled for assistive tech.\nexport const FilterLabel = styled('label')`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: 0 !important;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n`;\n\nexport const StyledSelect = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 24px 6px 8px;\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 white-space: nowrap;\n flex-shrink: 0;\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 background-position: right 8px center;\n }\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 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: nowrap;\n gap: 24px;\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 visits: {\n key: 'shoppingDashboard.stats.visits',\n fallback: 'Site Visits',\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\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\n productSort: {\n label: {\n key: 'shoppingDashboard.filter.productSort.label',\n fallback: 'Sort By',\n },\n },\n signupView: {\n label: {\n key: 'shoppingDashboard.filter.signupView.label',\n fallback: 'Show',\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: 'Overall',\n },\n retail: {\n key: 'shoppingDashboard.filter.conversionType.retail',\n fallback: 'Retail',\n },\n member: {\n key: 'shoppingDashboard.filter.conversionType.member',\n fallback: 'Member',\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 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 rank: {\n key: 'shoppingDashboard.widget.topProducts.rank',\n fallback: 'Rank',\n },\n },\n conversionRate: {\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 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 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 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 compareTo: {\n last7days: {\n key: 'shoppingDashboard.widget.compareTo.last7days',\n fallback: 'compared to this time 7 days ago',\n },\n last30days: {\n key: 'shoppingDashboard.widget.compareTo.last30days',\n fallback: 'compared to this time last month',\n },\n last90days: {\n key: 'shoppingDashboard.widget.compareTo.last90days',\n fallback: 'compared to this time 90 days ago',\n },\n thisMonth: {\n key: 'shoppingDashboard.widget.compareTo.thisMonth',\n fallback: 'compared to this time last month',\n },\n },\n topCategories: {\n title: {\n key: 'shoppingDashboard.widget.topCategories.title',\n fallback: 'Top Categories',\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 viewDetails: {\n key: 'shoppingDashboard.widget.menu.viewDetails',\n fallback: 'View Details',\n },\n exportData: {\n key: 'shoppingDashboard.widget.menu.exportData',\n fallback: 'Export Data',\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 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 customer: { key: 'shoppingDashboard.fullView.conversionRate.columns.customer', fallback: 'Customer' },\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 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 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 percentOfTotal: {\n key: 'shoppingDashboard.fullView.categories.columns.percentOfTotal',\n fallback: '% of Total',\n },\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 noData: {\n key: 'shoppingDashboard.defaults.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.defaults.noChange',\n fallback: 'No change',\n },\n byRevenue: {\n key: 'shoppingDashboard.defaults.byRevenue',\n fallback: 'By: Revenue',\n },\n byUnits: {\n key: 'shoppingDashboard.defaults.byUnits',\n fallback: 'By: Units',\n },\n byVolume: {\n key: 'shoppingDashboard.defaults.byVolume',\n fallback: 'By: Volume',\n },\n byTrend: {\n key: 'shoppingDashboard.defaults.byTrend',\n fallback: 'By: Trend',\n },\n all: {\n key: 'shoppingDashboard.defaults.all',\n fallback: 'All',\n },\n members: {\n key: 'shoppingDashboard.defaults.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.defaults.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.defaults.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n revenue: {\n key: 'shoppingDashboard.defaults.revenue',\n fallback: 'Revenue',\n },\n units: {\n key: 'shoppingDashboard.defaults.units',\n fallback: 'Units',\n },\n volume: {\n key: 'shoppingDashboard.defaults.volume',\n fallback: 'Volume',\n },\n conversionRate: {\n key: 'shoppingDashboard.defaults.conversionRate',\n fallback: 'Conversion Rate',\n },\n trend: {\n key: 'shoppingDashboard.defaults.trend',\n fallback: 'Trend',\n },\n date: {\n key: 'shoppingDashboard.defaults.date',\n fallback: 'Date',\n },\n type: {\n key: 'shoppingDashboard.defaults.type',\n fallback: 'Type',\n },\n dcSv: {\n key: 'shoppingDashboard.defaults.dcSv',\n fallback: 'DC-SV',\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' ? '12px' : '10px')};\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' ? '110px' : 'auto')};\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' ? '16px' : '12px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '110px' : 'auto')};\n }\n\n @media (min-width: 1080px) {\n padding: ${({ $layout }) => ($layout === 'split' ? '16px' : '14px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '110px' : 'auto')};\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: 14px;\n font-weight: 400;\n line-height: 1.2;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 2px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n @media (min-width: 1080px) {\n font-size: 14px;\n }\n`;\n\nexport const StatsValueContainer = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: space-between;\n gap: 2px;\n margin-top: 10px;\n width: 100%;\n`;\n\nexport const StatsValue = styled('div')`\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 24px;\n }\n\n @media (min-width: 1080px) {\n font-size: 28px;\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: 12px;\n font-weight: 400;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n font-size: 12px;\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 { getTrendDirectionLabel, resolveTrendDirection, getTrendIcon } from '../../utils/trendUtils';\nimport { formatMoney, getLocaleFromMarketCode } from '../../utils/dataUtils';\nimport {\n ProductsListContainer,\n WidgetHeader,\n WidgetTitle,\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 { StyledSelect } from '../DashboardHeader.styled';\nimport { WidgetMenu } from '../WidgetMenu';\nimport type { TopProduct, ProductSortOption, MarketOption } 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 market?: MarketOption;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\n market,\n onSortChange,\n onTitleClick,\n onExport,\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, getLocaleFromMarketCode(market));\n case 'volume':\n return `${product.volume.toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`;\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, getLocaleFromMarketCode(market))} ${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, getLocaleFromMarketCode(market))} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode, getLocaleFromMarketCode(market))} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) {\n return '';\n }\n let value = '';\n switch (sortBy) {\n case 'units':\n value = trend.units ?? '';\n break;\n case 'revenue':\n value = trend.revenue ?? '';\n break;\n case 'volume':\n value = trend.volume ?? '';\n break;\n default:\n value = trend.units ?? '';\n }\n return value;\n };\n\n const getTrendDirection = (product: TopProduct, sortBy: ProductSortOption): TrendDirection => {\n const trendValue = getTrendValue(product, sortBy);\n // Use resolveTrendDirection which properly parses numeric value\n // This ensures \"+0%\" and \"-0%\" are treated as neutral (grey), not up/down\n return resolveTrendDirection(trendValue);\n };\n\n const getTrendChartIcon = (direction: TrendDirection) => getTrendIcon(direction);\n\n const displayedProducts = products.slice(0, maxProducts);\n const rankLabel = getTranslation(Keys.widget.topProducts.rank);\n const trendLabel = getTranslation(Keys.defaults.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 <StyledSelect\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.defaults.byUnits)}</option>\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.defaults.byVolume)}</option>\n </StyledSelect>\n <WidgetMenu widgetId=\"top-products\" onFullView={onTitleClick} onExport={onExport} />\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 ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\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 <TrendingUpIcon />;\n case 'down':\n return <TrendingDownIcon />;\n case 'neutral':\n default:\n return <ShowChartIcon />;\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\nexport interface PieChartLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n}\n\nexport function renderPieChartLabel(\n props: PieChartLabelProps,\n options?: { fontSize?: string; fontWeight?: string },\n): React.ReactNode {\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=\"middle\"\n fontSize={options?.fontSize ?? '10'}\n fontWeight={options?.fontWeight ?? '600'}\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0.2\"\n >\n {`${percentage}%`}\n </text>\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\n/**\n * Gets the appropriate locale for displaying currency based on the market/region code\n * @param marketCode - The market code (e.g., 'US', 'IN', 'CA')\n * @returns The locale string (e.g., 'en-US', 'en-IN', 'en-CA')\n */\nexport function getLocaleFromMarketCode(marketCode?: string): string {\n switch (marketCode) {\n case 'IN':\n return 'en-IN';\n case 'CA':\n return 'en-CA';\n case 'US':\n default:\n return 'en-US';\n }\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\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n currencyDisplay: 'narrowSymbol',\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {\n // Invalid currency code — fall through to the $ fallback below\n }\n }\n\n // No currency code provided, or an invalid one — default to a $ prefix\n const numberFormatted =\n fractionDigits !== undefined\n ? amount.toFixed(fractionDigits)\n : new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: 2 }).format(amount);\n return `$${numberFormatted}`;\n}\n\nexport function capitalizeFirstLetter(text: string): string {\n if (!text || text.length === 0) return text;\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Gets the numeric value from a SignupDataPoint based on the selected signup view.\n * Maps the signup view option to the corresponding data field:\n * - 'all' → total\n * - 'members' → members\n * - 'retail' → retail\n * - 'brandAffiliates' → brandAffiliates\n */\nexport function getSignupValueByView(\n dataPoint: {\n readonly total: number;\n readonly members: number;\n readonly retail: number;\n readonly brandAffiliates: number;\n },\n view: 'all' | 'members' | 'retail' | 'brandAffiliates',\n): number {\n switch (view) {\n case 'members':\n return dataPoint.members;\n case 'retail':\n return dataPoint.retail;\n case 'brandAffiliates':\n return dataPoint.brandAffiliates;\n case 'all':\n default:\n return dataPoint.total;\n }\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 FileDownloadIcon from '@mui/icons-material/FileDownload';\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 readonly onExport?: () => void;\n}\n\nexport const WidgetMenu: React.FC<WidgetMenuProps> = ({ widgetId, onFullView, onExport }) => {\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 const handleExport = () => {\n handleClose();\n if (onExport) {\n onExport();\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-viewdetails\">\n <ListItemIcon>\n <VisibilityIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.viewDetails)}</ListItemText>\n </MenuItem>\n {onExport && (\n <MenuItem onClick={handleExport} data-testid=\"widget-menu-item-export\">\n <ListItemIcon>\n <FileDownloadIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.exportData)}</ListItemText>\n </MenuItem>\n )}\n </Menu>\n </>\n );\n};\n","import IconButton from '@mui/material/IconButton';\nimport { styled, ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const StyledIconButton = styled(IconButton)(({ theme }) => ({\n padding: '4px',\n color: getGenomeColor(theme, 'N100'),\n '&:hover': {\n backgroundColor: getGenomeColor(theme, 'N20'),\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 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 { StyledSelect } from '../DashboardHeader.styled';\nimport type { ConversionDataPoint, ConversionFilterOption, DateRangeOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { DEFAULT_DATE_RANGE } from '../../utils/dateConstants';\nimport { filterConversionData } from '../../utils/conversionFilter';\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 dateRange?: DateRangeOption;\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 readonly onExport?: () => void;\n}\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\n\ninterface DotProps {\n readonly cx?: number;\n readonly cy?: number;\n readonly r?: number;\n}\n\n// Custom hollow dot component for ConversionRate chart\nconst HollowDot = (props: DotProps) => {\n const { cx, cy, r = 3 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke=\"#3B82F6\"\n strokeWidth=\"2\"\n style={{ pointerEvents: 'none' }}\n />\n );\n};\n\nconst ActiveHollowDot = (props: DotProps) => {\n const { cx, cy, r = 5 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke=\"#3B82F6\"\n strokeWidth=\"2\"\n style={{ pointerEvents: 'none' }}\n />\n );\n};\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 dateRange = DEFAULT_DATE_RANGE,\n isLoading = false,\n title,\n summaryRate,\n summaryChangePct,\n onFilterChange,\n onTitleClick,\n onExport,\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.defaults.noData);\n const noChangeText = getTranslation(Keys.defaults.noChange);\n\n const filteredData = React.useMemo(\n () => filterConversionData(conversionData, conversionFilter),\n [conversionData, conversionFilter],\n );\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return filteredData.at(-1)?.rate ?? 0;\n }, [summaryRate, filteredData]);\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 (filteredData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = filteredData.at(-1)?.rate ?? 0;\n const previousRate = filteredData[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, filteredData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => filteredData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [filteredData],\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.defaults.conversionRate)}\n </ChartTitle>\n <HeaderActionsContainer>\n <StyledSelect\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=\"retail\">{getTranslation(Keys.filter.conversionType.retail)}</option>\n <option value=\"member\">{getTranslation(Keys.filter.conversionType.member)}</option>\n </StyledSelect>\n <WidgetMenu widgetId=\"conversion-rate\" onFullView={onTitleClick} onExport={onExport} />\n </HeaderActionsContainer>\n </TitleRow>\n </ChartHeader>\n\n <MetricDisplay>\n <MetricValue\n aria-label={`${getTranslation(Keys.defaults.conversionRate)}: ${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\">{getComparedToText(dateRange)}</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={<HollowDot />}\n activeDot={<ActiveHollowDot />}\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 DEFAULT_DATE_RANGE: DateRangeOption = 'last30days';\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 type { DateRangeOption } from '../types.d';\nimport { ShoppingDashboardTranslationKeys } from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { resolveTranslation } from '../TranslationKeys/translationResolver';\n\n/**\n * Generates dynamic comparison text based on the selected date range.\n * Uses translation keys for internationalization support.\n * @param dateRange The selected date range option\n * @returns Dynamic comparison text like \"compared to this time 7 days ago\"\n */\nexport function getComparedToText(dateRange: DateRangeOption): string {\n const keys = ShoppingDashboardTranslationKeys.widget.compareTo;\n\n switch (dateRange) {\n case 'last7days':\n return resolveTranslation(keys.last7days);\n case 'last30days':\n return resolveTranslation(keys.last30days);\n case 'last90days':\n return resolveTranslation(keys.last90days);\n case 'thisMonth':\n return resolveTranslation(keys.thisMonth);\n default:\n // Fallback for unknown date ranges\n return resolveTranslation(keys.last30days);\n }\n}\n","import type { ConversionDataPoint, ConversionFilterOption } from '../types.d';\n\nexport function matchesConversionFilter(point: ConversionDataPoint, filter: ConversionFilterOption): boolean {\n if (filter === 'all') return true;\n // An API that does not supply the dimension yet should not blank the chart\n if (point.priceTypes === undefined) return true;\n return point.priceTypes.some((priceType) => priceType.toLowerCase() === filter);\n}\n\nexport function filterConversionData(\n conversionData: readonly ConversionDataPoint[],\n filter: ConversionFilterOption,\n): ConversionDataPoint[] {\n return conversionData.filter((point) => matchesConversionFilter(point, filter));\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 MetricDisplay,\n MetricValue,\n MetricTrend,\n ChartContainer,\n Legend,\n LegendItem,\n LegendColor,\n LegendLabel,\n HeaderActionsContainer,\n} from './SignupsChart.styled';\nimport { StyledSelect } from '../DashboardHeader.styled';\nimport type { SignupDataPoint, SignupViewOption, DateRangeOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { getSignupValueByView } from '../../utils/dataUtils';\nimport { DEFAULT_DATE_RANGE } from '../../utils/dateConstants';\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 dateRange?: DateRangeOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onViewChange?: (view: SignupViewOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => 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 };\n\ninterface DotProps {\n readonly cx?: number;\n readonly cy?: number;\n readonly r?: number;\n}\n\n// Cache to memoize component factories by color to prevent Recharts reconciliation issues\n// Recharts uses object identity checks for component types, so we must return the same\n// component reference for the same color across renders.\n// Typed to match recharts' LineDot function-signature overload exactly, since a plain\n// React.ComponentType also covers class components, which LineDot does not accept.\nconst dotComponentCache = new Map<string, (props: DotProps) => React.ReactElement>();\n\n// Custom hollow dot component that accepts stroke color\n// Returns cached component to maintain stable references across renders\nconst HollowDotFactory = (strokeColor: string) => {\n if (dotComponentCache.has(strokeColor)) {\n return dotComponentCache.get(strokeColor)!;\n }\n\n const HollowDot = (props: DotProps) => {\n const { cx = 0, cy = 0, r = 2 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke={strokeColor}\n strokeWidth=\"1.5\"\n style={{ pointerEvents: 'none' }}\n />\n );\n };\n HollowDot.displayName = 'HollowDot';\n\n dotComponentCache.set(strokeColor, HollowDot);\n return HollowDot;\n};\n\nconst SignupsChartComponent: React.FC<SignupsChartProps> = ({\n signupData,\n signupView,\n dateRange = DEFAULT_DATE_RANGE,\n isLoading = false,\n title,\n onViewChange,\n onTitleClick,\n onExport,\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.defaults.noData);\n const noChangeText = getTranslation(Keys.defaults.noChange);\n\n const totalSignups = React.useMemo(() => {\n if (signupData.length === 0) return 0;\n const lastDataPoint = signupData[signupData.length - 1];\n return getSignupValueByView(lastDataPoint, signupView);\n }, [signupData, signupView]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (signupData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestValue = getSignupValueByView(signupData[signupData.length - 1], signupView);\n const previousValue = getSignupValueByView(signupData[0], signupView);\n const change = latestValue - previousValue;\n const percentageChange = previousValue === 0 ? 0 : (change / previousValue) * 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, signupView]);\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.defaults.members);\n const retailLabel = getTranslation(Keys.defaults.retail);\n const brandAffiliatesLabel = getTranslation(Keys.defaults.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 <StyledSelect\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 </StyledSelect>\n <WidgetMenu widgetId=\"signups\" onFullView={onTitleClick} onExport={onExport} />\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\">{getComparedToText(dateRange)}</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={HollowDotFactory(\n signupView === 'all' ? SERIES_COLORS.total : SERIES_COLORS.members,\n )}\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={HollowDotFactory(SERIES_COLORS.members)}\n name={membersLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={HollowDotFactory(SERIES_COLORS.retail)}\n name={retailLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={HollowDotFactory(SERIES_COLORS.brandAffiliates)}\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={HollowDotFactory(SERIES_COLORS.retail)}\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={HollowDotFactory(SERIES_COLORS.brandAffiliates)}\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 KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\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 SortMenuButton,\n} from './TopCategoriesPieChart.styled';\nimport type { CategoryRevenue, CategorySortOption, MarketOption } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { resolveTrendDirection, calculateWeightedRevenueTrend, renderPieChartLabel } from '../../utils/trendUtils';\nimport { formatMoney, getLocaleFromMarketCode } 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 market?: MarketOption;\n readonly summaryChangePct?: number | null;\n readonly onSortChange?: (sort: CategorySortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopCategoriesPieChartComponent: React.FC<TopCategoriesPieChartProps> = ({\n categories,\n categorySort,\n isLoading = false,\n title,\n market,\n summaryChangePct,\n onSortChange,\n onTitleClick,\n onExport,\n}) => {\n const [sortAnchorEl, setSortAnchorEl] = React.useState<null | HTMLElement>(null);\n const isSortMenuOpen = Boolean(sortAnchorEl);\n\n const handleSortButtonClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setSortAnchorEl(event.currentTarget);\n }, []);\n\n const handleSortMenuClose = React.useCallback(() => {\n setSortAnchorEl(null);\n }, []);\n\n const handleSortSelect = React.useCallback(\n (newSort: CategorySortOption) => {\n setSortAnchorEl(null);\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedCategories, totalRevenue, totalVolume, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedCategories = [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (b.volume ?? 0) - (a.volume ?? 0);\n });\n\n const nextTotalRevenue = nextSortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n const nextTotalVolume = nextSortedCategories.reduce((sum, category) => sum + (category.volume ?? 0), 0);\n\n let nextTrendDirection: TrendDirection;\n let nextFormattedTrend: string;\n\n // Use the provided summaryChangePct if available\n if (summaryChangePct !== undefined && summaryChangePct !== null) {\n if (Math.abs(summaryChangePct) < 0.1) {\n nextFormattedTrend = '0%';\n nextTrendDirection = 'neutral';\n } else {\n nextTrendDirection = summaryChangePct > 0 ? 'up' : 'down';\n nextFormattedTrend = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%`;\n }\n } else {\n const { direction, formatted } = calculateWeightedRevenueTrend(\n nextSortedCategories,\n (category) => (categorySort === 'volume' ? (category.volume ?? 0) : category.revenue),\n (category) => (categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue),\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n sortedCategories: nextSortedCategories,\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [categories, categorySort, summaryChangePct]);\n\n const getTrendGraphIcon = (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 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 return renderPieChartLabel(props, { fontSize: '10', fontWeight: '600' });\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 <SortMenuButton\n id=\"category-sort-button\"\n data-testid=\"category-sort-dropdown\"\n onClick={handleSortButtonClick}\n disabled={isLoading}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isSortMenuOpen ? 'category-sort-menu' : undefined}\n aria-expanded={isSortMenuOpen ? 'true' : undefined}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.byVolume)\n : getTranslation(Keys.defaults.byRevenue)}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </SortMenuButton>\n <Menu\n id=\"category-sort-menu\"\n data-testid=\"category-sort-menu\"\n anchorEl={sortAnchorEl}\n open={isSortMenuOpen}\n onClose={handleSortMenuClose}\n MenuListProps={{ 'aria-labelledby': 'category-sort-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuItem\n data-testid=\"category-sort-option-revenue\"\n selected={categorySort === 'revenue'}\n onClick={() => handleSortSelect('revenue')}\n >\n {getTranslation(Keys.defaults.byRevenue)}\n </MenuItem>\n <MenuItem\n data-testid=\"category-sort-option-volume\"\n selected={categorySort === 'volume'}\n onClick={() => handleSortSelect('volume')}\n >\n {getTranslation(Keys.defaults.byVolume)}\n </MenuItem>\n </Menu>\n <WidgetMenu widgetId=\"top-categories\" onFullView={onTitleClick} onExport={onExport} />\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={categorySort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-donut-center\">\n <DonutCenterLabel>\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.volume)\n : getTranslation(Keys.stats.revenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {categorySort === 'volume' ? (\n <>\n {totalVolume.toFixed(1)}\n <br />\n {getTranslation(Keys.defaults.dcSv)}\n </>\n ) : (\n formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))\n )}\n </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 const displayValue = categorySort === 'volume' ? category.volume : category.revenue;\n const displayPercentage =\n categorySort === 'volume' ? category.volumeSharePct : category.percentage;\n const displayTrend =\n categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue;\n return (\n <LegendItem key={category.id} data-testid={`category-legend-${index}`}>\n <LegendColor color={category.color} />\n <LegendInfo>\n <LegendName>\n {category.name.charAt(0).toUpperCase() + category.name.slice(1)}\n </LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {categorySort === 'volume'\n ? `${displayValue?.toFixed(1)} (${displayPercentage}%)`\n : `${formatMoney(displayValue ?? 0, category.currencyCode, getLocaleFromMarketCode(market))} (${displayPercentage}%)`}\n </LegendValue>\n {displayTrend ? (\n <LegendTrendInline\n direction={resolveTrendDirection(displayTrend)}\n data-testid={`category-legend-trend-${index}`}\n aria-label={displayTrend}\n >\n {getTrendGraphIcon(resolveTrendDirection(displayTrend))}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\n </LegendItem>\n );\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 SortMenuButton = styled('button')`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\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 white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus-visible {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\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 svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\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';\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 readonly categoriesSummaryChangePct?: number | null;\n readonly conversionSummaryChangePct?: number | null;\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 readonly onProductsExport?: () => void;\n readonly onConversionExport?: () => void;\n readonly onSignupsExport?: () => void;\n readonly onCategoriesExport?: () => 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 = DEFAULT_DATE_RANGE,\n market = 'all',\n productSort = 'units',\n signupView = 'all',\n conversionFilter = 'all',\n categorySort = 'revenue',\n categoriesSummaryChangePct,\n conversionSummaryChangePct,\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onSignupsTitleClick,\n onCategoriesToTitleClick,\n onProductsExport,\n onConversionExport,\n onSignupsExport,\n onCategoriesExport,\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.defaults.volume)}\n value={stats?.metrics?.volume ?? '0'}\n subtitle={getTranslation(Keys.defaults.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.defaults.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 market={market}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onProductsExport}\n />\n <SignupsChart\n signupData={resolvedSignupData}\n signupView={signupView}\n dateRange={dateRange}\n isLoading={isLoading}\n onViewChange={onSignupViewChange}\n onTitleClick={onSignupsTitleClick}\n onExport={onSignupsExport}\n />\n </TwoColumnGrid>\n\n <TwoColumnGrid data-testid=\"widget-row-2\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n dateRange={dateRange}\n isLoading={isLoading}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n onExport={onConversionExport}\n />\n <TopCategoriesPieChart\n categories={resolvedCategories}\n categorySort={categorySort}\n isLoading={isLoading}\n market={market}\n summaryChangePct={categoriesSummaryChangePct}\n onSortChange={onCategorySortChange}\n onTitleClick={onCategoriesToTitleClick}\n onExport={onCategoriesExport}\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 { useScrollToTopOnViewChange } from './hooks/useScrollToTopOnViewChange';\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\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 conversionPriceTypeTrend?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly categoriesSummaryChangePct?: number | null;\n readonly conversionSummaryChangePct?: number | null;\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 readonly onProductsExport?: () => void;\n readonly onConversionExport?: () => void;\n readonly onSignupsExport?: () => void;\n readonly onCategoriesExport?: () => 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 conversionPriceTypeTrend,\n signupData,\n categories,\n categoriesSummaryChangePct,\n conversionSummaryChangePct,\n orders,\n signups,\n isLoading = false,\n error,\n shopTitle,\n className,\n translate,\n initialDateRange = DEFAULT_DATE_RANGE,\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 onProductsExport,\n onConversionExport,\n onSignupsExport,\n onCategoriesExport,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<MysiteDashboardView>('dashboard');\n useScrollToTopOnViewChange(currentView);\n\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 priceTypeTrend={conversionPriceTypeTrend}\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 summaryChangePct={categoriesSummaryChangePct}\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 categoriesSummaryChangePct={categoriesSummaryChangePct}\n conversionSummaryChangePct={conversionSummaryChangePct}\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 onProductsExport={onProductsExport}\n onConversionExport={onConversionExport}\n onSignupsExport={onSignupsExport}\n onCategoriesExport={onCategoriesExport}\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, getLocaleFromMarketCode } 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.defaults.units) },\n { value: 'revenue', label: getTranslation(Keys.defaults.revenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.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.defaults.revenue),\n sortable: true,\n render: (value: unknown) => (\n <MetricValue>\n {formatMoney(Number(value), currencyCode, getLocaleFromMarketCode(market))}\n </MetricValue>\n ),\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, market],\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>{getTranslation(Keys.defaults.units)}</MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.revenue)}</MobileMetricLabel>\n <MobileMetricValue>\n {formatMoney(row.revenue, currencyCode, getLocaleFromMarketCode(market))}\n </MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.volume)}</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 <MobileDateRange>{dateRange}</MobileDateRange>\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} $breakToNewLineOnMobile={!filter.icon}>\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 </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 margin-top: 12px;\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-start;\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-wrap: wrap;\n align-items: center;\n gap: 16px 24px;\n flex: 1 1 auto;\n min-width: 0;\n }\n`;\n\nexport const FilterWrapper = styled('div')<{ $breakToNewLineOnMobile?: boolean }>`\n display: flex;\n align-items: center;\n gap: 8px;\n\n @media (max-width: 767px) {\n flex-basis: ${({ $breakToNewLineOnMobile }) => ($breakToNewLineOnMobile ? '100%' : 'auto')};\n min-width: 0;\n }\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: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\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, getLocaleFromMarketCode } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { filterConversionData } from '../../utils/conversionFilter';\nimport { collectPriceTypes, priceTypeColor, priceTypeSeriesKey, toSeriesPoint } from '../../utils/conversionSeries';\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 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 TrendValueText,\n TrendComparisonText,\n MetricSectionWrapper,\n MetricValueWithSpacing,\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 // Order-details trend, used only to draw a line per price type\n readonly priceTypeTrend?: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n // 'default' keeps the Type and BV columns; 'sv' replaces them with a single Total SV column\n readonly orderColumnsVariant?: 'default' | 'sv';\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 priceTypeTrend,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n orderColumnsVariant = 'default',\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 filteredData = React.useMemo(\n () => filterConversionData(conversionData, conversionFilter),\n [conversionData, conversionFilter],\n );\n\n // Only the unfiltered view splits into a line per price type; a specific filter already has one series\n const priceTypeSeries = React.useMemo(\n () => (conversionFilter === 'all' ? collectPriceTypes(priceTypeTrend ?? []) : []),\n [conversionFilter, priceTypeTrend],\n );\n\n // The price type series come from the order-details trend, so the headline keeps using conversionData\n const chartData = React.useMemo(\n () =>\n priceTypeSeries.length > 0\n ? (priceTypeTrend ?? []).map((point) => toSeriesPoint(point, priceTypeSeries))\n : filteredData.map((point) => toSeriesPoint(point, priceTypeSeries)),\n [priceTypeSeries, priceTypeTrend, filteredData],\n );\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return filteredData.at(-1)?.rate ?? 0;\n }, [summaryRate, filteredData]);\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 (filteredData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = filteredData.at(-1)?.rate ?? 0;\n const previousRate = filteredData[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, filteredData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'retail') return getTranslation(Keys.filter.conversionType.retail);\n if (filter === 'member') return getTranslation(Keys.filter.conversionType.member);\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: 'retail', label: getTranslation(Keys.filter.conversionType.retail) },\n { value: 'member', label: getTranslation(Keys.filter.conversionType.member) },\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.priceType?.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(filteredOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(() => {\n const showTotalSvOnly = orderColumnsVariant === 'sv';\n\n return [\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.defaults.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n ...(showTotalSvOnly\n ? []\n : [{ key: 'customerType', label: getTranslation(Keys.defaults.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, getLocaleFromMarketCode(market), 2),\n },\n {\n key: 'bv',\n label: getTranslation(\n showTotalSvOnly\n ? Keys.fullView.conversionRate.columns.totalSv\n : Keys.fullView.conversionRate.columns.bv,\n ),\n sortable: true,\n },\n ];\n }, [market, orderColumnsVariant]);\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'retail') return '#2e7d32';\n if (conversionFilter === 'member') 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.defaults.conversionRate)}\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.defaults.conversionRate)}\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 <MetricSectionWrapper>\n <MetricValueWithSpacing data-testid=\"conversion-rate-value\">\n {currentRate.toFixed(1)}%\n </MetricValueWithSpacing>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <TrendValueText>{trend.value}</TrendValueText>\n <TrendComparisonText>{getComparedToText(dateRange)}</TrendComparisonText>\n </MetricTrend>\n </MetricSectionWrapper>\n </MetricSection>\n\n <ChartSection>\n <ChartWithLegendWrapper>\n <ConversionTrendChartContainer data-testid=\"conversion-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={chartData} 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 {priceTypeSeries.length > 0 ? (\n priceTypeSeries.map((priceType, index) => (\n <Line\n key={priceType}\n type=\"monotone\"\n dataKey={priceTypeSeriesKey(priceType)}\n stroke={priceTypeColor(priceType, index)}\n strokeWidth={2}\n name={priceType}\n dot={false}\n />\n ))\n ) : (\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n dot={false}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </ConversionTrendChartContainer>\n <ChartLegendContainer>\n {priceTypeSeries.length > 0 ? (\n priceTypeSeries.map((priceType, index) => (\n <LegendItem key={priceType} $color={priceTypeColor(priceType, index)}>\n {priceType}\n </LegendItem>\n ))\n ) : (\n <LegendItem $color={getChartColor()}>\n {`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n </LegendItem>\n )}\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.total)}\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 type { ConversionDataPoint } from '../types.d';\n\nexport const PRICE_TYPE_SERIES_PREFIX = 'rate__';\n\nconst PRICE_TYPE_COLORS: Readonly<Record<string, string>> = {\n retail: '#2e7d32',\n member: '#ed6c02',\n};\n\nconst FALLBACK_COLORS = ['#1976d2', '#9c27b0', '#00897b', '#c2185b'];\n\nexport function priceTypeSeriesKey(priceType: string): string {\n return `${PRICE_TYPE_SERIES_PREFIX}${priceType}`;\n}\n\nexport function priceTypeColor(priceType: string, index: number): string {\n return PRICE_TYPE_COLORS[priceType.toLowerCase()] ?? FALLBACK_COLORS[index % FALLBACK_COLORS.length];\n}\n\nexport function collectPriceTypes(conversionData: readonly ConversionDataPoint[]): string[] {\n const priceTypes: string[] = [];\n conversionData.forEach((point) => {\n Object.keys(point.ratesByPriceType ?? {}).forEach((priceType) => {\n if (!priceTypes.includes(priceType)) priceTypes.push(priceType);\n });\n });\n return priceTypes.sort((a, b) => a.localeCompare(b));\n}\n\n// A price type with no orders on a day is a real zero, not a gap in the line\nexport function toSeriesPoint(\n point: ConversionDataPoint,\n priceTypes: readonly string[],\n): ConversionDataPoint & Record<string, unknown> {\n const series: Record<string, number> = {};\n priceTypes.forEach((priceType) => {\n series[priceTypeSeriesKey(priceType)] = point.ratesByPriceType?.[priceType] ?? 0;\n });\n return { ...point, ...series };\n}\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport { MetricValue } from '../FullViewComponents.styled';\n\nconst { getGenomeColor } = ColorUtils;\n\n// Adds spacing before the adjacent trend indicator, specific to this page's layout\nexport const MetricValueWithSpacing = styled(MetricValue)`\n margin-right: 6px;\n`;\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)<{ $color?: string }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ $color }) => $color ?? 'inherit'};\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\nexport const TrendValueText = 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`;\n\nexport const TrendComparisonText = styled('span')`\n margin-left: 2px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 400;\n font-size: 12px;\n line-height: 16px;\n letter-spacing: 0.01em;\n color: #5f5f5f;\n`;\n\nexport const MetricSectionWrapper = styled(Box)`\n display: flex;\n align-items: center;\n gap: 0;\n flex-wrap: wrap;\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, getSignupValueByView } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\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 TrendAbsoluteChangeText,\n TrendPercentageChangeText,\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 // Guard for nullish or non-object input\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\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 const lastDataPoint = normalizedSignupData[normalizedSignupData.length - 1];\n return getSignupValueByView(lastDataPoint, signupView);\n }, [normalizedSignupData, signupView]);\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 = getSignupValueByView(normalizedSignupData[0], signupView);\n const last = getSignupValueByView(normalizedSignupData[normalizedSignupData.length - 1], signupView);\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, signupView, 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.defaults.all) },\n { value: 'members', label: getTranslation(Keys.defaults.members) },\n { value: 'retail', label: getTranslation(Keys.defaults.retail) },\n { value: 'brandAffiliates', label: getTranslation(Keys.defaults.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.defaults.date), sortable: true },\n { key: 'type', label: getTranslation(Keys.defaults.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 <TrendAbsoluteChangeText>\n {trend.absoluteChange > 0 ? '+' : ''}\n {trend.absoluteChange}\n </TrendAbsoluteChangeText>\n <TrendPercentageChangeText>{trend.percentageChange}</TrendPercentageChangeText>\n </>\n )}\n {trend.direction === 'neutral' && <span>{trend.percentageChange}</span>}\n </MetricTrend>\n <ComparisonTextMobile>{getComparedToText(dateRange)}</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.defaults.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.defaults.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.defaults.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.defaults.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.defaults.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.defaults.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </SignupTrendChartContainer>\n <Box>\n {signupView === 'all' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.total}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>{' '}\n <LegendItem $legendColor={SERIES_COLORS.members}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n <LegendItem $legendColor={SERIES_COLORS.retail}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n <LegendItem $legendColor={SERIES_COLORS.brandAffiliates}>\n {getTranslation(Keys.defaults.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.members}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.retail}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.brandAffiliates}>\n {getTranslation(Keys.defaults.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 shouldForwardProp: (prop) => prop !== '$legendColor',\n})<{ $legendColor?: string }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ $legendColor, theme }) => $legendColor ?? 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\nexport const TrendAbsoluteChangeText = styled('span')`\n font-weight: 600;\n line-height: 1;\n`;\n\nexport const TrendPercentageChangeText = styled('span')`\n font-weight: 400;\n line-height: 1;\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, capitalizeFirstLetter, getLocaleFromMarketCode } 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 type { TrendDirection } from '../types';\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 { calculateWeightedRevenueTrend, renderPieChartLabel } 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 summaryChangePct?: number | null;\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 summaryChangePct,\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.defaults.byRevenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.byVolume) },\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 return renderPieChartLabel(props, { fontSize: '12', fontWeight: '700' });\n };\n\n const getTrendIcon = (direction: TrendDirection) => {\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): TrendDirection => {\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 (b.volume ?? 0) - (a.volume ?? 0);\n }),\n [categories, categorySort],\n );\n\n const { totalRevenue, totalVolume, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n const nextTotalVolume = sortedCategories.reduce((sum, category) => sum + (category.volume ?? 0), 0);\n\n let nextTrendDirection: TrendDirection;\n let nextFormattedTrend: string;\n\n // Use the provided summaryChangePct if available, otherwise calculate from items\n if (summaryChangePct !== undefined && summaryChangePct !== null) {\n if (Math.abs(summaryChangePct) < 0.1) {\n nextFormattedTrend = '0%';\n nextTrendDirection = 'neutral';\n } else {\n nextTrendDirection = summaryChangePct > 0 ? 'up' : 'down';\n nextFormattedTrend = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%`;\n }\n } else {\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedCategories,\n (category) => (categorySort === 'volume' ? (category.volume ?? 0) : category.revenue),\n (category) => (categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue),\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n totalRevenueTrendDirection: nextTrendDirection,\n totalRevenueTrend: nextFormattedTrend,\n };\n }, [sortedCategories, summaryChangePct, categorySort]);\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 currencyCode = sortedCategories[0]?.currencyCode;\n\n const columns: ColumnDef<CategoryRevenue>[] = React.useMemo(() => {\n const cols = [\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>{capitalizeFirstLetter(row.name)}</CategoryNameColumnCell>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.defaults.revenue),\n sortable: true,\n render: (value: unknown, row: CategoryRevenue) =>\n formatMoney(Number(value), row.currencyCode, getLocaleFromMarketCode(market)),\n },\n {\n key: 'volume',\n label: getTranslation(Keys.defaults.volume),\n sortable: true,\n render: (value: unknown) =>\n `${Number(value ?? 0).toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`,\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 return cols;\n }, [currencyCode, market]);\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={categorySort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.volume)\n : getTranslation(Keys.stats.revenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {categorySort === 'volume' ? (\n <>\n {totalVolume.toFixed(1)}\n <br />\n {getTranslation(Keys.defaults.dcSv)}\n </>\n ) : (\n formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))\n )}\n </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 const summaryValue = categorySort === 'volume' ? category.volume : category.revenue;\n const summaryPercentage =\n categorySort === 'volume' ? category.volumeSharePct : category.percentage;\n const summaryTrend =\n categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue;\n return (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{capitalizeFirstLetter(category.name)}</SummaryName>\n <SummaryValue>\n {categorySort === 'volume'\n ? (summaryValue ?? 0).toFixed(1)\n : formatMoney(\n summaryValue ?? 0,\n category.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </SummaryValue>\n <SummaryPercentage>({summaryPercentage}%)</SummaryPercentage>\n {summaryTrend ? (\n <SummaryTrendIcon direction={resolveTrendDirection(summaryTrend)}>\n {getTrendIcon(resolveTrendDirection(summaryTrend))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n );\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(\n category.revenue,\n category.currencyCode,\n getLocaleFromMarketCode(market),\n )}\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 /* Donut hole shrinks on mobile (fixed 220px chart height), so the\n overlay must be narrower to avoid overlapping the colored ring. */\n @media (max-width: 767px) {\n width: 96px;\n }\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 @media (max-width: 767px) {\n font-size: 0.6875rem;\n }\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 @media (max-width: 767px) {\n font-size: 1rem;\n }\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 @media (max-width: 767px) {\n font-size: 0.75rem;\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\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 // Set resolver in effect only — synchronous side effects during render are impure\n // Always call useEffect at top level - React Hook Rules require unconditional hook calls\n // This manages setup, cleanup on unmount, and updates when translate changes\n React.useEffect(() => {\n if (translate !== undefined) {\n setTranslationResolver(translate);\n return () => {\n setTranslationResolver(undefined);\n };\n }\n return undefined;\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 React from 'react';\n\nfunction scrollWindowToTop(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (typeof window.scrollTo === 'function') {\n window.scrollTo({ top: 0, left: 0, behavior: 'auto' });\n return;\n }\n\n const scrollingElement = window.document?.scrollingElement ?? window.document?.documentElement;\n\n if (scrollingElement) {\n scrollingElement.scrollTop = 0;\n }\n}\n\n/**\n * Resets the page scroll position whenever the dashboard switches between the\n * summary view and a widget full view, so the new view always starts at its top.\n */\nexport function useScrollToTopOnViewChange(view: string): void {\n const previousViewRef = React.useRef(view);\n\n React.useEffect(() => {\n if (previousViewRef.current === view) {\n return;\n }\n\n previousViewRef.current = view;\n scrollWindowToTop();\n }, [view]);\n}\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, MarketOption } 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, capitalizeFirstLetter, getLocaleFromMarketCode } 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 market?: MarketOption;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\n market,\n onSortChange,\n onTitleClick,\n onExport,\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, totalVolume, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return (b.volume ?? 0) - (a.volume ?? 0);\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n const nextTotalVolume = nextSortedOffers.reduce((sum, offer) => sum + (offer.volume ?? 0), 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => (offerSort === 'volume' ? (offer.volume ?? 0) : offer.revenue),\n (offer) => (offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue),\n );\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\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.defaults.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.defaults.byVolume)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-offers\" onFullView={onTitleClick} onExport={onExport} />\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={offerSort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n offerSort === 'volume'\n ? `${value.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {offerSort === 'volume'\n ? getTranslation(Keys.widget.topPerformingOffers.totalVolume)\n : getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {offerSort === 'volume'\n ? `${totalVolume.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))}\n </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 displayTrend = offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue;\n const displayPercentage =\n offerSort === 'volume' ? (offer.volumeSharePct ?? offer.percentage) : offer.percentage;\n const legendTrendDirection = resolveTrendDirection(displayTrend);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{capitalizeFirstLetter(offer.name)}</LegendName>\n <LegendValue>\n {offerSort === 'volume'\n ? `${(offer.volume ?? 0).toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </LegendValue>\n </LegendInfo>\n <LegendPercentage>{displayPercentage}%</LegendPercentage>\n {displayTrend ? (\n <LegendTrend\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={displayTrend}\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 byVolume: { key: 'productOfferDashboard.filter.offerSort.byVolume', fallback: 'Volume' },\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 totalVolume: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalVolume',\n fallback: 'Total volume',\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 byRevenue: { key: 'productOfferDashboard.defaults.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.defaults.byUnits', fallback: 'Units' },\n byVolume: { key: 'productOfferDashboard.defaults.byVolume', fallback: 'Volume' },\n volume: { key: 'productOfferDashboard.defaults.volume', fallback: 'Volume' },\n dcSv: { key: 'productOfferDashboard.defaults.dcSv', fallback: 'DC-SV' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport type { ConversionFilterOption, OrderHistory, TopPerformingOffer, TopProduct } from '../types.d';\nimport { exportConversionRate, exportTopPerformingOffers, exportTopProducts } from '../utils/productOfferExport';\n\nexport interface ProductOfferWidgetExportOptions {\n readonly topProducts: readonly TopProduct[];\n readonly topOffers: readonly TopPerformingOffer[];\n readonly orders?: readonly OrderHistory[];\n readonly conversionFilter?: ConversionFilterOption;\n readonly topProductsExportData?: readonly TopProduct[];\n readonly topOffersExportData?: readonly TopPerformingOffer[];\n readonly conversionExportData?: readonly OrderHistory[];\n readonly showTopProductsExportOption?: boolean;\n readonly showTopOffersExportOption?: boolean;\n readonly showConversionExportOption?: boolean;\n readonly isLoading?: boolean;\n}\n\nexport interface ProductOfferWidgetExportHandlers {\n readonly onTopProductsExport?: () => Promise<void>;\n readonly onTopOffersExport?: () => Promise<void>;\n readonly onConversionExport?: () => Promise<void>;\n}\n\nexport function useProductOfferWidgetExports({\n topProducts,\n topOffers,\n orders,\n conversionFilter = 'all',\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\n isLoading = false,\n}: ProductOfferWidgetExportOptions): ProductOfferWidgetExportHandlers {\n const productRows = topProductsExportData ?? topProducts;\n const offerRows = topOffersExportData ?? topOffers;\n const sourceOrderRows = conversionExportData ?? orders ?? [];\n\n // Mirror the full view's Order Details table, which lists only orders matching the active filter.\n const orderRows = React.useMemo(() => {\n if (conversionFilter === 'all') return sourceOrderRows;\n return sourceOrderRows.filter((order) => order.priceType?.toLowerCase() === conversionFilter);\n }, [sourceOrderRows, conversionFilter]);\n\n const canExportProducts = showTopProductsExportOption && !isLoading && productRows.length > 0;\n const canExportOffers = showTopOffersExportOption && !isLoading && offerRows.length > 0;\n const canExportConversion = showConversionExportOption && !isLoading && orderRows.length > 0;\n\n const onTopProductsExport = React.useCallback(() => exportTopProducts(productRows), [productRows]);\n const onTopOffersExport = React.useCallback(() => exportTopPerformingOffers(offerRows), [offerRows]);\n const onConversionExport = React.useCallback(() => exportConversionRate(orderRows), [orderRows]);\n\n return {\n onTopProductsExport: canExportProducts ? onTopProductsExport : undefined,\n onTopOffersExport: canExportOffers ? onTopOffersExport : undefined,\n onConversionExport: canExportConversion ? onConversionExport : undefined,\n };\n}\n","export type ExcelCellValue = string | number | boolean | Date | null | undefined;\n\nexport interface ExcelExportColumn<TItem> {\n readonly header: string;\n readonly value: (item: TItem) => ExcelCellValue;\n}\n\nexport interface ExcelExportOptions<TItem> {\n readonly rows: readonly TItem[];\n readonly columns: readonly ExcelExportColumn<TItem>[];\n readonly fileName: string;\n readonly sheetName: string;\n}\n\nconst INVALID_SHEET_NAME_CHARS = /[\\\\/?*[\\]:]/g;\nconst MAX_SHEET_NAME_LENGTH = 31;\n\nexport function normalizeExcelFileName(fileName: string): string {\n const trimmedFileName = fileName.trim();\n const resolvedFileName = trimmedFileName.length > 0 ? trimmedFileName : 'export';\n return resolvedFileName.toLowerCase().endsWith('.xlsx') ? resolvedFileName : `${resolvedFileName}.xlsx`;\n}\n\nexport function normalizeExcelSheetName(sheetName: string): string {\n const normalizedSheetName = sheetName.replace(INVALID_SHEET_NAME_CHARS, ' ').trim();\n const resolvedSheetName = normalizedSheetName.length > 0 ? normalizedSheetName : 'Export';\n return resolvedSheetName.slice(0, MAX_SHEET_NAME_LENGTH);\n}\n\nexport async function exportRowsToExcel<TItem>({\n rows,\n columns,\n fileName,\n sheetName,\n}: ExcelExportOptions<TItem>): Promise<void> {\n const { Workbook } = await import('exceljs');\n const workbook = new Workbook();\n const worksheet = workbook.addWorksheet(normalizeExcelSheetName(sheetName));\n\n worksheet.columns = columns.map((column) => ({ header: column.header, key: column.header }));\n rows.forEach((row) => {\n const worksheetRow: Record<string, ExcelCellValue> = {};\n\n columns.forEach((column) => {\n worksheetRow[column.header] = column.value(row) ?? '';\n });\n\n worksheet.addRow(worksheetRow);\n });\n\n const buffer = await workbook.xlsx.writeBuffer();\n downloadExcelBuffer(buffer, normalizeExcelFileName(fileName));\n}\n\nfunction downloadExcelBuffer(buffer: ArrayBuffer | Uint8Array, fileName: string): void {\n const blob = new Blob([new Uint8Array(buffer)], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n // Append to document.body before clicking — required for Firefox/Safari compatibility\n document.body.appendChild(link);\n link.click();\n // Clean up: remove from DOM and revoke URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import type { OrderHistory, TopPerformingOffer, TopProduct } from '../types.d';\nimport type { ExcelExportColumn } from './excelExport';\nimport { exportRowsToExcel } from './excelExport';\n\nconst topProductColumns: readonly ExcelExportColumn<TopProduct>[] = [\n { header: 'Rank', value: (product) => product.rank },\n { header: 'Product ID', value: (product) => product.id },\n { header: 'Product Name', value: (product) => product.name },\n { header: 'Units Sold', value: (product) => product.unitsSold },\n { header: 'Total Revenue', value: (product) => product.revenue },\n { header: 'Currency', value: (product) => product.currencyCode },\n { header: 'Volume DC-SV', value: (product) => product.volume },\n { header: 'Trend', value: (product) => product.trend?.units ?? product.trend?.revenue ?? product.trend?.volume },\n];\n\nconst topOfferColumns: readonly ExcelExportColumn<TopPerformingOffer>[] = [\n { header: 'Offer ID', value: (offer) => offer.id },\n { header: 'Offer Name', value: (offer) => offer.name },\n { header: 'Total Revenue', value: (offer) => offer.revenue },\n { header: 'Currency', value: (offer) => offer.currencyCode },\n { header: 'Total Volume', value: (offer) => offer.volume ?? offer.units },\n { header: 'Share %', value: (offer) => offer.percentage },\n { header: 'Trend', value: (offer) => offer.trend?.revenue ?? offer.trend?.units },\n];\n\n// Mirrors the Order Details table rendered in the Conversion Rate full view.\nconst conversionOrderColumns: readonly ExcelExportColumn<OrderHistory>[] = [\n { header: 'Order ID', value: (order) => order.orderId },\n { header: 'Date', value: (order) => order.date },\n { header: 'Customer', value: (order) => order.customerName },\n { header: 'Items', value: (order) => order.items },\n { header: 'Total', value: (order) => order.total },\n { header: 'Currency', value: (order) => order.currencyCode },\n { header: 'Total SV', value: (order) => order.bv },\n];\n\nexport function exportTopProducts(rows: readonly TopProduct[]): Promise<void> {\n return exportRowsToExcel({\n rows,\n columns: topProductColumns,\n fileName: 'top-selling-products',\n sheetName: 'Top Selling Products',\n });\n}\n\nexport function exportTopPerformingOffers(offers: readonly TopPerformingOffer[]): Promise<void> {\n return exportRowsToExcel({\n rows: offers,\n columns: topOfferColumns,\n fileName: 'top-performing-offers',\n sheetName: 'Top Performing Offers',\n });\n}\n\nexport function exportConversionRate(orders: readonly OrderHistory[]): Promise<void> {\n return exportRowsToExcel({\n rows: orders,\n columns: conversionOrderColumns,\n fileName: 'conversion-rate-orders',\n sheetName: 'Order Details',\n });\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 { useProductOfferWidgetExports } from './hooks/useProductOfferWidgetExports';\nimport type { ProductOfferDashboardProps, TopProduct, ConversionDataPoint, TopPerformingOffer } from './types.d';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 = DEFAULT_DATE_RANGE,\n market = 'all',\n productSort = 'units',\n conversionFilter = 'all',\n offerSort = 'revenue',\n conversionSummaryRate,\n conversionSummaryChangePct,\n orders,\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\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 const { onTopProductsExport, onTopOffersExport, onConversionExport } = useProductOfferWidgetExports({\n topProducts: resolvedTopProducts,\n topOffers: resolvedTopOffers,\n orders,\n conversionFilter,\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption,\n showTopOffersExportOption,\n showConversionExportOption,\n isLoading,\n });\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: stats.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 dateRange={dateRange}\n isLoading={isLoading}\n summaryRate={conversionSummaryRate}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n onExport={onConversionExport}\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 market={market}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onTopProductsExport}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\n market={market}\n onSortChange={onOfferSortChange}\n onTitleClick={onOffersTitleClick}\n onExport={onTopOffersExport}\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 { useScrollToTopOnViewChange } from './hooks/useScrollToTopOnViewChange';\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\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\n initialDateRange = DEFAULT_DATE_RANGE,\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 useScrollToTopOnViewChange(currentView);\n\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 orderColumnsVariant=\"sv\"\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 topProductsExportData={topProductsExportData ?? resolvedAllProducts}\n topOffersExportData={topOffersExportData ?? resolvedAllOffers}\n orders={resolvedOrders}\n conversionExportData={conversionExportData}\n showTopProductsExportOption={showTopProductsExportOption}\n showTopOffersExportOption={showTopOffersExportOption}\n showConversionExportOption={showConversionExportOption}\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, getLocaleFromMarketCode } 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.defaults.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.defaults.byRevenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.byVolume) },\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.volume ?? 0) - (a.volume ?? 0);\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalVolume, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n const nextTotalVolume = sortedOffers.reduce((sum, offer) => sum + (offer.volume ?? 0), 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => (offerSort === 'volume' ? (offer.volume ?? 0) : offer.revenue),\n (offer) => (offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue),\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers, offerSort]);\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) =>\n formatMoney(Number(value), row.currencyCode, getLocaleFromMarketCode(market)),\n },\n {\n key: 'volume',\n label: getTranslation(Keys.defaults.volume),\n sortable: true,\n render: (value: unknown) =>\n `${Number(value ?? 0).toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`,\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 [market],\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={offerSort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n offerSort === 'volume'\n ? `${value.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {offerSort === 'volume'\n ? getTranslation(Keys.widget.topPerformingOffers.totalVolume)\n : getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {offerSort === 'volume'\n ? `${totalVolume.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))}\n </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 summaryTrend = offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue;\n const summaryPercentage =\n offerSort === 'volume' ? (offer.volumeSharePct ?? offer.percentage) : offer.percentage;\n const summaryTrendDirection = resolveTrendDirection(summaryTrend);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>\n {offerSort === 'volume'\n ? `${(offer.volume ?? 0).toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{summaryPercentage}%</SummaryPercentage>\n {summaryTrend ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={summaryTrend}>\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(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.defaults.volume)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {`${Number(offer.volume ?? 0).toLocaleString()} ${getTranslation(\n Keys.defaults.dcSv,\n )}`}\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 priceTypes: i % 3 === 0 ? ['Retail', 'Member'] : ['Retail'],\n };\n});\n\nexport const mockConversionDataRetail: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n priceTypes: ['Retail'],\n}));\n\nexport const mockConversionDataMember: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n priceTypes: ['Member'],\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 priceType: i % 3 === 0 ? 'Member' : 'Retail',\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 volume: 120.5,\n percentage: 29,\n volumeSharePct: 18,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%', volume: '-2.0%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n volume: 90,\n percentage: 27,\n volumeSharePct: 14,\n color: '#E8915A',\n trend: { revenue: '+3.1%', volume: '+1.4%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n volume: 210.4,\n percentage: 22,\n volumeSharePct: 32,\n color: '#C75B5B',\n trend: { revenue: '-1.5%', volume: '+5.6%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n volume: 60,\n percentage: 16,\n volumeSharePct: 9,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%', volume: '+0.9%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n volume: 180,\n percentage: 6,\n volumeSharePct: 27,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%', volume: '+6.1%' },\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/utils/comparisonTextUtils.ts","../src/common/shopping-dashboard/utils/conversionFilter.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/utils/conversionSeries.ts","../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/hooks/useScrollToTopOnViewChange.ts","../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/hooks/useProductOfferWidgetExports.ts","../src/common/shopping-dashboard/utils/excelExport.ts","../src/common/shopping-dashboard/utils/productOfferExport.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":["tc","Object","create","En","defineProperty","oc","getOwnPropertyDescriptor","rc","getOwnPropertyNames","ac","getPrototypeOf","nc","prototype","hasOwnProperty","Ia","e","t","exports","ic","o","n","i","call","get","enumerable","lc","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","li","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","ci","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","mi","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","br","NsCategoryNavigation","itemArray","controlledValue","onChange","gi","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","CalendarMonthIcon","LanguageIcon","ColorUtils","getGenomeColor","HeaderContainer","theme","TitleSection","ShopTitle","DateRangeLabel","FiltersSection","FilterDropdownContainer","FilterLabel","StyledSelect","FilterMenuButton","FilterIcon","LoadingIndicatorContainer","DesktopFiltersContainer","StyledCircularProgress","activeResolver","setTranslationResolver","resolver","getTranslationResolver","resolveTranslation","fallback","result","ShoppingDashboardTranslationKeys","stats","revenue","visits","trend","increased","decreased","unchanged","details","filter","dateRange","last7days","last30days","last90days","thisMonth","market","all","productSort","signupView","showAll","showMembers","showRetail","showBrandAffiliates","conversionType","retail","member","widget","topProducts","viewAll","empty","ariaLabel","titleAriaLabel","sortAriaLabel","noImageAriaLabel","unitsSuffix","revenueSuffix","rank","conversionRate","formula","comparison","chartAriaLabel","filterAriaLabel","tooltipOrders","tooltipVisits","ordersPerSiteVisits","signups","total","totalSignupsInPeriod","noTrendData","compareTo","topCategories","menu","fullView","viewDetails","exportData","navigation","backToDashboard","backAriaLabel","dashboard","statsRow","dashboardFilters","loadingDashboard","dateRangeFilter","marketFilter","filterSuffix","columns","status","detailsTitle","orderId","customer","items","bv","totalSv","orderDetailsTitle","notAvailable","product","unitsSold","volume","skuPrefix","noProducts","category","percentOfTotal","allCategoriesTitle","noCategoryData","dataTable","noDataAvailable","sortableColumn","pagination","previousPage","nextPage","goToPage","of","defaults","zeroTrend","noValue","noData","noChange","byRevenue","byUnits","byVolume","byTrend","members","brandAffiliates","units","date","dcSv","getTranslation","buildDefaultMarketOptions","resolveMarketOptions","markets","useMarketOptions","DashboardHeader","dateRangeLabel","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","subtitle","caption","layout","trendDirection","trendValue","getTrendAriaLabel","directionText","getTrendChartIcon","iconSize","StatsCard","memo","displayName","ShoppingCartIcon","KeyboardArrowDownIcon","Menu","MenuItem","parseTrendPercent","cleanedValue","parsedValue","isFinite","resolveTrendDirection","calculateWeightedRevenueTrend","getRevenue","getTrend","reduce","accumulator","weightedSum","weight","average","formatted","toFixed","getTrendDirectionLabel","getTrendIcon","getTrendColor","renderPieChartLabel","options","cx","cy","midAngle","innerRadius","outerRadius","percentage","RADIAN","PI","radius","x","cos","y","sin","textAnchor","dominantBaseline","calculateTotalPages","itemsPerPage","ceil","paginateItems","currentPage","startIndex","endIndex","sortByNumericProperty","sort","a","aVal","bVal","calculatePercentage","decimalPlaces","usePaginatedItems","totalPages","pageItems","getLocaleFromMarketCode","marketCode","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","currencyDisplay","minimumFractionDigits","maximumFractionDigits","format","capitalizeFirstLetter","text","charAt","toUpperCase","getSignupValueByView","dataPoint","view","ProductsListContainer","WidgetHeader","HeaderActionsContainer","WidgetTitle","SortDropdown","ProductsList","ProductItem","ProductRank","ProductImage","ProductImagePlaceholder","ProductInfo","ProductName","ProductSubtitle","ProductMetrics","ProductValue","ProductTrend","EmptyState","EmptyStateText","ListItemIcon","ListItemText","MoreVertIcon","VisibilityIcon","FileDownloadIcon","IconButton","StyledIconButton","WidgetMenu","widgetId","onFullView","onExport","anchorEl","setAnchorEl","buttonId","menuId","handleClick","currentTarget","handleClose","handleFullView","handleExport","size","onClose","MenuListProps","anchorOrigin","vertical","horizontal","transformOrigin","TopSellingProductsListComponent","maxProducts","onSortChange","onTitleClick","sortAnchorEl","setSortAnchorEl","isSortMenuOpen","handleSortButtonClick","handleSortMenuClose","handleSortSelect","newSort","formatValue","sortBy","toLocaleString","getSubtitle","getTrendValue","getTrendDirection","displayedProducts","rankLabel","trendLabel","byUnitsLabel","byRevenueLabel","byVolumeLabel","productSortLabels","selected","imageUrl","TopSellingProductsList","LineChart","Line","XAxis","YAxis","CartesianGrid","ResponsiveContainer","ConversionRateContainer","ChartHeader","TitleRow","ChartTitle","FilterDropdown","MetricDisplay","MetricValue","MetricTrend","FormulaDisplay","ChartContainer","TooltipContainer","TooltipLabel","TooltipValue","TooltipDetails","DEFAULT_DATE_RANGE","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","getComparedToText","keys","matchesConversionFilter","point","priceTypes","some","priceType","filterConversionData","conversionData","CHART_MARGIN","AXIS_TICK","HollowDot","fillOpacity","stroke","strokeWidth","ActiveHollowDot","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionFilter","summaryRate","summaryChangePct","onFilterChange","filterAnchorEl","setFilterAnchorEl","isFilterMenuOpen","handleFilterButtonClick","handleFilterMenuClose","handleFilterSelect","newFilter","noDataText","noChangeText","filteredData","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","dot","activeDot","ConversionRateChart","SignupsContainer","Legend","LegendItem","LegendColor","LegendLabel","SERIES_COLORS","dotComponentCache","Map","HollowDotFactory","strokeColor","has","set","SignupsChartComponent","signupData","onViewChange","viewAnchorEl","setViewAnchorEl","isViewMenuOpen","handleViewButtonClick","handleViewMenuClose","handleViewSelect","newView","totalSignups","lastDataPoint","latestValue","previousValue","totalLabel","membersLabel","retailLabel","brandAffiliatesLabel","showAllLabel","showMembersLabel","showRetailLabel","showBrandAffiliatesLabel","signupViewLabels","SignupsChart","PieChart","Pie","Cell","CategoriesContainer","SortMenuButton","ChartAndLegendContainer","ChartWrapper","DonutCenterOverlay","DonutCenterLabel","DonutCenterValue","DonutCenterTrend","LegendContainer","LegendInfo","LegendName","LegendValue","LegendPercentage","LegendValueWrapper","LegendTrendInline","LegendTrend","TopCategoriesPieChartComponent","categorySort","sortedCategories","nextSortedCategories","nextTotalRevenue","sum","nextTotalVolume","nextTrendDirection","nextFormattedTrend","totalRevenue","totalVolume","formattedTrend","getTrendGraphIcon","renderCustomLabel","nameKey","paddingAngle","labelLine","formatter","displayValue","displayPercentage","volumeSharePct","displayTrend","TopCategoriesPieChart","EMPTY_TOP_PRODUCTS","EMPTY_CONVERSION_DATA","EMPTY_SIGNUP_DATA","EMPTY_CATEGORIES","ShoppingDashboard","categoriesSummaryChangePct","conversionSummaryChangePct","onProductSortChange","onSignupViewChange","onConversionFilterChange","onCategorySortChange","onProductsTitleClick","onConversionTitleClick","onSignupsTitleClick","onCategoriesToTitleClick","onProductsExport","onConversionExport","onSignupsExport","onCategoriesExport","resolvedTopProducts","resolvedConversionData","resolvedSignupData","resolvedCategories","startsWith","metrics","ArrowBackIcon","CalendarTodayIcon","PageHeaderWrapper","BackButtonWrapper","BackButton","LeftSection","Title","DateRange","MobileDateRange","FilterWrapper","$breakToNewLineOnMobile","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","buildMarketFilter","PageHeader","onBack","filters","openFilter","setOpenFilter","filterKey","getOptionLabel","renderFilterIcon","iconType","isMenuOpen","selectedOption","ArrowUpwardIcon","ArrowDownwardIcon","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","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","handleFilterChange","productRows","sortedRows","paginatedRows","PRICE_TYPE_SERIES_PREFIX","PRICE_TYPE_COLORS","FALLBACK_COLORS","priceTypeSeriesKey","priceTypeColor","collectPriceTypes","forEach","ratesByPriceType","localeCompare","toSeriesPoint","series","MetricValueWithSpacing","ConversionTrendChartContainer","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ChartWithLegendWrapper","ChartLegendContainer","$color","ComparisonTextMobile","OrderIdColumnCell","TrendValueText","TrendComparisonText","MetricSectionWrapper","ConversionRateFullView","priceTypeTrend","orderColumnsVariant","priceTypeSeries","chartData","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","sortedOrders","aStr","bStr","paginatedOrders","showTotalSvOnly","getChartColor","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","shouldForwardProp","prop","$legendColor","NameColumnCell","TrendAbsoluteChangeText","TrendPercentageChangeText","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","rawPoint","signupTotal","absoluteChange","first","last","round","hasSignupTrendData","sortedSignups","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","summaryValue","summaryPercentage","summaryTrend","useTranslationResolver","translate","TranslationProvider","useTranslation","scrollWindowToTop","scrollingElement","documentElement","scrollTop","useScrollToTopOnViewChange","previousViewRef","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","conversionPriceTypeTrend","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","handleSortChange","nextSortedOffers","offer","changePct","legendTrendDirection","TopPerformingOffersPieChart","INVALID_SHEET_NAME_CHARS","normalizeExcelFileName","fileName","trimmedFileName","resolvedFileName","endsWith","normalizeExcelSheetName","sheetName","normalizedSheetName","exportRowsToExcel","rows","Workbook","workbook","worksheet","buffer","addWorksheet","header","worksheetRow","addRow","xlsx","writeBuffer","downloadExcelBuffer","blob","Blob","Uint8Array","URL","createObjectURL","link","download","body","appendChild","click","removeChild","revokeObjectURL","topProductColumns","topOfferColumns","conversionOrderColumns","exportTopProducts","exportTopPerformingOffers","exportConversionRate","useProductOfferWidgetExports","topProductsExportData","topOffersExportData","conversionExportData","showTopProductsExportOption","showTopOffersExportOption","showConversionExportOption","offerRows","sourceOrderRows","orderRows","canExportProducts","canExportOffers","canExportConversion","onTopProductsExport","onTopOffersExport","EMPTY_TOP_OFFERS","ProductOfferDashboard","dashboardTitle","conversionSummaryRate","offersSummaryChangePct","onOfferSortChange","onOffersTitleClick","resolvedTopOffers","selectedMarket","SummaryTrend","TableTrendCell","MobileOffersContainer","MobileOfferCard","MobileOfferHeader","MobileOfferName","MobileOfferMetricsGrid","MobileOfferMetricItem","MobileOfferMetricLabel","MobileOfferMetricValue","MobileOfferTrendValue","TopPerformingOffersFullView","paginatedOffers","summaryTrendDirection","isProductOfferDashboardView","PoDashboardWithNavigation","allProducts","allOffers","conversionFullViewData","conversionFullViewRate","conversionFullViewChangePct","initialOfferSort","setOfferSort","resolvedAllProducts","resolvedAllOffers","handleOfferSortChange","handleOffersTitleClick","FilterContainer","FilterBar","mockStats","mockTopProducts","mockConversionData","setDate","mockConversionDataRetail","mockConversionDataMember","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","customerType","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","Sn","Ro","nr","gs","fs","Zo","ht","fg","Nf","zi","Ea","Va","we","bt","ug","xr","ProductCarousel","Fn","V","Rc","rr","cn","Er","kn","$t","ta","$n","va","Mo","kf","mt","Xi","mu","$l","dr","Rn","Mn","xs","Ou","nn","ln","hs","Vt","an","Ru","Uc","cu","Nt","qp","Oa","Qp","zo","Xp","ec","Jp","bg","Zp","vp","kp","Il","qi","Ze","kr","uu","On","Tf","Eo"],"mappings":"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","sourcesContent":["var tc=Object.create;var En=Object.defineProperty;var oc=Object.getOwnPropertyDescriptor;var rc=Object.getOwnPropertyNames;var ac=Object.getPrototypeOf,nc=Object.prototype.hasOwnProperty;var Ia=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ic=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of rc(t))!nc.call(e,i)&&i!==o&&En(e,i,{get:()=>t[i],enumerable:!(n=oc(t,i))||n.enumerable});return e};var lc=(e,t,o)=>(o=e!=null?tc(ac(e)):{},ic(t||!e||!e.__esModule?En(o,\"default\",{value:e,enumerable:!0}):o,e));var li=Ia((Qg,ii)=>{\"use strict\";var xc=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";ii.exports=xc});var ci=Ia((eh,pi)=>{\"use strict\";var bc=li();function si(){}function di(){}di.resetWarningCache=si;pi.exports=function(){function e(n,i,l,s,p,y){if(y!==bc){var b=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 b.name=\"Invariant Violation\",b}}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:di,resetWarningCache:si};return o.PropTypes=o,o}});var mi=Ia((rh,ui)=>{\"use strict\";ui.exports=ci()();var th,oh});import{useState as sc}from\"react\";import{NsImage as dc}from\"@nuskin/foundation-ui-components\";import{styled as Wt}from\"@nuskin/foundation-theme\";var An=Wt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,zn=Wt(\"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`,Bn=Wt(\"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`,Hn=Wt(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,Wn=Wt(\"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`,Na=Wt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,_n=Wt(\"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`,Un=Wt(\"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 pc}from\"@mui/material\";import{jsx as Ct,jsxs as Kn}from\"react/jsx-runtime\";var cc=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:l,directSellerBadge:s,mySitePriceComponent:p,testId:y})=>{let[b,d]=sc(!1),w=pc(\"(max-width: 560px)\"),c=h=>{let T=h.target,S=t?.fallbackImage;S&&T.src!==S&&(T.src=S)};return Kn(zn,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:w,children:[Ct(Bn,{bgColor:t?.bgColor,onError:c,children:t?.imageSrc?Ct(dc,{\"data-testid\":y??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):Ct(Hn,{alt:\"\"})}),Ct(Wn,{title:e,\"data-testid\":\"product-title\",children:e}),s&&Ct(Na,{children:s}),Ct(Na,{children:l}),Ct(An,{children:p}),n?.showButton&&Kn(_n,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:w,isHovered:b,onClick:h=>{h.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!w&&!n?.disabled&&d(!0)},onMouseLeave:()=>{w||d(!1)},children:[Ct(Un,{className:\"cart-icon\",disabled:n?.disabled,children:Ct(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:Ct(\"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\"]})]})},Va=cc;import{useCallback as ni,useRef as mc}from\"react\";import fc from\"react-slick\";import gc from\"@mui/material/useMediaQuery\";import{NsCarouselControl as hc}from\"@nuskin/foundation-ui-components\";import{styled as Ke}from\"@nuskin/foundation-theme\";import Go from\"@mui/material/Box\";import{NsTypography as uc}from\"@nuskin/foundation-ui-components\";var Gn=Ke(Go)`\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`,jn=Ke(\"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=Ke(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,Jn=Ke(Go)`\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`,Zn=Ke(Go)`\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`,Xn=Ke(Go)`\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`,qn=Ke(Go)`\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`,Ag=Ke(\"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`,Qn=Ke(uc)`\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`,ei=Ke(\"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`,ti=Ke(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,oi=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,ri=Ke(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,ai=Ke(\"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 ct,jsxs as jo}from\"react/jsx-runtime\";function xr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:l=\"\",categoryName:s,emptyProductMessage:p=\"No Products Available For The Selected Category\",productsCountLabel:y=\"Products\",isInitialDataLoading:b,history:d}){let w=mc(null),c=gc(\"(max-width: 560px)\"),h=ni(()=>{w.current?.slickPrev()},[]),T=ni(()=>{w.current?.slickNext()},[]),S=t??((P,M)=>ct(Va,{productTitle:P.productTitle,imageDetails:P.imageDetails,button:P.button,onCardClick:P.onCardClick,productStatusBadge:P.productStatusBadge,directSellerBadge:P.directSeller,mySitePriceComponent:P.mySitePriceComponent},`${P.productTitle}-${M}`)),L={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},x=(e?.length??0)>L.slidesToShow,D=()=>e?.length===0&&!b?ct(ti,{children:p}):c?ct(jn,{children:ct(Yn,{children:e.map((P,M)=>P&&S(P,M))})}):ct(fc,{...L,ref:w,children:e.map((P,M)=>P&&S(P,M))});return jo(Gn,{children:[n&&jo(Jn,{children:[jo(oi,{children:[jo(ri,{children:[ct(Xn,{children:jo(Qn,{variant:\"body-m\",children:[e?.length??0,\" \",y]})}),!c&&s&&ct(ai,{children:s})]}),ct(Zn,{$isMobile:c,children:ct(ei,{$disabled:(e?.length??0)===0,onClick:P=>{P.preventDefault(),(e?.length??0)>0&&d&&d.push(l)},children:i})})]}),!c&&ct(qn,{$isDisabled:!x,children:ct(hc,{prev:h,next:T,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),D()]})}import{useState as co,useEffect as Aa,useCallback as Sc}from\"react\";import{useMediaQuery as Dc}from\"@mui/material\";var br=lc(mi());import*as gi from\"react\";import wc from\"@mui/material/Tabs\";import Cc from\"@mui/material/Tab\";import hi from\"@mui/material/Box\";import{styled as yc}from\"@nuskin/foundation-theme\";var fi=yc.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 vc}from\"@mui/material\";import{jsx as ko,jsxs as kc}from\"react/jsx-runtime\";function xi(e){let{children:t,value:o,index:n,...i}=e;return ko(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&ko(hi,{className:\"tabPanel\",children:t})})}xi.propTypes={children:br.default.node,index:br.default.number.isRequired,value:br.default.number.isRequired};var Ea=({itemArray:e,value:t,onChange:o})=>{let[n,i]=gi.useState(0),l=vc(\"(max-width:768px)\"),s=t??n;return ko(fi,{children:kc(hi,{className:\"tabContainer\",children:[ko(wc,{orientation:l?\"horizontal\":\"vertical\",variant:\"scrollable\",value:s,onChange:(y,b)=>{o?o(y,b):i(b)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(y=>ko(Cc,{label:y.label,className:\"tabStyle\"},y.categoryId))}),e.map(y=>ko(xi,{value:s,index:e.findIndex(b=>b.categoryId===y.categoryId),children:y.content},y.categoryId))]})})};import{NsSpinner as Pc}from\"@nuskin/foundation-ui-components\";import{styled as To}from\"@nuskin/foundation-theme\";var Tc=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",bi=To(\"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: ${Tc};\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`,yi=To(\"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`,wi=To(\"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`,hh=To(\"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`,Ci=To(\"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`,vi=To(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as uo,jsxs as Oc}from\"react/jsx-runtime\";var Mc=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:l,fetchProducts:s,showCustomCategory:p=!1,emptyProductTabs:y=\"No tabs available\",emptyProductMessage:b,productsCountLabel:d,getCategoryId:w,history:c})=>{let h=Dc(\"(max-width:768px)\"),[T,S]=co(!0),[L,x]=co([]),[D,P]=co(!1),[M,F]=co(0),[k,g]=co([]),[N,I]=co(!1),[C,O]=co(!0),u=Sc(()=>{let v=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');O(v.length===0)},[]);Aa(()=>{N&&u()},[N,u]),Aa(()=>{l().then(v=>{x(v),P(!0)})},[l]),Aa(()=>{if(D)if(L.length>0){let v=L[M]?.categoryId;w&&w(v),I(!0),s(v).then(g).finally(()=>{I(!1),S(!1)})}else I(!1)},[L,M,s,D]);let f=L.map(v=>({label:v.label,content:\"\",categoryId:v.categoryId}));return Oc(bi,{isMobile:h,$hasCategories:L.length>0,children:[p&&(f.length>0?uo(yi,{isMobile:h,children:uo(Ea,{itemArray:f,value:M,onChange:(v,H)=>F(H)})}):uo(Ci,{children:y})),uo(wi,{isMobile:h,children:N?uo(vi,{children:C&&uo(Pc,{})}):uo(xr,{isInitialDataLoading:T,entries:k,allEntryLabel:e,allEntryLink:t,renderEntry:o?v=>o({...v,productStatusBadge:v.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:L[M]?.label,emptyProductMessage:b,productsCountLabel:d,history:c})})]})},Rc=Mc;import{useState as wr,useEffect as _a,useMemo as Ic}from\"react\";import{Typography as _t,Box as Ut,useMediaQuery as Nc,Tooltip as Vc}from\"@mui/material\";import{NsLink as Ec,NsImage as Ei}from\"@nuskin/foundation-ui-components\";import{styled as Ft}from\"@nuskin/foundation-theme\";import{Box as Yo}from\"@mui/material\";import{jsx as Wa}from\"react/jsx-runtime\";var za=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),Ti=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),Si=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),ki=e=>({...za(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\"}}),Fc=e=>({...Ti(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\"}}),Di=Ft(e=>Wa(Yo,{...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\":za(o),\".phone-text\":za(o),\".social-title-text\":{...Ti(o),marginBottom:\"8px\"},\".social-icons\":{...Si(),paddingBottom:\"8px\"}})),Pi=Ft(e=>Wa(Yo,{...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\":ki(o),\".phone-text-mobile\":ki(o),\".social-title-text-mobile\":Fc(o),\".social-icons-mobile\":{...Si(),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\"}}})),Mi=Ft(Yo)({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=Ft(e=>Wa(Yo,{...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\"}})),Ri=Ft(\"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)\"}}}),Oi=Ft(Yo)`\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`,Fi=Ft(\"span\")`\n line-height: 0.5;\n`,Li=Ft(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),Ha=Ft(\"span\")({});import{Box as Lc}from\"@mui/material\";import{jsx as mo,jsxs as $c}from\"react/jsx-runtime\";var $i=({width:e,height:t,backgroundColor:o})=>mo(Lc,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:mo(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:$c(\"g\",{id:\"ns_logomark\",children:[mo(\"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\"}),mo(\"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\"}),mo(\"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\"}),mo(\"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\"}),mo(\"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 Ii}from\"react/jsx-runtime\";var Ni=({width:e=16,height:t=16,className:o=\"\"})=>Ii(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:Ii(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function yr(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 Bi,jsx as le,jsxs as ut}from\"react/jsx-runtime\";var Vi=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?le(Fi,{tabIndex:0,children:le(Ei,{className:o,src:e.imageSrc,alt:e.imageAlt})}):le(Ut,{className:n,children:le($i,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},Ai=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let l=o?\"mobile-badge\":\"tablet-badge\";return ut(Mi,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&le(Ba,{className:`${l} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:le(Ha,{className:\"badge-value\",children:i})}),t&&le(Ba,{className:`${l} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:le(Ha,{className:\"badge-value\",children:t})})]})},Ac=(e,t,o,n,i)=>{let{shopTitle:l,socialTitleText:s,email:p,showBadges:y,expirationDate:b,phone:d,totalSavings:w}=e;return ut(Ut,{className:\"content-mobile\",children:[le(_t,{component:\"h1\",tabIndex:l?.trim()?0:-1,className:\"body-title-mobile\",children:l}),!t&&ut(Bi,{children:[le(_t,{tabIndex:s?.trim()?0:-1,className:\"social-title-text-mobile\",children:s}),p?.trim()&&Cr(\"email\",p,\"email-text-mobile\"),d?.trim()&&Cr(\"phone\",d,\"phone-text-mobile\"),le(Ut,{className:\"social-icons-mobile\",children:o}),Ai(y,b??\"\",n,i,w)]})]})},zc=(e,t,o,n,i)=>{let{shopTitle:l,shopDescription:s,socialTitleText:p,email:y,phone:b,showBadges:d,expirationDate:w,totalSavings:c}=e;return ut(Ut,{className:\"content\",children:[le(_t,{component:\"h1\",tabIndex:l?.trim()?0:-1,className:\"body-title\",children:l}),!t&&ut(Bi,{children:[s?.length>480?le(Vc,{title:s,arrow:!0,children:le(_t,{tabIndex:s?.trim()?0:-1,className:\"body-text\",children:s})}):le(_t,{tabIndex:s?.trim()?0:-1,className:\"body-text\",children:s}),ut(Ut,{className:\"social-media\",children:[le(_t,{tabIndex:p?.trim()?0:-1,className:\"social-title-text\",children:p}),ut(Ut,{className:\"social-icons\",children:[o,y?.trim()&&Cr(\"email\",y,\"email-text\"),b?.trim()&&Cr(\"phone\",b,\"phone-text\")]})]}),Ai(d,w??\"\",n,i,c)]})]})},Bc=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),l=i.getContext(\"2d\");if(!l)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,l.drawImage(n,0,0);let p=[l.getImageData(0,0,1,1).data,l.getImageData(n.width-1,0,1,1).data,l.getImageData(0,n.height-1,1,1).data,l.getImageData(n.width-1,n.height-1,1,1).data].every(y=>Array.prototype.slice.call(y)[3]<10);t(p)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),Hc=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),l=Number.parseInt(o.substring(4,6),16),s=220;return n>=s&&i>=s&&l>=s},Wc=(e,t)=>({onClick:()=>{yr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),yr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),Cr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=Wc(e,t);return le(_t,{className:o,children:le(Li,{href:`${n}${t}`,...i,children:t})})};function zi({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:l,phone:s,bannerProps:p,socialIcons:y,expirationDate:b,showBadges:d=!1,totalSavings:w}){let c=Nc(\"(max-width: 560px)\"),[h,T]=wr(!1),[S,L]=wr(!1),[x,D]=wr(!1),[P,M]=wr(!1),F=()=>{L(!S)};_a(()=>{(async()=>{if(i?.imageSrc){let u=await Bc(i.imageSrc);M(u)}else M(!1)})()},[i?.imageSrc]),_a(()=>{D(Hc(p?.backgroundColor))},[p?.backgroundColor]),_a(()=>{let O,u=window.scrollY,f=!1,v=!1,H=0,m=B=>{let ie=Date.now();if(f!==B&&!v){if(ie-H<100)return;v=!0,f=B,H=ie,B&&L(!1),clearTimeout(O),T(B),O=setTimeout(()=>{v=!1,B&&window.scrollY<15&&window.scrollTo({top:c?20:30,behavior:\"smooth\"})},300)}},$=()=>{let B=window.scrollY;if(v){u=B;return}if(Math.abs(B-u)<.5)return;let tt=B>u,R=c?15:25,ee=c?8:12;tt&&B>R&&!f?m(!0):!tt&&B<ee&&f&&m(!1),u=B},E=()=>{let B=window.scrollY,tt=B>(c?5:10);f=tt,T(tt),u=B,H=Date.now()},_=null,U=0,Q=()=>{_||Date.now()-U<16||(_=requestAnimationFrame(()=>{$(),U=Date.now(),_=null}))};return E(),window.addEventListener(\"scroll\",Q,{passive:!0}),()=>{window.removeEventListener(\"scroll\",Q),_&&cancelAnimationFrame(_),clearTimeout(O)}},[c]);let k=Ic(()=>y?.map((O,u)=>le(Oi,{onClick:v=>{v.preventDefault(),yr({event:\"social_click\",social_platform:O.type,social_url:O.url,click_element:\"social_icon\"}),window.open(O.url,\"_blank\")},children:le(Ec,{href:O.url,target:\"_blank\",children:le(Ei,{src:`https://www.google.com/s2/favicons?domain=${O?.url}&sz=24`,alt:`${O.type} icon`,width:\"24\",height:\"24\"},O?.type+u)})},O?.type+u)),[y]),g=`${e} ${h?\"scrolled\":\"\"}`,N={shopTitle:t,shopDescription:o,socialTitleText:n,email:l,phone:s,showBadges:d,expirationDate:b,totalSavings:w},I=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,C=c&&o&&o.length>I();return c?ut(Pi,{className:g,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:P,hasWhiteBackground:x,children:[ut(Ut,{className:\"image-content-mobile\",children:[Vi(i,p??{},\"bg-image-mobile\"),Ac(N,h,k,c,x)]}),!h&&ut(Ut,{className:\"expandable-description-mobile\",children:[le(_t,{className:`description-content-mobile ${S||!C?\"expanded\":\"collapsed\"}`,children:o}),C&&le(Ri,{onClick:F,children:le(Ni,{width:16,height:16,className:`arrow-icon-mobile ${S?\"expanded\":\"\"}`})})]})]}):ut(Di,{className:g,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:P,hasWhiteBackground:x,children:[Vi(i,p??{},\"bg-image\"),zc(N,h,k,c,x)]})}import{styled as Jo}from\"@nuskin/foundation-theme\";var Ua=Jo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 20px;\n width: 100%;\n box-sizing: border-box;\n padding: 16px;\n\n @media (min-width: 768px) {\n gap: 24px;\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n padding: 24px;\n }\n`,Hi=Jo(\"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`,Wi=Jo(\"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=Jo(\"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`,_i=Jo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import Gc from\"@mui/icons-material/CalendarMonth\";import jc from\"@mui/icons-material/Language\";import{NsSpinner as Yc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as _c,styled as Je}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ye}=_c,Ui=Je(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 16px;\n background-color: ${({theme:e})=>Ye(e,\"N20\")};\n border-radius: 12px;\n min-height: auto;\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: 16px 20px;\n gap: 16px;\n }\n\n @media (min-width: 1080px) {\n padding: 16px 24px;\n gap: 20px;\n }\n`,Ki=Je(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,Gi=Je(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Ye(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`,ji=Je(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Ye(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Yi=Je(\"div\")`\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 24px;\n width: 100%;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,Ga=Je(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,ja=Je(\"label\")`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: 0 !important;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n`,Ya=Je(\"select\")`\n min-width: 120px;\n height: 32px;\n padding: 6px 24px 6px 8px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>Ye(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 white-space: nowrap;\n flex-shrink: 0;\n\n &:hover {\n background-color: ${({theme:e})=>Ye(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>Ye(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>Ye(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 background-position: right 8px center;\n }\n`,So=Je(\"button\")`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>Ye(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({theme:e})=>Ye(e,\"N20\")};\n }\n\n &:focus-visible {\n background-color: ${({theme:e})=>Ye(e,\"N20\")};\n outline: 2px solid ${({theme:e})=>Ye(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({theme:e})=>Ye(e,\"N70\")};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\n`,Ja=Je(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>Ye(e,\"N70\")};\n\n svg {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n`,Ji=Je(\"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`,Zi=Je(\"div\")`\n display: flex;\n flex-wrap: nowrap;\n gap: 24px;\n align-items: center;\n width: 100%;\n\n @media (min-width: 768px) {\n width: auto;\n }\n`,ax=Je(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var vr;function kr(e){vr=e}function Uc(){return vr}function Ze(e){if(!vr)return e.fallback;let t;try{t=vr(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\"},visits:{key:\"shoppingDashboard.stats.visits\",fallback:\"Site Visits\"},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\"}},market:{label:{key:\"shoppingDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"shoppingDashboard.filter.market.all\",fallback:\"All Markets\"}},productSort:{label:{key:\"shoppingDashboard.filter.productSort.label\",fallback:\"Sort By\"}},signupView:{label:{key:\"shoppingDashboard.filter.signupView.label\",fallback:\"Show\"},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:\"Overall\"},retail:{key:\"shoppingDashboard.filter.conversionType.retail\",fallback:\"Retail\"},member:{key:\"shoppingDashboard.filter.conversionType.member\",fallback:\"Member\"}}},widget:{topProducts:{title:{key:\"shoppingDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},viewAll:{key:\"shoppingDashboard.widget.topProducts.viewAll\",fallback:\"View All Products\"},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\"},rank:{key:\"shoppingDashboard.widget.topProducts.rank\",fallback:\"Rank\"}},conversionRate:{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\"},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\"},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\"},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.\"}},compareTo:{last7days:{key:\"shoppingDashboard.widget.compareTo.last7days\",fallback:\"compared to this time 7 days ago\"},last30days:{key:\"shoppingDashboard.widget.compareTo.last30days\",fallback:\"compared to this time last month\"},last90days:{key:\"shoppingDashboard.widget.compareTo.last90days\",fallback:\"compared to this time 90 days ago\"},thisMonth:{key:\"shoppingDashboard.widget.compareTo.thisMonth\",fallback:\"compared to this time last month\"}},topCategories:{title:{key:\"shoppingDashboard.widget.topCategories.title\",fallback:\"Top Categories\"},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\"},viewDetails:{key:\"shoppingDashboard.widget.menu.viewDetails\",fallback:\"View Details\"},exportData:{key:\"shoppingDashboard.widget.menu.exportData\",fallback:\"Export Data\"}}},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\"},email:{key:\"shoppingDashboard.fullView.signups.columns.email\",fallback:\"Email\"},status:{key:\"shoppingDashboard.fullView.signups.columns.status\",fallback:\"Status\"},market:{key:\"shoppingDashboard.fullView.signups.columns.market\",fallback:\"Country/Market\"}},detailsTitle:{key:\"shoppingDashboard.fullView.signups.detailsTitle\",fallback:\"Signup Details\"}},conversionRate:{columns:{orderId:{key:\"shoppingDashboard.fullView.conversionRate.columns.orderId\",fallback:\"Order ID\"},customer:{key:\"shoppingDashboard.fullView.conversionRate.columns.customer\",fallback:\"Customer\"},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\"},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\"},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\"},percentOfTotal:{key:\"shoppingDashboard.fullView.categories.columns.percentOfTotal\",fallback:\"% of Total\"}},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:\"--\"},noData:{key:\"shoppingDashboard.defaults.noData\",fallback:\"No data\"},noChange:{key:\"shoppingDashboard.defaults.noChange\",fallback:\"No change\"},byRevenue:{key:\"shoppingDashboard.defaults.byRevenue\",fallback:\"By: Revenue\"},byUnits:{key:\"shoppingDashboard.defaults.byUnits\",fallback:\"By: Units\"},byVolume:{key:\"shoppingDashboard.defaults.byVolume\",fallback:\"By: Volume\"},byTrend:{key:\"shoppingDashboard.defaults.byTrend\",fallback:\"By: Trend\"},all:{key:\"shoppingDashboard.defaults.all\",fallback:\"All\"},members:{key:\"shoppingDashboard.defaults.members\",fallback:\"Members\"},retail:{key:\"shoppingDashboard.defaults.retail\",fallback:\"Retail\"},brandAffiliates:{key:\"shoppingDashboard.defaults.brandAffiliates\",fallback:\"Brand Affiliates\"},revenue:{key:\"shoppingDashboard.defaults.revenue\",fallback:\"Revenue\"},units:{key:\"shoppingDashboard.defaults.units\",fallback:\"Units\"},volume:{key:\"shoppingDashboard.defaults.volume\",fallback:\"Volume\"},conversionRate:{key:\"shoppingDashboard.defaults.conversionRate\",fallback:\"Conversion Rate\"},trend:{key:\"shoppingDashboard.defaults.trend\",fallback:\"Trend\"},date:{key:\"shoppingDashboard.defaults.date\",fallback:\"Date\"},type:{key:\"shoppingDashboard.defaults.type\",fallback:\"Type\"},dcSv:{key:\"shoppingDashboard.defaults.dcSv\",fallback:\"DC-SV\"}}};function a(e){return Ze(e)}import{useMemo as Kc}from\"react\";function Xi(){return[{value:\"all\",label:a(r.filter.market.all)}]}function qi(e){return e&&e.length>0?e:Xi()}function nt(e){return Kc(()=>qi(e),[e])}import{jsx as Me,jsxs as Do}from\"react/jsx-runtime\";var Zo=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:l,markets:s,onDateRangeChange:p,onMarketChange:y})=>{let b=nt(s),d=T=>{let S=T.target.value;p?.(S)},w=T=>{let S=T.target.value;y?.(S)},c=T=>{T.key===\"Escape\"&&T.target.blur()},h=()=>n||(l?.dateRange?l.dateRange.label:a(r.filter.dateRange.last30days));return Do(Ui,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[Do(Ki,{children:[Me(Gi,{\"data-testid\":\"dashboard-shop-title\",children:e??l?.shopTitle??a(r.title)}),Me(ji,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:h()})]}),Me(Yi,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:Do(Zi,{children:[i&&Me(Ji,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:Me(Yc,{})}),Do(Ga,{children:[Me(ja,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRange.label)}),Me(Ja,{\"aria-hidden\":\"true\",children:Me(Gc,{})}),Do(Ya,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:d,onKeyDown:c,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[Me(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),Me(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),Me(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),Me(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),Do(Ga,{children:[Me(ja,{htmlFor:\"filter-market\",children:a(r.filter.market.label)}),Me(Ja,{\"aria-hidden\":\"true\",children:Me(jc,{})}),Me(Ya,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:w,onKeyDown:c,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${b.find(T=>T.value===o)?.label??String(o)}`,children:b.map(T=>Me(\"option\",{value:T.value,children:T.label},T.value))})]})]})})]})};import ru from\"react\";import au from\"@mui/icons-material/ShowChart\";import nu from\"@mui/icons-material/TrendingUp\";import iu from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Jc,styled as Ve}from\"@nuskin/foundation-theme\";var{getGenomeColor:Lt}=Jc,Tr=Ve(\"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\"?\"12px\":\"10px\"};\n background-color: ${({theme:e})=>Lt(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Lt(e,\"N30\")};\n border-radius: 8px;\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\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\"?\"16px\":\"12px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\n }\n\n @media (min-width: 1080px) {\n padding: ${({$layout:e})=>e===\"split\"?\"16px\":\"14px\"};\n min-height: ${({$layout:e})=>e===\"split\"?\"110px\":\"auto\"};\n }\n`,Qi=Ve(\"div\")`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>Lt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,el=Ve(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,tl=Ve(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,ol=Ve(\"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\":Lt(e,\"N70\")};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`,rl=Ve(\"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})=>Lt(e,\"N70\")};\n`,al=Ve(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.2;\n letter-spacing: 0;\n color: ${({theme:e})=>Lt(e,\"N100\")};\n margin-bottom: 2px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n @media (min-width: 1080px) {\n font-size: 14px;\n }\n`,nl=Ve(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: space-between;\n gap: 2px;\n margin-top: 10px;\n width: 100%;\n`,Za=Ve(\"div\")`\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>Lt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 24px;\n }\n\n @media (min-width: 1080px) {\n font-size: 28px;\n }\n`,il=Ve(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,ll=Ve(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 1;\n color: ${({theme:e})=>Lt(e,\"N70\")};\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,sl=Ve(\"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\":Lt(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`,Cx=Ve(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Xa=Ve(\"span\")`\n white-space: nowrap;\n`,dl=Ve(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import oe from\"@mui/material/Skeleton\";import{styled as X}from\"@nuskin/foundation-theme\";import Xo from\"@mui/material/Skeleton\";var Sr=X(\"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`,Dr=X(\"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`,pl=X(\"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`,cl=X(\"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`,ul=X(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,ml=X(\"div\")`\n margin-top: 8px;\n`,fl=X(Xo)`\n margin-top: 4px;\n`,gl=X(\"div\")`\n flex: 1;\n min-width: 0;\n`,hl=X(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,xl=X(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,bl=X(\"div\")`\n padding-top: 4px;\n`,yl=X(Xo)`\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`,wl=X(\"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`,Cl=X(Xo)`\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`,vl=X(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,kl=X(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,Tl=X(\"div\")`\n flex: 1;\n`,Zc=X(\"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`,Xc=X(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,qc=X(\"div\")`\n display: flex;\n gap: 16px;\n`,Qc=X(\"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`,eu=X(\"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`,qa=X(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,Sl=X(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,Dl=X(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,Pl=X(Xo)`\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`,Qa=X(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,Pr=X(Xo)`\n border-radius: 4px;\n`,Ml=X(\"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 W,jsxs as se}from\"react/jsx-runtime\";var qo=()=>se(cl,{\"data-testid\":\"skeleton-stats-card\",children:[se(ul,{children:[W(oe,{variant:\"text\",width:80,height:18}),W(oe,{variant:\"text\",width:48,height:16})]}),se(ml,{children:[W(oe,{variant:\"text\",width:120,height:36}),W(fl,{variant:\"text\",width:100,height:16})]})]}),tu=()=>se(pl,{children:[W(oe,{variant:\"rounded\",width:28,height:28}),W(oe,{variant:\"rounded\",width:50,height:50}),se(gl,{children:[W(oe,{variant:\"text\",width:\"70%\",height:18}),W(oe,{variant:\"text\",width:\"50%\",height:14})]}),se(hl,{children:[W(oe,{variant:\"text\",width:80,height:18}),W(oe,{variant:\"text\",width:48,height:14})]})]}),Rl=()=>se(Sr,{\"data-testid\":\"skeleton-products-list\",children:[se(Dr,{children:[W(oe,{variant:\"text\",width:160,height:22}),W(oe,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>W(tu,{},e))]}),Mr=()=>se(Sr,{\"data-testid\":\"skeleton-chart-widget\",children:[se(Dr,{children:[W(oe,{variant:\"text\",width:140,height:22}),W(oe,{variant:\"rounded\",width:110,height:32})]}),se(xl,{children:[W(oe,{variant:\"text\",width:100,height:36}),se(bl,{children:[W(oe,{variant:\"text\",width:60,height:18}),W(oe,{variant:\"text\",width:140,height:14})]})]}),W(yl,{variant:\"rounded\",width:\"100%\"})]}),ou=()=>se(kl,{children:[W(oe,{variant:\"circular\",width:12,height:12}),se(Tl,{children:[W(oe,{variant:\"text\",width:\"60%\",height:16}),W(oe,{variant:\"text\",width:\"40%\",height:14})]}),W(oe,{variant:\"text\",width:36,height:18})]}),Rr=()=>se(Sr,{\"data-testid\":\"skeleton-categories-pie\",children:[se(Dr,{children:[W(oe,{variant:\"text\",width:140,height:22}),W(oe,{variant:\"rounded\",width:100,height:32})]}),se(wl,{children:[W(Cl,{variant:\"circular\"}),W(vl,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>W(ou,{},e))})]})]});var Kt=()=>se(qa,{\"data-testid\":\"skeleton-fullview-chart\",children:[se(Sl,{children:[se(Dl,{children:[W(oe,{variant:\"text\",width:140,height:52}),W(oe,{variant:\"text\",width:80,height:24}),W(oe,{variant:\"text\",width:160,height:16})]}),W(Pl,{variant:\"rounded\",width:\"100%\"})]}),se(Qa,{children:[W(oe,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>W(Pr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),Ol=()=>se(qa,{\"data-testid\":\"skeleton-fullview-table\",children:[se(Ml,{children:[W(qo,{}),W(qo,{}),W(qo,{})]}),se(Qa,{children:[W(oe,{variant:\"text\",width:200,height:24}),W(Pr,{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=>W(Pr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as Ge,jsxs as Gt}from\"react/jsx-runtime\";var lu=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:l=\"neutral\",trendValue:s,testId:p,isLoading:y=!1})=>{if(y)return Ge(Tr,{$layout:i,\"data-testid\":p,children:Ge(qo,{})});let b=()=>{let w=a(r.stats.trend.unchanged);return l===\"up\"?w=a(r.stats.trend.increased):l===\"down\"&&(w=a(r.stats.trend.decreased)),`${e} ${w} ${s??\"\"}`},d=w=>l===\"up\"?Ge(nu,{sx:{fontSize:w},\"aria-hidden\":\"true\"}):l===\"down\"?Ge(iu,{sx:{fontSize:w},\"aria-hidden\":\"true\"}):Ge(au,{sx:{fontSize:w},\"aria-hidden\":\"true\"});return i===\"split\"?Gt(Tr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Ge(Qi,{id:`stats-title-${p}`,children:e}),Gt(el,{children:[Ge(Za,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),(s??n)&&Gt(tl,{children:[s&&Gt(ol,{as:\"output\",direction:l,\"aria-live\":\"polite\",\"aria-label\":b(),\"data-testid\":`stats-trend-${p}`,children:[d(\"18px\"),Ge(Xa,{children:s})]}),n&&Ge(rl,{\"data-testid\":`stats-caption-${p}`,children:n})]})]})]}):Gt(Tr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Ge(dl,{children:Ge(al,{id:`stats-title-${p}`,children:e})}),Gt(nl,{children:[Gt(il,{children:[Ge(Za,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),o&&Ge(ll,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${p}`,children:o})]}),s&&Gt(sl,{as:\"output\",direction:l,\"aria-live\":\"polite\",\"aria-label\":b(),\"data-testid\":`stats-trend-${p}`,children:[d(\"16px\"),Ge(Xa,{children:s})]})]})]})},$t=ru.memo(lu);$t.displayName=\"StatsCard\";import es from\"react\";import Tu from\"@mui/icons-material/ShoppingCart\";import Su from\"@mui/icons-material/KeyboardArrowDown\";import Du from\"@mui/material/Menu\";import on from\"@mui/material/MenuItem\";import su from\"@mui/icons-material/ShowChart\";import du from\"@mui/icons-material/TrendingUp\";import pu from\"@mui/icons-material/TrendingDown\";import{jsx as Or}from\"react/jsx-runtime\";function Fl(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function It(e){let t=Fl(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function jt(e,t,o){let{weightedSum:n,weight:i}=e.reduce((p,y)=>{let b=Fl(o(y));return b===null?p:{weightedSum:p.weightedSum+b*t(y),weight:p.weight+t(y)}},{weightedSum:0,weight:0}),l=i>0?n/i:0,s=\"neutral\";return l>0?s=\"up\":l<0&&(s=\"down\"),{direction:s,formatted:`${l>0?\"+\":\"\"}${l.toFixed(1)}%`}}function Po(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function Nt(e){switch(e){case\"up\":return Or(du,{});case\"down\":return Or(pu,{});case\"neutral\":default:return Or(su,{})}}function cu(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}function Fr(e,t){let{cx:o,cy:n,midAngle:i,innerRadius:l,outerRadius:s,percentage:p}=e,y=Math.PI/180,b=l+(s-l)/2,d=o+b*Math.cos(-i*y),w=n+b*Math.sin(-i*y);return Or(\"text\",{x:d,y:w,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"middle\",fontSize:t?.fontSize??\"10\",fontWeight:t?.fontWeight??\"600\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0.2\",children:`${p}%`})}import{useMemo as Ll}from\"react\";function $l(e,t){return Math.ceil(e.length/t)}function Il(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function uu(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let l=n[t],s=i[t];return o===\"asc\"?l-s:s-l})}function mu(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function vt(e,t,o){let n=Ll(()=>$l(e,o),[e,o]),i=Ll(()=>Il(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function Y(e){switch(e){case\"IN\":return\"en-IN\";case\"CA\":return\"en-CA\";case\"US\":default:return\"en-US\"}}function J(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,currencyDisplay:\"narrowSymbol\",...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return`$${n!==void 0?i.toFixed(n):new Intl.NumberFormat(o,{minimumFractionDigits:0,maximumFractionDigits:2}).format(i)}`}function Qo(e){return!e||e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function Yt(e,t){switch(t){case\"members\":return e.members;case\"retail\":return e.retail;case\"brandAffiliates\":return e.brandAffiliates;case\"all\":default:return e.total}}import{ColorUtils as fu,styled as Ce}from\"@nuskin/foundation-theme\";var{getGenomeColor:de}=fu,Lr=Ce(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>de(e,\"N20\")};\n border: 1px solid ${({theme:e})=>de(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`,en=Ce(\"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=Ce(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,tn=Ce(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>de(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})=>de(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`,Yx=Ce(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>de(e,\"N20\")};\n border: 1px solid ${({theme:e})=>de(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>de(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>de(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>de(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>de(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Vl=Ce(\"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`,El=Ce(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>de(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})=>de(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>de(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`,Al=Ce(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>de(e,\"A10\")};\n color: ${({theme:e})=>de(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`,zl=Ce(\"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`,Bl=Ce(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>de(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>de(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`,Hl=Ce(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,Wl=Ce(\"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})=>de(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`,_l=Ce(\"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})=>de(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,Ul=Ce(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,Kl=Ce(\"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})=>de(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Gl=Ce(\"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\":de(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`,jl=Ce(\"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})=>de(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>de(e,\"N50\")};\n }\n`,Yl=Ce(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>de(e,\"N70\")};\n`;import{useState as bu}from\"react\";import yu from\"@mui/material/Menu\";import Xl from\"@mui/material/MenuItem\";import ql from\"@mui/material/ListItemIcon\";import Ql from\"@mui/material/ListItemText\";import wu from\"@mui/icons-material/MoreVert\";import Cu from\"@mui/icons-material/Visibility\";import vu from\"@mui/icons-material/FileDownload\";import gu from\"@mui/material/IconButton\";import{styled as hu,ColorUtils as xu}from\"@nuskin/foundation-theme\";var{getGenomeColor:Jl}=xu,Zl=hu(gu)(({theme:e})=>({padding:\"4px\",color:Jl(e,\"N100\"),\"&:hover\":{backgroundColor:Jl(e,\"N20\")}}));import{Fragment as ku,jsx as Jt,jsxs as $r}from\"react/jsx-runtime\";var mt=({widgetId:e,onFullView:t,onExport:o})=>{let[n,i]=bu(null),l=!!n,s=`widget-menu-button-${e}`,p=`widget-menu-${e}`,y=c=>{i(c.currentTarget)},b=()=>{i(null)},d=()=>{b(),t&&t()},w=()=>{b(),o&&o()};return $r(ku,{children:[Jt(Zl,{id:s,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":l?p:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":l?\"true\":void 0,onClick:y,size:\"small\",children:Jt(wu,{fontSize:\"small\"})}),$r(yu,{id:p,\"data-testid\":`widget-menu-${e}`,anchorEl:n,open:l,onClose:b,MenuListProps:{\"aria-labelledby\":s},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[$r(Xl,{onClick:d,\"data-testid\":\"widget-menu-item-viewdetails\",children:[Jt(ql,{children:Jt(Cu,{fontSize:\"small\"})}),Jt(Ql,{children:a(r.widget.menu.viewDetails)})]}),o&&$r(Xl,{onClick:w,\"data-testid\":\"widget-menu-item-export\",children:[Jt(ql,{children:Jt(vu,{fontSize:\"small\"})}),Jt(Ql,{children:a(r.widget.menu.exportData)})]})]})]})};import{jsx as be,jsxs as ft}from\"react/jsx-runtime\";var Pu=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,market:i,onSortChange:l,onTitleClick:s,onExport:p})=>{let[y,b]=es.useState(null),d=!!y,w=C=>{b(C.currentTarget)},c=()=>{b(null)},h=C=>{b(null),l?.(C)},T=(C,O)=>{switch(O){case\"units\":return`${C.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return J(C.revenue,C.currencyCode,Y(i));case\"volume\":return`${C.volume.toLocaleString()} ${a(r.defaults.dcSv)}`;default:return`${C.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},S=(C,O)=>{switch(O){case\"units\":return`${J(C.revenue,C.currencyCode,Y(i))} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${C.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${J(C.revenue,C.currencyCode,Y(i))} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${J(C.revenue,C.currencyCode,Y(i))} ${a(r.widget.topProducts.revenueSuffix)}`}},L=(C,O)=>{let u=C.trend;if(!u)return\"\";let f=\"\";switch(O){case\"units\":f=u.units??\"\";break;case\"revenue\":f=u.revenue??\"\";break;case\"volume\":f=u.volume??\"\";break;default:f=u.units??\"\"}return f},x=(C,O)=>{let u=L(C,O);return It(u)},D=C=>Nt(C),P=e.slice(0,n),M=a(r.widget.topProducts.rank),F=a(r.defaults.trend),k=a(r.defaults.byUnits),g=a(r.defaults.byRevenue),N=a(r.defaults.byVolume),I={units:k,revenue:g,volume:N};return o&&e.length===0?be(Lr,{\"data-testid\":\"widget-top-products\",children:be(Rl,{})}):e.length===0?ft(Lr,{\"data-testid\":\"widget-top-products\",children:[be(en,{children:be(tn,{children:a(r.widget.topProducts.title)})}),ft(jl,{\"data-testid\":\"products-empty-state\",children:[be(Tu,{}),be(Yl,{children:a(r.widget.topProducts.empty)})]})]}):ft(Lr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[ft(en,{children:[be(tn,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),ft(Nl,{children:[ft(So,{id:\"product-sort-button\",\"data-testid\":\"product-sort-dropdown\",onClick:w,disabled:o,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":d?\"product-sort-menu\":void 0,\"aria-expanded\":d?\"true\":void 0,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[I[t],be(Su,{fontSize:\"small\"})]}),ft(Du,{id:\"product-sort-menu\",\"data-testid\":\"product-sort-menu\",anchorEl:y,open:d,onClose:c,MenuListProps:{\"aria-labelledby\":\"product-sort-button\"},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[be(on,{\"data-testid\":\"product-sort-option-units\",selected:t===\"units\",onClick:()=>h(\"units\"),children:k}),be(on,{\"data-testid\":\"product-sort-option-revenue\",selected:t===\"revenue\",onClick:()=>h(\"revenue\"),children:g}),be(on,{\"data-testid\":\"product-sort-option-volume\",selected:t===\"volume\",onClick:()=>h(\"volume\"),children:N})]}),be(mt,{widgetId:\"top-products\",onFullView:s,onExport:p})]})]}),be(Vl,{as:\"ul\",\"data-testid\":\"products-list\",children:P.map((C,O)=>{let u=x(C,t),f=L(C,t);return ft(El,{as:\"li\",\"data-testid\":`product-item-${O}`,\"aria-label\":`${M} ${C.rank}: ${C.name}, ${T(C,t)}`,children:[be(Al,{\"aria-label\":`${M} ${C.rank}`,children:C.rank}),C.imageUrl?be(zl,{src:C.imageUrl,alt:C.name,loading:\"lazy\",onError:v=>{v.currentTarget.hidden=!0}}):be(Bl,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:C.name.substring(0,2).toUpperCase()}),ft(Hl,{children:[be(Wl,{title:C.name,children:C.name}),be(_l,{children:S(C,t)})]}),ft(Ul,{children:[be(Kl,{children:T(C,t)}),f&&ft(Gl,{as:\"output\",direction:u,\"aria-live\":\"polite\",\"aria-label\":`${F}: ${Po(u)} ${f}`,children:[D(u),be(\"span\",{children:f})]})]})]},C.id)})})]})},Mo=es.memo(Pu);Mo.displayName=\"TopSellingProductsList\";import Et from\"react\";import{LineChart as $u,Line as Iu,XAxis as Nu,YAxis as Vu,CartesianGrid as Eu,Tooltip as Au,ResponsiveContainer as zu}from\"recharts\";import Bu from\"@mui/icons-material/KeyboardArrowDown\";import Hu from\"@mui/material/Menu\";import sn from\"@mui/material/MenuItem\";import{ColorUtils as Mu,styled as Ee}from\"@nuskin/foundation-theme\";var{getGenomeColor:he}=Mu,rn=Ee(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>he(e,\"N20\")};\n border: 1px solid ${({theme:e})=>he(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`,ts=Ee(\"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`,os=Ee(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,rs=Ee(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,as=Ee(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>he(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})=>he(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`,Pb=Ee(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>he(e,\"N20\")};\n border: 1px solid ${({theme:e})=>he(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>he(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>he(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>he(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>he(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,ns=Ee(\"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`,is=Ee(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>he(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,ls=Ee(\"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\":he(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})=>he(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,ss=Ee(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>he(e,\"N100\")};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,ds=Ee(\"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})=>he(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>he(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,ps=Ee(\"div\")`\n background-color: ${({theme:e})=>he(e,\"N100\")};\n border: 1px solid ${({theme:e})=>he(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,cs=Ee(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>he(e,\"N10\")};\n margin-bottom: 4px;\n`,us=Ee(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>he(e,\"A10\")};\n`,ms=Ee(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>he(e,\"N30\")};\n margin-top: 2px;\n`;var it=\"last30days\",fs={last7days:7,last30days:30,last90days:90,thisMonth:31},gs={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function Ru(e){return fs[e]??30}function an(e){return gs[e]??\"Last 30 Days\"}function Ou(e){return an(e)}function hs(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var Fu={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 Ir(e){let t=e.split(\" \");return t.length!==2?e:`${Fu[t[0]]||t[0]}/${t[1]}`}function nn(e){let t=new Date(e);return hs(t)}function xs(e,t){return`${nn(e)} - ${nn(t)}`}function ln(e){return e.toISOString().split(\"T\")[0]}function ve(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),l,s=new Date(o,n,i);switch(e){case\"last7days\":l=new Date(o,n,i-7);break;case\"last30days\":l=new Date(o,n,i-30);break;case\"last90days\":l=new Date(o,n,i-90);break;case\"thisMonth\":l=new Date(o,n,1),s=new Date(o,n+1,0);break;default:return\"N/A\"}return xs(ln(l),ln(s))}function Vt(e){let t=r.widget.compareTo;switch(e){case\"last7days\":return Ze(t.last7days);case\"last30days\":return Ze(t.last30days);case\"last90days\":return Ze(t.last90days);case\"thisMonth\":return Ze(t.thisMonth);default:return Ze(t.last30days)}}function Lu(e,t){return t===\"all\"||e.priceTypes===void 0?!0:e.priceTypes.some(o=>o.toLowerCase()===t)}function Nr(e,t){return e.filter(o=>Lu(o,t))}import{jsx as re,jsxs as Xe}from\"react/jsx-runtime\";var Wu={top:5,right:10,left:-10,bottom:5},bs={fontSize:10},_u=e=>{let{cx:t,cy:o,r:n=3}=e;return re(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},Uu=e=>{let{cx:t,cy:o,r:n=5}=e;return re(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},Ku=e=>`${e}%`,Gu=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Xe(ps,{children:[re(cs,{children:o.date}),Xe(us,{children:[(o.rate??0).toFixed(2),\"%\"]}),Xe(ms,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},ju=({conversionData:e,conversionFilter:t,dateRange:o=it,isLoading:n=!1,title:i,summaryRate:l,summaryChangePct:s,onFilterChange:p,onTitleClick:y,onExport:b})=>{let[d,w]=Et.useState(null),c=!!d,h=Et.useCallback(g=>{w(g.currentTarget)},[]),T=Et.useCallback(()=>{w(null)},[]),S=Et.useCallback(g=>{w(null),p?.(g)},[p]),L=a(r.defaults.noData),x=a(r.defaults.noChange),D=Et.useMemo(()=>Nr(e,t),[e,t]),P=Et.useMemo(()=>typeof l==\"number\"&&Number.isFinite(l)?l:D.at(-1)?.rate??0,[l,D]),M=Et.useMemo(()=>{if(s!==void 0){if(s===null||Math.abs(s)<.1)return{direction:\"neutral\",value:x};let f=s>0?\"up\":\"down\",v=`${s>0?\"+\":\"\"}${s.toFixed(2)}%`;return{direction:f,value:v}}if(D.length<2)return{direction:\"neutral\",value:L};let g=D.at(-1)?.rate??0,N=D[0].rate;if(N===0)return{direction:\"neutral\",value:x};let I=g-N,C=I/N*100;if(Math.abs(C)<.1)return{direction:\"neutral\",value:x};let O=I>0?\"up\":\"down\",u=`${I>0?\"+\":\"\"}${I.toFixed(2)}%`;return{direction:O,value:u}},[s,D,x,L]),F=Et.useMemo(()=>D.map(g=>({...g,shortDate:Ir(g.date)})),[D]);if(n&&e.length===0)return re(rn,{\"data-testid\":\"widget-conversion-rate\",children:re(Mr,{})});let k=a(r.widget.conversionRate.chartAriaLabel);return Xe(rn,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":k,children:[re(ts,{children:Xe(os,{children:[re(as,{as:\"button\",onClick:y,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:i??a(r.defaults.conversionRate)}),Xe(rs,{children:[Xe(So,{id:\"conversion-filter-button\",\"data-testid\":\"conversion-filter-dropdown\",onClick:h,disabled:n,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":c?\"conversion-filter-menu\":void 0,\"aria-expanded\":c?\"true\":void 0,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[t===\"retail\"&&a(r.filter.conversionType.retail),t===\"member\"&&a(r.filter.conversionType.member),t===\"all\"&&a(r.filter.conversionType.all),re(Bu,{fontSize:\"small\"})]}),Xe(Hu,{id:\"conversion-filter-menu\",\"data-testid\":\"conversion-filter-menu\",anchorEl:d,open:c,onClose:T,MenuListProps:{\"aria-labelledby\":\"conversion-filter-button\"},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[re(sn,{\"data-testid\":\"conversion-filter-option-all\",selected:t===\"all\",onClick:()=>S(\"all\"),children:a(r.filter.conversionType.all)}),re(sn,{\"data-testid\":\"conversion-filter-option-retail\",selected:t===\"retail\",onClick:()=>S(\"retail\"),children:a(r.filter.conversionType.retail)}),re(sn,{\"data-testid\":\"conversion-filter-option-member\",selected:t===\"member\",onClick:()=>S(\"member\"),children:a(r.filter.conversionType.member)})]}),re(mt,{widgetId:\"conversion-rate\",onFullView:y,onExport:b})]})]})}),Xe(ns,{children:[Xe(is,{\"aria-label\":`${a(r.defaults.conversionRate)}: ${P.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[P.toFixed(2),\"%\"]}),M.value!==L&&Xe(ls,{as:\"output\",direction:M.direction,\"aria-live\":\"polite\",\"aria-label\":`${Po(M.direction)} ${M.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Xe(\"div\",{className:\"trend-line\",children:[re(\"span\",{\"aria-hidden\":\"true\",children:Nt(M.direction)}),re(\"span\",{className:\"change-value\",children:M.value.replace(\"%\",\"\")}),re(\"span\",{className:\"change-percent\",children:\"%\"})]}),re(\"div\",{className:\"comparison-text\",children:Vt(o)})]})]}),re(ss,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),re(ds,{\"data-testid\":\"conversion-chart\",children:re(zu,{width:\"100%\",height:\"100%\",minHeight:200,children:Xe($u,{data:F,margin:Wu,children:[re(Eu,{strokeDasharray:\"3 3\"}),re(Nu,{dataKey:\"shortDate\",tick:bs,tickLine:!1,interval:\"preserveStartEnd\"}),re(Vu,{tick:bs,tickLine:!1,tickFormatter:Ku,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),re(Au,{content:Gu}),re(Iu,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:re(_u,{}),activeDot:re(Uu,{})})]})})})]})},Ro=Et.memo(ju);Ro.displayName=\"ConversionRateChart\";import Zt from\"react\";import{LineChart as Ju,Line as Oo,XAxis as Zu,YAxis as Xu,CartesianGrid as qu,Tooltip as Qu,ResponsiveContainer as em}from\"recharts\";import tm from\"@mui/icons-material/KeyboardArrowDown\";import om from\"@mui/material/Menu\";import Vr from\"@mui/material/MenuItem\";import{ColorUtils as Yu,styled as qe}from\"@nuskin/foundation-theme\";var{getGenomeColor:Re}=Yu,dn=qe(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>Re(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Re(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`,ys=qe(\"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`,ws=qe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Cs=qe(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>Re(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})=>Re(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`,e0=qe(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>Re(e,\"N20\")};\n border: 1px solid ${({theme:e})=>Re(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Re(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>Re(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>Re(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>Re(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,vs=qe(\"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`,ks=qe(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>Re(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,Ts=qe(\"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\":Re(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})=>Re(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Ss=qe(\"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})=>Re(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>Re(e,\"N70\")};\n font-size: 10px;\n }\n`,Ds=qe(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,er=qe(\"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})=>Re(e,\"N30\")};\n }\n`,tr=qe(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,or=qe(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>Re(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as nm,jsx as G,jsxs as Ae}from\"react/jsx-runtime\";var ke={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},rm={top:5,right:10,left:-10,bottom:5},Ps={fontSize:10},pn=new Map,Fo=e=>{if(pn.has(e))return pn.get(e);let t=o=>{let{cx:n=0,cy:i=0,r:l=2}=o;return G(\"circle\",{cx:n,cy:i,r:l,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:e,strokeWidth:\"1.5\",style:{pointerEvents:\"none\"}})};return t.displayName=\"HollowDot\",pn.set(e,t),t},am=({signupData:e,signupView:t,dateRange:o=it,isLoading:n=!1,title:i,onViewChange:l,onTitleClick:s,onExport:p})=>{let[y,b]=Zt.useState(null),d=!!y,w=Zt.useCallback(u=>{b(u.currentTarget)},[]),c=Zt.useCallback(()=>{b(null)},[]),h=Zt.useCallback(u=>{b(null),l?.(u)},[l]),T=a(r.defaults.noData),S=a(r.defaults.noChange),L=Zt.useMemo(()=>{if(e.length===0)return 0;let u=e[e.length-1];return Yt(u,t)},[e,t]),x=Zt.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:T};let u=Yt(e[e.length-1],t),f=Yt(e[0],t),v=u-f,H=f===0?0:v/f*100;if(Math.abs(H)<.1)return{direction:\"neutral\",value:S};let m=v>0?\"up\":\"down\",$=`${v>0?\"+\":\"\"}${v} (${H.toFixed(1)}%)`;return{direction:m,value:$}},[S,T,e,t]),D=Zt.useMemo(()=>e.map(u=>({...u,shortDate:Ir(u.date)})),[e]),P=a(r.widget.signups.total),M=a(r.defaults.members),F=a(r.defaults.retail),k=a(r.defaults.brandAffiliates),g=a(r.filter.signupView.showAll),N=a(r.filter.signupView.showMembers),I=a(r.filter.signupView.showRetail),C=a(r.filter.signupView.showBrandAffiliates),O={all:g,members:N,retail:I,brandAffiliates:C};return n&&e.length===0?G(dn,{\"data-testid\":\"widget-signups\",children:G(Mr,{})}):Ae(dn,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[Ae(ys,{children:[G(Cs,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:i??a(r.widget.signups.title)}),Ae(ws,{children:[Ae(So,{id:\"signup-view-button\",\"data-testid\":\"signup-view-dropdown\",onClick:w,disabled:n,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":d?\"signup-view-menu\":void 0,\"aria-expanded\":d?\"true\":void 0,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[O[t],G(tm,{fontSize:\"small\"})]}),Ae(om,{id:\"signup-view-menu\",\"data-testid\":\"signup-view-menu\",anchorEl:y,open:d,onClose:c,MenuListProps:{\"aria-labelledby\":\"signup-view-button\"},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[G(Vr,{\"data-testid\":\"signup-view-option-all\",selected:t===\"all\",onClick:()=>h(\"all\"),children:g}),G(Vr,{\"data-testid\":\"signup-view-option-members\",selected:t===\"members\",onClick:()=>h(\"members\"),children:N}),G(Vr,{\"data-testid\":\"signup-view-option-retail\",selected:t===\"retail\",onClick:()=>h(\"retail\"),children:I}),G(Vr,{\"data-testid\":\"signup-view-option-brandAffiliates\",selected:t===\"brandAffiliates\",onClick:()=>h(\"brandAffiliates\"),children:C})]}),G(mt,{widgetId:\"signups\",onFullView:s,onExport:p})]})]}),Ae(vs,{\"data-testid\":\"signups-metric-display\",children:[G(ks,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${P}: ${L.toLocaleString()}`,children:L.toLocaleString()}),x.value!==T&&Ae(Ts,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:x.direction,\"aria-live\":\"polite\",\"aria-label\":`${Po(x.direction)} ${x.value}`,children:[Ae(\"div\",{className:\"trend-line\",children:[G(\"span\",{\"aria-hidden\":\"true\",children:Nt(x.direction)}),G(\"span\",{className:\"change-value\",children:x.value.split(\" \")[0]}),G(\"span\",{className:\"change-percent\",children:x.value.split(\" \")[1]})]}),G(\"div\",{className:\"comparison-text\",children:Vt(o)})]})]}),G(Ss,{\"data-testid\":\"signups-chart\",children:G(em,{width:\"100%\",height:\"100%\",minHeight:200,children:Ae(Ju,{data:D,margin:rm,children:[G(qu,{strokeDasharray:\"3 3\"}),G(Zu,{dataKey:\"shortDate\",tick:Ps,tickLine:!1,interval:\"preserveStartEnd\"}),G(Xu,{tick:Ps,tickLine:!1}),G(Qu,{}),(t===\"all\"||t===\"members\")&&G(Oo,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?ke.total:ke.members,strokeWidth:2,dot:Fo(t===\"all\"?ke.total:ke.members),name:t===\"all\"?P:M}),t===\"all\"&&Ae(nm,{children:[G(Oo,{type:\"monotone\",dataKey:\"members\",stroke:ke.members,strokeWidth:2,dot:Fo(ke.members),name:M}),G(Oo,{type:\"monotone\",dataKey:\"retail\",stroke:ke.retail,strokeWidth:2,dot:Fo(ke.retail),name:F}),G(Oo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:ke.brandAffiliates,strokeWidth:2,dot:Fo(ke.brandAffiliates),name:k})]}),t===\"retail\"&&G(Oo,{type:\"monotone\",dataKey:\"retail\",stroke:ke.retail,strokeWidth:2,dot:Fo(ke.retail),name:F}),t===\"brandAffiliates\"&&G(Oo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:ke.brandAffiliates,strokeWidth:2,dot:Fo(ke.brandAffiliates),name:k})]})})}),t===\"all\"&&Ae(Ds,{\"data-testid\":\"signups-legend\",children:[Ae(er,{\"data-testid\":\"legend-total\",children:[G(tr,{color:ke.total}),G(or,{children:P})]}),Ae(er,{\"data-testid\":\"legend-members\",children:[G(tr,{color:ke.members}),G(or,{children:M})]}),Ae(er,{\"data-testid\":\"legend-retail\",children:[G(tr,{color:ke.retail}),G(or,{children:F})]}),Ae(er,{\"data-testid\":\"legend-brandAffiliates\",children:[G(tr,{color:ke.brandAffiliates}),G(or,{children:k})]})]})]})},Er=Zt.memo(am);Er.displayName=\"SignupsChart\";import Io from\"react\";import{PieChart as lm,Pie as sm,Cell as dm,ResponsiveContainer as pm,Tooltip as cm}from\"recharts\";import um from\"@mui/icons-material/TrendingUp\";import mm from\"@mui/icons-material/TrendingDown\";import fm from\"@mui/icons-material/KeyboardArrowDown\";import gm from\"@mui/material/Menu\";import Os from\"@mui/material/MenuItem\";import{ColorUtils as im,styled as pe}from\"@nuskin/foundation-theme\";var{getGenomeColor:me}=im,Xt=pe(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>me(e,\"N20\")};\n border: 1px solid ${({theme:e})=>me(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`,Lo=pe(\"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`,Ar=pe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,$o=pe(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>me(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})=>me(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`,Ms=pe(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>me(e,\"N20\")};\n border: 1px solid ${({theme:e})=>me(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>me(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>me(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>me(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>me(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Rs=pe(\"button\")`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>me(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({theme:e})=>me(e,\"N20\")};\n }\n\n &:focus-visible {\n background-color: ${({theme:e})=>me(e,\"N20\")};\n outline: 2px solid ${({theme:e})=>me(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({theme:e})=>me(e,\"N70\")};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\n`,zr=pe(\"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`,Br=pe(\"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`,Hr=pe(\"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`,Wr=pe(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>me(e,\"N70\")};\n`,_r=pe(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>me(e,\"N100\")};\n`,Ur=pe(\"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\":me(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Kr=pe(\"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`,Gr=pe(\"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})=>me(e,\"N30\")};\n }\n`,jr=pe(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Yr=pe(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Jr=pe(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>me(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`,Zr=pe(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>me(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,w0=pe(\"div\")`\n display: none;\n`,Xr=pe(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,qr=pe(\"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`,C0=pe(\"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`,Qr=pe(\"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})=>me(e,\"N70\")};\n`,ea=pe(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>me(e,\"N70\")};\n`;import{Fragment as xm,jsx as ae,jsxs as ze}from\"react/jsx-runtime\";var hm=({categories:e,categorySort:t,isLoading:o=!1,title:n,market:i,summaryChangePct:l,onSortChange:s,onTitleClick:p,onExport:y})=>{let[b,d]=Io.useState(null),w=!!b,c=Io.useCallback(g=>{d(g.currentTarget)},[]),h=Io.useCallback(()=>{d(null)},[]),T=Io.useCallback(g=>{d(null),s?.(g)},[s]),{sortedCategories:S,totalRevenue:L,totalVolume:x,trendDirection:D,formattedTrend:P}=Io.useMemo(()=>{let g=[...e].sort((u,f)=>t===\"revenue\"?f.revenue-u.revenue:(f.volume??0)-(u.volume??0)),N=g.reduce((u,f)=>u+f.revenue,0),I=g.reduce((u,f)=>u+(f.volume??0),0),C,O;if(l!=null)Math.abs(l)<.1?(O=\"0%\",C=\"neutral\"):(C=l>0?\"up\":\"down\",O=`${l>0?\"+\":\"\"}${l.toFixed(1)}%`);else{let{direction:u,formatted:f}=jt(g,v=>t===\"volume\"?v.volume??0:v.revenue,v=>t===\"volume\"?v.trend?.volume:v.trend?.revenue);C=u,O=f}return{sortedCategories:g,totalRevenue:N,totalVolume:I,trendDirection:C,formattedTrend:O}},[e,t,l]),M=g=>g===\"up\"?ae(um,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):g===\"down\"?ae(mm,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,F=g=>Fr(g,{fontSize:\"10\",fontWeight:\"600\"}),k=S[0]?.currencyCode;return o&&e.length===0?ae(Xt,{\"data-testid\":\"widget-top-categories\",children:ae(Rr,{})}):e.length===0?ze(Xt,{\"data-testid\":\"widget-top-categories\",children:[ae(Lo,{children:ae($o,{children:n??a(r.widget.topCategories.title)})}),ae(Qr,{\"data-testid\":\"categories-empty-state\",children:ae(ea,{children:a(r.widget.topCategories.empty)})})]}):ze(Xt,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[ze(Lo,{children:[ae($o,{as:\"button\",onClick:p,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),ze(Ar,{children:[ze(Rs,{id:\"category-sort-button\",\"data-testid\":\"category-sort-dropdown\",onClick:c,disabled:o,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":w?\"category-sort-menu\":void 0,\"aria-expanded\":w?\"true\":void 0,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[t===\"volume\"?a(r.defaults.byVolume):a(r.defaults.byRevenue),ae(fm,{fontSize:\"small\"})]}),ze(gm,{id:\"category-sort-menu\",\"data-testid\":\"category-sort-menu\",anchorEl:b,open:w,onClose:h,MenuListProps:{\"aria-labelledby\":\"category-sort-button\"},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[ae(Os,{\"data-testid\":\"category-sort-option-revenue\",selected:t===\"revenue\",onClick:()=>T(\"revenue\"),children:a(r.defaults.byRevenue)}),ae(Os,{\"data-testid\":\"category-sort-option-volume\",selected:t===\"volume\",onClick:()=>T(\"volume\"),children:a(r.defaults.byVolume)})]}),ae(mt,{widgetId:\"top-categories\",onFullView:p,onExport:y})]})]}),ze(zr,{children:[ze(Br,{\"data-testid\":\"categories-chart\",children:[ae(pm,{width:\"100%\",height:\"100%\",children:ze(lm,{children:[ae(sm,{data:S,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:t===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,label:F,labelLine:!1,children:S.map(g=>ae(dm,{fill:g.color},`cell-${g.id}`))}),ae(cm,{formatter:g=>J(g,k,Y(i))})]})}),ze(Hr,{\"data-testid\":\"categories-donut-center\",children:[ae(Wr,{children:t===\"volume\"?a(r.defaults.volume):a(r.stats.revenue)}),ae(_r,{children:t===\"volume\"?ze(xm,{children:[x.toFixed(1),ae(\"br\",{}),a(r.defaults.dcSv)]}):J(L,k,Y(i))}),ze(Ur,{direction:D,children:[M(D),ae(\"span\",{children:P})]})]})]}),ae(Kr,{\"data-testid\":\"categories-legend-container\",children:S.map((g,N)=>{let I=t===\"volume\"?g.volume:g.revenue,C=t===\"volume\"?g.volumeSharePct:g.percentage,O=t===\"volume\"?g.trend?.volume:g.trend?.revenue;return ze(Gr,{\"data-testid\":`category-legend-${N}`,children:[ae(jr,{color:g.color}),ze(Yr,{children:[ae(Jr,{children:g.name.charAt(0).toUpperCase()+g.name.slice(1)}),ze(Xr,{children:[ae(Zr,{children:t===\"volume\"?`${I?.toFixed(1)} (${C}%)`:`${J(I??0,g.currencyCode,Y(i))} (${C}%)`}),O?ae(qr,{direction:It(O),\"data-testid\":`category-legend-trend-${N}`,\"aria-label\":O,children:M(It(O))}):null]})]})]},g.id)})})]})]})},ta=Io.memo(hm);ta.displayName=\"TopCategoriesPieChart\";import{jsx as At,jsxs as fo}from\"react/jsx-runtime\";var bm=[],ym=[],wm=[],Cm=[],cn=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:l=!1,error:s,shopTitle:p,className:y,dateRange:b=it,market:d=\"all\",productSort:w=\"units\",signupView:c=\"all\",conversionFilter:h=\"all\",categorySort:T=\"revenue\",categoriesSummaryChangePct:S,conversionSummaryChangePct:L,markets:x,onDateRangeChange:D,onMarketChange:P,onProductSortChange:M,onSignupViewChange:F,onConversionFilterChange:k,onCategorySortChange:g,onProductsTitleClick:N,onConversionTitleClick:I,onSignupsTitleClick:C,onCategoriesToTitleClick:O,onProductsExport:u,onConversionExport:f,onSignupsExport:v,onCategoriesExport:H})=>{let m=t??bm,$=o??ym,E=n??wm,_=i??Cm;if(s)return At(Ua,{as:\"main\",className:y,\"aria-label\":a(r.ariaLabel.dashboard),children:fo(_i,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[fo(\"strong\",{children:[a(r.error),\":\"]}),\" \",s]})});let U=Q=>Q?Q.startsWith(\"+\")?\"up\":Q.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return fo(Ua,{as:\"main\",className:y,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":l,children:[At(Zo,{shopTitle:p,dateRange:b,market:d,isLoading:l,stats:e,markets:x,onDateRangeChange:D,onMarketChange:P}),fo(Hi,{as:\"section\",\"data-testid\":\"stats-row\",\"aria-label\":a(r.ariaLabel.statsRow),children:[At($t,{title:a(r.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:U(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:l}),At($t,{title:a(r.defaults.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.defaults.dcSv),trendDirection:U(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:l}),At($t,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.defaults.conversionRate)}`,trendDirection:U(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:l})]}),fo(Wi,{\"data-testid\":\"widget-container\",children:[fo(Ka,{\"data-testid\":\"widget-row-1\",children:[At(Mo,{products:m,productSort:w,isLoading:l,maxProducts:5,market:d,onSortChange:M,onTitleClick:N,onExport:u}),At(Er,{signupData:E,signupView:c,dateRange:b,isLoading:l,onViewChange:F,onTitleClick:C,onExport:v})]}),fo(Ka,{\"data-testid\":\"widget-row-2\",children:[At(Ro,{conversionData:$,conversionFilter:h,dateRange:b,isLoading:l,summaryChangePct:L,onFilterChange:k,onTitleClick:I,onExport:f}),At(ta,{categories:_,categorySort:T,isLoading:l,market:d,summaryChangePct:S,onSortChange:g,onTitleClick:O,onExport:H})]})]})]})};import ce from\"react\";import ho,{useState as hn}from\"react\";import km from\"react\";import Tm from\"@mui/icons-material/ArrowBack\";import Sm from\"@mui/icons-material/CalendarToday\";import Dm from\"@mui/icons-material/Language\";import Pm from\"@mui/icons-material/KeyboardArrowDown\";import Mm from\"@mui/material/Menu\";import Rm from\"@mui/material/MenuItem\";import{ColorUtils as vm,styled as Be}from\"@nuskin/foundation-theme\";var{getGenomeColor:Te}=vm,Fs=Be(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 12px;\n`,Ls=Be(\"div\")`\n display: flex;\n align-items: center;\n`,$s=Be(\"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})=>Te(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})=>Te(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>Te(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`,Is=Be(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>Te(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-start;\n gap: 16px;\n }\n`,Ns=Be(\"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`,Vs=Be(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>Te(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,Es=Be(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>Te(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,As=Be(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>Te(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,zs=Be(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-wrap: wrap;\n align-items: center;\n gap: 16px 24px;\n flex: 1 1 auto;\n min-width: 0;\n }\n`,Bs=Be(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n\n @media (max-width: 767px) {\n flex-basis: ${({$breakToNewLineOnMobile:e})=>e?\"100%\":\"auto\"};\n min-width: 0;\n }\n`,Hs=Be(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>Te(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,Z0=Be(\"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})=>Te(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})=>Te(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>Te(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>Te(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`,Ws=Be(\"button\")`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>Te(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({theme:e})=>Te(e,\"N20\")};\n }\n\n &:focus-visible {\n background-color: ${({theme:e})=>Te(e,\"N20\")};\n outline: 2px solid ${({theme:e})=>Te(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({theme:e})=>Te(e,\"N70\")};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\n`,_s=Be(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 16px;\n }\n`,Us=Be(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>Te(e,\"N100\")};\n margin: 0;\n`;import{jsx as Qe,jsxs as qt}from\"react/jsx-runtime\";function kt(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 Tt(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 we=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let[l,s]=km.useState(null),p=(c,h)=>{s({key:c,anchorEl:h.currentTarget})},y=()=>{s(null)},b=(c,h)=>{s(null),i?.(c,h)},d=(c,h)=>c.label&&c.key===\"customerType\"?`${c.label} ${h.label}`:h.label,w=c=>c?qt(Hs,{children:[c===\"calendar\"&&Qe(Sm,{}),c===\"globe\"&&Qe(Dm,{})]}):null;return qt(Fs,{\"data-testid\":\"page-header\",children:[Qe(Ls,{children:qt($s,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[Qe(Tm,{}),Qe(\"span\",{children:a(r.navigation.backToDashboard)})]})}),qt(_s,{children:[Qe(Us,{children:e}),Qe(As,{children:t})]}),qt(Is,{children:[qt(Ns,{children:[Qe(Vs,{\"data-testid\":\"page-header-title\",children:e}),Qe(Es,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&Qe(zs,{\"data-testid\":\"page-header-filters\",children:n.map(c=>{let h=l?.key===c.key,T=c.options.find(x=>x.value===c.value),S=`filter-menu-${c.key}`,L=`filter-button-${c.key}`;return qt(Bs,{$breakToNewLineOnMobile:!c.icon,children:[w(c.icon),qt(Ws,{id:L,\"data-testid\":`filter-dropdown-${c.key}`,onClick:x=>p(c.key,x),disabled:c.disabled,type:\"button\",\"aria-haspopup\":\"true\",\"aria-controls\":h?S:void 0,\"aria-expanded\":h?\"true\":void 0,\"aria-label\":`${c.label} ${a(r.ariaLabel.filterSuffix)}`,children:[T?d(c,T):c.value,Qe(Pm,{fontSize:\"small\"})]}),Qe(Mm,{id:S,\"data-testid\":`filter-menu-${c.key}`,anchorEl:h?l.anchorEl:null,open:h,onClose:y,MenuListProps:{\"aria-labelledby\":L},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:c.options.map(x=>Qe(Rm,{\"data-testid\":`filter-dropdown-${c.key}-option-${x.value}`,selected:x.value===c.value,onClick:()=>b(c.key,x.value),children:d(c,x)},x.value))})]},c.key)})})]})]})};import Fm from\"@mui/icons-material/ArrowUpward\";import Lm from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as Om,styled as zt}from\"@nuskin/foundation-theme\";var{getGenomeColor:St}=Om,Ks=zt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>St(e,\"N30\")};\n`,Gs=zt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,js=zt(\"thead\")`\n background-color: ${({theme:e})=>St(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>St(e,\"N40\")};\n`,Ys=zt(\"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})=>St(e,\"N20\")};\n color: ${({theme:e})=>St(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})=>St(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>St(e,\"A70\")};\n outline-offset: -2px;\n }\n`,Js=zt(\"tbody\")``,un=zt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>St(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>St(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,mn=zt(\"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})=>St(e,\"N70\")};\n text-align: left;\n`,Zs=zt(mn)`\n text-align: center;\n`,Xs=zt(\"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 gt,jsxs as qs}from\"react/jsx-runtime\";var ht=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:l=\"asc\",getRowKey:s})=>{let p=d=>{if(!o||!n)return;n(d,i===d&&l===\"asc\"?\"desc\":\"asc\")},y=(d,w)=>{(d.key===\"Enter\"||d.key===\" \")&&(d.preventDefault(),p(w))},b=d=>{if(i===d)return l===\"asc\"?\"ascending\":\"descending\"};return gt(Ks,{\"data-testid\":\"data-table\",children:qs(Gs,{children:[gt(js,{children:gt(\"tr\",{children:e.map(d=>qs(Ys,{scope:\"col\",sortable:o&&d.sortable,onClick:()=>d.sortable&&p(d.key),onKeyDown:w=>d.sortable&&y(w,d.key),tabIndex:o&&d.sortable?0:-1,\"aria-sort\":b(d.key),\"aria-label\":`${d.label}${d.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${d.key}`,children:[d.label,o&&d.sortable&&gt(Xs,{isActive:i===d.key,children:i===d.key&&l===\"desc\"?gt(Lm,{}):gt(Fm,{})})]},d.key))})}),gt(Js,{children:t.length===0?gt(un,{\"data-testid\":\"table-empty-row\",children:gt(Zs,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((d,w)=>gt(un,{\"data-testid\":`table-row-${w}`,children:e.map(c=>gt(mn,{\"data-testid\":`table-cell-${c.key}`,children:c.render?c.render(d[c.key],d):d[c.key]},c.key))},s?s(d,w):w))})]})})};import Im from\"@mui/icons-material/ChevronLeft\";import Nm from\"@mui/icons-material/ChevronRight\";import{ColorUtils as $m,styled as oa}from\"@nuskin/foundation-theme\";var{getGenomeColor:xt}=$m,Qs=oa(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,ra=oa(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?xt(e,\"A80\"):xt(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":xt(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?xt(e,\"A70\"):xt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>xt(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,aa=oa(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>xt(e,\"N70\")};\n margin: 0 8px;\n`,fn=oa(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>xt(e,\"N20\")};\n color: ${({theme:e})=>xt(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})=>xt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>xt(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 ed,jsx as Bt,jsxs as na}from\"react/jsx-runtime\";var bt=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let l=()=>{e>1&&o(e-1)},s=()=>{e<t&&o(e+1)},p=(h,T)=>{(h.key===\"Enter\"||h.key===\" \")&&(h.preventDefault(),T())},b=(()=>{if(t<=7)return Array.from({length:t},(T,S)=>S+1);let h=[];return e<=4?h.push(1,2,3,4,5):e>=t-3?h.push(t-4,t-3,t-2,t-1,t):h.push(e-1,e,e+1),h})(),d=n?(e-1)*n+1:null,w=n?Math.min(e*n,i??1/0):null,c=a(r.pagination.goToPage);return na(Qs,{\"data-testid\":\"pagination\",children:[Bt(fn,{onClick:l,onKeyDown:h=>p(h,l),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:Bt(Im,{})}),t>7&&e>4&&na(ed,{children:[Bt(ra,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${c} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),Bt(aa,{children:\"...\"})]}),b.map(h=>Bt(ra,{onClick:()=>o(h),isActive:e===h,\"aria-label\":`${c} ${h}`,\"aria-current\":e===h?\"page\":void 0,\"data-testid\":`pagination-page-${h}`,type:\"button\",children:h},h)),t>7&&e<t-3&&na(ed,{children:[Bt(aa,{children:\"...\"}),Bt(ra,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${c} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),Bt(fn,{onClick:s,onKeyDown:h=>p(h,s),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:Bt(Nm,{})}),n&&i&&na(aa,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[d,\"-\",w,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as Le}from\"@mui/material/styles\";import{Box as Qt,Typography as go}from\"@mui/material\";import{ColorUtils as Vm}from\"@nuskin/foundation-theme\";var{getGenomeColor:td}=Vm,Se=Le(Qt)`\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`,ia=Le(Qt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>td(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`,la=Le(Qt)`\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`,sa=Le(go)`\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`,da=Le(Qt)`\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`,My=Le(go)`\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`,pa=Le(Qt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,eo=Le(\"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`,Ry=Le(Qt)`\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`,to=Le(Qt)`\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: ${td(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,Oy=Le(Qt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,oo=Le(go)`\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`,od=Le(go)`\n font-weight: 600;\n font-size: 14px;\n`,rd=Le(go)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ad=Le(go)`\n font-size: 13px;\n`,nd=Le(go)`\n font-size: 13px;\n color: ${({theme:e,status:t})=>t===\"Active\"?e.palette.success.main:e.palette.warning.main};\n`;import{styled as $e}from\"@mui/material/styles\";import{Box as ro,Typography as ao}from\"@mui/material\";import{ColorUtils as Em}from\"@nuskin/foundation-theme\";var{getGenomeColor:gn}=Em,id=$e(ro)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,ld=$e(ao)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,sd=$e(ao)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ca=$e(ao)`\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})=>gn(e,\"N70\")};\n`,dd=$e(ro)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,pd=$e(ro)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,cd=$e(ro)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>gn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,ud=$e(ro)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,md=$e(ao)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,fd=$e(ro)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,gd=$e(ao)`\n font-size: 0.875rem;\n font-weight: 600;\n`,hd=$e(ao)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,xd=$e(ro)`\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`,ua=$e(ro)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,ma=$e(ao)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,fa=$e(ao)`\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})=>gn(e,\"N70\")};\n`;import Am from\"@mui/material/useMediaQuery\";var zm=\"(max-width:767px)\";function Dt(){return Am(zm,{noSsr:!0})}import{jsx as fe,jsxs as lt}from\"react/jsx-runtime\";function Bm(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 rr=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:l=!1,onBack:s,onDateRangeChange:p,onMarketChange:y,onProductSortChange:b})=>{let[d,w]=hn(1),[c,h]=hn(n===\"revenue\"?\"revenue\":\"units\"),[T,S]=hn(\"desc\"),L=10,x=Dt(),D=ho.useCallback(()=>s?.(),[s]),P=nt(i),M=ho.useMemo(()=>[kt(t,r),Tt(o,P,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"units\",label:a(r.defaults.units)},{value:\"revenue\",label:a(r.defaults.revenue)},{value:\"volume\",label:a(r.defaults.volume)}]}],[t,o,P,n]),F=ho.useCallback((f,v)=>{f===\"dateRange\"?p?.(v):f===\"market\"?y?.(v):f===\"sort\"&&(b?.(v),w(1))},[p,y,b]),k=ho.useCallback((f,v)=>{h(f),S(v),w(1)},[]),g=ho.useMemo(()=>e.map(Bm),[e]),N=ho.useMemo(()=>[...g].sort((f,v)=>{let H=f[c],m=v[c];return T===\"asc\"?H-m:m-H}),[g,c,T]),{totalPages:I,pageItems:C}=vt(N,d,L),O=e[0]?.currencyCode,u=ho.useMemo(()=>[{key:\"rank\",label:a(r.fullView.products.columns.rank),sortable:!0},{key:\"name\",label:a(r.fullView.products.columns.product),sortable:!0,render:(f,v)=>lt(id,{children:[fe(ld,{children:v.name}),fe(sd,{children:v.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:f=>fe(ca,{children:Number(f).toLocaleString()})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:f=>fe(ca,{children:J(Number(f),O,Y(o))})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:f=>fe(ca,{children:Number(f).toLocaleString()})}],[O,o]);return l?lt(Se,{\"data-testid\":\"products-full-view\",children:[fe(we,{title:a(r.widget.topProducts.title),dateRange:ve(t),onBack:D,filters:M,onFilterChange:F}),fe(Ol,{})]}):e.length===0?lt(Se,{\"data-testid\":\"products-full-view\",children:[fe(we,{title:a(r.widget.topProducts.title),dateRange:ve(t),onBack:D,filters:M,onFilterChange:F}),fe(oo,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):lt(Se,{\"data-testid\":\"products-full-view\",children:[fe(we,{title:a(r.widget.topProducts.title),dateRange:ve(t),onBack:D,filters:M,onFilterChange:F}),x?fe(dd,{\"data-testid\":\"products-fullview-mobile-cards\",children:C.map(f=>lt(cd,{children:[lt(ud,{children:[lt(md,{children:[\"#\",f.rank]}),lt(fd,{children:[fe(gd,{children:f.name}),fe(hd,{children:f.sku})]})]}),lt(xd,{children:[lt(ua,{children:[fe(ma,{children:a(r.defaults.units)}),fe(fa,{children:f.units.toLocaleString()})]}),lt(ua,{children:[fe(ma,{children:a(r.defaults.revenue)}),fe(fa,{children:J(f.revenue,O,Y(o))})]}),lt(ua,{children:[fe(ma,{children:a(r.defaults.volume)}),fe(fa,{children:f.volume.toLocaleString()})]})]})]},f.rank))}):fe(pd,{\"data-testid\":\"products-fullview-desktop-table\",children:fe(ht,{columns:u,data:C,sortable:!0,onSort:k,sortColumn:c,sortDirection:T,getRowKey:f=>f.rank})}),I>1&&fe(bt,{currentPage:d,totalPages:I,onPageChange:w,itemsPerPage:L,totalItems:N.length})]})};import He,{useState as Cn}from\"react\";import{LineChart as Km,Line as Ed,XAxis as Gm,YAxis as jm,CartesianGrid as Ym,Tooltip as Jm,ResponsiveContainer as Zm}from\"recharts\";import Xm from\"@mui/icons-material/ArrowUpward\";import qm from\"@mui/icons-material/ArrowDownward\";var Hm=\"rate__\",Wm={retail:\"#2e7d32\",member:\"#ed6c02\"},bd=[\"#1976d2\",\"#9c27b0\",\"#00897b\",\"#c2185b\"];function xn(e){return`${Hm}${e}`}function bn(e,t){return Wm[e.toLowerCase()]??bd[t%bd.length]}function yd(e){let t=[];return e.forEach(o=>{Object.keys(o.ratesByPriceType??{}).forEach(n=>{t.includes(n)||t.push(n)})}),t.sort((o,n)=>o.localeCompare(n))}function yn(e,t){let o={};return t.forEach(n=>{o[xn(n)]=e.ratesByPriceType?.[n]??0}),{...e,...o}}import{styled as ge}from\"@mui/material/styles\";import{Box as st,Typography as ar}from\"@mui/material\";import{ColorUtils as _m}from\"@nuskin/foundation-theme\";var{getGenomeColor:Um}=_m,wd=ge(sa)`\n margin-right: 6px;\n`,Cd=ge(st)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,vd=ge(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})=>Um(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,kd=ge(st)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,Td=ge(st)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,Sd=ge(ar)`\n font-size: 1rem;\n font-weight: 600;\n`,Dd=ge(ar)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Pd=ge(\"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`,Md=ge(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`,ga=ge(st)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,ha=ge(ar)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,xa=ge(ar)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Rd=ge(st)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Od=ge(st)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Fd=ge(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`,Ld=ge(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`,wn=ge(st)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({$color:e})=>e??\"inherit\"};\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`,rw=ge(ar)`\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`,$d=ge(\"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`,Id=ge(\"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`,Nd=ge(\"span\")`\n margin-left: 2px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 400;\n font-size: 12px;\n line-height: 16px;\n letter-spacing: 0.01em;\n color: #5f5f5f;\n`,Vd=ge(st)`\n display: flex;\n align-items: center;\n gap: 0;\n flex-wrap: wrap;\n`;import{jsx as j,jsxs as De}from\"react/jsx-runtime\";var nr=({conversionData:e,priceTypeTrend:t,orders:o,summaryRate:n,summaryChangePct:i,dateRange:l,market:s,conversionFilter:p,markets:y,orderColumnsVariant:b=\"default\",isLoading:d=!1,onBack:w,onDateRangeChange:c,onMarketChange:h,onConversionFilterChange:T})=>{let[S,L]=Cn(1),[x,D]=Cn(void 0),[P,M]=Cn(\"asc\"),F=10,k=Dt(),g=He.useCallback(()=>w?.(),[w]),N=nt(y),I=He.useMemo(()=>Nr(e,p),[e,p]),C=He.useMemo(()=>p===\"all\"?yd(t??[]):[],[p,t]),O=He.useMemo(()=>C.length>0?(t??[]).map(R=>yn(R,C)):I.map(R=>yn(R,C)),[C,t,I]),u=He.useMemo(()=>typeof n==\"number\"&&Number.isFinite(n)?n:I.at(-1)?.rate??0,[n,I]),f=He.useMemo(()=>{if(i!==void 0){if(i===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let dt=\"neutral\";return i>0?dt=\"up\":i<0&&(dt=\"down\"),{direction:dt,value:`${i>=0?\"+\":\"\"}${i.toFixed(1)}%`}}if(I.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let R=I.at(-1)?.rate??0,ee=I[0].rate;if(ee===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let Pe=(R-ee)/ee*100;if(Math.abs(Pe)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let Ie=\"neutral\";return Pe>0?Ie=\"up\":Pe<0&&(Ie=\"down\"),{direction:Ie,value:`${Pe>=0?\"+\":\"\"}${Pe.toFixed(1)}%`}},[i,I]),v=He.useCallback(R=>R===\"retail\"?a(r.filter.conversionType.retail):R===\"member\"?a(r.filter.conversionType.member):a(r.filter.conversionType.all),[]),H=He.useMemo(()=>v(p),[p,v]),m=He.useMemo(()=>[kt(l,r),Tt(s,N,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:p,options:[{value:\"all\",label:a(r.filter.conversionType.all)},{value:\"retail\",label:a(r.filter.conversionType.retail)},{value:\"member\",label:a(r.filter.conversionType.member)}]}],[p,l,s,N]),$=He.useCallback((R,ee)=>{R===\"dateRange\"?c?.(ee):R===\"market\"?h?.(ee):R===\"customerType\"&&(T?.(ee),L(1))},[T,c,h]),E=He.useMemo(()=>p===\"all\"?o:o.filter(R=>R.priceType?.toLowerCase()===p),[o,p]),_=He.useCallback((R,ee)=>{D(R),M(ee),L(1)},[]),U=He.useMemo(()=>x?[...E].sort((R,ee)=>{let Pe=R[x],Ie=ee[x];if(typeof Pe==\"number\"&&typeof Ie==\"number\")return P===\"asc\"?Pe-Ie:Ie-Pe;let dt=String(Pe??\"\"),lo=String(Ie??\"\");return P===\"asc\"?dt.localeCompare(lo):lo.localeCompare(dt)}):E,[E,x,P]),{totalPages:Q,pageItems:B}=vt(U,S,F),ie=He.useMemo(()=>{let R=b===\"sv\";return[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:ee=>j($d,{children:ee})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},...R?[]:[{key:\"customerType\",label:a(r.defaults.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:(ee,Pe)=>J(Number(ee),Pe.currencyCode,Y(s),2)},{key:\"bv\",label:a(R?r.fullView.conversionRate.columns.totalSv:r.fullView.conversionRate.columns.bv),sortable:!0}]},[s,b]),tt=He.useCallback(()=>p===\"retail\"?\"#2e7d32\":p===\"member\"?\"#ed6c02\":\"#1976d2\",[p]);return d?De(Se,{\"data-testid\":\"conversion-rate-full-view\",children:[j(we,{title:a(r.defaults.conversionRate),dateRange:ve(l),onBack:g,filters:m,onFilterChange:$}),j(Kt,{})]}):De(Se,{\"data-testid\":\"conversion-rate-full-view\",children:[j(we,{title:a(r.defaults.conversionRate),dateRange:ve(l),onBack:g,filters:m,onFilterChange:$}),De(ia,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[j(la,{children:De(Vd,{children:[De(wd,{\"data-testid\":\"conversion-rate-value\",children:[u.toFixed(1),\"%\"]}),De(da,{direction:f.direction,\"data-testid\":\"conversion-rate-trend\",children:[f.direction===\"up\"&&j(Xm,{}),f.direction===\"down\"&&j(qm,{}),j(Id,{children:f.value}),j(Nd,{children:Vt(l)})]})]})}),j(pa,{children:De(Fd,{children:[j(Cd,{\"data-testid\":\"conversion-fullview-chart\",children:j(Zm,{width:\"100%\",height:\"100%\",children:De(Km,{data:O,margin:{top:10,right:10,left:0,bottom:0},children:[j(Ym,{strokeDasharray:\"3 3\"}),j(Gm,{dataKey:\"date\"}),j(jm,{tickFormatter:R=>`${R}%`,domain:[0,\"auto\"]}),j(Jm,{formatter:R=>typeof R==\"number\"?`${R.toFixed(2)}%`:typeof R==\"string\"?R:a(r.fullView.conversionRate.notAvailable)}),C.length>0?C.map((R,ee)=>j(Ed,{type:\"monotone\",dataKey:xn(R),stroke:bn(R,ee),strokeWidth:2,name:R,dot:!1},R)):j(Ed,{type:\"monotone\",dataKey:\"rate\",stroke:tt(),strokeWidth:2,name:`${a(r.defaults.conversionRate)} (${H})`,dot:!1})]})})}),j(Ld,{children:C.length>0?C.map((R,ee)=>j(wn,{$color:bn(R,ee),children:R},R)):j(wn,{$color:tt(),children:`${a(r.defaults.conversionRate)} (${H})`})})]})})]}),De(to,{\"data-testid\":\"conversion-fullview-table-section\",children:[De(eo,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",E.length,\")\"]}),k?j(Rd,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:B.map(R=>De(vd,{children:[De(kd,{children:[De(Td,{children:[j(Sd,{children:R.customerName}),j(Dd,{children:R.date})]}),j(Pd,{children:R.orderId})]}),De(Md,{children:[De(ga,{children:[j(ha,{children:a(r.fullView.conversionRate.columns.items)}),j(xa,{children:R.items})]}),De(ga,{children:[j(ha,{children:a(r.fullView.conversionRate.columns.total)}),De(xa,{children:[\"$\",R.total.toFixed(2)]})]}),De(ga,{children:[j(ha,{children:a(r.fullView.conversionRate.columns.totalSv)}),j(xa,{children:R.bv})]})]})]},R.orderId))}):j(Od,{\"data-testid\":\"conversion-fullview-desktop-table\",children:j(ht,{columns:ie,data:B,sortable:!0,onSort:_,sortColumn:x,sortDirection:P,getRowKey:R=>R.orderId})}),Q>1&&j(bt,{currentPage:S,totalPages:Q,onPageChange:L,itemsPerPage:F,totalItems:E.length})]})]})};import Ht,{useState as vn}from\"react\";import{Box as of}from\"@mui/material\";import{LineChart as rf,Line as bo,XAxis as af,YAxis as nf,CartesianGrid as lf,Tooltip as sf,ResponsiveContainer as df}from\"recharts\";import pf from\"@mui/icons-material/TrendingUp\";import cf from\"@mui/icons-material/TrendingDown\";import{styled as yt}from\"@mui/material/styles\";import{Box as xo,Typography as Qm}from\"@mui/material\";import{ColorUtils as ef}from\"@nuskin/foundation-theme\";var{getGenomeColor:tf}=ef,Ad=yt(xo)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,zd=yt(xo)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Bd=yt(xo)`\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})=>tf(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,Hd=yt(xo)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,Wd=yt(Qm)`\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`,_d=yt(xo)`\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`,ir=yt(xo)`\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`,no=yt(xo,{shouldForwardProp:e=>e!==\"$legendColor\"})`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({$legendColor:e,theme:t})=>e??t.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`,Ud=yt(\"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`,Kd=yt(\"span\")`\n font-weight: 600;\n line-height: 1;\n`,Gd=yt(\"span\")`\n font-weight: 400;\n line-height: 1;\n`;import{Fragment as jd,jsx as z,jsxs as We}from\"react/jsx-runtime\";var je={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function io(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 uf(e){if(e==null||typeof e!=\"object\")return[];if(Array.isArray(e))return e;let t=e;return Array.isArray(t.daily)?t.daily.map(o=>({date:String(o.date??\"\"),total:io(o.total),members:io(o.members),retail:io(o.retail),brandAffiliates:io(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var kn=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:l,isLoading:s=!1,onBack:p,onDateRangeChange:y,onMarketChange:b,onSignupViewChange:d})=>{let[w,c]=vn(1),[h,T]=vn(void 0),[S,L]=vn(\"asc\"),x=10,D=Dt(),P=Ht.useCallback(()=>p?.(),[p]),M=nt(l),F=Ht.useMemo(()=>uf(e).map($=>{let E=$,_=io(E.members),U=io(E.retail),Q=io(E.brandAffiliates??E.brandAffiliate??E.brand_affiliates??E.brand_affiliate),B=io(E.total??E.all??E.signupTotal??E.value);return{...$,total:B>0?B:_+U+Q,members:_,retail:U,brandAffiliates:Q}}),[e]),k=Ht.useMemo(()=>{if(F.length===0)return 0;let m=F[F.length-1];return Yt(m,i)},[F,i]),g=Ht.useMemo(()=>{if(F.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let m=Yt(F[0],i),$=Yt(F[F.length-1],i);if(m<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let E=$-m,_=E/m*100,U=\"neutral\";return _>0?U=\"up\":_<0&&(U=\"down\"),{direction:U,absoluteChange:Math.round(E),percentageChange:`${_>=0?\"+\":\"\"}${_.toFixed(1)}%`}},[F,i,r]),N=F.length>0,I=Ht.useMemo(()=>[kt(o,r),Tt(n,M,r),{key:\"signupView\",label:a(r.filter.signupView.label),value:i,options:[{value:\"all\",label:a(r.defaults.all)},{value:\"members\",label:a(r.defaults.members)},{value:\"retail\",label:a(r.defaults.retail)},{value:\"brandAffiliates\",label:a(r.defaults.brandAffiliates)}]}],[o,n,M,i]),C=Ht.useCallback((m,$)=>{m===\"dateRange\"?y?.($):m===\"market\"?b?.($):m===\"signupView\"&&(d?.($),c(1))},[y,b,d]),O=Ht.useCallback((m,$)=>{T(m),L($),c(1)},[]),u=Ht.useMemo(()=>h?[...t].sort((m,$)=>{let E=m[h],_=$[h];if(typeof E==\"number\"&&typeof _==\"number\")return S===\"asc\"?E-_:_-E;let U=String(E??\"\"),Q=String(_??\"\");return S===\"asc\"?U.localeCompare(Q):Q.localeCompare(U)}):t,[t,h,S]),{totalPages:f,pageItems:v}=vt(u,w,x),H=Ht.useMemo(()=>[{key:\"id\",label:a(r.fullView.signups.columns.id),sortable:!0},{key:\"name\",label:a(r.fullView.signups.columns.name),sortable:!0,render:m=>z(Ud,{children:m})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"type\",label:a(r.defaults.type),sortable:!0},{key:\"market\",label:a(r.fullView.signups.columns.market),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 s?We(Se,{\"data-testid\":\"signups-full-view\",children:[z(we,{title:a(r.widget.signups.title),dateRange:ve(o),onBack:P,filters:I,onFilterChange:C}),z(Kt,{})]}):We(Se,{\"data-testid\":\"signups-full-view\",children:[z(we,{title:a(r.widget.signups.title),dateRange:ve(o),onBack:P,filters:I,onFilterChange:C}),We(ia,{\"data-testid\":\"signups-fullview-metric-chart\",children:[We(la,{children:[z(sa,{\"data-testid\":\"signups-total\",children:k.toLocaleString()}),We(da,{direction:g.direction,children:[g.direction===\"up\"&&z(pf,{}),g.direction===\"down\"&&z(cf,{}),g.direction!==\"neutral\"&&We(jd,{children:[We(Kd,{children:[g.absoluteChange>0?\"+\":\"\",g.absoluteChange]}),z(Gd,{children:g.percentageChange})]}),g.direction===\"neutral\"&&z(\"span\",{children:g.percentageChange})]}),z(Wd,{children:Vt(o)})]}),z(pa,{children:N?We(_d,{children:[z(Hd,{\"data-testid\":\"signups-fullview-chart\",children:z(df,{width:\"100%\",height:\"100%\",minHeight:240,children:We(rf,{data:F,children:[z(lf,{strokeDasharray:\"3 3\"}),z(af,{dataKey:\"date\"}),z(nf,{}),z(sf,{}),i===\"all\"&&We(jd,{children:[z(bo,{type:\"monotone\",dataKey:\"total\",stroke:je.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),z(bo,{type:\"monotone\",dataKey:\"members\",stroke:je.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),z(bo,{type:\"monotone\",dataKey:\"retail\",stroke:je.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),z(bo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:je.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&z(bo,{type:\"monotone\",dataKey:\"members\",stroke:je.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&z(bo,{type:\"monotone\",dataKey:\"retail\",stroke:je.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&z(bo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:je.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),We(of,{children:[i===\"all\"&&We(ir,{children:[z(no,{$legendColor:je.total,children:a(r.widget.signups.total)}),\" \",z(no,{$legendColor:je.members,children:a(r.defaults.members)}),z(no,{$legendColor:je.retail,children:a(r.defaults.retail)}),z(no,{$legendColor:je.brandAffiliates,children:a(r.defaults.brandAffiliates)})]}),i===\"members\"&&z(ir,{children:z(no,{$legendColor:je.members,children:a(r.defaults.members)})}),i===\"retail\"&&z(ir,{children:z(no,{$legendColor:je.retail,children:a(r.defaults.retail)})}),i===\"brandAffiliates\"&&z(ir,{children:z(no,{$legendColor:je.brandAffiliates,children:a(r.defaults.brandAffiliates)})})]})]}):z(oo,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),We(to,{\"data-testid\":\"signups-fullview-table-section\",children:[z(eo,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),D?z(Ad,{\"data-testid\":\"signups-fullview-mobile-cards\",children:v.map(m=>We(Bd,{children:[z(od,{children:m.name}),We(rd,{children:[m.date,\" - \",m.type]}),z(ad,{children:m.email}),z(nd,{status:m.status,children:m.status})]},m.id))}):z(zd,{\"data-testid\":\"signups-fullview-desktop-table\",children:z(ht,{columns:H,data:v,sortable:!0,onSort:O,sortColumn:h,sortDirection:S,getRowKey:m=>m.id})}),f>1&&z(bt,{currentPage:w,totalPages:f,onPageChange:c,itemsPerPage:x,totalItems:t.length})]})]})};import yo,{useState as ff}from\"react\";import{PieChart as gf,Pie as hf,Cell as xf,ResponsiveContainer as bf,Tooltip as yf}from\"recharts\";import wf from\"@mui/icons-material/TrendingUp\";import Cf from\"@mui/icons-material/TrendingDown\";import{styled as No,ColorUtils as mf}from\"@nuskin/foundation-theme\";import{styled as Oe}from\"@mui/material/styles\";import{Box as Pt,Typography as Vo}from\"@mui/material\";var{getGenomeColor:Tn}=mf,ba=No(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Yd=No(\"div\")`\n flex: 1;\n`,Jd=No(\"span\")`\n font-weight: 600;\n`,Zd=No(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Xd=No(\"span\")`\n font-weight: 600;\n`,qd=Oe(Pt)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>Tn(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`,Qd=Oe(Pt)`\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`,ep=Oe(Pt)`\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 /* Donut hole shrinks on mobile (fixed 220px chart height), so the\n overlay must be narrower to avoid overlapping the colored ring. */\n @media (max-width: 767px) {\n width: 96px;\n }\n`,tp=Oe(Vo)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n\n @media (max-width: 767px) {\n font-size: 0.6875rem;\n }\n`,op=Oe(Vo)`\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\n @media (max-width: 767px) {\n font-size: 1rem;\n }\n`,rp=Oe(Vo)`\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\n @media (max-width: 767px) {\n font-size: 0.75rem;\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n }\n`,ap=Oe(Pt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,np=Oe(Pt)`\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})=>Tn(e,\"N30\")};\n }\n`,ya=Oe(Pt)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,Xw=Oe(Pt)`\n display: none;\n`,ip=Oe(Vo)`\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`,lp=Oe(Vo)`\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`,sp=Oe(Vo)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,dp=Oe(Pt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,pp=Oe(Pt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,cp=Oe(Pt)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Tn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,up=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`,mp=No(\"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 vf,jsx as q,jsxs as Fe}from\"react/jsx-runtime\";var Sn=({categories:e,dateRange:t,market:o,categorySort:n,summaryChangePct:i,markets:l,isLoading:s=!1,onBack:p,onDateRangeChange:y,onMarketChange:b,onCategorySortChange:d})=>{let[w,c]=ff(1),h=10,T=Dt(),S=yo.useCallback(()=>p?.(),[p]),L=nt(l),x=yo.useMemo(()=>[kt(t,r),Tt(o,L,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.defaults.byRevenue)},{value:\"volume\",label:a(r.defaults.byVolume)}]}],[n,t,o,L]),D=yo.useCallback((m,$)=>{m===\"dateRange\"?y?.($):m===\"market\"?b?.($):m===\"sort\"&&(d?.($),c(1))},[d,y,b]),P=m=>Fr(m,{fontSize:\"12\",fontWeight:\"700\"}),M=m=>m===\"up\"?q(wf,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):m===\"down\"?q(Cf,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,F=m=>{if(!m)return\"neutral\";let $=Number.parseFloat(m);return Number.isNaN($)?\"neutral\":$>0?\"up\":$<0?\"down\":\"neutral\"},k=yo.useMemo(()=>[...e].sort((m,$)=>n===\"revenue\"?$.revenue-m.revenue:($.volume??0)-(m.volume??0)),[e,n]),{totalRevenue:g,totalVolume:N,totalRevenueTrendDirection:I,totalRevenueTrend:C}=yo.useMemo(()=>{let m=k.reduce((U,Q)=>U+Q.revenue,0),$=k.reduce((U,Q)=>U+(Q.volume??0),0),E,_;if(i!=null)Math.abs(i)<.1?(_=\"0%\",E=\"neutral\"):(E=i>0?\"up\":\"down\",_=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:U,formatted:Q}=jt(k,B=>n===\"volume\"?B.volume??0:B.revenue,B=>n===\"volume\"?B.trend?.volume:B.trend?.revenue);E=U,_=Q}return{totalRevenue:m,totalVolume:$,totalRevenueTrendDirection:E,totalRevenueTrend:_}},[k,i,n]),O=yo.useMemo(()=>k.slice(0,5),[k]),{totalPages:u,pageItems:f}=vt(k,w,h),v=k[0]?.currencyCode,H=yo.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:($,E)=>Fe(ba,{children:[q(ya,{dotColor:E.color}),q(mp,{children:Qo(E.name)})]})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:($,E)=>J(Number($),E.currencyCode,Y(o))},{key:\"volume\",label:a(r.defaults.volume),sortable:!0,render:$=>`${Number($??0).toLocaleString()} ${a(r.defaults.dcSv)}`},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:$=>`${Number($)}%`}],[v,o]);return s?Fe(Se,{\"data-testid\":\"categories-full-view\",children:[q(we,{title:a(r.widget.topCategories.title),dateRange:ve(t),onBack:S,filters:x,onFilterChange:D}),q(Kt,{})]}):e.length===0?Fe(Se,{\"data-testid\":\"categories-full-view\",children:[q(we,{title:a(r.widget.topCategories.title),dateRange:ve(t),onBack:S,filters:x,onFilterChange:D}),q(oo,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):Fe(Se,{\"data-testid\":\"categories-full-view\",children:[q(we,{title:a(r.widget.topCategories.title),dateRange:ve(t),onBack:S,filters:x,onFilterChange:D}),Fe(qd,{\"data-testid\":\"categories-fullview-top-section\",children:[Fe(Qd,{\"data-testid\":\"categories-fullview-chart\",children:[q(bf,{width:\"100%\",height:\"100%\",children:Fe(gf,{children:[q(hf,{data:k,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:n===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,label:P,labelLine:!1,children:k.map(m=>q(xf,{fill:m.color},`cell-${m.id}`))}),q(yf,{formatter:m=>J(m,v,Y(o))})]})}),Fe(ep,{\"data-testid\":\"categories-fullview-donut-center\",children:[q(tp,{children:n===\"volume\"?a(r.defaults.volume):a(r.stats.revenue)}),q(op,{children:n===\"volume\"?Fe(vf,{children:[N.toFixed(1),q(\"br\",{}),a(r.defaults.dcSv)]}):J(g,v,Y(o))}),Fe(rp,{direction:I,children:[M(I),q(\"span\",{children:C})]})]})]}),q(ap,{\"data-testid\":\"categories-fullview-summary\",children:O.map(m=>{let $=n===\"volume\"?m.volume:m.revenue,E=n===\"volume\"?m.volumeSharePct:m.percentage,_=n===\"volume\"?m.trend?.volume:m.trend?.revenue;return Fe(np,{children:[q(ya,{dotColor:m.color}),q(ip,{children:Qo(m.name)}),q(lp,{children:n===\"volume\"?($??0).toFixed(1):J($??0,m.currencyCode,Y(o))}),Fe(sp,{children:[\"(\",E,\"%)\"]}),_?q(up,{direction:F(_),children:M(F(_))}):null]},m.id)})})]}),Fe(to,{\"data-testid\":\"categories-fullview-table-section\",children:[Fe(eo,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",k.length,\")\"]}),T?q(pp,{children:f.map(m=>Fe(cp,{children:[q(ya,{dotColor:m.color}),Fe(Yd,{children:[q(Jd,{children:m.name}),q(Zd,{children:J(m.revenue,m.currencyCode,Y(o))})]}),Fe(Xd,{children:[m.percentage,\"%\"]})]},m.id))}):q(dp,{children:q(ht,{columns:H,data:f,sortable:!0,getRowKey:m=>m.id})}),u>1&&q(bt,{currentPage:w,totalPages:u,onPageChange:c,itemsPerPage:h,totalItems:k.length})]})]})};import fp from\"react\";function Eo(e){fp.useEffect(()=>{if(e!==void 0)return kr(e),()=>{kr(void 0)}},[e])}var kf=({translate:e,children:t})=>(Eo(e),t??null);function Tf(){return fp.useCallback(e=>Ze(e),[])}import gp from\"react\";function Sf(){if(typeof window>\"u\")return;if(typeof window.scrollTo==\"function\"){window.scrollTo({top:0,left:0,behavior:\"auto\"});return}let e=window.document?.scrollingElement??window.document?.documentElement;e&&(e.scrollTop=0)}function wa(e){let t=gp.useRef(e);gp.useEffect(()=>{t.current!==e&&(t.current=e,Sf())},[e])}import{jsx as lr}from\"react/jsx-runtime\";var Df=\"shoppingDashboardView\",Pf=[],Mf=[],Rf=[],Of=[],Ff=[],Lf=[];function xp(e){return typeof e==\"object\"&&e!==null}function $f(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function Ca(e,t){if(!xp(e))return\"dashboard\";let o=e[t];return $f(o)?o:\"dashboard\"}function hp(e,t,o){return{...xp(e)?e:{},[t]:o}}function If(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Nf=({stats:e,topProducts:t,conversionData:o,conversionPriceTypeTrend:n,signupData:i,categories:l,categoriesSummaryChangePct:s,conversionSummaryChangePct:p,orders:y,signups:b,isLoading:d=!1,error:w,shopTitle:c,className:h,translate:T,initialDateRange:S=it,initialMarket:L=\"all\",initialProductSort:x=\"units\",initialSignupView:D=\"all\",initialConversionFilter:P=\"all\",initialCategorySort:M=\"revenue\",markets:F,historyAdapter:k,historyStateKey:g=Df,resetToDashboardOnMount:N=!0,onDateRangeChange:I,onMarketChange:C,onProductSortChange:O,onSignupViewChange:u,onConversionFilterChange:f,onCategorySortChange:v,onViewChange:H,onProductsExport:m,onConversionExport:$,onSignupsExport:E,onCategoriesExport:_})=>{Eo(T);let[U,Q]=ce.useState(\"dashboard\");wa(U);let B=ce.useRef(!1),[ie,tt]=ce.useState(S),[R,ee]=ce.useState(L),[Pe,Ie]=ce.useState(x),[dt,lo]=ce.useState(D),[pr,cr]=ce.useState(P),[ur,mr]=ce.useState(M),fr=t??Pf,Bo=o??Mf,Ho=i??Rf,Wo=l??Of,gr=y??Ff,hr=b??Lf,ot=ce.useCallback(K=>{Q(K),H?.(K)},[H]),rt=ce.useCallback(()=>k?Ca(k.location?.state,g):typeof window>\"u\"?\"dashboard\":Ca(window.history.state,g),[k,g]),Rt=ce.useCallback((K,Ue)=>{if(k){let po=hp(k.location?.state,g,K),Vn=If(k.location,po);if(Ue===\"replace\"){k.replace(Vn);return}k.push(Vn);return}if(typeof window>\"u\")return;let at=hp(window.history.state,g,K);if(Ue===\"replace\"){window.history.replaceState(at,\"\");return}window.history.pushState(at,\"\")},[k,g]);ce.useEffect(()=>{if(N?(Rt(\"dashboard\",\"replace\"),B.current=!1,ot(\"dashboard\")):ot(rt()),k)return k.listen((Ue,at)=>{if(at===\"POP\"){let po=Ca(Ue.state,g);B.current=po!==\"dashboard\",ot(po)}});let K=Ue=>{let at=Ca(Ue.state,g);B.current=at!==\"dashboard\",ot(at)};return window.addEventListener(\"popstate\",K),()=>{window.removeEventListener(\"popstate\",K)}},[k,g,rt,N,ot,Rt]);let Ne=ce.useCallback(K=>{B.current=!0,Rt(K,\"push\"),ot(K)},[ot,Rt]),pt=ce.useCallback(()=>{if(U!==\"dashboard\"&&B.current){if(k){k.goBack();return}typeof window<\"u\"&&window.history.back();return}B.current=!1,Rt(\"dashboard\",\"replace\"),ot(\"dashboard\")},[U,k,ot,Rt]),Ot=ce.useCallback(K=>{tt(K),I?.(K)},[I]),wt=ce.useCallback(K=>{ee(K),C?.(K)},[C]),so=ce.useCallback(K=>{Ie(K),O?.(K)},[O]),_o=ce.useCallback(K=>{lo(K),u?.(K)},[u]),Uo=ce.useCallback(K=>{cr(K),f?.(K)},[f]),Ko=ce.useCallback(K=>{mr(K),v?.(K)},[v]),Fa=ce.useCallback(()=>{Ne(\"products\")},[Ne]),La=ce.useCallback(()=>{Ne(\"conversion-rate\")},[Ne]),$a=ce.useCallback(()=>{Ne(\"signups\")},[Ne]),te=ce.useCallback(()=>{Ne(\"categories\")},[Ne]);return U===\"products\"?lr(rr,{products:fr,dateRange:ie,market:R,productSort:Pe,markets:F,isLoading:d,onBack:pt,onDateRangeChange:Ot,onMarketChange:wt,onProductSortChange:so}):U===\"conversion-rate\"?lr(nr,{conversionData:Bo,priceTypeTrend:n,orders:gr,dateRange:ie,market:R,conversionFilter:pr,markets:F,isLoading:d,onBack:pt,onDateRangeChange:Ot,onMarketChange:wt,onConversionFilterChange:Uo}):U===\"signups\"?lr(kn,{signupData:Ho,signups:hr,dateRange:ie,market:R,signupView:dt,markets:F,isLoading:d,onBack:pt,onDateRangeChange:Ot,onMarketChange:wt,onSignupViewChange:_o}):U===\"categories\"?lr(Sn,{categories:Wo,dateRange:ie,market:R,categorySort:ur,summaryChangePct:s,markets:F,isLoading:d,onBack:pt,onDateRangeChange:Ot,onMarketChange:wt,onCategorySortChange:Ko}):lr(cn,{stats:e,topProducts:fr,conversionData:Bo,signupData:Ho,categories:Wo,categoriesSummaryChangePct:s,conversionSummaryChangePct:p,isLoading:d,error:w,shopTitle:c,className:h,dateRange:ie,market:R,productSort:Pe,signupView:dt,conversionFilter:pr,categorySort:ur,markets:F,onDateRangeChange:Ot,onMarketChange:wt,onProductSortChange:so,onSignupViewChange:_o,onConversionFilterChange:Uo,onCategorySortChange:Ko,onProductsTitleClick:Fa,onConversionTitleClick:La,onSignupsTitleClick:$a,onCategoriesToTitleClick:te,onProductsExport:m,onConversionExport:$,onSignupsExport:E,onCategoriesExport:_})};import{styled as sr}from\"@nuskin/foundation-theme\";var Dn=sr(\"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`,bp=sr(\"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`,yp=sr(\"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`,wp=sr(\"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`,Cp=sr(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import Pn from\"react\";import{PieChart as Vf,Pie as Ef,Cell as Af,ResponsiveContainer as zf,Tooltip as Bf}from\"recharts\";import Hf from\"@mui/icons-material/TrendingUp\";import Wf from\"@mui/icons-material/TrendingDown\";var V={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\"},byVolume:{key:\"productOfferDashboard.filter.offerSort.byVolume\",fallback:\"Volume\"}},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\"},totalVolume:{key:\"productOfferDashboard.widget.topPerformingOffers.totalVolume\",fallback:\"Total volume\"},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:\"--\"},byRevenue:{key:\"productOfferDashboard.defaults.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.defaults.byUnits\",fallback:\"Units\"},byVolume:{key:\"productOfferDashboard.defaults.byVolume\",fallback:\"Volume\"},volume:{key:\"productOfferDashboard.defaults.volume\",fallback:\"Volume\"},dcSv:{key:\"productOfferDashboard.defaults.dcSv\",fallback:\"DC-SV\"}}};function A(e){return Ze(e)}import{jsx as ue,jsxs as et}from\"react/jsx-runtime\";var _f=({offers:e,offerSort:t,isLoading:o=!1,title:n,market:i,summaryChangePct:l,onSortChange:s,onTitleClick:p,onExport:y})=>{let b=Pn.useCallback(x=>{let D=x.target.value;s?.(D)},[s]),{sortedOffers:d,totalRevenue:w,totalVolume:c,trendDirection:h,formattedTrend:T}=Pn.useMemo(()=>{let x=[...e].sort((k,g)=>t===\"revenue\"?g.revenue-k.revenue:(g.volume??0)-(k.volume??0)),D=x.reduce((k,g)=>k+g.revenue,0),P=x.reduce((k,g)=>k+(g.volume??0),0),M,F;if(l!==void 0){let k=l??0;Math.abs(k)<.1?(F=\"0%\",M=\"neutral\"):(M=k>0?\"up\":\"down\",F=`${k>0?\"+\":\"\"}${k.toFixed(1)}%`)}else{let{direction:k,formatted:g}=jt(x,N=>t===\"volume\"?N.volume??0:N.revenue,N=>t===\"volume\"?N.trend?.volume:N.trend?.revenue);M=k,F=g}return{sortedOffers:x,totalRevenue:D,totalVolume:P,trendDirection:M,formattedTrend:F}},[e,t,l]),S=x=>x===\"up\"?ue(Hf,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):x===\"down\"?ue(Wf,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,L=d[0]?.currencyCode;return o&&e.length===0?ue(Xt,{\"data-testid\":\"widget-top-offers\",children:ue(Rr,{})}):e.length===0?et(Xt,{\"data-testid\":\"widget-top-offers\",children:[ue(Lo,{children:ue($o,{children:n??A(V.widget.topPerformingOffers.title)})}),ue(Qr,{\"data-testid\":\"top-offers-empty-state\",children:ue(ea,{children:A(V.widget.topPerformingOffers.emptyState)})})]}):et(Xt,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":A(V.ariaLabel.topOffers),children:[et(Lo,{children:[ue($o,{as:\"button\",onClick:p,\"aria-label\":A(V.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??A(V.widget.topPerformingOffers.title)}),et(Ar,{children:[et(Ms,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:b,disabled:o,\"aria-label\":A(V.ariaLabel.topOffers),children:[ue(\"option\",{value:\"revenue\",children:A(V.defaults.byRevenue)}),ue(\"option\",{value:\"volume\",children:A(V.defaults.byVolume)})]}),ue(mt,{widgetId:\"top-offers\",onFullView:p,onExport:y})]})]}),et(zr,{children:[et(Br,{\"data-testid\":\"top-offers-chart\",children:[ue(zf,{width:\"100%\",height:\"100%\",children:et(Vf,{children:[ue(Ef,{data:d,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:t===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,children:d.map(x=>ue(Af,{fill:x.color},`cell-${x.id}`))}),ue(Bf,{formatter:x=>t===\"volume\"?`${x.toFixed(1)} ${A(V.defaults.dcSv)}`:J(x,L,Y(i))})]})}),et(Hr,{\"data-testid\":\"top-offers-donut-center\",children:[ue(Wr,{children:t===\"volume\"?A(V.widget.topPerformingOffers.totalVolume):A(V.widget.topPerformingOffers.totalRevenue)}),ue(_r,{children:t===\"volume\"?`${c.toFixed(1)} ${A(V.defaults.dcSv)}`:J(w,L,Y(i))}),et(Ur,{direction:h,\"data-testid\":\"top-offers-donut-trend\",children:[S(h),ue(\"span\",{children:T})]})]})]}),ue(Kr,{\"data-testid\":\"top-offers-legend-container\",children:d.map((x,D)=>{let P=t===\"volume\"?x.trend?.volume:x.trend?.revenue,M=t===\"volume\"?x.volumeSharePct??x.percentage:x.percentage,F=It(P);return et(Gr,{\"data-testid\":`offer-legend-${D}`,children:[ue(jr,{color:x.color}),et(Yr,{children:[ue(Jr,{children:Qo(x.name)}),et(Xr,{children:[ue(Zr,{children:t===\"volume\"?`${(x.volume??0).toFixed(1)} ${A(V.defaults.dcSv)} (${M}%)`:`${J(x.revenue,x.currencyCode,Y(i))} (${M}%)`}),P?ue(qr,{direction:F,\"data-testid\":`offer-legend-trend-${D}`,\"aria-label\":P,children:S(F)}):null]})]})]},x.id)})})]})]})},va=Pn.memo(_f);va.displayName=\"TopPerformingOffersPieChart\";import ka from\"react\";var Uf=/[\\\\/?*[\\]:]/g;function vp(e){let t=e.trim(),o=t.length>0?t:\"export\";return o.toLowerCase().endsWith(\".xlsx\")?o:`${o}.xlsx`}function kp(e){let t=e.replace(Uf,\" \").trim();return(t.length>0?t:\"Export\").slice(0,31)}async function dr({rows:e,columns:t,fileName:o,sheetName:n}){let{Workbook:i}=await import(\"exceljs\"),l=new i,s=l.addWorksheet(kp(n));s.columns=t.map(y=>({header:y.header,key:y.header})),e.forEach(y=>{let b={};t.forEach(d=>{b[d.header]=d.value(y)??\"\"}),s.addRow(b)});let p=await l.xlsx.writeBuffer();Kf(p,vp(o))}function Kf(e,t){let o=new Blob([new Uint8Array(e)],{type:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"}),n=URL.createObjectURL(o),i=document.createElement(\"a\");i.href=n,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(n)}var Gf=[{header:\"Rank\",value:e=>e.rank},{header:\"Product ID\",value:e=>e.id},{header:\"Product Name\",value:e=>e.name},{header:\"Units Sold\",value:e=>e.unitsSold},{header:\"Total Revenue\",value:e=>e.revenue},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Volume DC-SV\",value:e=>e.volume},{header:\"Trend\",value:e=>e.trend?.units??e.trend?.revenue??e.trend?.volume}],jf=[{header:\"Offer ID\",value:e=>e.id},{header:\"Offer Name\",value:e=>e.name},{header:\"Total Revenue\",value:e=>e.revenue},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Total Volume\",value:e=>e.volume??e.units},{header:\"Share %\",value:e=>e.percentage},{header:\"Trend\",value:e=>e.trend?.revenue??e.trend?.units}],Yf=[{header:\"Order ID\",value:e=>e.orderId},{header:\"Date\",value:e=>e.date},{header:\"Customer\",value:e=>e.customerName},{header:\"Items\",value:e=>e.items},{header:\"Total\",value:e=>e.total},{header:\"Currency\",value:e=>e.currencyCode},{header:\"Total SV\",value:e=>e.bv}];function Mn(e){return dr({rows:e,columns:Gf,fileName:\"top-selling-products\",sheetName:\"Top Selling Products\"})}function Rn(e){return dr({rows:e,columns:jf,fileName:\"top-performing-offers\",sheetName:\"Top Performing Offers\"})}function Tp(e){return dr({rows:e,columns:Yf,fileName:\"conversion-rate-orders\",sheetName:\"Order Details\"})}function On({topProducts:e,topOffers:t,orders:o,conversionFilter:n=\"all\",topProductsExportData:i,topOffersExportData:l,conversionExportData:s,showTopProductsExportOption:p=!0,showTopOffersExportOption:y=!0,showConversionExportOption:b=!0,isLoading:d=!1}){let w=i??e,c=l??t,h=s??o??[],T=ka.useMemo(()=>n===\"all\"?h:h.filter(F=>F.priceType?.toLowerCase()===n),[h,n]),S=p&&!d&&w.length>0,L=y&&!d&&c.length>0,x=b&&!d&&T.length>0,D=ka.useCallback(()=>Mn(w),[w]),P=ka.useCallback(()=>Rn(c),[c]),M=ka.useCallback(()=>Tp(T),[T]);return{onTopProductsExport:S?D:void 0,onTopOffersExport:L?P:void 0,onConversionExport:x?M:void 0}}import{jsx as wo,jsxs as Ao}from\"react/jsx-runtime\";var Jf=[],Zf=[],Xf=[],Fn=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:l,dashboardTitle:s,className:p,dateRange:y=it,market:b=\"all\",productSort:d=\"units\",conversionFilter:w=\"all\",offerSort:c=\"revenue\",conversionSummaryRate:h,conversionSummaryChangePct:T,offersSummaryChangePct:S,orders:L,topProductsExportData:x,topOffersExportData:D,conversionExportData:P,showTopProductsExportOption:M=!0,showTopOffersExportOption:F=!0,showConversionExportOption:k=!0,markets:g,onDateRangeChange:N,onMarketChange:I,onProductSortChange:C,onConversionFilterChange:O,onOfferSortChange:u,onProductsTitleClick:f,onConversionTitleClick:v,onOffersTitleClick:H})=>{let m=t??Jf,$=o??Zf,E=n??Xf,{onTopProductsExport:_,onTopOffersExport:U,onConversionExport:Q}=On({topProducts:m,topOffers:E,orders:L,conversionFilter:w,topProductsExportData:x,topOffersExportData:D,conversionExportData:P,showTopProductsExportOption:M,showTopOffersExportOption:F,showConversionExportOption:k,isLoading:i}),B=ie=>ie?ie.startsWith(\"+\")&&ie!==\"+0%\"?\"up\":ie.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return l?wo(Dn,{as:\"main\",className:p,\"aria-label\":A(V.ariaLabel.dashboard),children:Ao(Cp,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Ao(\"strong\",{children:[A(V.error),\":\"]}),\" \",l]})}):Ao(Dn,{as:\"main\",className:p,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":A(V.ariaLabel.dashboard),\"aria-busy\":i,children:[wo(Zo,{shopTitle:s??A(V.title),dateRange:y,market:b,isLoading:i,markets:g,stats:e?{shopTitle:e.shopTitle??\"\",dateRange:e.dateRange,selectedMarket:e.selectedMarket,metrics:{revenue:e.metrics.revenue,volume:\"\",siteVisits:\"\",conversionRate:e.metrics.conversionRate},trend:e.trend??{}}:void 0,onDateRangeChange:N,onMarketChange:I}),Ao(bp,{\"data-testid\":\"top-charts-row\",children:[wo(Ro,{conversionData:$,conversionFilter:w,dateRange:y,isLoading:i,summaryRate:h,summaryChangePct:T,onFilterChange:O,onTitleClick:v,onExport:Q}),Ao(yp,{\"data-testid\":\"stats-card-stack\",children:[wo($t,{layout:\"split\",title:A(V.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:B(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:A(V.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),wo($t,{layout:\"split\",title:A(V.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:B(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:A(V.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Ao(wp,{\"data-testid\":\"bottom-charts-row\",children:[wo(Mo,{products:m,productSort:d,isLoading:i,maxProducts:5,market:b,onSortChange:C,onTitleClick:f,onExport:_}),wo(va,{offers:E,offerSort:c,isLoading:i,market:b,summaryChangePct:S,onSortChange:u,onTitleClick:H,onExport:U})]})]})};import xe from\"react\";import Co,{useState as Qf}from\"react\";import{PieChart as eg,Pie as tg,Cell as og,ResponsiveContainer as rg,Tooltip as ag}from\"recharts\";import{styled as ne}from\"@mui/material/styles\";import{Box as _e,Typography as Mt}from\"@mui/material\";import{ColorUtils as qf}from\"@nuskin/foundation-theme\";var{getGenomeColor:Ln}=qf,Sp=ne(_e)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Ln(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`,Dp=ne(_e)`\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`,Pp=ne(_e)`\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`,Mp=ne(Mt)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Rp=ne(Mt)`\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`,Op=ne(Mt)`\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`,Fp=ne(_e)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,Lp=ne(_e)`\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})=>Ln(e,\"N30\")};\n }\n`,Ta=ne(_e)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,$p=ne(_e)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,Ip=ne(Mt)`\n font-size: 0.875rem;\n font-weight: 500;\n`,Np=ne(Mt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Vp=ne(Mt)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,Ep=ne(_e)`\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`,gv=ne(_e)`\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`,Ap=ne(_e)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,zp=ne(_e)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Bp=ne(_e)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>Ln(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Hp=ne(_e)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Wp=ne(Mt)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,_p=ne(_e)`\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`,Sa=ne(_e)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,Da=ne(Mt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,Pa=ne(Mt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,hv=ne(Mt)`\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{jsx as Z,jsxs as ye}from\"react/jsx-runtime\";var $n=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:l=!1,onBack:s,onDateRangeChange:p,onMarketChange:y,onOfferSortChange:b})=>{let[d,w]=Qf(1),c=10,h=Dt(),T=Co.useCallback(()=>s?.(),[s]),S=nt(i),L=Co.useMemo(()=>[kt(t,V),Tt(o,S,V),{key:\"sort\",label:A(V.defaults.byRevenue),value:n,options:[{value:\"revenue\",label:A(V.defaults.byRevenue)},{value:\"volume\",label:A(V.defaults.byVolume)}]}],[t,o,S,n]),x=Co.useCallback((u,f)=>{u===\"dateRange\"?p?.(f):u===\"market\"?y?.(f):u===\"sort\"&&(b?.(f),w(1))},[b,p,y]),D=Co.useMemo(()=>[...e].sort((u,f)=>n===\"revenue\"?f.revenue-u.revenue:(f.volume??0)-(u.volume??0)),[e,n]),{totalRevenue:P,totalVolume:M,totalRevenueTrendDirection:F,totalRevenueTrend:k}=Co.useMemo(()=>{let u=D.reduce((m,$)=>m+$.revenue,0),f=D.reduce((m,$)=>m+($.volume??0),0),{direction:v,formatted:H}=jt(D,m=>n===\"volume\"?m.volume??0:m.revenue,m=>n===\"volume\"?m.trend?.volume:m.trend?.revenue);return{totalRevenue:u,totalVolume:f,totalRevenueTrendDirection:v,totalRevenueTrend:H}},[D,n]),g=Co.useMemo(()=>D.slice(0,5),[D]),{totalPages:N,pageItems:I}=vt(D,d,c),C=Co.useMemo(()=>[{key:\"name\",label:A(V.fullView.topOffers.columnName),sortable:!0,render:(u,f)=>ye(ba,{children:[Z(Ta,{dotColor:f.color}),Z(\"span\",{children:f.name})]})},{key:\"revenue\",label:A(V.fullView.topOffers.columnRevenue),sortable:!0,render:(u,f)=>J(Number(u),f.currencyCode,Y(o))},{key:\"volume\",label:A(V.defaults.volume),sortable:!0,render:u=>`${Number(u??0).toLocaleString()} ${A(V.defaults.dcSv)}`},{key:\"percentage\",label:A(V.fullView.topOffers.columnPercentage),sortable:!0,render:u=>`${Number(u)}%`}],[o]),O=D[0]?.currencyCode;return l?ye(Se,{\"data-testid\":\"top-offers-full-view\",children:[Z(we,{title:A(V.fullView.topOffers.title),dateRange:ve(t),onBack:T,filters:L,onFilterChange:x}),Z(Kt,{})]}):e.length===0?ye(Se,{\"data-testid\":\"top-offers-full-view\",children:[Z(we,{title:A(V.fullView.topOffers.title),dateRange:ve(t),onBack:T,filters:L,onFilterChange:x}),Z(oo,{\"data-testid\":\"top-offers-fullview-empty\",children:A(V.widget.topPerformingOffers.emptyState)})]}):ye(Se,{\"data-testid\":\"top-offers-full-view\",children:[Z(we,{title:A(V.fullView.topOffers.title),dateRange:ve(t),onBack:T,filters:L,onFilterChange:x}),ye(Sp,{\"data-testid\":\"top-offers-fullview-top-section\",children:[ye(Dp,{\"data-testid\":\"top-offers-fullview-chart\",children:[Z(rg,{width:\"100%\",height:\"100%\",children:ye(eg,{children:[Z(tg,{data:D,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:n===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,children:D.map(u=>Z(og,{fill:u.color},`cell-${u.id}`))}),Z(ag,{formatter:u=>n===\"volume\"?`${u.toFixed(1)} ${A(V.defaults.dcSv)}`:J(u,O,Y(o))})]})}),ye(Pp,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[Z(Mp,{children:n===\"volume\"?A(V.widget.topPerformingOffers.totalVolume):A(V.widget.topPerformingOffers.totalRevenue)}),Z(Rp,{children:n===\"volume\"?`${M.toFixed(1)} ${A(V.defaults.dcSv)}`:J(P,O,Y(o))}),Z(Op,{direction:F,children:k})]})]}),Z(Fp,{\"data-testid\":\"top-offers-fullview-summary\",children:g.map(u=>{let f=n===\"volume\"?u.trend?.volume:u.trend?.revenue,v=n===\"volume\"?u.volumeSharePct??u.percentage:u.percentage,H=It(f);return ye(Lp,{children:[Z(Ta,{dotColor:u.color}),ye($p,{children:[Z(Ip,{children:u.name}),Z(Np,{children:n===\"volume\"?`${(u.volume??0).toFixed(1)} ${A(V.defaults.dcSv)}`:J(u.revenue,u.currencyCode,Y(o))})]}),ye(Vp,{children:[v,\"%\"]}),f?Z(Ep,{direction:H,\"aria-label\":f,children:Nt(H)}):null]},u.id)})})]}),ye(to,{\"data-testid\":\"top-offers-table\",children:[ye(eo,{\"data-testid\":\"top-offers-fullview-table-title\",children:[A(V.fullView.topOffers.title),\" (\",D.length,\")\"]}),h?Z(zp,{children:I.map(u=>ye(Bp,{children:[ye(Hp,{children:[Z(Ta,{dotColor:u.color}),Z(Wp,{children:u.name})]}),ye(_p,{children:[ye(Sa,{children:[Z(Da,{children:A(V.fullView.topOffers.columnRevenue)}),Z(Pa,{children:J(u.revenue,u.currencyCode,Y(o))})]}),ye(Sa,{children:[Z(Da,{children:A(V.defaults.volume)}),Z(Pa,{children:`${Number(u.volume??0).toLocaleString()} ${A(V.defaults.dcSv)}`})]}),ye(Sa,{children:[Z(Da,{children:A(V.fullView.topOffers.columnPercentage)}),ye(Pa,{children:[u.percentage,\"%\"]})]})]})]},u.id))}):Z(Ap,{children:Z(ht,{columns:C,data:I,sortable:!0,getRowKey:u=>u.id})}),N>1&&Z(bt,{currentPage:d,totalPages:N,onPageChange:w,itemsPerPage:c,totalItems:D.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as Ra}from\"react/jsx-runtime\";var ng=\"productOfferDashboardView\",ig=[],lg=[],sg=[],dg=[];function Kp(e){return typeof e==\"object\"&&e!==null}function pg(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function Ma(e,t){if(!Kp(e))return\"dashboard\";let o=e[t];return pg(o)?o:\"dashboard\"}function Up(e,t,o){return{...Kp(e)?e:{},[t]:o}}function cg(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var ug=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:l,dashboardTitle:s,className:p,allProducts:y,orders:b,allOffers:d,conversionSummaryRate:w,conversionSummaryChangePct:c,offersSummaryChangePct:h,conversionFullViewData:T,conversionFullViewRate:S,conversionFullViewChangePct:L,topProductsExportData:x,topOffersExportData:D,conversionExportData:P,showTopProductsExportOption:M=!0,showTopOffersExportOption:F=!0,showConversionExportOption:k=!0,initialDateRange:g=it,initialMarket:N=\"all\",initialProductSort:I=\"units\",initialConversionFilter:C=\"all\",initialOfferSort:O=\"revenue\",markets:u,translate:f,historyAdapter:v,historyStateKey:H=ng,resetToDashboardOnMount:m=!0,onDateRangeChange:$,onMarketChange:E,onProductSortChange:_,onConversionFilterChange:U,onOfferSortChange:Q,onViewChange:B})=>{Eo(f);let[ie,tt]=xe.useState(\"dashboard\");wa(ie);let R=xe.useRef(!1),[ee,Pe]=xe.useState(g),[Ie,dt]=xe.useState(N),[lo,pr]=xe.useState(I),[cr,ur]=xe.useState(C),[mr,fr]=xe.useState(O),Bo=t??ig,Ho=o??lg,Wo=n??sg,gr=y??Bo,hr=b??dg,ot=d??Wo,rt=xe.useCallback(te=>{tt(te),B?.(te)},[B]),Rt=xe.useCallback(()=>v?Ma(v.location?.state,H):typeof window>\"u\"?\"dashboard\":Ma(window.history.state,H),[v,H]),Ne=xe.useCallback((te,K)=>{if(v){let at=Up(v.location?.state,H,te),po=cg(v.location,at);if(K===\"replace\"){v.replace(po);return}v.push(po);return}if(typeof window>\"u\")return;let Ue=Up(window.history.state,H,te);if(K===\"replace\"){window.history.replaceState(Ue,\"\");return}window.history.pushState(Ue,\"\")},[v,H]);xe.useEffect(()=>{if(m?(Ne(\"dashboard\",\"replace\"),R.current=!1,rt(\"dashboard\")):rt(Rt()),v)return v.listen((K,Ue)=>{if(Ue===\"POP\"){let at=Ma(K.state,H);R.current=at!==\"dashboard\",rt(at)}});let te=K=>{let Ue=Ma(K.state,H);R.current=Ue!==\"dashboard\",rt(Ue)};return window.addEventListener(\"popstate\",te),()=>{window.removeEventListener(\"popstate\",te)}},[v,H,Rt,m,rt,Ne]);let pt=xe.useCallback(te=>{R.current=!0,Ne(te,\"push\"),rt(te)},[rt,Ne]),Ot=xe.useCallback(()=>{if(ie!==\"dashboard\"&&R.current){if(v){v.goBack();return}typeof window<\"u\"&&window.history.back();return}R.current=!1,Ne(\"dashboard\",\"replace\"),rt(\"dashboard\")},[ie,v,rt,Ne]),wt=xe.useCallback(te=>{Pe(te),$?.(te)},[$]),so=xe.useCallback(te=>{dt(te),E?.(te)},[E]),_o=xe.useCallback(te=>{pr(te),_?.(te)},[_]),Uo=xe.useCallback(te=>{ur(te),U?.(te)},[U]),Ko=xe.useCallback(te=>{fr(te),Q?.(te)},[Q]),Fa=xe.useCallback(()=>{pt(\"products\")},[pt]),La=xe.useCallback(()=>{pt(\"conversion-rate\")},[pt]),$a=xe.useCallback(()=>{pt(\"top-offers\")},[pt]);return ie===\"products\"?Ra(rr,{products:gr,dateRange:ee,market:Ie,productSort:lo,markets:u,isLoading:i,onBack:Ot,onDateRangeChange:wt,onMarketChange:so,onProductSortChange:_o}):ie===\"conversion-rate\"?Ra(nr,{conversionData:T??Ho,orders:hr,summaryRate:S??w,summaryChangePct:L??c,dateRange:ee,market:Ie,conversionFilter:cr,markets:u,orderColumnsVariant:\"sv\",isLoading:i,onBack:Ot,onDateRangeChange:wt,onMarketChange:so,onConversionFilterChange:Uo}):ie===\"top-offers\"?Ra($n,{offers:ot,dateRange:ee,market:Ie,offerSort:mr,markets:u,isLoading:i,onBack:Ot,onDateRangeChange:wt,onMarketChange:so,onOfferSortChange:Ko}):Ra(Fn,{stats:e,topProducts:Bo,conversionData:Ho,topOffers:Wo,isLoading:i,error:l,dashboardTitle:s,className:p,dateRange:ee,market:Ie,productSort:lo,conversionFilter:cr,offerSort:mr,conversionSummaryRate:w,conversionSummaryChangePct:c,offersSummaryChangePct:h,topProductsExportData:x??gr,topOffersExportData:D??ot,orders:hr,conversionExportData:P,showTopProductsExportOption:M,showTopOffersExportOption:F,showConversionExportOption:k,markets:u,onDateRangeChange:wt,onMarketChange:so,onProductSortChange:_o,onConversionFilterChange:Uo,onOfferSortChange:Ko,onProductsTitleClick:Fa,onConversionTitleClick:La,onOffersTitleClick:$a})};import{ColorUtils as mg,styled as In}from\"@nuskin/foundation-theme\";var{getGenomeColor:vo}=mg,Gp=In(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,jp=In(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>vo(e,\"N20\")};\n border: 1px solid ${({theme:e})=>vo(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>vo(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>vo(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>vo(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>vo(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,Yp=In(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>vo(e,\"N70\")};\n`;import{jsx as Nn,jsxs as gg}from\"react/jsx-runtime\";var fg=({filters:e,onChange:t})=>Nn(Gp,{\"data-testid\":\"filter-bar\",children:e.map(o=>gg(Yp,{htmlFor:`filter-${o.key}`,children:[o.label,Nn(jp,{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=>Nn(\"option\",{value:n.value,children:n.label},n.value))})]},o.key))});var Jp={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%\"}},Zp=[{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%\"}}],Oa=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,priceTypes:t%3===0?[\"Retail\",\"Member\"]:[\"Retail\"]}}),hg=Oa.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7),priceTypes:[\"Retail\"]})),xg=Oa.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3),priceTypes:[\"Member\"]})),Xp=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,l=Math.floor(i*.4),s=Math.floor(i*.35),p=i-l-s;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:l,retail:s,brandAffiliates:p}}),qp=[{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%\"}}],Qp=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\",priceType:t%3===0?\"Member\":\"Retail\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),ec=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\"],l=new Date(\"2026-03-31\");return l.setDate(l.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:l.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 zo={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%\"}},e1={...zo,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},t1={...zo,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},o1={...zo,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},r1={...zo,metrics:{...zo.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},bg=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,volume:120.5,percentage:29,volumeSharePct:18,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\",volume:\"-2.0%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,volume:90,percentage:27,volumeSharePct:14,color:\"#E8915A\",trend:{revenue:\"+3.1%\",volume:\"+1.4%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,volume:210.4,percentage:22,volumeSharePct:32,color:\"#C75B5B\",trend:{revenue:\"-1.5%\",volume:\"+5.6%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,volume:60,percentage:16,volumeSharePct:9,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\",volume:\"+0.9%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,volume:180,percentage:6,volumeSharePct:27,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\",volume:\"+6.1%\"}}];export{Sn as CategoriesFullView,Ro as ConversionRateChart,nr as ConversionRateFullView,gs as DATE_RANGE_LABELS,fs as DAYS_MAP,Zo as DashboardHeader,ht as DataTable,fg as FilterBar,Nf as MysiteDashboardWithNavigation,zi as MysiteHero,Ea as NsCategoryNavigation,Va as NsProductCard,we as PageHeader,bt as Pagination,ug as PoDashboardWithNavigation,xr as ProductCarousel,Fn as ProductOfferDashboard,V as ProductOfferDashboardTranslationKeys,Rc as ProductTabCarousel,rr as ProductsFullView,cn as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,Er as SignupsChart,kn as SignupsFullView,$t as StatsCard,ta as TopCategoriesPieChart,$n as TopPerformingOffersFullView,va as TopPerformingOffersPieChart,Mo as TopSellingProductsList,kf as TranslationProvider,mt as WidgetMenu,Xi as buildDefaultMarketOptions,mu as calculatePercentage,$l as calculateTotalPages,dr as exportRowsToExcel,Rn as exportTopPerformingOffers,Mn as exportTopProducts,xs as formatDateRange,Ou as formatDateRangeLabel,nn as formatDisplayDate,ln as formatISODate,hs as formatShortDate,Vt as getComparedToText,an as getDateRangeLabel,Ru as getDaysFromDateRange,a as getTranslation,Uc as getTranslationResolver,cu as getTrendColor,Nt as getTrendIcon,qp as mockCategories,Oa as mockConversionData,Qp as mockOrders,zo as mockProductOfferStats,Xp as mockSignupData,ec as mockSignupDetails,Jp as mockStats,bg as mockTopOffers,Zp as mockTopProducts,vp as normalizeExcelFileName,kp as normalizeExcelSheetName,Il as paginateItems,qi as resolveMarketOptions,Ze as resolveTranslation,kr as setTranslationResolver,uu as sortByNumericProperty,On as useProductOfferWidgetExports,Tf as useTranslation,Eo 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\n/**\n * `MysiteHero`'s prop contract, and the single definition of that shape.\n * `@nuskin/react-mysite-sdk`'s `buildHeroProps` imports this as its return type\n * so the producer and the consumer can never drift.\n */\nexport type 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: 20px;\n width: 100%;\n box-sizing: border-box;\n padding: 16px;\n\n @media (min-width: 768px) {\n gap: 24px;\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n padding: 24px;\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 CalendarMonthIcon from '@mui/icons-material/CalendarMonth';\nimport LanguageIcon from '@mui/icons-material/Language';\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.dateRange.label)}\n </FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <CalendarMonthIcon />\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.market.label)}</FilterLabel>\n <FilterIcon aria-hidden=\"true\">\n <LanguageIcon />\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: 12px 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 12px;\n min-height: auto;\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: 16px 20px;\n gap: 16px;\n }\n\n @media (min-width: 1080px) {\n padding: 16px 24px;\n gap: 20px;\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: nowrap;\n align-items: center;\n gap: 24px;\n width: 100%;\n flex-shrink: 0;\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\n// Kept in the DOM (visually hidden) so the select stays labelled for assistive tech.\nexport const FilterLabel = styled('label')`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: 0 !important;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n`;\n\nexport const StyledSelect = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 24px 6px 8px;\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 white-space: nowrap;\n flex-shrink: 0;\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 background-position: right 8px center;\n }\n`;\n\n// Button-based trigger for MUI Menu dropdowns (replaces native <select> so the\n// options popup is positioned via Popper and stays within the viewport on mobile).\nexport const FilterMenuButton = styled('button')`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\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 white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus-visible {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\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 svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\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 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: nowrap;\n gap: 24px;\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 visits: {\n key: 'shoppingDashboard.stats.visits',\n fallback: 'Site Visits',\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\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\n productSort: {\n label: {\n key: 'shoppingDashboard.filter.productSort.label',\n fallback: 'Sort By',\n },\n },\n signupView: {\n label: {\n key: 'shoppingDashboard.filter.signupView.label',\n fallback: 'Show',\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: 'Overall',\n },\n retail: {\n key: 'shoppingDashboard.filter.conversionType.retail',\n fallback: 'Retail',\n },\n member: {\n key: 'shoppingDashboard.filter.conversionType.member',\n fallback: 'Member',\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 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 rank: {\n key: 'shoppingDashboard.widget.topProducts.rank',\n fallback: 'Rank',\n },\n },\n conversionRate: {\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 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 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 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 compareTo: {\n last7days: {\n key: 'shoppingDashboard.widget.compareTo.last7days',\n fallback: 'compared to this time 7 days ago',\n },\n last30days: {\n key: 'shoppingDashboard.widget.compareTo.last30days',\n fallback: 'compared to this time last month',\n },\n last90days: {\n key: 'shoppingDashboard.widget.compareTo.last90days',\n fallback: 'compared to this time 90 days ago',\n },\n thisMonth: {\n key: 'shoppingDashboard.widget.compareTo.thisMonth',\n fallback: 'compared to this time last month',\n },\n },\n topCategories: {\n title: {\n key: 'shoppingDashboard.widget.topCategories.title',\n fallback: 'Top Categories',\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 viewDetails: {\n key: 'shoppingDashboard.widget.menu.viewDetails',\n fallback: 'View Details',\n },\n exportData: {\n key: 'shoppingDashboard.widget.menu.exportData',\n fallback: 'Export Data',\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 email: { key: 'shoppingDashboard.fullView.signups.columns.email', fallback: 'Email' },\n status: { key: 'shoppingDashboard.fullView.signups.columns.status', fallback: 'Status' },\n market: { key: 'shoppingDashboard.fullView.signups.columns.market', fallback: 'Country/Market' },\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 customer: { key: 'shoppingDashboard.fullView.conversionRate.columns.customer', fallback: 'Customer' },\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 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 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 percentOfTotal: {\n key: 'shoppingDashboard.fullView.categories.columns.percentOfTotal',\n fallback: '% of Total',\n },\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 noData: {\n key: 'shoppingDashboard.defaults.noData',\n fallback: 'No data',\n },\n noChange: {\n key: 'shoppingDashboard.defaults.noChange',\n fallback: 'No change',\n },\n byRevenue: {\n key: 'shoppingDashboard.defaults.byRevenue',\n fallback: 'By: Revenue',\n },\n byUnits: {\n key: 'shoppingDashboard.defaults.byUnits',\n fallback: 'By: Units',\n },\n byVolume: {\n key: 'shoppingDashboard.defaults.byVolume',\n fallback: 'By: Volume',\n },\n byTrend: {\n key: 'shoppingDashboard.defaults.byTrend',\n fallback: 'By: Trend',\n },\n all: {\n key: 'shoppingDashboard.defaults.all',\n fallback: 'All',\n },\n members: {\n key: 'shoppingDashboard.defaults.members',\n fallback: 'Members',\n },\n retail: {\n key: 'shoppingDashboard.defaults.retail',\n fallback: 'Retail',\n },\n brandAffiliates: {\n key: 'shoppingDashboard.defaults.brandAffiliates',\n fallback: 'Brand Affiliates',\n },\n revenue: {\n key: 'shoppingDashboard.defaults.revenue',\n fallback: 'Revenue',\n },\n units: {\n key: 'shoppingDashboard.defaults.units',\n fallback: 'Units',\n },\n volume: {\n key: 'shoppingDashboard.defaults.volume',\n fallback: 'Volume',\n },\n conversionRate: {\n key: 'shoppingDashboard.defaults.conversionRate',\n fallback: 'Conversion Rate',\n },\n trend: {\n key: 'shoppingDashboard.defaults.trend',\n fallback: 'Trend',\n },\n date: {\n key: 'shoppingDashboard.defaults.date',\n fallback: 'Date',\n },\n type: {\n key: 'shoppingDashboard.defaults.type',\n fallback: 'Type',\n },\n dcSv: {\n key: 'shoppingDashboard.defaults.dcSv',\n fallback: 'DC-SV',\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' ? '12px' : '10px')};\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' ? '110px' : 'auto')};\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' ? '16px' : '12px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '110px' : 'auto')};\n }\n\n @media (min-width: 1080px) {\n padding: ${({ $layout }) => ($layout === 'split' ? '16px' : '14px')};\n min-height: ${({ $layout }) => ($layout === 'split' ? '110px' : 'auto')};\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: 14px;\n font-weight: 400;\n line-height: 1.2;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 2px;\n text-transform: capitalize;\n\n @media (min-width: 768px) {\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n @media (min-width: 1080px) {\n font-size: 14px;\n }\n`;\n\nexport const StatsValueContainer = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: space-between;\n gap: 2px;\n margin-top: 10px;\n width: 100%;\n`;\n\nexport const StatsValue = styled('div')`\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n\n @media (min-width: 768px) {\n font-size: 24px;\n }\n\n @media (min-width: 1080px) {\n font-size: 28px;\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: 12px;\n font-weight: 400;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n font-size: 12px;\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 KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { getTrendDirectionLabel, resolveTrendDirection, getTrendIcon } from '../../utils/trendUtils';\nimport { formatMoney, getLocaleFromMarketCode } from '../../utils/dataUtils';\nimport {\n ProductsListContainer,\n WidgetHeader,\n WidgetTitle,\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 { FilterMenuButton } from '../DashboardHeader.styled';\nimport { WidgetMenu } from '../WidgetMenu';\nimport type { TopProduct, ProductSortOption, MarketOption } 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 market?: MarketOption;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\n market,\n onSortChange,\n onTitleClick,\n onExport,\n}) => {\n const [sortAnchorEl, setSortAnchorEl] = React.useState<null | HTMLElement>(null);\n const isSortMenuOpen = Boolean(sortAnchorEl);\n\n const handleSortButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setSortAnchorEl(event.currentTarget);\n };\n\n const handleSortMenuClose = () => {\n setSortAnchorEl(null);\n };\n\n const handleSortSelect = (newSort: ProductSortOption) => {\n setSortAnchorEl(null);\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, getLocaleFromMarketCode(market));\n case 'volume':\n return `${product.volume.toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`;\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, getLocaleFromMarketCode(market))} ${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, getLocaleFromMarketCode(market))} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode, getLocaleFromMarketCode(market))} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) {\n return '';\n }\n let value = '';\n switch (sortBy) {\n case 'units':\n value = trend.units ?? '';\n break;\n case 'revenue':\n value = trend.revenue ?? '';\n break;\n case 'volume':\n value = trend.volume ?? '';\n break;\n default:\n value = trend.units ?? '';\n }\n return value;\n };\n\n const getTrendDirection = (product: TopProduct, sortBy: ProductSortOption): TrendDirection => {\n const trendValue = getTrendValue(product, sortBy);\n // Use resolveTrendDirection which properly parses numeric value\n // This ensures \"+0%\" and \"-0%\" are treated as neutral (grey), not up/down\n return resolveTrendDirection(trendValue);\n };\n\n const getTrendChartIcon = (direction: TrendDirection) => getTrendIcon(direction);\n\n const displayedProducts = products.slice(0, maxProducts);\n const rankLabel = getTranslation(Keys.widget.topProducts.rank);\n const trendLabel = getTranslation(Keys.defaults.trend);\n const byUnitsLabel = getTranslation(Keys.defaults.byUnits);\n const byRevenueLabel = getTranslation(Keys.defaults.byRevenue);\n const byVolumeLabel = getTranslation(Keys.defaults.byVolume);\n\n const productSortLabels: Record<ProductSortOption, string> = {\n units: byUnitsLabel,\n revenue: byRevenueLabel,\n volume: byVolumeLabel,\n };\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 <FilterMenuButton\n id=\"product-sort-button\"\n data-testid=\"product-sort-dropdown\"\n onClick={handleSortButtonClick}\n disabled={isLoading}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isSortMenuOpen ? 'product-sort-menu' : undefined}\n aria-expanded={isSortMenuOpen ? 'true' : undefined}\n aria-label={getTranslation(Keys.widget.topProducts.sortAriaLabel)}\n >\n {productSortLabels[productSort]}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </FilterMenuButton>\n <Menu\n id=\"product-sort-menu\"\n data-testid=\"product-sort-menu\"\n anchorEl={sortAnchorEl}\n open={isSortMenuOpen}\n onClose={handleSortMenuClose}\n MenuListProps={{ 'aria-labelledby': 'product-sort-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuItem\n data-testid=\"product-sort-option-units\"\n selected={productSort === 'units'}\n onClick={() => handleSortSelect('units')}\n >\n {byUnitsLabel}\n </MenuItem>\n <MenuItem\n data-testid=\"product-sort-option-revenue\"\n selected={productSort === 'revenue'}\n onClick={() => handleSortSelect('revenue')}\n >\n {byRevenueLabel}\n </MenuItem>\n <MenuItem\n data-testid=\"product-sort-option-volume\"\n selected={productSort === 'volume'}\n onClick={() => handleSortSelect('volume')}\n >\n {byVolumeLabel}\n </MenuItem>\n </Menu>\n <WidgetMenu widgetId=\"top-products\" onFullView={onTitleClick} onExport={onExport} />\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 ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\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 <TrendingUpIcon />;\n case 'down':\n return <TrendingDownIcon />;\n case 'neutral':\n default:\n return <ShowChartIcon />;\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\nexport interface PieChartLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n}\n\nexport function renderPieChartLabel(\n props: PieChartLabelProps,\n options?: { fontSize?: string; fontWeight?: string },\n): React.ReactNode {\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=\"middle\"\n fontSize={options?.fontSize ?? '10'}\n fontWeight={options?.fontWeight ?? '600'}\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0.2\"\n >\n {`${percentage}%`}\n </text>\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\n/**\n * Gets the appropriate locale for displaying currency based on the market/region code\n * @param marketCode - The market code (e.g., 'US', 'IN', 'CA')\n * @returns The locale string (e.g., 'en-US', 'en-IN', 'en-CA')\n */\nexport function getLocaleFromMarketCode(marketCode?: string): string {\n switch (marketCode) {\n case 'IN':\n return 'en-IN';\n case 'CA':\n return 'en-CA';\n case 'US':\n default:\n return 'en-US';\n }\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\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n currencyDisplay: 'narrowSymbol',\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {\n // Invalid currency code — fall through to the $ fallback below\n }\n }\n\n // No currency code provided, or an invalid one — default to a $ prefix\n const numberFormatted =\n fractionDigits !== undefined\n ? amount.toFixed(fractionDigits)\n : new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: 2 }).format(amount);\n return `$${numberFormatted}`;\n}\n\nexport function capitalizeFirstLetter(text: string): string {\n if (!text || text.length === 0) return text;\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Gets the numeric value from a SignupDataPoint based on the selected signup view.\n * Maps the signup view option to the corresponding data field:\n * - 'all' → total\n * - 'members' → members\n * - 'retail' → retail\n * - 'brandAffiliates' → brandAffiliates\n */\nexport function getSignupValueByView(\n dataPoint: {\n readonly total: number;\n readonly members: number;\n readonly retail: number;\n readonly brandAffiliates: number;\n },\n view: 'all' | 'members' | 'retail' | 'brandAffiliates',\n): number {\n switch (view) {\n case 'members':\n return dataPoint.members;\n case 'retail':\n return dataPoint.retail;\n case 'brandAffiliates':\n return dataPoint.brandAffiliates;\n case 'all':\n default:\n return dataPoint.total;\n }\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 FileDownloadIcon from '@mui/icons-material/FileDownload';\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 readonly onExport?: () => void;\n}\n\nexport const WidgetMenu: React.FC<WidgetMenuProps> = ({ widgetId, onFullView, onExport }) => {\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 const handleExport = () => {\n handleClose();\n if (onExport) {\n onExport();\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-viewdetails\">\n <ListItemIcon>\n <VisibilityIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.viewDetails)}</ListItemText>\n </MenuItem>\n {onExport && (\n <MenuItem onClick={handleExport} data-testid=\"widget-menu-item-export\">\n <ListItemIcon>\n <FileDownloadIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{getTranslation(Keys.widget.menu.exportData)}</ListItemText>\n </MenuItem>\n )}\n </Menu>\n </>\n );\n};\n","import IconButton from '@mui/material/IconButton';\nimport { styled, ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const StyledIconButton = styled(IconButton)(({ theme }) => ({\n padding: '4px',\n color: getGenomeColor(theme, 'N100'),\n '&:hover': {\n backgroundColor: getGenomeColor(theme, 'N20'),\n },\n}));\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport {\n ConversionRateContainer,\n ChartHeader,\n ChartTitle,\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 { FilterMenuButton } from '../DashboardHeader.styled';\nimport type { ConversionDataPoint, ConversionFilterOption, DateRangeOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { DEFAULT_DATE_RANGE } from '../../utils/dateConstants';\nimport { filterConversionData } from '../../utils/conversionFilter';\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 dateRange?: DateRangeOption;\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 readonly onExport?: () => void;\n}\n\nconst CHART_MARGIN = { top: 5, right: 10, left: -10, bottom: 5 };\nconst AXIS_TICK = { fontSize: 10 };\n\ninterface DotProps {\n readonly cx?: number;\n readonly cy?: number;\n readonly r?: number;\n}\n\n// Custom hollow dot component for ConversionRate chart\nconst HollowDot = (props: DotProps) => {\n const { cx, cy, r = 3 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke=\"#3B82F6\"\n strokeWidth=\"2\"\n style={{ pointerEvents: 'none' }}\n />\n );\n};\n\nconst ActiveHollowDot = (props: DotProps) => {\n const { cx, cy, r = 5 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke=\"#3B82F6\"\n strokeWidth=\"2\"\n style={{ pointerEvents: 'none' }}\n />\n );\n};\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 dateRange = DEFAULT_DATE_RANGE,\n isLoading = false,\n title,\n summaryRate,\n summaryChangePct,\n onFilterChange,\n onTitleClick,\n onExport,\n}) => {\n const [filterAnchorEl, setFilterAnchorEl] = React.useState<null | HTMLElement>(null);\n const isFilterMenuOpen = Boolean(filterAnchorEl);\n\n const handleFilterButtonClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setFilterAnchorEl(event.currentTarget);\n }, []);\n\n const handleFilterMenuClose = React.useCallback(() => {\n setFilterAnchorEl(null);\n }, []);\n\n const handleFilterSelect = React.useCallback(\n (newFilter: ConversionFilterOption) => {\n setFilterAnchorEl(null);\n onFilterChange?.(newFilter);\n },\n [onFilterChange],\n );\n\n const noDataText = getTranslation(Keys.defaults.noData);\n const noChangeText = getTranslation(Keys.defaults.noChange);\n\n const filteredData = React.useMemo(\n () => filterConversionData(conversionData, conversionFilter),\n [conversionData, conversionFilter],\n );\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return filteredData.at(-1)?.rate ?? 0;\n }, [summaryRate, filteredData]);\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 (filteredData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = filteredData.at(-1)?.rate ?? 0;\n const previousRate = filteredData[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, filteredData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => filteredData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [filteredData],\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.defaults.conversionRate)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterMenuButton\n id=\"conversion-filter-button\"\n data-testid=\"conversion-filter-dropdown\"\n onClick={handleFilterButtonClick}\n disabled={isLoading}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isFilterMenuOpen ? 'conversion-filter-menu' : undefined}\n aria-expanded={isFilterMenuOpen ? 'true' : undefined}\n aria-label={getTranslation(Keys.widget.conversionRate.filterAriaLabel)}\n >\n {conversionFilter === 'retail' && getTranslation(Keys.filter.conversionType.retail)}\n {conversionFilter === 'member' && getTranslation(Keys.filter.conversionType.member)}\n {conversionFilter === 'all' && getTranslation(Keys.filter.conversionType.all)}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </FilterMenuButton>\n <Menu\n id=\"conversion-filter-menu\"\n data-testid=\"conversion-filter-menu\"\n anchorEl={filterAnchorEl}\n open={isFilterMenuOpen}\n onClose={handleFilterMenuClose}\n MenuListProps={{ 'aria-labelledby': 'conversion-filter-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuItem\n data-testid=\"conversion-filter-option-all\"\n selected={conversionFilter === 'all'}\n onClick={() => handleFilterSelect('all')}\n >\n {getTranslation(Keys.filter.conversionType.all)}\n </MenuItem>\n <MenuItem\n data-testid=\"conversion-filter-option-retail\"\n selected={conversionFilter === 'retail'}\n onClick={() => handleFilterSelect('retail')}\n >\n {getTranslation(Keys.filter.conversionType.retail)}\n </MenuItem>\n <MenuItem\n data-testid=\"conversion-filter-option-member\"\n selected={conversionFilter === 'member'}\n onClick={() => handleFilterSelect('member')}\n >\n {getTranslation(Keys.filter.conversionType.member)}\n </MenuItem>\n </Menu>\n <WidgetMenu widgetId=\"conversion-rate\" onFullView={onTitleClick} onExport={onExport} />\n </HeaderActionsContainer>\n </TitleRow>\n </ChartHeader>\n\n <MetricDisplay>\n <MetricValue\n aria-label={`${getTranslation(Keys.defaults.conversionRate)}: ${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\">{getComparedToText(dateRange)}</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={<HollowDot />}\n activeDot={<ActiveHollowDot />}\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 DEFAULT_DATE_RANGE: DateRangeOption = 'last30days';\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 type { DateRangeOption } from '../types.d';\nimport { ShoppingDashboardTranslationKeys } from '../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { resolveTranslation } from '../TranslationKeys/translationResolver';\n\n/**\n * Generates dynamic comparison text based on the selected date range.\n * Uses translation keys for internationalization support.\n * @param dateRange The selected date range option\n * @returns Dynamic comparison text like \"compared to this time 7 days ago\"\n */\nexport function getComparedToText(dateRange: DateRangeOption): string {\n const keys = ShoppingDashboardTranslationKeys.widget.compareTo;\n\n switch (dateRange) {\n case 'last7days':\n return resolveTranslation(keys.last7days);\n case 'last30days':\n return resolveTranslation(keys.last30days);\n case 'last90days':\n return resolveTranslation(keys.last90days);\n case 'thisMonth':\n return resolveTranslation(keys.thisMonth);\n default:\n // Fallback for unknown date ranges\n return resolveTranslation(keys.last30days);\n }\n}\n","import type { ConversionDataPoint, ConversionFilterOption } from '../types.d';\n\nexport function matchesConversionFilter(point: ConversionDataPoint, filter: ConversionFilterOption): boolean {\n if (filter === 'all') return true;\n // An API that does not supply the dimension yet should not blank the chart\n if (point.priceTypes === undefined) return true;\n return point.priceTypes.some((priceType) => priceType.toLowerCase() === filter);\n}\n\nexport function filterConversionData(\n conversionData: readonly ConversionDataPoint[],\n filter: ConversionFilterOption,\n): ConversionDataPoint[] {\n return conversionData.filter((point) => matchesConversionFilter(point, filter));\n}\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n SignupsContainer,\n ChartHeader,\n ChartTitle,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n ChartContainer,\n Legend,\n LegendItem,\n LegendColor,\n LegendLabel,\n HeaderActionsContainer,\n} from './SignupsChart.styled';\nimport { FilterMenuButton } from '../DashboardHeader.styled';\nimport type { SignupDataPoint, SignupViewOption, DateRangeOption } from '../../types.d';\nimport { ChartWidgetSkeleton } from '../LoadingSkeletons';\nimport { formatAxisDate } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { getSignupValueByView } from '../../utils/dataUtils';\nimport { DEFAULT_DATE_RANGE } from '../../utils/dateConstants';\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 dateRange?: DateRangeOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onViewChange?: (view: SignupViewOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => 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 };\n\ninterface DotProps {\n readonly cx?: number;\n readonly cy?: number;\n readonly r?: number;\n}\n\n// Cache to memoize component factories by color to prevent Recharts reconciliation issues\n// Recharts uses object identity checks for component types, so we must return the same\n// component reference for the same color across renders.\n// Typed to match recharts' LineDot function-signature overload exactly, since a plain\n// React.ComponentType also covers class components, which LineDot does not accept.\nconst dotComponentCache = new Map<string, (props: DotProps) => React.ReactElement>();\n\n// Custom hollow dot component that accepts stroke color\n// Returns cached component to maintain stable references across renders\nconst HollowDotFactory = (strokeColor: string) => {\n if (dotComponentCache.has(strokeColor)) {\n return dotComponentCache.get(strokeColor)!;\n }\n\n const HollowDot = (props: DotProps) => {\n const { cx = 0, cy = 0, r = 2 } = props;\n return (\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"#FFFFFF\"\n fillOpacity=\"0\"\n stroke={strokeColor}\n strokeWidth=\"1.5\"\n style={{ pointerEvents: 'none' }}\n />\n );\n };\n HollowDot.displayName = 'HollowDot';\n\n dotComponentCache.set(strokeColor, HollowDot);\n return HollowDot;\n};\n\nconst SignupsChartComponent: React.FC<SignupsChartProps> = ({\n signupData,\n signupView,\n dateRange = DEFAULT_DATE_RANGE,\n isLoading = false,\n title,\n onViewChange,\n onTitleClick,\n onExport,\n}) => {\n const [viewAnchorEl, setViewAnchorEl] = React.useState<null | HTMLElement>(null);\n const isViewMenuOpen = Boolean(viewAnchorEl);\n\n const handleViewButtonClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setViewAnchorEl(event.currentTarget);\n }, []);\n\n const handleViewMenuClose = React.useCallback(() => {\n setViewAnchorEl(null);\n }, []);\n\n const handleViewSelect = React.useCallback(\n (newView: SignupViewOption) => {\n setViewAnchorEl(null);\n onViewChange?.(newView);\n },\n [onViewChange],\n );\n\n const noDataText = getTranslation(Keys.defaults.noData);\n const noChangeText = getTranslation(Keys.defaults.noChange);\n\n const totalSignups = React.useMemo(() => {\n if (signupData.length === 0) return 0;\n const lastDataPoint = signupData[signupData.length - 1];\n return getSignupValueByView(lastDataPoint, signupView);\n }, [signupData, signupView]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (signupData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestValue = getSignupValueByView(signupData[signupData.length - 1], signupView);\n const previousValue = getSignupValueByView(signupData[0], signupView);\n const change = latestValue - previousValue;\n const percentageChange = previousValue === 0 ? 0 : (change / previousValue) * 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, signupView]);\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.defaults.members);\n const retailLabel = getTranslation(Keys.defaults.retail);\n const brandAffiliatesLabel = getTranslation(Keys.defaults.brandAffiliates);\n const showAllLabel = getTranslation(Keys.filter.signupView.showAll);\n const showMembersLabel = getTranslation(Keys.filter.signupView.showMembers);\n const showRetailLabel = getTranslation(Keys.filter.signupView.showRetail);\n const showBrandAffiliatesLabel = getTranslation(Keys.filter.signupView.showBrandAffiliates);\n\n const signupViewLabels: Record<SignupViewOption, string> = {\n all: showAllLabel,\n members: showMembersLabel,\n retail: showRetailLabel,\n brandAffiliates: showBrandAffiliatesLabel,\n };\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 <FilterMenuButton\n id=\"signup-view-button\"\n data-testid=\"signup-view-dropdown\"\n onClick={handleViewButtonClick}\n disabled={isLoading}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isViewMenuOpen ? 'signup-view-menu' : undefined}\n aria-expanded={isViewMenuOpen ? 'true' : undefined}\n aria-label={getTranslation(Keys.widget.signups.filterAriaLabel)}\n >\n {signupViewLabels[signupView]}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </FilterMenuButton>\n <Menu\n id=\"signup-view-menu\"\n data-testid=\"signup-view-menu\"\n anchorEl={viewAnchorEl}\n open={isViewMenuOpen}\n onClose={handleViewMenuClose}\n MenuListProps={{ 'aria-labelledby': 'signup-view-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuItem\n data-testid=\"signup-view-option-all\"\n selected={signupView === 'all'}\n onClick={() => handleViewSelect('all')}\n >\n {showAllLabel}\n </MenuItem>\n <MenuItem\n data-testid=\"signup-view-option-members\"\n selected={signupView === 'members'}\n onClick={() => handleViewSelect('members')}\n >\n {showMembersLabel}\n </MenuItem>\n <MenuItem\n data-testid=\"signup-view-option-retail\"\n selected={signupView === 'retail'}\n onClick={() => handleViewSelect('retail')}\n >\n {showRetailLabel}\n </MenuItem>\n <MenuItem\n data-testid=\"signup-view-option-brandAffiliates\"\n selected={signupView === 'brandAffiliates'}\n onClick={() => handleViewSelect('brandAffiliates')}\n >\n {showBrandAffiliatesLabel}\n </MenuItem>\n </Menu>\n <WidgetMenu widgetId=\"signups\" onFullView={onTitleClick} onExport={onExport} />\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\">{getComparedToText(dateRange)}</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={HollowDotFactory(\n signupView === 'all' ? SERIES_COLORS.total : SERIES_COLORS.members,\n )}\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={HollowDotFactory(SERIES_COLORS.members)}\n name={membersLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={HollowDotFactory(SERIES_COLORS.retail)}\n name={retailLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={HollowDotFactory(SERIES_COLORS.brandAffiliates)}\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={HollowDotFactory(SERIES_COLORS.retail)}\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={HollowDotFactory(SERIES_COLORS.brandAffiliates)}\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 KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\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 SortMenuButton,\n} from './TopCategoriesPieChart.styled';\nimport type { CategoryRevenue, CategorySortOption, MarketOption } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { resolveTrendDirection, calculateWeightedRevenueTrend, renderPieChartLabel } from '../../utils/trendUtils';\nimport { formatMoney, getLocaleFromMarketCode } 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 market?: MarketOption;\n readonly summaryChangePct?: number | null;\n readonly onSortChange?: (sort: CategorySortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopCategoriesPieChartComponent: React.FC<TopCategoriesPieChartProps> = ({\n categories,\n categorySort,\n isLoading = false,\n title,\n market,\n summaryChangePct,\n onSortChange,\n onTitleClick,\n onExport,\n}) => {\n const [sortAnchorEl, setSortAnchorEl] = React.useState<null | HTMLElement>(null);\n const isSortMenuOpen = Boolean(sortAnchorEl);\n\n const handleSortButtonClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setSortAnchorEl(event.currentTarget);\n }, []);\n\n const handleSortMenuClose = React.useCallback(() => {\n setSortAnchorEl(null);\n }, []);\n\n const handleSortSelect = React.useCallback(\n (newSort: CategorySortOption) => {\n setSortAnchorEl(null);\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedCategories, totalRevenue, totalVolume, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedCategories = [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (b.volume ?? 0) - (a.volume ?? 0);\n });\n\n const nextTotalRevenue = nextSortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n const nextTotalVolume = nextSortedCategories.reduce((sum, category) => sum + (category.volume ?? 0), 0);\n\n let nextTrendDirection: TrendDirection;\n let nextFormattedTrend: string;\n\n // Use the provided summaryChangePct if available\n if (summaryChangePct !== undefined && summaryChangePct !== null) {\n if (Math.abs(summaryChangePct) < 0.1) {\n nextFormattedTrend = '0%';\n nextTrendDirection = 'neutral';\n } else {\n nextTrendDirection = summaryChangePct > 0 ? 'up' : 'down';\n nextFormattedTrend = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%`;\n }\n } else {\n const { direction, formatted } = calculateWeightedRevenueTrend(\n nextSortedCategories,\n (category) => (categorySort === 'volume' ? (category.volume ?? 0) : category.revenue),\n (category) => (categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue),\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n sortedCategories: nextSortedCategories,\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [categories, categorySort, summaryChangePct]);\n\n const getTrendGraphIcon = (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 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 return renderPieChartLabel(props, { fontSize: '10', fontWeight: '600' });\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 <SortMenuButton\n id=\"category-sort-button\"\n data-testid=\"category-sort-dropdown\"\n onClick={handleSortButtonClick}\n disabled={isLoading}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isSortMenuOpen ? 'category-sort-menu' : undefined}\n aria-expanded={isSortMenuOpen ? 'true' : undefined}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.byVolume)\n : getTranslation(Keys.defaults.byRevenue)}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </SortMenuButton>\n <Menu\n id=\"category-sort-menu\"\n data-testid=\"category-sort-menu\"\n anchorEl={sortAnchorEl}\n open={isSortMenuOpen}\n onClose={handleSortMenuClose}\n MenuListProps={{ 'aria-labelledby': 'category-sort-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuItem\n data-testid=\"category-sort-option-revenue\"\n selected={categorySort === 'revenue'}\n onClick={() => handleSortSelect('revenue')}\n >\n {getTranslation(Keys.defaults.byRevenue)}\n </MenuItem>\n <MenuItem\n data-testid=\"category-sort-option-volume\"\n selected={categorySort === 'volume'}\n onClick={() => handleSortSelect('volume')}\n >\n {getTranslation(Keys.defaults.byVolume)}\n </MenuItem>\n </Menu>\n <WidgetMenu widgetId=\"top-categories\" onFullView={onTitleClick} onExport={onExport} />\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={categorySort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-donut-center\">\n <DonutCenterLabel>\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.volume)\n : getTranslation(Keys.stats.revenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {categorySort === 'volume' ? (\n <>\n {totalVolume.toFixed(1)}\n <br />\n {getTranslation(Keys.defaults.dcSv)}\n </>\n ) : (\n formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))\n )}\n </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 const displayValue = categorySort === 'volume' ? category.volume : category.revenue;\n const displayPercentage =\n categorySort === 'volume' ? category.volumeSharePct : category.percentage;\n const displayTrend =\n categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue;\n return (\n <LegendItem key={category.id} data-testid={`category-legend-${index}`}>\n <LegendColor color={category.color} />\n <LegendInfo>\n <LegendName>\n {category.name.charAt(0).toUpperCase() + category.name.slice(1)}\n </LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {categorySort === 'volume'\n ? `${displayValue?.toFixed(1)} (${displayPercentage}%)`\n : `${formatMoney(displayValue ?? 0, category.currencyCode, getLocaleFromMarketCode(market))} (${displayPercentage}%)`}\n </LegendValue>\n {displayTrend ? (\n <LegendTrendInline\n direction={resolveTrendDirection(displayTrend)}\n data-testid={`category-legend-trend-${index}`}\n aria-label={displayTrend}\n >\n {getTrendGraphIcon(resolveTrendDirection(displayTrend))}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\n </LegendItem>\n );\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 SortMenuButton = styled('button')`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\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 white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus-visible {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\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 svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\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';\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 readonly categoriesSummaryChangePct?: number | null;\n readonly conversionSummaryChangePct?: number | null;\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 readonly onProductsExport?: () => void;\n readonly onConversionExport?: () => void;\n readonly onSignupsExport?: () => void;\n readonly onCategoriesExport?: () => 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 = DEFAULT_DATE_RANGE,\n market = 'all',\n productSort = 'units',\n signupView = 'all',\n conversionFilter = 'all',\n categorySort = 'revenue',\n categoriesSummaryChangePct,\n conversionSummaryChangePct,\n markets,\n onDateRangeChange,\n onMarketChange,\n onProductSortChange,\n onSignupViewChange,\n onConversionFilterChange,\n onCategorySortChange,\n onProductsTitleClick,\n onConversionTitleClick,\n onSignupsTitleClick,\n onCategoriesToTitleClick,\n onProductsExport,\n onConversionExport,\n onSignupsExport,\n onCategoriesExport,\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.defaults.volume)}\n value={stats?.metrics?.volume ?? '0'}\n subtitle={getTranslation(Keys.defaults.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.defaults.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 market={market}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onProductsExport}\n />\n <SignupsChart\n signupData={resolvedSignupData}\n signupView={signupView}\n dateRange={dateRange}\n isLoading={isLoading}\n onViewChange={onSignupViewChange}\n onTitleClick={onSignupsTitleClick}\n onExport={onSignupsExport}\n />\n </TwoColumnGrid>\n\n <TwoColumnGrid data-testid=\"widget-row-2\">\n <ConversionRateChart\n conversionData={resolvedConversionData}\n conversionFilter={conversionFilter}\n dateRange={dateRange}\n isLoading={isLoading}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n onExport={onConversionExport}\n />\n <TopCategoriesPieChart\n categories={resolvedCategories}\n categorySort={categorySort}\n isLoading={isLoading}\n market={market}\n summaryChangePct={categoriesSummaryChangePct}\n onSortChange={onCategorySortChange}\n onTitleClick={onCategoriesToTitleClick}\n onExport={onCategoriesExport}\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 { useScrollToTopOnViewChange } from './hooks/useScrollToTopOnViewChange';\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\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 conversionPriceTypeTrend?: ConversionDataPoint[];\n readonly signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly categoriesSummaryChangePct?: number | null;\n readonly conversionSummaryChangePct?: number | null;\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 readonly onProductsExport?: () => void;\n readonly onConversionExport?: () => void;\n readonly onSignupsExport?: () => void;\n readonly onCategoriesExport?: () => 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 conversionPriceTypeTrend,\n signupData,\n categories,\n categoriesSummaryChangePct,\n conversionSummaryChangePct,\n orders,\n signups,\n isLoading = false,\n error,\n shopTitle,\n className,\n translate,\n initialDateRange = DEFAULT_DATE_RANGE,\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 onProductsExport,\n onConversionExport,\n onSignupsExport,\n onCategoriesExport,\n}) => {\n useTranslationResolver(translate);\n\n const [currentView, setCurrentView] = React.useState<MysiteDashboardView>('dashboard');\n useScrollToTopOnViewChange(currentView);\n\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 priceTypeTrend={conversionPriceTypeTrend}\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 summaryChangePct={categoriesSummaryChangePct}\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 categoriesSummaryChangePct={categoriesSummaryChangePct}\n conversionSummaryChangePct={conversionSummaryChangePct}\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 onProductsExport={onProductsExport}\n onConversionExport={onConversionExport}\n onSignupsExport={onSignupsExport}\n onCategoriesExport={onCategoriesExport}\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, getLocaleFromMarketCode } 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.defaults.units) },\n { value: 'revenue', label: getTranslation(Keys.defaults.revenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.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.defaults.revenue),\n sortable: true,\n render: (value: unknown) => (\n <MetricValue>\n {formatMoney(Number(value), currencyCode, getLocaleFromMarketCode(market))}\n </MetricValue>\n ),\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, market],\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>{getTranslation(Keys.defaults.units)}</MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.revenue)}</MobileMetricLabel>\n <MobileMetricValue>\n {formatMoney(row.revenue, currencyCode, getLocaleFromMarketCode(market))}\n </MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.volume)}</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 KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport {\n PageHeaderWrapper,\n BackButtonWrapper,\n BackButton,\n HeaderContainer,\n LeftSection,\n Title,\n DateRange,\n MobileDateRange,\n FiltersSection,\n FilterWrapper,\n FilterIcon,\n FilterMenuButton,\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 [openFilter, setOpenFilter] = React.useState<{ key: string; anchorEl: HTMLElement } | null>(null);\n\n const handleFilterButtonClick = (filterKey: string, event: React.MouseEvent<HTMLButtonElement>) => {\n setOpenFilter({ key: filterKey, anchorEl: event.currentTarget });\n };\n\n const handleFilterMenuClose = () => {\n setOpenFilter(null);\n };\n\n const handleFilterSelect = (filterKey: string, value: string) => {\n setOpenFilter(null);\n onFilterChange?.(filterKey, value);\n };\n\n const getOptionLabel = (filter: FilterConfig, option: FilterConfig['options'][number]) =>\n filter.label && filter.key === 'customerType' ? `${filter.label} ${option.label}` : option.label;\n\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 <MobileDateRange>{dateRange}</MobileDateRange>\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 const isMenuOpen = openFilter?.key === filter.key;\n const selectedOption = filter.options.find((option) => option.value === filter.value);\n const menuId = `filter-menu-${filter.key}`;\n const buttonId = `filter-button-${filter.key}`;\n\n return (\n <FilterWrapper key={filter.key} $breakToNewLineOnMobile={!filter.icon}>\n {renderFilterIcon(filter.icon)}\n <FilterMenuButton\n id={buttonId}\n data-testid={`filter-dropdown-${filter.key}`}\n onClick={(e) => handleFilterButtonClick(filter.key, e)}\n disabled={filter.disabled}\n type=\"button\"\n aria-haspopup=\"true\"\n aria-controls={isMenuOpen ? menuId : undefined}\n aria-expanded={isMenuOpen ? 'true' : undefined}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n >\n {selectedOption ? getOptionLabel(filter, selectedOption) : filter.value}\n <KeyboardArrowDownIcon fontSize=\"small\" />\n </FilterMenuButton>\n <Menu\n id={menuId}\n data-testid={`filter-menu-${filter.key}`}\n anchorEl={isMenuOpen ? openFilter.anchorEl : null}\n open={isMenuOpen}\n onClose={handleFilterMenuClose}\n MenuListProps={{ 'aria-labelledby': buttonId }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {filter.options.map((option) => (\n <MenuItem\n key={option.value}\n data-testid={`filter-dropdown-${filter.key}-option-${option.value}`}\n selected={option.value === filter.value}\n onClick={() => handleFilterSelect(filter.key, option.value)}\n >\n {getOptionLabel(filter, option)}\n </MenuItem>\n ))}\n </Menu>\n </FilterWrapper>\n );\n })}\n </FiltersSection>\n )}\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 margin-top: 12px;\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-start;\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-wrap: wrap;\n align-items: center;\n gap: 16px 24px;\n flex: 1 1 auto;\n min-width: 0;\n }\n`;\n\nexport const FilterWrapper = styled('div')<{ $breakToNewLineOnMobile?: boolean }>`\n display: flex;\n align-items: center;\n gap: 8px;\n\n @media (max-width: 767px) {\n flex-basis: ${({ $breakToNewLineOnMobile }) => ($breakToNewLineOnMobile ? '100%' : 'auto')};\n min-width: 0;\n }\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\n// Button-based trigger for MUI Menu dropdowns (replaces native <select> so the\n// options popup is positioned via Popper and stays within the viewport on mobile).\nexport const FilterMenuButton = styled('button')`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n background-color: transparent;\n border: none;\n font-family: inherit;\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 white-space: nowrap;\n flex-shrink: 0;\n border-radius: 4px;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus-visible {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\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 svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n }\n`;\n\nexport const MobileTitleWrapper = styled('div')`\n display: none;\n\n @media (max-width: 767px) {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\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, getLocaleFromMarketCode } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport { filterConversionData } from '../../utils/conversionFilter';\nimport { collectPriceTypes, priceTypeColor, priceTypeSeriesKey, toSeriesPoint } from '../../utils/conversionSeries';\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 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 TrendValueText,\n TrendComparisonText,\n MetricSectionWrapper,\n MetricValueWithSpacing,\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 // Order-details trend, used only to draw a line per price type\n readonly priceTypeTrend?: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n // 'default' keeps the Type and BV columns; 'sv' replaces them with a single Total SV column\n readonly orderColumnsVariant?: 'default' | 'sv';\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 priceTypeTrend,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n orderColumnsVariant = 'default',\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onConversionFilterChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [sortColumn, setSortColumn] = useState<string | undefined>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\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 filteredData = React.useMemo(\n () => filterConversionData(conversionData, conversionFilter),\n [conversionData, conversionFilter],\n );\n\n // Only the unfiltered view splits into a line per price type; a specific filter already has one series\n const priceTypeSeries = React.useMemo(\n () => (conversionFilter === 'all' ? collectPriceTypes(priceTypeTrend ?? []) : []),\n [conversionFilter, priceTypeTrend],\n );\n\n // The price type series come from the order-details trend, so the headline keeps using conversionData\n const chartData = React.useMemo(\n () =>\n priceTypeSeries.length > 0\n ? (priceTypeTrend ?? []).map((point) => toSeriesPoint(point, priceTypeSeries))\n : filteredData.map((point) => toSeriesPoint(point, priceTypeSeries)),\n [priceTypeSeries, priceTypeTrend, filteredData],\n );\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return filteredData.at(-1)?.rate ?? 0;\n }, [summaryRate, filteredData]);\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 (filteredData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = filteredData.at(-1)?.rate ?? 0;\n const previousRate = filteredData[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, filteredData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'retail') return getTranslation(Keys.filter.conversionType.retail);\n if (filter === 'member') return getTranslation(Keys.filter.conversionType.member);\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: 'retail', label: getTranslation(Keys.filter.conversionType.retail) },\n { value: 'member', label: getTranslation(Keys.filter.conversionType.member) },\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.priceType?.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const handleSort = React.useCallback((columnKey: string, direction: 'asc' | 'desc') => {\n setSortColumn(columnKey);\n setSortDirection(direction);\n setCurrentPage(1);\n }, []);\n\n const sortedOrders = React.useMemo(() => {\n if (!sortColumn) return filteredOrders;\n return [...filteredOrders].sort((a, b) => {\n const aVal = a[sortColumn as keyof OrderHistory];\n const bVal = b[sortColumn as keyof OrderHistory];\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return sortDirection === 'asc' ? aVal - bVal : bVal - aVal;\n }\n const aStr = String(aVal ?? '');\n const bStr = String(bVal ?? '');\n return sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);\n });\n }, [filteredOrders, sortColumn, sortDirection]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(sortedOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(() => {\n const showTotalSvOnly = orderColumnsVariant === 'sv';\n\n return [\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.defaults.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n ...(showTotalSvOnly\n ? []\n : [{ key: 'customerType', label: getTranslation(Keys.defaults.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, getLocaleFromMarketCode(market), 2),\n },\n {\n key: 'bv',\n label: getTranslation(\n showTotalSvOnly\n ? Keys.fullView.conversionRate.columns.totalSv\n : Keys.fullView.conversionRate.columns.bv,\n ),\n sortable: true,\n },\n ];\n }, [market, orderColumnsVariant]);\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'retail') return '#2e7d32';\n if (conversionFilter === 'member') 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.defaults.conversionRate)}\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.defaults.conversionRate)}\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 <MetricSectionWrapper>\n <MetricValueWithSpacing data-testid=\"conversion-rate-value\">\n {currentRate.toFixed(1)}%\n </MetricValueWithSpacing>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <TrendValueText>{trend.value}</TrendValueText>\n <TrendComparisonText>{getComparedToText(dateRange)}</TrendComparisonText>\n </MetricTrend>\n </MetricSectionWrapper>\n </MetricSection>\n\n <ChartSection>\n <ChartWithLegendWrapper>\n <ConversionTrendChartContainer data-testid=\"conversion-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={chartData} 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 {priceTypeSeries.length > 0 ? (\n priceTypeSeries.map((priceType, index) => (\n <Line\n key={priceType}\n type=\"monotone\"\n dataKey={priceTypeSeriesKey(priceType)}\n stroke={priceTypeColor(priceType, index)}\n strokeWidth={2}\n name={priceType}\n dot={false}\n />\n ))\n ) : (\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n dot={false}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </ConversionTrendChartContainer>\n <ChartLegendContainer>\n {priceTypeSeries.length > 0 ? (\n priceTypeSeries.map((priceType, index) => (\n <LegendItem key={priceType} $color={priceTypeColor(priceType, index)}>\n {priceType}\n </LegendItem>\n ))\n ) : (\n <LegendItem $color={getChartColor()}>\n {`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n </LegendItem>\n )}\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 sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\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.total)}\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 type { ConversionDataPoint } from '../types.d';\n\nexport const PRICE_TYPE_SERIES_PREFIX = 'rate__';\n\nconst PRICE_TYPE_COLORS: Readonly<Record<string, string>> = {\n retail: '#2e7d32',\n member: '#ed6c02',\n};\n\nconst FALLBACK_COLORS = ['#1976d2', '#9c27b0', '#00897b', '#c2185b'];\n\nexport function priceTypeSeriesKey(priceType: string): string {\n return `${PRICE_TYPE_SERIES_PREFIX}${priceType}`;\n}\n\nexport function priceTypeColor(priceType: string, index: number): string {\n return PRICE_TYPE_COLORS[priceType.toLowerCase()] ?? FALLBACK_COLORS[index % FALLBACK_COLORS.length];\n}\n\nexport function collectPriceTypes(conversionData: readonly ConversionDataPoint[]): string[] {\n const priceTypes: string[] = [];\n conversionData.forEach((point) => {\n Object.keys(point.ratesByPriceType ?? {}).forEach((priceType) => {\n if (!priceTypes.includes(priceType)) priceTypes.push(priceType);\n });\n });\n return priceTypes.sort((a, b) => a.localeCompare(b));\n}\n\n// A price type with no orders on a day is a real zero, not a gap in the line\nexport function toSeriesPoint(\n point: ConversionDataPoint,\n priceTypes: readonly string[],\n): ConversionDataPoint & Record<string, unknown> {\n const series: Record<string, number> = {};\n priceTypes.forEach((priceType) => {\n series[priceTypeSeriesKey(priceType)] = point.ratesByPriceType?.[priceType] ?? 0;\n });\n return { ...point, ...series };\n}\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport { MetricValue } from '../FullViewComponents.styled';\n\nconst { getGenomeColor } = ColorUtils;\n\n// Adds spacing before the adjacent trend indicator, specific to this page's layout\nexport const MetricValueWithSpacing = styled(MetricValue)`\n margin-right: 6px;\n`;\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)<{ $color?: string }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ $color }) => $color ?? 'inherit'};\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\nexport const TrendValueText = 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`;\n\nexport const TrendComparisonText = styled('span')`\n margin-left: 2px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 400;\n font-size: 12px;\n line-height: 16px;\n letter-spacing: 0.01em;\n color: #5f5f5f;\n`;\n\nexport const MetricSectionWrapper = styled(Box)`\n display: flex;\n align-items: center;\n gap: 0;\n flex-wrap: wrap;\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, getSignupValueByView } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\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 TrendAbsoluteChangeText,\n TrendPercentageChangeText,\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 // Guard for nullish or non-object input\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\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 [sortColumn, setSortColumn] = useState<string | undefined>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\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 const lastDataPoint = normalizedSignupData[normalizedSignupData.length - 1];\n return getSignupValueByView(lastDataPoint, signupView);\n }, [normalizedSignupData, signupView]);\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 = getSignupValueByView(normalizedSignupData[0], signupView);\n const last = getSignupValueByView(normalizedSignupData[normalizedSignupData.length - 1], signupView);\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, signupView, 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.defaults.all) },\n { value: 'members', label: getTranslation(Keys.defaults.members) },\n { value: 'retail', label: getTranslation(Keys.defaults.retail) },\n { value: 'brandAffiliates', label: getTranslation(Keys.defaults.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 handleSort = React.useCallback((columnKey: string, direction: 'asc' | 'desc') => {\n setSortColumn(columnKey);\n setSortDirection(direction);\n setCurrentPage(1);\n }, []);\n\n const sortedSignups = React.useMemo(() => {\n if (!sortColumn) return signups;\n return [...signups].sort((a, b) => {\n const aVal = a[sortColumn as keyof SignupDetail];\n const bVal = b[sortColumn as keyof SignupDetail];\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return sortDirection === 'asc' ? aVal - bVal : bVal - aVal;\n }\n const aStr = String(aVal ?? '');\n const bStr = String(bVal ?? '');\n return sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);\n });\n }, [signups, sortColumn, sortDirection]);\n\n const { totalPages, pageItems: paginatedSignups } = usePaginatedItems(sortedSignups, 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.defaults.date), sortable: true },\n { key: 'type', label: getTranslation(Keys.defaults.type), sortable: true },\n { key: 'market', label: getTranslation(Keys.fullView.signups.columns.market), 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 <TrendAbsoluteChangeText>\n {trend.absoluteChange > 0 ? '+' : ''}\n {trend.absoluteChange}\n </TrendAbsoluteChangeText>\n <TrendPercentageChangeText>{trend.percentageChange}</TrendPercentageChangeText>\n </>\n )}\n {trend.direction === 'neutral' && <span>{trend.percentageChange}</span>}\n </MetricTrend>\n <ComparisonTextMobile>{getComparedToText(dateRange)}</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.defaults.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.defaults.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.defaults.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.defaults.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.defaults.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.defaults.brandAffiliates)}\n dot={{ r: 2 }}\n connectNulls\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </SignupTrendChartContainer>\n <Box>\n {signupView === 'all' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.total}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>{' '}\n <LegendItem $legendColor={SERIES_COLORS.members}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n <LegendItem $legendColor={SERIES_COLORS.retail}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n <LegendItem $legendColor={SERIES_COLORS.brandAffiliates}>\n {getTranslation(Keys.defaults.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.members}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.retail}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem $legendColor={SERIES_COLORS.brandAffiliates}>\n {getTranslation(Keys.defaults.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 sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\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 shouldForwardProp: (prop) => prop !== '$legendColor',\n})<{ $legendColor?: string }>`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ $legendColor, theme }) => $legendColor ?? 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\nexport const TrendAbsoluteChangeText = styled('span')`\n font-weight: 600;\n line-height: 1;\n`;\n\nexport const TrendPercentageChangeText = styled('span')`\n font-weight: 400;\n line-height: 1;\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, capitalizeFirstLetter, getLocaleFromMarketCode } 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 type { TrendDirection } from '../types';\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 { calculateWeightedRevenueTrend, renderPieChartLabel } 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 summaryChangePct?: number | null;\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 summaryChangePct,\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.defaults.byRevenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.byVolume) },\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 return renderPieChartLabel(props, { fontSize: '12', fontWeight: '700' });\n };\n\n const getTrendIcon = (direction: TrendDirection) => {\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): TrendDirection => {\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 (b.volume ?? 0) - (a.volume ?? 0);\n }),\n [categories, categorySort],\n );\n\n const { totalRevenue, totalVolume, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n const nextTotalVolume = sortedCategories.reduce((sum, category) => sum + (category.volume ?? 0), 0);\n\n let nextTrendDirection: TrendDirection;\n let nextFormattedTrend: string;\n\n // Use the provided summaryChangePct if available, otherwise calculate from items\n if (summaryChangePct !== undefined && summaryChangePct !== null) {\n if (Math.abs(summaryChangePct) < 0.1) {\n nextFormattedTrend = '0%';\n nextTrendDirection = 'neutral';\n } else {\n nextTrendDirection = summaryChangePct > 0 ? 'up' : 'down';\n nextFormattedTrend = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%`;\n }\n } else {\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedCategories,\n (category) => (categorySort === 'volume' ? (category.volume ?? 0) : category.revenue),\n (category) => (categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue),\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n totalRevenueTrendDirection: nextTrendDirection,\n totalRevenueTrend: nextFormattedTrend,\n };\n }, [sortedCategories, summaryChangePct, categorySort]);\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 currencyCode = sortedCategories[0]?.currencyCode;\n\n const columns: ColumnDef<CategoryRevenue>[] = React.useMemo(() => {\n const cols = [\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>{capitalizeFirstLetter(row.name)}</CategoryNameColumnCell>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.defaults.revenue),\n sortable: true,\n render: (value: unknown, row: CategoryRevenue) =>\n formatMoney(Number(value), row.currencyCode, getLocaleFromMarketCode(market)),\n },\n {\n key: 'volume',\n label: getTranslation(Keys.defaults.volume),\n sortable: true,\n render: (value: unknown) =>\n `${Number(value ?? 0).toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`,\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 return cols;\n }, [currencyCode, market]);\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={categorySort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>\n {categorySort === 'volume'\n ? getTranslation(Keys.defaults.volume)\n : getTranslation(Keys.stats.revenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {categorySort === 'volume' ? (\n <>\n {totalVolume.toFixed(1)}\n <br />\n {getTranslation(Keys.defaults.dcSv)}\n </>\n ) : (\n formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))\n )}\n </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 const summaryValue = categorySort === 'volume' ? category.volume : category.revenue;\n const summaryPercentage =\n categorySort === 'volume' ? category.volumeSharePct : category.percentage;\n const summaryTrend =\n categorySort === 'volume' ? category.trend?.volume : category.trend?.revenue;\n return (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{capitalizeFirstLetter(category.name)}</SummaryName>\n <SummaryValue>\n {categorySort === 'volume'\n ? (summaryValue ?? 0).toFixed(1)\n : formatMoney(\n summaryValue ?? 0,\n category.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </SummaryValue>\n <SummaryPercentage>({summaryPercentage}%)</SummaryPercentage>\n {summaryTrend ? (\n <SummaryTrendIcon direction={resolveTrendDirection(summaryTrend)}>\n {getTrendIcon(resolveTrendDirection(summaryTrend))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n );\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(\n category.revenue,\n category.currencyCode,\n getLocaleFromMarketCode(market),\n )}\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 /* Donut hole shrinks on mobile (fixed 220px chart height), so the\n overlay must be narrower to avoid overlapping the colored ring. */\n @media (max-width: 767px) {\n width: 96px;\n }\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 @media (max-width: 767px) {\n font-size: 0.6875rem;\n }\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 @media (max-width: 767px) {\n font-size: 1rem;\n }\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 @media (max-width: 767px) {\n font-size: 0.75rem;\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\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 // Set resolver in effect only — synchronous side effects during render are impure\n // Always call useEffect at top level - React Hook Rules require unconditional hook calls\n // This manages setup, cleanup on unmount, and updates when translate changes\n React.useEffect(() => {\n if (translate !== undefined) {\n setTranslationResolver(translate);\n return () => {\n setTranslationResolver(undefined);\n };\n }\n return undefined;\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 React from 'react';\n\nfunction scrollWindowToTop(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (typeof window.scrollTo === 'function') {\n window.scrollTo({ top: 0, left: 0, behavior: 'auto' });\n return;\n }\n\n const scrollingElement = window.document?.scrollingElement ?? window.document?.documentElement;\n\n if (scrollingElement) {\n scrollingElement.scrollTop = 0;\n }\n}\n\n/**\n * Resets the page scroll position whenever the dashboard switches between the\n * summary view and a widget full view, so the new view always starts at its top.\n */\nexport function useScrollToTopOnViewChange(view: string): void {\n const previousViewRef = React.useRef(view);\n\n React.useEffect(() => {\n if (previousViewRef.current === view) {\n return;\n }\n\n previousViewRef.current = view;\n scrollWindowToTop();\n }, [view]);\n}\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 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 '../TopCategories/TopCategoriesPieChart.styled';\nimport type { TopPerformingOffer, OfferSortOption, MarketOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport type { TrendDirection } from '../types';\nimport { formatMoney, capitalizeFirstLetter, getLocaleFromMarketCode } 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 market?: MarketOption;\n readonly summaryChangePct?: number | null;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\n market,\n summaryChangePct,\n onSortChange,\n onTitleClick,\n onExport,\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, totalVolume, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return (b.volume ?? 0) - (a.volume ?? 0);\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n const nextTotalVolume = nextSortedOffers.reduce((sum, offer) => sum + (offer.volume ?? 0), 0);\n\n let nextTrendDirection: TrendDirection;\n let nextFormattedTrend: string;\n\n // Prefer the aggregate change supplied by the API over a client-side approximation.\n // A null change means the API had no prior period to compare against, which we surface as no change.\n if (summaryChangePct !== undefined) {\n const changePct = summaryChangePct ?? 0;\n if (Math.abs(changePct) < 0.1) {\n nextFormattedTrend = '0%';\n nextTrendDirection = 'neutral';\n } else {\n nextTrendDirection = changePct > 0 ? 'up' : 'down';\n nextFormattedTrend = `${changePct > 0 ? '+' : ''}${changePct.toFixed(1)}%`;\n }\n } else {\n const { direction, formatted } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => (offerSort === 'volume' ? (offer.volume ?? 0) : offer.revenue),\n (offer) => (offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue),\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [offers, offerSort, summaryChangePct]);\n\n const getTrendGraphIcon = (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 null;\n };\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.defaults.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.defaults.byVolume)}</option>\n </SortDropdown>\n <WidgetMenu widgetId=\"top-offers\" onFullView={onTitleClick} onExport={onExport} />\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={offerSort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n offerSort === 'volume'\n ? `${value.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {offerSort === 'volume'\n ? getTranslation(Keys.widget.topPerformingOffers.totalVolume)\n : getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {offerSort === 'volume'\n ? `${totalVolume.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))}\n </DonutCenterValue>\n <DonutCenterTrend direction={trendDirection} data-testid=\"top-offers-donut-trend\">\n {getTrendGraphIcon(trendDirection)}\n <span>{formattedTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"top-offers-legend-container\">\n {sortedOffers.map((offer, index) => {\n const displayTrend = offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue;\n const displayPercentage =\n offerSort === 'volume' ? (offer.volumeSharePct ?? offer.percentage) : offer.percentage;\n const legendTrendDirection = resolveTrendDirection(displayTrend);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{capitalizeFirstLetter(offer.name)}</LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {offerSort === 'volume'\n ? `${(offer.volume ?? 0).toFixed(1)} ${getTranslation(Keys.defaults.dcSv)} (${displayPercentage}%)`\n : `${formatMoney(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )} (${displayPercentage}%)`}\n </LegendValue>\n {displayTrend ? (\n <LegendTrendInline\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={displayTrend}\n >\n {getTrendGraphIcon(legendTrendDirection)}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\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 byVolume: { key: 'productOfferDashboard.filter.offerSort.byVolume', fallback: 'Volume' },\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 totalVolume: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalVolume',\n fallback: 'Total volume',\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 byRevenue: { key: 'productOfferDashboard.defaults.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.defaults.byUnits', fallback: 'Units' },\n byVolume: { key: 'productOfferDashboard.defaults.byVolume', fallback: 'Volume' },\n volume: { key: 'productOfferDashboard.defaults.volume', fallback: 'Volume' },\n dcSv: { key: 'productOfferDashboard.defaults.dcSv', fallback: 'DC-SV' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport type { ConversionFilterOption, OrderHistory, TopPerformingOffer, TopProduct } from '../types.d';\nimport { exportConversionRate, exportTopPerformingOffers, exportTopProducts } from '../utils/productOfferExport';\n\nexport interface ProductOfferWidgetExportOptions {\n readonly topProducts: readonly TopProduct[];\n readonly topOffers: readonly TopPerformingOffer[];\n readonly orders?: readonly OrderHistory[];\n readonly conversionFilter?: ConversionFilterOption;\n readonly topProductsExportData?: readonly TopProduct[];\n readonly topOffersExportData?: readonly TopPerformingOffer[];\n readonly conversionExportData?: readonly OrderHistory[];\n readonly showTopProductsExportOption?: boolean;\n readonly showTopOffersExportOption?: boolean;\n readonly showConversionExportOption?: boolean;\n readonly isLoading?: boolean;\n}\n\nexport interface ProductOfferWidgetExportHandlers {\n readonly onTopProductsExport?: () => Promise<void>;\n readonly onTopOffersExport?: () => Promise<void>;\n readonly onConversionExport?: () => Promise<void>;\n}\n\nexport function useProductOfferWidgetExports({\n topProducts,\n topOffers,\n orders,\n conversionFilter = 'all',\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\n isLoading = false,\n}: ProductOfferWidgetExportOptions): ProductOfferWidgetExportHandlers {\n const productRows = topProductsExportData ?? topProducts;\n const offerRows = topOffersExportData ?? topOffers;\n const sourceOrderRows = conversionExportData ?? orders ?? [];\n\n // Mirror the full view's Order Details table, which lists only orders matching the active filter.\n const orderRows = React.useMemo(() => {\n if (conversionFilter === 'all') return sourceOrderRows;\n return sourceOrderRows.filter((order) => order.priceType?.toLowerCase() === conversionFilter);\n }, [sourceOrderRows, conversionFilter]);\n\n const canExportProducts = showTopProductsExportOption && !isLoading && productRows.length > 0;\n const canExportOffers = showTopOffersExportOption && !isLoading && offerRows.length > 0;\n const canExportConversion = showConversionExportOption && !isLoading && orderRows.length > 0;\n\n const onTopProductsExport = React.useCallback(() => exportTopProducts(productRows), [productRows]);\n const onTopOffersExport = React.useCallback(() => exportTopPerformingOffers(offerRows), [offerRows]);\n const onConversionExport = React.useCallback(() => exportConversionRate(orderRows), [orderRows]);\n\n return {\n onTopProductsExport: canExportProducts ? onTopProductsExport : undefined,\n onTopOffersExport: canExportOffers ? onTopOffersExport : undefined,\n onConversionExport: canExportConversion ? onConversionExport : undefined,\n };\n}\n","export type ExcelCellValue = string | number | boolean | Date | null | undefined;\n\nexport interface ExcelExportColumn<TItem> {\n readonly header: string;\n readonly value: (item: TItem) => ExcelCellValue;\n}\n\nexport interface ExcelExportOptions<TItem> {\n readonly rows: readonly TItem[];\n readonly columns: readonly ExcelExportColumn<TItem>[];\n readonly fileName: string;\n readonly sheetName: string;\n}\n\nconst INVALID_SHEET_NAME_CHARS = /[\\\\/?*[\\]:]/g;\nconst MAX_SHEET_NAME_LENGTH = 31;\n\nexport function normalizeExcelFileName(fileName: string): string {\n const trimmedFileName = fileName.trim();\n const resolvedFileName = trimmedFileName.length > 0 ? trimmedFileName : 'export';\n return resolvedFileName.toLowerCase().endsWith('.xlsx') ? resolvedFileName : `${resolvedFileName}.xlsx`;\n}\n\nexport function normalizeExcelSheetName(sheetName: string): string {\n const normalizedSheetName = sheetName.replace(INVALID_SHEET_NAME_CHARS, ' ').trim();\n const resolvedSheetName = normalizedSheetName.length > 0 ? normalizedSheetName : 'Export';\n return resolvedSheetName.slice(0, MAX_SHEET_NAME_LENGTH);\n}\n\nexport async function exportRowsToExcel<TItem>({\n rows,\n columns,\n fileName,\n sheetName,\n}: ExcelExportOptions<TItem>): Promise<void> {\n const { Workbook } = await import('exceljs');\n const workbook = new Workbook();\n const worksheet = workbook.addWorksheet(normalizeExcelSheetName(sheetName));\n\n worksheet.columns = columns.map((column) => ({ header: column.header, key: column.header }));\n rows.forEach((row) => {\n const worksheetRow: Record<string, ExcelCellValue> = {};\n\n columns.forEach((column) => {\n worksheetRow[column.header] = column.value(row) ?? '';\n });\n\n worksheet.addRow(worksheetRow);\n });\n\n const buffer = await workbook.xlsx.writeBuffer();\n downloadExcelBuffer(buffer, normalizeExcelFileName(fileName));\n}\n\nfunction downloadExcelBuffer(buffer: ArrayBuffer | Uint8Array, fileName: string): void {\n const blob = new Blob([new Uint8Array(buffer)], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n // Append to document.body before clicking — required for Firefox/Safari compatibility\n document.body.appendChild(link);\n link.click();\n // Clean up: remove from DOM and revoke URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import type { OrderHistory, TopPerformingOffer, TopProduct } from '../types.d';\nimport type { ExcelExportColumn } from './excelExport';\nimport { exportRowsToExcel } from './excelExport';\n\nconst topProductColumns: readonly ExcelExportColumn<TopProduct>[] = [\n { header: 'Rank', value: (product) => product.rank },\n { header: 'Product ID', value: (product) => product.id },\n { header: 'Product Name', value: (product) => product.name },\n { header: 'Units Sold', value: (product) => product.unitsSold },\n { header: 'Total Revenue', value: (product) => product.revenue },\n { header: 'Currency', value: (product) => product.currencyCode },\n { header: 'Volume DC-SV', value: (product) => product.volume },\n { header: 'Trend', value: (product) => product.trend?.units ?? product.trend?.revenue ?? product.trend?.volume },\n];\n\nconst topOfferColumns: readonly ExcelExportColumn<TopPerformingOffer>[] = [\n { header: 'Offer ID', value: (offer) => offer.id },\n { header: 'Offer Name', value: (offer) => offer.name },\n { header: 'Total Revenue', value: (offer) => offer.revenue },\n { header: 'Currency', value: (offer) => offer.currencyCode },\n { header: 'Total Volume', value: (offer) => offer.volume ?? offer.units },\n { header: 'Share %', value: (offer) => offer.percentage },\n { header: 'Trend', value: (offer) => offer.trend?.revenue ?? offer.trend?.units },\n];\n\n// Mirrors the Order Details table rendered in the Conversion Rate full view.\nconst conversionOrderColumns: readonly ExcelExportColumn<OrderHistory>[] = [\n { header: 'Order ID', value: (order) => order.orderId },\n { header: 'Date', value: (order) => order.date },\n { header: 'Customer', value: (order) => order.customerName },\n { header: 'Items', value: (order) => order.items },\n { header: 'Total', value: (order) => order.total },\n { header: 'Currency', value: (order) => order.currencyCode },\n { header: 'Total SV', value: (order) => order.bv },\n];\n\nexport function exportTopProducts(rows: readonly TopProduct[]): Promise<void> {\n return exportRowsToExcel({\n rows,\n columns: topProductColumns,\n fileName: 'top-selling-products',\n sheetName: 'Top Selling Products',\n });\n}\n\nexport function exportTopPerformingOffers(offers: readonly TopPerformingOffer[]): Promise<void> {\n return exportRowsToExcel({\n rows: offers,\n columns: topOfferColumns,\n fileName: 'top-performing-offers',\n sheetName: 'Top Performing Offers',\n });\n}\n\nexport function exportConversionRate(orders: readonly OrderHistory[]): Promise<void> {\n return exportRowsToExcel({\n rows: orders,\n columns: conversionOrderColumns,\n fileName: 'conversion-rate-orders',\n sheetName: 'Order Details',\n });\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 { useProductOfferWidgetExports } from './hooks/useProductOfferWidgetExports';\nimport type { ProductOfferDashboardProps, TopProduct, ConversionDataPoint, TopPerformingOffer } from './types.d';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 = DEFAULT_DATE_RANGE,\n market = 'all',\n productSort = 'units',\n conversionFilter = 'all',\n offerSort = 'revenue',\n conversionSummaryRate,\n conversionSummaryChangePct,\n offersSummaryChangePct,\n orders,\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\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 const { onTopProductsExport, onTopOffersExport, onConversionExport } = useProductOfferWidgetExports({\n topProducts: resolvedTopProducts,\n topOffers: resolvedTopOffers,\n orders,\n conversionFilter,\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption,\n showTopOffersExportOption,\n showConversionExportOption,\n isLoading,\n });\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: stats.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 dateRange={dateRange}\n isLoading={isLoading}\n summaryRate={conversionSummaryRate}\n summaryChangePct={conversionSummaryChangePct}\n onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n onExport={onConversionExport}\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 market={market}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onTopProductsExport}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\n market={market}\n summaryChangePct={offersSummaryChangePct}\n onSortChange={onOfferSortChange}\n onTitleClick={onOffersTitleClick}\n onExport={onTopOffersExport}\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 { useScrollToTopOnViewChange } from './hooks/useScrollToTopOnViewChange';\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\nimport { DEFAULT_DATE_RANGE } from './utils/dateConstants';\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 offersSummaryChangePct,\n conversionFullViewData,\n conversionFullViewRate,\n conversionFullViewChangePct,\n topProductsExportData,\n topOffersExportData,\n conversionExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n showConversionExportOption = true,\n initialDateRange = DEFAULT_DATE_RANGE,\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 useScrollToTopOnViewChange(currentView);\n\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 orderColumnsVariant=\"sv\"\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 offersSummaryChangePct={offersSummaryChangePct}\n topProductsExportData={topProductsExportData ?? resolvedAllProducts}\n topOffersExportData={topOffersExportData ?? resolvedAllOffers}\n orders={resolvedOrders}\n conversionExportData={conversionExportData}\n showTopProductsExportOption={showTopProductsExportOption}\n showTopOffersExportOption={showTopOffersExportOption}\n showConversionExportOption={showConversionExportOption}\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, getLocaleFromMarketCode } 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 DesktopTableContainer,\n MobileOffersContainer,\n MobileOfferCard,\n MobileOfferHeader,\n MobileOfferName,\n MobileOfferMetricsGrid,\n MobileOfferMetricItem,\n MobileOfferMetricLabel,\n MobileOfferMetricValue,\n} from './TopPerformingOffersFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { getTrendIcon, resolveTrendDirection, calculateWeightedRevenueTrend } 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.defaults.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.defaults.byRevenue) },\n { value: 'volume', label: getTranslation(Keys.defaults.byVolume) },\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.volume ?? 0) - (a.volume ?? 0);\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalVolume, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n const nextTotalVolume = sortedOffers.reduce((sum, offer) => sum + (offer.volume ?? 0), 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => (offerSort === 'volume' ? (offer.volume ?? 0) : offer.revenue),\n (offer) => (offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue),\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalVolume: nextTotalVolume,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers, offerSort]);\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) =>\n formatMoney(Number(value), row.currencyCode, getLocaleFromMarketCode(market)),\n },\n {\n key: 'volume',\n label: getTranslation(Keys.defaults.volume),\n sortable: true,\n render: (value: unknown) =>\n `${Number(value ?? 0).toLocaleString()} ${getTranslation(Keys.defaults.dcSv)}`,\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.topOffers.columnPercentage),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n ],\n [market],\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={offerSort === 'volume' ? 'volume' : '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\n formatter={(value: number) =>\n offerSort === 'volume'\n ? `${value.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(value, currencyCode, getLocaleFromMarketCode(market))\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {offerSort === 'volume'\n ? getTranslation(Keys.widget.topPerformingOffers.totalVolume)\n : getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>\n {offerSort === 'volume'\n ? `${totalVolume.toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(totalRevenue, currencyCode, getLocaleFromMarketCode(market))}\n </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 summaryTrend = offerSort === 'volume' ? offer.trend?.volume : offer.trend?.revenue;\n const summaryPercentage =\n offerSort === 'volume' ? (offer.volumeSharePct ?? offer.percentage) : offer.percentage;\n const summaryTrendDirection = resolveTrendDirection(summaryTrend);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>\n {offerSort === 'volume'\n ? `${(offer.volume ?? 0).toFixed(1)} ${getTranslation(Keys.defaults.dcSv)}`\n : formatMoney(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{summaryPercentage}%</SummaryPercentage>\n {summaryTrend ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={summaryTrend}>\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 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(\n offer.revenue,\n offer.currencyCode,\n getLocaleFromMarketCode(market),\n )}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.defaults.volume)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {`${Number(offer.volume ?? 0).toLocaleString()} ${getTranslation(\n Keys.defaults.dcSv,\n )}`}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnPercentage)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>{offer.percentage}%</MobileOfferMetricValue>\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 priceTypes: i % 3 === 0 ? ['Retail', 'Member'] : ['Retail'],\n };\n});\n\nexport const mockConversionDataRetail: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n priceTypes: ['Retail'],\n}));\n\nexport const mockConversionDataMember: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n priceTypes: ['Member'],\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 priceType: i % 3 === 0 ? 'Member' : 'Retail',\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 volume: 120.5,\n percentage: 29,\n volumeSharePct: 18,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%', volume: '-2.0%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n volume: 90,\n percentage: 27,\n volumeSharePct: 14,\n color: '#E8915A',\n trend: { revenue: '+3.1%', volume: '+1.4%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n volume: 210.4,\n percentage: 22,\n volumeSharePct: 32,\n color: '#C75B5B',\n trend: { revenue: '-1.5%', volume: '+5.6%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n volume: 60,\n percentage: 16,\n volumeSharePct: 9,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%', volume: '+0.9%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n volume: 180,\n percentage: 6,\n volumeSharePct: 27,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%', volume: '+6.1%' },\n },\n];\n"]}