@nuskin/react-mysite-elements 1.5.0-ui-fixes.10 → 1.5.0-ui-fixes.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/shopping-dashboard/MysiteDashboardWithNavigation.d.ts +1 -0
- package/dist/common/shopping-dashboard/ShoppingDashboard.d.ts +1 -0
- package/dist/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.styled.d.ts +8 -1
- package/dist/common/shopping-dashboard/shared/Signups/SignupsFullView.styled.d.ts +2 -0
- package/dist/common/shopping-dashboard/utils/trendUtils.d.ts +12 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/gitlab-runner-data/builds/nextgen-development/mysite/npm/react-mysite-elements/dist/index.mjs","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../src/common/card/NsProductCard.tsx","../src/common/card/styles/NsProductCard.Styled.tsx","../src/common/carousel/NsProductCarousel.tsx","../src/common/carousel/NsProductCarousel.styled.ts","../src/common/carousel/ProductTabCarousel.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.styled.tsx","../src/common/carousel/ProductTabCarousel.styled.tsx","../src/common/headers/MysiteHero.tsx","../src/common/headers/MysiteHero.styled.tsx","../src/common/icon/icons/PlaceholderImage.tsx","../src/common/icon/icons/ArrowDownIcon.tsx","../src/common/utils/gtmTracking.ts","../src/common/shopping-dashboard/ShoppingDashboard.styled.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.styled.tsx","../src/common/shopping-dashboard/TranslationKeys/translationResolver.ts","../src/common/shopping-dashboard/TranslationKeys/ShoppingDashboardTranslationKeys.ts","../src/common/shopping-dashboard/utils/marketOptions.ts","../src/common/shopping-dashboard/shared/StatsCard.tsx","../src/common/shopping-dashboard/shared/StatsCard.styled.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.tsx","../src/common/shopping-dashboard/utils/trendUtils.tsx","../src/common/shopping-dashboard/utils/dataUtils.ts","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.styled.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.styled.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.styled.tsx","../src/common/shopping-dashboard/utils/dateConstants.ts","../src/common/shopping-dashboard/utils/dateFormat.ts","../src/common/shopping-dashboard/utils/comparisonTextUtils.ts","../src/common/shopping-dashboard/shared/Signups/SignupsChart.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsChart.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.styled.tsx","../src/common/shopping-dashboard/ShoppingDashboard.tsx","../src/common/shopping-dashboard/MysiteDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.tsx","../src/common/shopping-dashboard/shared/PageHeader.tsx","../src/common/shopping-dashboard/shared/PageHeader.styled.tsx","../src/common/shopping-dashboard/shared/DataTable.tsx","../src/common/shopping-dashboard/shared/DataTable.styled.tsx","../src/common/shopping-dashboard/shared/Pagination.tsx","../src/common/shopping-dashboard/shared/Pagination.styled.tsx","../src/common/shopping-dashboard/shared/FullViewComponents.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.styled.tsx","../src/common/shopping-dashboard/shared/useViewport.ts","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.styled.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.styled.tsx","../src/common/shopping-dashboard/TranslationContext.tsx","../src/common/shopping-dashboard/ProductOfferDashboard.styled.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersPieChart.tsx","../src/common/shopping-dashboard/TranslationKeys/ProductOfferDashboardTranslationKeys.ts","../src/common/shopping-dashboard/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":["Fp","Object","create","Cn","defineProperty","Lp","getOwnPropertyDescriptor","Ip","getOwnPropertyNames","Np","getPrototypeOf","$p","prototype","hasOwnProperty","va","e","t","exports","Vp","o","n","i","call","get","enumerable","Ep","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","Kn","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","Jn","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","qn","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","cr","NsCategoryNavigation","itemArray","controlledValue","onChange","Qn","internalValue","setInternalValue","orientation","event","newValue","item","label","categoryId","findIndex","content","NsSpinner","getMinHeight","$hasCategories","ProductTabCarouselContainer","TabsContainer","ContentContainer","LoadingContainer","NoTabsContainer","SpinnerContainer","ProductTabCarousel","fetchCategories","fetchProducts","showCustomCategory","emptyProductTabs","getCategoryId","categories","isLoadingInitialData","setIsLoadingInitialData","setCategories","isCategoriesLoaded","setIsCategoriesLoaded","selectedTab","setSelectedTab","products","setProducts","loading","setLoading","shouldShowSpinner","setShouldShowSpinner","checkForExistingSpinners","existingSpinners","document","querySelectorAll","then","data","finally","cat","_","ProductTabCarousel_default","useMemo","Typography","Tooltip","NsLink","getContactTextStyles","hasWhiteBackground","fontSize","fontStyle","fontWeight","lineHeight","letterSpacing","color","textDecoration","getSocialTitleStyles","textTransform","paddingLeft","getSocialIconsStyles","display","flexDirection","gap","alignItems","getContactTextMobileStyles","paddingBottom","wordBreak","overflowWrap","getSocialTitleMobileStyles","marginBottom","transition","opacity","transform","MysiteHeroContainer","bannerProps","isCircularImage","backgroundClip","background","backgroundColor","position","overflow","willChange","backfaceVisibility","top","left","right","boxShadow","paddingTop","justifyContent","fontFamily","headlineFont","padding","objectFit","objectPosition","marginLeft","marginRight","boxSizing","whiteSpace","textOverflow","paragraphFont","WebkitBoxOrient","WebkitLineClamp","MysiteHeroContainerMobile","paddingRight","maxHeight","bottom","pointerEvents","BadgeContainer","Badge","backdropFilter","borderRadius","border","minHeight","ToggleButtonMobile","cursor","margin","StyledSpan","ImgTabIndex","ContactLink","BadgeValue","PlaceholderImage","sx","ArrowDownIcon","trackGTMEvent","eventData","window","url","href","updatedEventData","prefix","includes","dataLayer","console","error","Fragment","renderImageContent","placeholderClass","renderBadges","showBadges","expirationDate","totalSavings","badgeClass","renderMobileContent","isScrolled","renderSocialMediaIcons","shopTitle","socialTitleText","email","phone","component","trim","renderContactLink","renderDesktopContent","shopDescription","arrow","checkIfImageIsCircular","Promise","resolve","reject","imageContext","Image","crossOrigin","onload","canvas","createElement","context","getContext","drawImage","isCircular","getImageData","every","corner","Array","slice","onerror","isWhiteOrNearWhite","hex","replace","toLowerCase","test","fullHex","split","char","join","r","Number","parseInt","substring","g","b","threshold","createContactClickHandler","contactType","contactValue","contact_type","contact_value","click_element","onKeyDown","key","globalThis","protocol","handlers","MysiteHero","socialIcons","setIsScrolled","isDescriptionExpanded","setIsDescriptionExpanded","setHasWhiteBackground","isImageCircular","setIsImageCircular","toggleDescription","debounceTimeout","lastScrollY","scrollY","currentScrollState","isTransitioning","lastUpdateTime","updateScrollState","newState","now","Date","clearTimeout","setTimeout","scrollTo","behavior","handleScroll","currentScrollY","abs","scrollingDown","scrollDownThreshold","scrollUpThreshold","initializeState","initialScrollY","shouldStartCompact","rafId","lastRafTime","throttledScrollHandler","requestAnimationFrame","addEventListener","passive","removeEventListener","cancelAnimationFrame","icon","social_platform","type","social_url","open","containerClass","getCharacterLimit","innerWidth","shouldShowToggle","DashboardContainer","StatsRow","WidgetContainer","TwoColumnGrid","ErrorContainer","CalendarTodayIcon","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","standard","subscription","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","retail","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","ArrowUpwardIcon","ArrowDownwardIcon","RemoveIcon","parseTrendPercent","cleanedValue","parsedValue","isFinite","resolveTrendDirection","calculateWeightedRevenueTrend","getRevenue","getTrend","reduce","accumulator","weightedSum","weight","average","formatted","toFixed","getTrendDirectionLabel","getTrendIcon","getTrendColor","calculateTotalPages","itemsPerPage","ceil","paginateItems","currentPage","startIndex","endIndex","sortByNumericProperty","sort","a","aVal","bVal","calculatePercentage","decimalPlaces","usePaginatedItems","totalPages","pageItems","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","format","toLocaleString","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","getSubtitle","getTrendValue","getTrendDirection","startsWith","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","CHART_MARGIN","AXIS_TICK","LINE_DOT","ACTIVE_DOT","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionData","conversionFilter","summaryRate","summaryChangePct","onFilterChange","handleFilterChange","newFilter","noDataText","noChangeText","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","stroke","strokeWidth","dot","activeDot","ConversionRateChart","SignupsContainer","Legend","LegendItem","LegendColor","LegendLabel","SERIES_COLORS","SignupsChartComponent","signupData","onViewChange","handleViewChange","newView","totalSignups","lastDataPoint","latestValue","previousValue","totalLabel","membersLabel","retailLabel","brandAffiliatesLabel","SignupsChart","PieChart","Pie","Cell","CategoriesContainer","ChartAndLegendContainer","ChartWrapper","DonutCenterOverlay","DonutCenterLabel","DonutCenterValue","DonutCenterTrend","LegendContainer","LegendInfo","LegendName","LegendValue","LegendPercentage","LegendValueWrapper","LegendTrendInline","LegendTrend","TopCategoriesPieChartComponent","categorySort","sortedCategories","nextSortedCategories","nextTotalRevenue","sum","nextTrendDirection","nextFormattedTrend","totalRevenue","formattedTrend","getTrendGraphIcon","renderCustomLabel","cx","cy","midAngle","innerRadius","outerRadius","percentage","RADIAN","PI","radius","x","cos","y","sin","textAnchor","dominantBaseline","nameKey","paddingAngle","labelLine","formatter","TopCategoriesPieChart","EMPTY_TOP_PRODUCTS","EMPTY_CONVERSION_DATA","EMPTY_SIGNUP_DATA","EMPTY_CATEGORIES","ShoppingDashboard","categoriesSummaryChangePct","onProductSortChange","onSignupViewChange","onConversionFilterChange","onCategorySortChange","onProductsTitleClick","onConversionTitleClick","onSignupsTitleClick","onCategoriesToTitleClick","onProductsExport","onConversionExport","onSignupsExport","onCategoriesExport","resolvedTopProducts","resolvedConversionData","resolvedSignupData","resolvedCategories","metrics","ArrowBackIcon","PageHeaderWrapper","BackButtonWrapper","BackButton","LeftSection","Title","DateRange","MobileDateRange","FilterWrapper","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","options","buildMarketFilter","PageHeader","onBack","filters","renderFilterIcon","iconType","TableContainer","Table","TableHeader","TableHeaderCell","sortable","TableBody","TableRow","TableCell","EmptyTableCell","SortIconContainer","isActive","DataTable","onSort","sortColumn","sortDirection","getRowKey","handleSort","columnKey","handleKeyDown","getAriaSort","column","scope","colSpan","row","rowIndex","render","ChevronLeftIcon","ChevronRightIcon","PaginationContainer","PageButton","PageInfo","NavButton","Pagination","onPageChange","totalItems","handlePrevious","handleNext","action","pageNumbers","from","pages","startItem","endItem","goToPageLabel","page","PageContainer","MetricChartCardSection","shadows","MetricSection","palette","primary","success","main","secondary","ComparisonText","ChartSection","TableSection","withCard","MobileCardName","MobileCardSubtext","MobileCardDetail","MobileCardStatus","warning","ProductSku","MobileCardsContainer","DesktopTableContainer","MobileProductCard","divider","MobileCardHeader","MobileProductRank","MobileProductDetails","MobileProductName","MobileProductSku","MobileMetricsGrid","MobileMetricItem","MobileMetricLabel","MobileMetricValue","MOBILE_VIEWPORT_QUERY","useIsMobileViewport","noSsr","mapProductToRow","sku","padStart","ProductsFullView","setCurrentPage","setSortColumn","setSortDirection","isMobileView","handleBack","productRows","sortedRows","paginatedRows","ConversionTrendChartContainer","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ChartWithLegendWrapper","ChartLegendContainer","ComparisonTextMobile","OrderIdColumnCell","ConversionRateFullView","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","customerType","paginatedOrders","getChartColor","flexWrap","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","NameColumnCell","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","point","rawPoint","signupTotal","absoluteChange","first","last","round","hasSignupTrendData","paginatedSignups","connectNulls","signup","muiStyled","SummaryItemRow","SummaryItemInfo","SummaryItemName","SummaryItemSubtext","SummaryItemPercentage","TopSection","SummaryContainer","SummaryItem","ColorDot","dotColor","SummaryInfo","SummaryName","SummaryValue","SummaryPercentage","MobileCategoriesContainer","MobileCategoryCard","SummaryTrendIcon","CategoryNameColumnCell","CategoriesFullView","parseFloat","isNaN","totalRevenueTrendDirection","totalRevenueTrend","paginatedCategories","useTranslationResolver","translate","TranslationProvider","useTranslation","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","initialDateRange","initialMarket","initialProductSort","initialSignupView","initialConversionFilter","initialCategorySort","historyAdapter","historyStateKey","resetToDashboardOnMount","currentView","setCurrentView","hasIntraDashboardHistoryRef","setDateRange","setMarket","setProductSort","setSignupView","setConversionFilter","setCategorySort","resolvedOrders","resolvedSignups","updateView","readCurrentView","writeCurrentView","mode","nextState","nextLocation","replaceState","pushState","listen","nextView","handlePopState","handleOpenFullView","goBack","back","nextDateRange","nextMarket","handleProductSortChange","nextProductSort","handleSignupViewChange","nextSignupView","handleConversionFilterChange","nextFilter","handleCategorySortChange","nextSort","handleProductsTitleClick","handleConversionTitleClick","handleSignupsTitleClick","handleCategoriesTitleClick","PoDashboardContainer","TopChartsRow","StatsCardStack","BottomChartsRow","ProductOfferDashboardTranslationKeys","offersPurchased","trendUp","trendDown","trendNeutral","comparedTo","offerSort","overall","emptyState","topPerformingOffers","statsCard","conversionChart","topOffers","widgetMenu","filterDateRange","filterMarket","backButton","columnName","columnRevenue","columnPercentage","columnTrend","trendZero","TopPerformingOffersPieChartComponent","offers","sortedOffers","nextSortedOffers","offer","legendTrendDirection","TopPerformingOffersPieChart","INVALID_SHEET_NAME_CHARS","normalizeExcelFileName","fileName","trimmedFileName","resolvedFileName","endsWith","normalizeExcelSheetName","sheetName","normalizedSheetName","exportRowsToExcel","rows","Workbook","workbook","worksheet","buffer","addWorksheet","header","forEach","worksheetRow","addRow","xlsx","writeBuffer","downloadExcelBuffer","blob","Blob","Uint8Array","URL","createObjectURL","link","download","click","revokeObjectURL","topProductColumns","topOfferColumns","exportTopProducts","exportTopPerformingOffers","useProductOfferWidgetExports","topProductsExportData","topOffersExportData","showTopProductsExportOption","showTopOffersExportOption","offerRows","canExportProducts","canExportOffers","onTopProductsExport","onTopOffersExport","EMPTY_TOP_OFFERS","ProductOfferDashboard","dashboardTitle","conversionSummaryRate","conversionSummaryChangePct","onOfferSortChange","onOffersTitleClick","resolvedTopOffers","selectedMarket","SummaryTrend","TableTrendCell","MobileOffersContainer","MobileOfferCard","MobileOfferHeader","MobileOfferName","MobileOfferMetricsGrid","MobileOfferMetricItem","MobileOfferMetricLabel","MobileOfferMetricValue","MobileOfferTrendValue","TopPerformingOffersFullView","paginatedOffers","columnTrendDirection","summaryTrendDirection","trendPercent","isProductOfferDashboardView","PoDashboardWithNavigation","allProducts","allOffers","conversionFullViewData","conversionFullViewRate","conversionFullViewChangePct","initialOfferSort","setOfferSort","resolvedAllProducts","resolvedAllOffers","handleOfferSortChange","handleOffersTitleClick","FilterContainer","FilterBar","mockStats","mockTopProducts","mockConversionData","setDate","mockConversionDataStandard","mockConversionDataSubscription","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","nn","bo","or","Xl","ql","Ko","it","Of","Xg","ki","Sa","Ta","fe","st","Rf","pr","ProductCarousel","un","I","nc","er","qa","Sr","rn","Dt","Wr","mn","sa","xo","Hg","rt","$i","_c","hl","da","pn","dn","es","lu","ja","Ya","Ql","Pt","Ga","iu","wc","Hc","ot","Mp","ir","yn","Ro","Rp","Op","Pp","Nf","bn","Xd","Qd","xl","Vi","Be","Uo","Wc","cn","Wg","Do"],"mappings":"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","sourcesContent":["var Fp=Object.create;var Cn=Object.defineProperty;var Lp=Object.getOwnPropertyDescriptor;var Ip=Object.getOwnPropertyNames;var Np=Object.getPrototypeOf,$p=Object.prototype.hasOwnProperty;var va=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vp=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of Ip(t))!$p.call(e,i)&&i!==o&&Cn(e,i,{get:()=>t[i],enumerable:!(n=Lp(t,i))||n.enumerable});return e};var Ep=(e,t,o)=>(o=e!=null?Fp(Np(e)):{},Vp(t||!e||!e.__esModule?Cn(o,\"default\",{value:e,enumerable:!0}):o,e));var Kn=va((mm,Un)=>{\"use strict\";var jp=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";Un.exports=jp});var Jn=va((hm,Yn)=>{\"use strict\";var Yp=Kn();function Gn(){}function jn(){}jn.resetWarningCache=Gn;Yn.exports=function(){function e(n,i,s,l,p,g){if(g!==Yp){var x=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 x.name=\"Invariant Violation\",x}}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:jn,resetWarningCache:Gn};return o.PropTypes=o,o}});var qn=va((ym,Zn)=>{\"use strict\";Zn.exports=Jn()();var xm,bm});import{useState as Ap}from\"react\";import{NsImage as zp}from\"@nuskin/foundation-ui-components\";import{styled as Nt}from\"@nuskin/foundation-theme\";var vn=Nt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,kn=Nt(\"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`,Tn=Nt(\"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`,Sn=Nt(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,Dn=Nt(\"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`,ka=Nt(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,Pn=Nt(\"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`,Rn=Nt(\"span\")`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${e=>e.disabled?.5:1};\n`;import{useMediaQuery as Bp}from\"@mui/material\";import{jsx as gt,jsxs as Mn}from\"react/jsx-runtime\";var Hp=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:s,directSellerBadge:l,mySitePriceComponent:p,testId:g})=>{let[x,u]=Ap(!1),y=Bp(\"(max-width: 560px)\"),h=f=>{let T=f.target,P=t?.fallbackImage;P&&T.src!==P&&(T.src=P)};return Mn(kn,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:y,children:[gt(Tn,{bgColor:t?.bgColor,onError:h,children:t?.imageSrc?gt(zp,{\"data-testid\":g??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):gt(Sn,{alt:\"\"})}),gt(Dn,{title:e,\"data-testid\":\"product-title\",children:e}),l&>(ka,{children:l}),gt(ka,{children:s}),gt(vn,{children:p}),n?.showButton&&Mn(Pn,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:y,isHovered:x,onClick:f=>{f.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!y&&!n?.disabled&&u(!0)},onMouseLeave:()=>{y||u(!1)},children:[gt(Rn,{className:\"cart-icon\",disabled:n?.disabled,children:gt(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:gt(\"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\"]})]})},Ta=Hp;import{useCallback as _n,useRef as _p}from\"react\";import Up from\"react-slick\";import Kp from\"@mui/material/useMediaQuery\";import{NsCarouselControl as Gp}from\"@nuskin/foundation-ui-components\";import{styled as Ie}from\"@nuskin/foundation-theme\";import Bo from\"@mui/material/Box\";import{NsTypography as Wp}from\"@nuskin/foundation-ui-components\";var On=Ie(Bo)`\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`,Fn=Ie(\"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`,Ln=Ie(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,In=Ie(Bo)`\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`,Nn=Ie(Bo)`\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`,$n=Ie(Bo)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`,Vn=Ie(Bo)`\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`,em=Ie(\"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`,En=Ie(Wp)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`,An=Ie(\"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`,zn=Ie(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,Bn=Ie(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Hn=Ie(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,Wn=Ie(\"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 et,jsxs as Ho}from\"react/jsx-runtime\";function pr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:s=\"\",categoryName:l,emptyProductMessage:p=\"No Products Available For The Selected Category\",productsCountLabel:g=\"Products\",isInitialDataLoading:x,history:u}){let y=_p(null),h=Kp(\"(max-width: 560px)\"),f=_n(()=>{y.current?.slickPrev()},[]),T=_n(()=>{y.current?.slickNext()},[]),P=t??((k,S)=>et(Ta,{productTitle:k.productTitle,imageDetails:k.imageDetails,button:k.button,onCardClick:k.onCardClick,productStatusBadge:k.productStatusBadge,directSellerBadge:k.directSeller,mySitePriceComponent:k.mySitePriceComponent},`${k.productTitle}-${S}`)),d={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},b=(e?.length??0)>d.slidesToShow,w=()=>e?.length===0&&!x?et(zn,{children:p}):h?et(Fn,{children:et(Ln,{children:e.map((k,S)=>k&&P(k,S))})}):et(Up,{...d,ref:y,children:e.map((k,S)=>k&&P(k,S))});return Ho(On,{children:[n&&Ho(In,{children:[Ho(Bn,{children:[Ho(Hn,{children:[et($n,{children:Ho(En,{variant:\"body-m\",children:[e?.length??0,\" \",g]})}),!h&&l&&et(Wn,{children:l})]}),et(Nn,{$isMobile:h,children:et(An,{$disabled:(e?.length??0)===0,onClick:k=>{k.preventDefault(),(e?.length??0)>0&&u&&u.push(s)},children:i})})]}),!h&&et(Vn,{$isDisabled:!b,children:et(Gp,{prev:f,next:T,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),w()]})}import{useState as Qt,useEffect as Da,useCallback as tc}from\"react\";import{useMediaQuery as oc}from\"@mui/material\";var cr=Ep(qn());import*as Qn from\"react\";import Zp from\"@mui/material/Tabs\";import qp from\"@mui/material/Tab\";import ei from\"@mui/material/Box\";import{styled as Jp}from\"@nuskin/foundation-theme\";var Xn=Jp.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 Xp}from\"@mui/material\";import{jsx as go,jsxs as Qp}from\"react/jsx-runtime\";function ti(e){let{children:t,value:o,index:n,...i}=e;return go(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&go(ei,{className:\"tabPanel\",children:t})})}ti.propTypes={children:cr.default.node,index:cr.default.number.isRequired,value:cr.default.number.isRequired};var Sa=({itemArray:e,value:t,onChange:o})=>{let[n,i]=Qn.useState(0),s=Xp(\"(max-width:768px)\"),l=t??n;return go(Xn,{children:Qp(ei,{className:\"tabContainer\",children:[go(Zp,{orientation:s?\"horizontal\":\"vertical\",variant:\"scrollable\",value:l,onChange:(g,x)=>{o?o(g,x):i(x)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(g=>go(qp,{label:g.label,className:\"tabStyle\"},g.categoryId))}),e.map(g=>go(ti,{value:l,index:e.findIndex(x=>x.categoryId===g.categoryId),children:g.content},g.categoryId))]})})};import{NsSpinner as rc}from\"@nuskin/foundation-ui-components\";import{styled as fo}from\"@nuskin/foundation-theme\";var ec=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",oi=fo(\"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: ${ec};\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`,ri=fo(\"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`,ai=fo(\"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`,Lm=fo(\"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`,ni=fo(\"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`,ii=fo(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as eo,jsxs as ic}from\"react/jsx-runtime\";var ac=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:s,fetchProducts:l,showCustomCategory:p=!1,emptyProductTabs:g=\"No tabs available\",emptyProductMessage:x,productsCountLabel:u,getCategoryId:y,history:h})=>{let f=oc(\"(max-width:768px)\"),[T,P]=Qt(!0),[d,b]=Qt([]),[w,k]=Qt(!1),[S,M]=Qt(0),[F,A]=Qt([]),[E,B]=Qt(!1),[R,c]=Qt(!0),v=tc(()=>{let m=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');c(m.length===0)},[]);Da(()=>{E&&v()},[E,v]),Da(()=>{s().then(m=>{b(m),k(!0)})},[s]),Da(()=>{if(w)if(d.length>0){let m=d[S]?.categoryId;y&&y(m),B(!0),l(m).then(A).finally(()=>{B(!1),P(!1)})}else B(!1)},[d,S,l,w]);let D=d.map(m=>({label:m.label,content:\"\",categoryId:m.categoryId}));return ic(oi,{isMobile:f,$hasCategories:d.length>0,children:[p&&(D.length>0?eo(ri,{isMobile:f,children:eo(Sa,{itemArray:D,value:S,onChange:(m,C)=>M(C)})}):eo(ni,{children:g})),eo(ai,{isMobile:f,children:E?eo(ii,{children:R&&eo(rc,{})}):eo(pr,{isInitialDataLoading:T,entries:F,allEntryLabel:e,allEntryLink:t,renderEntry:o?m=>o({...m,productStatusBadge:m.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:d[S]?.label,emptyProductMessage:x,productsCountLabel:u,history:h})})]})},nc=ac;import{useState as gr,useEffect as Fa,useMemo as pc}from\"react\";import{Typography as $t,Box as Vt,useMediaQuery as cc,Tooltip as uc}from\"@mui/material\";import{NsLink as gc,NsImage as Ci}from\"@nuskin/foundation-ui-components\";import{styled as Tt}from\"@nuskin/foundation-theme\";import{Box as Wo}from\"@mui/material\";import{jsx as Oa}from\"react/jsx-runtime\";var Pa=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),si=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),di=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),li=e=>({...Pa(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\"}}),lc=e=>({...si(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\"}}),pi=Tt(e=>Oa(Wo,{...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\":Pa(o),\".phone-text\":Pa(o),\".social-title-text\":{...si(o),marginBottom:\"8px\"},\".social-icons\":{...di(),paddingBottom:\"8px\"}})),ci=Tt(e=>Oa(Wo,{...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\":li(o),\".phone-text-mobile\":li(o),\".social-title-text-mobile\":lc(o),\".social-icons-mobile\":{...di(),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\"}}})),ui=Tt(Wo)({display:\"flex\",gap:\"12px\",marginBottom:\"16px\",paddingLeft:\"5px\",\"&.mobile-badges\":{flexDirection:\"column\",gap:\"8px\",marginBottom:\"12px\"},\"&.tablet-badges\":{flexDirection:\"row\",gap:\"12px\",marginBottom:\"8px\"}}),Ra=Tt(e=>Oa(Wo,{...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\"}})),gi=Tt(\"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)\"}}}),fi=Tt(Wo)`\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`,mi=Tt(\"span\")`\n line-height: 0.5;\n`,hi=Tt(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),Ma=Tt(\"span\")({});import{Box as sc}from\"@mui/material\";import{jsx as to,jsxs as dc}from\"react/jsx-runtime\";var xi=({width:e,height:t,backgroundColor:o})=>to(sc,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:to(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:dc(\"g\",{id:\"ns_logomark\",children:[to(\"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\"}),to(\"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\"}),to(\"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\"}),to(\"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\"}),to(\"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 bi}from\"react/jsx-runtime\";var yi=({width:e=16,height:t=16,className:o=\"\"})=>bi(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:bi(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function ur(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 Ti,jsx as X,jsxs as tt}from\"react/jsx-runtime\";var wi=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?X(mi,{tabIndex:0,children:X(Ci,{className:o,src:e.imageSrc,alt:e.imageAlt})}):X(Vt,{className:n,children:X(xi,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},vi=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let s=o?\"mobile-badge\":\"tablet-badge\";return tt(ui,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&X(Ra,{className:`${s} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:X(Ma,{className:\"badge-value\",children:i})}),t&&X(Ra,{className:`${s} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:X(Ma,{className:\"badge-value\",children:t})})]})},fc=(e,t,o,n,i)=>{let{shopTitle:s,socialTitleText:l,email:p,showBadges:g,expirationDate:x,phone:u,totalSavings:y}=e;return tt(Vt,{className:\"content-mobile\",children:[X($t,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title-mobile\",children:s}),!t&&tt(Ti,{children:[X($t,{tabIndex:l?.trim()?0:-1,className:\"social-title-text-mobile\",children:l}),p?.trim()&&fr(\"email\",p,\"email-text-mobile\"),u?.trim()&&fr(\"phone\",u,\"phone-text-mobile\"),X(Vt,{className:\"social-icons-mobile\",children:o}),vi(g,x??\"\",n,i,y)]})]})},mc=(e,t,o,n,i)=>{let{shopTitle:s,shopDescription:l,socialTitleText:p,email:g,phone:x,showBadges:u,expirationDate:y,totalSavings:h}=e;return tt(Vt,{className:\"content\",children:[X($t,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title\",children:s}),!t&&tt(Ti,{children:[l?.length>480?X(uc,{title:l,arrow:!0,children:X($t,{tabIndex:l?.trim()?0:-1,className:\"body-text\",children:l})}):X($t,{tabIndex:l?.trim()?0:-1,className:\"body-text\",children:l}),tt(Vt,{className:\"social-media\",children:[X($t,{tabIndex:p?.trim()?0:-1,className:\"social-title-text\",children:p}),tt(Vt,{className:\"social-icons\",children:[o,g?.trim()&&fr(\"email\",g,\"email-text\"),x?.trim()&&fr(\"phone\",x,\"phone-text\")]})]}),vi(u,y??\"\",n,i,h)]})]})},hc=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),s=i.getContext(\"2d\");if(!s)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,s.drawImage(n,0,0);let p=[s.getImageData(0,0,1,1).data,s.getImageData(n.width-1,0,1,1).data,s.getImageData(0,n.height-1,1,1).data,s.getImageData(n.width-1,n.height-1,1,1).data].every(g=>Array.prototype.slice.call(g)[3]<10);t(p)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),xc=e=>{if(!e)return!1;let t=e.replace(\"#\",\"\").toLowerCase();if(!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(t))return!1;let o=t;(t.length===3||t.length===4)&&(o=t.split(\"\").map(p=>p+p).join(\"\"));let n=Number.parseInt(o.substring(0,2),16),i=Number.parseInt(o.substring(2,4),16),s=Number.parseInt(o.substring(4,6),16),l=220;return n>=l&&i>=l&&s>=l},bc=(e,t)=>({onClick:()=>{ur({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),ur({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),fr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=bc(e,t);return X($t,{className:o,children:X(hi,{href:`${n}${t}`,...i,children:t})})};function ki({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:s,phone:l,bannerProps:p,socialIcons:g,expirationDate:x,showBadges:u=!1,totalSavings:y}){let h=cc(\"(max-width: 560px)\"),[f,T]=gr(!1),[P,d]=gr(!1),[b,w]=gr(!1),[k,S]=gr(!1),M=()=>{d(!P)};Fa(()=>{(async()=>{if(i?.imageSrc){let v=await hc(i.imageSrc);S(v)}else S(!1)})()},[i?.imageSrc]),Fa(()=>{w(xc(p?.backgroundColor))},[p?.backgroundColor]),Fa(()=>{let c,v=window.scrollY,D=!1,m=!1,C=0,O=j=>{let me=Date.now();if(D!==j&&!m){if(me-C<100)return;m=!0,D=j,C=me,j&&d(!1),clearTimeout(c),T(j),c=setTimeout(()=>{m=!1,j&&window.scrollY<15&&window.scrollTo({top:h?20:30,behavior:\"smooth\"})},300)}},ae=()=>{let j=window.scrollY;if(m){v=j;return}if(Math.abs(j-v)<.5)return;let qe=j>v,Xe=h?15:25,Mo=h?8:12;qe&&j>Xe&&!D?O(!0):!qe&&j<Mo&&D&&O(!1),v=j},U=()=>{let j=window.scrollY,qe=j>(h?5:10);D=qe,T(qe),v=j,C=Date.now()},de=null,Z=0,Ue=()=>{de||Date.now()-Z<16||(de=requestAnimationFrame(()=>{ae(),Z=Date.now(),de=null}))};return U(),window.addEventListener(\"scroll\",Ue,{passive:!0}),()=>{window.removeEventListener(\"scroll\",Ue),de&&cancelAnimationFrame(de),clearTimeout(c)}},[h]);let F=pc(()=>g?.map((c,v)=>X(fi,{onClick:m=>{m.preventDefault(),ur({event:\"social_click\",social_platform:c.type,social_url:c.url,click_element:\"social_icon\"}),window.open(c.url,\"_blank\")},children:X(gc,{href:c.url,target:\"_blank\",children:X(Ci,{src:`https://www.google.com/s2/favicons?domain=${c?.url}&sz=24`,alt:`${c.type} icon`,width:\"24\",height:\"24\"},c?.type+v)})},c?.type+v)),[g]),A=`${e} ${f?\"scrolled\":\"\"}`,E={shopTitle:t,shopDescription:o,socialTitleText:n,email:s,phone:l,showBadges:u,expirationDate:x,totalSavings:y},B=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,R=h&&o&&o.length>B();return h?tt(ci,{className:A,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:k,hasWhiteBackground:b,children:[tt(Vt,{className:\"image-content-mobile\",children:[wi(i,p??{},\"bg-image-mobile\"),fc(E,f,F,h,b)]}),!f&&tt(Vt,{className:\"expandable-description-mobile\",children:[X($t,{className:`description-content-mobile ${P||!R?\"expanded\":\"collapsed\"}`,children:o}),R&&X(gi,{onClick:M,children:X(yi,{width:16,height:16,className:`arrow-icon-mobile ${P?\"expanded\":\"\"}`})})]})]}):tt(pi,{className:A,\"data-testid\":\"my-site-shop-header\",bannerProps:p,isCircularImage:k,hasWhiteBackground:b,children:[wi(i,p??{},\"bg-image\"),mc(E,f,F,h,b)]})}import{styled as _o}from\"@nuskin/foundation-theme\";var La=_o(\"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`,Si=_o(\"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`,Di=_o(\"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`,Ia=_o(\"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`,Pi=_o(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import vc from\"@mui/icons-material/CalendarToday\";import kc from\"@mui/icons-material/Language\";import{NsSpinner as Tc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as yc,styled as Ke}from\"@nuskin/foundation-theme\";var{getGenomeColor:Et}=yc,Ri=Ke(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 16px;\n background-color: ${({theme:e})=>Et(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`,Mi=Ke(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,Oi=Ke(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Et(e,\"N100\")};\n margin: 0;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n\n @media (min-width: 1080px) {\n font-size: 16px;\n }\n`,Fi=Ke(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Et(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Li=Ke(\"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`,Na=Ke(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,$a=Ke(\"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`,Va=Ke(\"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})=>Et(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})=>Et(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>Et(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>Et(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`,Ea=Ke(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>Et(e,\"N70\")};\n\n svg {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n`,Ii=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n overflow: hidden;\n\n svg,\n img,\n > * {\n width: 28px !important;\n height: 28px !important;\n max-width: 28px;\n max-height: 28px;\n }\n`,Ni=Ke(\"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`,wh=Ke(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var mr;function Uo(e){mr=e}function wc(){return mr}function Be(e){if(!mr)return e.fallback;let t;try{t=mr(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:{standard:{key:\"shoppingDashboard.filter.conversionType.standard\",fallback:\"Standard\"},subscription:{key:\"shoppingDashboard.filter.conversionType.subscription\",fallback:\"Subscription\"}}},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 Be(e)}import{useMemo as Cc}from\"react\";function $i(){return[{value:\"all\",label:a(r.filter.market.all)}]}function Vi(e){return e&&e.length>0?e:$i()}function Ge(e){return Cc(()=>Vi(e),[e])}import{jsx as ve,jsxs as mo}from\"react/jsx-runtime\";var Ko=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:s,markets:l,onDateRangeChange:p,onMarketChange:g})=>{let x=Ge(l),u=T=>{let P=T.target.value;p?.(P)},y=T=>{let P=T.target.value;g?.(P)},h=T=>{T.key===\"Escape\"&&T.target.blur()},f=()=>n||(s?.dateRange?s.dateRange.label:a(r.filter.dateRange.last30days));return mo(Ri,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[mo(Mi,{children:[ve(Oi,{\"data-testid\":\"dashboard-shop-title\",children:e??s?.shopTitle??a(r.title)}),ve(Fi,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:f()})]}),ve(Li,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:mo(Ni,{children:[i&&ve(Ii,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:ve(Tc,{})}),mo(Na,{children:[ve($a,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRange.label)}),ve(Ea,{\"aria-hidden\":\"true\",children:ve(vc,{})}),mo(Va,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:u,onKeyDown:h,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[ve(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),ve(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),ve(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),ve(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),mo(Na,{children:[ve($a,{htmlFor:\"filter-market\",children:a(r.filter.market.label)}),ve(Ea,{\"aria-hidden\":\"true\",children:ve(kc,{})}),ve(Va,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:y,onKeyDown:h,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${x.find(T=>T.value===o)?.label??String(o)}`,children:x.map(T=>ve(\"option\",{value:T.value,children:T.label},T.value))})]})]})})]})};import Ic from\"react\";import Nc from\"@mui/icons-material/ShowChart\";import $c from\"@mui/icons-material/TrendingUp\";import Vc from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Sc,styled as Me}from\"@nuskin/foundation-theme\";var{getGenomeColor:St}=Sc,hr=Me(\"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})=>St(e,\"N20\")};\n border: 1px solid ${({theme:e})=>St(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`,Ei=Me(\"div\")`\n width: 100%;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>St(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n`,Ai=Me(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,zi=Me(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,Bi=Me(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#066100\":t===\"down\"?\"#9b131a\":St(e,\"N70\")};\n\n svg {\n width: 24px;\n height: 24px;\n }\n`,Hi=Me(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n letter-spacing: 0.12px;\n text-align: right;\n color: ${({theme:e})=>St(e,\"N70\")};\n`,Wi=Me(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.2;\n letter-spacing: 0;\n color: ${({theme:e})=>St(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`,_i=Me(\"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`,Aa=Me(\"div\")`\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>St(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`,Ui=Me(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,Ki=Me(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 1;\n color: ${({theme:e})=>St(e,\"N70\")};\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,Gi=Me(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n flex-shrink: 0;\n color: ${({theme:e,direction:t})=>t===\"up\"?\"#22C55E\":t===\"down\"?\"#DC2626\":St(e,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n }\n\n @media (min-width: 768px) {\n font-size: 14px;\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n`,Eh=Me(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,za=Me(\"span\")`\n white-space: nowrap;\n`,ji=Me(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import J from\"@mui/material/Skeleton\";import{styled as K}from\"@nuskin/foundation-theme\";import Go from\"@mui/material/Skeleton\";var xr=K(\"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`,br=K(\"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`,Yi=K(\"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`,Ji=K(\"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`,Zi=K(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,qi=K(\"div\")`\n margin-top: 8px;\n`,Xi=K(Go)`\n margin-top: 4px;\n`,Qi=K(\"div\")`\n flex: 1;\n min-width: 0;\n`,el=K(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,tl=K(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,ol=K(\"div\")`\n padding-top: 4px;\n`,rl=K(Go)`\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`,al=K(\"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`,nl=K(Go)`\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`,il=K(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,ll=K(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,sl=K(\"div\")`\n flex: 1;\n`,Dc=K(\"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`,Pc=K(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,Rc=K(\"div\")`\n display: flex;\n gap: 16px;\n`,Mc=K(\"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`,Oc=K(\"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`,Ba=K(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,dl=K(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,pl=K(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,cl=K(Go)`\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`,Ha=K(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,yr=K(Go)`\n border-radius: 4px;\n`,ul=K(\"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 N,jsxs as Q}from\"react/jsx-runtime\";var jo=()=>Q(Ji,{\"data-testid\":\"skeleton-stats-card\",children:[Q(Zi,{children:[N(J,{variant:\"text\",width:80,height:18}),N(J,{variant:\"text\",width:48,height:16})]}),Q(qi,{children:[N(J,{variant:\"text\",width:120,height:36}),N(Xi,{variant:\"text\",width:100,height:16})]})]}),Fc=()=>Q(Yi,{children:[N(J,{variant:\"rounded\",width:28,height:28}),N(J,{variant:\"rounded\",width:50,height:50}),Q(Qi,{children:[N(J,{variant:\"text\",width:\"70%\",height:18}),N(J,{variant:\"text\",width:\"50%\",height:14})]}),Q(el,{children:[N(J,{variant:\"text\",width:80,height:18}),N(J,{variant:\"text\",width:48,height:14})]})]}),gl=()=>Q(xr,{\"data-testid\":\"skeleton-products-list\",children:[Q(br,{children:[N(J,{variant:\"text\",width:160,height:22}),N(J,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>N(Fc,{},e))]}),wr=()=>Q(xr,{\"data-testid\":\"skeleton-chart-widget\",children:[Q(br,{children:[N(J,{variant:\"text\",width:140,height:22}),N(J,{variant:\"rounded\",width:110,height:32})]}),Q(tl,{children:[N(J,{variant:\"text\",width:100,height:36}),Q(ol,{children:[N(J,{variant:\"text\",width:60,height:18}),N(J,{variant:\"text\",width:140,height:14})]})]}),N(rl,{variant:\"rounded\",width:\"100%\"})]}),Lc=()=>Q(ll,{children:[N(J,{variant:\"circular\",width:12,height:12}),Q(sl,{children:[N(J,{variant:\"text\",width:\"60%\",height:16}),N(J,{variant:\"text\",width:\"40%\",height:14})]}),N(J,{variant:\"text\",width:36,height:18})]}),Cr=()=>Q(xr,{\"data-testid\":\"skeleton-categories-pie\",children:[Q(br,{children:[N(J,{variant:\"text\",width:140,height:22}),N(J,{variant:\"rounded\",width:100,height:32})]}),Q(al,{children:[N(nl,{variant:\"circular\"}),N(il,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>N(Lc,{},e))})]})]});var At=()=>Q(Ba,{\"data-testid\":\"skeleton-fullview-chart\",children:[Q(dl,{children:[Q(pl,{children:[N(J,{variant:\"text\",width:140,height:52}),N(J,{variant:\"text\",width:80,height:24}),N(J,{variant:\"text\",width:160,height:16})]}),N(cl,{variant:\"rounded\",width:\"100%\"})]}),Q(Ha,{children:[N(J,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>N(yr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),fl=()=>Q(Ba,{\"data-testid\":\"skeleton-fullview-table\",children:[Q(ul,{children:[N(jo,{}),N(jo,{}),N(jo,{})]}),Q(Ha,{children:[N(J,{variant:\"text\",width:200,height:24}),N(yr,{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=>N(yr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as Ne,jsxs as zt}from\"react/jsx-runtime\";var Ec=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:s=\"neutral\",trendValue:l,testId:p,isLoading:g=!1})=>{if(g)return Ne(hr,{$layout:i,\"data-testid\":p,children:Ne(jo,{})});let x=()=>{let y=a(r.stats.trend.unchanged);return s===\"up\"?y=a(r.stats.trend.increased):s===\"down\"&&(y=a(r.stats.trend.decreased)),`${e} ${y} ${l??\"\"}`},u=y=>s===\"up\"?Ne($c,{sx:{fontSize:y},\"aria-hidden\":\"true\"}):s===\"down\"?Ne(Vc,{sx:{fontSize:y},\"aria-hidden\":\"true\"}):Ne(Nc,{sx:{fontSize:y},\"aria-hidden\":\"true\"});return i===\"split\"?zt(hr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Ne(Ei,{id:`stats-title-${p}`,children:e}),zt(Ai,{children:[Ne(Aa,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),(l??n)&&zt(zi,{children:[l&&zt(Bi,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":x(),\"data-testid\":`stats-trend-${p}`,children:[u(\"18px\"),Ne(za,{children:l})]}),n&&Ne(Hi,{\"data-testid\":`stats-caption-${p}`,children:n})]})]})]}):zt(hr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":p,children:[Ne(ji,{children:Ne(Wi,{id:`stats-title-${p}`,children:e})}),zt(_i,{children:[zt(Ui,{children:[Ne(Aa,{\"aria-describedby\":`stats-title-${p}`,\"data-testid\":`stats-value-${p}`,children:t}),o&&Ne(Ki,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${p}`,children:o})]}),l&&zt(Gi,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":x(),\"data-testid\":`stats-trend-${p}`,children:[u(\"16px\"),Ne(za,{children:l})]})]})]})},Dt=Ic.memo(Ec);Dt.displayName=\"StatsCard\";import Qc from\"react\";import eu from\"@mui/icons-material/ShoppingCart\";import tu from\"@mui/icons-material/ShowChart\";import ou from\"@mui/icons-material/TrendingUp\";import ru from\"@mui/icons-material/TrendingDown\";import Ac from\"@mui/icons-material/ArrowUpward\";import zc from\"@mui/icons-material/ArrowDownward\";import Bc from\"@mui/icons-material/Remove\";import{jsx as Wa}from\"react/jsx-runtime\";function ft(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function Bt(e){let t=ft(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function Ht(e,t,o){let{weightedSum:n,weight:i}=e.reduce((p,g)=>{let x=ft(o(g));return x===null?p:{weightedSum:p.weightedSum+x*t(g),weight:p.weight+t(g)}},{weightedSum:0,weight:0}),s=i>0?n/i:0,l=\"neutral\";return s>0?l=\"up\":s<0&&(l=\"down\"),{direction:l,formatted:`${s>0?\"+\":\"\"}${s.toFixed(1)}%`}}function ho(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function ot(e){switch(e){case\"up\":return Wa(Ac,{});case\"down\":return Wa(zc,{});case\"neutral\":default:return Wa(Bc,{})}}function Hc(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}import{useMemo as ml}from\"react\";function hl(e,t){return Math.ceil(e.length/t)}function xl(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function Wc(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let s=n[t],l=i[t];return o===\"asc\"?s-l:l-s})}function _c(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function mt(e,t,o){let n=ml(()=>hl(e,o),[e,o]),i=ml(()=>xl(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function _(e,t,o=\"en-US\",n){let i=Number.isFinite(e)?e:0;if(t)try{return new Intl.NumberFormat(o,{style:\"currency\",currency:t,...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return n!==void 0?`$${i.toFixed(n)}`:`$${i.toLocaleString()}`}function Yo(e){return!e||e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function Wt(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 Uc,styled as he}from\"@nuskin/foundation-theme\";var{getGenomeColor:ee}=Uc,vr=he(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ee(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ee(e,\"N30\")};\n border-radius: 12px;\n min-height: 320px;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n\n @media (min-width: 768px) {\n padding: 20px;\n min-height: 400px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,_a=he(\"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`,bl=he(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ua=he(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ee(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})=>ee(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`,yl=he(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ee(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ee(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ee(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ee(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>ee(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ee(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,wl=he(\"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`,Cl=he(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>ee(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})=>ee(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>ee(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`,vl=he(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>ee(e,\"A10\")};\n color: ${({theme:e})=>ee(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`,kl=he(\"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`,Tl=he(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>ee(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>ee(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`,Sl=he(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,Dl=he(\"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})=>ee(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`,Pl=he(\"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})=>ee(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,Rl=he(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,Ml=he(\"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})=>ee(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Ol=he(\"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\":ee(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`,Fl=he(\"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})=>ee(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>ee(e,\"N50\")};\n }\n`,Ll=he(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>ee(e,\"N70\")};\n`;import{useState as jc}from\"react\";import Yc from\"@mui/material/Menu\";import Nl from\"@mui/material/MenuItem\";import $l from\"@mui/material/ListItemIcon\";import Vl from\"@mui/material/ListItemText\";import Jc from\"@mui/icons-material/MoreVert\";import Zc from\"@mui/icons-material/Visibility\";import qc from\"@mui/icons-material/FileDownload\";import Kc from\"@mui/material/IconButton\";import{styled as Gc}from\"@nuskin/foundation-theme\";var Il=Gc(Kc)(()=>({padding:\"4px\",color:\"#252525\",\"&:hover\":{backgroundColor:\"rgba(37, 37, 37, 0.08)\"}}));import{Fragment as Xc,jsx as _t,jsxs as kr}from\"react/jsx-runtime\";var rt=({widgetId:e,onFullView:t,onExport:o})=>{let[n,i]=jc(null),s=!!n,l=`widget-menu-button-${e}`,p=`widget-menu-${e}`,g=h=>{i(h.currentTarget)},x=()=>{i(null)},u=()=>{x(),t&&t()},y=()=>{x(),o&&o()};return kr(Xc,{children:[_t(Il,{id:l,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":s?p:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":s?\"true\":void 0,onClick:g,size:\"small\",children:_t(Jc,{fontSize:\"small\"})}),kr(Yc,{id:p,\"data-testid\":`widget-menu-${e}`,anchorEl:n,open:s,onClose:x,MenuListProps:{\"aria-labelledby\":l},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[kr(Nl,{onClick:u,\"data-testid\":\"widget-menu-item-viewdetails\",children:[_t($l,{children:_t(Zc,{fontSize:\"small\"})}),_t(Vl,{children:a(r.widget.menu.viewDetails)})]}),o&&kr(Nl,{onClick:y,\"data-testid\":\"widget-menu-item-export\",children:[_t($l,{children:_t(qc,{fontSize:\"small\"})}),_t(Vl,{children:a(r.widget.menu.exportData)})]})]})]})};import{jsx as ne,jsxs as ht}from\"react/jsx-runtime\";var au=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,onSortChange:i,onTitleClick:s,onExport:l})=>{let p=d=>{let b=d.target.value;i?.(b)},g=(d,b)=>{switch(b){case\"units\":return`${d.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return _(d.revenue,d.currencyCode);case\"volume\":return`${d.volume.toLocaleString()} ${a(r.defaults.dcSv)}`;default:return`${d.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},x=(d,b)=>{switch(b){case\"units\":return`${_(d.revenue,d.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${d.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${_(d.revenue,d.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${_(d.revenue,d.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`}},u=(d,b)=>{let w=d.trend;if(!w)return\"\";switch(b){case\"units\":return w.units??\"\";case\"revenue\":return w.revenue??\"\";case\"volume\":return w.volume??\"\";default:return w.units??\"\"}},y=(d,b)=>{let w=u(d,b);return w?w.startsWith(\"+\")?\"up\":w.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\"},h=d=>d===\"up\"?ne(ou,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):d===\"down\"?ne(ru,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):ne(tu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}),f=e.slice(0,n),T=a(r.widget.topProducts.rank),P=a(r.defaults.trend);return o&&e.length===0?ne(vr,{\"data-testid\":\"widget-top-products\",children:ne(gl,{})}):e.length===0?ht(vr,{\"data-testid\":\"widget-top-products\",children:[ne(_a,{children:ne(Ua,{children:a(r.widget.topProducts.title)})}),ht(Fl,{\"data-testid\":\"products-empty-state\",children:[ne(eu,{}),ne(Ll,{children:a(r.widget.topProducts.empty)})]})]}):ht(vr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[ht(_a,{children:[ne(Ua,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),ht(bl,{children:[ht(yl,{id:\"product-sort\",\"data-testid\":\"product-sort-dropdown\",value:t,onChange:p,disabled:o,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[ne(\"option\",{value:\"units\",children:a(r.defaults.byUnits)}),ne(\"option\",{value:\"revenue\",children:a(r.defaults.byRevenue)}),ne(\"option\",{value:\"volume\",children:a(r.defaults.byVolume)})]}),ne(rt,{widgetId:\"top-products\",onFullView:s,onExport:l})]})]}),ne(wl,{as:\"ul\",\"data-testid\":\"products-list\",children:f.map((d,b)=>{let w=y(d,t),k=u(d,t);return ht(Cl,{as:\"li\",\"data-testid\":`product-item-${b}`,\"aria-label\":`${T} ${d.rank}: ${d.name}, ${g(d,t)}`,children:[ne(vl,{\"aria-label\":`${T} ${d.rank}`,children:d.rank}),d.imageUrl?ne(kl,{src:d.imageUrl,alt:d.name,loading:\"lazy\",onError:S=>{S.currentTarget.hidden=!0}}):ne(Tl,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:d.name.substring(0,2).toUpperCase()}),ht(Sl,{children:[ne(Dl,{title:d.name,children:d.name}),ne(Pl,{children:x(d,t)})]}),ht(Rl,{children:[ne(Ml,{children:g(d,t)}),k&&ht(Ol,{as:\"output\",direction:w,\"aria-live\":\"polite\",\"aria-label\":`${P}: ${ho(w)} ${k}`,children:[h(w),ne(\"span\",{children:k})]})]})]},d.id)})})]})},xo=Qc.memo(au);xo.displayName=\"TopSellingProductsList\";import Jo from\"react\";import{LineChart as du,Line as pu,XAxis as cu,YAxis as uu,CartesianGrid as gu,Tooltip as fu,ResponsiveContainer as mu}from\"recharts\";import{ColorUtils as nu,styled as Oe}from\"@nuskin/foundation-theme\";var{getGenomeColor:pe}=nu,Ka=Oe(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>pe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>pe(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`,El=Oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,Al=Oe(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,zl=Oe(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Bl=Oe(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>pe(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})=>pe(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`,Hl=Oe(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>pe(e,\"N20\")};\n border: 1px solid ${({theme:e})=>pe(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>pe(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>pe(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>pe(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>pe(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Wl=Oe(\"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`,_l=Oe(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>pe(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,Ul=Oe(\"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\":pe(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})=>pe(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Kl=Oe(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>pe(e,\"N100\")};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,Gl=Oe(\"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})=>pe(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>pe(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,jl=Oe(\"div\")`\n background-color: ${({theme:e})=>pe(e,\"N100\")};\n border: 1px solid ${({theme:e})=>pe(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,Yl=Oe(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>pe(e,\"N10\")};\n margin-bottom: 4px;\n`,Jl=Oe(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>pe(e,\"A10\")};\n`,Zl=Oe(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>pe(e,\"N30\")};\n margin-top: 2px;\n`;var je=\"last30days\",ql={last7days:7,last30days:30,last90days:90,thisMonth:31},Xl={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function iu(e){return ql[e]??30}function Ga(e){return Xl[e]??\"Last 30 Days\"}function lu(e){return Ga(e)}function Ql(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var su={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 Tr(e){let t=e.split(\" \");return t.length!==2?e:`${su[t[0]]||t[0]}/${t[1]}`}function ja(e){let t=new Date(e);return Ql(t)}function es(e,t){return`${ja(e)} - ${ja(t)}`}function Ya(e){return e.toISOString().split(\"T\")[0]}function xe(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),s,l=new Date(o,n,i);switch(e){case\"last7days\":s=new Date(o,n,i-7);break;case\"last30days\":s=new Date(o,n,i-30);break;case\"last90days\":s=new Date(o,n,i-90);break;case\"thisMonth\":s=new Date(o,n,1),l=new Date(o,n+1,0);break;default:return\"N/A\"}return es(Ya(s),Ya(l))}function Pt(e){let t=r.widget.compareTo;switch(e){case\"last7days\":return Be(t.last7days);case\"last30days\":return Be(t.last30days);case\"last90days\":return Be(t.last90days);case\"thisMonth\":return Be(t.thisMonth);default:return Be(t.last30days)}}import{jsx as ce,jsxs as Ye}from\"react/jsx-runtime\";var hu={top:5,right:10,left:-10,bottom:5},ts={fontSize:10},xu={r:3,fill:\"#3B82F6\"},bu={r:5},yu=e=>`${e}%`,wu=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Ye(jl,{children:[ce(Yl,{children:o.date}),Ye(Jl,{children:[(o.rate??0).toFixed(2),\"%\"]}),Ye(Zl,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},Cu=({conversionData:e,conversionFilter:t,dateRange:o=je,isLoading:n=!1,title:i,summaryRate:s,summaryChangePct:l,onFilterChange:p,onTitleClick:g,onExport:x})=>{let u=Jo.useCallback(b=>{let w=b.target.value;p?.(w)},[p]),y=a(r.defaults.noData),h=a(r.defaults.noChange),f=Jo.useMemo(()=>typeof s==\"number\"&&Number.isFinite(s)?s:e.at(-1)?.rate??0,[s,e]),T=Jo.useMemo(()=>{if(l!==void 0){if(l===null||Math.abs(l)<.1)return{direction:\"neutral\",value:h};let A=l>0?\"up\":\"down\",E=`${l>0?\"+\":\"\"}${l.toFixed(2)}%`;return{direction:A,value:E}}if(e.length<2)return{direction:\"neutral\",value:y};let b=e.at(-1)?.rate??0,w=e[0].rate;if(w===0)return{direction:\"neutral\",value:h};let k=b-w,S=k/w*100;if(Math.abs(S)<.1)return{direction:\"neutral\",value:h};let M=k>0?\"up\":\"down\",F=`${k>0?\"+\":\"\"}${k.toFixed(2)}%`;return{direction:M,value:F}},[l,e,h,y]),P=Jo.useMemo(()=>e.map(b=>({...b,shortDate:Tr(b.date)})),[e]);if(n&&e.length===0)return ce(Ka,{\"data-testid\":\"widget-conversion-rate\",children:ce(wr,{})});let d=a(r.widget.conversionRate.chartAriaLabel);return Ye(Ka,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":d,children:[ce(El,{children:Ye(Al,{children:[ce(Bl,{as:\"button\",onClick:g,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:i??a(r.defaults.conversionRate)}),Ye(zl,{children:[Ye(Hl,{id:\"conversion-filter\",\"data-testid\":\"conversion-filter-dropdown\",value:t,onChange:u,disabled:n,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[ce(\"option\",{value:\"all\",children:a(r.defaults.all)}),ce(\"option\",{value:\"standard\",children:a(r.filter.conversionType.standard)}),ce(\"option\",{value:\"subscription\",children:a(r.filter.conversionType.subscription)})]}),ce(rt,{widgetId:\"conversion-rate\",onFullView:g,onExport:x})]})]})}),Ye(Wl,{children:[Ye(_l,{\"aria-label\":`${a(r.defaults.conversionRate)}: ${f.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[f.toFixed(2),\"%\"]}),T.value!==y&&Ye(Ul,{as:\"output\",direction:T.direction,\"aria-live\":\"polite\",\"aria-label\":`${ho(T.direction)} ${T.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Ye(\"div\",{className:\"trend-line\",children:[ce(\"span\",{\"aria-hidden\":\"true\",children:ot(T.direction)}),ce(\"span\",{className:\"change-value\",children:T.value.replace(\"%\",\"\")}),ce(\"span\",{className:\"change-percent\",children:\"%\"})]}),ce(\"div\",{className:\"comparison-text\",children:Pt(o)})]})]}),ce(Kl,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),ce(Gl,{\"data-testid\":\"conversion-chart\",children:ce(mu,{width:\"100%\",height:\"100%\",minHeight:200,children:Ye(du,{data:P,margin:hu,children:[ce(gu,{strokeDasharray:\"3 3\"}),ce(cu,{dataKey:\"shortDate\",tick:ts,tickLine:!1,interval:\"preserveStartEnd\"}),ce(uu,{tick:ts,tickLine:!1,tickFormatter:yu,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),ce(fu,{content:wu}),ce(pu,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:xu,activeDot:bu})]})})})]})},bo=Jo.memo(Cu);bo.displayName=\"ConversionRateChart\";import Qo from\"react\";import{LineChart as ku,Line as yo,XAxis as Tu,YAxis as Su,CartesianGrid as Du,Tooltip as Pu,ResponsiveContainer as Ru}from\"recharts\";import{ColorUtils as vu,styled as He}from\"@nuskin/foundation-theme\";var{getGenomeColor:ke}=vu,Ja=He(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ke(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ke(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`,os=He(\"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`,rs=He(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,as=He(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ke(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})=>ke(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`,ns=He(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ke(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ke(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ke(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ke(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>ke(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ke(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,is=He(\"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`,ls=He(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>ke(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,ss=He(\"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\":ke(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})=>ke(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,ds=He(\"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})=>ke(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>ke(e,\"N70\")};\n font-size: 10px;\n }\n`,ps=He(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,Zo=He(\"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})=>ke(e,\"N30\")};\n }\n`,qo=He(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Xo=He(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ke(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as Fu,jsx as z,jsxs as $e}from\"react/jsx-runtime\";var at={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},Mu={top:5,right:10,left:-10,bottom:5},cs={fontSize:10},wo={r:2},Ou=({signupData:e,signupView:t,dateRange:o=je,isLoading:n=!1,title:i,onViewChange:s,onTitleClick:l,onExport:p})=>{let g=Qo.useCallback(w=>{let k=w.target.value;s?.(k)},[s]),x=a(r.defaults.noData),u=a(r.defaults.noChange),y=Qo.useMemo(()=>{if(e.length===0)return 0;let w=e[e.length-1];return Wt(w,t)},[e,t]),h=Qo.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:x};let w=Wt(e[e.length-1],t),k=Wt(e[0],t),S=w-k,M=k===0?0:S/k*100;if(Math.abs(M)<.1)return{direction:\"neutral\",value:u};let F=S>0?\"up\":\"down\",A=`${S>0?\"+\":\"\"}${S} (${M.toFixed(1)}%)`;return{direction:F,value:A}},[u,x,e,t]),f=Qo.useMemo(()=>e.map(w=>({...w,shortDate:Tr(w.date)})),[e]),T=a(r.widget.signups.total),P=a(r.defaults.members),d=a(r.defaults.retail),b=a(r.defaults.brandAffiliates);return n&&e.length===0?z(Ja,{\"data-testid\":\"widget-signups\",children:z(wr,{})}):$e(Ja,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[$e(os,{children:[z(as,{as:\"button\",onClick:l,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:i??a(r.widget.signups.title)}),$e(rs,{children:[$e(ns,{id:\"signup-view\",\"data-testid\":\"signup-view-dropdown\",value:t,onChange:g,disabled:n,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[z(\"option\",{value:\"all\",children:a(r.filter.signupView.showAll)}),z(\"option\",{value:\"members\",children:a(r.filter.signupView.showMembers)}),z(\"option\",{value:\"retail\",children:a(r.filter.signupView.showRetail)}),z(\"option\",{value:\"brandAffiliates\",children:a(r.filter.signupView.showBrandAffiliates)})]}),z(rt,{widgetId:\"signups\",onFullView:l,onExport:p})]})]}),$e(is,{\"data-testid\":\"signups-metric-display\",children:[z(ls,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${T}: ${y.toLocaleString()}`,children:y.toLocaleString()}),h.value!==x&&$e(ss,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:h.direction,\"aria-live\":\"polite\",\"aria-label\":`${ho(h.direction)} ${h.value}`,children:[$e(\"div\",{className:\"trend-line\",children:[z(\"span\",{\"aria-hidden\":\"true\",children:ot(h.direction)}),z(\"span\",{className:\"change-value\",children:h.value.split(\" \")[0]}),z(\"span\",{className:\"change-percent\",children:h.value.split(\" \")[1]})]}),z(\"div\",{className:\"comparison-text\",children:Pt(o)})]})]}),z(ds,{\"data-testid\":\"signups-chart\",children:z(Ru,{width:\"100%\",height:\"100%\",minHeight:200,children:$e(ku,{data:f,margin:Mu,children:[z(Du,{strokeDasharray:\"3 3\"}),z(Tu,{dataKey:\"shortDate\",tick:cs,tickLine:!1,interval:\"preserveStartEnd\"}),z(Su,{tick:cs,tickLine:!1}),z(Pu,{}),(t===\"all\"||t===\"members\")&&z(yo,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?at.total:at.members,strokeWidth:2,dot:wo,name:t===\"all\"?T:P}),t===\"all\"&&$e(Fu,{children:[z(yo,{type:\"monotone\",dataKey:\"members\",stroke:at.members,strokeWidth:2,dot:wo,name:P}),z(yo,{type:\"monotone\",dataKey:\"retail\",stroke:at.retail,strokeWidth:2,dot:wo,name:d}),z(yo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:at.brandAffiliates,strokeWidth:2,dot:wo,name:b})]}),t===\"retail\"&&z(yo,{type:\"monotone\",dataKey:\"retail\",stroke:at.retail,strokeWidth:2,dot:wo,name:d}),t===\"brandAffiliates\"&&z(yo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:at.brandAffiliates,strokeWidth:2,dot:wo,name:b})]})})}),t===\"all\"&&$e(ps,{\"data-testid\":\"signups-legend\",children:[$e(Zo,{\"data-testid\":\"legend-total\",children:[z(qo,{color:at.total}),z(Xo,{children:T})]}),$e(Zo,{\"data-testid\":\"legend-members\",children:[z(qo,{color:at.members}),z(Xo,{children:P})]}),$e(Zo,{\"data-testid\":\"legend-retail\",children:[z(qo,{color:at.retail}),z(Xo,{children:d})]}),$e(Zo,{\"data-testid\":\"legend-brandAffiliates\",children:[z(qo,{color:at.brandAffiliates}),z(Xo,{children:b})]})]})]})},Sr=Qo.memo(Ou);Sr.displayName=\"SignupsChart\";import Za from\"react\";import{PieChart as Iu,Pie as Nu,Cell as $u,ResponsiveContainer as Vu,Tooltip as Eu}from\"recharts\";import Au from\"@mui/icons-material/TrendingUp\";import zu from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Lu,styled as re}from\"@nuskin/foundation-theme\";var{getGenomeColor:be}=Lu,Ut=re(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>be(e,\"N20\")};\n border: 1px solid ${({theme:e})=>be(e,\"N30\")};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,Co=re(\"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`,Dr=re(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,vo=re(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>be(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})=>be(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`,Pr=re(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>be(e,\"N20\")};\n border: 1px solid ${({theme:e})=>be(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>be(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>be(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>be(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>be(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Rr=re(\"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`,Mr=re(\"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`,Or=re(\"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`,Fr=re(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>be(e,\"N70\")};\n`,Lr=re(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>be(e,\"N100\")};\n`,Ir=re(\"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\":be(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Nr=re(\"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`,$r=re(\"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})=>be(e,\"N30\")};\n }\n`,Vr=re(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Er=re(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Ar=re(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>be(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=re(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>be(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,us=re(\"div\")`\n display: none;\n`,gs=re(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,fs=re(\"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`,ms=re(\"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`,Br=re(\"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})=>be(e,\"N70\")};\n`,Hr=re(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>be(e,\"N70\")};\n`;import{jsx as te,jsxs as Ve}from\"react/jsx-runtime\";var Bu=({categories:e,categorySort:t,isLoading:o=!1,title:n,summaryChangePct:i,onSortChange:s,onTitleClick:l,onExport:p})=>{let g=Za.useCallback(d=>{let b=d.target.value;s?.(b)},[s]),{sortedCategories:x,totalRevenue:u,trendDirection:y,formattedTrend:h}=Za.useMemo(()=>{let d=[...e].sort((S,M)=>t===\"revenue\"?M.revenue-S.revenue:(ft(M.trend?.revenue)??-1/0)-(ft(S.trend?.revenue)??-1/0)),b=d.reduce((S,M)=>S+M.revenue,0),w,k;if(i!=null)Math.abs(i)<.1?(k=\"0%\",w=\"neutral\"):(w=i>0?\"up\":\"down\",k=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:S,formatted:M}=Ht(d,F=>F.revenue,F=>F.trend?.revenue);w=S,k=M}return{sortedCategories:d,totalRevenue:b,trendDirection:w,formattedTrend:k}},[e,t,i]),f=d=>d===\"up\"?te(Au,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):d===\"down\"?te(zu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,T=d=>{let{cx:b,cy:w,midAngle:k,innerRadius:S,outerRadius:M,percentage:F}=d,A=Math.PI/180,E=S+(M-S)/2,B=b+E*Math.cos(-k*A),R=w+E*Math.sin(-k*A);return te(\"text\",{x:B,y:R,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"central\",fontSize:\"10\",fontWeight:\"600\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0.2\",style:{lineHeight:\"12px\"},children:`${F}%`})},P=x[0]?.currencyCode;return o&&e.length===0?te(Ut,{\"data-testid\":\"widget-top-categories\",children:te(Cr,{})}):e.length===0?Ve(Ut,{\"data-testid\":\"widget-top-categories\",children:[te(Co,{children:te(vo,{children:n??a(r.widget.topCategories.title)})}),te(Br,{\"data-testid\":\"categories-empty-state\",children:te(Hr,{children:a(r.widget.topCategories.empty)})})]}):Ve(Ut,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[Ve(Co,{children:[te(vo,{as:\"button\",onClick:l,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),Ve(Dr,{children:[Ve(Pr,{id:\"category-sort\",\"data-testid\":\"category-sort-dropdown\",value:t,onChange:g,disabled:o,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[te(\"option\",{value:\"revenue\",children:a(r.defaults.byRevenue)}),te(\"option\",{value:\"trend\",children:a(r.defaults.byTrend)})]}),te(rt,{widgetId:\"top-categories\",onFullView:l,onExport:p})]})]}),Ve(Rr,{children:[Ve(Mr,{\"data-testid\":\"categories-chart\",children:[te(Vu,{width:\"100%\",height:\"100%\",children:Ve(Iu,{children:[te(Nu,{data:x,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:T,labelLine:!1,children:x.map(d=>te($u,{fill:d.color},`cell-${d.id}`))}),te(Eu,{formatter:d=>_(d,P)})]})}),Ve(Or,{\"data-testid\":\"categories-donut-center\",children:[te(Fr,{children:a(r.stats.revenue)}),te(Lr,{children:_(u,P)}),Ve(Ir,{direction:y,children:[f(y),te(\"span\",{children:h})]})]})]}),te(Nr,{\"data-testid\":\"categories-legend-container\",children:x.map((d,b)=>Ve($r,{\"data-testid\":`category-legend-${b}`,children:[te(Vr,{color:d.color}),Ve(Er,{children:[te(Ar,{children:d.name.charAt(0).toUpperCase()+d.name.slice(1)}),Ve(gs,{children:[Ve(zr,{children:[_(d.revenue,d.currencyCode),\" (\",d.percentage,\"%)\"]}),d.trend?.revenue?te(fs,{direction:Bt(d.trend?.revenue),\"data-testid\":`category-legend-trend-${b}`,\"aria-label\":d.trend.revenue,children:f(Bt(d.trend?.revenue))}):null]})]})]},d.id))})]})]})},Wr=Za.memo(Bu);Wr.displayName=\"TopCategoriesPieChart\";import{jsx as Rt,jsxs as oo}from\"react/jsx-runtime\";var Hu=[],Wu=[],_u=[],Uu=[],qa=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:s=!1,error:l,shopTitle:p,className:g,dateRange:x=je,market:u=\"all\",productSort:y=\"units\",signupView:h=\"all\",conversionFilter:f=\"all\",categorySort:T=\"revenue\",categoriesSummaryChangePct:P,markets:d,onDateRangeChange:b,onMarketChange:w,onProductSortChange:k,onSignupViewChange:S,onConversionFilterChange:M,onCategorySortChange:F,onProductsTitleClick:A,onConversionTitleClick:E,onSignupsTitleClick:B,onCategoriesToTitleClick:R,onProductsExport:c,onConversionExport:v,onSignupsExport:D,onCategoriesExport:m})=>{let C=t??Hu,O=o??Wu,ae=n??_u,U=i??Uu;if(l)return Rt(La,{as:\"main\",className:g,\"aria-label\":a(r.ariaLabel.dashboard),children:oo(Pi,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[oo(\"strong\",{children:[a(r.error),\":\"]}),\" \",l]})});let de=Z=>Z?Z.startsWith(\"+\")?\"up\":Z.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return oo(La,{as:\"main\",className:g,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":s,children:[Rt(Ko,{shopTitle:p,dateRange:x,market:u,isLoading:s,stats:e,markets:d,onDateRangeChange:b,onMarketChange:w}),oo(Si,{as:\"section\",\"data-testid\":\"stats-row\",\"aria-label\":a(r.ariaLabel.statsRow),children:[Rt(Dt,{title:a(r.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:de(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:s}),Rt(Dt,{title:a(r.defaults.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.defaults.dcSv),trendDirection:de(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:s}),Rt(Dt,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.defaults.conversionRate)}`,trendDirection:de(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:s})]}),oo(Di,{\"data-testid\":\"widget-container\",children:[oo(Ia,{\"data-testid\":\"widget-row-1\",children:[Rt(xo,{products:C,productSort:y,isLoading:s,maxProducts:5,onSortChange:k,onTitleClick:A,onExport:c}),Rt(Sr,{signupData:ae,signupView:h,dateRange:x,isLoading:s,onViewChange:S,onTitleClick:B,onExport:D})]}),oo(Ia,{\"data-testid\":\"widget-row-2\",children:[Rt(bo,{conversionData:O,conversionFilter:f,dateRange:x,isLoading:s,onFilterChange:M,onTitleClick:E,onExport:v}),Rt(Wr,{categories:U,categorySort:T,isLoading:s,summaryChangePct:P,onSortChange:F,onTitleClick:R,onExport:m})]})]})]})};import oe from\"react\";import ao,{useState as on}from\"react\";import Gu from\"@mui/icons-material/ArrowBack\";import ju from\"@mui/icons-material/CalendarToday\";import Yu from\"@mui/icons-material/Language\";import{ColorUtils as Ku,styled as Ee}from\"@nuskin/foundation-theme\";var{getGenomeColor:We}=Ku,hs=Ee(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,xs=Ee(\"div\")`\n display: flex;\n align-items: center;\n`,bs=Ee(\"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})=>We(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})=>We(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>We(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`,ys=Ee(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>We(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`,ws=Ee(\"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`,Cs=Ee(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>We(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,vs=Ee(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>We(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,ks=Ee(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>We(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,Ts=Ee(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`,Ss=Ee(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ds=Ee(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>We(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,Ps=Ee(\"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})=>We(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})=>We(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>We(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>We(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`,Rs=Ee(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,Ms=Ee(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>We(e,\"N100\")};\n margin: 0;\n`;import{jsx as _e,jsxs as ko}from\"react/jsx-runtime\";function xt(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 bt(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 fe=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let s=l=>l?ko(Ds,{children:[l===\"calendar\"&&_e(ju,{}),l===\"globe\"&&_e(Yu,{})]}):null;return ko(hs,{\"data-testid\":\"page-header\",children:[_e(xs,{children:ko(bs,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[_e(Gu,{}),_e(\"span\",{children:a(r.navigation.backToDashboard)})]})}),_e(Rs,{children:_e(Ms,{children:e})}),ko(ys,{children:[ko(ws,{children:[_e(Cs,{\"data-testid\":\"page-header-title\",children:e}),_e(vs,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&_e(Ts,{\"data-testid\":\"page-header-filters\",children:n.map(l=>ko(Ss,{children:[s(l.icon),_e(Ps,{id:`filter-${l.key}`,value:l.value,onChange:p=>i(l.key,p.target.value),disabled:l.disabled,\"aria-label\":`${l.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${l.key}`,children:l.options.map(p=>_e(\"option\",{value:p.value,children:l.label&&l.key===\"customerType\"?`${l.label} ${p.label}`:p.label},p.value))})]},l.key))}),_e(ks,{children:t})]})]})};import Zu from\"@mui/icons-material/ArrowUpward\";import qu from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as Ju,styled as Mt}from\"@nuskin/foundation-theme\";var{getGenomeColor:yt}=Ju,Os=Mt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>yt(e,\"N30\")};\n`,Fs=Mt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,Ls=Mt(\"thead\")`\n background-color: ${({theme:e})=>yt(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>yt(e,\"N40\")};\n`,Is=Mt(\"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})=>yt(e,\"N20\")};\n color: ${({theme:e})=>yt(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})=>yt(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>yt(e,\"A70\")};\n outline-offset: -2px;\n }\n`,Ns=Mt(\"tbody\")``,Xa=Mt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>yt(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>yt(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,Qa=Mt(\"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})=>yt(e,\"N70\")};\n text-align: left;\n`,$s=Mt(Qa)`\n text-align: center;\n`,Vs=Mt(\"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 nt,jsxs as Es}from\"react/jsx-runtime\";var it=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:s=\"asc\",getRowKey:l})=>{let p=u=>{if(!o||!n)return;n(u,i===u&&s===\"asc\"?\"desc\":\"asc\")},g=(u,y)=>{(u.key===\"Enter\"||u.key===\" \")&&(u.preventDefault(),p(y))},x=u=>{if(i===u)return s===\"asc\"?\"ascending\":\"descending\"};return nt(Os,{\"data-testid\":\"data-table\",children:Es(Fs,{children:[nt(Ls,{children:nt(\"tr\",{children:e.map(u=>Es(Is,{scope:\"col\",sortable:o&&u.sortable,onClick:()=>u.sortable&&p(u.key),onKeyDown:y=>u.sortable&&g(y,u.key),tabIndex:o&&u.sortable?0:-1,\"aria-sort\":x(u.key),\"aria-label\":`${u.label}${u.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${u.key}`,children:[u.label,o&&u.sortable&&nt(Vs,{isActive:i===u.key,children:i===u.key&&s===\"desc\"?nt(qu,{}):nt(Zu,{})})]},u.key))})}),nt(Ns,{children:t.length===0?nt(Xa,{\"data-testid\":\"table-empty-row\",children:nt($s,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((u,y)=>nt(Xa,{\"data-testid\":`table-row-${y}`,children:e.map(h=>nt(Qa,{\"data-testid\":`table-cell-${h.key}`,children:h.render?h.render(u[h.key],u):u[h.key]},h.key))},l?l(u,y):y))})]})})};import Qu from\"@mui/icons-material/ChevronLeft\";import eg from\"@mui/icons-material/ChevronRight\";import{ColorUtils as Xu,styled as _r}from\"@nuskin/foundation-theme\";var{getGenomeColor:lt}=Xu,As=_r(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,Ur=_r(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?lt(e,\"A80\"):lt(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":lt(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?lt(e,\"A70\"):lt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>lt(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,Kr=_r(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>lt(e,\"N70\")};\n margin: 0 8px;\n`,en=_r(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>lt(e,\"N20\")};\n color: ${({theme:e})=>lt(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})=>lt(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>lt(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 zs,jsx as Ot,jsxs as Gr}from\"react/jsx-runtime\";var st=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let s=()=>{e>1&&o(e-1)},l=()=>{e<t&&o(e+1)},p=(f,T)=>{(f.key===\"Enter\"||f.key===\" \")&&(f.preventDefault(),T())},x=(()=>{if(t<=7)return Array.from({length:t},(T,P)=>P+1);let f=[];return e<=4?f.push(1,2,3,4,5):e>=t-3?f.push(t-4,t-3,t-2,t-1,t):f.push(e-1,e,e+1),f})(),u=n?(e-1)*n+1:null,y=n?Math.min(e*n,i??1/0):null,h=a(r.pagination.goToPage);return Gr(As,{\"data-testid\":\"pagination\",children:[Ot(en,{onClick:s,onKeyDown:f=>p(f,s),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:Ot(Qu,{})}),t>7&&e>4&&Gr(zs,{children:[Ot(Ur,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${h} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),Ot(Kr,{children:\"...\"})]}),x.map(f=>Ot(Ur,{onClick:()=>o(f),isActive:e===f,\"aria-label\":`${h} ${f}`,\"aria-current\":e===f?\"page\":void 0,\"data-testid\":`pagination-page-${f}`,type:\"button\",children:f},f)),t>7&&e<t-3&&Gr(zs,{children:[Ot(Kr,{children:\"...\"}),Ot(Ur,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${h} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),Ot(en,{onClick:l,onKeyDown:f=>p(f,l),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:Ot(eg,{})}),n&&i&&Gr(Kr,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[u,\"-\",y,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as Se}from\"@mui/material/styles\";import{Box as Kt,Typography as ro}from\"@mui/material\";import{ColorUtils as tg}from\"@nuskin/foundation-theme\";var{getGenomeColor:Bs}=tg,ye=Se(Kt)`\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`,jr=Se(Kt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Bs(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`,Yr=Se(Kt)`\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`,Jr=Se(ro)`\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`,Zr=Se(Kt)`\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`,w0=Se(ro)`\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`,qr=Se(Kt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,Gt=Se(\"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`,C0=Se(Kt)`\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`,jt=Se(Kt)`\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: ${Bs(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,v0=Se(Kt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,Yt=Se(ro)`\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`,Hs=Se(ro)`\n font-weight: 600;\n font-size: 14px;\n`,Ws=Se(ro)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,_s=Se(ro)`\n font-size: 13px;\n`,Us=Se(ro)`\n font-size: 13px;\n color: ${({theme:e,status:t})=>t===\"Active\"?e.palette.success.main:e.palette.warning.main};\n`;import{styled as De}from\"@mui/material/styles\";import{Box as Jt,Typography as Zt}from\"@mui/material\";import{ColorUtils as og}from\"@nuskin/foundation-theme\";var{getGenomeColor:tn}=og,Ks=De(Jt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,Gs=De(Zt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,js=De(Zt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Xr=De(Zt)`\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})=>tn(e,\"N70\")};\n`,Ys=De(Jt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Js=De(Jt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Zs=De(Jt)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\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`,qs=De(Jt)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,Xs=De(Zt)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,Qs=De(Jt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,ed=De(Zt)`\n font-size: 0.875rem;\n font-weight: 600;\n`,td=De(Zt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,od=De(Jt)`\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`,Qr=De(Jt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,ea=De(Zt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,ta=De(Zt)`\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})=>tn(e,\"N70\")};\n`;import rg from\"@mui/material/useMediaQuery\";var ag=\"(max-width:767px)\";function wt(){return rg(ag,{noSsr:!0})}import{jsx as ie,jsxs as Je}from\"react/jsx-runtime\";function ng(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 er=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:s=!1,onBack:l,onDateRangeChange:p,onMarketChange:g,onProductSortChange:x})=>{let[u,y]=on(1),[h,f]=on(n===\"revenue\"?\"revenue\":\"units\"),[T,P]=on(\"desc\"),d=10,b=wt(),w=ao.useCallback(()=>l?.(),[l]),k=Ge(i),S=ao.useMemo(()=>[xt(t,r),bt(o,k,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,k,n]),M=ao.useCallback((D,m)=>{D===\"dateRange\"?p?.(m):D===\"market\"?g?.(m):D===\"sort\"&&(x?.(m),y(1))},[p,g,x]),F=ao.useCallback((D,m)=>{f(D),P(m),y(1)},[]),A=ao.useMemo(()=>e.map(ng),[e]),E=ao.useMemo(()=>[...A].sort((D,m)=>{let C=D[h],O=m[h];return T===\"asc\"?C-O:O-C}),[A,h,T]),{totalPages:B,pageItems:R}=mt(E,u,d),c=e[0]?.currencyCode,v=ao.useMemo(()=>[{key:\"rank\",label:a(r.fullView.products.columns.rank),sortable:!0},{key:\"name\",label:a(r.fullView.products.columns.product),sortable:!0,render:(D,m)=>Je(Ks,{children:[ie(Gs,{children:m.name}),ie(js,{children:m.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:D=>ie(Xr,{children:Number(D).toLocaleString()})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:D=>ie(Xr,{children:_(Number(D),c)})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:D=>ie(Xr,{children:Number(D).toLocaleString()})}],[c]);return s?Je(ye,{\"data-testid\":\"products-full-view\",children:[ie(fe,{title:a(r.widget.topProducts.title),dateRange:xe(t),onBack:w,filters:S,onFilterChange:M}),ie(fl,{})]}):e.length===0?Je(ye,{\"data-testid\":\"products-full-view\",children:[ie(fe,{title:a(r.widget.topProducts.title),dateRange:xe(t),onBack:w,filters:S,onFilterChange:M}),ie(Yt,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):Je(ye,{\"data-testid\":\"products-full-view\",children:[ie(fe,{title:a(r.widget.topProducts.title),dateRange:xe(t),onBack:w,filters:S,onFilterChange:M}),b?ie(Ys,{\"data-testid\":\"products-fullview-mobile-cards\",children:R.map(D=>Je(Zs,{children:[Je(qs,{children:[Je(Xs,{children:[\"#\",D.rank]}),Je(Qs,{children:[ie(ed,{children:D.name}),ie(td,{children:D.sku})]})]}),Je(od,{children:[Je(Qr,{children:[ie(ea,{children:a(r.defaults.units)}),ie(ta,{children:D.units.toLocaleString()})]}),Je(Qr,{children:[ie(ea,{children:a(r.defaults.revenue)}),ie(ta,{children:_(D.revenue,c)})]}),Je(Qr,{children:[ie(ea,{children:a(r.defaults.volume)}),ie(ta,{children:D.volume.toLocaleString()})]})]})]},D.rank))}):ie(Js,{\"data-testid\":\"products-fullview-desktop-table\",children:ie(it,{columns:v,data:R,sortable:!0,onSort:F,sortColumn:h,sortDirection:T,getRowKey:D=>D.rank})}),B>1&&ie(st,{currentPage:u,totalPages:B,onPageChange:y,itemsPerPage:d,totalItems:E.length})]})};import Ct,{useState as sg}from\"react\";import{LineChart as dg,Line as pg,XAxis as cg,YAxis as ug,CartesianGrid as gg,Tooltip as fg,ResponsiveContainer as mg}from\"recharts\";import hg from\"@mui/icons-material/ArrowUpward\";import xg from\"@mui/icons-material/ArrowDownward\";import{styled as we}from\"@mui/material/styles\";import{Box as dt,Typography as tr}from\"@mui/material\";import{ColorUtils as ig}from\"@nuskin/foundation-theme\";var{getGenomeColor:lg}=ig,rd=we(dt)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,ad=we(dt)`\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})=>lg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,nd=we(dt)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,id=we(dt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,ld=we(tr)`\n font-size: 1rem;\n font-weight: 600;\n`,sd=we(tr)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,dd=we(\"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`,pd=we(dt)`\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`,oa=we(dt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,ra=we(tr)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,aa=we(tr)`\n font-size: 0.875rem;\n font-weight: 500;\n`,cd=we(dt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,ud=we(dt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,gd=we(dt)`\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`,fd=we(dt)`\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`,md=we(dt)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,j0=we(tr)`\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`,hd=we(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as W,jsxs as Ce}from\"react/jsx-runtime\";var or=({conversionData:e,orders:t,summaryRate:o,summaryChangePct:n,dateRange:i,market:s,conversionFilter:l,markets:p,isLoading:g=!1,onBack:x,onDateRangeChange:u,onMarketChange:y,onConversionFilterChange:h})=>{let[f,T]=sg(1),P=10,d=wt(),b=Ct.useCallback(()=>x?.(),[x]),w=Ge(p),k=Ct.useMemo(()=>typeof o==\"number\"&&Number.isFinite(o)?o:e.at(-1)?.rate??0,[o,e]),S=Ct.useMemo(()=>{if(n!==void 0){if(n===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let U=\"neutral\";return n>0?U=\"up\":n<0&&(U=\"down\"),{direction:U,value:`${n>=0?\"+\":\"\"}${n.toFixed(1)}%`}}if(e.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let m=e.at(-1)?.rate??0,C=e[0].rate;if(C===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let O=(m-C)/C*100;if(Math.abs(O)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let ae=\"neutral\";return O>0?ae=\"up\":O<0&&(ae=\"down\"),{direction:ae,value:`${O>=0?\"+\":\"\"}${O.toFixed(1)}%`}},[n,e]),M=Ct.useCallback(m=>m===\"standard\"?a(r.filter.conversionType.standard):m===\"subscription\"?a(r.filter.conversionType.subscription):a(r.defaults.all),[]),F=Ct.useMemo(()=>M(l),[l,M]),A=Ct.useMemo(()=>[xt(i,r),bt(s,w,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:l,options:[{value:\"all\",label:a(r.defaults.all)},{value:\"standard\",label:a(r.filter.conversionType.standard)},{value:\"subscription\",label:a(r.filter.conversionType.subscription)}]}],[l,i,s,w]),E=Ct.useCallback((m,C)=>{m===\"dateRange\"?u?.(C):m===\"market\"?y?.(C):m===\"customerType\"&&(h?.(C),T(1))},[h,u,y]),B=Ct.useMemo(()=>l===\"all\"?t:t.filter(m=>m.customerType.toLowerCase()===l),[t,l]),{totalPages:R,pageItems:c}=mt(B,f,P),v=Ct.useMemo(()=>[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:m=>W(hd,{children:m})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},{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:(m,C)=>_(Number(m),C.currencyCode,void 0,2)},{key:\"bv\",label:a(r.fullView.conversionRate.columns.bv),sortable:!0}],[]),D=Ct.useCallback(()=>l===\"standard\"?\"#2e7d32\":l===\"subscription\"?\"#ed6c02\":\"#1976d2\",[l]);return g?Ce(ye,{\"data-testid\":\"conversion-rate-full-view\",children:[W(fe,{title:a(r.defaults.conversionRate),dateRange:xe(i),onBack:b,filters:A,onFilterChange:E}),W(At,{})]}):Ce(ye,{\"data-testid\":\"conversion-rate-full-view\",children:[W(fe,{title:a(r.defaults.conversionRate),dateRange:xe(i),onBack:b,filters:A,onFilterChange:E}),Ce(jr,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[W(Yr,{children:Ce(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"0px\",flexWrap:\"wrap\"},children:[Ce(Jr,{\"data-testid\":\"conversion-rate-value\",style:{marginRight:\"6px\"},children:[k.toFixed(1),\"%\"]}),Ce(Zr,{direction:S.direction,\"data-testid\":\"conversion-rate-trend\",children:[S.direction===\"up\"&&W(hg,{}),S.direction===\"down\"&&W(xg,{}),W(\"span\",{style:{fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:600,fontSize:\"14px\",lineHeight:\"20px\",letterSpacing:\"0em\"},children:S.value}),W(\"span\",{style:{marginLeft:\"2px\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",fontWeight:400,fontSize:\"12px\",lineHeight:\"16px\",letterSpacing:\"0.01em\",color:\"#5F5F5F\"},children:Pt(i)})]})]})}),W(qr,{children:Ce(gd,{children:[W(rd,{\"data-testid\":\"conversion-fullview-chart\",children:W(mg,{width:\"100%\",height:\"100%\",children:Ce(dg,{data:e,margin:{top:10,right:10,left:0,bottom:0},children:[W(gg,{strokeDasharray:\"3 3\"}),W(cg,{dataKey:\"date\"}),W(ug,{tickFormatter:m=>`${m}%`,domain:[0,\"auto\"]}),W(fg,{formatter:m=>typeof m==\"number\"?`${m.toFixed(2)}%`:typeof m==\"string\"?m:a(r.fullView.conversionRate.notAvailable)}),W(pg,{type:\"monotone\",dataKey:\"rate\",stroke:D(),strokeWidth:2,name:`${a(r.defaults.conversionRate)} (${F})`,dot:!1})]})})}),W(fd,{children:W(md,{style:{color:D()},children:`${a(r.defaults.conversionRate)} (${F})`})})]})})]}),Ce(jt,{\"data-testid\":\"conversion-fullview-table-section\",children:[Ce(Gt,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",B.length,\")\"]}),d?W(cd,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:c.map(m=>Ce(ad,{children:[Ce(nd,{children:[Ce(id,{children:[W(ld,{children:m.customerName}),W(sd,{children:m.date})]}),W(dd,{children:m.orderId})]}),Ce(pd,{children:[Ce(oa,{children:[W(ra,{children:a(r.fullView.conversionRate.columns.items)}),W(aa,{children:m.items})]}),Ce(oa,{children:[W(ra,{children:a(r.fullView.conversionRate.columns.total)}),Ce(aa,{children:[\"$\",m.total.toFixed(2)]})]}),Ce(oa,{children:[W(ra,{children:a(r.fullView.conversionRate.columns.totalSv)}),W(aa,{children:m.bv})]})]})]},m.orderId))}):W(ud,{\"data-testid\":\"conversion-fullview-desktop-table\",children:W(it,{columns:v,data:c,getRowKey:m=>m.orderId})}),R>1&&W(st,{currentPage:f,totalPages:R,onPageChange:T,itemsPerPage:P,totalItems:B.length})]})]})};import io,{useState as Cg}from\"react\";import{Box as vg}from\"@mui/material\";import{LineChart as kg,Line as lo,XAxis as Tg,YAxis as Sg,CartesianGrid as Dg,Tooltip as Pg,ResponsiveContainer as Rg}from\"recharts\";import Mg from\"@mui/icons-material/TrendingUp\";import Og from\"@mui/icons-material/TrendingDown\";import{styled as Ft}from\"@mui/material/styles\";import{Box as no,Typography as bg}from\"@mui/material\";import{ColorUtils as yg}from\"@nuskin/foundation-theme\";var{getGenomeColor:wg}=yg,xd=Ft(no)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,bd=Ft(no)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,yd=Ft(no)`\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})=>wg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,wd=Ft(no)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,Cd=Ft(bg)`\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`,vd=Ft(no)`\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`,rr=Ft(no)`\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=Ft(no)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,kd=Ft(\"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 Td,jsx as L,jsxs as Fe}from\"react/jsx-runtime\";var Ae={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function Xt(e){if(typeof e==\"number\")return Number.isFinite(e)?e:0;if(typeof e==\"string\"){let t=Number(e.replace(/,/g,\"\"));return Number.isFinite(t)?t:0}return 0}function Fg(e){if(Array.isArray(e))return e;let t=e;return Array.isArray(t.daily)?t.daily.map(o=>({date:String(o.date??\"\"),total:Xt(o.total),members:Xt(o.members),retail:Xt(o.retail),brandAffiliates:Xt(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var rn=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:s,isLoading:l=!1,onBack:p,onDateRangeChange:g,onMarketChange:x,onSignupViewChange:u})=>{let[y,h]=Cg(1),f=10,T=wt(),P=io.useCallback(()=>p?.(),[p]),d=Ge(s),b=io.useMemo(()=>Fg(e).map(c=>{let v=c,D=Xt(v.members),m=Xt(v.retail),C=Xt(v.brandAffiliates??v.brandAffiliate??v.brand_affiliates??v.brand_affiliate),O=Xt(v.total??v.all??v.signupTotal??v.value);return{...c,total:O>0?O:D+m+C,members:D,retail:m,brandAffiliates:C}}),[e]),w=io.useMemo(()=>{if(b.length===0)return 0;let R=b[b.length-1];return Wt(R,i)},[b,i]),k=io.useMemo(()=>{if(b.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let R=Wt(b[0],i),c=Wt(b[b.length-1],i);if(R<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let v=c-R,D=v/R*100,m=\"neutral\";return D>0?m=\"up\":D<0&&(m=\"down\"),{direction:m,absoluteChange:Math.round(v),percentageChange:`${D>=0?\"+\":\"\"}${D.toFixed(1)}%`}},[b,i,r]),S=b.length>0,M=io.useMemo(()=>[xt(o,r),bt(n,d,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,d,i]),F=io.useCallback((R,c)=>{R===\"dateRange\"?g?.(c):R===\"market\"?x?.(c):R===\"signupView\"&&(u?.(c),h(1))},[g,x,u]),{totalPages:A,pageItems:E}=mt(t,y,f),B=io.useMemo(()=>[{key:\"id\",label:a(r.fullView.signups.columns.id),sortable:!0},{key:\"name\",label:a(r.fullView.signups.columns.name),sortable:!0,render:R=>L(kd,{children:R})},{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 l?Fe(ye,{\"data-testid\":\"signups-full-view\",children:[L(fe,{title:a(r.widget.signups.title),dateRange:xe(o),onBack:P,filters:M,onFilterChange:F}),L(At,{})]}):Fe(ye,{\"data-testid\":\"signups-full-view\",children:[L(fe,{title:a(r.widget.signups.title),dateRange:xe(o),onBack:P,filters:M,onFilterChange:F}),Fe(jr,{\"data-testid\":\"signups-fullview-metric-chart\",children:[Fe(Yr,{children:[L(Jr,{\"data-testid\":\"signups-total\",children:w.toLocaleString()}),Fe(Zr,{direction:k.direction,children:[k.direction===\"up\"&&L(Mg,{}),k.direction===\"down\"&&L(Og,{}),k.direction!==\"neutral\"&&Fe(Td,{children:[Fe(\"span\",{style:{fontWeight:600,lineHeight:1},children:[k.absoluteChange>0?\"+\":\"\",k.absoluteChange]}),L(\"span\",{style:{fontWeight:400,lineHeight:1},children:k.percentageChange})]}),k.direction===\"neutral\"&&L(\"span\",{children:k.percentageChange})]}),L(Cd,{children:Pt(o)})]}),L(qr,{children:S?Fe(vd,{children:[L(wd,{\"data-testid\":\"signups-fullview-chart\",children:L(Rg,{width:\"100%\",height:\"100%\",minHeight:240,children:Fe(kg,{data:b,children:[L(Dg,{strokeDasharray:\"3 3\"}),L(Tg,{dataKey:\"date\"}),L(Sg,{}),L(Pg,{}),i===\"all\"&&Fe(Td,{children:[L(lo,{type:\"monotone\",dataKey:\"total\",stroke:Ae.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),L(lo,{type:\"monotone\",dataKey:\"members\",stroke:Ae.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),L(lo,{type:\"monotone\",dataKey:\"retail\",stroke:Ae.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),L(lo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ae.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&L(lo,{type:\"monotone\",dataKey:\"members\",stroke:Ae.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&L(lo,{type:\"monotone\",dataKey:\"retail\",stroke:Ae.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&L(lo,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ae.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),Fe(vg,{children:[i===\"all\"&&Fe(rr,{children:[L(qt,{style:{color:Ae.total},children:a(r.widget.signups.total)}),L(qt,{style:{color:Ae.members},children:a(r.defaults.members)}),L(qt,{style:{color:Ae.retail},children:a(r.defaults.retail)}),L(qt,{style:{color:Ae.brandAffiliates},children:a(r.defaults.brandAffiliates)})]}),i===\"members\"&&L(rr,{children:L(qt,{style:{color:Ae.members},children:a(r.defaults.members)})}),i===\"retail\"&&L(rr,{children:L(qt,{style:{color:Ae.retail},children:a(r.defaults.retail)})}),i===\"brandAffiliates\"&&L(rr,{children:L(qt,{style:{color:Ae.brandAffiliates},children:a(r.defaults.brandAffiliates)})})]})]}):L(Yt,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),Fe(jt,{\"data-testid\":\"signups-fullview-table-section\",children:[L(Gt,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),T?L(xd,{\"data-testid\":\"signups-fullview-mobile-cards\",children:E.map(R=>Fe(yd,{children:[L(Hs,{children:R.name}),Fe(Ws,{children:[R.date,\" - \",R.type]}),L(_s,{children:R.email}),L(Us,{status:R.status,children:R.status})]},R.id))}):L(bd,{\"data-testid\":\"signups-fullview-desktop-table\",children:L(it,{columns:B,data:E,getRowKey:R=>R.id})}),A>1&&L(st,{currentPage:y,totalPages:A,onPageChange:h,itemsPerPage:f,totalItems:t.length})]})]})};import so,{useState as Ig}from\"react\";import{PieChart as Ng,Pie as $g,Cell as Vg,ResponsiveContainer as Eg,Tooltip as Ag}from\"recharts\";import zg from\"@mui/icons-material/TrendingUp\";import Bg from\"@mui/icons-material/TrendingDown\";import{styled as To,ColorUtils as Lg}from\"@nuskin/foundation-theme\";import{styled as Te}from\"@mui/material/styles\";import{Box as vt,Typography as So}from\"@mui/material\";var{getGenomeColor:an}=Lg,na=To(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Sd=To(\"div\")`\n flex: 1;\n`,Dd=To(\"span\")`\n font-weight: 600;\n`,Pd=To(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Rd=To(\"span\")`\n font-weight: 600;\n`,Md=Te(vt)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>an(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`,Od=Te(vt)`\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`,Fd=Te(vt)`\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`,Ld=Te(So)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Id=Te(So)`\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`,Nd=Te(So)`\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`,$d=Te(vt)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,Vd=Te(vt)`\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})=>an(e,\"N30\")};\n }\n`,ia=Te(vt)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,zy=Te(vt)`\n display: none;\n`,Ed=Te(So)`\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`,Ad=Te(So)`\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`,zd=Te(So)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Bd=Te(vt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,Hd=Te(vt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Wd=Te(vt)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>an(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,_d=Te(\"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`,Ud=To(\"span\")`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;import{jsx as G,jsxs as Pe}from\"react/jsx-runtime\";var nn=({categories:e,dateRange:t,market:o,categorySort:n,summaryChangePct:i,markets:s,isLoading:l=!1,onBack:p,onDateRangeChange:g,onMarketChange:x,onCategorySortChange:u})=>{let[y,h]=Ig(1),f=10,T=wt(),P=so.useCallback(()=>p?.(),[p]),d=Ge(s),b=so.useMemo(()=>[xt(t,r),bt(o,d,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.defaults.byRevenue)},{value:\"trend\",label:a(r.defaults.byTrend)}]}],[n,t,o,d]),w=so.useCallback((C,O)=>{C===\"dateRange\"?g?.(O):C===\"market\"?x?.(O):C===\"sort\"&&(u?.(O),h(1))},[u,g,x]),k=C=>{let{cx:O,cy:ae,midAngle:U,innerRadius:de,outerRadius:Z,percentage:Ue}=C,j=Math.PI/180,me=de+(Z-de)*.45,qe=O+me*Math.cos(-U*j),Xe=ae+me*Math.sin(-U*j);return G(\"text\",{x:qe,y:Xe,fill:\"white\",textAnchor:\"middle\",dominantBaseline:\"middle\",fontSize:\"12\",fontWeight:\"700\",fontFamily:\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",letterSpacing:\"0\",style:{lineHeight:\"14px\",pointerEvents:\"none\"},children:`${Ue}%`})},S=C=>C===\"up\"?G(zg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):C===\"down\"?G(Bg,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,M=C=>{if(!C)return\"neutral\";let O=Number.parseFloat(C);return Number.isNaN(O)?\"neutral\":O>0?\"up\":O<0?\"down\":\"neutral\"},F=so.useMemo(()=>[...e].sort((C,O)=>n===\"revenue\"?O.revenue-C.revenue:(ft(O.trend?.revenue)??-1/0)-(ft(C.trend?.revenue)??-1/0)),[e,n]),{totalRevenue:A,totalRevenueTrendDirection:E,totalRevenueTrend:B}=so.useMemo(()=>{let C=F.reduce((U,de)=>U+de.revenue,0),O,ae;if(i!=null)Math.abs(i)<.1?(ae=\"0%\",O=\"neutral\"):(O=i>0?\"up\":\"down\",ae=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:U,formatted:de}=Ht(F,Z=>Z.revenue,Z=>Z.trend?.revenue);O=U,ae=de}return{totalRevenue:C,totalRevenueTrendDirection:O,totalRevenueTrend:ae}},[F,i]),R=so.useMemo(()=>F.slice(0,5),[F]),{totalPages:c,pageItems:v}=mt(F,y,f),D=so.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:(C,O)=>Pe(na,{children:[G(ia,{dotColor:O.color}),G(Ud,{children:Yo(O.name)})]})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:(C,O)=>_(Number(C),O.currencyCode)},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:C=>`${Number(C)}%`},{key:\"trend\",label:a(r.defaults.trend),render:(C,O)=>O.trend?.revenue??a(r.defaults.noValue)}],[]),m=F[0]?.currencyCode;return l?Pe(ye,{\"data-testid\":\"categories-full-view\",children:[G(fe,{title:a(r.widget.topCategories.title),dateRange:xe(t),onBack:P,filters:b,onFilterChange:w}),G(At,{})]}):e.length===0?Pe(ye,{\"data-testid\":\"categories-full-view\",children:[G(fe,{title:a(r.widget.topCategories.title),dateRange:xe(t),onBack:P,filters:b,onFilterChange:w}),G(Yt,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):Pe(ye,{\"data-testid\":\"categories-full-view\",children:[G(fe,{title:a(r.widget.topCategories.title),dateRange:xe(t),onBack:P,filters:b,onFilterChange:w}),Pe(Md,{\"data-testid\":\"categories-fullview-top-section\",children:[Pe(Od,{\"data-testid\":\"categories-fullview-chart\",children:[G(Eg,{width:\"100%\",height:\"100%\",children:Pe(Ng,{children:[G($g,{data:F,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:k,labelLine:!1,children:F.map(C=>G(Vg,{fill:C.color},`cell-${C.id}`))}),G(Ag,{formatter:C=>_(C,m)})]})}),Pe(Fd,{\"data-testid\":\"categories-fullview-donut-center\",children:[G(Ld,{children:a(r.stats.revenue)}),G(Id,{children:_(A,m)}),Pe(Nd,{direction:E,children:[S(E),G(\"span\",{children:B})]})]})]}),G($d,{\"data-testid\":\"categories-fullview-summary\",children:R.map(C=>Pe(Vd,{children:[G(ia,{dotColor:C.color}),G(Ed,{children:Yo(C.name)}),G(Ad,{children:_(C.revenue,C.currencyCode)}),Pe(zd,{children:[\"(\",C.percentage,\"%)\"]}),C.trend?.revenue?G(_d,{direction:M(C.trend.revenue),children:S(M(C.trend.revenue))}):null]},C.id))})]}),Pe(jt,{\"data-testid\":\"categories-fullview-table-section\",children:[Pe(Gt,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",F.length,\")\"]}),T?G(Hd,{children:v.map(C=>Pe(Wd,{children:[G(ia,{dotColor:C.color}),Pe(Sd,{children:[G(Dd,{children:C.name}),G(Pd,{children:_(C.revenue,C.currencyCode)})]}),Pe(Rd,{children:[C.percentage,\"%\"]})]},C.id))}):G(Bd,{children:G(it,{columns:D,data:v,sortable:!0,getRowKey:C=>C.id})}),c>1&&G(st,{currentPage:y,totalPages:c,onPageChange:h,itemsPerPage:f,totalItems:F.length})]})]})};import Kd from\"react\";function Do(e){Uo(e),Kd.useEffect(()=>(Uo(e),()=>{Uo(void 0)}),[e])}var Hg=({translate:e,children:t})=>(Do(e),t??null);function Wg(){return Kd.useCallback(e=>Be(e),[])}import{jsx as ar}from\"react/jsx-runtime\";var _g=\"shoppingDashboardView\",Ug=[],Kg=[],Gg=[],jg=[],Yg=[],Jg=[];function jd(e){return typeof e==\"object\"&&e!==null}function Zg(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function la(e,t){if(!jd(e))return\"dashboard\";let o=e[t];return Zg(o)?o:\"dashboard\"}function Gd(e,t,o){return{...jd(e)?e:{},[t]:o}}function qg(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Xg=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,categoriesSummaryChangePct:s,orders:l,signups:p,isLoading:g=!1,error:x,shopTitle:u,className:y,translate:h,initialDateRange:f=je,initialMarket:T=\"all\",initialProductSort:P=\"units\",initialSignupView:d=\"all\",initialConversionFilter:b=\"all\",initialCategorySort:w=\"revenue\",markets:k,historyAdapter:S,historyStateKey:M=_g,resetToDashboardOnMount:F=!0,onDateRangeChange:A,onMarketChange:E,onProductSortChange:B,onSignupViewChange:R,onConversionFilterChange:c,onCategorySortChange:v,onViewChange:D,onProductsExport:m,onConversionExport:C,onSignupsExport:O,onCategoriesExport:ae})=>{Do(h);let[U,de]=oe.useState(\"dashboard\"),Z=oe.useRef(!1),[Ue,j]=oe.useState(f),[me,qe]=oe.useState(T),[Xe,Mo]=oe.useState(P),[Oo,ma]=oe.useState(d),[Fo,ha]=oe.useState(b),[Lo,xa]=oe.useState(w),Io=t??Ug,No=o??Kg,$o=n??Gg,lr=i??jg,ba=l??Yg,ya=p??Jg,ge=oe.useCallback(V=>{de(V),D?.(V)},[D]),Vo=oe.useCallback(()=>S?la(S.location?.state,M):typeof window>\"u\"?\"dashboard\":la(window.history.state,M),[S,M]),ze=oe.useCallback((V,Qe)=>{if(S){let dr=Gd(S.location?.state,M,V),wn=qg(S.location,dr);if(Qe===\"replace\"){S.replace(wn);return}S.push(wn);return}if(typeof window>\"u\")return;let ut=Gd(window.history.state,M,V);if(Qe===\"replace\"){window.history.replaceState(ut,\"\");return}window.history.pushState(ut,\"\")},[S,M]);oe.useEffect(()=>{if(F?(ze(\"dashboard\",\"replace\"),Z.current=!1,ge(\"dashboard\")):ge(Vo()),S)return S.listen((Qe,ut)=>{if(ut===\"POP\"){let dr=la(Qe.state,M);Z.current=dr!==\"dashboard\",ge(dr)}});let V=Qe=>{let ut=la(Qe.state,M);Z.current=ut!==\"dashboard\",ge(ut)};return window.addEventListener(\"popstate\",V),()=>{window.removeEventListener(\"popstate\",V)}},[S,M,Vo,F,ge,ze]);let Re=oe.useCallback(V=>{Z.current=!0,ze(V,\"push\"),ge(V)},[ge,ze]),Lt=oe.useCallback(()=>{if(U!==\"dashboard\"&&Z.current){if(S){S.goBack();return}typeof window<\"u\"&&window.history.back();return}Z.current=!1,ze(\"dashboard\",\"replace\"),ge(\"dashboard\")},[U,S,ge,ze]),pt=oe.useCallback(V=>{j(V),A?.(V)},[A]),ct=oe.useCallback(V=>{qe(V),E?.(V)},[E]),Eo=oe.useCallback(V=>{Mo(V),B?.(V)},[B]),Ao=oe.useCallback(V=>{ma(V),R?.(V)},[R]),zo=oe.useCallback(V=>{ha(V),c?.(V)},[c]),sr=oe.useCallback(V=>{xa(V),v?.(V)},[v]),wa=oe.useCallback(()=>{Re(\"products\")},[Re]),Ca=oe.useCallback(()=>{Re(\"conversion-rate\")},[Re]),Y=oe.useCallback(()=>{Re(\"signups\")},[Re]),It=oe.useCallback(()=>{Re(\"categories\")},[Re]);return U===\"products\"?ar(er,{products:Io,dateRange:Ue,market:me,productSort:Xe,markets:k,isLoading:g,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onProductSortChange:Eo}):U===\"conversion-rate\"?ar(or,{conversionData:No,orders:ba,dateRange:Ue,market:me,conversionFilter:Fo,markets:k,isLoading:g,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onConversionFilterChange:zo}):U===\"signups\"?ar(rn,{signupData:$o,signups:ya,dateRange:Ue,market:me,signupView:Oo,markets:k,isLoading:g,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onSignupViewChange:Ao}):U===\"categories\"?ar(nn,{categories:lr,dateRange:Ue,market:me,categorySort:Lo,summaryChangePct:s,markets:k,isLoading:g,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onCategorySortChange:sr}):ar(qa,{stats:e,topProducts:Io,conversionData:No,signupData:$o,categories:lr,categoriesSummaryChangePct:s,isLoading:g,error:x,shopTitle:u,className:y,dateRange:Ue,market:me,productSort:Xe,signupView:Oo,conversionFilter:Fo,categorySort:Lo,markets:k,onDateRangeChange:pt,onMarketChange:ct,onProductSortChange:Eo,onSignupViewChange:Ao,onConversionFilterChange:zo,onCategorySortChange:sr,onProductsTitleClick:wa,onConversionTitleClick:Ca,onSignupsTitleClick:Y,onCategoriesToTitleClick:It,onProductsExport:m,onConversionExport:C,onSignupsExport:O,onCategoriesExport:ae})};import{styled as nr}from\"@nuskin/foundation-theme\";var ln=nr(\"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`,Yd=nr(\"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`,Jd=nr(\"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`,Zd=nr(\"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`,qd=nr(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import sn from\"react\";import{PieChart as Qg,Pie as ef,Cell as tf,ResponsiveContainer as of,Tooltip as rf}from\"recharts\";var I={title:{key:\"productOfferDashboard.title\",fallback:\"Performance Overview\"},error:{key:\"productOfferDashboard.error\",fallback:\"Failed to load dashboard data. Please try again.\"},stats:{revenue:{key:\"productOfferDashboard.stats.revenue\",fallback:\"Total Revenue\"},offersPurchased:{key:\"productOfferDashboard.stats.offersPurchased\",fallback:\"Offers Purchased\"},conversionRate:{key:\"productOfferDashboard.stats.conversionRate\",fallback:\"Conversion Rate\"},trendUp:{key:\"productOfferDashboard.stats.trendUp\",fallback:\"Trending up\"},trendDown:{key:\"productOfferDashboard.stats.trendDown\",fallback:\"Trending down\"},trendNeutral:{key:\"productOfferDashboard.stats.trendNeutral\",fallback:\"No change\"},comparedTo:{key:\"productOfferDashboard.stats.comparedTo\",fallback:\"compared to this time last month\"}},filter:{dateRange:{label:{key:\"productOfferDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"productOfferDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"productOfferDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"productOfferDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"productOfferDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},market:{label:{key:\"productOfferDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"productOfferDashboard.filter.market.all\",fallback:\"All Markets\"}},offerSort:{byRevenue:{key:\"productOfferDashboard.filter.offerSort.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.filter.offerSort.byUnits\",fallback:\"Units\"}},productSort:{byUnits:{key:\"productOfferDashboard.filter.productSort.byUnits\",fallback:\"Units\"},byRevenue:{key:\"productOfferDashboard.filter.productSort.byRevenue\",fallback:\"Revenue\"},byVolume:{key:\"productOfferDashboard.filter.productSort.byVolume\",fallback:\"Volume\"}},conversionFilter:{overall:{key:\"productOfferDashboard.filter.conversionFilter.overall\",fallback:\"Overall\"}}},widget:{topProducts:{title:{key:\"productOfferDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},emptyState:{key:\"productOfferDashboard.widget.topProducts.emptyState\",fallback:\"No products data available\"}},conversionRate:{title:{key:\"productOfferDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},subtitle:{key:\"productOfferDashboard.widget.conversionRate.subtitle\",fallback:\"Orders \\xF7 Site visits\"}},topPerformingOffers:{title:{key:\"productOfferDashboard.widget.topPerformingOffers.title\",fallback:\"Top Performing Offers\"},totalRevenue:{key:\"productOfferDashboard.widget.topPerformingOffers.totalRevenue\",fallback:\"Total revenue\"},emptyState:{key:\"productOfferDashboard.widget.topPerformingOffers.emptyState\",fallback:\"No offers data available\"}},menu:{fullView:{key:\"productOfferDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{back:{key:\"productOfferDashboard.navigation.back\",fallback:\"Back to Dashboard\"}},ariaLabel:{dashboard:{key:\"productOfferDashboard.ariaLabel.dashboard\",fallback:\"Product Offer Performance Dashboard\"},statsCard:{key:\"productOfferDashboard.ariaLabel.statsCard\",fallback:\"Performance metric\"},conversionChart:{key:\"productOfferDashboard.ariaLabel.conversionChart\",fallback:\"Conversion rate chart\"},topProducts:{key:\"productOfferDashboard.ariaLabel.topProducts\",fallback:\"Top selling products\"},topOffers:{key:\"productOfferDashboard.ariaLabel.topOffers\",fallback:\"Top performing offers chart\"},widgetMenu:{key:\"productOfferDashboard.ariaLabel.widgetMenu\",fallback:\"Widget options menu\"},filterDateRange:{key:\"productOfferDashboard.ariaLabel.filterDateRange\",fallback:\"Filter by date range\"},filterMarket:{key:\"productOfferDashboard.ariaLabel.filterMarket\",fallback:\"Filter by market\"},backButton:{key:\"productOfferDashboard.ariaLabel.backButton\",fallback:\"Back to dashboard overview\"}},fullView:{topOffers:{title:{key:\"productOfferDashboard.fullView.topOffers.title\",fallback:\"Top Performing Offers\"},columnName:{key:\"productOfferDashboard.fullView.topOffers.columnName\",fallback:\"Offer Name\"},columnRevenue:{key:\"productOfferDashboard.fullView.topOffers.columnRevenue\",fallback:\"Revenue\"},columnPercentage:{key:\"productOfferDashboard.fullView.topOffers.columnPercentage\",fallback:\"Share\"},columnTrend:{key:\"productOfferDashboard.fullView.topOffers.columnTrend\",fallback:\"Trend\"}}},defaults:{trendZero:{key:\"productOfferDashboard.defaults.trendZero\",fallback:\"+0%\"},noData:{key:\"productOfferDashboard.defaults.noData\",fallback:\"--\"},byRevenue:{key:\"productOfferDashboard.defaults.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.defaults.byUnits\",fallback:\"Units\"},byVolume:{key:\"productOfferDashboard.defaults.byVolume\",fallback:\"Volume\"}}};function $(e){return Be(e)}import{jsx as le,jsxs as Ze}from\"react/jsx-runtime\";var af=({offers:e,offerSort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s,onExport:l})=>{let p=sn.useCallback(f=>{let T=f.target.value;i?.(T)},[i]),{sortedOffers:g,totalRevenue:x,trendDirection:u,formattedTrend:y}=sn.useMemo(()=>{let f=[...e].sort((b,w)=>t===\"revenue\"?w.revenue-b.revenue:w.percentage-b.percentage),T=f.reduce((b,w)=>b+w.revenue,0),{direction:P,formatted:d}=Ht(f,b=>b.revenue,b=>b.trend?.revenue);return{sortedOffers:f,totalRevenue:T,trendDirection:P,formattedTrend:d}},[e,t]),h=g[0]?.currencyCode;return o&&e.length===0?le(Ut,{\"data-testid\":\"widget-top-offers\",children:le(Cr,{})}):e.length===0?Ze(Ut,{\"data-testid\":\"widget-top-offers\",children:[le(Co,{children:le(vo,{children:n??$(I.widget.topPerformingOffers.title)})}),le(Br,{\"data-testid\":\"top-offers-empty-state\",children:le(Hr,{children:$(I.widget.topPerformingOffers.emptyState)})})]}):Ze(Ut,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":$(I.ariaLabel.topOffers),children:[Ze(Co,{children:[le(vo,{as:\"button\",onClick:s,\"aria-label\":$(I.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??$(I.widget.topPerformingOffers.title)}),Ze(Dr,{children:[Ze(Pr,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:p,disabled:o,\"aria-label\":$(I.ariaLabel.topOffers),children:[le(\"option\",{value:\"revenue\",children:$(I.defaults.byRevenue)}),le(\"option\",{value:\"units\",children:$(I.defaults.byUnits)})]}),le(rt,{widgetId:\"top-offers\",onFullView:s,onExport:l})]})]}),Ze(Rr,{children:[Ze(Mr,{\"data-testid\":\"top-offers-chart\",children:[le(of,{width:\"100%\",height:\"100%\",children:Ze(Qg,{children:[le(ef,{data:g,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:g.map(f=>le(tf,{fill:f.color},`cell-${f.id}`))}),le(rf,{formatter:f=>_(f,h)})]})}),Ze(Or,{\"data-testid\":\"top-offers-donut-center\",children:[le(Fr,{children:$(I.widget.topPerformingOffers.totalRevenue)}),le(Lr,{children:_(x,h)}),le(Ir,{direction:u,children:y})]})]}),le(Nr,{\"data-testid\":\"top-offers-legend-container\",children:g.map((f,T)=>{let P=Bt(f.trend?.revenue);return Ze($r,{\"data-testid\":`offer-legend-${T}`,children:[le(Vr,{color:f.color}),Ze(Er,{children:[le(Ar,{children:Yo(f.name)}),le(zr,{children:_(f.revenue,f.currencyCode)})]}),Ze(us,{children:[f.percentage,\"%\"]}),f.trend?.revenue?le(ms,{direction:P,\"data-testid\":`offer-legend-trend-${T}`,\"aria-label\":f.trend.revenue,children:ot(P)}):null]},f.id)})})]})]})},sa=sn.memo(af);sa.displayName=\"TopPerformingOffersPieChart\";import ep from\"react\";var nf=/[\\\\/?*[\\]:]/g;function Xd(e){let t=e.trim(),o=t.length>0?t:\"export\";return o.toLowerCase().endsWith(\".xlsx\")?o:`${o}.xlsx`}function Qd(e){let t=e.replace(nf,\" \").trim();return(t.length>0?t:\"Export\").slice(0,31)}async function da({rows:e,columns:t,fileName:o,sheetName:n}){let{Workbook:i}=await import(\"exceljs\"),s=new i,l=s.addWorksheet(Qd(n));l.columns=t.map(g=>({header:g.header,key:g.header})),e.forEach(g=>{let x={};t.forEach(u=>{x[u.header]=u.value(g)??\"\"}),l.addRow(x)});let p=await s.xlsx.writeBuffer();lf(p,Xd(o))}function lf(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,i.click(),URL.revokeObjectURL(n)}var sf=[{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}],df=[{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}];function dn(e){return da({rows:e,columns:sf,fileName:\"top-selling-products\",sheetName:\"Top Selling Products\"})}function pn(e){return da({rows:e,columns:df,fileName:\"top-performing-offers\",sheetName:\"Top Performing Offers\"})}function cn({topProducts:e,topOffers:t,topProductsExportData:o,topOffersExportData:n,showTopProductsExportOption:i=!0,showTopOffersExportOption:s=!0,isLoading:l=!1}){let p=o??e,g=n??t,x=i&&!l&&p.length>0,u=s&&!l&&g.length>0,y=ep.useCallback(()=>dn(p),[p]),h=ep.useCallback(()=>pn(g),[g]);return{onTopProductsExport:x?y:void 0,onTopOffersExport:u?h:void 0}}import{jsx as po,jsxs as Po}from\"react/jsx-runtime\";var pf=[],cf=[],uf=[],un=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:l,className:p,dateRange:g=je,market:x=\"all\",productSort:u=\"units\",conversionFilter:y=\"all\",offerSort:h=\"revenue\",conversionSummaryRate:f,conversionSummaryChangePct:T,topProductsExportData:P,topOffersExportData:d,showTopProductsExportOption:b=!0,showTopOffersExportOption:w=!0,markets:k,onDateRangeChange:S,onMarketChange:M,onProductSortChange:F,onConversionFilterChange:A,onOfferSortChange:E,onProductsTitleClick:B,onConversionTitleClick:R,onOffersTitleClick:c})=>{let v=t??pf,D=o??cf,m=n??uf,{onTopProductsExport:C,onTopOffersExport:O}=cn({topProducts:v,topOffers:m,topProductsExportData:P,topOffersExportData:d,showTopProductsExportOption:b,showTopOffersExportOption:w,isLoading:i}),ae=U=>U?U.startsWith(\"+\")&&U!==\"+0%\"?\"up\":U.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return s?po(ln,{as:\"main\",className:p,\"aria-label\":$(I.ariaLabel.dashboard),children:Po(qd,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Po(\"strong\",{children:[$(I.error),\":\"]}),\" \",s]})}):Po(ln,{as:\"main\",className:p,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":$(I.ariaLabel.dashboard),\"aria-busy\":i,children:[po(Ko,{shopTitle:l??$(I.title),dateRange:g,market:x,isLoading:i,markets:k,stats:e?{shopTitle:e.shopTitle??\"\",dateRange:e.dateRange,selectedMarket:e.selectedMarket,metrics:{revenue:e.metrics.revenue,volume:\"\",siteVisits:\"\",conversionRate:e.metrics.conversionRate},trend:{}}:void 0,onDateRangeChange:S,onMarketChange:M}),Po(Yd,{\"data-testid\":\"top-charts-row\",children:[po(bo,{conversionData:D,conversionFilter:y,dateRange:g,isLoading:i,summaryRate:f,summaryChangePct:T,onFilterChange:A,onTitleClick:R}),Po(Jd,{\"data-testid\":\"stats-card-stack\",children:[po(Dt,{layout:\"split\",title:$(I.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:ae(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:$(I.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),po(Dt,{layout:\"split\",title:$(I.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:ae(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:$(I.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Po(Zd,{\"data-testid\":\"bottom-charts-row\",children:[po(xo,{products:v,productSort:u,isLoading:i,maxProducts:5,onSortChange:F,onTitleClick:B,onExport:C}),po(sa,{offers:m,offerSort:h,isLoading:i,onSortChange:E,onTitleClick:c,onExport:O})]})]})};import ue from\"react\";import co,{useState as ff}from\"react\";import{PieChart as mf,Pie as hf,Cell as xf,ResponsiveContainer as bf,Tooltip as yf}from\"recharts\";import{styled as q}from\"@mui/material/styles\";import{Box as Le,Typography as kt}from\"@mui/material\";import{ColorUtils as gf}from\"@nuskin/foundation-theme\";var{getGenomeColor:gn}=gf,tp=q(Le)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>gn(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`,op=q(Le)`\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`,rp=q(Le)`\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`,ap=q(kt)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,np=q(kt)`\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`,ip=q(kt)`\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`,lp=q(Le)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,sp=q(Le)`\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})=>gn(e,\"N30\")};\n }\n`,pa=q(Le)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,dp=q(Le)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,pp=q(kt)`\n font-size: 0.875rem;\n font-weight: 500;\n`,cp=q(kt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,up=q(kt)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,gp=q(Le)`\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`,fp=q(Le)`\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`,mp=q(Le)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,hp=q(Le)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,xp=q(Le)`\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`,bp=q(Le)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,yp=q(kt)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,wp=q(Le)`\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`,ca=q(Le)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,ua=q(kt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,fn=q(kt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Cp=q(kt)`\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 wf,jsx as H,jsxs as se}from\"react/jsx-runtime\";var mn=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:s=!1,onBack:l,onDateRangeChange:p,onMarketChange:g,onOfferSortChange:x})=>{let[u,y]=ff(1),h=10,f=wt(),T=co.useCallback(()=>l?.(),[l]),P=Ge(i),d=co.useMemo(()=>[xt(t,I),bt(o,P,I),{key:\"sort\",label:$(I.defaults.byRevenue),value:n,options:[{value:\"revenue\",label:$(I.defaults.byRevenue)},{value:\"units\",label:$(I.defaults.byUnits)}]}],[t,o,P,n]),b=co.useCallback((c,v)=>{c===\"dateRange\"?p?.(v):c===\"market\"?g?.(v):c===\"sort\"&&(x?.(v),y(1))},[x,p,g]),w=co.useMemo(()=>[...e].sort((c,v)=>n===\"revenue\"?v.revenue-c.revenue:v.percentage-c.percentage),[e,n]),{totalRevenue:k,totalRevenueTrendDirection:S,totalRevenueTrend:M}=co.useMemo(()=>{let c=w.reduce((m,C)=>m+C.revenue,0),{direction:v,formatted:D}=Ht(w,m=>m.revenue,m=>m.trend?.revenue);return{totalRevenue:c,totalRevenueTrendDirection:v,totalRevenueTrend:D}},[w]),F=co.useMemo(()=>w.slice(0,5),[w]),{totalPages:A,pageItems:E}=mt(w,u,h),B=co.useMemo(()=>[{key:\"name\",label:$(I.fullView.topOffers.columnName),sortable:!0,render:(c,v)=>se(na,{children:[H(pa,{dotColor:v.color}),H(\"span\",{children:v.name})]})},{key:\"revenue\",label:$(I.fullView.topOffers.columnRevenue),sortable:!0,render:(c,v)=>_(Number(c),v.currencyCode)},{key:\"percentage\",label:$(I.fullView.topOffers.columnPercentage),sortable:!0,render:c=>`${Number(c)}%`},{key:\"trend\",label:$(I.fullView.topOffers.columnTrend),render:(c,v)=>{if(!v.trend?.revenue)return $(I.defaults.noData);let D=Bt(v.trend.revenue);return se(fp,{direction:D,children:[ot(D),H(\"span\",{children:v.trend.revenue})]})}}],[]),R=w[0]?.currencyCode;return s?se(ye,{\"data-testid\":\"top-offers-full-view\",children:[H(fe,{title:$(I.fullView.topOffers.title),dateRange:xe(t),onBack:T,filters:d,onFilterChange:b}),H(At,{})]}):e.length===0?se(ye,{\"data-testid\":\"top-offers-full-view\",children:[H(fe,{title:$(I.fullView.topOffers.title),dateRange:xe(t),onBack:T,filters:d,onFilterChange:b}),H(Yt,{\"data-testid\":\"top-offers-fullview-empty\",children:$(I.widget.topPerformingOffers.emptyState)})]}):se(ye,{\"data-testid\":\"top-offers-full-view\",children:[H(fe,{title:$(I.fullView.topOffers.title),dateRange:xe(t),onBack:T,filters:d,onFilterChange:b}),se(tp,{\"data-testid\":\"top-offers-fullview-top-section\",children:[se(op,{\"data-testid\":\"top-offers-fullview-chart\",children:[H(bf,{width:\"100%\",height:\"100%\",children:se(mf,{children:[H(hf,{data:w,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:w.map(c=>H(xf,{fill:c.color},`cell-${c.id}`))}),H(yf,{formatter:c=>_(c,R)})]})}),se(rp,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[H(ap,{children:$(I.widget.topPerformingOffers.totalRevenue)}),H(np,{children:_(k,R)}),H(ip,{direction:S,children:M})]})]}),H(lp,{\"data-testid\":\"top-offers-fullview-summary\",children:F.map(c=>{let v=Bt(c.trend?.revenue);return se(sp,{children:[H(pa,{dotColor:c.color}),se(dp,{children:[H(pp,{children:c.name}),H(cp,{children:_(c.revenue,c.currencyCode)})]}),se(up,{children:[c.percentage,\"%\"]}),c.trend?.revenue?H(gp,{direction:v,\"aria-label\":c.trend.revenue,children:ot(v)}):null]},c.id)})})]}),se(jt,{\"data-testid\":\"top-offers-table\",children:[se(Gt,{\"data-testid\":\"top-offers-fullview-table-title\",children:[$(I.fullView.topOffers.title),\" (\",w.length,\")\"]}),f?H(hp,{children:E.map(c=>{let v=ft(c.trend?.revenue),D=\"neutral\";return v!==null&&v>0?D=\"up\":v!==null&&v<0&&(D=\"down\"),se(xp,{children:[se(bp,{children:[H(pa,{dotColor:c.color}),H(yp,{children:c.name})]}),se(wp,{children:[se(ca,{children:[H(ua,{children:$(I.fullView.topOffers.columnRevenue)}),H(fn,{children:_(c.revenue,c.currencyCode)})]}),se(ca,{children:[H(ua,{children:$(I.fullView.topOffers.columnPercentage)}),se(fn,{children:[c.percentage,\"%\"]})]}),se(ca,{children:[H(ua,{children:$(I.fullView.topOffers.columnTrend)}),H(Cp,{direction:D,children:c.trend?.revenue?se(wf,{children:[ot(D),H(\"span\",{children:c.trend.revenue})]}):$(I.defaults.noData)})]})]})]},c.id)})}):H(mp,{children:H(it,{columns:B,data:E,sortable:!0,getRowKey:c=>c.id})}),A>1&&H(st,{currentPage:u,totalPages:A,onPageChange:y,itemsPerPage:h,totalItems:w.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as fa}from\"react/jsx-runtime\";var Cf=\"productOfferDashboardView\",vf=[],kf=[],Tf=[],Sf=[];function kp(e){return typeof e==\"object\"&&e!==null}function Df(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function ga(e,t){if(!kp(e))return\"dashboard\";let o=e[t];return Df(o)?o:\"dashboard\"}function vp(e,t,o){return{...kp(e)?e:{},[t]:o}}function Pf(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Rf=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:l,className:p,allProducts:g,orders:x,allOffers:u,conversionSummaryRate:y,conversionSummaryChangePct:h,conversionFullViewData:f,conversionFullViewRate:T,conversionFullViewChangePct:P,topProductsExportData:d,topOffersExportData:b,showTopProductsExportOption:w=!0,showTopOffersExportOption:k=!0,initialDateRange:S=je,initialMarket:M=\"all\",initialProductSort:F=\"units\",initialConversionFilter:A=\"all\",initialOfferSort:E=\"revenue\",markets:B,translate:R,historyAdapter:c,historyStateKey:v=Cf,resetToDashboardOnMount:D=!0,onDateRangeChange:m,onMarketChange:C,onProductSortChange:O,onConversionFilterChange:ae,onOfferSortChange:U,onViewChange:de})=>{Do(R);let[Z,Ue]=ue.useState(\"dashboard\"),j=ue.useRef(!1),[me,qe]=ue.useState(S),[Xe,Mo]=ue.useState(M),[Oo,ma]=ue.useState(F),[Fo,ha]=ue.useState(A),[Lo,xa]=ue.useState(E),Io=t??vf,No=o??kf,$o=n??Tf,lr=g??Io,ba=x??Sf,ya=u??$o,ge=ue.useCallback(Y=>{Ue(Y),de?.(Y)},[de]),Vo=ue.useCallback(()=>c?ga(c.location?.state,v):typeof window>\"u\"?\"dashboard\":ga(window.history.state,v),[c,v]),ze=ue.useCallback((Y,It)=>{if(c){let Qe=vp(c.location?.state,v,Y),ut=Pf(c.location,Qe);if(It===\"replace\"){c.replace(ut);return}c.push(ut);return}if(typeof window>\"u\")return;let V=vp(window.history.state,v,Y);if(It===\"replace\"){window.history.replaceState(V,\"\");return}window.history.pushState(V,\"\")},[c,v]);ue.useEffect(()=>{if(D?(ze(\"dashboard\",\"replace\"),j.current=!1,ge(\"dashboard\")):ge(Vo()),c)return c.listen((It,V)=>{if(V===\"POP\"){let Qe=ga(It.state,v);j.current=Qe!==\"dashboard\",ge(Qe)}});let Y=It=>{let V=ga(It.state,v);j.current=V!==\"dashboard\",ge(V)};return window.addEventListener(\"popstate\",Y),()=>{window.removeEventListener(\"popstate\",Y)}},[c,v,Vo,D,ge,ze]);let Re=ue.useCallback(Y=>{j.current=!0,ze(Y,\"push\"),ge(Y)},[ge,ze]),Lt=ue.useCallback(()=>{if(Z!==\"dashboard\"&&j.current){if(c){c.goBack();return}typeof window<\"u\"&&window.history.back();return}j.current=!1,ze(\"dashboard\",\"replace\"),ge(\"dashboard\")},[Z,c,ge,ze]),pt=ue.useCallback(Y=>{qe(Y),m?.(Y)},[m]),ct=ue.useCallback(Y=>{Mo(Y),C?.(Y)},[C]),Eo=ue.useCallback(Y=>{ma(Y),O?.(Y)},[O]),Ao=ue.useCallback(Y=>{ha(Y),ae?.(Y)},[ae]),zo=ue.useCallback(Y=>{xa(Y),U?.(Y)},[U]),sr=ue.useCallback(()=>{Re(\"products\")},[Re]),wa=ue.useCallback(()=>{Re(\"conversion-rate\")},[Re]),Ca=ue.useCallback(()=>{Re(\"top-offers\")},[Re]);return Z===\"products\"?fa(er,{products:lr,dateRange:me,market:Xe,productSort:Oo,markets:B,isLoading:i,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onProductSortChange:Eo}):Z===\"conversion-rate\"?fa(or,{conversionData:f??No,orders:ba,summaryRate:T??y,summaryChangePct:P??h,dateRange:me,market:Xe,conversionFilter:Fo,markets:B,isLoading:i,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onConversionFilterChange:Ao}):Z===\"top-offers\"?fa(mn,{offers:ya,dateRange:me,market:Xe,offerSort:Lo,markets:B,isLoading:i,onBack:Lt,onDateRangeChange:pt,onMarketChange:ct,onOfferSortChange:zo}):fa(un,{stats:e,topProducts:Io,conversionData:No,topOffers:$o,isLoading:i,error:s,dashboardTitle:l,className:p,dateRange:me,market:Xe,productSort:Oo,conversionFilter:Fo,offerSort:Lo,conversionSummaryRate:y,conversionSummaryChangePct:h,topProductsExportData:d,topOffersExportData:b,showTopProductsExportOption:w,showTopOffersExportOption:k,markets:B,onDateRangeChange:pt,onMarketChange:ct,onProductSortChange:Eo,onConversionFilterChange:Ao,onOfferSortChange:zo,onProductsTitleClick:sr,onConversionTitleClick:wa,onOffersTitleClick:Ca})};import{ColorUtils as Mf,styled as hn}from\"@nuskin/foundation-theme\";var{getGenomeColor:uo}=Mf,Tp=hn(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,Sp=hn(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>uo(e,\"N20\")};\n border: 1px solid ${({theme:e})=>uo(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>uo(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>uo(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>uo(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>uo(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,Dp=hn(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>uo(e,\"N70\")};\n`;import{jsx as xn,jsxs as Ff}from\"react/jsx-runtime\";var Of=({filters:e,onChange:t})=>xn(Tp,{\"data-testid\":\"filter-bar\",children:e.map(o=>Ff(Dp,{htmlFor:`filter-${o.key}`,children:[o.label,xn(Sp,{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=>xn(\"option\",{value:n.value,children:n.label},n.value))})]},o.key))});var Pp={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%\"}},bn=[{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%\"}}],ir=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}}),Lf=ir.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7)})),If=ir.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3)})),Rp=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");o.setDate(o.getDate()+t);let n=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],i=80+t*11%40,s=Math.floor(i*.4),l=Math.floor(i*.35),p=i-s-l;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:s,retail:l,brandAffiliates:p}}),Mp=[{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%\"}}],yn=Array.from({length:50},(e,t)=>{let o=[\"Sarah\",\"John\",\"Emma\",\"Michael\",\"Olivia\",\"William\",\"Ava\",\"James\"],n=[\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Garcia\",\"Miller\",\"Davis\"],i=new Date(\"2026-03-31\");return i.setDate(i.getDate()-t%30),{orderId:`ORD-${String(1e4+t).padStart(5,\"0\")}`,date:i.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),customerName:`${o[t%o.length]} ${n[t%n.length]}`,customerType:t%3===0?\"Subscription\":\"Standard\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),Op=Array.from({length:30},(e,t)=>{let o=[\"Alice\",\"Bob\",\"Carol\",\"David\",\"Eva\",\"Frank\",\"Grace\",\"Henry\"],n=[\"Anderson\",\"Baker\",\"Clark\",\"Davis\",\"Evans\",\"Fisher\",\"Grant\",\"Hall\"],i=[\"Member\",\"Retail\",\"Brand Affiliate\"],s=new Date(\"2026-03-31\");return s.setDate(s.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:s.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),type:i[t%i.length],email:`${o[t%o.length].toLowerCase()}.${n[t%n.length].toLowerCase()}@example.com`,status:t%4===0?\"Pending\":\"Active\"}});var Ro={shopTitle:\"Performance Overview\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$5,208\",offersPurchased:\"285\",conversionRate:\"4.2%\"},trend:{revenue:\"+2.3%\",offersPurchased:\"+3.7%\"}},NC={...Ro,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},$C={...Ro,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},VC={...Ro,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},EC={...Ro,metrics:{...Ro.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},Nf=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,percentage:29,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,percentage:27,color:\"#E8915A\",trend:{revenue:\"+3.1%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,percentage:22,color:\"#C75B5B\",trend:{revenue:\"-1.5%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,percentage:16,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,percentage:6,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\"}}];export{nn as CategoriesFullView,bo as ConversionRateChart,or as ConversionRateFullView,Xl as DATE_RANGE_LABELS,ql as DAYS_MAP,Ko as DashboardHeader,it as DataTable,Of as FilterBar,Xg as MysiteDashboardWithNavigation,ki as MysiteHero,Sa as NsCategoryNavigation,Ta as NsProductCard,fe as PageHeader,st as Pagination,Rf as PoDashboardWithNavigation,pr as ProductCarousel,un as ProductOfferDashboard,I as ProductOfferDashboardTranslationKeys,nc as ProductTabCarousel,er as ProductsFullView,qa as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,Sr as SignupsChart,rn as SignupsFullView,Dt as StatsCard,Wr as TopCategoriesPieChart,mn as TopPerformingOffersFullView,sa as TopPerformingOffersPieChart,xo as TopSellingProductsList,Hg as TranslationProvider,rt as WidgetMenu,$i as buildDefaultMarketOptions,_c as calculatePercentage,hl as calculateTotalPages,da as exportRowsToExcel,pn as exportTopPerformingOffers,dn as exportTopProducts,es as formatDateRange,lu as formatDateRangeLabel,ja as formatDisplayDate,Ya as formatISODate,Ql as formatShortDate,Pt as getComparedToText,Ga as getDateRangeLabel,iu as getDaysFromDateRange,a as getTranslation,wc as getTranslationResolver,Hc as getTrendColor,ot as getTrendIcon,Mp as mockCategories,ir as mockConversionData,yn as mockOrders,Ro as mockProductOfferStats,Rp as mockSignupData,Op as mockSignupDetails,Pp as mockStats,Nf as mockTopOffers,bn as mockTopProducts,Xd as normalizeExcelFileName,Qd as normalizeExcelSheetName,xl as paginateItems,Vi as resolveMarketOptions,Be as resolveTranslation,Uo as setTranslationResolver,Wc as sortByNumericProperty,cn as useProductOfferWidgetExports,Wg as useTranslation,Do as useTranslationResolver};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import React, { ReactElement, useState } from 'react';\nimport { NsImage } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport {\n PriceComponent,\n ProductCardContainer,\n ImageContainer,\n DefaultImage,\n ProductTitle,\n ProductBadgeContainer,\n AddToCartButton,\n CartIcon,\n} from './styles/NsProductCard.Styled';\nimport { useMediaQuery } from '@mui/material';\nimport { NsCardButton } from './types';\n\ntype NsProductCardProps = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly className?: string;\n readonly button?: NsCardButton & { disabled?: boolean };\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSellerBadge?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n readonly testId?: string;\n};\n\nconst NsProductCard = ({\n productTitle,\n imageDetails,\n className,\n button,\n onCardClick,\n productStatusBadge,\n directSellerBadge,\n mySitePriceComponent,\n testId,\n}: NsProductCardProps): ReactElement => {\n const [isButtonHovered, setIsButtonHovered] = useState(false);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const handleImageError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n const target = e.target as HTMLImageElement;\n const noImageFallback = imageDetails?.fallbackImage;\n if (noImageFallback && target.src !== noImageFallback) {\n target.src = noImageFallback;\n }\n };\n\n return (\n <ProductCardContainer\n className={className}\n onClick={onCardClick}\n tabIndex={0}\n data-testid=\"product-card\"\n isMobile={isMobile}\n >\n <ImageContainer bgColor={imageDetails?.bgColor} onError={handleImageError}>\n {imageDetails?.imageSrc ? (\n <NsImage\n data-testid={testId ?? 'test-product-image'}\n className={imageDetails.className ?? ''}\n src={imageDetails.imageSrc}\n alt={imageDetails.imageAlt}\n aria-label={imageDetails.areaLabel ?? imageDetails.imageAlt}\n width={'100%'}\n />\n ) : (\n <DefaultImage alt=\"\" />\n )}\n </ImageContainer>\n <ProductTitle title={productTitle} data-testid=\"product-title\">\n {productTitle}\n </ProductTitle>\n {directSellerBadge && <ProductBadgeContainer>{directSellerBadge}</ProductBadgeContainer>}\n <ProductBadgeContainer>{productStatusBadge}</ProductBadgeContainer>\n <PriceComponent>{mySitePriceComponent}</PriceComponent>\n {button?.showButton && (\n <AddToCartButton\n tabIndex={0}\n aria-roledescription=\":\"\n aria-label={button.buttonText || 'ADD TO CART'}\n data-testid=\"add-to-cart-button\"\n disabled={button?.disabled ?? false}\n isMobile={isMobile}\n isHovered={isButtonHovered}\n onClick={(e) => {\n e.stopPropagation();\n if (!button?.disabled) {\n button.onClick?.();\n }\n }}\n onMouseEnter={() => {\n if (!isMobile && !button?.disabled) {\n setIsButtonHovered(true);\n }\n }}\n onMouseLeave={() => {\n if (!isMobile) {\n setIsButtonHovered(false);\n }\n }}\n >\n <CartIcon className=\"cart-icon\" disabled={button?.disabled}>\n <svg width=\"24\" height=\"22\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 1.86358C0 1.26109 0.488416 0.772675 1.09091 0.772675H3.48173C4.51054 0.772675 5.39955 1.49136 5.61511 2.49733L5.71309 2.95456H22.9091C23.245 2.95456 23.5622 3.10933 23.7689 3.37411C23.9757 3.63889 24.0489 3.98415 23.9674 4.31005L22.4053 10.5583C21.9197 12.5009 20.1743 13.8636 18.172 13.8636H8.05068L8.28444 14.9546H20.7273C21.3298 14.9546 21.8182 15.443 21.8182 16.0455C21.8182 16.648 21.3298 17.1364 20.7273 17.1364H19.6364H8.18182H7.40252C6.88811 17.1364 6.4436 16.777 6.33582 16.274L3.76449 4.27405L3.48173 2.95449H1.09091C0.488416 2.95449 0 2.46608 0 1.86358ZM8.18182 17.1364C6.97683 17.1364 6 18.1132 6 19.3182C6 20.5232 6.97683 21.5 8.18182 21.5C9.3868 21.5 10.3636 20.5232 10.3636 19.3182C10.3636 18.1132 9.3868 17.1364 8.18182 17.1364ZM19.6364 17.1364C18.4314 17.1364 17.4545 18.1132 17.4545 19.3182C17.4545 20.5232 18.4314 21.5 19.6364 21.5C20.8413 21.5 21.8182 20.5232 21.8182 19.3182C21.8182 18.1132 20.8413 17.1364 19.6364 17.1364ZM7.58317 11.6818H18.172C19.1732 11.6818 20.0459 11.0005 20.2887 10.0292L21.5119 5.13638H6.18062L7.58317 11.6818Z\"\n fill={button?.disabled ? '#999' : '#ffffff'}\n />\n </svg>\n </CartIcon>\n {button.buttonText || 'ADD TO CART'}\n </AddToCartButton>\n )}\n </ProductCardContainer>\n );\n};\n\nexport default NsProductCard;\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PriceComponent = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`;\n\nexport const ProductCardContainer = styled('button')<{ isMobile: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n width: 240px;\n height: ${(props) => (props.isMobile ? '410px' : '513px')};\n overflow: hidden;\n cursor: pointer;\n border: 1px solid #ededed;\n background: var(--color-primary-n-10-primary-white, #fff);\n`;\n\nexport const ImageContainer = styled('div')<{\n bgColor?: string;\n}>`\n width: '240px';\n height: '240px';\n background: ${(props) => props.bgColor ?? '#f5f5f5'};\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 0;\n display: flex;\n align-items: normal;\n justify-content: center;\n position: relative;\n @media (max-width: 560px) {\n width: 200px;\n height: 200px;\n align-items: unset;\n }\n`;\n\nexport const DefaultImage = styled('img')`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`;\n\nexport const ProductTitle = styled('div')`\n width: 200px;\n margin-top: 16px;\n max-height: 66px;\n text-align: left;\n font-size: 16px;\n font-family: 'Inter', sans-serif;\n font-weight: 400;\n line-height: 22px;\n overflow: hidden;\n color: #666;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n @media (max-width: 560px) {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n margin-top: 5px;\n max-height: 54px;\n line-height: 18px;\n }\n`;\n\nexport const ProductBadgeContainer = styled('div')`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`;\n\nexport const AddToCartButton = styled('button')<{\n disabled?: boolean;\n isMobile: boolean;\n isHovered: boolean;\n}>`\n width: 200px;\n height: 40px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0.14px;\n text-transform: none;\n justify-content: flex-start;\n padding-left: 31px;\n overflow: hidden;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n text-overflow: ellipsis;\n margin-top: 8px;\n margin-bottom: 10px;\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n\n color: ${(props) => (props.disabled ? '#999' : '#fff')};\n background-color: ${(props) => {\n if (props.disabled) return '#e0e0e0';\n if (!props.isMobile && props.isHovered) return '#888';\n return '#000';\n }};\n border: ${(props) => (props.disabled ? '1px solid #ccc' : 'none')};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n transition: ${(props) => (props.isMobile ? 'none' : 'all 0.3s ease')};\n\n @media (max-width: 560px) {\n margin: 5px 0;\n }\n`;\n\nexport const CartIcon = styled('span')<{ disabled?: boolean }>`\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n display: inline-block;\n background: none;\n transition: all 0.3s ease;\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n`;\n","import React, { ReactElement, useCallback, ReactNode, useRef } from 'react';\nimport Slider from 'react-slick';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport 'slick-carousel/slick/slick.css';\nimport { NsCardButton, NsCarouselControl } from '@nuskin/foundation-ui-components';\nimport { ProductImageType } from '../types/image';\nimport NsProductCard from '../card/NsProductCard';\nimport {\n SlickContainer,\n ControlsContainer,\n ControlsHeaderRow,\n ScrollableContainer,\n CardList,\n ViewAllWrapper,\n ProductCountWrapper,\n ArrowsWrapper,\n CustomTypography,\n ViewAllLink,\n ProductInfoWrapper,\n CategoryNameWrapper,\n EmptyProductCategories,\n} from './NsProductCarousel.styled';\n\nexport type ProductCardEntry = {\n readonly productTitle: string;\n readonly imageDetails?: ProductImageType;\n readonly button?: NsCardButton;\n readonly onCardClick?: () => void;\n readonly productStatusBadge?: React.ReactNode;\n readonly directSeller?: React.ReactNode;\n readonly mySitePriceComponent?: React.ReactNode;\n};\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductCardCarouselProps<T = ProductCardEntry> {\n readonly entries: T[];\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly renderEntry?: (entry: T, index: number) => ReactNode;\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly categoryName?: string;\n readonly emptyProductMessage?: string;\n readonly productsCountLabel?: string;\n readonly isInitialDataLoading?: boolean;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nexport default function ProductCardCarousel({\n entries,\n renderEntry,\n settings = {},\n showControlButtons = true,\n allEntryLabel = 'View All',\n allEntryLink = '',\n categoryName,\n emptyProductMessage = 'No Products Available For The Selected Category',\n productsCountLabel = 'Products',\n isInitialDataLoading,\n history,\n}: ProductCardCarouselProps): ReactElement {\n const sliderRef = useRef<Slider>(null);\n const isMobile = useMediaQuery('(max-width: 560px)');\n\n const prev = useCallback(() => {\n sliderRef.current?.slickPrev();\n }, []);\n\n const next = useCallback(() => {\n sliderRef.current?.slickNext();\n }, []);\n\n const renderProductEntry =\n renderEntry ??\n ((entry: ProductCardEntry, index: number) => (\n <NsProductCard\n key={`${entry.productTitle}-${index}`}\n productTitle={entry.productTitle}\n imageDetails={entry.imageDetails}\n button={entry.button}\n onCardClick={entry.onCardClick}\n productStatusBadge={entry.productStatusBadge}\n directSellerBadge={entry.directSeller}\n mySitePriceComponent={entry.mySitePriceComponent}\n />\n ));\n\n const sliderSettings = {\n dots: true,\n infinite: true,\n speed: 500,\n slidesToShow: Math.min(entries?.length ?? 0, 4),\n slidesToScroll: 4,\n swipe: true,\n draggable: true,\n arrows: true,\n responsive: [\n {\n breakpoint: 1320,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 3),\n slidesToScroll: 3,\n },\n },\n {\n breakpoint: 900,\n settings: {\n slidesToShow: Math.min(entries?.length ?? 0, 2),\n slidesToScroll: 2,\n },\n },\n {\n breakpoint: 600,\n settings: {\n slidesToShow: 1,\n slidesToScroll: 1,\n arrows: false,\n },\n },\n ],\n ...settings,\n };\n\n const shouldShowNavigation = (entries?.length ?? 0) > sliderSettings.slidesToShow;\n\n const renderCarouselContent = () => {\n if (entries?.length === 0 && !isInitialDataLoading) {\n return <EmptyProductCategories>{emptyProductMessage}</EmptyProductCategories>;\n }\n\n if (isMobile) {\n return (\n <ScrollableContainer>\n <CardList>{entries.map((entry, index) => entry && renderProductEntry(entry, index))}</CardList>\n </ScrollableContainer>\n );\n }\n\n return (\n <Slider {...sliderSettings} ref={sliderRef}>\n {entries.map((entry, index) => entry && renderProductEntry(entry, index))}\n </Slider>\n );\n };\n\n return (\n <SlickContainer>\n {showControlButtons && (\n <ControlsContainer>\n <ControlsHeaderRow>\n <ProductInfoWrapper>\n <ProductCountWrapper>\n <CustomTypography variant=\"body-m\">\n {entries?.length ?? 0} {productsCountLabel}\n </CustomTypography>\n </ProductCountWrapper>\n {!isMobile && categoryName && <CategoryNameWrapper>{categoryName}</CategoryNameWrapper>}\n </ProductInfoWrapper>\n <ViewAllWrapper $isMobile={isMobile}>\n <ViewAllLink\n $disabled={(entries?.length ?? 0) === 0}\n onClick={(e) => {\n e.preventDefault();\n if ((entries?.length ?? 0) > 0 && history) {\n history.push(allEntryLink);\n }\n }}\n >\n {allEntryLabel}\n </ViewAllLink>\n </ViewAllWrapper>\n </ControlsHeaderRow>\n {!isMobile && (\n <ArrowsWrapper $isDisabled={!shouldShowNavigation}>\n <NsCarouselControl prev={prev} next={next} viewAllLabel={''} viewAllUrl={''} />\n </ArrowsWrapper>\n )}\n </ControlsContainer>\n )}\n {renderCarouselContent()}\n </SlickContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport Box, { BoxProps } from '@mui/material/Box';\nimport { NsTypography } from '@nuskin/foundation-ui-components';\n\nexport const SlickContainer: React.ComponentType<BoxProps> = styled(Box)`\n padding: 30px 0 60px;\n width: 100%;\n margin: auto;\n margin-top: 50px;\n position: relative;\n\n .slick-list {\n padding-left: 24px;\n padding-right: 24px;\n }\n .slick-slide {\n display: flex;\n justify-content: center;\n padding: 0 12px;\n box-sizing: border-box;\n }\n .slick-prev,\n .slick-next {\n display: none !important;\n }\n\n @media (max-width: 1200px) {\n max-width: 1024px;\n .slick-list {\n padding-left: 12px;\n padding-right: 12px;\n }\n .slick-slide {\n padding: 0 6px;\n }\n }\n @media (max-width: 700px) {\n max-width: 100vw;\n padding: 10px 0 50px;\n .slick-list {\n padding-left: 4px;\n padding-right: 4px;\n }\n .slick-slide {\n padding: 0 2px;\n }\n }\n @media (max-width: 560px) {\n padding: 10px 0 10px;\n margin-top: 25px;\n }\n`;\nexport const ScrollableContainer = styled('div')`\n overflow-x: auto;\n display: flex;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n gap: 16px;\n padding: 0 8px 16px;\n width: 100%;\n box-sizing: border-box;\n\n &::-webkit-scrollbar {\n height: 6px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #007bff;\n border-radius: 10px;\n }\n`;\n\nexport const CardList = styled('div')`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`;\n\nexport const ControlsContainer: React.ComponentType<BoxProps> = styled(Box)`\n position: absolute;\n bottom: calc(100% + 1px);\n right: 1px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n`;\n\nexport const ViewAllWrapper: React.ComponentType<BoxProps & { $isMobile?: boolean }> = styled(Box)<{\n $isMobile?: boolean;\n}>`\n display: flex;\n align-items: center;\n margin-left: auto;\n margin-right: ${({ $isMobile }) => ($isMobile ? 0 : '24px')};\n\n @media (max-width: 560px) {\n margin-left: 0;\n order: 2;\n }\n`;\n\nexport const ProductCountWrapper: React.ComponentType<BoxProps> = styled(Box)`\n display: none;\n\n @media (max-width: 560px) {\n color: #666666;\n font-family: Inter;\n font-size: 14px !important;\n font-style: normal;\n font-weight: 600;\n line-height: 18px;\n display: flex;\n align-items: center;\n order: 1;\n }\n`;\n\nexport const ArrowsWrapper: React.ComponentType<BoxProps & { $isDisabled?: boolean }> = styled(Box)<{\n $isDisabled?: boolean;\n}>`\n display: flex;\n align-items: center;\n opacity: ${({ $isDisabled }) => ($isDisabled ? 0.3 : 1)};\n pointer-events: ${({ $isDisabled }) => ($isDisabled ? 'none' : 'auto')};\n transition: opacity 0.3s ease;\n\n .carousal-prev-button,\n .carousal-next-button {\n transition: all 0.3s ease;\n border: 2px solid #000000;\n border-radius: 3px;\n padding: 9px;\n cursor: pointer;\n\n svg {\n transition: all 0.3s ease;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n\n &:hover {\n background-color: #f5f5f5;\n border: 2px solid #ddd;\n\n svg {\n opacity: 0.5;\n }\n\n svg polyline {\n stroke: #000000;\n fill: none;\n }\n }\n }\n\n @media (max-width: 560px) {\n display: none;\n }\n`;\nexport const Scrollablewrapper = styled('div')`\n @media (max-width: 560px) {\n overflow-y: hidden;\n scrollbar-width: thin;\n scrollbar-color: #007bff #eee;\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: #eee;\n }\n &::-webkit-scrollbar-thumb {\n background-color: red;\n border-radius: 8px;\n border: 2px solid #eee;\n }\n }\n`;\nexport const CustomTypography = styled(NsTypography)`\n color: #666666;\n font-family: Inter;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 22px;\n @media (max-width: 560px) {\n margin: 0 3px;\n }\n`;\n\nexport const ViewAllLink = styled('a')<{ $disabled?: boolean }>`\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n font-family: Inter, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n text-decoration: none;\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#000000')};\n padding-bottom: 4px;\n transition: all 0.3s ease;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n\n @media (max-width: 560px) {\n font-size: 14px;\n line-height: 18px;\n }\n\n &:hover {\n color: ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n border-bottom: 1px solid ${({ $disabled }) => ($disabled ? '#999999' : '#666666')};\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n }\n`;\n\nexport const EmptyProductCategories = styled('div')`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`;\nexport const ControlsHeaderRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const ProductInfoWrapper = styled('div')`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`;\n\nexport const CategoryNameWrapper = styled('div')`\n font-family: 'Lora';\n font-weight: 400;\n font-size: 22px;\n margin-left: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 13px;\n`;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useMediaQuery } from '@mui/material';\n\nimport { NsCategoryNavigation } from '../Nav-Category-Navigation';\nimport { NsSpinner } from '@nuskin/foundation-ui-components';\nimport ProductCardCarousel, { ProductCardEntry } from './NsProductCarousel';\nimport {\n ProductTabCarouselContainer,\n TabsContainer,\n ContentContainer,\n NoTabsContainer,\n SpinnerContainer,\n} from './ProductTabCarousel.styled';\n\ninterface Category {\n label: string;\n categoryId: string;\n}\n\ninterface SlickSettings {\n dots?: boolean;\n infinite?: boolean;\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n swipe?: boolean;\n draggable?: boolean;\n arrows?: boolean;\n responsive?: Array<{\n breakpoint: number;\n settings: {\n slidesToShow?: number;\n slidesToScroll?: number;\n arrows?: boolean;\n };\n }>;\n}\n\ninterface ProductTabCarouselProps {\n readonly allEntryLabel?: string;\n readonly allEntryLink?: string;\n readonly renderEntry?: (entry: ProductCardEntry) => React.ReactNode;\n readonly settings?: SlickSettings;\n readonly showControlButtons?: boolean;\n readonly fetchCategories: () => Promise<Category[]>;\n readonly fetchProducts: (categoryId: string) => Promise<ProductCardEntry[]>;\n readonly emptyProductTabs?: string;\n readonly emptyProductMessage?: string;\n readonly showCustomCategory?: boolean;\n readonly productsCountLabel?: string;\n readonly getCategoryId?: (categoryId: string) => Promise<Category[]>;\n readonly history?: {\n push: (path: string) => void;\n };\n}\n\nconst ProductTabCarousel: React.FC<ProductTabCarouselProps> = ({\n allEntryLabel,\n allEntryLink,\n renderEntry,\n settings,\n showControlButtons = true,\n fetchCategories,\n fetchProducts,\n showCustomCategory = false,\n emptyProductTabs = 'No tabs available',\n emptyProductMessage,\n productsCountLabel,\n getCategoryId,\n history,\n}) => {\n const isMobile = useMediaQuery('(max-width:768px)');\n const [isLoadingInitialData, setIsLoadingInitialData] = useState(true);\n const [categories, setCategories] = useState<Category[]>([]);\n const [isCategoriesLoaded, setIsCategoriesLoaded] = useState(false);\n const [selectedTab, setSelectedTab] = useState(0);\n const [products, setProducts] = useState<ProductCardEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [shouldShowSpinner, setShouldShowSpinner] = useState(true);\n\n const checkForExistingSpinners = useCallback(() => {\n const existingSpinners = document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');\n setShouldShowSpinner(existingSpinners.length === 0);\n }, []);\n\n useEffect(() => {\n if (loading) {\n checkForExistingSpinners();\n }\n }, [loading, checkForExistingSpinners]);\n\n useEffect(() => {\n fetchCategories().then((data) => {\n setCategories(data);\n setIsCategoriesLoaded(true);\n });\n }, [fetchCategories]);\n\n useEffect(() => {\n if (!isCategoriesLoaded) return;\n\n if (categories.length > 0) {\n const categoryId = categories[selectedTab]?.categoryId;\n if (getCategoryId) {\n getCategoryId(categoryId);\n }\n\n setLoading(true);\n fetchProducts(categoryId)\n .then(setProducts)\n .finally(() => {\n setLoading(false);\n setIsLoadingInitialData(false);\n });\n } else {\n setLoading(false);\n }\n }, [categories, selectedTab, fetchProducts, isCategoriesLoaded]);\n\n const itemArray = categories.map((cat) => ({\n label: cat.label,\n content: '',\n categoryId: cat.categoryId,\n }));\n\n return (\n <ProductTabCarouselContainer isMobile={isMobile} $hasCategories={categories.length > 0}>\n {showCustomCategory &&\n (itemArray.length > 0 ? (\n <TabsContainer isMobile={isMobile}>\n <NsCategoryNavigation\n itemArray={itemArray}\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n />\n </TabsContainer>\n ) : (\n <NoTabsContainer>{emptyProductTabs}</NoTabsContainer>\n ))}\n <ContentContainer isMobile={isMobile}>\n {loading ? (\n <SpinnerContainer>{shouldShowSpinner && <NsSpinner />}</SpinnerContainer>\n ) : (\n <ProductCardCarousel\n isInitialDataLoading={isLoadingInitialData}\n entries={products}\n allEntryLabel={allEntryLabel}\n allEntryLink={allEntryLink}\n renderEntry={\n renderEntry\n ? (entry) => renderEntry({ ...entry, productStatusBadge: entry.productStatusBadge })\n : undefined\n }\n settings={settings}\n showControlButtons={showControlButtons}\n categoryName={categories[selectedTab]?.label}\n emptyProductMessage={emptyProductMessage}\n productsCountLabel={productsCountLabel}\n history={history}\n />\n )}\n </ContentContainer>\n </ProductTabCarouselContainer>\n );\n};\n\nexport default ProductTabCarousel;\n","import * as React from 'react';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport Box from '@mui/material/Box';\nimport PropTypes from 'prop-types';\nimport { NsCategoryNavigationContainer } from './NsCategoryNavigation.styled';\nimport { useMediaQuery } from '@mui/material';\n\nfunction TabPanel(\n props: Readonly<{\n children?: React.ReactNode;\n value: number;\n index: number;\n [key: string]: unknown;\n }>,\n) {\n const { children, value, index, ...other } = props;\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`vertical-tabpanel-${index}`}\n aria-labelledby={`vertical-tab-${index}`}\n {...other}\n >\n {value === index && <Box className=\"tabPanel\">{children}</Box>}\n </div>\n );\n}\nTabPanel.propTypes = {\n children: PropTypes.node,\n index: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n};\n\ninterface NsCategoryNavigationProps {\n itemArray: { label: string; content: React.ReactNode; categoryId: string }[];\n value?: number;\n onChange?: (event: React.SyntheticEvent, newValue: number) => void;\n}\n\nexport const NsCategoryNavigation: React.FC<Readonly<NsCategoryNavigationProps>> = ({\n itemArray,\n value: controlledValue,\n onChange,\n}) => {\n const [internalValue, setInternalValue] = React.useState(0);\n const isMobile = useMediaQuery('(max-width:768px)');\n const value = controlledValue ?? internalValue;\n const handleChange = (event: React.SyntheticEvent, newValue: number) => {\n if (onChange) {\n onChange(event, newValue);\n } else {\n setInternalValue(newValue);\n }\n };\n\n return (\n <NsCategoryNavigationContainer>\n <Box className=\"tabContainer\">\n <Tabs\n orientation={isMobile ? 'horizontal' : 'vertical'}\n variant=\"scrollable\"\n value={value}\n onChange={handleChange}\n aria-label=\"Vertical tabs example\"\n className=\"tabsStyle\"\n >\n {itemArray.map((item) => (\n <Tab key={item.categoryId} label={item.label} className=\"tabStyle\" />\n ))}\n </Tabs>\n {itemArray.map((item) => (\n <TabPanel\n key={item.categoryId}\n value={value}\n index={itemArray.findIndex((i) => i.categoryId === item.categoryId)}\n >\n {item.content}\n </TabPanel>\n ))}\n </Box>\n </NsCategoryNavigationContainer>\n );\n};\n","import { styled } from '@nuskin/foundation-theme';\nexport const NsCategoryNavigationContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n background-color: #fff;\n .tabsStyle {\n display: flex;\n padding-top: 8.533px;\n flex-direction: column;\n align-items: flex-start;\n gap: 12.8px;\n border-right: 1px;\n border-color: divider;\n width: 200px;\n & .Mui-selected {\n font-weight: 700;\n font-size: 14px;\n font-family: 'inter', sans-serif;\n font-style: normal;\n font-height: 20px;\n border-radius: 4px;\n }\n & .MuiTabs-indicator {\n left: 0;\n background-color: #5b81a5;\n color: #5b81a5;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n }\n\n .tabContainer {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: flex-start;\n min-width: 100%;\n background-color: #fff;\n @media (max-width: 768px) {\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n }\n\n .tabStyle {\n align-items: flex-start;\n display: flex;\n text-align: left;\n font-size: 14px;\n font-family: 'inter' sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n padding: 1px;\n padding-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n text-transform: none;\n }\n @media (max-width: 768px) {\n flex-direction: row;\n\n .tabsStyle {\n width: 100%;\n border-right: none;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 0px;\n }\n\n .tabStyle {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 70px;\n padding: 8px 16px;\n text-align: center;\n margin: 4px;\n background-color: #fff;\n cursor: pointer;\n color: black;\n font-family: Inter;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n }\n\n .tabStyle.Mui-selected {\n background-color: #5b81a5;\n color: #ffffff !important;\n font-weight: 700;\n border-radius: 70px;\n }\n }\n .tabPanel {\n padding: 8px;\n text-align: left;\n }\n`;\n","import { styled } from '@nuskin/foundation-theme';\n\nconst getMinHeight = ({ isMobile, $hasCategories }: { isMobile?: boolean; $hasCategories?: boolean }) => {\n if (isMobile) return 'auto';\n return $hasCategories ? '800px' : 'auto';\n};\n\nexport const ProductTabCarouselContainer = styled('div')<{ isMobile?: boolean; $hasCategories?: boolean }>`\n display: flex;\n flex-direction: ${({ isMobile }) => (isMobile ? 'column' : 'row')};\n align-items: ${({ isMobile }) => (isMobile ? 'stretch' : 'flex-start')};\n width: 100%;\n max-width: 1920px;\n min-height: ${getMinHeight};\n margin: 0 auto;\n box-sizing: border-box;\n overflow: visible;\n background: #fff;\n padding: ${({ isMobile }) => (isMobile ? '10px 16px 0px 16px' : '50px 60px 0px 60px')};\n\n @media (max-width: 768px) {\n padding: 10px 16px 0px 16px;\n min-height: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n padding: 30px 40px 0px 40px;\n gap: 20px;\n }\n\n transform: translateZ(0);\n will-change: auto;\n`;\n\nexport const TabsContainer = styled('div')<{ isMobile?: boolean }>`\n min-width: ${({ isMobile }) => (isMobile ? '100%' : 'auto')};\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n\n overflow-x: auto;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-width: 200px;\n margin-right: 20px;\n }\n`;\n\nexport const ContentContainer = styled('div')<{ isMobile?: boolean }>`\n flex: 1;\n min-width: 0;\n height: ${({ isMobile }) => (isMobile ? 'auto' : '100%')};\n\n @media (max-width: 768px) {\n width: 100%;\n height: auto;\n min-height: 300px;\n\n -webkit-overflow-scrolling: touch;\n overflow-x: hidden;\n overflow-y: auto;\n }\n\n @media (min-width: 769px) and (max-width: 1024px) {\n min-height: 400px;\n }\n\n contain: layout style paint;\n transform: translateZ(0);\n`;\n\nexport const LoadingContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n padding: 20px;\n\n @media (max-width: 768px) {\n min-height: 150px;\n padding: 16px;\n }\n`;\n\nexport const NoTabsContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 40px 20px;\n color: #666;\n font-size: 16px;\n\n @media (max-width: 768px) {\n padding: 20px 16px;\n font-size: 14px;\n }\n`;\nexport const SpinnerContainer = styled('div')`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;\n","import React, { ReactElement, useState, useEffect, useMemo } from 'react';\nimport { Typography, Box, useMediaQuery, Tooltip } from '@mui/material';\nimport { NsLink, NsImage } from '@nuskin/foundation-ui-components';\nimport {\n MysiteHeroContainer,\n MysiteHeroContainerMobile,\n BadgeContainer,\n Badge,\n ToggleButtonMobile,\n StyledSpan,\n ImgTabIndex,\n ContactLink,\n BadgeValue,\n} from '@/common/headers/MysiteHero.styled';\nimport { PlaceholderImage } from '../icon/icons/PlaceholderImage';\nimport { ArrowDownIcon } from '../icon/icons/ArrowDownIcon';\nimport { trackGTMEvent } from '../utils/gtmTracking';\n\ntype MysiteHeroProps = {\n readonly imageDetails?: {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n };\n readonly shopTitle: string;\n readonly shopDescription: string;\n readonly socialTitleText: string;\n readonly email: string;\n readonly phone: string;\n readonly className?: string;\n readonly bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n readonly socialIcons?: {\n type: string;\n url: string;\n }[];\n readonly expirationDate?: string;\n readonly showBadges?: boolean;\n readonly totalSavings?: string;\n};\n\ntype ImageDetails = {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n};\n\ntype BannerProps = {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n};\n\ntype ContentProps = {\n shopTitle: string;\n shopDescription: string;\n socialTitleText: string;\n email: string;\n phone: string;\n showBadges: boolean;\n expirationDate?: string;\n totalSavings?: string;\n};\n\nconst renderImageContent = (imageDetails: ImageDetails | undefined, bannerProps: BannerProps, className: string) => {\n const placeholderClass = className.includes('mobile') ? 'placeholder-image-mobile' : 'placeholder-image';\n return imageDetails?.imageSrc ? (\n <ImgTabIndex tabIndex={0}>\n <NsImage className={className} src={imageDetails.imageSrc} alt={imageDetails.imageAlt} />\n </ImgTabIndex>\n ) : (\n <Box className={placeholderClass}>\n <PlaceholderImage\n width={className.includes('mobile') ? '144px' : '246px'}\n height={className.includes('mobile') ? '144px' : '246px'}\n backgroundColor={bannerProps?.backgroundColor ?? '#5F5F5F'}\n />\n </Box>\n );\n};\n\nconst renderBadges = (\n showBadges: boolean,\n expirationDate: string,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n totalSavings?: string,\n) => {\n if (!showBadges || (!expirationDate && !totalSavings)) return null;\n\n const badgeClass = isMobile ? 'mobile-badge' : 'tablet-badge';\n const containerClass = isMobile ? 'mobile-badges' : 'tablet-badges';\n\n return (\n <BadgeContainer className={containerClass}>\n {totalSavings && (\n <Badge\n className={`${badgeClass} total-savings-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{totalSavings}</BadgeValue>\n </Badge>\n )}\n {expirationDate && (\n <Badge\n className={`${badgeClass} expiration-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{expirationDate}</BadgeValue>\n </Badge>\n )}\n </BadgeContainer>\n );\n};\n\nconst renderMobileContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, socialTitleText, email, showBadges, expirationDate, phone, totalSavings } = props;\n\n return (\n <Box className=\"content-mobile\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title-mobile\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text-mobile\">\n {socialTitleText}\n </Typography>\n {email?.trim() && renderContactLink('email', email, 'email-text-mobile')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text-mobile')}\n <Box className=\"social-icons-mobile\">{renderSocialMediaIcons}</Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst renderDesktopContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, shopDescription, socialTitleText, email, phone, showBadges, expirationDate, totalSavings } =\n props;\n\n return (\n <Box className=\"content\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n {shopDescription?.length > 480 ? (\n <Tooltip title={shopDescription} arrow>\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n </Tooltip>\n ) : (\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n )}\n <Box className=\"social-media\">\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text\">\n {socialTitleText}\n </Typography>\n <Box className=\"social-icons\">\n {renderSocialMediaIcons}\n {email?.trim() && renderContactLink('email', email, 'email-text')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text')}\n </Box>\n </Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst checkIfImageIsCircular = (url: string): Promise<boolean> => {\n return new Promise((resolve, reject) => {\n const imageContext = new Image();\n imageContext.crossOrigin = 'anonymous';\n imageContext.src = url;\n\n imageContext.onload = () => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return reject(new Error('Canvas not supported'));\n\n canvas.width = imageContext.width;\n canvas.height = imageContext.height;\n\n context.drawImage(imageContext, 0, 0);\n\n const corners = [\n context.getImageData(0, 0, 1, 1).data,\n context.getImageData(imageContext.width - 1, 0, 1, 1).data,\n context.getImageData(0, imageContext.height - 1, 1, 1).data,\n context.getImageData(imageContext.width - 1, imageContext.height - 1, 1, 1).data,\n ];\n\n const isCircular = corners.every((corner) => {\n const imageArray = Array.prototype.slice.call(corner);\n const alpha = imageArray[3];\n return alpha < 10;\n });\n resolve(isCircular);\n };\n imageContext.onerror = () => reject(new Error('Failed to load image'));\n });\n};\n\nconst isWhiteOrNearWhite = (color: string | undefined): boolean => {\n if (!color) return false;\n\n const hex = color.replace('#', '').toLowerCase();\n\n /* regex pattern for hex color format: 3 chars (#fff), 4 chars (#ffff), 6 chars (#ffffff), or 8 chars (#ffffffff)*/\n if (!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(hex)) return false;\n\n let fullHex = hex;\n if (hex.length === 3 || hex.length === 4) {\n fullHex = hex\n .split('')\n .map((char) => char + char)\n .join('');\n }\n\n const r = Number.parseInt(fullHex.substring(0, 2), 16);\n const g = Number.parseInt(fullHex.substring(2, 4), 16);\n const b = Number.parseInt(fullHex.substring(4, 6), 16);\n\n const threshold = 220;\n return r >= threshold && g >= threshold && b >= threshold;\n};\n\nconst createContactClickHandler = (contactType: 'email' | 'phone', contactValue: string) => ({\n onClick: () => {\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n globalThis.location.href = `${contactType === 'email' ? 'mailto' : 'tel'}:${contactValue}`;\n }\n },\n});\n\nconst renderContactLink = (contactType: 'email' | 'phone', contactValue: string, className: string) => {\n const protocol = contactType === 'email' ? 'mailto:' : 'tel:';\n const handlers = createContactClickHandler(contactType, contactValue);\n\n return (\n <Typography className={className}>\n <ContactLink href={`${protocol}${contactValue}`} {...handlers}>\n {contactValue}\n </ContactLink>\n </Typography>\n );\n};\nexport default function MysiteHero({\n className,\n shopTitle,\n shopDescription,\n socialTitleText,\n imageDetails,\n email,\n phone,\n bannerProps,\n socialIcons,\n expirationDate,\n showBadges = false,\n totalSavings,\n}: MysiteHeroProps): ReactElement {\n const isMobile = useMediaQuery('(max-width: 560px)');\n const [isScrolled, setIsScrolled] = useState(false);\n const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);\n const [hasWhiteBackground, setHasWhiteBackground] = useState(false);\n const [isImageCircular, setIsImageCircular] = useState(false);\n\n const toggleDescription = () => {\n setIsDescriptionExpanded(!isDescriptionExpanded);\n };\n\n useEffect(() => {\n const checkImage = async () => {\n if (imageDetails?.imageSrc) {\n const isCircular = await checkIfImageIsCircular(imageDetails.imageSrc);\n setIsImageCircular(isCircular);\n } else {\n setIsImageCircular(false);\n }\n };\n\n checkImage();\n }, [imageDetails?.imageSrc]);\n\n useEffect(() => {\n setHasWhiteBackground(isWhiteOrNearWhite(bannerProps?.backgroundColor));\n }, [bannerProps?.backgroundColor]);\n\n useEffect(() => {\n let debounceTimeout: ReturnType<typeof setTimeout>;\n let lastScrollY = window.scrollY;\n let currentScrollState = false;\n let isTransitioning = false;\n let lastUpdateTime = 0;\n\n const updateScrollState = (newState: boolean) => {\n const now = Date.now();\n\n if (currentScrollState !== newState && !isTransitioning) {\n if (now - lastUpdateTime < 100) {\n return;\n }\n\n isTransitioning = true;\n currentScrollState = newState;\n lastUpdateTime = now;\n\n if (newState) {\n setIsDescriptionExpanded(false);\n }\n\n clearTimeout(debounceTimeout);\n setIsScrolled(newState);\n\n debounceTimeout = setTimeout(() => {\n isTransitioning = false;\n\n if (newState && window.scrollY < 15) {\n window.scrollTo({\n top: isMobile ? 20 : 30,\n behavior: 'smooth',\n });\n }\n }, 300);\n }\n };\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n if (isTransitioning) {\n lastScrollY = currentScrollY;\n return;\n }\n\n const scrollDelta = Math.abs(currentScrollY - lastScrollY);\n\n if (scrollDelta < 0.5) {\n return;\n }\n\n const scrollingDown = currentScrollY > lastScrollY;\n\n const scrollDownThreshold = isMobile ? 15 : 25;\n const scrollUpThreshold = isMobile ? 8 : 12;\n\n if (scrollingDown && currentScrollY > scrollDownThreshold && !currentScrollState) {\n updateScrollState(true);\n } else if (!scrollingDown && currentScrollY < scrollUpThreshold && currentScrollState) {\n updateScrollState(false);\n }\n\n lastScrollY = currentScrollY;\n };\n\n const initializeState = () => {\n const initialScrollY = window.scrollY;\n const scrollThreshold = isMobile ? 5 : 10;\n const shouldStartCompact = initialScrollY > scrollThreshold;\n\n currentScrollState = shouldStartCompact;\n setIsScrolled(shouldStartCompact);\n lastScrollY = initialScrollY;\n lastUpdateTime = Date.now();\n };\n\n let rafId: number | null = null;\n let lastRafTime = 0;\n const throttledScrollHandler = () => {\n if (rafId) return;\n\n const now = Date.now();\n if (now - lastRafTime < 16) {\n return;\n }\n\n rafId = requestAnimationFrame(() => {\n handleScroll();\n lastRafTime = Date.now();\n rafId = null;\n });\n };\n\n initializeState();\n window.addEventListener('scroll', throttledScrollHandler, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', throttledScrollHandler);\n if (rafId) cancelAnimationFrame(rafId);\n clearTimeout(debounceTimeout);\n };\n }, [isMobile]);\n\n const renderSocialMediaIcons = useMemo(() => {\n return socialIcons?.map((icon, index) => {\n const handleSocialClick = (e: React.MouseEvent) => {\n e.preventDefault();\n trackGTMEvent({\n event: 'social_click',\n social_platform: icon.type,\n social_url: icon.url,\n click_element: 'social_icon',\n });\n window.open(icon.url, '_blank');\n };\n\n return (\n <StyledSpan key={icon?.type + index} onClick={handleSocialClick}>\n <NsLink href={icon.url} target=\"_blank\">\n <NsImage\n key={icon?.type + index}\n src={`https://www.google.com/s2/favicons?domain=${icon?.url}&sz=24`}\n alt={`${icon.type} icon`}\n width=\"24\"\n height=\"24\"\n />\n </NsLink>\n </StyledSpan>\n );\n });\n }, [socialIcons]);\n\n const containerClass = `${className} ${isScrolled ? 'scrolled' : ''}`;\n const props = {\n shopTitle,\n shopDescription,\n socialTitleText,\n email,\n phone,\n showBadges,\n expirationDate,\n totalSavings,\n };\n\n const getCharacterLimit = () => {\n if (window.innerWidth <= 380) return 50;\n if (window.innerWidth <= 415) return 56;\n if (window.innerWidth <= 460) return 62;\n return 80;\n };\n\n const shouldShowToggle = isMobile && shopDescription && shopDescription.length > getCharacterLimit();\n\n return isMobile ? (\n <MysiteHeroContainerMobile\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n <Box className=\"image-content-mobile\">\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image-mobile')}\n {renderMobileContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </Box>\n {!isScrolled && (\n <Box className=\"expandable-description-mobile\">\n <Typography\n className={`description-content-mobile ${isDescriptionExpanded || !shouldShowToggle ? 'expanded' : 'collapsed'}`}\n >\n {shopDescription}\n </Typography>\n {shouldShowToggle && (\n <ToggleButtonMobile onClick={toggleDescription}>\n <ArrowDownIcon\n width={16}\n height={16}\n className={`arrow-icon-mobile ${isDescriptionExpanded ? 'expanded' : ''}`}\n />\n </ToggleButtonMobile>\n )}\n </Box>\n )}\n </MysiteHeroContainerMobile>\n ) : (\n <MysiteHeroContainer\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image')}\n {renderDesktopContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </MysiteHeroContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport { Box, BoxProps } from '@mui/material';\n\ninterface StyledBoxProps extends BoxProps {\n bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n isCircularImage?: boolean;\n hasWhiteBackground?: boolean;\n}\n\ninterface BadgeProps extends BoxProps {\n hasWhiteBackground?: boolean;\n}\n\nconst getContactTextStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '600',\n lineHeight: '16px',\n letterSpacing: '0.12px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n});\n\nconst getSocialTitleStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '700',\n lineHeight: '16px',\n letterSpacing: '0.48px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n textTransform: 'uppercase' as const,\n paddingLeft: '5px',\n});\n\nconst getSocialIconsStyles = () => ({\n display: 'flex',\n flexDirection: 'row' as const,\n gap: '10px',\n alignItems: 'center',\n});\n\nconst getContactTextMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getContactTextStyles(hasWhiteBackground),\n paddingBottom: '11px',\n wordBreak: 'break-all' as const,\n overflowWrap: 'break-word' as const,\n paddingLeft: '5px',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n },\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '15px',\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '14px',\n paddingBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '12px',\n paddingBottom: '4px',\n },\n});\n\nconst getSocialTitleMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '11px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '14px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '12px',\n marginBottom: '5px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '11px',\n marginBottom: '4px',\n },\n});\n\nexport const MysiteHeroContainer = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n height: 'auto',\n flexDirection: 'row',\n alignItems: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content': {\n paddingTop: '0',\n justifyContent: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title': {\n fontSize: '26px',\n lineHeight: '34px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n\n '.bg-image': {\n width: '90px',\n height: '90px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n '& > div': {\n width: '90px',\n height: '90px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.content': {\n width: '70%',\n height: '100%',\n marginLeft: '2%',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image': {\n width: '252px',\n height: '252px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '3px' : '0px',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n '.body-title': {\n fontSize: '32px',\n lineHeight: '38px',\n marginBottom: '8px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-text': {\n fontSize: '16px',\n marginBottom: '12px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '22px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n WebkitLineClamp: 3,\n textOverflow: 'ellipsis',\n paddingLeft: '5px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.social-media': {\n display: 'flex',\n flexDirection: 'column',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.email-text': getContactTextStyles(hasWhiteBackground),\n '.phone-text': getContactTextStyles(hasWhiteBackground),\n '.social-title-text': {\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '8px',\n },\n '.social-icons': {\n ...getSocialIconsStyles(),\n paddingBottom: '8px',\n },\n }),\n);\n\nexport const MysiteHeroContainerMobile = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n flexDirection: 'column',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content-mobile': {\n paddingTop: '5px',\n width: '60%',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title-mobile': {\n fontSize: '18px',\n lineHeight: '28px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image-mobile': {\n width: '75px',\n height: '75px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image-mobile': {\n '& > div': {\n width: '75px !important',\n height: '75px !important',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.image-content-mobile': {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '.content-mobile': {\n width: '55%',\n height: '100%',\n paddingTop: '10px',\n paddingRight: '10px',\n marginLeft: '8px',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n paddingTop: '8px',\n width: '100%',\n },\n '@media (max-width: 400px)': {\n paddingTop: '6px',\n width: '100%',\n height: '100%',\n },\n '@media (max-width: 375px)': {\n paddingTop: '4px',\n width: '100%',\n height: '100%',\n },\n },\n '.bg-image-mobile': {\n width: '144px',\n height: '144px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n objectFit: 'cover',\n objectPosition: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '2px' : '0px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '112px',\n height: '112px',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n '.placeholder-image-mobile': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n width: '144px',\n height: '144px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '110px !important',\n height: '110px !important',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n },\n '.body-title-mobile': {\n fontSize: '22px',\n lineHeight: '28px',\n marginBottom: '13px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontStyle: 'normal',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n fontSize: '16px',\n lineHeight: '24px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '16px',\n lineHeight: '22px',\n marginBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '14px',\n lineHeight: '20px',\n marginBottom: '4px',\n },\n },\n '.body-text-mobile': {\n fontSize: '14px',\n padding: '20px 25px 20px 25px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n backgroundColor: '#E0E0E0',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.expandable-description-mobile': {\n backgroundColor: '#E0E0E0',\n position: 'relative',\n },\n '.description-content-mobile': {\n fontSize: '14px',\n padding: '10px 15px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'max-height 0.3s ease-in-out, opacity 0.3s ease-in-out',\n overflow: 'hidden',\n position: 'relative',\n '&.collapsed': {\n maxHeight: '50px',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '20px',\n background: 'linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)',\n pointerEvents: 'none',\n },\n },\n '&.expanded': {\n maxHeight: 'none',\n whiteSpace: 'normal',\n display: 'block',\n '&::after': {\n display: 'none',\n },\n },\n },\n '.email-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.phone-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.social-title-text-mobile': getSocialTitleMobileStyles(hasWhiteBackground),\n '.social-icons-mobile': {\n ...getSocialIconsStyles(),\n paddingBottom: '10px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '& img': {\n width: '24px',\n height: '24px',\n '@media (max-width: 400px)': {\n width: '20px',\n height: '20px',\n },\n '@media (max-width: 375px)': {\n width: '18px',\n height: '18px',\n },\n },\n '@media (max-width: 420px)': {\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n paddingBottom: '4px',\n },\n '@media (max-width: 375px)': {\n paddingBottom: '3px',\n },\n },\n }),\n);\n\nexport const BadgeContainer = styled(Box)({\n display: 'flex',\n gap: '12px',\n marginBottom: '16px',\n paddingLeft: '5px',\n\n '&.mobile-badges': {\n flexDirection: 'column',\n gap: '8px',\n marginBottom: '12px',\n },\n\n '&.tablet-badges': {\n flexDirection: 'row',\n gap: '12px',\n marginBottom: '8px',\n },\n});\n\nexport const Badge = styled((props: BadgeProps) => <Box {...props} />)(({ hasWhiteBackground }) => ({\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(10px)',\n borderRadius: '20px',\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n transition: 'all 0.3s ease',\n\n '&.mobile-badge': {\n padding: '6px 12px',\n borderRadius: '16px',\n fontSize: '12px',\n },\n\n '&.tablet-badge': {\n padding: '8px 16px',\n borderRadius: '20px',\n fontSize: '14px',\n },\n\n '&.total-savings-badge': {\n backgroundColor: '#4A6987',\n border: 'none',\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n backdropFilter: 'none',\n '.badge-value': {\n color: '#FFFFFF',\n },\n '&:hover': {\n backgroundColor: '#4A6987',\n transform: 'none',\n boxShadow: 'none',\n },\n },\n\n '&.expiration-badge': {\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n },\n\n '&:hover': {\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n transform: 'translateY(-1px)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n\n '.badge-text': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '400',\n opacity: 0.9,\n },\n\n '.badge-value': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '600',\n },\n}));\nexport const ToggleButtonMobile = styled('button')({\n backgroundColor: '#E0E0E0',\n border: '1px solid #252525',\n borderRadius: '10px',\n cursor: 'pointer',\n width: '40px',\n height: '20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '10px auto 5px auto',\n transition: 'all 0.2s ease',\n '& .arrow-icon-mobile': {\n transition: 'transform 0.3s ease',\n '&.expanded': {\n transform: 'rotate(180deg)',\n },\n },\n});\nexport const StyledSpan = styled(Box)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`;\nexport const ImgTabIndex = styled('span')`\n line-height: 0.5;\n`;\n\nexport const ContactLink = styled('a')({\n fontSize: 'inherit',\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit',\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n});\n\nexport const BadgeValue = styled('span')({});\n","import React from 'react';\nimport { Box } from '@mui/material';\n\ntype PlaceholderImageProps = {\n readonly width: string | number;\n readonly height: string | number;\n readonly backgroundColor: string;\n};\n\nexport const PlaceholderImage: React.FC<PlaceholderImageProps> = ({ width, height, backgroundColor }) => {\n return (\n <Box\n sx={{\n width,\n height,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor,\n }}\n data-testid=\"placeholder-image\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"129\" viewBox=\"0 0 128 129\" fill=\"none\">\n <g id=\"ns_logomark\">\n <path\n id=\"Vector\"\n d=\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_2\"\n d=\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_3\"\n d=\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_4\"\n d=\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_5\"\n d=\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\"\n fill=\"#252525\"\n />\n </g>\n </svg>\n </Box>\n );\n};\n","import React from 'react';\n\ntype ArrowDownIconProps = {\n readonly width?: string | number;\n readonly height?: string | number;\n readonly className?: string;\n};\n\nexport const ArrowDownIcon: React.FC<ArrowDownIconProps> = ({ width = 16, height = 16, className = '' }) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n data-testid=\"arrow-down-icon\"\n >\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n </svg>\n );\n};\n","export interface GTMEvent {\n event: string;\n\n [key: string]: unknown;\n}\n\ndeclare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport function trackGTMEvent(eventData: GTMEvent): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const url = window.location.href;\n const updatedEventData = { ...eventData };\n\n const prefix = url.includes('personal-offer') ? 'postorefront_' : 'mysite_';\n updatedEventData.event = prefix + eventData.event;\n\n try {\n if (window.dataLayer) {\n window.dataLayer.push(updatedEventData);\n } else {\n console.error('GTM dataLayer not available, but event logged');\n window.dataLayer = [];\n window.dataLayer.push(updatedEventData);\n }\n } catch (error) {\n console.error('Failed to track GTM event:', error);\n }\n}\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const DashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 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 CalendarTodayIcon from '@mui/icons-material/CalendarToday';\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 <CalendarTodayIcon />\n </FilterIcon>\n <StyledSelect\n id=\"filter-date-range\"\n data-testid=\"filter-date-range\"\n value={dateRange}\n onChange={handleDateRangeChange}\n onKeyDown={handleFilterKeyDown}\n disabled={isLoading}\n aria-label={`${getTranslation(Keys.ariaLabel.dateRangeFilter)} ${getTranslation(Keys.filter.dateRange[dateRange])}`}\n >\n <option value=\"last7days\">{getTranslation(Keys.filter.dateRange.last7days)}</option>\n <option value=\"last30days\">{getTranslation(Keys.filter.dateRange.last30days)}</option>\n <option value=\"last90days\">{getTranslation(Keys.filter.dateRange.last90days)}</option>\n <option value=\"thisMonth\">{getTranslation(Keys.filter.dateRange.thisMonth)}</option>\n </StyledSelect>\n </FilterDropdownContainer>\n\n <FilterDropdownContainer>\n <FilterLabel htmlFor=\"filter-market\">{getTranslation(Keys.filter.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 standard: {\n key: 'shoppingDashboard.filter.conversionType.standard',\n fallback: 'Standard',\n },\n subscription: {\n key: 'shoppingDashboard.filter.conversionType.subscription',\n fallback: 'Subscription',\n },\n },\n },\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 ShowChartIcon from '@mui/icons-material/ShowChart';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\nimport {\n ProductsListContainer,\n WidgetHeader,\n WidgetTitle,\n SortDropdown,\n HeaderActionsContainer,\n ProductsList,\n ProductItem,\n ProductRank,\n ProductImage,\n ProductImagePlaceholder,\n ProductInfo,\n ProductName,\n ProductSubtitle,\n ProductMetrics,\n ProductValue,\n ProductTrend,\n EmptyState,\n EmptyStateText,\n} from './TopSellingProductsList.styled';\nimport { WidgetMenu } from '../WidgetMenu';\nimport type { TopProduct, ProductSortOption } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { ProductsListSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface TopSellingProductsListProps {\n readonly products: TopProduct[];\n readonly productSort: ProductSortOption;\n readonly isLoading?: boolean;\n readonly maxProducts?: number;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\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);\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)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n case 'revenue':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'volume':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) return '';\n switch (sortBy) {\n case 'units':\n return trend.units ?? '';\n case 'revenue':\n return trend.revenue ?? '';\n case 'volume':\n return trend.volume ?? '';\n default:\n return trend.units ?? '';\n }\n };\n\n const getTrendDirection = (product: TopProduct, sortBy: ProductSortOption): TrendDirection => {\n const trendValue = getTrendValue(product, sortBy);\n if (!trendValue) return 'neutral';\n if (trendValue.startsWith('+')) return 'up';\n if (trendValue.startsWith('-')) return 'down';\n return 'neutral';\n };\n\n const getTrendChartIcon = (direction: TrendDirection) => {\n if (direction === 'up') {\n return <TrendingUpIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n if (direction === 'down') {\n return <TrendingDownIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n }\n return <ShowChartIcon sx={{ fontSize: '14px' }} aria-hidden=\"true\" />;\n };\n\n const displayedProducts = products.slice(0, maxProducts);\n const rankLabel = getTranslation(Keys.widget.topProducts.rank);\n const trendLabel = getTranslation(Keys.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 <SortDropdown\n id=\"product-sort\"\n data-testid=\"product-sort-dropdown\"\n value={productSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topProducts.sortAriaLabel)}\n >\n <option value=\"units\">{getTranslation(Keys.defaults.byUnits)}</option>\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.defaults.byVolume)}</option>\n </SortDropdown>\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 ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport type { TrendDirection } from '../shared/types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport function parseTrendPercent(value?: string): number | null {\n if (!value) return null;\n const cleanedValue = value.replace('%', '').trim();\n const parsedValue = Number(cleanedValue);\n return Number.isFinite(parsedValue) ? parsedValue : null;\n}\n\nexport function resolveTrendDirection(value?: string): TrendDirection {\n const parsedValue = parseTrendPercent(value);\n if (parsedValue === null) return 'neutral';\n if (parsedValue > 0) return 'up';\n if (parsedValue < 0) return 'down';\n return 'neutral';\n}\n\nexport function calculateWeightedRevenueTrend<T>(\n items: readonly T[],\n getRevenue: (item: T) => number,\n getTrend: (item: T) => string | undefined,\n): { direction: TrendDirection; formatted: string } {\n const { weightedSum, weight } = items.reduce(\n (accumulator, item) => {\n const trendValue = parseTrendPercent(getTrend(item));\n if (trendValue === null) return accumulator;\n return {\n weightedSum: accumulator.weightedSum + trendValue * getRevenue(item),\n weight: accumulator.weight + getRevenue(item),\n };\n },\n { weightedSum: 0, weight: 0 },\n );\n\n const average = weight > 0 ? weightedSum / weight : 0;\n let direction: TrendDirection = 'neutral';\n if (average > 0) direction = 'up';\n else if (average < 0) direction = 'down';\n\n return { direction, formatted: `${average > 0 ? '+' : ''}${average.toFixed(1)}%` };\n}\n\nexport function getTrendDirectionLabel(direction: TrendDirection): string {\n if (direction === 'up') return getTranslation(Keys.stats.trend.increased);\n if (direction === 'down') return getTranslation(Keys.stats.trend.decreased);\n return getTranslation(Keys.stats.trend.unchanged);\n}\n\nexport function getTrendIcon(direction: TrendDirection): React.ReactNode {\n switch (direction) {\n case 'up':\n return <ArrowUpwardIcon />;\n case 'down':\n return <ArrowDownwardIcon />;\n case 'neutral':\n default:\n return <RemoveIcon />;\n }\n}\n\nexport function getTrendColor(direction: TrendDirection): string {\n switch (direction) {\n case 'up':\n return '#4caf50';\n case 'down':\n return '#f44336';\n case 'neutral':\n default:\n return '#757575';\n }\n}\n","import { useMemo } from 'react';\n\nexport function calculateTotalPages<T>(items: T[], itemsPerPage: number): number {\n return Math.ceil(items.length / itemsPerPage);\n}\n\nexport function paginateItems<T>(items: T[], currentPage: number, itemsPerPage: number): T[] {\n const startIndex = (currentPage - 1) * itemsPerPage;\n const endIndex = startIndex + itemsPerPage;\n return items.slice(startIndex, endIndex);\n}\n\nexport function sortByNumericProperty<T extends Record<string, unknown>>(\n items: T[],\n key: keyof T,\n direction: 'asc' | 'desc' = 'desc',\n): T[] {\n return [...items].sort((a, b) => {\n const aVal = a[key] as number;\n const bVal = b[key] as number;\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n });\n}\n\nexport function calculatePercentage(value: number, total: number, decimalPlaces: number = 1): string {\n if (total === 0) return '0.0';\n return ((value / total) * 100).toFixed(decimalPlaces);\n}\n\nexport function usePaginatedItems<T>(\n items: T[],\n currentPage: number,\n itemsPerPage: number,\n): { totalPages: number; pageItems: T[] } {\n const totalPages = useMemo(() => calculateTotalPages(items, itemsPerPage), [items, itemsPerPage]);\n const pageItems = useMemo(\n () => paginateItems(items, currentPage, itemsPerPage),\n [items, currentPage, itemsPerPage],\n );\n return { totalPages, pageItems };\n}\n\nexport function formatMoney(\n value: number,\n currencyCode?: string,\n locale: string = 'en-US',\n fractionDigits?: number,\n): string {\n const amount = Number.isFinite(value) ? value : 0;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {}\n }\n return fractionDigits !== undefined ? `$${amount.toFixed(fractionDigits)}` : `$${amount.toLocaleString()}`;\n}\n\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 } from '@nuskin/foundation-theme';\n\nexport const StyledIconButton = styled(IconButton)(() => ({\n padding: '4px',\n color: '#252525',\n '&:hover': {\n backgroundColor: 'rgba(37, 37, 37, 0.08)',\n },\n}));\n","import React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport {\n ConversionRateContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n FormulaDisplay,\n ChartContainer,\n TooltipContainer,\n TooltipLabel,\n TooltipValue,\n TooltipDetails,\n TitleRow,\n HeaderActionsContainer,\n} from './ConversionRateChart.styled';\nimport type { ConversionDataPoint, ConversionFilterOption, 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 {\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 };\nconst LINE_DOT = { r: 3, fill: '#3B82F6' };\nconst ACTIVE_DOT = { r: 5 };\n\ninterface CustomTooltipProps {\n readonly active?: boolean;\n readonly payload?: Array<{ payload?: unknown }>;\n}\n\nconst rateTickFormatter = (value: number | string): string => `${value}%`;\n\nconst CustomTooltip: React.FC<CustomTooltipProps> = ({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const data = payload[0].payload as ConversionDataPoint;\n return (\n <TooltipContainer>\n <TooltipLabel>{data.date}</TooltipLabel>\n <TooltipValue>{(data.rate ?? 0).toFixed(2)}%</TooltipValue>\n <TooltipDetails>\n {data.orders ?? 0} {getTranslation(Keys.widget.conversionRate.tooltipOrders)} /{' '}\n {(data.siteVisits ?? 0).toLocaleString()} {getTranslation(Keys.widget.conversionRate.tooltipVisits)}\n </TooltipDetails>\n </TooltipContainer>\n );\n};\n\nconst ConversionRateChartComponent: React.FC<ConversionRateChartProps> = ({\n conversionData,\n conversionFilter,\n 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 currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null || Math.abs(summaryChangePct) < 0.1) {\n return { direction: 'neutral', value: noChangeText };\n }\n const direction = summaryChangePct > 0 ? 'up' : 'down';\n const formatted = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(2)}%`;\n return { direction, value: formatted };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: noChangeText };\n const change = latestRate - previousRate;\n const percentageChange = (change / previousRate) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change.toFixed(2)}%`;\n return { direction, value: formattedChange };\n }, [summaryChangePct, conversionData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => conversionData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [conversionData],\n );\n\n if (isLoading && conversionData.length === 0) {\n return (\n <ConversionRateContainer data-testid=\"widget-conversion-rate\">\n <ChartWidgetSkeleton />\n </ConversionRateContainer>\n );\n }\n\n const chartAriaLabel = getTranslation(Keys.widget.conversionRate.chartAriaLabel);\n\n return (\n <ConversionRateContainer as=\"section\" data-testid=\"widget-conversion-rate\" aria-label={chartAriaLabel}>\n <ChartHeader>\n <TitleRow>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.conversionRate.titleAriaLabel)}\n data-testid=\"widget-title-conversion-rate\"\n >\n {title ?? getTranslation(Keys.defaults.conversionRate)}\n </ChartTitle>\n <HeaderActionsContainer>\n <FilterDropdown\n id=\"conversion-filter\"\n data-testid=\"conversion-filter-dropdown\"\n value={conversionFilter}\n onChange={handleFilterChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.conversionRate.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.defaults.all)}</option>\n <option value=\"standard\">{getTranslation(Keys.filter.conversionType.standard)}</option>\n <option value=\"subscription\">\n {getTranslation(Keys.filter.conversionType.subscription)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"conversion-rate\" onFullView={onTitleClick} 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={LINE_DOT}\n activeDot={ACTIVE_DOT}\n />\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n </ConversionRateContainer>\n );\n};\n\nexport const ConversionRateChart = React.memo(ConversionRateChartComponent);\nConversionRateChart.displayName = 'ConversionRateChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionRateContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const TitleRow = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`;\n\nexport const FormulaDisplay = styled('div')`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`;\n\nexport const TooltipContainer = styled('div')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`;\n\nexport const TooltipLabel = styled('div')`\n font-size: 11px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N10')};\n margin-bottom: 4px;\n`;\n\nexport const TooltipValue = styled('div')`\n font-size: 13px;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'A10')};\n`;\n\nexport const TooltipDetails = styled('div')`\n font-size: 10px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n margin-top: 2px;\n`;\n","import type { DateRangeOption } from '../types.d';\n\nexport const 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 React from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport { getTrendIcon, getTrendDirectionLabel } from '../../utils/trendUtils';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n SignupsContainer,\n ChartHeader,\n ChartTitle,\n FilterDropdown,\n MetricDisplay,\n MetricValue,\n MetricTrend,\n ChartContainer,\n Legend,\n LegendItem,\n LegendColor,\n LegendLabel,\n HeaderActionsContainer,\n} from './SignupsChart.styled';\nimport type { SignupDataPoint, SignupViewOption, 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 };\nconst LINE_DOT = { r: 2 };\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 <FilterDropdown\n id=\"signup-view\"\n data-testid=\"signup-view-dropdown\"\n value={signupView}\n onChange={handleViewChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.signups.filterAriaLabel)}\n >\n <option value=\"all\">{getTranslation(Keys.filter.signupView.showAll)}</option>\n <option value=\"members\">{getTranslation(Keys.filter.signupView.showMembers)}</option>\n <option value=\"retail\">{getTranslation(Keys.filter.signupView.showRetail)}</option>\n <option value=\"brandAffiliates\">\n {getTranslation(Keys.filter.signupView.showBrandAffiliates)}\n </option>\n </FilterDropdown>\n <WidgetMenu widgetId=\"signups\" onFullView={onTitleClick} 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={LINE_DOT}\n name={signupView === 'all' ? totalLabel : membersLabel}\n />\n )}\n {signupView === 'all' && (\n <>\n <Line\n type=\"monotone\"\n dataKey=\"members\"\n stroke={SERIES_COLORS.members}\n strokeWidth={2}\n dot={LINE_DOT}\n name={membersLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n </>\n )}\n {signupView === 'retail' && (\n <Line\n type=\"monotone\"\n dataKey=\"retail\"\n stroke={SERIES_COLORS.retail}\n strokeWidth={2}\n dot={LINE_DOT}\n name={retailLabel}\n />\n )}\n {signupView === 'brandAffiliates' && (\n <Line\n type=\"monotone\"\n dataKey=\"brandAffiliates\"\n stroke={SERIES_COLORS.brandAffiliates}\n strokeWidth={2}\n dot={LINE_DOT}\n name={brandAffiliatesLabel}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n\n {signupView === 'all' && (\n <Legend data-testid=\"signups-legend\">\n <LegendItem data-testid=\"legend-total\">\n <LegendColor color={SERIES_COLORS.total} />\n <LegendLabel>{totalLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-members\">\n <LegendColor color={SERIES_COLORS.members} />\n <LegendLabel>{membersLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-retail\">\n <LegendColor color={SERIES_COLORS.retail} />\n <LegendLabel>{retailLabel}</LegendLabel>\n </LegendItem>\n <LegendItem data-testid=\"legend-brandAffiliates\">\n <LegendColor color={SERIES_COLORS.brandAffiliates} />\n <LegendLabel>{brandAffiliatesLabel}</LegendLabel>\n </LegendItem>\n </Legend>\n )}\n </SignupsContainer>\n );\n};\n\nexport const SignupsChart = React.memo(SignupsChartComponent);\nSignupsChart.displayName = 'SignupsChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SignupsContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const MetricDisplay = styled('div')`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`;\n\nexport const MetricValue = styled('div')`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`;\n\nexport const MetricTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n flex-direction: row;\n gap: 6px;\n align-items: center;\n padding-top: 0;\n flex-wrap: nowrap;\n white-space: nowrap;\n\n .trend-line {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n line-height: 1;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return '#066100';\n if (direction === 'down') return '#DC2626';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 13px;\n height: 13px;\n flex-shrink: 0;\n }\n .change-value {\n font-weight: 600;\n line-height: 1;\n }\n .change-percent {\n font-weight: 400;\n line-height: 1;\n }\n }\n\n .comparison-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`;\n\nexport const ChartContainer = styled('div')`\n width: 100%;\n height: 220px;\n margin-top: 16px;\n\n @media (min-width: 768px) {\n height: 280px;\n }\n @media (min-width: 1080px) {\n height: 340px;\n }\n\n .recharts-cartesian-grid-horizontal line,\n .recharts-cartesian-grid-vertical line {\n stroke: ${({ theme }) => getGenomeColor(theme, 'N40')};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({ theme }) => getGenomeColor(theme, 'N70')};\n font-size: 10px;\n }\n`;\n\nexport const Legend = styled('div')`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendLabel = styled('span')`\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendValueWrapper,\n LegendTrendInline,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from './TopCategoriesPieChart.styled';\nimport type { CategoryRevenue, CategorySortOption, TrendDirection } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney } from '../../utils/dataUtils';\n\nexport interface TopCategoriesPieChartProps {\n readonly categories: CategoryRevenue[];\n readonly categorySort: CategorySortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly 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 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 CategorySortOption;\n onSortChange?.(newSort);\n },\n [onSortChange],\n );\n\n const { sortedCategories, totalRevenue, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedCategories = [...categories].sort((a, b) => {\n if (categorySort === 'revenue') return b.revenue - a.revenue;\n return (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) - (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n });\n\n const nextTotalRevenue = nextSortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n 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 nextSortedCategories,\n (category) => category.revenue,\n (category) => category.trend?.revenue,\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n sortedCategories: nextSortedCategories,\n totalRevenue: nextTotalRevenue,\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 // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label in the middle of the donut ring\n const radius = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize=\"10\"\n fontWeight=\"600\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0.2\"\n style={{ lineHeight: '12px' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading && categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-categories\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topCategories.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"categories-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topCategories.empty)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-categories\"\n aria-label={getTranslation(Keys.widget.topCategories.chartAriaLabel)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.topCategories.titleAriaLabel)}\n data-testid=\"widget-title-top-categories\"\n >\n {title ?? getTranslation(Keys.widget.topCategories.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"category-sort\"\n data-testid=\"category-sort-dropdown\"\n value={categorySort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"trend\">{getTranslation(Keys.defaults.byTrend)}</option>\n </SortDropdown>\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=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>\n {getTrendGraphIcon(trendDirection)}\n <span>{formattedTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"categories-legend-container\">\n {sortedCategories.map((category, index) => (\n <LegendItem key={category.id} data-testid={`category-legend-${index}`}>\n <LegendColor color={category.color} />\n <LegendInfo>\n <LegendName>\n {category.name.charAt(0).toUpperCase() + category.name.slice(1)}\n </LegendName>\n <LegendValueWrapper>\n <LegendValue>\n {formatMoney(category.revenue, category.currencyCode)} ({category.percentage}%)\n </LegendValue>\n {category.trend?.revenue ? (\n <LegendTrendInline\n direction={resolveTrendDirection(category.trend?.revenue)}\n data-testid={`category-legend-trend-${index}`}\n aria-label={category.trend.revenue}\n >\n {getTrendGraphIcon(resolveTrendDirection(category.trend?.revenue))}\n </LegendTrendInline>\n ) : null}\n </LegendValueWrapper>\n </LegendInfo>\n </LegendItem>\n ))}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopCategoriesPieChart = React.memo(TopCategoriesPieChartComponent);\nTopCategoriesPieChart.displayName = 'TopCategoriesPieChart';\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const CategoriesContainer = styled('div')`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n border-radius: 12px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n padding: 20px;\n }\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`;\n\nexport const ChartHeader = styled('div')`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`;\n\nexport const HeaderActionsContainer = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const ChartTitle = styled('h2')`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border: 0;\n background: transparent;\n padding: 0;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n color: ${({ theme }) => getGenomeColor(theme, 'A80')};\n }\n\n @media (min-width: 768px) {\n font-size: 18px;\n }\n\n @media (min-width: 1080px) {\n font-size: 18px;\n }\n`;\n\nexport const SortDropdown = styled('select')`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const ChartAndLegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n justify-content: center;\n flex: 1;\n\n @media (min-width: 768px) {\n flex-direction: row;\n gap: 24px;\n align-items: center;\n justify-content: center;\n }\n`;\n\nexport const ChartWrapper = styled('div')`\n position: relative;\n width: 100%;\n height: 220px;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n width: 260px;\n height: 260px;\n flex: 0 0 auto;\n }\n\n @media (min-width: 1080px) {\n width: 280px;\n height: 280px;\n flex: 0 0 auto;\n }\n\n /* Style recharts pie labels (percentages inside segments) */\n svg text {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n\n text[class*='recharts'] {\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 12px;\n font-weight: 700;\n fill: white;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n`;\n\nexport const DonutCenterOverlay = styled('div')`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 96px;\n`;\n\nexport const DonutCenterLabel = styled('div')`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const DonutCenterValue = styled('div')`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n`;\n\nexport const DonutCenterTrend = styled('div')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n margin-top: 4px;\n font-size: 12px;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return getGenomeColor(theme, 'N70');\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 0 1 auto;\n\n @media (min-width: 768px) {\n gap: 10px;\n }\n`;\n\nexport const LegendItem = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n @media (min-width: 768px) {\n gap: 10px;\n padding: 6px 0;\n }\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const LegendColor = styled('div')<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ color }) => color};\n flex-shrink: 0;\n`;\n\nexport const LegendInfo = styled('div')`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`;\n\nexport const LegendName = styled('div')`\n font-size: 13px;\n font-weight: 600;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 0;\n\n @media (min-width: 768px) {\n font-size: 14px;\n }\n`;\n\nexport const LegendValue = styled('div')`\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;\n\nexport const LegendPercentage = styled('div')`\n display: none;\n`;\n\nexport const LegendValueWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`;\n\nexport const LegendTrendInline = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const LegendTrend = styled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const EmptyState = styled('div')`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n text-align: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const EmptyStateText = styled('div')`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport {\n DashboardContainer,\n StatsRow,\n WidgetContainer,\n TwoColumnGrid,\n ErrorContainer,\n} from './ShoppingDashboard.styled';\nimport { DashboardHeader } from './shared/DashboardHeader';\nimport { StatsCard } from './shared/StatsCard';\nimport { TopSellingProductsList } from './shared/TopProducts/TopSellingProductsList';\nimport { ConversionRateChart } from './shared/ConversionRate/ConversionRateChart';\nimport { SignupsChart } from './shared/Signups/SignupsChart';\nimport { TopCategoriesPieChart } from './shared/TopCategories/TopCategoriesPieChart';\nimport type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ProductSortOption,\n SignupViewOption,\n ConversionFilterOption,\n CategorySortOption,\n} from './types.d';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from './TranslationKeys/ShoppingDashboardTranslationKeys';\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\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 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 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 onFilterChange={onConversionFilterChange}\n onTitleClick={onConversionTitleClick}\n onExport={onConversionExport}\n />\n <TopCategoriesPieChart\n categories={resolvedCategories}\n categorySort={categorySort}\n isLoading={isLoading}\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 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 signupData?: SignupDataPoint[];\n readonly categories?: CategoryRevenue[];\n readonly categoriesSummaryChangePct?: 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 signupData,\n categories,\n categoriesSummaryChangePct,\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 const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [signupView, setSignupView] = React.useState<SignupViewOption>(initialSignupView);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [categorySort, setCategorySort] = React.useState<CategorySortOption>(initialCategorySort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedSignups = signups ?? EMPTY_SIGNUPS;\n\n const updateView = React.useCallback(\n (view: MysiteDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): MysiteDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: MysiteDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: FullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleSignupViewChange = React.useCallback(\n (nextSignupView: SignupViewOption) => {\n setSignupView(nextSignupView);\n onSignupViewChange?.(nextSignupView);\n },\n [onSignupViewChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleCategorySortChange = React.useCallback(\n (nextSort: CategorySortOption) => {\n setCategorySort(nextSort);\n onCategorySortChange?.(nextSort);\n },\n [onCategorySortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleSignupsTitleClick = React.useCallback(() => {\n handleOpenFullView('signups');\n }, [handleOpenFullView]);\n\n const handleCategoriesTitleClick = React.useCallback(() => {\n handleOpenFullView('categories');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedTopProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={resolvedConversionData}\n orders={resolvedOrders}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'signups') {\n return (\n <SignupsFullView\n signupData={resolvedSignupData}\n signups={resolvedSignups}\n dateRange={dateRange}\n market={market}\n signupView={signupView}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onSignupViewChange={handleSignupViewChange}\n />\n );\n }\n\n if (currentView === 'categories') {\n return (\n <CategoriesFullView\n categories={resolvedCategories}\n dateRange={dateRange}\n market={market}\n categorySort={categorySort}\n 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 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 } 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) => <MetricValue>{formatMoney(Number(value), currencyCode)}</MetricValue>,\n },\n {\n key: 'volume',\n label: getTranslation(Keys.fullView.products.columns.volume),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n ],\n [currencyCode],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewTableSkeleton />\n </PageContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"products-fullview-empty\">\n {getTranslation(Keys.fullView.products.noProducts)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"products-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedRows}\n sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n getRowKey={(row: ProductRow) => row.rank}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCardsContainer data-testid=\"products-fullview-mobile-cards\">\n {paginatedRows.map((row) => (\n <MobileProductCard key={row.rank}>\n <MobileCardHeader>\n <MobileProductRank>#{row.rank}</MobileProductRank>\n <MobileProductDetails>\n <MobileProductName>{row.name}</MobileProductName>\n <MobileProductSku>{row.sku}</MobileProductSku>\n </MobileProductDetails>\n </MobileCardHeader>\n <MobileMetricsGrid>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.units)}</MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.revenue)}</MobileMetricLabel>\n <MobileMetricValue>{formatMoney(row.revenue, currencyCode)}</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 </MobileTitleWrapper>\n\n <HeaderContainer>\n <LeftSection>\n <Title data-testid=\"page-header-title\">{title}</Title>\n <DateRange data-testid=\"page-header-date-range\">{dateRange}</DateRange>\n </LeftSection>\n\n {filters && filters.length > 0 && onFilterChange && (\n <FiltersSection data-testid=\"page-header-filters\">\n {filters.map((filter) => (\n <FilterWrapper key={filter.key}>\n {renderFilterIcon(filter.icon)}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onFilterChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {filter.label && filter.key === 'customerType'\n ? `${filter.label} ${option.label}`\n : option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterWrapper>\n ))}\n </FiltersSection>\n )}\n\n <MobileDateRange>{dateRange}</MobileDateRange>\n </HeaderContainer>\n </PageHeaderWrapper>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageHeaderWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const BackButtonWrapper = styled('div')`\n display: flex;\n align-items: center;\n`;\n\nexport const BackButton = styled('button')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`;\n\nexport const LeftSection = styled('div')`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const Title = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const DateRange = styled('p')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n`;\n\nexport const MobileDateRange = styled('p')`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`;\n\nexport const FilterWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const FilterIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n font-size: 16px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`;\n\nexport const MobileTitleWrapper = styled('div')`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const MobileTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n`;\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableHeaderCell,\n TableBody,\n TableRow,\n TableCell,\n EmptyTableCell,\n SortIconContainer,\n} from './DataTable.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ColumnDef<TData = unknown> {\n key: string;\n label: string;\n sortable?: boolean;\n render?: (value: unknown, row: TData) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<TData = unknown> {\n readonly columns: ColumnDef<TData>[];\n readonly data: TData[];\n readonly sortable?: boolean;\n readonly onSort?: (columnKey: string, direction: 'asc' | 'desc') => void;\n readonly sortColumn?: string;\n readonly sortDirection?: 'asc' | 'desc';\n readonly getRowKey?: (row: TData, rowIndex: number) => React.Key;\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n sortable = false,\n onSort,\n sortColumn,\n sortDirection = 'asc',\n getRowKey,\n}: DataTableProps<TData>) => {\n const handleSort = (columnKey: string) => {\n if (!sortable || !onSort) return;\n const newDirection = sortColumn === columnKey && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(columnKey, newDirection);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, columnKey: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSort(columnKey);\n }\n };\n\n const getAriaSort = (columnKey: string): 'ascending' | 'descending' | undefined => {\n if (sortColumn !== columnKey) return undefined;\n return sortDirection === 'asc' ? 'ascending' : 'descending';\n };\n\n return (\n <TableContainer data-testid=\"data-table\">\n <Table>\n <TableHeader>\n <tr>\n {columns.map((column) => (\n <TableHeaderCell\n key={column.key}\n scope=\"col\"\n sortable={sortable && column.sortable}\n onClick={() => column.sortable && handleSort(column.key)}\n onKeyDown={(e) => column.sortable && handleKeyDown(e, column.key)}\n tabIndex={sortable && column.sortable ? 0 : -1}\n aria-sort={getAriaSort(column.key)}\n aria-label={`${column.label}${column.sortable ? getTranslation(Keys.dataTable.sortableColumn) : ''}`}\n data-testid={`table-header-${column.key}`}\n >\n {column.label}\n {sortable && column.sortable && (\n <SortIconContainer isActive={sortColumn === column.key}>\n {sortColumn === column.key && sortDirection === 'desc' ? (\n <ArrowDownwardIcon />\n ) : (\n <ArrowUpwardIcon />\n )}\n </SortIconContainer>\n )}\n </TableHeaderCell>\n ))}\n </tr>\n </TableHeader>\n <TableBody>\n {data.length === 0 ? (\n <TableRow data-testid=\"table-empty-row\">\n <EmptyTableCell colSpan={columns.length}>\n {getTranslation(Keys.dataTable.noDataAvailable)}\n </EmptyTableCell>\n </TableRow>\n ) : (\n data.map((row, rowIndex) => (\n <TableRow\n key={getRowKey ? getRowKey(row, rowIndex) : rowIndex}\n data-testid={`table-row-${rowIndex}`}\n >\n {columns.map((column) => (\n <TableCell key={column.key} data-testid={`table-cell-${column.key}`}>\n {column.render\n ? column.render((row as Record<string, unknown>)[column.key], row)\n : ((row as Record<string, unknown>)[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TableContainer = styled('div')`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n`;\n\nexport const Table = styled('table')`\n width: 100%;\n border-collapse: collapse;\n`;\n\nexport const TableHeader = styled('thead')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-bottom: 2px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n`;\n\nexport const TableHeaderCell = styled('th')<{ sortable?: boolean }>`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n cursor: ${({ sortable }) => (sortable ? 'pointer' : 'default')};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: -2px;\n }\n`;\n\nexport const TableBody = styled('tbody')``;\n\nexport const TableRow = styled('tr')`\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nexport const TableCell = styled('td')`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n`;\n\nexport const EmptyTableCell = styled(TableCell)`\n text-align: center;\n`;\n\nexport const SortIconContainer = styled('span')<{ isActive?: boolean }>`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({ isActive }) => (isActive ? 1 : 0.4)};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;\n","import React from 'react';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport { PaginationContainer, PageButton, PageInfo, NavButton } from './Pagination.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface PaginationProps {\n readonly currentPage: number;\n readonly totalPages: number;\n readonly onPageChange: (page: number) => void;\n readonly itemsPerPage?: number;\n readonly totalItems?: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n}) => {\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, action: () => void) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n action();\n }\n };\n\n const getPageNumbers = (): number[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: number[] = [];\n if (currentPage <= 4) {\n pages.push(1, 2, 3, 4, 5);\n } else if (currentPage >= totalPages - 3) {\n pages.push(totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(currentPage - 1, currentPage, currentPage + 1);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const startItem = itemsPerPage ? (currentPage - 1) * itemsPerPage + 1 : null;\n const endItem = itemsPerPage ? Math.min(currentPage * itemsPerPage, totalItems ?? Infinity) : null;\n const goToPageLabel = getTranslation(Keys.pagination.goToPage);\n\n return (\n <PaginationContainer data-testid=\"pagination\">\n <NavButton\n onClick={handlePrevious}\n onKeyDown={(e) => handleKeyDown(e, handlePrevious)}\n disabled={currentPage === 1}\n aria-label={getTranslation(Keys.pagination.previousPage)}\n data-testid=\"pagination-previous\"\n type=\"button\"\n >\n <ChevronLeftIcon />\n </NavButton>\n\n {totalPages > 7 && currentPage > 4 && (\n <>\n <PageButton\n onClick={() => onPageChange(1)}\n isActive={false}\n aria-label={`${goToPageLabel} 1`}\n data-testid=\"pagination-page-1\"\n type=\"button\"\n >\n 1\n </PageButton>\n <PageInfo>...</PageInfo>\n </>\n )}\n\n {pageNumbers.map((page) => (\n <PageButton\n key={page}\n onClick={() => onPageChange(page)}\n isActive={currentPage === page}\n aria-label={`${goToPageLabel} ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n data-testid={`pagination-page-${page}`}\n type=\"button\"\n >\n {page}\n </PageButton>\n ))}\n\n {totalPages > 7 && currentPage < totalPages - 3 && (\n <>\n <PageInfo>...</PageInfo>\n <PageButton\n onClick={() => onPageChange(totalPages)}\n isActive={false}\n aria-label={`${goToPageLabel} ${totalPages}`}\n data-testid={`pagination-page-${totalPages}`}\n type=\"button\"\n >\n {totalPages}\n </PageButton>\n </>\n )}\n\n <NavButton\n onClick={handleNext}\n onKeyDown={(e) => handleKeyDown(e, handleNext)}\n disabled={currentPage === totalPages}\n aria-label={getTranslation(Keys.pagination.nextPage)}\n data-testid=\"pagination-next\"\n type=\"button\"\n >\n <ChevronRightIcon />\n </NavButton>\n\n {itemsPerPage && totalItems && (\n <PageInfo as=\"output\" aria-live=\"polite\" data-testid=\"pagination-page-info\">\n {startItem}-{endItem} {getTranslation(Keys.pagination.of)} {totalItems}\n </PageInfo>\n )}\n </PaginationContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PaginationContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`;\n\nexport const PageButton = styled('button')<{ isActive?: boolean }>`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A80') : getGenomeColor(theme, 'N20')};\n color: ${({ theme, isActive }) => (isActive ? '#ffffff' : getGenomeColor(theme, 'N100'))};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A70') : getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\nexport const PageInfo = styled('span')`\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n margin: 0 8px;\n`;\n\nexport const NavButton = styled('button')`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`;\n\nexport const MetricChartCardSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const MetricSection = styled(Box)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({ theme }) => theme.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`;\n\nexport const MetricTrend = styled(Box)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`;\n\nexport const ComparisonText = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`;\n\nexport const ChartSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`;\n\nexport const ChartTitle = styled('h2')`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`;\n\nexport const ChartContainer = styled(Box)`\n width: 90%;\n height: 450px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 0;\n }\n`;\n\nexport const TableSection = styled(Box)<{ withCard?: boolean }>`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({ withCard = true, theme }) =>\n withCard &&\n `\n padding: 20px;\n background-color: ${getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`;\n\nexport const LoadingContainer = styled(Box)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`;\n\nexport const EmptyStateText = styled(Typography)`\n text-align: center;\n color: ${({ theme }) => theme.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`;\n\nexport const MobileCardName = styled(Typography)`\n font-weight: 600;\n font-size: 14px;\n`;\n\nexport const MobileCardSubtext = styled(Typography)`\n font-size: 13px;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileCardDetail = styled(Typography)`\n font-size: 13px;\n`;\n\nexport const MobileCardStatus = styled(Typography)<{ status: string }>`\n font-size: 13px;\n color: ${({ theme, status }) => (status === 'Active' ? theme.palette.success.main : theme.palette.warning.main)};\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const ProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const ProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const MobileCardsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileProductCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileCardHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`;\n\nexport const MobileProductRank = styled(Typography)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.primary.main};\n min-width: 24px;\n`;\n\nexport const MobileProductDetails = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const MobileProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n`;\n\nexport const MobileProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import useMediaQuery from '@mui/material/useMediaQuery';\n\nexport const MOBILE_VIEWPORT_QUERY = '(max-width:767px)';\n\nexport function useIsMobileViewport(): boolean {\n return useMediaQuery(MOBILE_VIEWPORT_QUERY, { noSsr: true });\n}\n","import React, { useState } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport type {\n ConversionDataPoint,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ConversionFilterOption,\n} from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n TableSection,\n} from '../FullViewComponents.styled';\nimport {\n MobileOrderCard,\n MobileOrderHeader,\n MobileCustomerInfo,\n MobileCustomerName,\n MobileOrderDate,\n MobileOrderId,\n MobileOrderMetrics,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n MobileOrdersContainer,\n DesktopTableContainer,\n OrderIdColumnCell,\n ConversionTrendChartContainer,\n ChartWithLegendWrapper,\n ChartLegendContainer,\n LegendItem,\n} from './ConversionRateFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateFullViewProps {\n readonly conversionData: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n}\n\nexport const ConversionRateFullView: React.FC<ConversionRateFullViewProps> = ({\n conversionData,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onConversionFilterChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trend = React.useMemo((): { direction: TrendDirection; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null)\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n let direction: TrendDirection = 'neutral';\n if (summaryChangePct > 0) direction = 'up';\n else if (summaryChangePct < 0) direction = 'down';\n return { direction, value: `${summaryChangePct >= 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%` };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const changePercent = ((latestRate - previousRate) / previousRate) * 100;\n if (Math.abs(changePercent) < 0.1) {\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n }\n let direction: TrendDirection = 'neutral';\n if (changePercent > 0) direction = 'up';\n else if (changePercent < 0) direction = 'down';\n return { direction, value: `${changePercent >= 0 ? '+' : ''}${changePercent.toFixed(1)}%` };\n }, [summaryChangePct, conversionData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'standard') return getTranslation(Keys.filter.conversionType.standard);\n if (filter === 'subscription') return getTranslation(Keys.filter.conversionType.subscription);\n return getTranslation(Keys.defaults.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.defaults.all) },\n { value: 'standard', label: getTranslation(Keys.filter.conversionType.standard) },\n { value: 'subscription', label: getTranslation(Keys.filter.conversionType.subscription) },\n ],\n },\n ],\n [conversionFilter, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'customerType') {\n onConversionFilterChange?.(value as ConversionFilterOption);\n setCurrentPage(1);\n }\n },\n [onConversionFilterChange, onDateRangeChange, onMarketChange],\n );\n\n const filteredOrders = React.useMemo(() => {\n if (conversionFilter === 'all') return orders;\n return orders.filter((order) => order.customerType.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(filteredOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(\n () => [\n {\n key: 'orderId',\n label: getTranslation(Keys.fullView.conversionRate.columns.orderId),\n sortable: true,\n render: (value) => <OrderIdColumnCell>{value as React.ReactNode}</OrderIdColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.defaults.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n { key: 'customerType', label: getTranslation(Keys.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, undefined, 2),\n },\n { key: 'bv', label: getTranslation(Keys.fullView.conversionRate.columns.bv), sortable: true },\n ],\n [],\n );\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'standard') return '#2e7d32';\n if (conversionFilter === 'subscription') return '#ed6c02';\n return '#1976d2';\n }, [conversionFilter]);\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.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 <div style={{ display: 'flex', alignItems: 'center', gap: '0px', flexWrap: 'wrap' }}>\n <MetricValue data-testid=\"conversion-rate-value\" style={{ marginRight: '6px' }}>\n {currentRate.toFixed(1)}%\n </MetricValue>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <span\n style={{\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 600,\n fontSize: '14px',\n lineHeight: '20px',\n letterSpacing: '0em',\n }}\n >\n {trend.value}\n </span>\n <span\n style={{\n marginLeft: '2px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 400,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.01em',\n color: '#5F5F5F',\n }}\n >\n {getComparedToText(dateRange)}\n </span>\n </MetricTrend>\n </div>\n </MetricSection>\n\n <ChartSection>\n <ChartWithLegendWrapper>\n <ConversionTrendChartContainer data-testid=\"conversion-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={conversionData} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis tickFormatter={(value) => `${value}%`} domain={[0, 'auto']} />\n <Tooltip\n formatter={(value: unknown) => {\n if (typeof value === 'number') return `${value.toFixed(2)}%`;\n if (typeof value === 'string') return value;\n return getTranslation(Keys.fullView.conversionRate.notAvailable);\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </ConversionTrendChartContainer>\n <ChartLegendContainer>\n <LegendItem style={{ color: getChartColor() }}>\n {`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n </LegendItem>\n </ChartLegendContainer>\n </ChartWithLegendWrapper>\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"conversion-fullview-table-section\">\n <ChartTitle data-testid=\"conversion-fullview-table-title\">\n {getTranslation(Keys.fullView.conversionRate.orderDetailsTitle)} ({filteredOrders.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"conversion-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedOrders}\n getRowKey={(row: OrderHistory) => row.orderId}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOrdersContainer data-testid=\"conversion-fullview-mobile-orders\">\n {paginatedOrders.map((order) => (\n <MobileOrderCard key={order.orderId}>\n <MobileOrderHeader>\n <MobileCustomerInfo>\n <MobileCustomerName>{order.customerName}</MobileCustomerName>\n <MobileOrderDate>{order.date}</MobileOrderDate>\n </MobileCustomerInfo>\n <MobileOrderId>{order.orderId}</MobileOrderId>\n </MobileOrderHeader>\n <MobileOrderMetrics>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.items)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.items}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.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 { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionTrendChartContainer = styled(Box)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`;\n\nexport const MobileOrderCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const MobileOrderHeader = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const MobileCustomerInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const MobileCustomerName = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n`;\n\nexport const MobileOrderDate = styled(Typography)`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileOrderId = styled('a')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const MobileOrderMetrics = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const MobileOrdersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const ChartWithLegendWrapper = styled(Box)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`;\n\nexport const ChartLegendContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`;\n\nexport const LegendItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const ComparisonTextMobile = styled(Typography)`\n margin-top: 4px;\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n @media (max-width: 767px) {\n font-size: 0.75rem;\n }\n`;\n\nexport const OrderIdColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { Box } from '@mui/material';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, 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} from './SignupsFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nconst SERIES_COLORS = { total: '#3B82F6', members: '#7B92A8', retail: '#A3B5C7', brandAffiliates: '#5F7388' };\n\nfunction toNumeric(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/,/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\n/**\n * Transform API response format to SignupDataPoint array\n * Handles both direct array format and nested API response with 'daily' array\n */\nfunction normalizeSignupDataInput(input: unknown): SignupDataPoint[] {\n // If it's already an array, return it\n if (Array.isArray(input)) {\n return input;\n }\n\n // Handle API response format with 'daily' array\n const apiResponse = input as Record<string, unknown>;\n if (Array.isArray(apiResponse.daily)) {\n return (apiResponse.daily as Array<Record<string, unknown>>).map((item) => ({\n date: String(item.date ?? ''),\n total: toNumeric(item.total),\n members: toNumeric(item.members),\n retail: toNumeric(item.retail),\n brandAffiliates: toNumeric(\n item.brandAffiliates ?? item.brandAffiliate ?? item.brand_affiliates ?? item.brand_affiliate,\n ),\n }));\n }\n\n // Fallback to empty array\n return [];\n}\n\nexport interface SignupsFullViewProps {\n /**\n * Signup data - can be either:\n * 1. Direct array of SignupDataPoint (camelCase format)\n * 2. API response object with 'daily' array (snake_case format)\n */\n readonly signupData: SignupDataPoint[] | { daily?: Array<Record<string, unknown>>; [key: string]: unknown };\n readonly signups: SignupDetail[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly signupView: SignupViewOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onSignupViewChange?: (view: SignupViewOption) => void;\n}\n\nexport const SignupsFullView: React.FC<SignupsFullViewProps> = ({\n signupData,\n signups,\n dateRange,\n market,\n signupView,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onSignupViewChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const normalizedSignupData = React.useMemo(() => {\n // First, transform API response format to array if needed\n const dataArray = normalizeSignupDataInput(signupData);\n\n // Then, normalize field names and values\n return dataArray.map((point) => {\n const rawPoint = point as unknown as Record<string, unknown>;\n const members = toNumeric(rawPoint.members);\n const retail = toNumeric(rawPoint.retail);\n const brandAffiliates = toNumeric(\n rawPoint.brandAffiliates ??\n rawPoint.brandAffiliate ??\n rawPoint.brand_affiliates ??\n rawPoint.brand_affiliate,\n );\n const total = toNumeric(rawPoint.total ?? rawPoint.all ?? rawPoint.signupTotal ?? rawPoint.value);\n\n return {\n ...point,\n total: total > 0 ? total : members + retail + brandAffiliates,\n members,\n retail,\n brandAffiliates,\n };\n });\n }, [signupData]);\n\n const totalSignups = React.useMemo(() => {\n if (normalizedSignupData.length === 0) return 0;\n 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 <span style={{ fontWeight: 600, lineHeight: 1 }}>\n {trend.absoluteChange > 0 ? '+' : ''}\n {trend.absoluteChange}\n </span>\n <span style={{ fontWeight: 400, lineHeight: 1 }}>{trend.percentageChange}</span>\n </>\n )}\n {trend.direction === 'neutral' && <span>{trend.percentageChange}</span>}\n </MetricTrend>\n <ComparisonTextMobile>{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 style={{ color: SERIES_COLORS.total }}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.defaults.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: 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 display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const NameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport TrendingUpIcon from '@mui/icons-material/TrendingUp';\nimport TrendingDownIcon from '@mui/icons-material/TrendingDown';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney, capitalizeFirstLetter } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n CategoryRevenue,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n CategorySortOption,\n TrendDirection,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n SummaryItemRow,\n SummaryItemInfo,\n SummaryItemName,\n SummaryItemSubtext,\n SummaryItemPercentage,\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrendIcon,\n DesktopTableContainer,\n MobileCategoriesContainer,\n MobileCategoryCard,\n CategoryNameColumnCell,\n} from './CategoriesFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\nimport { parseTrendPercent, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\n\nexport interface CategoriesFullViewProps {\n readonly categories: CategoryRevenue[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly categorySort: CategorySortOption;\n readonly 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: 'trend', label: getTranslation(Keys.defaults.byTrend) },\n ],\n },\n ],\n [categorySort, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onCategorySortChange?.(value as CategorySortOption);\n setCurrentPage(1);\n }\n },\n [onCategorySortChange, onDateRangeChange, onMarketChange],\n );\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n // eslint-disable-next-line react/prop-types\n const { cx, cy, midAngle, innerRadius, outerRadius, percentage } = props;\n const RADIAN = Math.PI / 180;\n // Position label more towards center of the donut ring, slightly inward\n const radius = innerRadius + (outerRadius - innerRadius) * 0.45;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"12\"\n fontWeight=\"700\"\n fontFamily=\"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n letterSpacing=\"0\"\n style={{ lineHeight: '14px', pointerEvents: 'none' }}\n >\n {`${percentage}%`}\n </text>\n );\n };\n\n const getTrendIcon = (direction: 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 (\n (parseTrendPercent(b.trend?.revenue) ?? -Infinity) -\n (parseTrendPercent(a.trend?.revenue) ?? -Infinity)\n );\n }),\n [categories, categorySort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 0);\n\n 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) => category.revenue,\n (category) => category.trend?.revenue,\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: nextTrendDirection,\n totalRevenueTrend: nextFormattedTrend,\n };\n }, [sortedCategories, summaryChangePct]);\n\n const topCategories = React.useMemo(() => sortedCategories.slice(0, 5), [sortedCategories]);\n\n const { totalPages, pageItems: paginatedCategories } = usePaginatedItems(\n sortedCategories,\n currentPage,\n itemsPerPage,\n );\n\n const columns: ColumnDef<CategoryRevenue>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.categories.columns.category),\n sortable: true,\n render: (_: unknown, row: CategoryRevenue) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <CategoryNameColumnCell>{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) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.categories.columns.percentOfTotal),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.defaults.trend),\n render: (_: unknown, row: CategoryRevenue) =>\n row.trend?.revenue ?? getTranslation(Keys.defaults.noValue),\n },\n ],\n [],\n );\n\n const currencyCode = sortedCategories[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"categories-fullview-empty\">\n {getTranslation(Keys.fullView.categories.noCategoryData)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"categories-fullview-top-section\">\n <ChartWrapper data-testid=\"categories-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>\n {getTrendIcon(totalRevenueTrendDirection)}\n <span>{totalRevenueTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"categories-fullview-summary\">\n {topCategories.map((category) => (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{capitalizeFirstLetter(category.name)}</SummaryName>\n <SummaryValue>{formatMoney(category.revenue, category.currencyCode)}</SummaryValue>\n <SummaryPercentage>({category.percentage}%)</SummaryPercentage>\n {category.trend?.revenue ? (\n <SummaryTrendIcon direction={resolveTrendDirection(category.trend.revenue)}>\n {getTrendIcon(resolveTrendDirection(category.trend.revenue))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n ))}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"categories-fullview-table-section\">\n <ChartTitle data-testid=\"categories-fullview-table-title\">\n {getTranslation(Keys.fullView.categories.allCategoriesTitle)} ({sortedCategories.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedCategories}\n sortable\n getRowKey={(row: CategoryRevenue) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCategoriesContainer>\n {paginatedCategories.map((category) => (\n <MobileCategoryCard key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryItemInfo>\n <SummaryItemName>{category.name}</SummaryItemName>\n <SummaryItemSubtext>\n {formatMoney(category.revenue, category.currencyCode)}\n </SummaryItemSubtext>\n </SummaryItemInfo>\n <SummaryItemPercentage>{category.percentage}%</SummaryItemPercentage>\n </MobileCategoryCard>\n ))}\n </MobileCategoriesContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedCategories.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled, ColorUtils } from '@nuskin/foundation-theme';\nimport { styled as muiStyled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SummaryItemRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const SummaryItemInfo = styled('div')`\n flex: 1;\n`;\n\nexport const SummaryItemName = styled('span')`\n font-weight: 600;\n`;\n\nexport const SummaryItemSubtext = styled('span')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryItemPercentage = styled('span')`\n font-weight: 600;\n`;\n\nexport const TopSection = muiStyled(Box)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`;\n\nexport const ChartWrapper = muiStyled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = muiStyled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = muiStyled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = muiStyled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = muiStyled(Typography)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const SummaryContainer = muiStyled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`;\n\nexport const SummaryItem = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = muiStyled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = muiStyled(Box)`\n display: none;\n`;\n\nexport const SummaryName = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nexport const SummaryValue = muiStyled(Typography)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`;\n\nexport const SummaryPercentage = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DesktopTableContainer = muiStyled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileCategoriesContainer = muiStyled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileCategoryCard = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const SummaryTrendIcon = muiStyled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const CategoryNameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React from 'react';\nimport {\n resolveTranslation,\n setTranslationResolver,\n type TranslateFn,\n type TranslationEntry,\n} from './TranslationKeys/translationResolver';\n\nexport function useTranslationResolver(translate?: TranslateFn): void {\n setTranslationResolver(translate);\n\n React.useEffect(() => {\n setTranslationResolver(translate);\n return () => {\n setTranslationResolver(undefined);\n };\n }, [translate]);\n}\n\nexport interface TranslationProviderProps {\n readonly translate?: TranslateFn;\n readonly children?: React.ReactNode;\n}\n\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({ translate, children }) => {\n useTranslationResolver(translate);\n return children ?? null;\n};\n\nexport function useTranslation(): (entry: TranslationEntry) => string {\n return React.useCallback((entry: TranslationEntry) => resolveTranslation(entry), []);\n}\n\nexport type { TranslateFn, TranslationEntry };\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const PoDashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TopChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const StatsCardStack = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`;\n\nexport const BottomChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendPercentage,\n LegendTrend,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from '../TopCategories/TopCategoriesPieChart.styled';\nimport type { TopPerformingOffer, OfferSortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { getTrendIcon, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney, capitalizeFirstLetter } from '../../utils/dataUtils';\n\nexport interface TopPerformingOffersPieChartProps {\n readonly offers: TopPerformingOffer[];\n readonly offerSort: OfferSortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\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, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [offers, offerSort]);\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading && offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topPerformingOffers.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"top-offers-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topPerformingOffers.emptyState)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-offers\"\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n data-testid=\"widget-title-top-offers\"\n >\n {title ?? getTranslation(Keys.widget.topPerformingOffers.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"offer-sort\"\n data-testid=\"offer-sort-dropdown\"\n value={offerSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"units\">{getTranslation(Keys.defaults.byUnits)}</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=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>{formattedTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"top-offers-legend-container\">\n {sortedOffers.map((offer, index) => {\n const legendTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{capitalizeFirstLetter(offer.name)}</LegendName>\n <LegendValue>{formatMoney(offer.revenue, offer.currencyCode)}</LegendValue>\n </LegendInfo>\n <LegendPercentage>{offer.percentage}%</LegendPercentage>\n {offer.trend?.revenue ? (\n <LegendTrend\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={offer.trend.revenue}\n >\n {getTrendIcon(legendTrendDirection)}\n </LegendTrend>\n ) : null}\n </LegendItem>\n );\n })}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopPerformingOffersPieChart = React.memo(TopPerformingOffersPieChartComponent);\nTopPerformingOffersPieChart.displayName = 'TopPerformingOffersPieChart';\n","import { resolveTranslation } from './translationResolver';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport const ProductOfferDashboardTranslationKeys = {\n title: { key: 'productOfferDashboard.title', fallback: 'Performance Overview' },\n error: { key: 'productOfferDashboard.error', fallback: 'Failed to load dashboard data. Please try again.' },\n\n stats: {\n revenue: { key: 'productOfferDashboard.stats.revenue', fallback: 'Total Revenue' },\n offersPurchased: { key: 'productOfferDashboard.stats.offersPurchased', fallback: 'Offers Purchased' },\n conversionRate: { key: 'productOfferDashboard.stats.conversionRate', fallback: 'Conversion Rate' },\n trendUp: { key: 'productOfferDashboard.stats.trendUp', fallback: 'Trending up' },\n trendDown: { key: 'productOfferDashboard.stats.trendDown', fallback: 'Trending down' },\n trendNeutral: { key: 'productOfferDashboard.stats.trendNeutral', fallback: 'No change' },\n comparedTo: { key: 'productOfferDashboard.stats.comparedTo', fallback: 'compared to this time last month' },\n },\n\n filter: {\n dateRange: {\n label: { key: 'productOfferDashboard.filter.dateRange.label', fallback: 'Date Range' },\n last7days: { key: 'productOfferDashboard.filter.dateRange.last7days', fallback: 'Last 7 Days' },\n last30days: { key: 'productOfferDashboard.filter.dateRange.last30days', fallback: 'Last 30 Days' },\n last90days: { key: 'productOfferDashboard.filter.dateRange.last90days', fallback: 'Last 90 Days' },\n thisMonth: { key: 'productOfferDashboard.filter.dateRange.thisMonth', fallback: 'This Month' },\n },\n market: {\n label: { key: 'productOfferDashboard.filter.market.label', fallback: 'Market' },\n all: { key: 'productOfferDashboard.filter.market.all', fallback: 'All Markets' },\n },\n offerSort: {\n byRevenue: { key: 'productOfferDashboard.filter.offerSort.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.filter.offerSort.byUnits', fallback: 'Units' },\n },\n productSort: {\n byUnits: { key: 'productOfferDashboard.filter.productSort.byUnits', fallback: 'Units' },\n byRevenue: { key: 'productOfferDashboard.filter.productSort.byRevenue', fallback: 'Revenue' },\n byVolume: { key: 'productOfferDashboard.filter.productSort.byVolume', fallback: 'Volume' },\n },\n conversionFilter: {\n overall: { key: 'productOfferDashboard.filter.conversionFilter.overall', fallback: 'Overall' },\n },\n },\n\n widget: {\n topProducts: {\n title: { key: 'productOfferDashboard.widget.topProducts.title', fallback: 'Top Selling Products' },\n emptyState: {\n key: 'productOfferDashboard.widget.topProducts.emptyState',\n fallback: 'No products data available',\n },\n },\n conversionRate: {\n title: { key: 'productOfferDashboard.widget.conversionRate.title', fallback: 'Conversion Rate' },\n subtitle: { key: 'productOfferDashboard.widget.conversionRate.subtitle', fallback: 'Orders ÷ Site visits' },\n },\n topPerformingOffers: {\n title: { key: 'productOfferDashboard.widget.topPerformingOffers.title', fallback: 'Top Performing Offers' },\n totalRevenue: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalRevenue',\n fallback: 'Total revenue',\n },\n emptyState: {\n key: 'productOfferDashboard.widget.topPerformingOffers.emptyState',\n fallback: 'No offers data available',\n },\n },\n menu: {\n fullView: { key: 'productOfferDashboard.widget.menu.fullView', fallback: 'Full View' },\n },\n },\n\n navigation: {\n back: { key: 'productOfferDashboard.navigation.back', fallback: 'Back to Dashboard' },\n },\n\n ariaLabel: {\n dashboard: {\n key: 'productOfferDashboard.ariaLabel.dashboard',\n fallback: 'Product Offer Performance Dashboard',\n },\n statsCard: { key: 'productOfferDashboard.ariaLabel.statsCard', fallback: 'Performance metric' },\n conversionChart: { key: 'productOfferDashboard.ariaLabel.conversionChart', fallback: 'Conversion rate chart' },\n topProducts: { key: 'productOfferDashboard.ariaLabel.topProducts', fallback: 'Top selling products' },\n topOffers: { key: 'productOfferDashboard.ariaLabel.topOffers', fallback: 'Top performing offers chart' },\n widgetMenu: { key: 'productOfferDashboard.ariaLabel.widgetMenu', fallback: 'Widget options menu' },\n filterDateRange: { key: 'productOfferDashboard.ariaLabel.filterDateRange', fallback: 'Filter by date range' },\n filterMarket: { key: 'productOfferDashboard.ariaLabel.filterMarket', fallback: 'Filter by market' },\n backButton: { key: 'productOfferDashboard.ariaLabel.backButton', fallback: 'Back to dashboard overview' },\n },\n\n fullView: {\n topOffers: {\n title: { key: 'productOfferDashboard.fullView.topOffers.title', fallback: 'Top Performing Offers' },\n columnName: { key: 'productOfferDashboard.fullView.topOffers.columnName', fallback: 'Offer Name' },\n columnRevenue: { key: 'productOfferDashboard.fullView.topOffers.columnRevenue', fallback: 'Revenue' },\n columnPercentage: { key: 'productOfferDashboard.fullView.topOffers.columnPercentage', fallback: 'Share' },\n columnTrend: { key: 'productOfferDashboard.fullView.topOffers.columnTrend', fallback: 'Trend' },\n },\n },\n\n defaults: {\n trendZero: { key: 'productOfferDashboard.defaults.trendZero', fallback: '+0%' },\n noData: { key: 'productOfferDashboard.defaults.noData', fallback: '--' },\n byRevenue: { key: 'productOfferDashboard.defaults.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.defaults.byUnits', fallback: 'Units' },\n byVolume: { key: 'productOfferDashboard.defaults.byVolume', fallback: 'Volume' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport type { TopPerformingOffer, TopProduct } from '../types.d';\nimport { exportTopPerformingOffers, exportTopProducts } from '../utils/productOfferExport';\n\nexport interface ProductOfferWidgetExportOptions {\n readonly topProducts: readonly TopProduct[];\n readonly topOffers: readonly TopPerformingOffer[];\n readonly topProductsExportData?: readonly TopProduct[];\n readonly topOffersExportData?: readonly TopPerformingOffer[];\n readonly showTopProductsExportOption?: boolean;\n readonly showTopOffersExportOption?: boolean;\n readonly isLoading?: boolean;\n}\n\nexport interface ProductOfferWidgetExportHandlers {\n readonly onTopProductsExport?: () => Promise<void>;\n readonly onTopOffersExport?: () => Promise<void>;\n}\n\nexport function useProductOfferWidgetExports({\n topProducts,\n topOffers,\n topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n isLoading = false,\n}: ProductOfferWidgetExportOptions): ProductOfferWidgetExportHandlers {\n const productRows = topProductsExportData ?? topProducts;\n const offerRows = topOffersExportData ?? topOffers;\n\n const canExportProducts = showTopProductsExportOption && !isLoading && productRows.length > 0;\n const canExportOffers = showTopOffersExportOption && !isLoading && offerRows.length > 0;\n\n const onTopProductsExport = React.useCallback(() => exportTopProducts(productRows), [productRows]);\n const onTopOffersExport = React.useCallback(() => exportTopPerformingOffers(offerRows), [offerRows]);\n\n return {\n onTopProductsExport: canExportProducts ? onTopProductsExport : undefined,\n onTopOffersExport: canExportOffers ? onTopOffersExport : 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 link.click();\n URL.revokeObjectURL(url);\n}\n","import type { 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\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","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 topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = 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 } = useProductOfferWidgetExports({\n topProducts: resolvedTopProducts,\n topOffers: resolvedTopOffers,\n topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption,\n showTopOffersExportOption,\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: {},\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 />\n <StatsCardStack data-testid=\"stats-card-stack\">\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.offersPurchased)}\n value={stats?.metrics?.offersPurchased ?? '0'}\n trendDirection={getTrendDirection(stats?.trend?.offersPurchased)}\n trendValue={stats?.trend?.offersPurchased}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-offers-purchased\"\n isLoading={isLoading}\n />\n </StatsCardStack>\n </TopChartsRow>\n\n <BottomChartsRow data-testid=\"bottom-charts-row\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onTopProductsExport}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\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 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 showTopProductsExportOption = true,\n showTopOffersExportOption = 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 const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [offerSort, setOfferSort] = React.useState<OfferSortOption>(initialOfferSort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n const resolvedAllProducts = allProducts ?? resolvedTopProducts;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedAllOffers = allOffers ?? resolvedTopOffers;\n\n const updateView = React.useCallback(\n (view: ProductOfferDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): ProductOfferDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: ProductOfferDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: ProductOfferFullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleOfferSortChange = React.useCallback(\n (nextSort: OfferSortOption) => {\n setOfferSort(nextSort);\n onOfferSortChange?.(nextSort);\n },\n [onOfferSortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleOffersTitleClick = React.useCallback(() => {\n handleOpenFullView('top-offers');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedAllProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={conversionFullViewData ?? resolvedConversionData}\n orders={resolvedOrders}\n summaryRate={conversionFullViewRate ?? conversionSummaryRate}\n summaryChangePct={conversionFullViewChangePct ?? conversionSummaryChangePct}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'top-offers') {\n return (\n <TopPerformingOffersFullView\n offers={resolvedAllOffers}\n dateRange={dateRange}\n market={market}\n offerSort={offerSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onOfferSortChange={handleOfferSortChange}\n />\n );\n }\n\n return (\n <ProductOfferDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n topOffers={resolvedTopOffers}\n isLoading={isLoading}\n error={error}\n dashboardTitle={dashboardTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n conversionFilter={conversionFilter}\n offerSort={offerSort}\n conversionSummaryRate={conversionSummaryRate}\n conversionSummaryChangePct={conversionSummaryChangePct}\n topProductsExportData={topProductsExportData}\n topOffersExportData={topOffersExportData}\n showTopProductsExportOption={showTopProductsExportOption}\n showTopOffersExportOption={showTopOffersExportOption}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onConversionFilterChange={handleConversionFilterChange}\n onOfferSortChange={handleOfferSortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onOffersTitleClick={handleOffersTitleClick}\n />\n );\n};\n\nexport default PoDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n TopPerformingOffer,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n OfferSortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { SummaryItemRow } from '../TopCategories/CategoriesFullView.styled';\nimport {\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryInfo,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrend,\n TableTrendCell,\n DesktopTableContainer,\n MobileOffersContainer,\n MobileOfferCard,\n MobileOfferHeader,\n MobileOfferName,\n MobileOfferMetricsGrid,\n MobileOfferMetricItem,\n MobileOfferMetricLabel,\n MobileOfferMetricValue,\n MobileOfferTrendValue,\n} from './TopPerformingOffersFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport {\n getTrendIcon,\n parseTrendPercent,\n resolveTrendDirection,\n calculateWeightedRevenueTrend,\n} from '../../utils/trendUtils';\n\nexport interface TopPerformingOffersFullViewProps {\n readonly offers: TopPerformingOffer[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly offerSort: OfferSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onOfferSortChange?: (sort: OfferSortOption) => void;\n}\n\nexport const TopPerformingOffersFullView: React.FC<TopPerformingOffersFullViewProps> = ({\n offers,\n dateRange,\n market,\n offerSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onOfferSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.defaults.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.defaults.byRevenue) },\n { value: 'units', label: getTranslation(Keys.defaults.byUnits) },\n ],\n },\n ],\n [dateRange, market, marketOptions, offerSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onOfferSortChange?.(value as OfferSortOption);\n setCurrentPage(1);\n }\n },\n [onOfferSortChange, onDateRangeChange, onMarketChange],\n );\n\n const sortedOffers = React.useMemo(\n () =>\n [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers]);\n\n const topOffers = React.useMemo(() => sortedOffers.slice(0, 5), [sortedOffers]);\n\n const { totalPages, pageItems: paginatedOffers } = usePaginatedItems(sortedOffers, currentPage, itemsPerPage);\n\n const columns: ColumnDef<TopPerformingOffer>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.topOffers.columnName),\n sortable: true,\n render: (_: unknown, row: TopPerformingOffer) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <span>{row.name}</span>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.topOffers.columnRevenue),\n sortable: true,\n render: (value: unknown, row: TopPerformingOffer) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.topOffers.columnPercentage),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.topOffers.columnTrend),\n render: (_: unknown, row: TopPerformingOffer) => {\n if (!row.trend?.revenue) return getTranslation(Keys.defaults.noData);\n const columnTrendDirection = resolveTrendDirection(row.trend.revenue);\n return (\n <TableTrendCell direction={columnTrendDirection}>\n {getTrendIcon(columnTrendDirection)}\n <span>{row.trend.revenue}</span>\n </TableTrendCell>\n );\n },\n },\n ],\n [],\n );\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"top-offers-fullview-empty\">\n {getTranslation(Keys.widget.topPerformingOffers.emptyState)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"top-offers-fullview-top-section\">\n <ChartWrapper data-testid=\"top-offers-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>{totalRevenueTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"top-offers-fullview-summary\">\n {topOffers.map((offer) => {\n const summaryTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>{formatMoney(offer.revenue, offer.currencyCode)}</SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{offer.percentage}%</SummaryPercentage>\n {offer.trend?.revenue ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={offer.trend.revenue}>\n {getTrendIcon(summaryTrendDirection)}\n </SummaryTrend>\n ) : null}\n </SummaryItem>\n );\n })}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"top-offers-table\">\n <ChartTitle data-testid=\"top-offers-fullview-table-title\">\n {getTranslation(Keys.fullView.topOffers.title)} ({sortedOffers.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedOffers}\n sortable\n getRowKey={(row: TopPerformingOffer) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOffersContainer>\n {paginatedOffers.map((offer) => {\n const trendPercent = parseTrendPercent(offer.trend?.revenue);\n let trendDirection: 'up' | 'down' | 'neutral' = 'neutral';\n if (trendPercent !== null && trendPercent > 0) trendDirection = 'up';\n else if (trendPercent !== null && trendPercent < 0) trendDirection = 'down';\n\n return (\n <MobileOfferCard key={offer.id}>\n <MobileOfferHeader>\n <ColorDot dotColor={offer.color} />\n <MobileOfferName>{offer.name}</MobileOfferName>\n </MobileOfferHeader>\n <MobileOfferMetricsGrid>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnRevenue)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {formatMoney(offer.revenue, offer.currencyCode)}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnPercentage)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>{offer.percentage}%</MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnTrend)}\n </MobileOfferMetricLabel>\n <MobileOfferTrendValue direction={trendDirection}>\n {offer.trend?.revenue ? (\n <>\n {getTrendIcon(trendDirection)}\n <span>{offer.trend.revenue}</span>\n </>\n ) : (\n getTranslation(Keys.defaults.noData)\n )}\n </MobileOfferTrendValue>\n </MobileOfferMetricItem>\n </MobileOfferMetricsGrid>\n </MobileOfferCard>\n );\n })}\n </MobileOffersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedOffers.length}\n data-testid=\"top-offers-pagination\"\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport type { TrendDirection } from '../types';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TopSection = styled(Box)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const ChartWrapper = styled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = styled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = styled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = styled(Typography)<{ direction: TrendDirection }>`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n`;\n\nexport const SummaryContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`;\n\nexport const SummaryItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = styled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const SummaryName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const SummaryValue = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryPercentage = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`;\n\nexport const SummaryTrend = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const TableTrendCell = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileOffersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileOfferCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileOfferHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const MobileOfferName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n word-break: break-word;\n`;\n\nexport const MobileOfferMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileOfferMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileOfferMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileOfferMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const MobileOfferTrendValue = styled(Typography)<{ direction: TrendDirection }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const FilterContainer = styled('div')`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`;\n\nexport const FilterLabel = styled('label')`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport { FilterContainer, FilterDropdown, FilterLabel } from './FilterBar.styled';\nimport type { FilterConfig } from './types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface FilterBarProps {\n readonly filters: FilterConfig[];\n readonly onChange: (filterKey: string, value: string) => void;\n}\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ filters, onChange }) => {\n return (\n <FilterContainer data-testid=\"filter-bar\">\n {filters.map((filter) => (\n <FilterLabel key={filter.key} htmlFor={`filter-${filter.key}`}>\n {filter.label}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterLabel>\n ))}\n </FilterContainer>\n );\n};\n","import type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n} from '../types.d';\n\nexport const mockStats: DashboardStats = {\n shopTitle: 'My NuSkin Shop',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$9,453',\n volume: '1,211',\n siteVisits: '17,935',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+12.5%',\n volume: '+8.3%',\n siteVisits: '-2.1%',\n },\n};\n\nexport const mockTopProducts: TopProduct[] = [\n {\n id: 'prod-001',\n rank: 1,\n name: 'ageLOC LumiSpa',\n imageUrl: '',\n unitsSold: 342,\n revenue: 29580,\n volume: 245,\n trend: { units: '+15%', revenue: '+12%', volume: '+8%' },\n },\n {\n id: 'prod-002',\n rank: 2,\n name: 'Pharmanex LifePak',\n imageUrl: '',\n unitsSold: 287,\n revenue: 24395,\n volume: 198,\n trend: { units: '+8%', revenue: '+10%', volume: '+5%' },\n },\n {\n id: 'prod-003',\n rank: 3,\n name: 'ageLOC Meta',\n imageUrl: '',\n unitsSold: 256,\n revenue: 21760,\n volume: 176,\n trend: { units: '-3%', revenue: '-1%', volume: '-2%' },\n },\n {\n id: 'prod-004',\n rank: 4,\n name: 'Nu Skin 180 System',\n imageUrl: '',\n unitsSold: 198,\n revenue: 17820,\n volume: 142,\n trend: { units: '+22%', revenue: '+18%', volume: '+15%' },\n },\n {\n id: 'prod-005',\n rank: 5,\n name: 'Epoch Baobab Body Butter',\n imageUrl: '',\n unitsSold: 176,\n revenue: 8800,\n volume: 88,\n trend: { units: '+5%', revenue: '+3%', volume: '+2%' },\n },\n];\n\nexport const mockConversionData: ConversionDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n rate: Number((4 + (i % 15) * 0.1).toFixed(2)),\n orders: 200 + ((i * 13) % 100),\n siteVisits: 4000 + ((i * 97) % 2000),\n };\n});\n\nexport const mockConversionDataStandard: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n}));\n\nexport const mockConversionDataSubscription: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n}));\n\nexport const mockSignupData: SignupDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const total = 80 + ((i * 11) % 40);\n const members = Math.floor(total * 0.4);\n const retail = Math.floor(total * 0.35);\n const brandAffiliates = total - members - retail;\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n total,\n members,\n retail,\n brandAffiliates,\n };\n});\n\nexport const mockCategories: CategoryRevenue[] = [\n {\n id: 'cat-001',\n name: 'Favorites',\n revenue: 45200,\n percentage: 29,\n color: '#C95D63',\n trend: { revenue: '+8%', units: '+10%' },\n },\n {\n id: 'cat-002',\n name: 'Daily Routine',\n revenue: 42100,\n percentage: 27,\n color: '#6C7A9B',\n trend: { revenue: '+12%', units: '+15%' },\n },\n {\n id: 'cat-003',\n name: 'Fit & Trim Body',\n revenue: 34300,\n percentage: 22,\n color: '#E8975E',\n trend: { revenue: '-3%', units: '-1%' },\n },\n {\n id: 'cat-004',\n name: 'Dull Skin',\n revenue: 24900,\n percentage: 16,\n color: '#5F8FC4',\n trend: { revenue: '+5%', units: '+7%' },\n },\n {\n id: 'cat-005',\n name: 'Acne',\n revenue: 9400,\n percentage: 6,\n color: '#A2C3B3',\n trend: { revenue: '+2%', units: '+3%' },\n },\n];\n\nexport const mockOrders: OrderHistory[] = Array.from({ length: 50 }, (_, i) => {\n const firstNames = ['Sarah', 'John', 'Emma', 'Michael', 'Olivia', 'William', 'Ava', 'James'];\n const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n orderId: `ORD-${String(10000 + i).padStart(5, '0')}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n customerName: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n customerType: i % 3 === 0 ? 'Subscription' : 'Standard',\n items: (i % 5) + 1,\n total: Number((50 + ((i * 17) % 200) + (i % 10) * 0.1).toFixed(2)),\n bv: 30 + ((i * 9) % 150),\n };\n});\n\nexport const mockSignupDetails: SignupDetail[] = Array.from({ length: 30 }, (_, i) => {\n const firstNames = ['Alice', 'Bob', 'Carol', 'David', 'Eva', 'Frank', 'Grace', 'Henry'];\n const lastNames = ['Anderson', 'Baker', 'Clark', 'Davis', 'Evans', 'Fisher', 'Grant', 'Hall'];\n const types: ('Member' | 'Retail' | 'Brand Affiliate')[] = ['Member', 'Retail', 'Brand Affiliate'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n id: `SU-${String(1000 + i).padStart(4, '0')}`,\n name: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n type: types[i % types.length],\n email: `${firstNames[i % firstNames.length].toLowerCase()}.${lastNames[i % lastNames.length].toLowerCase()}@example.com`,\n status: i % 4 === 0 ? 'Pending' : 'Active',\n };\n});\n","import type { ProductOfferDashboardStats, TopPerformingOffer } from '../types.d';\n\nexport { mockTopProducts, mockConversionData, mockOrders } from './mockDashboardData';\n\nexport const mockProductOfferStats: ProductOfferDashboardStats = {\n shopTitle: 'Performance Overview',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$5,208',\n offersPurchased: '285',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+2.3%',\n offersPurchased: '+3.7%',\n },\n};\n\nexport const mockProductOfferStatsPositiveTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+5.1%',\n offersPurchased: '+12.5%',\n },\n};\n\nexport const mockProductOfferStatsNegativeTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '-1.8%',\n offersPurchased: '-3.7%',\n },\n};\n\nexport const mockProductOfferStatsNeutralTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockProductOfferStatsZeroOffers: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n metrics: {\n ...mockProductOfferStats.metrics,\n offersPurchased: '0',\n },\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockTopOffers: TopPerformingOffer[] = [\n {\n id: 'offer-1',\n name: 'Winter Skincare Bundle',\n revenue: 2800,\n percentage: 29,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n percentage: 27,\n color: '#E8915A',\n trend: { revenue: '+3.1%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n percentage: 22,\n color: '#C75B5B',\n trend: { revenue: '-1.5%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n percentage: 16,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n percentage: 6,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%' },\n },\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["/gitlab-runner-data/builds/nextgen-development/mysite/npm/react-mysite-elements/dist/index.mjs","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../src/common/card/NsProductCard.tsx","../src/common/card/styles/NsProductCard.Styled.tsx","../src/common/carousel/NsProductCarousel.tsx","../src/common/carousel/NsProductCarousel.styled.ts","../src/common/carousel/ProductTabCarousel.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.tsx","../src/common/Nav-Category-Navigation/NsCategoryNavigation.styled.tsx","../src/common/carousel/ProductTabCarousel.styled.tsx","../src/common/headers/MysiteHero.tsx","../src/common/headers/MysiteHero.styled.tsx","../src/common/icon/icons/PlaceholderImage.tsx","../src/common/icon/icons/ArrowDownIcon.tsx","../src/common/utils/gtmTracking.ts","../src/common/shopping-dashboard/ShoppingDashboard.styled.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.tsx","../src/common/shopping-dashboard/shared/DashboardHeader.styled.tsx","../src/common/shopping-dashboard/TranslationKeys/translationResolver.ts","../src/common/shopping-dashboard/TranslationKeys/ShoppingDashboardTranslationKeys.ts","../src/common/shopping-dashboard/utils/marketOptions.ts","../src/common/shopping-dashboard/shared/StatsCard.tsx","../src/common/shopping-dashboard/shared/StatsCard.styled.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.tsx","../src/common/shopping-dashboard/shared/LoadingSkeletons.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.tsx","../src/common/shopping-dashboard/utils/trendUtils.tsx","../src/common/shopping-dashboard/utils/dataUtils.ts","../src/common/shopping-dashboard/shared/TopProducts/TopSellingProductsList.styled.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.tsx","../src/common/shopping-dashboard/shared/WidgetMenu.styled.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateChart.styled.tsx","../src/common/shopping-dashboard/utils/dateConstants.ts","../src/common/shopping-dashboard/utils/dateFormat.ts","../src/common/shopping-dashboard/utils/comparisonTextUtils.ts","../src/common/shopping-dashboard/shared/Signups/SignupsChart.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsChart.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.tsx","../src/common/shopping-dashboard/shared/TopCategories/TopCategoriesPieChart.styled.tsx","../src/common/shopping-dashboard/ShoppingDashboard.tsx","../src/common/shopping-dashboard/MysiteDashboardWithNavigation.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.tsx","../src/common/shopping-dashboard/shared/PageHeader.tsx","../src/common/shopping-dashboard/shared/PageHeader.styled.tsx","../src/common/shopping-dashboard/shared/DataTable.tsx","../src/common/shopping-dashboard/shared/DataTable.styled.tsx","../src/common/shopping-dashboard/shared/Pagination.tsx","../src/common/shopping-dashboard/shared/Pagination.styled.tsx","../src/common/shopping-dashboard/shared/FullViewComponents.styled.tsx","../src/common/shopping-dashboard/shared/TopProducts/ProductsFullView.styled.tsx","../src/common/shopping-dashboard/shared/useViewport.ts","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.tsx","../src/common/shopping-dashboard/shared/ConversionRate/ConversionRateFullView.styled.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.tsx","../src/common/shopping-dashboard/shared/Signups/SignupsFullView.styled.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.tsx","../src/common/shopping-dashboard/shared/TopCategories/CategoriesFullView.styled.tsx","../src/common/shopping-dashboard/TranslationContext.tsx","../src/common/shopping-dashboard/ProductOfferDashboard.styled.tsx","../src/common/shopping-dashboard/shared/TopPerformingOffers/TopPerformingOffersPieChart.tsx","../src/common/shopping-dashboard/TranslationKeys/ProductOfferDashboardTranslationKeys.ts","../src/common/shopping-dashboard/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":["Ep","Object","create","kn","defineProperty","Ap","getOwnPropertyDescriptor","zp","getOwnPropertyNames","Bp","getPrototypeOf","Hp","prototype","hasOwnProperty","Sa","e","t","exports","Wp","o","n","i","call","get","enumerable","_p","__esModule","value","require_ReactPropTypesSecret","__commonJSMin","module","ReactPropTypesSecret","require_factoryWithThrowingShims","emptyFunction","emptyFunctionWithReset","jn","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","qn","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","Qn","React","Tabs","Tab","NsCategoryNavigationContainer","div","TabPanel","other","role","hidden","id","propTypes","hr","NsCategoryNavigation","itemArray","controlledValue","onChange","ti","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","standard","subscription","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","retail","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","ArrowUpwardIcon","ArrowDownwardIcon","RemoveIcon","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","formatMoney","currencyCode","locale","fractionDigits","amount","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","format","toLocaleString","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","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","CHART_MARGIN","AXIS_TICK","HollowDot","fillOpacity","stroke","strokeWidth","ActiveHollowDot","rateTickFormatter","CustomTooltip","active","payload","rate","orders","siteVisits","ConversionRateChartComponent","conversionData","conversionFilter","summaryRate","summaryChangePct","onFilterChange","handleFilterChange","newFilter","noDataText","noChangeText","currentRate","at","trendInfo","latestRate","previousRate","change","percentageChange","formattedChange","formattedData","shortDate","strokeDasharray","dataKey","tick","tickLine","interval","tickFormatter","domain","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","CategoriesContainer","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","MobileTitleWrapper","MobileTitle","buildDateRangeFilter","buildMarketFilter","PageHeader","onBack","filters","renderFilterIcon","iconType","TableContainer","Table","TableHeader","TableHeaderCell","sortable","TableBody","TableRow","TableCell","EmptyTableCell","SortIconContainer","isActive","DataTable","onSort","sortColumn","sortDirection","getRowKey","handleSort","columnKey","handleKeyDown","getAriaSort","column","scope","colSpan","row","rowIndex","render","ChevronLeftIcon","ChevronRightIcon","PaginationContainer","PageButton","PageInfo","NavButton","Pagination","onPageChange","totalItems","handlePrevious","handleNext","action","pageNumbers","from","pages","startItem","endItem","goToPageLabel","page","PageContainer","MetricChartCardSection","shadows","MetricSection","palette","primary","success","main","secondary","ComparisonText","ChartSection","TableSection","withCard","MobileCardName","MobileCardSubtext","MobileCardDetail","MobileCardStatus","warning","ProductSku","MobileCardsContainer","DesktopTableContainer","MobileProductCard","divider","MobileCardHeader","MobileProductRank","MobileProductDetails","MobileProductName","MobileProductSku","MobileMetricsGrid","MobileMetricItem","MobileMetricLabel","MobileMetricValue","MOBILE_VIEWPORT_QUERY","useIsMobileViewport","noSsr","mapProductToRow","sku","padStart","ProductsFullView","setCurrentPage","setSortColumn","setSortDirection","isMobileView","handleBack","productRows","sortedRows","paginatedRows","ConversionTrendChartContainer","MobileOrderCard","MobileOrderHeader","MobileCustomerInfo","MobileCustomerName","MobileOrderDate","MobileOrderId","MobileOrderMetrics","MobileOrdersContainer","ChartWithLegendWrapper","ChartLegendContainer","$color","ComparisonTextMobile","OrderIdColumnCell","TrendValueText","TrendComparisonText","MetricSectionWrapper","ConversionRateFullView","changePercent","getConversionFilterLabel","conversionFilterLabel","filteredOrders","order","customerType","paginatedOrders","getChartColor","customerName","MobileSignupsContainer","MobileSignupCard","SignupTrendChartContainer","NameColumnCell","TrendAbsoluteChangeText","TrendPercentageChangeText","toNumeric","parsed","normalizeSignupDataInput","input","isArray","apiResponse","daily","brandAffiliate","brand_affiliates","brand_affiliate","SignupsFullView","normalizedSignupData","point","rawPoint","signupTotal","absoluteChange","first","last","round","hasSignupTrendData","paginatedSignups","connectNulls","signup","muiStyled","SummaryItemRow","SummaryItemInfo","SummaryItemName","SummaryItemSubtext","SummaryItemPercentage","TopSection","SummaryContainer","SummaryItem","ColorDot","dotColor","SummaryInfo","SummaryName","SummaryValue","SummaryPercentage","MobileCategoriesContainer","MobileCategoryCard","SummaryTrendIcon","CategoryNameColumnCell","CategoriesFullView","parseFloat","isNaN","totalRevenueTrendDirection","totalRevenueTrend","paginatedCategories","useTranslationResolver","translate","TranslationProvider","useTranslation","DEFAULT_HISTORY_STATE_KEY","EMPTY_ORDERS","EMPTY_SIGNUPS","isRecord","isMysiteDashboardView","readViewFromState","state","stateKey","buildStateWithView","buildLocationWithState","pathname","search","hash","MysiteDashboardWithNavigation","initialDateRange","initialMarket","initialProductSort","initialSignupView","initialConversionFilter","initialCategorySort","historyAdapter","historyStateKey","resetToDashboardOnMount","currentView","setCurrentView","hasIntraDashboardHistoryRef","setDateRange","setMarket","setProductSort","setSignupView","setConversionFilter","setCategorySort","resolvedOrders","resolvedSignups","updateView","readCurrentView","writeCurrentView","mode","nextState","nextLocation","replaceState","pushState","listen","nextView","handlePopState","handleOpenFullView","goBack","back","nextDateRange","nextMarket","handleProductSortChange","nextProductSort","handleSignupViewChange","nextSignupView","handleConversionFilterChange","nextFilter","handleCategorySortChange","nextSort","handleProductsTitleClick","handleConversionTitleClick","handleSignupsTitleClick","handleCategoriesTitleClick","PoDashboardContainer","TopChartsRow","StatsCardStack","BottomChartsRow","ProductOfferDashboardTranslationKeys","offersPurchased","trendUp","trendDown","trendNeutral","comparedTo","offerSort","overall","emptyState","topPerformingOffers","statsCard","conversionChart","topOffers","widgetMenu","filterDateRange","filterMarket","backButton","columnName","columnRevenue","columnPercentage","columnTrend","trendZero","TopPerformingOffersPieChartComponent","offers","sortedOffers","nextSortedOffers","offer","legendTrendDirection","TopPerformingOffersPieChart","INVALID_SHEET_NAME_CHARS","normalizeExcelFileName","fileName","trimmedFileName","resolvedFileName","endsWith","normalizeExcelSheetName","sheetName","normalizedSheetName","exportRowsToExcel","rows","Workbook","workbook","worksheet","buffer","addWorksheet","header","forEach","worksheetRow","addRow","xlsx","writeBuffer","downloadExcelBuffer","blob","Blob","Uint8Array","URL","createObjectURL","link","download","body","appendChild","click","removeChild","revokeObjectURL","topProductColumns","topOfferColumns","exportTopProducts","exportTopPerformingOffers","useProductOfferWidgetExports","topProductsExportData","topOffersExportData","showTopProductsExportOption","showTopOffersExportOption","offerRows","canExportProducts","canExportOffers","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","mockConversionDataStandard","mockConversionDataSubscription","mockSignupData","months","floor","mockCategories","mockOrders","firstNames","lastNames","toLocaleDateString","day","mockSignupDetails","types","mockProductOfferStats","mockProductOfferStatsPositiveTrend","mockProductOfferStatsNegativeTrend","mockProductOfferStatsNeutralTrend","mockProductOfferStatsZeroOffers","mockTopOffers","sn","vo","Xo","Ql","Xl","Ho","lt","$f","Si","Ra","Pa","ge","dt","Lf","mr","ProductCarousel","fn","N","cc","Zo","Qa","$r","nn","Mt","Zr","xn","ha","Co","Kg","nt","Ei","Jc","bl","xa","un","cn","ts","cu","Ya","Ja","es","Ot","ja","pu","Dc","jc","Be","Ip","or","Cn","Lo","$p","Vp","Np","Af","wn","ap","np","yl","Ai","ze","Cr","Yc","gn","Gg","Oo"],"mappings":"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","sourcesContent":["var Ep=Object.create;var kn=Object.defineProperty;var Ap=Object.getOwnPropertyDescriptor;var zp=Object.getOwnPropertyNames;var Bp=Object.getPrototypeOf,Hp=Object.prototype.hasOwnProperty;var Sa=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Wp=(e,t,o,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of zp(t))!Hp.call(e,i)&&i!==o&&kn(e,i,{get:()=>t[i],enumerable:!(n=Ap(t,i))||n.enumerable});return e};var _p=(e,t,o)=>(o=e!=null?Ep(Bp(e)):{},Wp(t||!e||!e.__esModule?kn(o,\"default\",{value:e,enumerable:!0}):o,e));var jn=Sa((ym,Gn)=>{\"use strict\";var Qp=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";Gn.exports=Qp});var qn=Sa((wm,Zn)=>{\"use strict\";var ec=jn();function Yn(){}function Jn(){}Jn.resetWarningCache=Yn;Zn.exports=function(){function e(n,i,s,l,d,g){if(g!==ec){var f=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 f.name=\"Invariant Violation\",f}}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:Jn,resetWarningCache:Yn};return o.PropTypes=o,o}});var Qn=Sa((km,Xn)=>{\"use strict\";Xn.exports=qn()();var Cm,vm});import{useState as Up}from\"react\";import{NsImage as Kp}from\"@nuskin/foundation-ui-components\";import{styled as Et}from\"@nuskin/foundation-theme\";var Tn=Et(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 5px;\n`,Sn=Et(\"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`,Dn=Et(\"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`,Pn=Et(\"img\")`\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n display: block;\n`,Rn=Et(\"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`,Da=Et(\"div\")`\n width: 200px;\n text-align: left;\n margin-bottom: 12px;\n @media (max-width: 560px) {\n margin-bottom: 8px;\n }\n`,Mn=Et(\"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`,On=Et(\"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 Gp}from\"@mui/material\";import{jsx as ut,jsxs as Fn}from\"react/jsx-runtime\";var jp=({productTitle:e,imageDetails:t,className:o,button:n,onCardClick:i,productStatusBadge:s,directSellerBadge:l,mySitePriceComponent:d,testId:g})=>{let[f,u]=Up(!1),y=Gp(\"(max-width: 560px)\"),x=h=>{let T=h.target,P=t?.fallbackImage;P&&T.src!==P&&(T.src=P)};return Fn(Sn,{className:o,onClick:i,tabIndex:0,\"data-testid\":\"product-card\",isMobile:y,children:[ut(Dn,{bgColor:t?.bgColor,onError:x,children:t?.imageSrc?ut(Kp,{\"data-testid\":g??\"test-product-image\",className:t.className??\"\",src:t.imageSrc,alt:t.imageAlt,\"aria-label\":t.areaLabel??t.imageAlt,width:\"100%\"}):ut(Pn,{alt:\"\"})}),ut(Rn,{title:e,\"data-testid\":\"product-title\",children:e}),l&&ut(Da,{children:l}),ut(Da,{children:s}),ut(Tn,{children:d}),n?.showButton&&Fn(Mn,{tabIndex:0,\"aria-roledescription\":\":\",\"aria-label\":n.buttonText||\"ADD TO CART\",\"data-testid\":\"add-to-cart-button\",disabled:n?.disabled??!1,isMobile:y,isHovered:f,onClick:h=>{h.stopPropagation(),n?.disabled||n.onClick?.()},onMouseEnter:()=>{!y&&!n?.disabled&&u(!0)},onMouseLeave:()=>{y||u(!1)},children:[ut(On,{className:\"cart-icon\",disabled:n?.disabled,children:ut(\"svg\",{width:\"24\",height:\"22\",viewBox:\"0 0 24 22\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",children:ut(\"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\"]})]})},Pa=jp;import{useCallback as Kn,useRef as Jp}from\"react\";import Zp from\"react-slick\";import qp from\"@mui/material/useMediaQuery\";import{NsCarouselControl as Xp}from\"@nuskin/foundation-ui-components\";import{styled as Le}from\"@nuskin/foundation-theme\";import Eo from\"@mui/material/Box\";import{NsTypography as Yp}from\"@nuskin/foundation-ui-components\";var Ln=Le(Eo)`\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`,Nn=Le(\"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=Le(\"div\")`\n display: flex;\n scroll-snap-align: start;\n justify-content: center;\n gap: 15px;\n`,In=Le(Eo)`\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`,Vn=Le(Eo)`\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`,En=Le(Eo)`\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`,An=Le(Eo)`\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`,am=Le(\"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`,zn=Le(Yp)`\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`,Bn=Le(\"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`,Hn=Le(\"div\")`\n padding-top: 20px;\n font-size: 20px;\n text-align: center;\n`,Wn=Le(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,_n=Le(\"div\")`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n`,Un=Le(\"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 ot,jsxs as Ao}from\"react/jsx-runtime\";function mr({entries:e,renderEntry:t,settings:o={},showControlButtons:n=!0,allEntryLabel:i=\"View All\",allEntryLink:s=\"\",categoryName:l,emptyProductMessage:d=\"No Products Available For The Selected Category\",productsCountLabel:g=\"Products\",isInitialDataLoading:f,history:u}){let y=Jp(null),x=qp(\"(max-width: 560px)\"),h=Kn(()=>{y.current?.slickPrev()},[]),T=Kn(()=>{y.current?.slickNext()},[]),P=t??((v,D)=>ot(Pa,{productTitle:v.productTitle,imageDetails:v.imageDetails,button:v.button,onCardClick:v.onCardClick,productStatusBadge:v.productStatusBadge,directSellerBadge:v.directSeller,mySitePriceComponent:v.mySitePriceComponent},`${v.productTitle}-${D}`)),b={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},p=(e?.length??0)>b.slidesToShow,w=()=>e?.length===0&&!f?ot(Hn,{children:d}):x?ot(Nn,{children:ot($n,{children:e.map((v,D)=>v&&P(v,D))})}):ot(Zp,{...b,ref:y,children:e.map((v,D)=>v&&P(v,D))});return Ao(Ln,{children:[n&&Ao(In,{children:[Ao(Wn,{children:[Ao(_n,{children:[ot(En,{children:Ao(zn,{variant:\"body-m\",children:[e?.length??0,\" \",g]})}),!x&&l&&ot(Un,{children:l})]}),ot(Vn,{$isMobile:x,children:ot(Bn,{$disabled:(e?.length??0)===0,onClick:v=>{v.preventDefault(),(e?.length??0)>0&&u&&u.push(s)},children:i})})]}),!x&&ot(An,{$isDisabled:!p,children:ot(Xp,{prev:h,next:T,viewAllLabel:\"\",viewAllUrl:\"\"})})]}),w()]})}import{useState as oo,useEffect as Ma,useCallback as lc}from\"react\";import{useMediaQuery as sc}from\"@mui/material\";var hr=_p(Qn());import*as ti from\"react\";import oc from\"@mui/material/Tabs\";import rc from\"@mui/material/Tab\";import oi from\"@mui/material/Box\";import{styled as tc}from\"@nuskin/foundation-theme\";var ei=tc.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 ac}from\"@mui/material\";import{jsx as xo,jsxs as nc}from\"react/jsx-runtime\";function ri(e){let{children:t,value:o,index:n,...i}=e;return xo(\"div\",{role:\"tabpanel\",hidden:o!==n,id:`vertical-tabpanel-${n}`,\"aria-labelledby\":`vertical-tab-${n}`,...i,children:o===n&&xo(oi,{className:\"tabPanel\",children:t})})}ri.propTypes={children:hr.default.node,index:hr.default.number.isRequired,value:hr.default.number.isRequired};var Ra=({itemArray:e,value:t,onChange:o})=>{let[n,i]=ti.useState(0),s=ac(\"(max-width:768px)\"),l=t??n;return xo(ei,{children:nc(oi,{className:\"tabContainer\",children:[xo(oc,{orientation:s?\"horizontal\":\"vertical\",variant:\"scrollable\",value:l,onChange:(g,f)=>{o?o(g,f):i(f)},\"aria-label\":\"Vertical tabs example\",className:\"tabsStyle\",children:e.map(g=>xo(rc,{label:g.label,className:\"tabStyle\"},g.categoryId))}),e.map(g=>xo(ri,{value:l,index:e.findIndex(f=>f.categoryId===g.categoryId),children:g.content},g.categoryId))]})})};import{NsSpinner as dc}from\"@nuskin/foundation-ui-components\";import{styled as bo}from\"@nuskin/foundation-theme\";var ic=({isMobile:e,$hasCategories:t})=>e?\"auto\":t?\"800px\":\"auto\",ai=bo(\"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: ${ic};\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`,ni=bo(\"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`,ii=bo(\"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`,Vm=bo(\"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`,li=bo(\"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`,si=bo(\"div\")`\n padding: 10px;\n display: flex;\n justify-content: center;\n`;import{jsx as ro,jsxs as uc}from\"react/jsx-runtime\";var pc=({allEntryLabel:e,allEntryLink:t,renderEntry:o,settings:n,showControlButtons:i=!0,fetchCategories:s,fetchProducts:l,showCustomCategory:d=!1,emptyProductTabs:g=\"No tabs available\",emptyProductMessage:f,productsCountLabel:u,getCategoryId:y,history:x})=>{let h=sc(\"(max-width:768px)\"),[T,P]=oo(!0),[b,p]=oo([]),[w,v]=oo(!1),[D,R]=oo(0),[M,$]=oo([]),[V,_]=oo(!1),[O,c]=oo(!0),C=lc(()=>{let m=document.querySelectorAll('[data-testid*=\"spinner\"], .ns-spinner, [class*=\"spinner\"]');c(m.length===0)},[]);Ma(()=>{V&&C()},[V,C]),Ma(()=>{s().then(m=>{p(m),v(!0)})},[s]),Ma(()=>{if(w)if(b.length>0){let m=b[D]?.categoryId;y&&y(m),_(!0),l(m).then($).finally(()=>{_(!1),P(!1)})}else _(!1)},[b,D,l,w]);let S=b.map(m=>({label:m.label,content:\"\",categoryId:m.categoryId}));return uc(ai,{isMobile:h,$hasCategories:b.length>0,children:[d&&(S.length>0?ro(ni,{isMobile:h,children:ro(Ra,{itemArray:S,value:D,onChange:(m,k)=>R(k)})}):ro(li,{children:g})),ro(ii,{isMobile:h,children:V?ro(si,{children:O&&ro(dc,{})}):ro(mr,{isInitialDataLoading:T,entries:M,allEntryLabel:e,allEntryLink:t,renderEntry:o?m=>o({...m,productStatusBadge:m.productStatusBadge}):void 0,settings:n,showControlButtons:i,categoryName:b[D]?.label,emptyProductMessage:f,productsCountLabel:u,history:x})})]})},cc=pc;import{useState as br,useEffect as $a,useMemo as hc}from\"react\";import{Typography as At,Box as zt,useMediaQuery as xc,Tooltip as bc}from\"@mui/material\";import{NsLink as yc,NsImage as ki}from\"@nuskin/foundation-ui-components\";import{styled as Pt}from\"@nuskin/foundation-theme\";import{Box as zo}from\"@mui/material\";import{jsx as Na}from\"react/jsx-runtime\";var Oa=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"600\",lineHeight:\"16px\",letterSpacing:\"0.12px\",color:e?\"#000000\":\"#FFFFFF\",\"& a\":{color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}}),pi=e=>({fontSize:\"12px\",fontStyle:\"normal\",fontWeight:\"700\",lineHeight:\"16px\",letterSpacing:\"0.48px\",color:e?\"#000000\":\"#FFFFFF\",textTransform:\"uppercase\",paddingLeft:\"5px\"}),ci=()=>({display:\"flex\",flexDirection:\"row\",gap:\"10px\",alignItems:\"center\"}),di=e=>({...Oa(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\"}}),gc=e=>({...pi(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\"}}),ui=Pt(e=>Na(zo,{...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\":Oa(o),\".phone-text\":Oa(o),\".social-title-text\":{...pi(o),marginBottom:\"8px\"},\".social-icons\":{...ci(),paddingBottom:\"8px\"}})),gi=Pt(e=>Na(zo,{...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\":di(o),\".phone-text-mobile\":di(o),\".social-title-text-mobile\":gc(o),\".social-icons-mobile\":{...ci(),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\"}}})),fi=Pt(zo)({display:\"flex\",gap:\"12px\",marginBottom:\"16px\",paddingLeft:\"5px\",\"&.mobile-badges\":{flexDirection:\"column\",gap:\"8px\",marginBottom:\"12px\"},\"&.tablet-badges\":{flexDirection:\"row\",gap:\"12px\",marginBottom:\"8px\"}}),Fa=Pt(e=>Na(zo,{...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\"}})),mi=Pt(\"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)\"}}}),hi=Pt(zo)`\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`,xi=Pt(\"span\")`\n line-height: 0.5;\n`,bi=Pt(\"a\")({fontSize:\"inherit\",fontFamily:\"inherit\",fontWeight:\"inherit\",lineHeight:\"inherit\",letterSpacing:\"inherit\",color:\"inherit\",textDecoration:\"none\",\"&:hover\":{textDecoration:\"underline\"}}),La=Pt(\"span\")({});import{Box as fc}from\"@mui/material\";import{jsx as ao,jsxs as mc}from\"react/jsx-runtime\";var yi=({width:e,height:t,backgroundColor:o})=>ao(fc,{sx:{width:e,height:t,display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:o},\"data-testid\":\"placeholder-image\",children:ao(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"129\",viewBox:\"0 0 128 129\",fill:\"none\",children:mc(\"g\",{id:\"ns_logomark\",children:[ao(\"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\"}),ao(\"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\"}),ao(\"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\"}),ao(\"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\"}),ao(\"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 wi}from\"react/jsx-runtime\";var Ci=({width:e=16,height:t=16,className:o=\"\"})=>wi(\"svg\",{width:e,height:t,viewBox:\"0 0 24 24\",fill:\"currentColor\",className:o,\"data-testid\":\"arrow-down-icon\",children:wi(\"path\",{d:\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"})});function xr(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 Di,jsx as X,jsxs as rt}from\"react/jsx-runtime\";var vi=(e,t,o)=>{let n=o.includes(\"mobile\")?\"placeholder-image-mobile\":\"placeholder-image\";return e?.imageSrc?X(xi,{tabIndex:0,children:X(ki,{className:o,src:e.imageSrc,alt:e.imageAlt})}):X(zt,{className:n,children:X(yi,{width:o.includes(\"mobile\")?\"144px\":\"246px\",height:o.includes(\"mobile\")?\"144px\":\"246px\",backgroundColor:t?.backgroundColor??\"#5F5F5F\"})})},Ti=(e,t,o,n,i)=>{if(!e||!t&&!i)return null;let s=o?\"mobile-badge\":\"tablet-badge\";return rt(fi,{className:o?\"mobile-badges\":\"tablet-badges\",children:[i&&X(Fa,{className:`${s} total-savings-badge`,hasWhiteBackground:n,tabIndex:0,children:X(La,{className:\"badge-value\",children:i})}),t&&X(Fa,{className:`${s} expiration-badge`,hasWhiteBackground:n,tabIndex:0,children:X(La,{className:\"badge-value\",children:t})})]})},wc=(e,t,o,n,i)=>{let{shopTitle:s,socialTitleText:l,email:d,showBadges:g,expirationDate:f,phone:u,totalSavings:y}=e;return rt(zt,{className:\"content-mobile\",children:[X(At,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title-mobile\",children:s}),!t&&rt(Di,{children:[X(At,{tabIndex:l?.trim()?0:-1,className:\"social-title-text-mobile\",children:l}),d?.trim()&&yr(\"email\",d,\"email-text-mobile\"),u?.trim()&&yr(\"phone\",u,\"phone-text-mobile\"),X(zt,{className:\"social-icons-mobile\",children:o}),Ti(g,f??\"\",n,i,y)]})]})},Cc=(e,t,o,n,i)=>{let{shopTitle:s,shopDescription:l,socialTitleText:d,email:g,phone:f,showBadges:u,expirationDate:y,totalSavings:x}=e;return rt(zt,{className:\"content\",children:[X(At,{component:\"h1\",tabIndex:s?.trim()?0:-1,className:\"body-title\",children:s}),!t&&rt(Di,{children:[l?.length>480?X(bc,{title:l,arrow:!0,children:X(At,{tabIndex:l?.trim()?0:-1,className:\"body-text\",children:l})}):X(At,{tabIndex:l?.trim()?0:-1,className:\"body-text\",children:l}),rt(zt,{className:\"social-media\",children:[X(At,{tabIndex:d?.trim()?0:-1,className:\"social-title-text\",children:d}),rt(zt,{className:\"social-icons\",children:[o,g?.trim()&&yr(\"email\",g,\"email-text\"),f?.trim()&&yr(\"phone\",f,\"phone-text\")]})]}),Ti(u,y??\"\",n,i,x)]})]})},vc=e=>new Promise((t,o)=>{let n=new Image;n.crossOrigin=\"anonymous\",n.src=e,n.onload=()=>{let i=document.createElement(\"canvas\"),s=i.getContext(\"2d\");if(!s)return o(new Error(\"Canvas not supported\"));i.width=n.width,i.height=n.height,s.drawImage(n,0,0);let d=[s.getImageData(0,0,1,1).data,s.getImageData(n.width-1,0,1,1).data,s.getImageData(0,n.height-1,1,1).data,s.getImageData(n.width-1,n.height-1,1,1).data].every(g=>Array.prototype.slice.call(g)[3]<10);t(d)},n.onerror=()=>o(new Error(\"Failed to load image\"))}),kc=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),s=Number.parseInt(o.substring(4,6),16),l=220;return n>=l&&i>=l&&s>=l},Tc=(e,t)=>({onClick:()=>{xr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`})},onKeyDown:o=>{(o.key===\"Enter\"||o.key===\" \")&&(o.preventDefault(),xr({event:\"contact_click\",contact_type:e,contact_value:t,click_element:`${e}_link`}),globalThis.location.href=`${e===\"email\"?\"mailto\":\"tel\"}:${t}`)}}),yr=(e,t,o)=>{let n=e===\"email\"?\"mailto:\":\"tel:\",i=Tc(e,t);return X(At,{className:o,children:X(bi,{href:`${n}${t}`,...i,children:t})})};function Si({className:e,shopTitle:t,shopDescription:o,socialTitleText:n,imageDetails:i,email:s,phone:l,bannerProps:d,socialIcons:g,expirationDate:f,showBadges:u=!1,totalSavings:y}){let x=xc(\"(max-width: 560px)\"),[h,T]=br(!1),[P,b]=br(!1),[p,w]=br(!1),[v,D]=br(!1),R=()=>{b(!P)};$a(()=>{(async()=>{if(i?.imageSrc){let C=await vc(i.imageSrc);D(C)}else D(!1)})()},[i?.imageSrc]),$a(()=>{w(kc(d?.backgroundColor))},[d?.backgroundColor]),$a(()=>{let c,C=window.scrollY,S=!1,m=!1,k=0,F=U=>{let et=Date.now();if(S!==U&&!m){if(et-k<100)return;m=!0,S=U,k=et,U&&b(!1),clearTimeout(c),T(U),c=setTimeout(()=>{m=!1,U&&window.scrollY<15&&window.scrollTo({top:x?20:30,behavior:\"smooth\"})},300)}},Y=()=>{let U=window.scrollY;if(m){C=U;return}if(Math.abs(U-C)<.5)return;let Ee=U>C,$t=x?15:25,ho=x?8:12;Ee&&U>$t&&!S?F(!0):!Ee&&U<ho&&S&&F(!1),C=U},le=()=>{let U=window.scrollY,Ee=U>(x?5:10);S=Ee,T(Ee),C=U,k=Date.now()},se=null,fe=0,Pe=()=>{se||Date.now()-fe<16||(se=requestAnimationFrame(()=>{Y(),fe=Date.now(),se=null}))};return le(),window.addEventListener(\"scroll\",Pe,{passive:!0}),()=>{window.removeEventListener(\"scroll\",Pe),se&&cancelAnimationFrame(se),clearTimeout(c)}},[x]);let M=hc(()=>g?.map((c,C)=>X(hi,{onClick:m=>{m.preventDefault(),xr({event:\"social_click\",social_platform:c.type,social_url:c.url,click_element:\"social_icon\"}),window.open(c.url,\"_blank\")},children:X(yc,{href:c.url,target:\"_blank\",children:X(ki,{src:`https://www.google.com/s2/favicons?domain=${c?.url}&sz=24`,alt:`${c.type} icon`,width:\"24\",height:\"24\"},c?.type+C)})},c?.type+C)),[g]),$=`${e} ${h?\"scrolled\":\"\"}`,V={shopTitle:t,shopDescription:o,socialTitleText:n,email:s,phone:l,showBadges:u,expirationDate:f,totalSavings:y},_=()=>window.innerWidth<=380?50:window.innerWidth<=415?56:window.innerWidth<=460?62:80,O=x&&o&&o.length>_();return x?rt(gi,{className:$,\"data-testid\":\"my-site-shop-header\",bannerProps:d,isCircularImage:v,hasWhiteBackground:p,children:[rt(zt,{className:\"image-content-mobile\",children:[vi(i,d??{},\"bg-image-mobile\"),wc(V,h,M,x,p)]}),!h&&rt(zt,{className:\"expandable-description-mobile\",children:[X(At,{className:`description-content-mobile ${P||!O?\"expanded\":\"collapsed\"}`,children:o}),O&&X(mi,{onClick:R,children:X(Ci,{width:16,height:16,className:`arrow-icon-mobile ${P?\"expanded\":\"\"}`})})]})]}):rt(ui,{className:$,\"data-testid\":\"my-site-shop-header\",bannerProps:d,isCircularImage:v,hasWhiteBackground:p,children:[vi(i,d??{},\"bg-image\"),Cc(V,h,M,x,p)]})}import{styled as Bo}from\"@nuskin/foundation-theme\";var Ia=Bo(\"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`,Pi=Bo(\"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`,Ri=Bo(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 768px) {\n gap: 20px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`,Va=Bo(\"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`,Mi=Bo(\"div\")`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;import Rc from\"@mui/icons-material/CalendarMonth\";import Mc from\"@mui/icons-material/Language\";import{NsSpinner as Oc}from\"@nuskin/foundation-ui-components\";import{ColorUtils as Sc,styled as je}from\"@nuskin/foundation-theme\";var{getGenomeColor:Bt}=Sc,Oi=je(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px 16px;\n background-color: ${({theme:e})=>Bt(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`,Fi=je(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n`,Li=je(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Bt(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`,Ni=je(\"div\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0;\n color: ${({theme:e})=>Bt(e,\"N100\")};\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,$i=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`,Ea=je(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n`,Aa=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`,at=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})=>Bt(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})=>Bt(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>Bt(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>Bt(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`,za=je(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>Bt(e,\"N70\")};\n\n svg {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n`,Ii=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`,Vi=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`,Th=je(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`;var wr;function Cr(e){wr=e}function Dc(){return wr}function ze(e){if(!wr)return e.fallback;let t;try{t=wr(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:{standard:{key:\"shoppingDashboard.filter.conversionType.standard\",fallback:\"Standard\"},subscription:{key:\"shoppingDashboard.filter.conversionType.subscription\",fallback:\"Subscription\"}}},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 ze(e)}import{useMemo as Pc}from\"react\";function Ei(){return[{value:\"all\",label:a(r.filter.market.all)}]}function Ai(e){return e&&e.length>0?e:Ei()}function Ye(e){return Pc(()=>Ai(e),[e])}import{jsx as Ce,jsxs as yo}from\"react/jsx-runtime\";var Ho=({shopTitle:e,dateRange:t,market:o,dateRangeLabel:n,isLoading:i=!1,stats:s,markets:l,onDateRangeChange:d,onMarketChange:g})=>{let f=Ye(l),u=T=>{let P=T.target.value;d?.(P)},y=T=>{let P=T.target.value;g?.(P)},x=T=>{T.key===\"Escape\"&&T.target.blur()},h=()=>n||(s?.dateRange?s.dateRange.label:a(r.filter.dateRange.last30days));return yo(Oi,{as:\"header\",\"data-testid\":\"dashboard-header\",children:[yo(Fi,{children:[Ce(Li,{\"data-testid\":\"dashboard-shop-title\",children:e??s?.shopTitle??a(r.title)}),Ce(Ni,{\"aria-live\":\"polite\",\"data-testid\":\"dashboard-date-range-label\",children:h()})]}),Ce($i,{\"aria-label\":a(r.ariaLabel.dashboardFilters),\"data-testid\":\"dashboard-filters-section\",children:yo(Vi,{children:[i&&Ce(Ii,{as:\"output\",\"aria-live\":\"polite\",\"aria-label\":a(r.ariaLabel.loadingDashboard),\"data-testid\":\"dashboard-loading-indicator\",children:Ce(Oc,{})}),yo(Ea,{children:[Ce(Aa,{htmlFor:\"filter-date-range\",children:a(r.filter.dateRange.label)}),Ce(za,{\"aria-hidden\":\"true\",children:Ce(Rc,{})}),yo(at,{id:\"filter-date-range\",\"data-testid\":\"filter-date-range\",value:t,onChange:u,onKeyDown:x,disabled:i,\"aria-label\":`${a(r.ariaLabel.dateRangeFilter)} ${a(r.filter.dateRange[t])}`,children:[Ce(\"option\",{value:\"last7days\",children:a(r.filter.dateRange.last7days)}),Ce(\"option\",{value:\"last30days\",children:a(r.filter.dateRange.last30days)}),Ce(\"option\",{value:\"last90days\",children:a(r.filter.dateRange.last90days)}),Ce(\"option\",{value:\"thisMonth\",children:a(r.filter.dateRange.thisMonth)})]})]}),yo(Ea,{children:[Ce(Aa,{htmlFor:\"filter-market\",children:a(r.filter.market.label)}),Ce(za,{\"aria-hidden\":\"true\",children:Ce(Mc,{})}),Ce(at,{id:\"filter-market\",\"data-testid\":\"filter-market\",value:o,onChange:y,onKeyDown:x,disabled:i,\"aria-label\":`${a(r.ariaLabel.marketFilter)} ${f.find(T=>T.value===o)?.label??String(o)}`,children:f.map(T=>Ce(\"option\",{value:T.value,children:T.label},T.value))})]})]})})]})};import zc from\"react\";import Bc from\"@mui/icons-material/ShowChart\";import Hc from\"@mui/icons-material/TrendingUp\";import Wc from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Fc,styled as Re}from\"@nuskin/foundation-theme\";var{getGenomeColor:Rt}=Fc,vr=Re(\"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`,zi=Re(\"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`,Bi=Re(\"div\")`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n`,Hi=Re(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n`,Wi=Re(\"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`,_i=Re(\"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`,Ui=Re(\"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`,Ki=Re(\"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`,Ba=Re(\"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`,Gi=Re(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n`,ji=Re(\"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`,Yi=Re(\"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`,Hh=Re(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n`,Ha=Re(\"span\")`\n white-space: nowrap;\n`,Ji=Re(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;import J from\"@mui/material/Skeleton\";import{styled as K}from\"@nuskin/foundation-theme\";import Wo from\"@mui/material/Skeleton\";var kr=K(\"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`,Tr=K(\"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`,Zi=K(\"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`,qi=K(\"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`,Xi=K(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,Qi=K(\"div\")`\n margin-top: 8px;\n`,el=K(Wo)`\n margin-top: 4px;\n`,tl=K(\"div\")`\n flex: 1;\n min-width: 0;\n`,ol=K(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n`,rl=K(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 16px;\n`,al=K(\"div\")`\n padding-top: 4px;\n`,nl=K(Wo)`\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`,il=K(\"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`,ll=K(Wo)`\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`,sl=K(\"div\")`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,dl=K(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n`,pl=K(\"div\")`\n flex: 1;\n`,Lc=K(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n @media (min-width: 600px) {\n gap: 32px;\n }\n @media (min-width: 900px) {\n gap: 40px;\n }\n`,Nc=K(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n`,$c=K(\"div\")`\n display: flex;\n gap: 16px;\n`,Ic=K(\"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`,Vc=K(\"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`,Wa=K(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,cl=K(\"div\")`\n padding: 24px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n`,ul=K(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 0;\n gap: 8px;\n`,gl=K(Wo)`\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`,_a=K(\"div\")`\n padding: 20px;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,Sr=K(Wo)`\n border-radius: 4px;\n`,fl=K(\"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 I,jsxs as Q}from\"react/jsx-runtime\";var _o=()=>Q(qi,{\"data-testid\":\"skeleton-stats-card\",children:[Q(Xi,{children:[I(J,{variant:\"text\",width:80,height:18}),I(J,{variant:\"text\",width:48,height:16})]}),Q(Qi,{children:[I(J,{variant:\"text\",width:120,height:36}),I(el,{variant:\"text\",width:100,height:16})]})]}),Ec=()=>Q(Zi,{children:[I(J,{variant:\"rounded\",width:28,height:28}),I(J,{variant:\"rounded\",width:50,height:50}),Q(tl,{children:[I(J,{variant:\"text\",width:\"70%\",height:18}),I(J,{variant:\"text\",width:\"50%\",height:14})]}),Q(ol,{children:[I(J,{variant:\"text\",width:80,height:18}),I(J,{variant:\"text\",width:48,height:14})]})]}),ml=()=>Q(kr,{\"data-testid\":\"skeleton-products-list\",children:[Q(Tr,{children:[I(J,{variant:\"text\",width:160,height:22}),I(J,{variant:\"rounded\",width:100,height:32})]}),[\"product-1\",\"product-2\",\"product-3\",\"product-4\",\"product-5\"].map(e=>I(Ec,{},e))]}),Dr=()=>Q(kr,{\"data-testid\":\"skeleton-chart-widget\",children:[Q(Tr,{children:[I(J,{variant:\"text\",width:140,height:22}),I(J,{variant:\"rounded\",width:110,height:32})]}),Q(rl,{children:[I(J,{variant:\"text\",width:100,height:36}),Q(al,{children:[I(J,{variant:\"text\",width:60,height:18}),I(J,{variant:\"text\",width:140,height:14})]})]}),I(nl,{variant:\"rounded\",width:\"100%\"})]}),Ac=()=>Q(dl,{children:[I(J,{variant:\"circular\",width:12,height:12}),Q(pl,{children:[I(J,{variant:\"text\",width:\"60%\",height:16}),I(J,{variant:\"text\",width:\"40%\",height:14})]}),I(J,{variant:\"text\",width:36,height:18})]}),Pr=()=>Q(kr,{\"data-testid\":\"skeleton-categories-pie\",children:[Q(Tr,{children:[I(J,{variant:\"text\",width:140,height:22}),I(J,{variant:\"rounded\",width:100,height:32})]}),Q(il,{children:[I(ll,{variant:\"circular\"}),I(sl,{children:[\"legend-1\",\"legend-2\",\"legend-3\",\"legend-4\",\"legend-5\"].map(e=>I(Ac,{},e))})]})]});var Ht=()=>Q(Wa,{\"data-testid\":\"skeleton-fullview-chart\",children:[Q(cl,{children:[Q(ul,{children:[I(J,{variant:\"text\",width:140,height:52}),I(J,{variant:\"text\",width:80,height:24}),I(J,{variant:\"text\",width:160,height:16})]}),I(gl,{variant:\"rounded\",width:\"100%\"})]}),Q(_a,{children:[I(J,{variant:\"text\",width:200,height:24}),[\"table-row-1\",\"table-row-2\",\"table-row-3\",\"table-row-4\",\"table-row-5\"].map(e=>I(Sr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]}),hl=()=>Q(Wa,{\"data-testid\":\"skeleton-fullview-table\",children:[Q(fl,{children:[I(_o,{}),I(_o,{}),I(_o,{})]}),Q(_a,{children:[I(J,{variant:\"text\",width:200,height:24}),I(Sr,{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=>I(Sr,{variant:\"rounded\",width:\"100%\",height:44},e))]})]});import{jsx as Ne,jsxs as Wt}from\"react/jsx-runtime\";var _c=({title:e,value:t,subtitle:o,caption:n,layout:i=\"default\",trendDirection:s=\"neutral\",trendValue:l,testId:d,isLoading:g=!1})=>{if(g)return Ne(vr,{$layout:i,\"data-testid\":d,children:Ne(_o,{})});let f=()=>{let y=a(r.stats.trend.unchanged);return s===\"up\"?y=a(r.stats.trend.increased):s===\"down\"&&(y=a(r.stats.trend.decreased)),`${e} ${y} ${l??\"\"}`},u=y=>s===\"up\"?Ne(Hc,{sx:{fontSize:y},\"aria-hidden\":\"true\"}):s===\"down\"?Ne(Wc,{sx:{fontSize:y},\"aria-hidden\":\"true\"}):Ne(Bc,{sx:{fontSize:y},\"aria-hidden\":\"true\"});return i===\"split\"?Wt(vr,{as:\"article\",$layout:\"split\",\"aria-label\":`${e}: ${t}`,\"data-testid\":d,children:[Ne(zi,{id:`stats-title-${d}`,children:e}),Wt(Bi,{children:[Ne(Ba,{\"aria-describedby\":`stats-title-${d}`,\"data-testid\":`stats-value-${d}`,children:t}),(l??n)&&Wt(Hi,{children:[l&&Wt(Wi,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":f(),\"data-testid\":`stats-trend-${d}`,children:[u(\"18px\"),Ne(Ha,{children:l})]}),n&&Ne(_i,{\"data-testid\":`stats-caption-${d}`,children:n})]})]})]}):Wt(vr,{as:\"article\",\"aria-label\":`${e}: ${t}`,\"data-testid\":d,children:[Ne(Ji,{children:Ne(Ui,{id:`stats-title-${d}`,children:e})}),Wt(Ki,{children:[Wt(Gi,{children:[Ne(Ba,{\"aria-describedby\":`stats-title-${d}`,\"data-testid\":`stats-value-${d}`,children:t}),o&&Ne(ji,{\"aria-label\":`${e} ${a(r.stats.details)}: ${o}`,\"data-testid\":`stats-subtitle-${d}`,children:o})]}),l&&Wt(Yi,{as:\"output\",direction:s,\"aria-live\":\"polite\",\"aria-label\":f(),\"data-testid\":`stats-trend-${d}`,children:[u(\"16px\"),Ne(Ha,{children:l})]})]})]})},Mt=zc.memo(_c);Mt.displayName=\"StatsCard\";import iu from\"react\";import lu from\"@mui/icons-material/ShoppingCart\";import Uc from\"@mui/icons-material/ArrowUpward\";import Kc from\"@mui/icons-material/ArrowDownward\";import Gc from\"@mui/icons-material/Remove\";import{jsx as Rr}from\"react/jsx-runtime\";function Mr(e){if(!e)return null;let t=e.replace(\"%\",\"\").trim(),o=Number(t);return Number.isFinite(o)?o:null}function gt(e){let t=Mr(e);return t===null?\"neutral\":t>0?\"up\":t<0?\"down\":\"neutral\"}function _t(e,t,o){let{weightedSum:n,weight:i}=e.reduce((d,g)=>{let f=Mr(o(g));return f===null?d:{weightedSum:d.weightedSum+f*t(g),weight:d.weight+t(g)}},{weightedSum:0,weight:0}),s=i>0?n/i:0,l=\"neutral\";return s>0?l=\"up\":s<0&&(l=\"down\"),{direction:l,formatted:`${s>0?\"+\":\"\"}${s.toFixed(1)}%`}}function wo(e){return e===\"up\"?a(r.stats.trend.increased):e===\"down\"?a(r.stats.trend.decreased):a(r.stats.trend.unchanged)}function Be(e){switch(e){case\"up\":return Rr(Uc,{});case\"down\":return Rr(Kc,{});case\"neutral\":default:return Rr(Gc,{})}}function jc(e){switch(e){case\"up\":return\"#4caf50\";case\"down\":return\"#f44336\";case\"neutral\":default:return\"#757575\"}}function Or(e,t){let{cx:o,cy:n,midAngle:i,innerRadius:s,outerRadius:l,percentage:d}=e,g=Math.PI/180,f=s+(l-s)/2,u=o+f*Math.cos(-i*g),y=n+f*Math.sin(-i*g);return Rr(\"text\",{x:u,y,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 xl}from\"react\";function bl(e,t){return Math.ceil(e.length/t)}function yl(e,t,o){let n=(t-1)*o,i=n+o;return e.slice(n,i)}function Yc(e,t,o=\"desc\"){return[...e].sort((n,i)=>{let s=n[t],l=i[t];return o===\"asc\"?s-l:l-s})}function Jc(e,t,o=1){return t===0?\"0.0\":(e/t*100).toFixed(o)}function ft(e,t,o){let n=xl(()=>bl(e,o),[e,o]),i=xl(()=>yl(e,t,o),[e,t,o]);return{totalPages:n,pageItems:i}}function H(e,t,o=\"en-US\",n){let i=Number.isFinite(e)?e:0;if(t)try{return new Intl.NumberFormat(o,{style:\"currency\",currency:t,...n!==void 0?{minimumFractionDigits:n,maximumFractionDigits:n}:{minimumFractionDigits:0,maximumFractionDigits:2}}).format(i)}catch{}return n!==void 0?`$${i.toFixed(n)}`:`$${i.toLocaleString()}`}function Uo(e){return!e||e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function Ut(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 Zc,styled as me}from\"@nuskin/foundation-theme\";var{getGenomeColor:ee}=Zc,Fr=me(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ee(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ee(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`,Ua=me(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n padding-bottom: 0;\n\n @media (min-width: 768px) {\n margin-bottom: 20px;\n }\n`,wl=me(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ka=me(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ee(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})=>ee(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`,fx=me(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ee(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ee(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ee(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ee(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>ee(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ee(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Cl=me(\"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`,vl=me(\"div\")`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: ${({theme:e})=>ee(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})=>ee(e,\"N40\")};\n }\n\n &:hover {\n background-color: ${({theme:e})=>ee(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`,kl=me(\"div\")`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background-color: ${({theme:e})=>ee(e,\"A10\")};\n color: ${({theme:e})=>ee(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`,Tl=me(\"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`,Sl=me(\"div\")`\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background-color: ${({theme:e})=>ee(e,\"N40\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({theme:e})=>ee(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`,Dl=me(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n min-width: 0;\n`,Pl=me(\"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})=>ee(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`,Rl=me(\"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})=>ee(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 12px;\n }\n`,Ml=me(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n flex-shrink: 0;\n`,Ol=me(\"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})=>ee(e,\"N100\")};\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 16px;\n }\n`,Fl=me(\"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\":ee(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`,Ll=me(\"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})=>ee(e,\"N70\")};\n\n svg {\n width: 48px;\n height: 48px;\n color: ${({theme:e})=>ee(e,\"N50\")};\n }\n`,Nl=me(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>ee(e,\"N70\")};\n`;import{useState as eu}from\"react\";import tu from\"@mui/material/Menu\";import Vl from\"@mui/material/MenuItem\";import El from\"@mui/material/ListItemIcon\";import Al from\"@mui/material/ListItemText\";import ou from\"@mui/icons-material/MoreVert\";import ru from\"@mui/icons-material/Visibility\";import au from\"@mui/icons-material/FileDownload\";import qc from\"@mui/material/IconButton\";import{styled as Xc,ColorUtils as Qc}from\"@nuskin/foundation-theme\";var{getGenomeColor:$l}=Qc,Il=Xc(qc)(({theme:e})=>({padding:\"4px\",color:$l(e,\"N100\"),\"&:hover\":{backgroundColor:$l(e,\"N20\")}}));import{Fragment as nu,jsx as Kt,jsxs as Lr}from\"react/jsx-runtime\";var nt=({widgetId:e,onFullView:t,onExport:o})=>{let[n,i]=eu(null),s=!!n,l=`widget-menu-button-${e}`,d=`widget-menu-${e}`,g=x=>{i(x.currentTarget)},f=()=>{i(null)},u=()=>{f(),t&&t()},y=()=>{f(),o&&o()};return Lr(nu,{children:[Kt(Il,{id:l,\"data-testid\":`widget-menu-button-${e}`,\"aria-label\":a(r.widget.menu.ariaLabel),\"aria-controls\":s?d:void 0,\"aria-haspopup\":\"true\",\"aria-expanded\":s?\"true\":void 0,onClick:g,size:\"small\",children:Kt(ou,{fontSize:\"small\"})}),Lr(tu,{id:d,\"data-testid\":`widget-menu-${e}`,anchorEl:n,open:s,onClose:f,MenuListProps:{\"aria-labelledby\":l},anchorOrigin:{vertical:\"bottom\",horizontal:\"right\"},transformOrigin:{vertical:\"top\",horizontal:\"right\"},children:[Lr(Vl,{onClick:u,\"data-testid\":\"widget-menu-item-viewdetails\",children:[Kt(El,{children:Kt(ru,{fontSize:\"small\"})}),Kt(Al,{children:a(r.widget.menu.viewDetails)})]}),o&&Lr(Vl,{onClick:y,\"data-testid\":\"widget-menu-item-export\",children:[Kt(El,{children:Kt(au,{fontSize:\"small\"})}),Kt(Al,{children:a(r.widget.menu.exportData)})]})]})]})};import{jsx as ue,jsxs as mt}from\"react/jsx-runtime\";var su=({products:e,productSort:t,isLoading:o=!1,maxProducts:n=5,onSortChange:i,onTitleClick:s,onExport:l})=>{let d=b=>{let p=b.target.value;i?.(p)},g=(b,p)=>{switch(p){case\"units\":return`${b.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"revenue\":return H(b.revenue,b.currencyCode);case\"volume\":return`${b.volume.toLocaleString()} ${a(r.defaults.dcSv)}`;default:return`${b.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`}},f=(b,p)=>{switch(p){case\"units\":return`${H(b.revenue,b.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;case\"revenue\":return`${b.unitsSold.toLocaleString()} ${a(r.widget.topProducts.unitsSuffix)}`;case\"volume\":return`${H(b.revenue,b.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`;default:return`${H(b.revenue,b.currencyCode)} ${a(r.widget.topProducts.revenueSuffix)}`}},u=(b,p)=>{let w=b.trend;if(!w)return\"\";let v=\"\";switch(p){case\"units\":v=w.units??\"\";break;case\"revenue\":v=w.revenue??\"\";break;case\"volume\":v=w.volume??\"\";break;default:v=w.units??\"\"}return v},y=(b,p)=>{let w=u(b,p);return gt(w)},x=b=>Be(b),h=e.slice(0,n),T=a(r.widget.topProducts.rank),P=a(r.defaults.trend);return o&&e.length===0?ue(Fr,{\"data-testid\":\"widget-top-products\",children:ue(ml,{})}):e.length===0?mt(Fr,{\"data-testid\":\"widget-top-products\",children:[ue(Ua,{children:ue(Ka,{children:a(r.widget.topProducts.title)})}),mt(Ll,{\"data-testid\":\"products-empty-state\",children:[ue(lu,{}),ue(Nl,{children:a(r.widget.topProducts.empty)})]})]}):mt(Fr,{as:\"section\",\"data-testid\":\"widget-top-products\",\"aria-label\":a(r.widget.topProducts.ariaLabel),children:[mt(Ua,{children:[ue(Ka,{as:\"button\",onClick:s,\"aria-label\":a(r.widget.topProducts.titleAriaLabel),\"data-testid\":\"widget-title-top-products\",children:a(r.widget.topProducts.title)}),mt(wl,{children:[mt(at,{id:\"product-sort\",\"data-testid\":\"product-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":a(r.widget.topProducts.sortAriaLabel),children:[ue(\"option\",{value:\"units\",children:a(r.defaults.byUnits)}),ue(\"option\",{value:\"revenue\",children:a(r.defaults.byRevenue)}),ue(\"option\",{value:\"volume\",children:a(r.defaults.byVolume)})]}),ue(nt,{widgetId:\"top-products\",onFullView:s,onExport:l})]})]}),ue(Cl,{as:\"ul\",\"data-testid\":\"products-list\",children:h.map((b,p)=>{let w=y(b,t),v=u(b,t);return mt(vl,{as:\"li\",\"data-testid\":`product-item-${p}`,\"aria-label\":`${T} ${b.rank}: ${b.name}, ${g(b,t)}`,children:[ue(kl,{\"aria-label\":`${T} ${b.rank}`,children:b.rank}),b.imageUrl?ue(Tl,{src:b.imageUrl,alt:b.name,loading:\"lazy\",onError:D=>{D.currentTarget.hidden=!0}}):ue(Sl,{\"aria-label\":a(r.widget.topProducts.noImageAriaLabel),children:b.name.substring(0,2).toUpperCase()}),mt(Dl,{children:[ue(Pl,{title:b.name,children:b.name}),ue(Rl,{children:f(b,t)})]}),mt(Ml,{children:[ue(Ol,{children:g(b,t)}),v&&mt(Fl,{as:\"output\",direction:w,\"aria-live\":\"polite\",\"aria-label\":`${P}: ${wo(w)} ${v}`,children:[x(w),ue(\"span\",{children:v})]})]})]},b.id)})})]})},Co=iu.memo(su);Co.displayName=\"TopSellingProductsList\";import Ko from\"react\";import{LineChart as gu,Line as fu,XAxis as mu,YAxis as hu,CartesianGrid as xu,Tooltip as bu,ResponsiveContainer as yu}from\"recharts\";import{ColorUtils as du,styled as Me}from\"@nuskin/foundation-theme\";var{getGenomeColor:de}=du,Ga=Me(\"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\n @media (min-width: 1080px) {\n padding: 24px;\n }\n`,zl=Me(\"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`,Bl=Me(\"div\")`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`,Hl=Me(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Wl=Me(\"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`,Ux=Me(\"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`,_l=Me(\"div\")`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n margin-bottom: 16px;\n flex-wrap: nowrap;\n width: 100%;\n`,Ul=Me(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>de(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,Kl=Me(\"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\":de(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})=>de(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,Gl=Me(\"div\")`\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n color: ${({theme:e})=>de(e,\"N100\")};\n margin-bottom: 8px;\n margin-top: 0;\n letter-spacing: 0.12px;\n`,jl=Me(\"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})=>de(e,\"N40\")};\n stroke-width: 1px;\n }\n\n .recharts-text {\n fill: ${({theme:e})=>de(e,\"N70\")};\n font-size: 10px;\n }\n\n .recharts-tooltip-wrapper {\n z-index: 100;\n }\n`,Yl=Me(\"div\")`\n background-color: ${({theme:e})=>de(e,\"N100\")};\n border: 1px solid ${({theme:e})=>de(e,\"N40\")};\n border-radius: 6px;\n padding: 8px 12px;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15);\n`,Jl=Me(\"div\")`\n font-size: 11px;\n font-weight: 600;\n color: ${({theme:e})=>de(e,\"N10\")};\n margin-bottom: 4px;\n`,Zl=Me(\"div\")`\n font-size: 13px;\n font-weight: 700;\n color: ${({theme:e})=>de(e,\"A10\")};\n`,ql=Me(\"div\")`\n font-size: 10px;\n font-weight: 400;\n color: ${({theme:e})=>de(e,\"N30\")};\n margin-top: 2px;\n`;var Je=\"last30days\",Xl={last7days:7,last30days:30,last90days:90,thisMonth:31},Ql={last7days:\"Last 7 Days\",last30days:\"Last 30 Days\",last90days:\"Last 90 Days\",thisMonth:\"This Month\"};function pu(e){return Xl[e]??30}function ja(e){return Ql[e]??\"Last 30 Days\"}function cu(e){return ja(e)}function es(e){return`${[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"][e.getMonth()]} ${e.getDate()}`}var uu={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:`${uu[t[0]]||t[0]}/${t[1]}`}function Ya(e){let t=new Date(e);return es(t)}function ts(e,t){return`${Ya(e)} - ${Ya(t)}`}function Ja(e){return e.toISOString().split(\"T\")[0]}function he(e){let t=new Date,o=t.getFullYear(),n=t.getMonth(),i=t.getDate(),s,l=new Date(o,n,i);switch(e){case\"last7days\":s=new Date(o,n,i-7);break;case\"last30days\":s=new Date(o,n,i-30);break;case\"last90days\":s=new Date(o,n,i-90);break;case\"thisMonth\":s=new Date(o,n,1),l=new Date(o,n+1,0);break;default:return\"N/A\"}return ts(Ja(s),Ja(l))}function Ot(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)}}import{jsx as Z,jsxs as Ze}from\"react/jsx-runtime\";var wu={top:5,right:10,left:-10,bottom:5},os={fontSize:10},Cu=e=>{let{cx:t,cy:o,r:n=3}=e;return Z(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},vu=e=>{let{cx:t,cy:o,r:n=5}=e;return Z(\"circle\",{cx:t,cy:o,r:n,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:\"#3B82F6\",strokeWidth:\"2\",style:{pointerEvents:\"none\"}})},ku=e=>`${e}%`,Tu=({active:e,payload:t})=>{if(!e||!t?.length)return null;let o=t[0].payload;return Ze(Yl,{children:[Z(Jl,{children:o.date}),Ze(Zl,{children:[(o.rate??0).toFixed(2),\"%\"]}),Ze(ql,{children:[o.orders??0,\" \",a(r.widget.conversionRate.tooltipOrders),\" /\",\" \",(o.siteVisits??0).toLocaleString(),\" \",a(r.widget.conversionRate.tooltipVisits)]})]})},Su=({conversionData:e,conversionFilter:t,dateRange:o=Je,isLoading:n=!1,title:i,summaryRate:s,summaryChangePct:l,onFilterChange:d,onTitleClick:g,onExport:f})=>{let u=Ko.useCallback(p=>{let w=p.target.value;d?.(w)},[d]),y=a(r.defaults.noData),x=a(r.defaults.noChange),h=Ko.useMemo(()=>typeof s==\"number\"&&Number.isFinite(s)?s:e.at(-1)?.rate??0,[s,e]),T=Ko.useMemo(()=>{if(l!==void 0){if(l===null||Math.abs(l)<.1)return{direction:\"neutral\",value:x};let $=l>0?\"up\":\"down\",V=`${l>0?\"+\":\"\"}${l.toFixed(2)}%`;return{direction:$,value:V}}if(e.length<2)return{direction:\"neutral\",value:y};let p=e.at(-1)?.rate??0,w=e[0].rate;if(w===0)return{direction:\"neutral\",value:x};let v=p-w,D=v/w*100;if(Math.abs(D)<.1)return{direction:\"neutral\",value:x};let R=v>0?\"up\":\"down\",M=`${v>0?\"+\":\"\"}${v.toFixed(2)}%`;return{direction:R,value:M}},[l,e,x,y]),P=Ko.useMemo(()=>e.map(p=>({...p,shortDate:Nr(p.date)})),[e]);if(n&&e.length===0)return Z(Ga,{\"data-testid\":\"widget-conversion-rate\",children:Z(Dr,{})});let b=a(r.widget.conversionRate.chartAriaLabel);return Ze(Ga,{as:\"section\",\"data-testid\":\"widget-conversion-rate\",\"aria-label\":b,children:[Z(zl,{children:Ze(Bl,{children:[Z(Wl,{as:\"button\",onClick:g,\"aria-label\":a(r.widget.conversionRate.titleAriaLabel),\"data-testid\":\"widget-title-conversion-rate\",children:i??a(r.defaults.conversionRate)}),Ze(Hl,{children:[Ze(at,{id:\"conversion-filter\",\"data-testid\":\"conversion-filter-dropdown\",value:t,onChange:u,disabled:n,\"aria-label\":a(r.widget.conversionRate.filterAriaLabel),children:[Z(\"option\",{value:\"all\",children:a(r.defaults.all)}),Z(\"option\",{value:\"standard\",children:a(r.filter.conversionType.standard)}),Z(\"option\",{value:\"subscription\",children:a(r.filter.conversionType.subscription)})]}),Z(nt,{widgetId:\"conversion-rate\",onFullView:g,onExport:f})]})]})}),Ze(_l,{children:[Ze(Ul,{\"aria-label\":`${a(r.defaults.conversionRate)}: ${h.toFixed(2)}%`,\"data-testid\":\"conversion-metric-value\",children:[h.toFixed(2),\"%\"]}),T.value!==y&&Ze(Kl,{as:\"output\",direction:T.direction,\"aria-live\":\"polite\",\"aria-label\":`${wo(T.direction)} ${T.value}`,\"data-testid\":\"conversion-metric-trend\",children:[Ze(\"div\",{className:\"trend-line\",children:[Z(\"span\",{\"aria-hidden\":\"true\",children:Be(T.direction)}),Z(\"span\",{className:\"change-value\",children:T.value.replace(\"%\",\"\")}),Z(\"span\",{className:\"change-percent\",children:\"%\"})]}),Z(\"div\",{className:\"comparison-text\",children:Ot(o)})]})]}),Z(Gl,{\"data-testid\":\"conversion-formula\",children:a(r.widget.conversionRate.formula)}),Z(jl,{\"data-testid\":\"conversion-chart\",children:Z(yu,{width:\"100%\",height:\"100%\",minHeight:200,children:Ze(gu,{data:P,margin:wu,children:[Z(xu,{strokeDasharray:\"3 3\"}),Z(mu,{dataKey:\"shortDate\",tick:os,tickLine:!1,interval:\"preserveStartEnd\"}),Z(hu,{tick:os,tickLine:!1,tickFormatter:ku,domain:[\"dataMin - 0.5\",\"dataMax + 0.5\"]}),Z(bu,{content:Tu}),Z(fu,{type:\"monotone\",dataKey:\"rate\",stroke:\"#3B82F6\",strokeWidth:2,dot:Z(Cu,{}),activeDot:Z(vu,{})})]})})})]})},vo=Ko.memo(Su);vo.displayName=\"ConversionRateChart\";import Jo from\"react\";import{LineChart as Pu,Line as ko,XAxis as Ru,YAxis as Mu,CartesianGrid as Ou,Tooltip as Fu,ResponsiveContainer as Lu}from\"recharts\";import{ColorUtils as Du,styled as He}from\"@nuskin/foundation-theme\";var{getGenomeColor:ve}=Du,Za=He(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>ve(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ve(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`,rs=He(\"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`,as=He(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,ns=He(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>ve(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})=>ve(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`,ub=He(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>ve(e,\"N20\")};\n border: 1px solid ${({theme:e})=>ve(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ve(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>ve(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>ve(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>ve(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,is=He(\"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`,ls=He(\"div\")`\n font-size: 28px;\n font-weight: 700;\n line-height: 1;\n color: ${({theme:e})=>ve(e,\"N100\")};\n margin: 0;\n padding: 0;\n\n @media (min-width: 768px) {\n font-size: 32px;\n }\n`,ss=He(\"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\":ve(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})=>ve(e,\"N70\")};\n letter-spacing: 0.12px;\n margin: 0;\n padding: 0;\n white-space: normal;\n }\n`,ds=He(\"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})=>ve(e,\"N40\")};\n stroke-width: 1px;\n }\n .recharts-text {\n fill: ${({theme:e})=>ve(e,\"N70\")};\n font-size: 10px;\n }\n`,ps=He(\"div\")`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 16px;\n margin-top: 16px;\n padding-top: 0;\n`,Go=He(\"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})=>ve(e,\"N30\")};\n }\n`,jo=He(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Yo=He(\"span\")`\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>ve(e,\"N70\")};\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`;import{Fragment as Iu,jsx as z,jsxs as $e}from\"react/jsx-runtime\";var xe={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#CBD6E0\"},Nu={top:5,right:10,left:-10,bottom:5},cs={fontSize:10},qa=new Map,To=e=>{if(qa.has(e))return qa.get(e);let t=o=>{let{cx:n=0,cy:i=0,r:s=2}=o;return z(\"circle\",{cx:n,cy:i,r:s,fill:\"#FFFFFF\",fillOpacity:\"0\",stroke:e,strokeWidth:\"1.5\",style:{pointerEvents:\"none\"}})};return qa.set(e,t),t},$u=({signupData:e,signupView:t,dateRange:o=Je,isLoading:n=!1,title:i,onViewChange:s,onTitleClick:l,onExport:d})=>{let g=Jo.useCallback(w=>{let v=w.target.value;s?.(v)},[s]),f=a(r.defaults.noData),u=a(r.defaults.noChange),y=Jo.useMemo(()=>{if(e.length===0)return 0;let w=e[e.length-1];return Ut(w,t)},[e,t]),x=Jo.useMemo(()=>{if(e.length<2)return{direction:\"neutral\",value:f};let w=Ut(e[e.length-1],t),v=Ut(e[0],t),D=w-v,R=v===0?0:D/v*100;if(Math.abs(R)<.1)return{direction:\"neutral\",value:u};let M=D>0?\"up\":\"down\",$=`${D>0?\"+\":\"\"}${D} (${R.toFixed(1)}%)`;return{direction:M,value:$}},[u,f,e,t]),h=Jo.useMemo(()=>e.map(w=>({...w,shortDate:Nr(w.date)})),[e]),T=a(r.widget.signups.total),P=a(r.defaults.members),b=a(r.defaults.retail),p=a(r.defaults.brandAffiliates);return n&&e.length===0?z(Za,{\"data-testid\":\"widget-signups\",children:z(Dr,{})}):$e(Za,{as:\"section\",\"data-testid\":\"widget-signups\",\"aria-label\":a(r.widget.signups.chartAriaLabel),children:[$e(rs,{children:[z(ns,{as:\"button\",onClick:l,\"aria-label\":a(r.widget.signups.titleAriaLabel),\"data-testid\":\"widget-title-signups\",children:i??a(r.widget.signups.title)}),$e(as,{children:[$e(at,{id:\"signup-view\",\"data-testid\":\"signup-view-dropdown\",value:t,onChange:g,disabled:n,\"aria-label\":a(r.widget.signups.filterAriaLabel),children:[z(\"option\",{value:\"all\",children:a(r.filter.signupView.showAll)}),z(\"option\",{value:\"members\",children:a(r.filter.signupView.showMembers)}),z(\"option\",{value:\"retail\",children:a(r.filter.signupView.showRetail)}),z(\"option\",{value:\"brandAffiliates\",children:a(r.filter.signupView.showBrandAffiliates)})]}),z(nt,{widgetId:\"signups\",onFullView:l,onExport:d})]})]}),$e(is,{\"data-testid\":\"signups-metric-display\",children:[z(ls,{\"data-testid\":\"signups-metric-value\",\"aria-label\":`${T}: ${y.toLocaleString()}`,children:y.toLocaleString()}),x.value!==f&&$e(ss,{as:\"output\",\"data-testid\":\"signups-metric-trend\",direction:x.direction,\"aria-live\":\"polite\",\"aria-label\":`${wo(x.direction)} ${x.value}`,children:[$e(\"div\",{className:\"trend-line\",children:[z(\"span\",{\"aria-hidden\":\"true\",children:Be(x.direction)}),z(\"span\",{className:\"change-value\",children:x.value.split(\" \")[0]}),z(\"span\",{className:\"change-percent\",children:x.value.split(\" \")[1]})]}),z(\"div\",{className:\"comparison-text\",children:Ot(o)})]})]}),z(ds,{\"data-testid\":\"signups-chart\",children:z(Lu,{width:\"100%\",height:\"100%\",minHeight:200,children:$e(Pu,{data:h,margin:Nu,children:[z(Ou,{strokeDasharray:\"3 3\"}),z(Ru,{dataKey:\"shortDate\",tick:cs,tickLine:!1,interval:\"preserveStartEnd\"}),z(Mu,{tick:cs,tickLine:!1}),z(Fu,{}),(t===\"all\"||t===\"members\")&&z(ko,{type:\"monotone\",dataKey:t===\"all\"?\"total\":\"members\",stroke:t===\"all\"?xe.total:xe.members,strokeWidth:2,dot:To(t===\"all\"?xe.total:xe.members),name:t===\"all\"?T:P}),t===\"all\"&&$e(Iu,{children:[z(ko,{type:\"monotone\",dataKey:\"members\",stroke:xe.members,strokeWidth:2,dot:To(xe.members),name:P}),z(ko,{type:\"monotone\",dataKey:\"retail\",stroke:xe.retail,strokeWidth:2,dot:To(xe.retail),name:b}),z(ko,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:xe.brandAffiliates,strokeWidth:2,dot:To(xe.brandAffiliates),name:p})]}),t===\"retail\"&&z(ko,{type:\"monotone\",dataKey:\"retail\",stroke:xe.retail,strokeWidth:2,dot:To(xe.retail),name:b}),t===\"brandAffiliates\"&&z(ko,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:xe.brandAffiliates,strokeWidth:2,dot:To(xe.brandAffiliates),name:p})]})})}),t===\"all\"&&$e(ps,{\"data-testid\":\"signups-legend\",children:[$e(Go,{\"data-testid\":\"legend-total\",children:[z(jo,{color:xe.total}),z(Yo,{children:T})]}),$e(Go,{\"data-testid\":\"legend-members\",children:[z(jo,{color:xe.members}),z(Yo,{children:P})]}),$e(Go,{\"data-testid\":\"legend-retail\",children:[z(jo,{color:xe.retail}),z(Yo,{children:b})]}),$e(Go,{\"data-testid\":\"legend-brandAffiliates\",children:[z(jo,{color:xe.brandAffiliates}),z(Yo,{children:p})]})]})]})},$r=Jo.memo($u);$r.displayName=\"SignupsChart\";import Xa from\"react\";import{PieChart as Eu,Pie as Au,Cell as zu,ResponsiveContainer as Bu,Tooltip as Hu}from\"recharts\";import Wu from\"@mui/icons-material/TrendingUp\";import _u from\"@mui/icons-material/TrendingDown\";import{ColorUtils as Vu,styled as re}from\"@nuskin/foundation-theme\";var{getGenomeColor:be}=Vu,Gt=re(\"div\")`\n display: flex;\n flex-direction: column;\n padding: 16px;\n background-color: ${({theme:e})=>be(e,\"N20\")};\n border: 1px solid ${({theme:e})=>be(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=re(\"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`,Ir=re(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Do=re(\"h2\")`\n font-size: 18px;\n font-weight: 400;\n line-height: 31.18px;\n letter-spacing: 0;\n color: ${({theme:e})=>be(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})=>be(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`,us=re(\"select\")`\n height: 32px;\n padding: 4px 8px;\n background-color: ${({theme:e})=>be(e,\"N20\")};\n border: 1px solid ${({theme:e})=>be(e,\"N40\")};\n border-radius: 6px;\n font-size: 12px;\n font-weight: 400;\n color: ${({theme:e})=>be(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>be(e,\"N30\")};\n }\n &:focus {\n border-color: ${({theme:e})=>be(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>be(e,\"A20\")};\n }\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,Vr=re(\"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`,Er=re(\"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`,Ar=re(\"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`,zr=re(\"div\")`\n font-size: 10px;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>be(e,\"N70\")};\n`,Br=re(\"div\")`\n margin-top: 2px;\n font-size: 16px;\n line-height: 1.2;\n font-weight: 700;\n color: ${({theme:e})=>be(e,\"N100\")};\n`,Hr=re(\"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\":be(t,\"N70\")};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`,Wr=re(\"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`,_r=re(\"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})=>be(e,\"N30\")};\n }\n`,Ur=re(\"div\")`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({color:e})=>e};\n flex-shrink: 0;\n`,Kr=re(\"div\")`\n display: flex;\n flex-direction: row;\n gap: 4px;\n flex: 1;\n min-width: 0;\n align-items: center;\n`,Gr=re(\"div\")`\n font-size: 13px;\n font-weight: 600;\n color: ${({theme:e})=>be(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=re(\"div\")`\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>be(e,\"N100\")};\n flex-shrink: 0;\n white-space: nowrap;\n\n @media (min-width: 768px) {\n font-size: 13px;\n }\n`,gs=re(\"div\")`\n display: none;\n`,fs=re(\"div\")`\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n`,ms=re(\"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`,hs=re(\"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`,Yr=re(\"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})=>be(e,\"N70\")};\n`,Jr=re(\"div\")`\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: ${({theme:e})=>be(e,\"N70\")};\n`;import{jsx as te,jsxs as We}from\"react/jsx-runtime\";var Uu=({categories:e,categorySort:t,isLoading:o=!1,title:n,summaryChangePct:i,onSortChange:s,onTitleClick:l,onExport:d})=>{let g=Xa.useCallback(p=>{let w=p.target.value;s?.(w)},[s]),{sortedCategories:f,totalRevenue:u,totalVolume:y,trendDirection:x,formattedTrend:h}=Xa.useMemo(()=>{let p=[...e].sort((M,$)=>t===\"revenue\"?$.revenue-M.revenue:($.volume??0)-(M.volume??0)),w=p.reduce((M,$)=>M+$.revenue,0),v=p.reduce((M,$)=>M+($.volume??0),0),D,R;if(i!=null)Math.abs(i)<.1?(R=\"0%\",D=\"neutral\"):(D=i>0?\"up\":\"down\",R=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:M,formatted:$}=_t(p,V=>t===\"volume\"?V.volume??0:V.revenue,V=>t===\"volume\"?V.trend?.volume:V.trend?.revenue);D=M,R=$}return{sortedCategories:p,totalRevenue:w,totalVolume:v,trendDirection:D,formattedTrend:R}},[e,t,i]),T=p=>p===\"up\"?te(Wu,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):p===\"down\"?te(_u,{sx:{fontSize:\"14px\"},\"aria-hidden\":\"true\"}):null,P=p=>Or(p,{fontSize:\"10\",fontWeight:\"600\"}),b=f[0]?.currencyCode;return o&&e.length===0?te(Gt,{\"data-testid\":\"widget-top-categories\",children:te(Pr,{})}):e.length===0?We(Gt,{\"data-testid\":\"widget-top-categories\",children:[te(So,{children:te(Do,{children:n??a(r.widget.topCategories.title)})}),te(Yr,{\"data-testid\":\"categories-empty-state\",children:te(Jr,{children:a(r.widget.topCategories.empty)})})]}):We(Gt,{as:\"section\",\"data-testid\":\"widget-top-categories\",\"aria-label\":a(r.widget.topCategories.chartAriaLabel),children:[We(So,{children:[te(Do,{as:\"button\",onClick:l,\"aria-label\":a(r.widget.topCategories.titleAriaLabel),\"data-testid\":\"widget-title-top-categories\",children:n??a(r.widget.topCategories.title)}),We(Ir,{children:[We(at,{id:\"category-sort\",\"data-testid\":\"category-sort-dropdown\",value:t,onChange:g,disabled:o,\"aria-label\":a(r.widget.topCategories.sortAriaLabel),children:[te(\"option\",{value:\"revenue\",children:a(r.defaults.byRevenue)}),te(\"option\",{value:\"volume\",children:a(r.defaults.byVolume)})]}),te(nt,{widgetId:\"top-categories\",onFullView:l,onExport:d})]})]}),We(Vr,{children:[We(Er,{\"data-testid\":\"categories-chart\",children:[te(Bu,{width:\"100%\",height:\"100%\",children:We(Eu,{children:[te(Au,{data:f,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:t===\"volume\"?\"volume\":\"revenue\",nameKey:\"name\",paddingAngle:2,label:P,labelLine:!1,children:f.map(p=>te(zu,{fill:p.color},`cell-${p.id}`))}),te(Hu,{formatter:p=>H(p,b)})]})}),We(Ar,{\"data-testid\":\"categories-donut-center\",children:[te(zr,{children:t===\"volume\"?a(r.defaults.volume):a(r.stats.revenue)}),te(Br,{children:t===\"volume\"?`${y.toFixed(1)} SV`:H(u,b)}),We(Hr,{direction:x,children:[T(x),te(\"span\",{children:h})]})]})]}),te(Wr,{\"data-testid\":\"categories-legend-container\",children:f.map((p,w)=>{let v=t===\"volume\"?p.volume:p.revenue,D=t===\"volume\"?p.volumeSharePct:p.percentage,R=t===\"volume\"?p.trend?.volume:p.trend?.revenue;return We(_r,{\"data-testid\":`category-legend-${w}`,children:[te(Ur,{color:p.color}),We(Kr,{children:[te(Gr,{children:p.name.charAt(0).toUpperCase()+p.name.slice(1)}),We(fs,{children:[te(jr,{children:t===\"volume\"?`${v?.toFixed(1)} SV (${D}%)`:`${H(v??0,p.currencyCode)} (${D}%)`}),R?te(ms,{direction:gt(R),\"data-testid\":`category-legend-trend-${w}`,\"aria-label\":R,children:T(gt(R))}):null]})]})]},p.id)})})]})]})},Zr=Xa.memo(Uu);Zr.displayName=\"TopCategoriesPieChart\";import{jsx as Ft,jsxs as no}from\"react/jsx-runtime\";var Ku=[],Gu=[],ju=[],Yu=[],Qa=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,isLoading:s=!1,error:l,shopTitle:d,className:g,dateRange:f=Je,market:u=\"all\",productSort:y=\"units\",signupView:x=\"all\",conversionFilter:h=\"all\",categorySort:T=\"revenue\",categoriesSummaryChangePct:P,conversionSummaryChangePct:b,markets:p,onDateRangeChange:w,onMarketChange:v,onProductSortChange:D,onSignupViewChange:R,onConversionFilterChange:M,onCategorySortChange:$,onProductsTitleClick:V,onConversionTitleClick:_,onSignupsTitleClick:O,onCategoriesToTitleClick:c,onProductsExport:C,onConversionExport:S,onSignupsExport:m,onCategoriesExport:k})=>{let F=t??Ku,Y=o??Gu,le=n??ju,se=i??Yu;if(l)return Ft(Ia,{as:\"main\",className:g,\"aria-label\":a(r.ariaLabel.dashboard),children:no(Mi,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[no(\"strong\",{children:[a(r.error),\":\"]}),\" \",l]})});let fe=Pe=>Pe?Pe.startsWith(\"+\")?\"up\":Pe.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return no(Ia,{as:\"main\",className:g,\"data-testid\":\"shopping-dashboard\",\"aria-label\":a(r.ariaLabel.dashboard),\"aria-busy\":s,children:[Ft(Ho,{shopTitle:d,dateRange:f,market:u,isLoading:s,stats:e,markets:p,onDateRangeChange:w,onMarketChange:v}),no(Pi,{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:fe(e?.trend?.revenue),trendValue:e?.trend?.revenue,testId:\"stats-card-revenue\",isLoading:s}),Ft(Mt,{title:a(r.defaults.volume),value:e?.metrics?.volume??\"0\",subtitle:a(r.defaults.dcSv),trendDirection:fe(e?.trend?.volume),trendValue:e?.trend?.volume,testId:\"stats-card-volume\",isLoading:s}),Ft(Mt,{title:a(r.stats.visits),value:e?.metrics?.siteVisits??\"0\",subtitle:`${e?.metrics?.conversionRate??\"0%\"} ${a(r.defaults.conversionRate)}`,trendDirection:fe(e?.trend?.siteVisits),trendValue:e?.trend?.siteVisits,testId:\"stats-card-visits\",isLoading:s})]}),no(Ri,{\"data-testid\":\"widget-container\",children:[no(Va,{\"data-testid\":\"widget-row-1\",children:[Ft(Co,{products:F,productSort:y,isLoading:s,maxProducts:5,onSortChange:D,onTitleClick:V,onExport:C}),Ft($r,{signupData:le,signupView:x,dateRange:f,isLoading:s,onViewChange:R,onTitleClick:O,onExport:m})]}),no(Va,{\"data-testid\":\"widget-row-2\",children:[Ft(vo,{conversionData:Y,conversionFilter:h,dateRange:f,isLoading:s,summaryChangePct:b,onFilterChange:M,onTitleClick:_,onExport:S}),Ft(Zr,{categories:se,categorySort:T,isLoading:s,summaryChangePct:P,onSortChange:$,onTitleClick:c,onExport:k})]})]})]})};import oe from\"react\";import lo,{useState as an}from\"react\";import Zu from\"@mui/icons-material/ArrowBack\";import qu from\"@mui/icons-material/CalendarToday\";import Xu from\"@mui/icons-material/Language\";import{ColorUtils as Ju,styled as Ie}from\"@nuskin/foundation-theme\";var{getGenomeColor:_e}=Ju,xs=Ie(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`,bs=Ie(\"div\")`\n display: flex;\n align-items: center;\n`,ys=Ie(\"button\")`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({theme:e})=>_e(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})=>_e(e,\"N100\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>_e(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`,ws=Ie(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({theme:e})=>_e(e,\"N30\")};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`,Cs=Ie(\"div\")`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`,vs=Ie(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>_e(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,ks=Ie(\"p\")`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>_e(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n`,Ts=Ie(\"p\")`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({theme:e})=>_e(e,\"N100\")};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`,Ss=Ie(\"div\")`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`,Ds=Ie(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Ps=Ie(\"span\")`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({theme:e})=>_e(e,\"N70\")};\n\n svg {\n font-size: 16px;\n }\n`,Rs=Ie(\"select\")`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({theme:e})=>_e(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})=>_e(e,\"N20\")};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({theme:e})=>_e(e,\"N20\")};\n border-radius: 4px;\n outline: 2px solid ${({theme:e})=>_e(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`,Ms=Ie(\"div\")`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`,Os=Ie(\"h1\")`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({theme:e})=>_e(e,\"N100\")};\n margin: 0;\n`;import{jsx as Ue,jsxs as Po}from\"react/jsx-runtime\";function ht(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 xt(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 ge=({title:e,dateRange:t,onBack:o,filters:n,onFilterChange:i})=>{let s=l=>l?Po(Ps,{children:[l===\"calendar\"&&Ue(qu,{}),l===\"globe\"&&Ue(Xu,{})]}):null;return Po(xs,{\"data-testid\":\"page-header\",children:[Ue(bs,{children:Po(ys,{onClick:o,\"aria-label\":a(r.navigation.backAriaLabel),\"data-testid\":\"page-back-button\",type:\"button\",children:[Ue(Zu,{}),Ue(\"span\",{children:a(r.navigation.backToDashboard)})]})}),Ue(Ms,{children:Ue(Os,{children:e})}),Po(ws,{children:[Po(Cs,{children:[Ue(vs,{\"data-testid\":\"page-header-title\",children:e}),Ue(ks,{\"data-testid\":\"page-header-date-range\",children:t})]}),n&&n.length>0&&i&&Ue(Ss,{\"data-testid\":\"page-header-filters\",children:n.map(l=>Po(Ds,{children:[s(l.icon),Ue(Rs,{id:`filter-${l.key}`,value:l.value,onChange:d=>i(l.key,d.target.value),disabled:l.disabled,\"aria-label\":`${l.label} ${a(r.ariaLabel.filterSuffix)}`,\"data-testid\":`filter-dropdown-${l.key}`,children:l.options.map(d=>Ue(\"option\",{value:d.value,children:l.label&&l.key===\"customerType\"?`${l.label} ${d.label}`:d.label},d.value))})]},l.key))}),Ue(Ts,{children:t})]})]})};import eg from\"@mui/icons-material/ArrowUpward\";import tg from\"@mui/icons-material/ArrowDownward\";import{ColorUtils as Qu,styled as Lt}from\"@nuskin/foundation-theme\";var{getGenomeColor:bt}=Qu,Fs=Lt(\"div\")`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({theme:e})=>bt(e,\"N30\")};\n`,Ls=Lt(\"table\")`\n width: 100%;\n border-collapse: collapse;\n`,Ns=Lt(\"thead\")`\n background-color: ${({theme:e})=>bt(e,\"N20\")};\n border-bottom: 2px solid ${({theme:e})=>bt(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})=>bt(e,\"N20\")};\n color: ${({theme:e})=>bt(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})=>bt(e,\"N20\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>bt(e,\"A70\")};\n outline-offset: -2px;\n }\n`,Is=Lt(\"tbody\")``,en=Lt(\"tr\")`\n border-bottom: 1px solid ${({theme:e})=>bt(e,\"N30\")};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>bt(e,\"N20\")};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`,tn=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})=>bt(e,\"N70\")};\n text-align: left;\n`,Vs=Lt(tn)`\n text-align: center;\n`,Es=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 it,jsxs as As}from\"react/jsx-runtime\";var lt=({columns:e,data:t,sortable:o=!1,onSort:n,sortColumn:i,sortDirection:s=\"asc\",getRowKey:l})=>{let d=u=>{if(!o||!n)return;n(u,i===u&&s===\"asc\"?\"desc\":\"asc\")},g=(u,y)=>{(u.key===\"Enter\"||u.key===\" \")&&(u.preventDefault(),d(y))},f=u=>{if(i===u)return s===\"asc\"?\"ascending\":\"descending\"};return it(Fs,{\"data-testid\":\"data-table\",children:As(Ls,{children:[it(Ns,{children:it(\"tr\",{children:e.map(u=>As($s,{scope:\"col\",sortable:o&&u.sortable,onClick:()=>u.sortable&&d(u.key),onKeyDown:y=>u.sortable&&g(y,u.key),tabIndex:o&&u.sortable?0:-1,\"aria-sort\":f(u.key),\"aria-label\":`${u.label}${u.sortable?a(r.dataTable.sortableColumn):\"\"}`,\"data-testid\":`table-header-${u.key}`,children:[u.label,o&&u.sortable&&it(Es,{isActive:i===u.key,children:i===u.key&&s===\"desc\"?it(tg,{}):it(eg,{})})]},u.key))})}),it(Is,{children:t.length===0?it(en,{\"data-testid\":\"table-empty-row\",children:it(Vs,{colSpan:e.length,children:a(r.dataTable.noDataAvailable)})}):t.map((u,y)=>it(en,{\"data-testid\":`table-row-${y}`,children:e.map(x=>it(tn,{\"data-testid\":`table-cell-${x.key}`,children:x.render?x.render(u[x.key],u):u[x.key]},x.key))},l?l(u,y):y))})]})})};import rg from\"@mui/icons-material/ChevronLeft\";import ag from\"@mui/icons-material/ChevronRight\";import{ColorUtils as og,styled as qr}from\"@nuskin/foundation-theme\";var{getGenomeColor:st}=og,zs=qr(\"div\")`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`,Xr=qr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e,isActive:t})=>t?st(e,\"A80\"):st(e,\"N20\")};\n color: ${({theme:e,isActive:t})=>t?\"#ffffff\":st(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?st(e,\"A70\"):st(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>st(e,\"A70\")};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`,Qr=qr(\"span\")`\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>st(e,\"N70\")};\n margin: 0 8px;\n`,on=qr(\"button\")`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({theme:e})=>st(e,\"N20\")};\n color: ${({theme:e})=>st(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})=>st(e,\"N30\")};\n }\n\n &:focus {\n outline: 2px solid ${({theme:e})=>st(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 Bs,jsx as Nt,jsxs as ea}from\"react/jsx-runtime\";var dt=({currentPage:e,totalPages:t,onPageChange:o,itemsPerPage:n,totalItems:i})=>{let s=()=>{e>1&&o(e-1)},l=()=>{e<t&&o(e+1)},d=(h,T)=>{(h.key===\"Enter\"||h.key===\" \")&&(h.preventDefault(),T())},f=(()=>{if(t<=7)return Array.from({length:t},(T,P)=>P+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})(),u=n?(e-1)*n+1:null,y=n?Math.min(e*n,i??1/0):null,x=a(r.pagination.goToPage);return ea(zs,{\"data-testid\":\"pagination\",children:[Nt(on,{onClick:s,onKeyDown:h=>d(h,s),disabled:e===1,\"aria-label\":a(r.pagination.previousPage),\"data-testid\":\"pagination-previous\",type:\"button\",children:Nt(rg,{})}),t>7&&e>4&&ea(Bs,{children:[Nt(Xr,{onClick:()=>o(1),isActive:!1,\"aria-label\":`${x} 1`,\"data-testid\":\"pagination-page-1\",type:\"button\",children:\"1\"}),Nt(Qr,{children:\"...\"})]}),f.map(h=>Nt(Xr,{onClick:()=>o(h),isActive:e===h,\"aria-label\":`${x} ${h}`,\"aria-current\":e===h?\"page\":void 0,\"data-testid\":`pagination-page-${h}`,type:\"button\",children:h},h)),t>7&&e<t-3&&ea(Bs,{children:[Nt(Qr,{children:\"...\"}),Nt(Xr,{onClick:()=>o(t),isActive:!1,\"aria-label\":`${x} ${t}`,\"data-testid\":`pagination-page-${t}`,type:\"button\",children:t})]}),Nt(on,{onClick:l,onKeyDown:h=>d(h,l),disabled:e===t,\"aria-label\":a(r.pagination.nextPage),\"data-testid\":\"pagination-next\",type:\"button\",children:Nt(ag,{})}),n&&i&&ea(Qr,{as:\"output\",\"aria-live\":\"polite\",\"data-testid\":\"pagination-page-info\",children:[u,\"-\",y,\" \",a(r.pagination.of),\" \",i]})]})};import{styled as Te}from\"@mui/material/styles\";import{Box as jt,Typography as io}from\"@mui/material\";import{ColorUtils as ng}from\"@nuskin/foundation-theme\";var{getGenomeColor:Hs}=ng,ye=Te(jt)`\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`,ta=Te(jt)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>Hs(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`,oa=Te(jt)`\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`,ra=Te(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`,aa=Te(jt)`\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`,R0=Te(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`,na=Te(jt)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`,Yt=Te(\"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`,M0=Te(jt)`\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`,Jt=Te(jt)`\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: ${Hs(t,\"N20\")};\n border-radius: 8px;\n box-shadow: ${t.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`,O0=Te(jt)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`,Zt=Te(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`,Ws=Te(io)`\n font-weight: 600;\n font-size: 14px;\n`,_s=Te(io)`\n font-size: 13px;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,Us=Te(io)`\n font-size: 13px;\n`,Ks=Te(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 Se}from\"@mui/material/styles\";import{Box as qt,Typography as Xt}from\"@mui/material\";import{ColorUtils as ig}from\"@nuskin/foundation-theme\";var{getGenomeColor:rn}=ig,Gs=Se(qt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`,js=Se(Xt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Ys=Se(Xt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ia=Se(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})=>rn(e,\"N70\")};\n`,Js=Se(qt)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Zs=Se(qt)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,qs=Se(qt)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>rn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Xs=Se(qt)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`,Qs=Se(Xt)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({theme:e})=>e.palette.primary.main};\n min-width: 24px;\n`,ed=Se(qt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,td=Se(Xt)`\n font-size: 0.875rem;\n font-weight: 600;\n`,od=Se(Xt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,rd=Se(qt)`\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`,la=Se(qt)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,sa=Se(Xt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,da=Se(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})=>rn(e,\"N70\")};\n`;import lg from\"@mui/material/useMediaQuery\";var sg=\"(max-width:767px)\";function yt(){return lg(sg,{noSsr:!0})}import{jsx as ae,jsxs as qe}from\"react/jsx-runtime\";function dg(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 Zo=({products:e,dateRange:t,market:o,productSort:n,markets:i,isLoading:s=!1,onBack:l,onDateRangeChange:d,onMarketChange:g,onProductSortChange:f})=>{let[u,y]=an(1),[x,h]=an(n===\"revenue\"?\"revenue\":\"units\"),[T,P]=an(\"desc\"),b=10,p=yt(),w=lo.useCallback(()=>l?.(),[l]),v=Ye(i),D=lo.useMemo(()=>[ht(t,r),xt(o,v,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,v,n]),R=lo.useCallback((S,m)=>{S===\"dateRange\"?d?.(m):S===\"market\"?g?.(m):S===\"sort\"&&(f?.(m),y(1))},[d,g,f]),M=lo.useCallback((S,m)=>{h(S),P(m),y(1)},[]),$=lo.useMemo(()=>e.map(dg),[e]),V=lo.useMemo(()=>[...$].sort((S,m)=>{let k=S[x],F=m[x];return T===\"asc\"?k-F:F-k}),[$,x,T]),{totalPages:_,pageItems:O}=ft(V,u,b),c=e[0]?.currencyCode,C=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:(S,m)=>qe(Gs,{children:[ae(js,{children:m.name}),ae(Ys,{children:m.sku})]})},{key:\"units\",label:a(r.fullView.products.columns.unitsSold),sortable:!0,render:S=>ae(ia,{children:Number(S).toLocaleString()})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:S=>ae(ia,{children:H(Number(S),c)})},{key:\"volume\",label:a(r.fullView.products.columns.volume),sortable:!0,render:S=>ae(ia,{children:Number(S).toLocaleString()})}],[c]);return s?qe(ye,{\"data-testid\":\"products-full-view\",children:[ae(ge,{title:a(r.widget.topProducts.title),dateRange:he(t),onBack:w,filters:D,onFilterChange:R}),ae(hl,{})]}):e.length===0?qe(ye,{\"data-testid\":\"products-full-view\",children:[ae(ge,{title:a(r.widget.topProducts.title),dateRange:he(t),onBack:w,filters:D,onFilterChange:R}),ae(Zt,{\"data-testid\":\"products-fullview-empty\",children:a(r.fullView.products.noProducts)})]}):qe(ye,{\"data-testid\":\"products-full-view\",children:[ae(ge,{title:a(r.widget.topProducts.title),dateRange:he(t),onBack:w,filters:D,onFilterChange:R}),p?ae(Js,{\"data-testid\":\"products-fullview-mobile-cards\",children:O.map(S=>qe(qs,{children:[qe(Xs,{children:[qe(Qs,{children:[\"#\",S.rank]}),qe(ed,{children:[ae(td,{children:S.name}),ae(od,{children:S.sku})]})]}),qe(rd,{children:[qe(la,{children:[ae(sa,{children:a(r.defaults.units)}),ae(da,{children:S.units.toLocaleString()})]}),qe(la,{children:[ae(sa,{children:a(r.defaults.revenue)}),ae(da,{children:H(S.revenue,c)})]}),qe(la,{children:[ae(sa,{children:a(r.defaults.volume)}),ae(da,{children:S.volume.toLocaleString()})]})]})]},S.rank))}):ae(Zs,{\"data-testid\":\"products-fullview-desktop-table\",children:ae(lt,{columns:C,data:O,sortable:!0,onSort:M,sortColumn:x,sortDirection:T,getRowKey:S=>S.rank})}),_>1&&ae(dt,{currentPage:u,totalPages:_,onPageChange:y,itemsPerPage:b,totalItems:V.length})]})};import wt,{useState as ug}from\"react\";import{LineChart as gg,Line as fg,XAxis as mg,YAxis as hg,CartesianGrid as xg,Tooltip as bg,ResponsiveContainer as yg}from\"recharts\";import wg from\"@mui/icons-material/ArrowUpward\";import Cg from\"@mui/icons-material/ArrowDownward\";import{styled as pe}from\"@mui/material/styles\";import{Box as Xe,Typography as qo}from\"@mui/material\";import{ColorUtils as pg}from\"@nuskin/foundation-theme\";var{getGenomeColor:cg}=pg,ad=pe(Xe)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,nd=pe(Xe)`\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})=>cg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,id=pe(Xe)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`,ld=pe(Xe)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`,sd=pe(qo)`\n font-size: 1rem;\n font-weight: 600;\n`,dd=pe(qo)`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,pd=pe(\"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`,cd=pe(Xe)`\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`,pa=pe(Xe)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`,ca=pe(qo)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,ua=pe(qo)`\n font-size: 0.875rem;\n font-weight: 500;\n`,ud=pe(Xe)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,gd=pe(Xe)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,fd=pe(Xe)`\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`,md=pe(Xe)`\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`,hd=pe(Xe)`\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`,ty=pe(qo)`\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`,xd=pe(\"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=pe(\"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`,yd=pe(\"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`,wd=pe(Xe)`\n display: flex;\n align-items: center;\n gap: 0;\n flex-wrap: wrap;\n`;import{jsx as W,jsxs as we}from\"react/jsx-runtime\";var Xo=({conversionData:e,orders:t,summaryRate:o,summaryChangePct:n,dateRange:i,market:s,conversionFilter:l,markets:d,isLoading:g=!1,onBack:f,onDateRangeChange:u,onMarketChange:y,onConversionFilterChange:x})=>{let[h,T]=ug(1),P=10,b=yt(),p=wt.useCallback(()=>f?.(),[f]),w=Ye(d),v=wt.useMemo(()=>typeof o==\"number\"&&Number.isFinite(o)?o:e.at(-1)?.rate??0,[o,e]),D=wt.useMemo(()=>{if(n!==void 0){if(n===null)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let le=\"neutral\";return n>0?le=\"up\":n<0&&(le=\"down\"),{direction:le,value:`${n>=0?\"+\":\"\"}${n.toFixed(1)}%`}}if(e.length<2)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let m=e.at(-1)?.rate??0,k=e[0].rate;if(k===0)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let F=(m-k)/k*100;if(Math.abs(F)<.1)return{direction:\"neutral\",value:a(r.defaults.zeroTrend)};let Y=\"neutral\";return F>0?Y=\"up\":F<0&&(Y=\"down\"),{direction:Y,value:`${F>=0?\"+\":\"\"}${F.toFixed(1)}%`}},[n,e]),R=wt.useCallback(m=>m===\"standard\"?a(r.filter.conversionType.standard):m===\"subscription\"?a(r.filter.conversionType.subscription):a(r.defaults.all),[]),M=wt.useMemo(()=>R(l),[l,R]),$=wt.useMemo(()=>[ht(i,r),xt(s,w,r),{key:\"customerType\",label:a(r.filter.signupView.label),value:l,options:[{value:\"all\",label:a(r.defaults.all)},{value:\"standard\",label:a(r.filter.conversionType.standard)},{value:\"subscription\",label:a(r.filter.conversionType.subscription)}]}],[l,i,s,w]),V=wt.useCallback((m,k)=>{m===\"dateRange\"?u?.(k):m===\"market\"?y?.(k):m===\"customerType\"&&(x?.(k),T(1))},[x,u,y]),_=wt.useMemo(()=>l===\"all\"?t:t.filter(m=>m.customerType.toLowerCase()===l),[t,l]),{totalPages:O,pageItems:c}=ft(_,h,P),C=wt.useMemo(()=>[{key:\"orderId\",label:a(r.fullView.conversionRate.columns.orderId),sortable:!0,render:m=>W(xd,{children:m})},{key:\"date\",label:a(r.defaults.date),sortable:!0},{key:\"customerName\",label:a(r.fullView.conversionRate.columns.customer),sortable:!0},{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:(m,k)=>H(Number(m),k.currencyCode,void 0,2)},{key:\"bv\",label:a(r.fullView.conversionRate.columns.bv),sortable:!0}],[]),S=wt.useCallback(()=>l===\"standard\"?\"#2e7d32\":l===\"subscription\"?\"#ed6c02\":\"#1976d2\",[l]);return g?we(ye,{\"data-testid\":\"conversion-rate-full-view\",children:[W(ge,{title:a(r.defaults.conversionRate),dateRange:he(i),onBack:p,filters:$,onFilterChange:V}),W(Ht,{})]}):we(ye,{\"data-testid\":\"conversion-rate-full-view\",children:[W(ge,{title:a(r.defaults.conversionRate),dateRange:he(i),onBack:p,filters:$,onFilterChange:V}),we(ta,{\"data-testid\":\"conversion-fullview-metric-chart\",children:[W(oa,{children:we(wd,{children:[we(ra,{\"data-testid\":\"conversion-rate-value\",style:{marginRight:\"6px\"},children:[v.toFixed(1),\"%\"]}),we(aa,{direction:D.direction,\"data-testid\":\"conversion-rate-trend\",children:[D.direction===\"up\"&&W(wg,{}),D.direction===\"down\"&&W(Cg,{}),W(bd,{children:D.value}),W(yd,{children:Ot(i)})]})]})}),W(na,{children:we(fd,{children:[W(ad,{\"data-testid\":\"conversion-fullview-chart\",children:W(yg,{width:\"100%\",height:\"100%\",children:we(gg,{data:e,margin:{top:10,right:10,left:0,bottom:0},children:[W(xg,{strokeDasharray:\"3 3\"}),W(mg,{dataKey:\"date\"}),W(hg,{tickFormatter:m=>`${m}%`,domain:[0,\"auto\"]}),W(bg,{formatter:m=>typeof m==\"number\"?`${m.toFixed(2)}%`:typeof m==\"string\"?m:a(r.fullView.conversionRate.notAvailable)}),W(fg,{type:\"monotone\",dataKey:\"rate\",stroke:S(),strokeWidth:2,name:`${a(r.defaults.conversionRate)} (${M})`,dot:!1})]})})}),W(md,{children:W(hd,{$color:S(),children:`${a(r.defaults.conversionRate)} (${M})`})})]})})]}),we(Jt,{\"data-testid\":\"conversion-fullview-table-section\",children:[we(Yt,{\"data-testid\":\"conversion-fullview-table-title\",children:[a(r.fullView.conversionRate.orderDetailsTitle),\" (\",_.length,\")\"]}),b?W(ud,{\"data-testid\":\"conversion-fullview-mobile-orders\",children:c.map(m=>we(nd,{children:[we(id,{children:[we(ld,{children:[W(sd,{children:m.customerName}),W(dd,{children:m.date})]}),W(pd,{children:m.orderId})]}),we(cd,{children:[we(pa,{children:[W(ca,{children:a(r.fullView.conversionRate.columns.items)}),W(ua,{children:m.items})]}),we(pa,{children:[W(ca,{children:a(r.fullView.conversionRate.columns.total)}),we(ua,{children:[\"$\",m.total.toFixed(2)]})]}),we(pa,{children:[W(ca,{children:a(r.fullView.conversionRate.columns.totalSv)}),W(ua,{children:m.bv})]})]})]},m.orderId))}):W(gd,{\"data-testid\":\"conversion-fullview-desktop-table\",children:W(lt,{columns:C,data:c,getRowKey:m=>m.orderId})}),O>1&&W(dt,{currentPage:h,totalPages:O,onPageChange:T,itemsPerPage:P,totalItems:_.length})]})]})};import po,{useState as Sg}from\"react\";import{Box as Dg}from\"@mui/material\";import{LineChart as Pg,Line as co,XAxis as Rg,YAxis as Mg,CartesianGrid as Og,Tooltip as Fg,ResponsiveContainer as Lg}from\"recharts\";import Ng from\"@mui/icons-material/TrendingUp\";import $g from\"@mui/icons-material/TrendingDown\";import{styled as pt}from\"@mui/material/styles\";import{Box as so,Typography as vg}from\"@mui/material\";import{ColorUtils as kg}from\"@nuskin/foundation-theme\";var{getGenomeColor:Tg}=kg,Cd=pt(so)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,vd=pt(so)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,kd=pt(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})=>Tg(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n }\n`,Td=pt(so)`\n width: 100%;\n height: 320px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`,Sd=pt(vg)`\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`,Dd=pt(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`,Qo=pt(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=pt(so)`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({theme:e})=>e.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`,Pd=pt(\"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`,Rd=pt(\"span\")`\n font-weight: 600;\n line-height: 1;\n`,Md=pt(\"span\")`\n font-weight: 400;\n line-height: 1;\n`;import{Fragment as Od,jsx as L,jsxs as Oe}from\"react/jsx-runtime\";var Ve={total:\"#3B82F6\",members:\"#7B92A8\",retail:\"#A3B5C7\",brandAffiliates:\"#5F7388\"};function eo(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 Ig(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:eo(o.total),members:eo(o.members),retail:eo(o.retail),brandAffiliates:eo(o.brandAffiliates??o.brandAffiliate??o.brand_affiliates??o.brand_affiliate)})):[]}var nn=({signupData:e,signups:t,dateRange:o,market:n,signupView:i,markets:s,isLoading:l=!1,onBack:d,onDateRangeChange:g,onMarketChange:f,onSignupViewChange:u})=>{let[y,x]=Sg(1),h=10,T=yt(),P=po.useCallback(()=>d?.(),[d]),b=Ye(s),p=po.useMemo(()=>Ig(e).map(c=>{let C=c,S=eo(C.members),m=eo(C.retail),k=eo(C.brandAffiliates??C.brandAffiliate??C.brand_affiliates??C.brand_affiliate),F=eo(C.total??C.all??C.signupTotal??C.value);return{...c,total:F>0?F:S+m+k,members:S,retail:m,brandAffiliates:k}}),[e]),w=po.useMemo(()=>{if(p.length===0)return 0;let O=p[p.length-1];return Ut(O,i)},[p,i]),v=po.useMemo(()=>{if(p.length<2)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let O=Ut(p[0],i),c=Ut(p[p.length-1],i);if(O<=0)return{direction:\"neutral\",absoluteChange:0,percentageChange:a(r.defaults.zeroTrend)};let C=c-O,S=C/O*100,m=\"neutral\";return S>0?m=\"up\":S<0&&(m=\"down\"),{direction:m,absoluteChange:Math.round(C),percentageChange:`${S>=0?\"+\":\"\"}${S.toFixed(1)}%`}},[p,i,r]),D=p.length>0,R=po.useMemo(()=>[ht(o,r),xt(n,b,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,b,i]),M=po.useCallback((O,c)=>{O===\"dateRange\"?g?.(c):O===\"market\"?f?.(c):O===\"signupView\"&&(u?.(c),x(1))},[g,f,u]),{totalPages:$,pageItems:V}=ft(t,y,h),_=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:O=>L(Pd,{children:O})},{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 l?Oe(ye,{\"data-testid\":\"signups-full-view\",children:[L(ge,{title:a(r.widget.signups.title),dateRange:he(o),onBack:P,filters:R,onFilterChange:M}),L(Ht,{})]}):Oe(ye,{\"data-testid\":\"signups-full-view\",children:[L(ge,{title:a(r.widget.signups.title),dateRange:he(o),onBack:P,filters:R,onFilterChange:M}),Oe(ta,{\"data-testid\":\"signups-fullview-metric-chart\",children:[Oe(oa,{children:[L(ra,{\"data-testid\":\"signups-total\",children:w.toLocaleString()}),Oe(aa,{direction:v.direction,children:[v.direction===\"up\"&&L(Ng,{}),v.direction===\"down\"&&L($g,{}),v.direction!==\"neutral\"&&Oe(Od,{children:[Oe(Rd,{children:[v.absoluteChange>0?\"+\":\"\",v.absoluteChange]}),L(Md,{children:v.percentageChange})]}),v.direction===\"neutral\"&&L(\"span\",{children:v.percentageChange})]}),L(Sd,{children:Ot(o)})]}),L(na,{children:D?Oe(Dd,{children:[L(Td,{\"data-testid\":\"signups-fullview-chart\",children:L(Lg,{width:\"100%\",height:\"100%\",minHeight:240,children:Oe(Pg,{data:p,children:[L(Og,{strokeDasharray:\"3 3\"}),L(Rg,{dataKey:\"date\"}),L(Mg,{}),L(Fg,{}),i===\"all\"&&Oe(Od,{children:[L(co,{type:\"monotone\",dataKey:\"total\",stroke:Ve.total,strokeWidth:2,name:a(r.widget.signups.total),dot:{r:2},connectNulls:!0}),L(co,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),L(co,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),L(co,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]}),i===\"members\"&&L(co,{type:\"monotone\",dataKey:\"members\",stroke:Ve.members,strokeWidth:2,name:a(r.defaults.members),dot:{r:2},connectNulls:!0}),i===\"retail\"&&L(co,{type:\"monotone\",dataKey:\"retail\",stroke:Ve.retail,strokeWidth:2,name:a(r.defaults.retail),dot:{r:2},connectNulls:!0}),i===\"brandAffiliates\"&&L(co,{type:\"monotone\",dataKey:\"brandAffiliates\",stroke:Ve.brandAffiliates,strokeWidth:2,name:a(r.defaults.brandAffiliates),dot:{r:2},connectNulls:!0})]})})}),Oe(Dg,{children:[i===\"all\"&&Oe(Qo,{children:[L(Qt,{style:{color:Ve.total},children:a(r.widget.signups.total)}),L(Qt,{style:{color:Ve.members},children:a(r.defaults.members)}),L(Qt,{style:{color:Ve.retail},children:a(r.defaults.retail)}),L(Qt,{style:{color:Ve.brandAffiliates},children:a(r.defaults.brandAffiliates)})]}),i===\"members\"&&L(Qo,{children:L(Qt,{style:{color:Ve.members},children:a(r.defaults.members)})}),i===\"retail\"&&L(Qo,{children:L(Qt,{style:{color:Ve.retail},children:a(r.defaults.retail)})}),i===\"brandAffiliates\"&&L(Qo,{children:L(Qt,{style:{color:Ve.brandAffiliates},children:a(r.defaults.brandAffiliates)})})]})]}):L(Zt,{\"data-testid\":\"signups-fullview-chart-empty\",children:a(r.widget.signups.noTrendData)})})]}),Oe(Jt,{\"data-testid\":\"signups-fullview-table-section\",children:[L(Yt,{\"data-testid\":\"signups-fullview-table-title\",children:`${a(r.fullView.signups.detailsTitle)} (${t.length})`}),T?L(Cd,{\"data-testid\":\"signups-fullview-mobile-cards\",children:V.map(O=>Oe(kd,{children:[L(Ws,{children:O.name}),Oe(_s,{children:[O.date,\" - \",O.type]}),L(Us,{children:O.email}),L(Ks,{status:O.status,children:O.status})]},O.id))}):L(vd,{\"data-testid\":\"signups-fullview-desktop-table\",children:L(lt,{columns:_,data:V,getRowKey:O=>O.id})}),$>1&&L(dt,{currentPage:y,totalPages:$,onPageChange:x,itemsPerPage:h,totalItems:t.length})]})]})};import uo,{useState as Eg}from\"react\";import{PieChart as Ag,Pie as zg,Cell as Bg,ResponsiveContainer as Hg,Tooltip as Wg}from\"recharts\";import _g from\"@mui/icons-material/TrendingUp\";import Ug from\"@mui/icons-material/TrendingDown\";import{styled as Ro,ColorUtils as Vg}from\"@nuskin/foundation-theme\";import{styled as ke}from\"@mui/material/styles\";import{Box as Ct,Typography as Mo}from\"@mui/material\";var{getGenomeColor:ln}=Vg,ga=Ro(\"div\")`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Fd=Ro(\"div\")`\n flex: 1;\n`,Ld=Ro(\"span\")`\n font-weight: 600;\n`,Nd=Ro(\"span\")`\n font-size: 0.875rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,$d=Ro(\"span\")`\n font-weight: 600;\n`,Id=ke(Ct)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({theme:e})=>ln(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`,Vd=ke(Ct)`\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`,Ed=ke(Ct)`\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`,Ad=ke(Mo)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,zd=ke(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`,Bd=ke(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`,Hd=ke(Ct)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`,Wd=ke(Ct)`\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})=>ln(e,\"N30\")};\n }\n`,fa=ke(Ct)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,jy=ke(Ct)`\n display: none;\n`,_d=ke(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`,Ud=ke(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`,Kd=ke(Mo)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Gd=ke(Ct)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,jd=ke(Ct)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,Yd=ke(Ct)`\n display: flex;\n align-items: center;\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`,Jd=ke(\"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`,Zd=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{jsx as j,jsxs as De}from\"react/jsx-runtime\";var sn=({categories:e,dateRange:t,market:o,categorySort:n,summaryChangePct:i,markets:s,isLoading:l=!1,onBack:d,onDateRangeChange:g,onMarketChange:f,onCategorySortChange:u})=>{let[y,x]=Eg(1),h=10,T=yt(),P=uo.useCallback(()=>d?.(),[d]),b=Ye(s),p=uo.useMemo(()=>[ht(t,r),xt(o,b,r),{key:\"sort\",label:a(r.filter.productSort.label),value:n,options:[{value:\"revenue\",label:a(r.defaults.byRevenue)},{value:\"trend\",label:a(r.defaults.byTrend)}]}],[n,t,o,b]),w=uo.useCallback((k,F)=>{k===\"dateRange\"?g?.(F):k===\"market\"?f?.(F):k===\"sort\"&&(u?.(F),x(1))},[u,g,f]),v=k=>Or(k,{fontSize:\"12\",fontWeight:\"700\"}),D=k=>k===\"up\"?j(_g,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):k===\"down\"?j(Ug,{sx:{fontSize:\"16px\"},\"aria-hidden\":\"true\"}):null,R=k=>{if(!k)return\"neutral\";let F=Number.parseFloat(k);return Number.isNaN(F)?\"neutral\":F>0?\"up\":F<0?\"down\":\"neutral\"},M=uo.useMemo(()=>[...e].sort((k,F)=>n===\"revenue\"?F.revenue-k.revenue:(F.volume??0)-(k.volume??0)),[e,n]),{totalRevenue:$,totalRevenueTrendDirection:V,totalRevenueTrend:_}=uo.useMemo(()=>{let k=M.reduce((le,se)=>le+se.revenue,0),F,Y;if(i!=null)Math.abs(i)<.1?(Y=\"0%\",F=\"neutral\"):(F=i>0?\"up\":\"down\",Y=`${i>0?\"+\":\"\"}${i.toFixed(1)}%`);else{let{direction:le,formatted:se}=_t(M,fe=>fe.revenue,fe=>fe.trend?.revenue);F=le,Y=se}return{totalRevenue:k,totalRevenueTrendDirection:F,totalRevenueTrend:Y}},[M,i]),O=uo.useMemo(()=>M.slice(0,5),[M]),{totalPages:c,pageItems:C}=ft(M,y,h),S=M[0]?.currencyCode,m=uo.useMemo(()=>[{key:\"name\",label:a(r.fullView.categories.columns.category),sortable:!0,render:(F,Y)=>De(ga,{children:[j(fa,{dotColor:Y.color}),j(Zd,{children:Uo(Y.name)})]})},{key:\"revenue\",label:a(r.defaults.revenue),sortable:!0,render:(F,Y)=>H(Number(F),Y.currencyCode)},{key:\"volume\",label:a(r.defaults.volume),sortable:!0,render:F=>H(Number(F??0),S)},{key:\"percentage\",label:a(r.fullView.categories.columns.percentOfTotal),sortable:!0,render:F=>`${Number(F)}%`},{key:\"trend\",label:a(r.defaults.trend),render:(F,Y)=>Y.trend?.revenue??a(r.defaults.noValue)}],[S]);return l?De(ye,{\"data-testid\":\"categories-full-view\",children:[j(ge,{title:a(r.widget.topCategories.title),dateRange:he(t),onBack:P,filters:p,onFilterChange:w}),j(Ht,{})]}):e.length===0?De(ye,{\"data-testid\":\"categories-full-view\",children:[j(ge,{title:a(r.widget.topCategories.title),dateRange:he(t),onBack:P,filters:p,onFilterChange:w}),j(Zt,{\"data-testid\":\"categories-fullview-empty\",children:a(r.fullView.categories.noCategoryData)})]}):De(ye,{\"data-testid\":\"categories-full-view\",children:[j(ge,{title:a(r.widget.topCategories.title),dateRange:he(t),onBack:P,filters:p,onFilterChange:w}),De(Id,{\"data-testid\":\"categories-fullview-top-section\",children:[De(Vd,{\"data-testid\":\"categories-fullview-chart\",children:[j(Hg,{width:\"100%\",height:\"100%\",children:De(Ag,{children:[j(zg,{data:M,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,label:v,labelLine:!1,children:M.map(k=>j(Bg,{fill:k.color},`cell-${k.id}`))}),j(Wg,{formatter:k=>H(k,S)})]})}),De(Ed,{\"data-testid\":\"categories-fullview-donut-center\",children:[j(Ad,{children:a(r.stats.revenue)}),j(zd,{children:H($,S)}),De(Bd,{direction:V,children:[D(V),j(\"span\",{children:_})]})]})]}),j(Hd,{\"data-testid\":\"categories-fullview-summary\",children:O.map(k=>De(Wd,{children:[j(fa,{dotColor:k.color}),j(_d,{children:Uo(k.name)}),j(Ud,{children:H(k.revenue,k.currencyCode)}),De(Kd,{children:[\"(\",k.percentage,\"%)\"]}),k.trend?.revenue?j(Jd,{direction:R(k.trend.revenue),children:D(R(k.trend.revenue))}):null]},k.id))})]}),De(Jt,{\"data-testid\":\"categories-fullview-table-section\",children:[De(Yt,{\"data-testid\":\"categories-fullview-table-title\",children:[a(r.fullView.categories.allCategoriesTitle),\" (\",M.length,\")\"]}),T?j(jd,{children:C.map(k=>De(Yd,{children:[j(fa,{dotColor:k.color}),De(Fd,{children:[j(Ld,{children:k.name}),j(Nd,{children:H(k.revenue,k.currencyCode)})]}),De($d,{children:[k.percentage,\"%\"]})]},k.id))}):j(Gd,{children:j(lt,{columns:m,data:C,sortable:!0,getRowKey:k=>k.id})}),c>1&&j(dt,{currentPage:y,totalPages:c,onPageChange:x,itemsPerPage:h,totalItems:M.length})]})]})};import qd from\"react\";function Oo(e){qd.useEffect(()=>{if(e!==void 0)return Cr(e),()=>{Cr(void 0)}},[e])}var Kg=({translate:e,children:t})=>(Oo(e),t??null);function Gg(){return qd.useCallback(e=>ze(e),[])}import{jsx as er}from\"react/jsx-runtime\";var jg=\"shoppingDashboardView\",Yg=[],Jg=[],Zg=[],qg=[],Xg=[],Qg=[];function Qd(e){return typeof e==\"object\"&&e!==null}function ef(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"signups\"||e===\"categories\"}function ma(e,t){if(!Qd(e))return\"dashboard\";let o=e[t];return ef(o)?o:\"dashboard\"}function Xd(e,t,o){return{...Qd(e)?e:{},[t]:o}}function tf(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var of=({stats:e,topProducts:t,conversionData:o,signupData:n,categories:i,categoriesSummaryChangePct:s,conversionSummaryChangePct:l,orders:d,signups:g,isLoading:f=!1,error:u,shopTitle:y,className:x,translate:h,initialDateRange:T=Je,initialMarket:P=\"all\",initialProductSort:b=\"units\",initialSignupView:p=\"all\",initialConversionFilter:w=\"all\",initialCategorySort:v=\"revenue\",markets:D,historyAdapter:R,historyStateKey:M=jg,resetToDashboardOnMount:$=!0,onDateRangeChange:V,onMarketChange:_,onProductSortChange:O,onSignupViewChange:c,onConversionFilterChange:C,onCategorySortChange:S,onViewChange:m,onProductsExport:k,onConversionExport:F,onSignupsExport:Y,onCategoriesExport:le})=>{Oo(h);let[se,fe]=oe.useState(\"dashboard\"),Pe=oe.useRef(!1),[U,et]=oe.useState(T),[Ee,$t]=oe.useState(P),[ho,rr]=oe.useState(b),[ar,nr]=oe.useState(p),[ir,lr]=oe.useState(w),[sr,dr]=oe.useState(v),No=t??Yg,$o=o??Jg,pr=n??Zg,cr=i??qg,ka=d??Xg,tt=g??Qg,Ke=oe.useCallback(A=>{fe(A),m?.(A)},[m]),kt=oe.useCallback(()=>R?ma(R.location?.state,M):typeof window>\"u\"?\"dashboard\":ma(window.history.state,M),[R,M]),Ae=oe.useCallback((A,Dt)=>{if(R){let fr=Xd(R.location?.state,M,A),vn=tf(R.location,fr);if(Dt===\"replace\"){R.replace(vn);return}R.push(vn);return}if(typeof window>\"u\")return;let to=Xd(window.history.state,M,A);if(Dt===\"replace\"){window.history.replaceState(to,\"\");return}window.history.pushState(to,\"\")},[R,M]);oe.useEffect(()=>{if($?(Ae(\"dashboard\",\"replace\"),Pe.current=!1,Ke(\"dashboard\")):Ke(kt()),R)return R.listen((Dt,to)=>{if(to===\"POP\"){let fr=ma(Dt.state,M);Pe.current=fr!==\"dashboard\",Ke(fr)}});let A=Dt=>{let to=ma(Dt.state,M);Pe.current=to!==\"dashboard\",Ke(to)};return window.addEventListener(\"popstate\",A),()=>{window.removeEventListener(\"popstate\",A)}},[R,M,kt,$,Ke,Ae]);let Ge=oe.useCallback(A=>{Pe.current=!0,Ae(A,\"push\"),Ke(A)},[Ke,Ae]),Tt=oe.useCallback(()=>{if(se!==\"dashboard\"&&Pe.current){if(R){R.goBack();return}typeof window<\"u\"&&window.history.back();return}Pe.current=!1,Ae(\"dashboard\",\"replace\"),Ke(\"dashboard\")},[se,R,Ke,Ae]),ct=oe.useCallback(A=>{et(A),V?.(A)},[V]),It=oe.useCallback(A=>{$t(A),_?.(A)},[_]),Io=oe.useCallback(A=>{rr(A),O?.(A)},[O]),Vo=oe.useCallback(A=>{nr(A),c?.(A)},[c]),ur=oe.useCallback(A=>{lr(A),C?.(A)},[C]),gr=oe.useCallback(A=>{dr(A),S?.(A)},[S]),Ta=oe.useCallback(()=>{Ge(\"products\")},[Ge]),G=oe.useCallback(()=>{Ge(\"conversion-rate\")},[Ge]),Vt=oe.useCallback(()=>{Ge(\"signups\")},[Ge]),St=oe.useCallback(()=>{Ge(\"categories\")},[Ge]);return se===\"products\"?er(Zo,{products:No,dateRange:U,market:Ee,productSort:ho,markets:D,isLoading:f,onBack:Tt,onDateRangeChange:ct,onMarketChange:It,onProductSortChange:Io}):se===\"conversion-rate\"?er(Xo,{conversionData:$o,orders:ka,dateRange:U,market:Ee,conversionFilter:ir,markets:D,isLoading:f,onBack:Tt,onDateRangeChange:ct,onMarketChange:It,onConversionFilterChange:ur}):se===\"signups\"?er(nn,{signupData:pr,signups:tt,dateRange:U,market:Ee,signupView:ar,markets:D,isLoading:f,onBack:Tt,onDateRangeChange:ct,onMarketChange:It,onSignupViewChange:Vo}):se===\"categories\"?er(sn,{categories:cr,dateRange:U,market:Ee,categorySort:sr,summaryChangePct:s,markets:D,isLoading:f,onBack:Tt,onDateRangeChange:ct,onMarketChange:It,onCategorySortChange:gr}):er(Qa,{stats:e,topProducts:No,conversionData:$o,signupData:pr,categories:cr,categoriesSummaryChangePct:s,conversionSummaryChangePct:l,isLoading:f,error:u,shopTitle:y,className:x,dateRange:U,market:Ee,productSort:ho,signupView:ar,conversionFilter:ir,categorySort:sr,markets:D,onDateRangeChange:ct,onMarketChange:It,onProductSortChange:Io,onSignupViewChange:Vo,onConversionFilterChange:ur,onCategorySortChange:gr,onProductsTitleClick:Ta,onConversionTitleClick:G,onSignupsTitleClick:Vt,onCategoriesToTitleClick:St,onProductsExport:k,onConversionExport:F,onSignupsExport:Y,onCategoriesExport:le})};import{styled as tr}from\"@nuskin/foundation-theme\";var dn=tr(\"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`,ep=tr(\"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`,tp=tr(\"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`,op=tr(\"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`,rp=tr(\"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 rf,Pie as af,Cell as nf,ResponsiveContainer as lf,Tooltip as sf}from\"recharts\";var N={title:{key:\"productOfferDashboard.title\",fallback:\"Performance Overview\"},error:{key:\"productOfferDashboard.error\",fallback:\"Failed to load dashboard data. Please try again.\"},stats:{revenue:{key:\"productOfferDashboard.stats.revenue\",fallback:\"Total Revenue\"},offersPurchased:{key:\"productOfferDashboard.stats.offersPurchased\",fallback:\"Offers Purchased\"},conversionRate:{key:\"productOfferDashboard.stats.conversionRate\",fallback:\"Conversion Rate\"},trendUp:{key:\"productOfferDashboard.stats.trendUp\",fallback:\"Trending up\"},trendDown:{key:\"productOfferDashboard.stats.trendDown\",fallback:\"Trending down\"},trendNeutral:{key:\"productOfferDashboard.stats.trendNeutral\",fallback:\"No change\"},comparedTo:{key:\"productOfferDashboard.stats.comparedTo\",fallback:\"compared to this time last month\"}},filter:{dateRange:{label:{key:\"productOfferDashboard.filter.dateRange.label\",fallback:\"Date Range\"},last7days:{key:\"productOfferDashboard.filter.dateRange.last7days\",fallback:\"Last 7 Days\"},last30days:{key:\"productOfferDashboard.filter.dateRange.last30days\",fallback:\"Last 30 Days\"},last90days:{key:\"productOfferDashboard.filter.dateRange.last90days\",fallback:\"Last 90 Days\"},thisMonth:{key:\"productOfferDashboard.filter.dateRange.thisMonth\",fallback:\"This Month\"}},market:{label:{key:\"productOfferDashboard.filter.market.label\",fallback:\"Market\"},all:{key:\"productOfferDashboard.filter.market.all\",fallback:\"All Markets\"}},offerSort:{byRevenue:{key:\"productOfferDashboard.filter.offerSort.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.filter.offerSort.byUnits\",fallback:\"Units\"}},productSort:{byUnits:{key:\"productOfferDashboard.filter.productSort.byUnits\",fallback:\"Units\"},byRevenue:{key:\"productOfferDashboard.filter.productSort.byRevenue\",fallback:\"Revenue\"},byVolume:{key:\"productOfferDashboard.filter.productSort.byVolume\",fallback:\"Volume\"}},conversionFilter:{overall:{key:\"productOfferDashboard.filter.conversionFilter.overall\",fallback:\"Overall\"}}},widget:{topProducts:{title:{key:\"productOfferDashboard.widget.topProducts.title\",fallback:\"Top Selling Products\"},emptyState:{key:\"productOfferDashboard.widget.topProducts.emptyState\",fallback:\"No products data available\"}},conversionRate:{title:{key:\"productOfferDashboard.widget.conversionRate.title\",fallback:\"Conversion Rate\"},subtitle:{key:\"productOfferDashboard.widget.conversionRate.subtitle\",fallback:\"Orders \\xF7 Site visits\"}},topPerformingOffers:{title:{key:\"productOfferDashboard.widget.topPerformingOffers.title\",fallback:\"Top Performing Offers\"},totalRevenue:{key:\"productOfferDashboard.widget.topPerformingOffers.totalRevenue\",fallback:\"Total revenue\"},emptyState:{key:\"productOfferDashboard.widget.topPerformingOffers.emptyState\",fallback:\"No offers data available\"}},menu:{fullView:{key:\"productOfferDashboard.widget.menu.fullView\",fallback:\"Full View\"}}},navigation:{back:{key:\"productOfferDashboard.navigation.back\",fallback:\"Back to Dashboard\"}},ariaLabel:{dashboard:{key:\"productOfferDashboard.ariaLabel.dashboard\",fallback:\"Product Offer Performance Dashboard\"},statsCard:{key:\"productOfferDashboard.ariaLabel.statsCard\",fallback:\"Performance metric\"},conversionChart:{key:\"productOfferDashboard.ariaLabel.conversionChart\",fallback:\"Conversion rate chart\"},topProducts:{key:\"productOfferDashboard.ariaLabel.topProducts\",fallback:\"Top selling products\"},topOffers:{key:\"productOfferDashboard.ariaLabel.topOffers\",fallback:\"Top performing offers chart\"},widgetMenu:{key:\"productOfferDashboard.ariaLabel.widgetMenu\",fallback:\"Widget options menu\"},filterDateRange:{key:\"productOfferDashboard.ariaLabel.filterDateRange\",fallback:\"Filter by date range\"},filterMarket:{key:\"productOfferDashboard.ariaLabel.filterMarket\",fallback:\"Filter by market\"},backButton:{key:\"productOfferDashboard.ariaLabel.backButton\",fallback:\"Back to dashboard overview\"}},fullView:{topOffers:{title:{key:\"productOfferDashboard.fullView.topOffers.title\",fallback:\"Top Performing Offers\"},columnName:{key:\"productOfferDashboard.fullView.topOffers.columnName\",fallback:\"Offer Name\"},columnRevenue:{key:\"productOfferDashboard.fullView.topOffers.columnRevenue\",fallback:\"Revenue\"},columnPercentage:{key:\"productOfferDashboard.fullView.topOffers.columnPercentage\",fallback:\"Share\"},columnTrend:{key:\"productOfferDashboard.fullView.topOffers.columnTrend\",fallback:\"Trend\"}}},defaults:{trendZero:{key:\"productOfferDashboard.defaults.trendZero\",fallback:\"+0%\"},noData:{key:\"productOfferDashboard.defaults.noData\",fallback:\"--\"},byRevenue:{key:\"productOfferDashboard.defaults.byRevenue\",fallback:\"Revenue\"},byUnits:{key:\"productOfferDashboard.defaults.byUnits\",fallback:\"Units\"},byVolume:{key:\"productOfferDashboard.defaults.byVolume\",fallback:\"Volume\"}}};function E(e){return ze(e)}import{jsx as ne,jsxs as Qe}from\"react/jsx-runtime\";var df=({offers:e,offerSort:t,isLoading:o=!1,title:n,onSortChange:i,onTitleClick:s,onExport:l})=>{let d=pn.useCallback(h=>{let T=h.target.value;i?.(T)},[i]),{sortedOffers:g,totalRevenue:f,trendDirection:u,formattedTrend:y}=pn.useMemo(()=>{let h=[...e].sort((p,w)=>t===\"revenue\"?w.revenue-p.revenue:w.percentage-p.percentage),T=h.reduce((p,w)=>p+w.revenue,0),{direction:P,formatted:b}=_t(h,p=>p.revenue,p=>p.trend?.revenue);return{sortedOffers:h,totalRevenue:T,trendDirection:P,formattedTrend:b}},[e,t]),x=g[0]?.currencyCode;return o&&e.length===0?ne(Gt,{\"data-testid\":\"widget-top-offers\",children:ne(Pr,{})}):e.length===0?Qe(Gt,{\"data-testid\":\"widget-top-offers\",children:[ne(So,{children:ne(Do,{children:n??E(N.widget.topPerformingOffers.title)})}),ne(Yr,{\"data-testid\":\"top-offers-empty-state\",children:ne(Jr,{children:E(N.widget.topPerformingOffers.emptyState)})})]}):Qe(Gt,{as:\"section\",\"data-testid\":\"widget-top-offers\",\"aria-label\":E(N.ariaLabel.topOffers),children:[Qe(So,{children:[ne(Do,{as:\"button\",onClick:s,\"aria-label\":E(N.ariaLabel.topOffers),\"data-testid\":\"widget-title-top-offers\",children:n??E(N.widget.topPerformingOffers.title)}),Qe(Ir,{children:[Qe(us,{id:\"offer-sort\",\"data-testid\":\"offer-sort-dropdown\",value:t,onChange:d,disabled:o,\"aria-label\":E(N.ariaLabel.topOffers),children:[ne(\"option\",{value:\"revenue\",children:E(N.defaults.byRevenue)}),ne(\"option\",{value:\"units\",children:E(N.defaults.byUnits)})]}),ne(nt,{widgetId:\"top-offers\",onFullView:s,onExport:l})]})]}),Qe(Vr,{children:[Qe(Er,{\"data-testid\":\"top-offers-chart\",children:[ne(lf,{width:\"100%\",height:\"100%\",children:Qe(rf,{children:[ne(af,{data:g,cx:\"50%\",cy:\"50%\",innerRadius:\"55%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:g.map(h=>ne(nf,{fill:h.color},`cell-${h.id}`))}),ne(sf,{formatter:h=>H(h,x)})]})}),Qe(Ar,{\"data-testid\":\"top-offers-donut-center\",children:[ne(zr,{children:E(N.widget.topPerformingOffers.totalRevenue)}),ne(Br,{children:H(f,x)}),ne(Hr,{direction:u,children:y})]})]}),ne(Wr,{\"data-testid\":\"top-offers-legend-container\",children:g.map((h,T)=>{let P=gt(h.trend?.revenue);return Qe(_r,{\"data-testid\":`offer-legend-${T}`,children:[ne(Ur,{color:h.color}),Qe(Kr,{children:[ne(Gr,{children:Uo(h.name)}),ne(jr,{children:H(h.revenue,h.currencyCode)})]}),Qe(gs,{children:[h.percentage,\"%\"]}),h.trend?.revenue?ne(hs,{direction:P,\"data-testid\":`offer-legend-trend-${T}`,\"aria-label\":h.trend.revenue,children:Be(P)}):null]},h.id)})})]})]})},ha=pn.memo(df);ha.displayName=\"TopPerformingOffersPieChart\";import ip from\"react\";var pf=/[\\\\/?*[\\]:]/g;function ap(e){let t=e.trim(),o=t.length>0?t:\"export\";return o.toLowerCase().endsWith(\".xlsx\")?o:`${o}.xlsx`}function np(e){let t=e.replace(pf,\" \").trim();return(t.length>0?t:\"Export\").slice(0,31)}async function xa({rows:e,columns:t,fileName:o,sheetName:n}){let{Workbook:i}=await import(\"exceljs\"),s=new i,l=s.addWorksheet(np(n));l.columns=t.map(g=>({header:g.header,key:g.header})),e.forEach(g=>{let f={};t.forEach(u=>{f[u.header]=u.value(g)??\"\"}),l.addRow(f)});let d=await s.xlsx.writeBuffer();cf(d,ap(o))}function cf(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 uf=[{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}],gf=[{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}];function cn(e){return xa({rows:e,columns:uf,fileName:\"top-selling-products\",sheetName:\"Top Selling Products\"})}function un(e){return xa({rows:e,columns:gf,fileName:\"top-performing-offers\",sheetName:\"Top Performing Offers\"})}function gn({topProducts:e,topOffers:t,topProductsExportData:o,topOffersExportData:n,showTopProductsExportOption:i=!0,showTopOffersExportOption:s=!0,isLoading:l=!1}){let d=o??e,g=n??t,f=i&&!l&&d.length>0,u=s&&!l&&g.length>0,y=ip.useCallback(()=>cn(d),[d]),x=ip.useCallback(()=>un(g),[g]);return{onTopProductsExport:f?y:void 0,onTopOffersExport:u?x:void 0}}import{jsx as go,jsxs as Fo}from\"react/jsx-runtime\";var ff=[],mf=[],hf=[],fn=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:l,className:d,dateRange:g=Je,market:f=\"all\",productSort:u=\"units\",conversionFilter:y=\"all\",offerSort:x=\"revenue\",conversionSummaryRate:h,conversionSummaryChangePct:T,topProductsExportData:P,topOffersExportData:b,showTopProductsExportOption:p=!0,showTopOffersExportOption:w=!0,markets:v,onDateRangeChange:D,onMarketChange:R,onProductSortChange:M,onConversionFilterChange:$,onOfferSortChange:V,onProductsTitleClick:_,onConversionTitleClick:O,onOffersTitleClick:c})=>{let C=t??ff,S=o??mf,m=n??hf,{onTopProductsExport:k,onTopOffersExport:F}=gn({topProducts:C,topOffers:m,topProductsExportData:P,topOffersExportData:b,showTopProductsExportOption:p,showTopOffersExportOption:w,isLoading:i}),Y=le=>le?le.startsWith(\"+\")&&le!==\"+0%\"?\"up\":le.startsWith(\"-\")?\"down\":\"neutral\":\"neutral\";return s?go(dn,{as:\"main\",className:d,\"aria-label\":E(N.ariaLabel.dashboard),children:Fo(rp,{\"data-testid\":\"dashboard-error\",role:\"alert\",\"aria-live\":\"assertive\",children:[Fo(\"strong\",{children:[E(N.error),\":\"]}),\" \",s]})}):Fo(dn,{as:\"main\",className:d,\"data-testid\":\"product-offer-dashboard\",\"aria-label\":E(N.ariaLabel.dashboard),\"aria-busy\":i,children:[go(Ho,{shopTitle:l??E(N.title),dateRange:g,market:f,isLoading:i,markets:v,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:R}),Fo(ep,{\"data-testid\":\"top-charts-row\",children:[go(vo,{conversionData:S,conversionFilter:y,dateRange:g,isLoading:i,summaryRate:h,summaryChangePct:T,onFilterChange:$,onTitleClick:O}),Fo(tp,{\"data-testid\":\"stats-card-stack\",children:[go(Mt,{layout:\"split\",title:E(N.stats.revenue),value:e?.metrics?.revenue??\"$0\",trendDirection:Y(e?.trend?.revenue),trendValue:e?.trend?.revenue,caption:E(N.stats.comparedTo),testId:\"stats-card-revenue\",isLoading:i}),go(Mt,{layout:\"split\",title:E(N.stats.offersPurchased),value:e?.metrics?.offersPurchased??\"0\",trendDirection:Y(e?.trend?.offersPurchased),trendValue:e?.trend?.offersPurchased,caption:E(N.stats.comparedTo),testId:\"stats-card-offers-purchased\",isLoading:i})]})]}),Fo(op,{\"data-testid\":\"bottom-charts-row\",children:[go(Co,{products:C,productSort:u,isLoading:i,maxProducts:5,onSortChange:M,onTitleClick:_,onExport:k}),go(ha,{offers:m,offerSort:x,isLoading:i,onSortChange:V,onTitleClick:c,onExport:F})]})]})};import ce from\"react\";import fo,{useState as bf}from\"react\";import{PieChart as yf,Pie as wf,Cell as Cf,ResponsiveContainer as vf,Tooltip as kf}from\"recharts\";import{styled as q}from\"@mui/material/styles\";import{Box as Fe,Typography as vt}from\"@mui/material\";import{ColorUtils as xf}from\"@nuskin/foundation-theme\";var{getGenomeColor:mn}=xf,lp=q(Fe)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({theme:e})=>mn(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`,sp=q(Fe)`\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`,dp=q(Fe)`\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`,pp=q(vt)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,cp=q(vt)`\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`,up=q(vt)`\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`,gp=q(Fe)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`,fp=q(Fe)`\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})=>mn(e,\"N30\")};\n }\n`,ba=q(Fe)`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({dotColor:e})=>e};\n flex-shrink: 0;\n`,mp=q(Fe)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`,hp=q(vt)`\n font-size: 0.875rem;\n font-weight: 500;\n`,xp=q(vt)`\n font-size: 0.75rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n`,bp=q(vt)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`,yp=q(Fe)`\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`,wp=q(Fe)`\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`,Cp=q(Fe)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`,vp=q(Fe)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`,kp=q(Fe)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({theme:e})=>mn(e,\"N20\")};\n border: 1px solid ${({theme:e})=>e.palette.divider};\n border-radius: 8px;\n`,Tp=q(Fe)`\n display: flex;\n align-items: center;\n gap: 8px;\n`,Sp=q(vt)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({theme:e})=>e.palette.text.primary};\n word-break: break-word;\n`,Dp=q(Fe)`\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`,ya=q(Fe)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`,wa=q(vt)`\n font-size: 0.625rem;\n color: ${({theme:e})=>e.palette.text.secondary};\n text-transform: uppercase;\n`,hn=q(vt)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({theme:e})=>e.palette.text.primary};\n`,Pp=q(vt)`\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 Tf,jsx as B,jsxs as ie}from\"react/jsx-runtime\";var xn=({offers:e,dateRange:t,market:o,offerSort:n,markets:i,isLoading:s=!1,onBack:l,onDateRangeChange:d,onMarketChange:g,onOfferSortChange:f})=>{let[u,y]=bf(1),x=10,h=yt(),T=fo.useCallback(()=>l?.(),[l]),P=Ye(i),b=fo.useMemo(()=>[ht(t,N),xt(o,P,N),{key:\"sort\",label:E(N.defaults.byRevenue),value:n,options:[{value:\"revenue\",label:E(N.defaults.byRevenue)},{value:\"units\",label:E(N.defaults.byUnits)}]}],[t,o,P,n]),p=fo.useCallback((c,C)=>{c===\"dateRange\"?d?.(C):c===\"market\"?g?.(C):c===\"sort\"&&(f?.(C),y(1))},[f,d,g]),w=fo.useMemo(()=>[...e].sort((c,C)=>n===\"revenue\"?C.revenue-c.revenue:C.percentage-c.percentage),[e,n]),{totalRevenue:v,totalRevenueTrendDirection:D,totalRevenueTrend:R}=fo.useMemo(()=>{let c=w.reduce((m,k)=>m+k.revenue,0),{direction:C,formatted:S}=_t(w,m=>m.revenue,m=>m.trend?.revenue);return{totalRevenue:c,totalRevenueTrendDirection:C,totalRevenueTrend:S}},[w]),M=fo.useMemo(()=>w.slice(0,5),[w]),{totalPages:$,pageItems:V}=ft(w,u,x),_=fo.useMemo(()=>[{key:\"name\",label:E(N.fullView.topOffers.columnName),sortable:!0,render:(c,C)=>ie(ga,{children:[B(ba,{dotColor:C.color}),B(\"span\",{children:C.name})]})},{key:\"revenue\",label:E(N.fullView.topOffers.columnRevenue),sortable:!0,render:(c,C)=>H(Number(c),C.currencyCode)},{key:\"percentage\",label:E(N.fullView.topOffers.columnPercentage),sortable:!0,render:c=>`${Number(c)}%`},{key:\"trend\",label:E(N.fullView.topOffers.columnTrend),render:(c,C)=>{if(!C.trend?.revenue)return E(N.defaults.noData);let S=gt(C.trend.revenue);return ie(wp,{direction:S,children:[Be(S),B(\"span\",{children:C.trend.revenue})]})}}],[]),O=w[0]?.currencyCode;return s?ie(ye,{\"data-testid\":\"top-offers-full-view\",children:[B(ge,{title:E(N.fullView.topOffers.title),dateRange:he(t),onBack:T,filters:b,onFilterChange:p}),B(Ht,{})]}):e.length===0?ie(ye,{\"data-testid\":\"top-offers-full-view\",children:[B(ge,{title:E(N.fullView.topOffers.title),dateRange:he(t),onBack:T,filters:b,onFilterChange:p}),B(Zt,{\"data-testid\":\"top-offers-fullview-empty\",children:E(N.widget.topPerformingOffers.emptyState)})]}):ie(ye,{\"data-testid\":\"top-offers-full-view\",children:[B(ge,{title:E(N.fullView.topOffers.title),dateRange:he(t),onBack:T,filters:b,onFilterChange:p}),ie(lp,{\"data-testid\":\"top-offers-fullview-top-section\",children:[ie(sp,{\"data-testid\":\"top-offers-fullview-chart\",children:[B(vf,{width:\"100%\",height:\"100%\",children:ie(yf,{children:[B(wf,{data:w,cx:\"50%\",cy:\"50%\",innerRadius:\"50%\",outerRadius:\"85%\",dataKey:\"revenue\",nameKey:\"name\",paddingAngle:2,children:w.map(c=>B(Cf,{fill:c.color},`cell-${c.id}`))}),B(kf,{formatter:c=>H(c,O)})]})}),ie(dp,{\"data-testid\":\"top-offers-fullview-donut-center\",children:[B(pp,{children:E(N.widget.topPerformingOffers.totalRevenue)}),B(cp,{children:H(v,O)}),B(up,{direction:D,children:R})]})]}),B(gp,{\"data-testid\":\"top-offers-fullview-summary\",children:M.map(c=>{let C=gt(c.trend?.revenue);return ie(fp,{children:[B(ba,{dotColor:c.color}),ie(mp,{children:[B(hp,{children:c.name}),B(xp,{children:H(c.revenue,c.currencyCode)})]}),ie(bp,{children:[c.percentage,\"%\"]}),c.trend?.revenue?B(yp,{direction:C,\"aria-label\":c.trend.revenue,children:Be(C)}):null]},c.id)})})]}),ie(Jt,{\"data-testid\":\"top-offers-table\",children:[ie(Yt,{\"data-testid\":\"top-offers-fullview-table-title\",children:[E(N.fullView.topOffers.title),\" (\",w.length,\")\"]}),h?B(vp,{children:V.map(c=>{let C=Mr(c.trend?.revenue),S=\"neutral\";return C!==null&&C>0?S=\"up\":C!==null&&C<0&&(S=\"down\"),ie(kp,{children:[ie(Tp,{children:[B(ba,{dotColor:c.color}),B(Sp,{children:c.name})]}),ie(Dp,{children:[ie(ya,{children:[B(wa,{children:E(N.fullView.topOffers.columnRevenue)}),B(hn,{children:H(c.revenue,c.currencyCode)})]}),ie(ya,{children:[B(wa,{children:E(N.fullView.topOffers.columnPercentage)}),ie(hn,{children:[c.percentage,\"%\"]})]}),ie(ya,{children:[B(wa,{children:E(N.fullView.topOffers.columnTrend)}),B(Pp,{direction:S,children:c.trend?.revenue?ie(Tf,{children:[Be(S),B(\"span\",{children:c.trend.revenue})]}):E(N.defaults.noData)})]})]})]},c.id)})}):B(Cp,{children:B(lt,{columns:_,data:V,sortable:!0,getRowKey:c=>c.id})}),$>1&&B(dt,{currentPage:u,totalPages:$,onPageChange:y,itemsPerPage:x,totalItems:w.length,\"data-testid\":\"top-offers-pagination\"})]})]})};import{jsx as va}from\"react/jsx-runtime\";var Sf=\"productOfferDashboardView\",Df=[],Pf=[],Rf=[],Mf=[];function Mp(e){return typeof e==\"object\"&&e!==null}function Of(e){return e===\"dashboard\"||e===\"products\"||e===\"conversion-rate\"||e===\"top-offers\"}function Ca(e,t){if(!Mp(e))return\"dashboard\";let o=e[t];return Of(o)?o:\"dashboard\"}function Rp(e,t,o){return{...Mp(e)?e:{},[t]:o}}function Ff(e,t){return{pathname:e?.pathname,search:e?.search,hash:e?.hash,state:t}}var Lf=({stats:e,topProducts:t,conversionData:o,topOffers:n,isLoading:i=!1,error:s,dashboardTitle:l,className:d,allProducts:g,orders:f,allOffers:u,conversionSummaryRate:y,conversionSummaryChangePct:x,conversionFullViewData:h,conversionFullViewRate:T,conversionFullViewChangePct:P,topProductsExportData:b,topOffersExportData:p,showTopProductsExportOption:w=!0,showTopOffersExportOption:v=!0,initialDateRange:D=Je,initialMarket:R=\"all\",initialProductSort:M=\"units\",initialConversionFilter:$=\"all\",initialOfferSort:V=\"revenue\",markets:_,translate:O,historyAdapter:c,historyStateKey:C=Sf,resetToDashboardOnMount:S=!0,onDateRangeChange:m,onMarketChange:k,onProductSortChange:F,onConversionFilterChange:Y,onOfferSortChange:le,onViewChange:se})=>{Oo(O);let[fe,Pe]=ce.useState(\"dashboard\"),U=ce.useRef(!1),[et,Ee]=ce.useState(D),[$t,ho]=ce.useState(R),[rr,ar]=ce.useState(M),[nr,ir]=ce.useState($),[lr,sr]=ce.useState(V),dr=t??Df,No=o??Pf,$o=n??Rf,pr=g??dr,cr=f??Mf,ka=u??$o,tt=ce.useCallback(G=>{Pe(G),se?.(G)},[se]),Ke=ce.useCallback(()=>c?Ca(c.location?.state,C):typeof window>\"u\"?\"dashboard\":Ca(window.history.state,C),[c,C]),kt=ce.useCallback((G,Vt)=>{if(c){let A=Rp(c.location?.state,C,G),Dt=Ff(c.location,A);if(Vt===\"replace\"){c.replace(Dt);return}c.push(Dt);return}if(typeof window>\"u\")return;let St=Rp(window.history.state,C,G);if(Vt===\"replace\"){window.history.replaceState(St,\"\");return}window.history.pushState(St,\"\")},[c,C]);ce.useEffect(()=>{if(S?(kt(\"dashboard\",\"replace\"),U.current=!1,tt(\"dashboard\")):tt(Ke()),c)return c.listen((Vt,St)=>{if(St===\"POP\"){let A=Ca(Vt.state,C);U.current=A!==\"dashboard\",tt(A)}});let G=Vt=>{let St=Ca(Vt.state,C);U.current=St!==\"dashboard\",tt(St)};return window.addEventListener(\"popstate\",G),()=>{window.removeEventListener(\"popstate\",G)}},[c,C,Ke,S,tt,kt]);let Ae=ce.useCallback(G=>{U.current=!0,kt(G,\"push\"),tt(G)},[tt,kt]),Ge=ce.useCallback(()=>{if(fe!==\"dashboard\"&&U.current){if(c){c.goBack();return}typeof window<\"u\"&&window.history.back();return}U.current=!1,kt(\"dashboard\",\"replace\"),tt(\"dashboard\")},[fe,c,tt,kt]),Tt=ce.useCallback(G=>{Ee(G),m?.(G)},[m]),ct=ce.useCallback(G=>{ho(G),k?.(G)},[k]),It=ce.useCallback(G=>{ar(G),F?.(G)},[F]),Io=ce.useCallback(G=>{ir(G),Y?.(G)},[Y]),Vo=ce.useCallback(G=>{sr(G),le?.(G)},[le]),ur=ce.useCallback(()=>{Ae(\"products\")},[Ae]),gr=ce.useCallback(()=>{Ae(\"conversion-rate\")},[Ae]),Ta=ce.useCallback(()=>{Ae(\"top-offers\")},[Ae]);return fe===\"products\"?va(Zo,{products:pr,dateRange:et,market:$t,productSort:rr,markets:_,isLoading:i,onBack:Ge,onDateRangeChange:Tt,onMarketChange:ct,onProductSortChange:It}):fe===\"conversion-rate\"?va(Xo,{conversionData:h??No,orders:cr,summaryRate:T??y,summaryChangePct:P??x,dateRange:et,market:$t,conversionFilter:nr,markets:_,isLoading:i,onBack:Ge,onDateRangeChange:Tt,onMarketChange:ct,onConversionFilterChange:Io}):fe===\"top-offers\"?va(xn,{offers:ka,dateRange:et,market:$t,offerSort:lr,markets:_,isLoading:i,onBack:Ge,onDateRangeChange:Tt,onMarketChange:ct,onOfferSortChange:Vo}):va(fn,{stats:e,topProducts:dr,conversionData:No,topOffers:$o,isLoading:i,error:s,dashboardTitle:l,className:d,dateRange:et,market:$t,productSort:rr,conversionFilter:nr,offerSort:lr,conversionSummaryRate:y,conversionSummaryChangePct:x,topProductsExportData:b,topOffersExportData:p,showTopProductsExportOption:w,showTopOffersExportOption:v,markets:_,onDateRangeChange:Tt,onMarketChange:ct,onProductSortChange:It,onConversionFilterChange:Io,onOfferSortChange:Vo,onProductsTitleClick:ur,onConversionTitleClick:gr,onOffersTitleClick:Ta})};import{ColorUtils as Nf,styled as bn}from\"@nuskin/foundation-theme\";var{getGenomeColor:mo}=Nf,Op=bn(\"div\")`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`,Fp=bn(\"select\")`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({theme:e})=>mo(e,\"N20\")};\n border: 1px solid ${({theme:e})=>mo(e,\"N40\")};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({theme:e})=>mo(e,\"N100\")};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({theme:e})=>mo(e,\"N30\")};\n }\n\n &:focus {\n border-color: ${({theme:e})=>mo(e,\"A70\")};\n box-shadow: 0 0 0 3px ${({theme:e})=>mo(e,\"A20\")};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`,Lp=bn(\"label\")`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({theme:e})=>mo(e,\"N70\")};\n`;import{jsx as yn,jsxs as If}from\"react/jsx-runtime\";var $f=({filters:e,onChange:t})=>yn(Op,{\"data-testid\":\"filter-bar\",children:e.map(o=>If(Lp,{htmlFor:`filter-${o.key}`,children:[o.label,yn(Fp,{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=>yn(\"option\",{value:n.value,children:n.label},n.value))})]},o.key))});var Np={shopTitle:\"My NuSkin Shop\",dateRange:{start:\"2026-03-01\",end:\"2026-03-31\",label:\"Mar 1 - Mar 31\"},selectedMarket:\"all\",metrics:{revenue:\"$9,453\",volume:\"1,211\",siteVisits:\"17,935\",conversionRate:\"4.2%\"},trend:{revenue:\"+12.5%\",volume:\"+8.3%\",siteVisits:\"-2.1%\"}},wn=[{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%\"}}],or=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}}),Vf=or.map(e=>({...e,rate:Number((e.rate*1.35).toFixed(2)),orders:Math.round(e.orders*.7)})),Ef=or.map(e=>({...e,rate:Number((e.rate*.55).toFixed(2)),orders:Math.round(e.orders*.3)})),$p=Array.from({length:30},(e,t)=>{let o=new Date(\"2026-03-01\");o.setDate(o.getDate()+t);let n=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],i=80+t*11%40,s=Math.floor(i*.4),l=Math.floor(i*.35),d=i-s-l;return{date:`${n[o.getMonth()]} ${o.getDate()}`,total:i,members:s,retail:l,brandAffiliates:d}}),Ip=[{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%\"}}],Cn=Array.from({length:50},(e,t)=>{let o=[\"Sarah\",\"John\",\"Emma\",\"Michael\",\"Olivia\",\"William\",\"Ava\",\"James\"],n=[\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Garcia\",\"Miller\",\"Davis\"],i=new Date(\"2026-03-31\");return i.setDate(i.getDate()-t%30),{orderId:`ORD-${String(1e4+t).padStart(5,\"0\")}`,date:i.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),customerName:`${o[t%o.length]} ${n[t%n.length]}`,customerType:t%3===0?\"Subscription\":\"Standard\",items:t%5+1,total:Number((50+t*17%200+t%10*.1).toFixed(2)),bv:30+t*9%150}}),Vp=Array.from({length:30},(e,t)=>{let o=[\"Alice\",\"Bob\",\"Carol\",\"David\",\"Eva\",\"Frank\",\"Grace\",\"Henry\"],n=[\"Anderson\",\"Baker\",\"Clark\",\"Davis\",\"Evans\",\"Fisher\",\"Grant\",\"Hall\"],i=[\"Member\",\"Retail\",\"Brand Affiliate\"],s=new Date(\"2026-03-31\");return s.setDate(s.getDate()-t%30),{id:`SU-${String(1e3+t).padStart(4,\"0\")}`,name:`${o[t%o.length]} ${n[t%n.length]}`,date:s.toLocaleDateString(\"en-US\",{month:\"short\",day:\"numeric\",year:\"numeric\"}),type:i[t%i.length],email:`${o[t%o.length].toLowerCase()}.${n[t%n.length].toLowerCase()}@example.com`,status:t%4===0?\"Pending\":\"Active\"}});var 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%\"}},WC={...Lo,trend:{revenue:\"+5.1%\",offersPurchased:\"+12.5%\"}},_C={...Lo,trend:{revenue:\"-1.8%\",offersPurchased:\"-3.7%\"}},UC={...Lo,trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},KC={...Lo,metrics:{...Lo.metrics,offersPurchased:\"0\"},trend:{revenue:\"+0%\",offersPurchased:\"+0%\"}},Af=[{id:\"offer-1\",name:\"Winter Skincare Bundle\",revenue:2800,percentage:29,color:\"#6B8E7B\",trend:{revenue:\"-4.2%\"}},{id:\"offer-2\",name:\"Supplement Starter Pack\",revenue:2500,percentage:27,color:\"#E8915A\",trend:{revenue:\"+3.1%\"}},{id:\"offer-3\",name:\"Holiday Special Bundle\",revenue:2100,percentage:22,color:\"#C75B5B\",trend:{revenue:\"-1.5%\"}},{id:\"offer-4\",name:\"LumiSpa Cleansing Kit\",revenue:1500,percentage:16,color:\"#5B8EC7\",trend:{revenue:\"+2.8%\"}},{id:\"offer-5\",name:\"Daily Wellness Bundle\",revenue:529,percentage:6,color:\"#9B8EC7\",trend:{revenue:\"+7.2%\"}}];export{sn as CategoriesFullView,vo as ConversionRateChart,Xo as ConversionRateFullView,Ql as DATE_RANGE_LABELS,Xl as DAYS_MAP,Ho as DashboardHeader,lt as DataTable,$f as FilterBar,of as MysiteDashboardWithNavigation,Si as MysiteHero,Ra as NsCategoryNavigation,Pa as NsProductCard,ge as PageHeader,dt as Pagination,Lf as PoDashboardWithNavigation,mr as ProductCarousel,fn as ProductOfferDashboard,N as ProductOfferDashboardTranslationKeys,cc as ProductTabCarousel,Zo as ProductsFullView,Qa as ShoppingDashboard,r as ShoppingDashboardTranslationKeys,$r as SignupsChart,nn as SignupsFullView,Mt as StatsCard,Zr as TopCategoriesPieChart,xn as TopPerformingOffersFullView,ha as TopPerformingOffersPieChart,Co as TopSellingProductsList,Kg as TranslationProvider,nt as WidgetMenu,Ei as buildDefaultMarketOptions,Jc as calculatePercentage,bl as calculateTotalPages,xa as exportRowsToExcel,un as exportTopPerformingOffers,cn as exportTopProducts,ts as formatDateRange,cu as formatDateRangeLabel,Ya as formatDisplayDate,Ja as formatISODate,es as formatShortDate,Ot as getComparedToText,ja as getDateRangeLabel,pu as getDaysFromDateRange,a as getTranslation,Dc as getTranslationResolver,jc as getTrendColor,Be as getTrendIcon,Ip as mockCategories,or as mockConversionData,Cn as mockOrders,Lo as mockProductOfferStats,$p as mockSignupData,Vp as mockSignupDetails,Np as mockStats,Af as mockTopOffers,wn as mockTopProducts,ap as normalizeExcelFileName,np as normalizeExcelSheetName,yl as paginateItems,Ai as resolveMarketOptions,ze as resolveTranslation,Cr as setTranslationResolver,Yc as sortByNumericProperty,gn as useProductOfferWidgetExports,Gg 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\ntype MysiteHeroProps = {\n readonly imageDetails?: {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n };\n readonly shopTitle: string;\n readonly shopDescription: string;\n readonly socialTitleText: string;\n readonly email: string;\n readonly phone: string;\n readonly className?: string;\n readonly bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n readonly socialIcons?: {\n type: string;\n url: string;\n }[];\n readonly expirationDate?: string;\n readonly showBadges?: boolean;\n readonly totalSavings?: string;\n};\n\ntype ImageDetails = {\n imageSrc: string;\n imageAlt: string;\n bgColor: string;\n};\n\ntype BannerProps = {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n};\n\ntype ContentProps = {\n shopTitle: string;\n shopDescription: string;\n socialTitleText: string;\n email: string;\n phone: string;\n showBadges: boolean;\n expirationDate?: string;\n totalSavings?: string;\n};\n\nconst renderImageContent = (imageDetails: ImageDetails | undefined, bannerProps: BannerProps, className: string) => {\n const placeholderClass = className.includes('mobile') ? 'placeholder-image-mobile' : 'placeholder-image';\n return imageDetails?.imageSrc ? (\n <ImgTabIndex tabIndex={0}>\n <NsImage className={className} src={imageDetails.imageSrc} alt={imageDetails.imageAlt} />\n </ImgTabIndex>\n ) : (\n <Box className={placeholderClass}>\n <PlaceholderImage\n width={className.includes('mobile') ? '144px' : '246px'}\n height={className.includes('mobile') ? '144px' : '246px'}\n backgroundColor={bannerProps?.backgroundColor ?? '#5F5F5F'}\n />\n </Box>\n );\n};\n\nconst renderBadges = (\n showBadges: boolean,\n expirationDate: string,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n totalSavings?: string,\n) => {\n if (!showBadges || (!expirationDate && !totalSavings)) return null;\n\n const badgeClass = isMobile ? 'mobile-badge' : 'tablet-badge';\n const containerClass = isMobile ? 'mobile-badges' : 'tablet-badges';\n\n return (\n <BadgeContainer className={containerClass}>\n {totalSavings && (\n <Badge\n className={`${badgeClass} total-savings-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{totalSavings}</BadgeValue>\n </Badge>\n )}\n {expirationDate && (\n <Badge\n className={`${badgeClass} expiration-badge`}\n hasWhiteBackground={hasWhiteBackground}\n tabIndex={0}\n >\n <BadgeValue className=\"badge-value\">{expirationDate}</BadgeValue>\n </Badge>\n )}\n </BadgeContainer>\n );\n};\n\nconst renderMobileContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, socialTitleText, email, showBadges, expirationDate, phone, totalSavings } = props;\n\n return (\n <Box className=\"content-mobile\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title-mobile\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text-mobile\">\n {socialTitleText}\n </Typography>\n {email?.trim() && renderContactLink('email', email, 'email-text-mobile')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text-mobile')}\n <Box className=\"social-icons-mobile\">{renderSocialMediaIcons}</Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst renderDesktopContent = (\n props: ContentProps,\n isScrolled: boolean,\n renderSocialMediaIcons: React.ReactNode,\n isMobile: boolean,\n hasWhiteBackground: boolean,\n) => {\n const { shopTitle, shopDescription, socialTitleText, email, phone, showBadges, expirationDate, totalSavings } =\n props;\n\n return (\n <Box className=\"content\">\n <Typography component=\"h1\" tabIndex={shopTitle?.trim() ? 0 : -1} className=\"body-title\">\n {shopTitle}\n </Typography>\n {!isScrolled && (\n <>\n {shopDescription?.length > 480 ? (\n <Tooltip title={shopDescription} arrow>\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n </Tooltip>\n ) : (\n <Typography tabIndex={shopDescription?.trim() ? 0 : -1} className=\"body-text\">\n {shopDescription}\n </Typography>\n )}\n <Box className=\"social-media\">\n <Typography tabIndex={socialTitleText?.trim() ? 0 : -1} className=\"social-title-text\">\n {socialTitleText}\n </Typography>\n <Box className=\"social-icons\">\n {renderSocialMediaIcons}\n {email?.trim() && renderContactLink('email', email, 'email-text')}\n {phone?.trim() && renderContactLink('phone', phone, 'phone-text')}\n </Box>\n </Box>\n {renderBadges(showBadges, expirationDate ?? '', isMobile, hasWhiteBackground, totalSavings)}\n </>\n )}\n </Box>\n );\n};\n\nconst checkIfImageIsCircular = (url: string): Promise<boolean> => {\n return new Promise((resolve, reject) => {\n const imageContext = new Image();\n imageContext.crossOrigin = 'anonymous';\n imageContext.src = url;\n\n imageContext.onload = () => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return reject(new Error('Canvas not supported'));\n\n canvas.width = imageContext.width;\n canvas.height = imageContext.height;\n\n context.drawImage(imageContext, 0, 0);\n\n const corners = [\n context.getImageData(0, 0, 1, 1).data,\n context.getImageData(imageContext.width - 1, 0, 1, 1).data,\n context.getImageData(0, imageContext.height - 1, 1, 1).data,\n context.getImageData(imageContext.width - 1, imageContext.height - 1, 1, 1).data,\n ];\n\n const isCircular = corners.every((corner) => {\n const imageArray = Array.prototype.slice.call(corner);\n const alpha = imageArray[3];\n return alpha < 10;\n });\n resolve(isCircular);\n };\n imageContext.onerror = () => reject(new Error('Failed to load image'));\n });\n};\n\nconst isWhiteOrNearWhite = (color: string | undefined): boolean => {\n if (!color) return false;\n\n const hex = color.replace('#', '').toLowerCase();\n\n /* regex pattern for hex color format: 3 chars (#fff), 4 chars (#ffff), 6 chars (#ffffff), or 8 chars (#ffffffff)*/\n if (!/^[0-9a-f]{3,4}$|^[0-9a-f]{6}$|^[0-9a-f]{8}$/i.test(hex)) return false;\n\n let fullHex = hex;\n if (hex.length === 3 || hex.length === 4) {\n fullHex = hex\n .split('')\n .map((char) => char + char)\n .join('');\n }\n\n const r = Number.parseInt(fullHex.substring(0, 2), 16);\n const g = Number.parseInt(fullHex.substring(2, 4), 16);\n const b = Number.parseInt(fullHex.substring(4, 6), 16);\n\n const threshold = 220;\n return r >= threshold && g >= threshold && b >= threshold;\n};\n\nconst createContactClickHandler = (contactType: 'email' | 'phone', contactValue: string) => ({\n onClick: () => {\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trackGTMEvent({\n event: 'contact_click',\n contact_type: contactType,\n contact_value: contactValue,\n click_element: `${contactType}_link`,\n });\n globalThis.location.href = `${contactType === 'email' ? 'mailto' : 'tel'}:${contactValue}`;\n }\n },\n});\n\nconst renderContactLink = (contactType: 'email' | 'phone', contactValue: string, className: string) => {\n const protocol = contactType === 'email' ? 'mailto:' : 'tel:';\n const handlers = createContactClickHandler(contactType, contactValue);\n\n return (\n <Typography className={className}>\n <ContactLink href={`${protocol}${contactValue}`} {...handlers}>\n {contactValue}\n </ContactLink>\n </Typography>\n );\n};\nexport default function MysiteHero({\n className,\n shopTitle,\n shopDescription,\n socialTitleText,\n imageDetails,\n email,\n phone,\n bannerProps,\n socialIcons,\n expirationDate,\n showBadges = false,\n totalSavings,\n}: MysiteHeroProps): ReactElement {\n const isMobile = useMediaQuery('(max-width: 560px)');\n const [isScrolled, setIsScrolled] = useState(false);\n const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);\n const [hasWhiteBackground, setHasWhiteBackground] = useState(false);\n const [isImageCircular, setIsImageCircular] = useState(false);\n\n const toggleDescription = () => {\n setIsDescriptionExpanded(!isDescriptionExpanded);\n };\n\n useEffect(() => {\n const checkImage = async () => {\n if (imageDetails?.imageSrc) {\n const isCircular = await checkIfImageIsCircular(imageDetails.imageSrc);\n setIsImageCircular(isCircular);\n } else {\n setIsImageCircular(false);\n }\n };\n\n checkImage();\n }, [imageDetails?.imageSrc]);\n\n useEffect(() => {\n setHasWhiteBackground(isWhiteOrNearWhite(bannerProps?.backgroundColor));\n }, [bannerProps?.backgroundColor]);\n\n useEffect(() => {\n let debounceTimeout: ReturnType<typeof setTimeout>;\n let lastScrollY = window.scrollY;\n let currentScrollState = false;\n let isTransitioning = false;\n let lastUpdateTime = 0;\n\n const updateScrollState = (newState: boolean) => {\n const now = Date.now();\n\n if (currentScrollState !== newState && !isTransitioning) {\n if (now - lastUpdateTime < 100) {\n return;\n }\n\n isTransitioning = true;\n currentScrollState = newState;\n lastUpdateTime = now;\n\n if (newState) {\n setIsDescriptionExpanded(false);\n }\n\n clearTimeout(debounceTimeout);\n setIsScrolled(newState);\n\n debounceTimeout = setTimeout(() => {\n isTransitioning = false;\n\n if (newState && window.scrollY < 15) {\n window.scrollTo({\n top: isMobile ? 20 : 30,\n behavior: 'smooth',\n });\n }\n }, 300);\n }\n };\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n if (isTransitioning) {\n lastScrollY = currentScrollY;\n return;\n }\n\n const scrollDelta = Math.abs(currentScrollY - lastScrollY);\n\n if (scrollDelta < 0.5) {\n return;\n }\n\n const scrollingDown = currentScrollY > lastScrollY;\n\n const scrollDownThreshold = isMobile ? 15 : 25;\n const scrollUpThreshold = isMobile ? 8 : 12;\n\n if (scrollingDown && currentScrollY > scrollDownThreshold && !currentScrollState) {\n updateScrollState(true);\n } else if (!scrollingDown && currentScrollY < scrollUpThreshold && currentScrollState) {\n updateScrollState(false);\n }\n\n lastScrollY = currentScrollY;\n };\n\n const initializeState = () => {\n const initialScrollY = window.scrollY;\n const scrollThreshold = isMobile ? 5 : 10;\n const shouldStartCompact = initialScrollY > scrollThreshold;\n\n currentScrollState = shouldStartCompact;\n setIsScrolled(shouldStartCompact);\n lastScrollY = initialScrollY;\n lastUpdateTime = Date.now();\n };\n\n let rafId: number | null = null;\n let lastRafTime = 0;\n const throttledScrollHandler = () => {\n if (rafId) return;\n\n const now = Date.now();\n if (now - lastRafTime < 16) {\n return;\n }\n\n rafId = requestAnimationFrame(() => {\n handleScroll();\n lastRafTime = Date.now();\n rafId = null;\n });\n };\n\n initializeState();\n window.addEventListener('scroll', throttledScrollHandler, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', throttledScrollHandler);\n if (rafId) cancelAnimationFrame(rafId);\n clearTimeout(debounceTimeout);\n };\n }, [isMobile]);\n\n const renderSocialMediaIcons = useMemo(() => {\n return socialIcons?.map((icon, index) => {\n const handleSocialClick = (e: React.MouseEvent) => {\n e.preventDefault();\n trackGTMEvent({\n event: 'social_click',\n social_platform: icon.type,\n social_url: icon.url,\n click_element: 'social_icon',\n });\n window.open(icon.url, '_blank');\n };\n\n return (\n <StyledSpan key={icon?.type + index} onClick={handleSocialClick}>\n <NsLink href={icon.url} target=\"_blank\">\n <NsImage\n key={icon?.type + index}\n src={`https://www.google.com/s2/favicons?domain=${icon?.url}&sz=24`}\n alt={`${icon.type} icon`}\n width=\"24\"\n height=\"24\"\n />\n </NsLink>\n </StyledSpan>\n );\n });\n }, [socialIcons]);\n\n const containerClass = `${className} ${isScrolled ? 'scrolled' : ''}`;\n const props = {\n shopTitle,\n shopDescription,\n socialTitleText,\n email,\n phone,\n showBadges,\n expirationDate,\n totalSavings,\n };\n\n const getCharacterLimit = () => {\n if (window.innerWidth <= 380) return 50;\n if (window.innerWidth <= 415) return 56;\n if (window.innerWidth <= 460) return 62;\n return 80;\n };\n\n const shouldShowToggle = isMobile && shopDescription && shopDescription.length > getCharacterLimit();\n\n return isMobile ? (\n <MysiteHeroContainerMobile\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n <Box className=\"image-content-mobile\">\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image-mobile')}\n {renderMobileContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </Box>\n {!isScrolled && (\n <Box className=\"expandable-description-mobile\">\n <Typography\n className={`description-content-mobile ${isDescriptionExpanded || !shouldShowToggle ? 'expanded' : 'collapsed'}`}\n >\n {shopDescription}\n </Typography>\n {shouldShowToggle && (\n <ToggleButtonMobile onClick={toggleDescription}>\n <ArrowDownIcon\n width={16}\n height={16}\n className={`arrow-icon-mobile ${isDescriptionExpanded ? 'expanded' : ''}`}\n />\n </ToggleButtonMobile>\n )}\n </Box>\n )}\n </MysiteHeroContainerMobile>\n ) : (\n <MysiteHeroContainer\n className={containerClass}\n data-testid=\"my-site-shop-header\"\n bannerProps={bannerProps}\n isCircularImage={isImageCircular}\n hasWhiteBackground={hasWhiteBackground}\n >\n {renderImageContent(imageDetails, bannerProps ?? {}, 'bg-image')}\n {renderDesktopContent(props, isScrolled, renderSocialMediaIcons, isMobile, hasWhiteBackground)}\n </MysiteHeroContainer>\n );\n}\n","import React from 'react';\nimport { styled } from '@nuskin/foundation-theme';\nimport { Box, BoxProps } from '@mui/material';\n\ninterface StyledBoxProps extends BoxProps {\n bannerProps?: {\n backgroundColor?: string;\n headlineFont?: string;\n paragraphFont?: string;\n };\n isCircularImage?: boolean;\n hasWhiteBackground?: boolean;\n}\n\ninterface BadgeProps extends BoxProps {\n hasWhiteBackground?: boolean;\n}\n\nconst getContactTextStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '600',\n lineHeight: '16px',\n letterSpacing: '0.12px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n});\n\nconst getSocialTitleStyles = (hasWhiteBackground: boolean | undefined) => ({\n fontSize: '12px',\n fontStyle: 'normal' as const,\n fontWeight: '700',\n lineHeight: '16px',\n letterSpacing: '0.48px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n textTransform: 'uppercase' as const,\n paddingLeft: '5px',\n});\n\nconst getSocialIconsStyles = () => ({\n display: 'flex',\n flexDirection: 'row' as const,\n gap: '10px',\n alignItems: 'center',\n});\n\nconst getContactTextMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getContactTextStyles(hasWhiteBackground),\n paddingBottom: '11px',\n wordBreak: 'break-all' as const,\n overflowWrap: 'break-word' as const,\n paddingLeft: '5px',\n '& a': {\n color: 'inherit',\n textDecoration: 'none',\n },\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '15px',\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '14px',\n paddingBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '12px',\n paddingBottom: '4px',\n },\n});\n\nconst getSocialTitleMobileStyles = (hasWhiteBackground: boolean | undefined) => ({\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '11px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '@media (max-width: 420px)': {\n fontSize: '11px',\n lineHeight: '14px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '10px',\n lineHeight: '12px',\n marginBottom: '5px',\n },\n '@media (max-width: 375px)': {\n fontSize: '8px',\n lineHeight: '11px',\n marginBottom: '4px',\n },\n});\n\nexport const MysiteHeroContainer = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n height: 'auto',\n flexDirection: 'row',\n alignItems: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content': {\n paddingTop: '0',\n justifyContent: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title': {\n fontSize: '26px',\n lineHeight: '34px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n\n '.bg-image': {\n width: '90px',\n height: '90px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n '& > div': {\n width: '90px',\n height: '90px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.content': {\n width: '70%',\n height: '100%',\n marginLeft: '2%',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image': {\n width: '252px',\n height: '252px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '3px' : '0px',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n '.body-title': {\n fontSize: '32px',\n lineHeight: '38px',\n marginBottom: '8px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-text': {\n fontSize: '16px',\n marginBottom: '12px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '22px',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n WebkitLineClamp: 3,\n textOverflow: 'ellipsis',\n paddingLeft: '5px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.social-media': {\n display: 'flex',\n flexDirection: 'column',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.email-text': getContactTextStyles(hasWhiteBackground),\n '.phone-text': getContactTextStyles(hasWhiteBackground),\n '.social-title-text': {\n ...getSocialTitleStyles(hasWhiteBackground),\n marginBottom: '8px',\n },\n '.social-icons': {\n ...getSocialIconsStyles(),\n paddingBottom: '8px',\n },\n }),\n);\n\nexport const MysiteHeroContainerMobile = styled((props: StyledBoxProps) => <Box {...props} />)(\n ({ bannerProps, isCircularImage, hasWhiteBackground }) => ({\n backgroundClip: 'border-box',\n display: 'flex',\n background: bannerProps?.backgroundColor ?? '#383838',\n position: 'relative',\n overflow: 'hidden',\n width: '100%',\n flexDirection: 'column',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'transform, opacity',\n transform: 'translateZ(0)',\n backfaceVisibility: 'hidden',\n '&.scrolled': {\n top: 0,\n left: 0,\n right: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n '.content-mobile': {\n paddingTop: '5px',\n width: '60%',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.body-title-mobile': {\n fontSize: '18px',\n lineHeight: '28px',\n marginBottom: '0',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n '.bg-image-mobile': {\n width: '75px',\n height: '75px',\n padding: isCircularImage ? '2px' : '0px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n objectFit: 'cover',\n objectPosition: 'center',\n },\n '.placeholder-image-mobile': {\n '& > div': {\n width: '75px !important',\n height: '75px !important',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n },\n },\n '.image-content-mobile': {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '.content-mobile': {\n width: '55%',\n height: '100%',\n paddingTop: '10px',\n paddingRight: '10px',\n marginLeft: '8px',\n marginRight: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n paddingTop: '8px',\n width: '100%',\n },\n '@media (max-width: 400px)': {\n paddingTop: '6px',\n width: '100%',\n height: '100%',\n },\n '@media (max-width: 375px)': {\n paddingTop: '4px',\n width: '100%',\n height: '100%',\n },\n },\n '.bg-image-mobile': {\n width: '144px',\n height: '144px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n objectFit: 'cover',\n objectPosition: 'center',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n padding: isCircularImage ? '2px' : '0px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '112px',\n height: '112px',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n '.placeholder-image-mobile': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n willChange: 'width, height, transform',\n '& > div': {\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n width: '144px',\n height: '144px',\n '@media (max-width: 420px)': {\n width: '120px',\n height: '120px',\n },\n '@media (max-width: 400px)': {\n width: '110px !important',\n height: '110px !important',\n },\n '@media (max-width: 375px)': {\n width: '90px',\n height: '90px',\n },\n },\n },\n '.body-title-mobile': {\n fontSize: '22px',\n lineHeight: '28px',\n marginBottom: '13px',\n fontWeight: '400',\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontStyle: 'normal',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontFamily: bannerProps?.headlineFont ?? 'Lora',\n paddingLeft: '5px',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n '@media (max-width: 420px)': {\n fontSize: '16px',\n lineHeight: '24px',\n marginBottom: '8px',\n },\n '@media (max-width: 400px)': {\n fontSize: '16px',\n lineHeight: '22px',\n marginBottom: '6px',\n },\n '@media (max-width: 375px)': {\n fontSize: '14px',\n lineHeight: '20px',\n marginBottom: '4px',\n },\n },\n '.body-text-mobile': {\n fontSize: '14px',\n padding: '20px 25px 20px 25px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n backgroundColor: '#E0E0E0',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: 1,\n transform: 'translateY(0)',\n },\n '.expandable-description-mobile': {\n backgroundColor: '#E0E0E0',\n position: 'relative',\n },\n '.description-content-mobile': {\n fontSize: '14px',\n padding: '10px 15px',\n fontStyle: 'normal',\n fontWeight: '400',\n lineHeight: '20px',\n color: '#252525',\n fontFamily: bannerProps?.paragraphFont ?? 'inherit',\n transition: 'max-height 0.3s ease-in-out, opacity 0.3s ease-in-out',\n overflow: 'hidden',\n position: 'relative',\n '&.collapsed': {\n maxHeight: '50px',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '20px',\n background: 'linear-gradient(transparent, rgba(224, 224, 224, 0.8), #E0E0E0)',\n pointerEvents: 'none',\n },\n },\n '&.expanded': {\n maxHeight: 'none',\n whiteSpace: 'normal',\n display: 'block',\n '&::after': {\n display: 'none',\n },\n },\n },\n '.email-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.phone-text-mobile': getContactTextMobileStyles(hasWhiteBackground),\n '.social-title-text-mobile': getSocialTitleMobileStyles(hasWhiteBackground),\n '.social-icons-mobile': {\n ...getSocialIconsStyles(),\n paddingBottom: '10px',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n opacity: 1,\n transform: 'translateY(0)',\n '& img': {\n width: '24px',\n height: '24px',\n '@media (max-width: 400px)': {\n width: '20px',\n height: '20px',\n },\n '@media (max-width: 375px)': {\n width: '18px',\n height: '18px',\n },\n },\n '@media (max-width: 420px)': {\n paddingBottom: '8px',\n },\n '@media (max-width: 400px)': {\n paddingBottom: '4px',\n },\n '@media (max-width: 375px)': {\n paddingBottom: '3px',\n },\n },\n }),\n);\n\nexport const BadgeContainer = styled(Box)({\n display: 'flex',\n gap: '12px',\n marginBottom: '16px',\n paddingLeft: '5px',\n\n '&.mobile-badges': {\n flexDirection: 'column',\n gap: '8px',\n marginBottom: '12px',\n },\n\n '&.tablet-badges': {\n flexDirection: 'row',\n gap: '12px',\n marginBottom: '8px',\n },\n});\n\nexport const Badge = styled((props: BadgeProps) => <Box {...props} />)(({ hasWhiteBackground }) => ({\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(10px)',\n borderRadius: '20px',\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n transition: 'all 0.3s ease',\n\n '&.mobile-badge': {\n padding: '6px 12px',\n borderRadius: '16px',\n fontSize: '12px',\n },\n\n '&.tablet-badge': {\n padding: '8px 16px',\n borderRadius: '20px',\n fontSize: '14px',\n },\n\n '&.total-savings-badge': {\n backgroundColor: '#4A6987',\n border: 'none',\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n backdropFilter: 'none',\n '.badge-value': {\n color: '#FFFFFF',\n },\n '&:hover': {\n backgroundColor: '#4A6987',\n transform: 'none',\n boxShadow: 'none',\n },\n },\n\n '&.expiration-badge': {\n borderRadius: '8px',\n padding: '8px 16px',\n gap: '4px',\n minHeight: '32px',\n },\n\n '&:hover': {\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n transform: 'translateY(-1px)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n\n '.badge-text': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '400',\n opacity: 0.9,\n },\n\n '.badge-value': {\n color: hasWhiteBackground ? '#000000' : '#FFFFFF',\n fontWeight: '600',\n },\n}));\nexport const ToggleButtonMobile = styled('button')({\n backgroundColor: '#E0E0E0',\n border: '1px solid #252525',\n borderRadius: '10px',\n cursor: 'pointer',\n width: '40px',\n height: '20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '10px auto 5px auto',\n transition: 'all 0.2s ease',\n '& .arrow-icon-mobile': {\n transition: 'transform 0.3s ease',\n '&.expanded': {\n transform: 'rotate(180deg)',\n },\n },\n});\nexport const StyledSpan = styled(Box)`\n background: none;\n border: 2px solid transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n border-radius: 8px;\n transition: all 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n &:focus,\n &:focus-within {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n &:hover svg {\n fill: #ffffff;\n }\n`;\nexport const ImgTabIndex = styled('span')`\n line-height: 0.5;\n`;\n\nexport const ContactLink = styled('a')({\n fontSize: 'inherit',\n fontFamily: 'inherit',\n fontWeight: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit',\n color: 'inherit',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n});\n\nexport const BadgeValue = styled('span')({});\n","import React from 'react';\nimport { Box } from '@mui/material';\n\ntype PlaceholderImageProps = {\n readonly width: string | number;\n readonly height: string | number;\n readonly backgroundColor: string;\n};\n\nexport const PlaceholderImage: React.FC<PlaceholderImageProps> = ({ width, height, backgroundColor }) => {\n return (\n <Box\n sx={{\n width,\n height,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor,\n }}\n data-testid=\"placeholder-image\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"129\" viewBox=\"0 0 128 129\" fill=\"none\">\n <g id=\"ns_logomark\">\n <path\n id=\"Vector\"\n d=\"M127.495 52.1946C125.663 47.9538 122.999 44.1171 119.661 40.9073C112.565 34.2835 102.562 31.7037 93.1175 34.0622C83.6733 36.4206 76.0882 43.3926 72.991 52.5619C71.4142 56.8414 70.6063 61.3627 70.6039 65.9196C70.6039 85.8227 70.6039 105.737 70.6039 125.662C70.6039 129.001 70.6039 129.001 66.9051 128.834C66.9051 128.2 66.9051 127.499 66.9051 126.831C66.9051 104.323 66.9051 81.8263 66.9051 59.3409C66.3415 45.3064 74.9302 32.5039 88.1888 27.6164C89.79 27.0612 91.4307 26.6259 93.0981 26.314C94.7114 25.98 96.4605 25.8465 98.0738 25.6461C96.0231 16.3291 78.9419 5.60953 65.0889 4.97504C50.3084 4.62252 36.6074 12.6365 29.7509 25.6461C31.331 25.8465 32.8779 25.9466 34.3569 26.2138C48.0999 28.544 58.7086 39.4998 60.5168 53.2298C60.8904 55.7285 61.0812 58.2508 61.0877 60.7769C61.0877 82.7507 61.0877 104.724 61.0877 126.697C61.0877 128.434 60.6842 129.169 58.8016 128.968C56.9183 128.768 57.1204 128.2 57.1204 126.965C57.1204 119.985 57.1204 113.006 57.1204 105.993C57.1204 92.1674 57.1204 78.3423 57.1204 64.5171C57.2385 56.3928 54.2457 48.5271 48.7477 42.5103C42.2429 35.5282 32.6539 32.2371 23.1959 33.7401C13.7379 35.243 5.66194 41.3411 1.67448 49.9906C1.23781 50.8254 0.867444 51.6937 0.262573 52.9293C5.79294 22.3996 32.4752 0.139867 63.7085 0.000656323C94.9411 -0.138555 121.824 21.8824 127.629 52.3616\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_2\"\n d=\"M86.0995 124.927C86.0995 124.293 86.0995 123.858 86.0995 123.425C86.0995 111.669 86.0995 100.049 86.0995 88.1269C85.8836 82.4231 88.0775 76.89 92.1523 72.8653C97.3131 67.9567 104.984 66.7091 111.452 69.7263C117.892 72.1185 122.166 78.225 122.178 85.0541C122.372 92.1747 119.781 99.0921 114.949 104.356C107.882 113.237 98.6134 120.141 88.05 124.392C87.4217 124.616 86.782 124.805 86.1335 124.96\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_3\"\n d=\"M41.8183 125.395C37.6149 123.224 33.6477 121.487 29.9828 119.25C21.5405 114.299 14.4778 107.331 9.43828 98.9796C6.53442 94.3985 5.34408 88.9493 6.07591 83.5852C7.056 75.2882 13.8859 68.8841 22.2829 68.3905C31.1231 67.2473 39.3527 73.0751 41.1455 81.7484C41.76 84.263 42.0762 86.8411 42.0868 89.4287C42.0868 100.516 42.0868 111.636 42.0868 122.823C42.0868 123.457 42.0867 124.059 41.8854 125.294\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_4\"\n d=\"M51.3337 127.431C47.9713 127.431 47.6681 127.198 47.6681 124.326V76.6386C48.1096 67.937 42.9747 59.906 34.8574 56.602C25.8992 52.8557 15.5485 54.8615 8.66523 61.6779C4.28638 66.6086 1.89197 72.9696 1.94049 79.5438C1.95423 80.2444 1.78037 80.9357 1.43588 81.5476C1.06552 79.9446 0.62885 78.2081 0.426687 76.7387C-0.724024 70.4463 0.471163 63.9529 3.78906 58.472C6.09291 54.6111 9.65016 51.6434 13.8762 50.0567C22.8587 46.555 32.9393 47.1785 41.4148 51.7598C47.6592 54.8694 51.5262 61.2882 51.3337 68.2232C51.5019 87.6249 51.3337 107.027 51.3337 126.396C51.3337 126.797 51.3337 127.164 51.3337 127.532\"\n fill=\"#252525\"\n />\n <path\n id=\"Vector_5\"\n d=\"M76.287 127.499V125.094C76.287 107.196 76.4883 89.2963 76.287 71.3966C76.0848 56.9034 84.2554 50.6588 95.7553 48.3545C101.535 47.2005 107.524 47.6393 113.071 49.6235C122.914 53.3319 128.994 63.1725 127.866 73.5672C127.631 76.2831 127.17 78.975 126.487 81.6151C125.916 78.2758 125.68 74.9364 124.772 71.597C122.808 64.3002 117.377 58.4174 110.228 55.8421C103.078 53.2668 95.1132 54.3239 88.8955 58.6734C83.0441 62.6207 79.7011 69.3237 80.086 76.3389C80.086 92.2349 80.086 108.131 80.086 124.026C80.086 127.366 80.086 127.366 76.2198 127.366\"\n fill=\"#252525\"\n />\n </g>\n </svg>\n </Box>\n );\n};\n","import React from 'react';\n\ntype ArrowDownIconProps = {\n readonly width?: string | number;\n readonly height?: string | number;\n readonly className?: string;\n};\n\nexport const ArrowDownIcon: React.FC<ArrowDownIconProps> = ({ width = 16, height = 16, className = '' }) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n data-testid=\"arrow-down-icon\"\n >\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n </svg>\n );\n};\n","export interface GTMEvent {\n event: string;\n\n [key: string]: unknown;\n}\n\ndeclare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport function trackGTMEvent(eventData: GTMEvent): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const url = window.location.href;\n const updatedEventData = { ...eventData };\n\n const prefix = url.includes('personal-offer') ? 'postorefront_' : 'mysite_';\n updatedEventData.event = prefix + eventData.event;\n\n try {\n if (window.dataLayer) {\n window.dataLayer.push(updatedEventData);\n } else {\n console.error('GTM dataLayer not available, but event logged');\n window.dataLayer = [];\n window.dataLayer.push(updatedEventData);\n }\n } catch (error) {\n console.error('Failed to track GTM event:', error);\n }\n}\n","import { styled } from '@nuskin/foundation-theme';\n\nexport const DashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 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 standard: {\n key: 'shoppingDashboard.filter.conversionType.standard',\n fallback: 'Standard',\n },\n subscription: {\n key: 'shoppingDashboard.filter.conversionType.subscription',\n fallback: 'Subscription',\n },\n },\n },\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 } 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 } from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { ProductsListSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface TopSellingProductsListProps {\n readonly products: TopProduct[];\n readonly productSort: ProductSortOption;\n readonly isLoading?: boolean;\n readonly maxProducts?: number;\n readonly onSortChange?: (sort: ProductSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopSellingProductsListComponent: React.FC<TopSellingProductsListProps> = ({\n products,\n productSort,\n isLoading = false,\n maxProducts = 5,\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);\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)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n case 'revenue':\n return `${product.unitsSold.toLocaleString()} ${getTranslation(Keys.widget.topProducts.unitsSuffix)}`;\n case 'volume':\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n default:\n return `${formatMoney(product.revenue, product.currencyCode)} ${getTranslation(Keys.widget.topProducts.revenueSuffix)}`;\n }\n };\n\n const getTrendValue = (product: TopProduct, sortBy: ProductSortOption) => {\n const trend = product.trend;\n if (!trend) {\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 ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport type { TrendDirection } from '../shared/types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport function parseTrendPercent(value?: string): number | null {\n if (!value) return null;\n const cleanedValue = value.replace('%', '').trim();\n const parsedValue = Number(cleanedValue);\n return Number.isFinite(parsedValue) ? parsedValue : null;\n}\n\nexport function resolveTrendDirection(value?: string): TrendDirection {\n const parsedValue = parseTrendPercent(value);\n if (parsedValue === null) return 'neutral';\n if (parsedValue > 0) return 'up';\n if (parsedValue < 0) return 'down';\n return 'neutral';\n}\n\nexport function calculateWeightedRevenueTrend<T>(\n items: readonly T[],\n getRevenue: (item: T) => number,\n getTrend: (item: T) => string | undefined,\n): { direction: TrendDirection; formatted: string } {\n const { weightedSum, weight } = items.reduce(\n (accumulator, item) => {\n const trendValue = parseTrendPercent(getTrend(item));\n if (trendValue === null) return accumulator;\n return {\n weightedSum: accumulator.weightedSum + trendValue * getRevenue(item),\n weight: accumulator.weight + getRevenue(item),\n };\n },\n { weightedSum: 0, weight: 0 },\n );\n\n const average = weight > 0 ? weightedSum / weight : 0;\n let direction: TrendDirection = 'neutral';\n if (average > 0) direction = 'up';\n else if (average < 0) direction = 'down';\n\n return { direction, formatted: `${average > 0 ? '+' : ''}${average.toFixed(1)}%` };\n}\n\nexport function getTrendDirectionLabel(direction: TrendDirection): string {\n if (direction === 'up') return getTranslation(Keys.stats.trend.increased);\n if (direction === 'down') return getTranslation(Keys.stats.trend.decreased);\n return getTranslation(Keys.stats.trend.unchanged);\n}\n\nexport function getTrendIcon(direction: TrendDirection): React.ReactNode {\n switch (direction) {\n case 'up':\n return <ArrowUpwardIcon />;\n case 'down':\n return <ArrowDownwardIcon />;\n case 'neutral':\n default:\n return <RemoveIcon />;\n }\n}\n\nexport function getTrendColor(direction: TrendDirection): string {\n switch (direction) {\n case 'up':\n return '#4caf50';\n case 'down':\n return '#f44336';\n case 'neutral':\n default:\n return '#757575';\n }\n}\n\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\nexport function formatMoney(\n value: number,\n currencyCode?: string,\n locale: string = 'en-US',\n fractionDigits?: number,\n): string {\n const amount = Number.isFinite(value) ? value : 0;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n ...(fractionDigits !== undefined\n ? { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits }\n : { minimumFractionDigits: 0, maximumFractionDigits: 2 }),\n }).format(amount);\n } catch {}\n }\n return fractionDigits !== undefined ? `$${amount.toFixed(fractionDigits)}` : `$${amount.toLocaleString()}`;\n}\n\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 {\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 currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trendInfo = React.useMemo((): { direction: 'up' | 'down' | 'neutral'; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null || Math.abs(summaryChangePct) < 0.1) {\n return { direction: 'neutral', value: noChangeText };\n }\n const direction = summaryChangePct > 0 ? 'up' : 'down';\n const formatted = `${summaryChangePct > 0 ? '+' : ''}${summaryChangePct.toFixed(2)}%`;\n return { direction, value: formatted };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: noDataText };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: noChangeText };\n const change = latestRate - previousRate;\n const percentageChange = (change / previousRate) * 100;\n if (Math.abs(percentageChange) < 0.1) return { direction: 'neutral', value: noChangeText };\n const direction = change > 0 ? 'up' : 'down';\n const formattedChange = `${change > 0 ? '+' : ''}${change.toFixed(2)}%`;\n return { direction, value: formattedChange };\n }, [summaryChangePct, conversionData, noChangeText, noDataText]);\n\n const formattedData = React.useMemo(\n () => conversionData.map((item) => ({ ...item, shortDate: formatAxisDate(item.date) })),\n [conversionData],\n );\n\n if (isLoading && conversionData.length === 0) {\n return (\n <ConversionRateContainer data-testid=\"widget-conversion-rate\">\n <ChartWidgetSkeleton />\n </ConversionRateContainer>\n );\n }\n\n const chartAriaLabel = getTranslation(Keys.widget.conversionRate.chartAriaLabel);\n\n return (\n <ConversionRateContainer as=\"section\" data-testid=\"widget-conversion-rate\" aria-label={chartAriaLabel}>\n <ChartHeader>\n <TitleRow>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.widget.conversionRate.titleAriaLabel)}\n data-testid=\"widget-title-conversion-rate\"\n >\n {title ?? getTranslation(Keys.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.defaults.all)}</option>\n <option value=\"standard\">{getTranslation(Keys.filter.conversionType.standard)}</option>\n <option value=\"subscription\">\n {getTranslation(Keys.filter.conversionType.subscription)}\n </option>\n </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 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\nconst dotComponentCache = new Map<string, React.ComponentType<DotProps>>();\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 // eslint-disable-next-line react/display-name\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\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 { 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} from './TopCategoriesPieChart.styled';\nimport { StyledSelect } from '../DashboardHeader.styled';\nimport type { CategoryRevenue, CategorySortOption } 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 } 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 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 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 CategorySortOption;\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 <StyledSelect\n id=\"category-sort\"\n data-testid=\"category-sort-dropdown\"\n value={categorySort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.widget.topCategories.sortAriaLabel)}\n >\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"volume\">{getTranslation(Keys.defaults.byVolume)}</option>\n </StyledSelect>\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 formatter={(value: number) => formatMoney(value, currencyCode)} />\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 ? `${totalVolume.toFixed(1)} SV`\n : formatMoney(totalRevenue, currencyCode)}\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)} SV (${displayPercentage}%)`\n : `${formatMoney(displayValue ?? 0, category.currencyCode)} (${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 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 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 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 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 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 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 const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [signupView, setSignupView] = React.useState<SignupViewOption>(initialSignupView);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [categorySort, setCategorySort] = React.useState<CategorySortOption>(initialCategorySort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedSignupData = signupData ?? EMPTY_SIGNUP_DATA;\n const resolvedCategories = categories ?? EMPTY_CATEGORIES;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedSignups = signups ?? EMPTY_SIGNUPS;\n\n const updateView = React.useCallback(\n (view: MysiteDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): MysiteDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: MysiteDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: FullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleSignupViewChange = React.useCallback(\n (nextSignupView: SignupViewOption) => {\n setSignupView(nextSignupView);\n onSignupViewChange?.(nextSignupView);\n },\n [onSignupViewChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleCategorySortChange = React.useCallback(\n (nextSort: CategorySortOption) => {\n setCategorySort(nextSort);\n onCategorySortChange?.(nextSort);\n },\n [onCategorySortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleSignupsTitleClick = React.useCallback(() => {\n handleOpenFullView('signups');\n }, [handleOpenFullView]);\n\n const handleCategoriesTitleClick = React.useCallback(() => {\n handleOpenFullView('categories');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedTopProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={resolvedConversionData}\n orders={resolvedOrders}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'signups') {\n return (\n <SignupsFullView\n signupData={resolvedSignupData}\n signups={resolvedSignups}\n dateRange={dateRange}\n market={market}\n signupView={signupView}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onSignupViewChange={handleSignupViewChange}\n />\n );\n }\n\n if (currentView === 'categories') {\n return (\n <CategoriesFullView\n categories={resolvedCategories}\n dateRange={dateRange}\n market={market}\n categorySort={categorySort}\n 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 } 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) => <MetricValue>{formatMoney(Number(value), currencyCode)}</MetricValue>,\n },\n {\n key: 'volume',\n label: getTranslation(Keys.fullView.products.columns.volume),\n sortable: true,\n render: (value: unknown) => <MetricValue>{Number(value).toLocaleString()}</MetricValue>,\n },\n ],\n [currencyCode],\n );\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewTableSkeleton />\n </PageContainer>\n );\n }\n\n if (products.length === 0) {\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"products-fullview-empty\">\n {getTranslation(Keys.fullView.products.noProducts)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"products-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topProducts.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"products-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedRows}\n sortable\n onSort={handleSort}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n getRowKey={(row: ProductRow) => row.rank}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCardsContainer data-testid=\"products-fullview-mobile-cards\">\n {paginatedRows.map((row) => (\n <MobileProductCard key={row.rank}>\n <MobileCardHeader>\n <MobileProductRank>#{row.rank}</MobileProductRank>\n <MobileProductDetails>\n <MobileProductName>{row.name}</MobileProductName>\n <MobileProductSku>{row.sku}</MobileProductSku>\n </MobileProductDetails>\n </MobileCardHeader>\n <MobileMetricsGrid>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.units)}</MobileMetricLabel>\n <MobileMetricValue>{row.units.toLocaleString()}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>{getTranslation(Keys.defaults.revenue)}</MobileMetricLabel>\n <MobileMetricValue>{formatMoney(row.revenue, currencyCode)}</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 </MobileTitleWrapper>\n\n <HeaderContainer>\n <LeftSection>\n <Title data-testid=\"page-header-title\">{title}</Title>\n <DateRange data-testid=\"page-header-date-range\">{dateRange}</DateRange>\n </LeftSection>\n\n {filters && filters.length > 0 && onFilterChange && (\n <FiltersSection data-testid=\"page-header-filters\">\n {filters.map((filter) => (\n <FilterWrapper key={filter.key}>\n {renderFilterIcon(filter.icon)}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onFilterChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {filter.label && filter.key === 'customerType'\n ? `${filter.label} ${option.label}`\n : option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterWrapper>\n ))}\n </FiltersSection>\n )}\n\n <MobileDateRange>{dateRange}</MobileDateRange>\n </HeaderContainer>\n </PageHeaderWrapper>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageHeaderWrapper = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n`;\n\nexport const BackButtonWrapper = styled('div')`\n display: flex;\n align-items: center;\n`;\n\nexport const BackButton = styled('button')`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background-color: transparent;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n cursor: pointer;\n transition: color 0.2s ease;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n\n &:hover {\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n svg {\n font-size: 16px;\n }\n\n span {\n line-height: 1;\n }\n`;\n\nexport const HeaderContainer = styled('div')`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 16px;\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n gap: 24px;\n\n @media (max-width: 767px) {\n align-items: flex-end;\n gap: 16px;\n }\n`;\n\nexport const LeftSection = styled('div')`\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const Title = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const DateRange = styled('p')`\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n`;\n\nexport const MobileDateRange = styled('p')`\n display: none;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n white-space: nowrap;\n\n @media (max-width: 767px) {\n display: block;\n flex-shrink: 0;\n }\n`;\n\nexport const FiltersSection = styled('div')`\n display: flex;\n gap: 24px;\n align-items: center;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n`;\n\nexport const FilterWrapper = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const FilterIcon = styled('span')`\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n\n svg {\n font-size: 16px;\n }\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 120px;\n height: 32px;\n padding: 6px 8px;\n padding-right: 24px;\n background-color: transparent;\n border: none;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: background-color 0.2s ease;\n appearance: none;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path fill=\"%23667085\" d=\"M6 8L2 4h8L6 8z\"/></svg>');\n background-repeat: no-repeat;\n background-position: right 4px center;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n }\n\n &:focus {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 4px;\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n @media (max-width: 767px) {\n min-width: auto;\n width: auto;\n flex: none;\n padding-right: 24px;\n background-position: right 8px center;\n }\n`;\n\nexport const MobileTitleWrapper = styled('div')`\n display: none;\n\n @media (max-width: 767px) {\n display: block;\n margin-bottom: 16px;\n }\n`;\n\nexport const MobileTitle = styled('h1')`\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n margin: 0;\n`;\n","import React from 'react';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableHeaderCell,\n TableBody,\n TableRow,\n TableCell,\n EmptyTableCell,\n SortIconContainer,\n} from './DataTable.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ColumnDef<TData = unknown> {\n key: string;\n label: string;\n sortable?: boolean;\n render?: (value: unknown, row: TData) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<TData = unknown> {\n readonly columns: ColumnDef<TData>[];\n readonly data: TData[];\n readonly sortable?: boolean;\n readonly onSort?: (columnKey: string, direction: 'asc' | 'desc') => void;\n readonly sortColumn?: string;\n readonly sortDirection?: 'asc' | 'desc';\n readonly getRowKey?: (row: TData, rowIndex: number) => React.Key;\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n sortable = false,\n onSort,\n sortColumn,\n sortDirection = 'asc',\n getRowKey,\n}: DataTableProps<TData>) => {\n const handleSort = (columnKey: string) => {\n if (!sortable || !onSort) return;\n const newDirection = sortColumn === columnKey && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(columnKey, newDirection);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, columnKey: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSort(columnKey);\n }\n };\n\n const getAriaSort = (columnKey: string): 'ascending' | 'descending' | undefined => {\n if (sortColumn !== columnKey) return undefined;\n return sortDirection === 'asc' ? 'ascending' : 'descending';\n };\n\n return (\n <TableContainer data-testid=\"data-table\">\n <Table>\n <TableHeader>\n <tr>\n {columns.map((column) => (\n <TableHeaderCell\n key={column.key}\n scope=\"col\"\n sortable={sortable && column.sortable}\n onClick={() => column.sortable && handleSort(column.key)}\n onKeyDown={(e) => column.sortable && handleKeyDown(e, column.key)}\n tabIndex={sortable && column.sortable ? 0 : -1}\n aria-sort={getAriaSort(column.key)}\n aria-label={`${column.label}${column.sortable ? getTranslation(Keys.dataTable.sortableColumn) : ''}`}\n data-testid={`table-header-${column.key}`}\n >\n {column.label}\n {sortable && column.sortable && (\n <SortIconContainer isActive={sortColumn === column.key}>\n {sortColumn === column.key && sortDirection === 'desc' ? (\n <ArrowDownwardIcon />\n ) : (\n <ArrowUpwardIcon />\n )}\n </SortIconContainer>\n )}\n </TableHeaderCell>\n ))}\n </tr>\n </TableHeader>\n <TableBody>\n {data.length === 0 ? (\n <TableRow data-testid=\"table-empty-row\">\n <EmptyTableCell colSpan={columns.length}>\n {getTranslation(Keys.dataTable.noDataAvailable)}\n </EmptyTableCell>\n </TableRow>\n ) : (\n data.map((row, rowIndex) => (\n <TableRow\n key={getRowKey ? getRowKey(row, rowIndex) : rowIndex}\n data-testid={`table-row-${rowIndex}`}\n >\n {columns.map((column) => (\n <TableCell key={column.key} data-testid={`table-cell-${column.key}`}>\n {column.render\n ? column.render((row as Record<string, unknown>)[column.key], row)\n : ((row as Record<string, unknown>)[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TableContainer = styled('div')`\n width: 100%;\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n`;\n\nexport const Table = styled('table')`\n width: 100%;\n border-collapse: collapse;\n`;\n\nexport const TableHeader = styled('thead')`\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-bottom: 2px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n`;\n\nexport const TableHeaderCell = styled('th')<{ sortable?: boolean }>`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n cursor: ${({ sortable }) => (sortable ? 'pointer' : 'default')};\n user-select: none;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: -2px;\n }\n`;\n\nexport const TableBody = styled('tbody')``;\n\nexport const TableRow = styled('tr')`\n border-bottom: 1px solid ${({ theme }) => getGenomeColor(theme, 'N30')};\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nexport const TableCell = styled('td')`\n padding: 12px 16px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n text-align: left;\n`;\n\nexport const EmptyTableCell = styled(TableCell)`\n text-align: center;\n`;\n\nexport const SortIconContainer = styled('span')<{ isActive?: boolean }>`\n display: inline-flex;\n margin-left: 6px;\n opacity: ${({ isActive }) => (isActive ? 1 : 0.4)};\n transition: opacity 0.2s ease;\n\n svg {\n font-size: 16px;\n }\n`;\n","import React from 'react';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport { PaginationContainer, PageButton, PageInfo, NavButton } from './Pagination.styled';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface PaginationProps {\n readonly currentPage: number;\n readonly totalPages: number;\n readonly onPageChange: (page: number) => void;\n readonly itemsPerPage?: number;\n readonly totalItems?: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n}) => {\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, action: () => void) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n action();\n }\n };\n\n const getPageNumbers = (): number[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: number[] = [];\n if (currentPage <= 4) {\n pages.push(1, 2, 3, 4, 5);\n } else if (currentPage >= totalPages - 3) {\n pages.push(totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(currentPage - 1, currentPage, currentPage + 1);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const startItem = itemsPerPage ? (currentPage - 1) * itemsPerPage + 1 : null;\n const endItem = itemsPerPage ? Math.min(currentPage * itemsPerPage, totalItems ?? Infinity) : null;\n const goToPageLabel = getTranslation(Keys.pagination.goToPage);\n\n return (\n <PaginationContainer data-testid=\"pagination\">\n <NavButton\n onClick={handlePrevious}\n onKeyDown={(e) => handleKeyDown(e, handlePrevious)}\n disabled={currentPage === 1}\n aria-label={getTranslation(Keys.pagination.previousPage)}\n data-testid=\"pagination-previous\"\n type=\"button\"\n >\n <ChevronLeftIcon />\n </NavButton>\n\n {totalPages > 7 && currentPage > 4 && (\n <>\n <PageButton\n onClick={() => onPageChange(1)}\n isActive={false}\n aria-label={`${goToPageLabel} 1`}\n data-testid=\"pagination-page-1\"\n type=\"button\"\n >\n 1\n </PageButton>\n <PageInfo>...</PageInfo>\n </>\n )}\n\n {pageNumbers.map((page) => (\n <PageButton\n key={page}\n onClick={() => onPageChange(page)}\n isActive={currentPage === page}\n aria-label={`${goToPageLabel} ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n data-testid={`pagination-page-${page}`}\n type=\"button\"\n >\n {page}\n </PageButton>\n ))}\n\n {totalPages > 7 && currentPage < totalPages - 3 && (\n <>\n <PageInfo>...</PageInfo>\n <PageButton\n onClick={() => onPageChange(totalPages)}\n isActive={false}\n aria-label={`${goToPageLabel} ${totalPages}`}\n data-testid={`pagination-page-${totalPages}`}\n type=\"button\"\n >\n {totalPages}\n </PageButton>\n </>\n )}\n\n <NavButton\n onClick={handleNext}\n onKeyDown={(e) => handleKeyDown(e, handleNext)}\n disabled={currentPage === totalPages}\n aria-label={getTranslation(Keys.pagination.nextPage)}\n data-testid=\"pagination-next\"\n type=\"button\"\n >\n <ChevronRightIcon />\n </NavButton>\n\n {itemsPerPage && totalItems && (\n <PageInfo as=\"output\" aria-live=\"polite\" data-testid=\"pagination-page-info\">\n {startItem}-{endItem} {getTranslation(Keys.pagination.of)} {totalItems}\n </PageInfo>\n )}\n </PaginationContainer>\n );\n};\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PaginationContainer = styled('div')`\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 24px;\n`;\n\nexport const PageButton = styled('button')<{ isActive?: boolean }>`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A80') : getGenomeColor(theme, 'N20')};\n color: ${({ theme, isActive }) => (isActive ? '#ffffff' : getGenomeColor(theme, 'N100'))};\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme, isActive }) =>\n isActive ? getGenomeColor(theme, 'A70') : getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\nexport const PageInfo = styled('span')`\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n margin: 0 8px;\n`;\n\nexport const NavButton = styled('button')`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n border: none;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n outline: 2px solid ${({ theme }) => getGenomeColor(theme, 'A70')};\n outline-offset: 2px;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n font-size: 18px;\n }\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const PageContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n box-sizing: border-box;\n\n @media (max-width: 767px) {\n gap: 16px;\n }\n`;\n\nexport const MetricChartCardSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const MetricSection = styled(Box)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 16px 0;\n gap: 10px;\n flex-wrap: nowrap;\n width: 100%;\n\n @media (max-width: 767px) {\n padding: 8px 0;\n flex-wrap: nowrap;\n align-items: center;\n }\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0em;\n color: ${({ theme }) => theme.palette.text.primary};\n margin: 0;\n padding: 0;\n\n @media (max-width: 767px) {\n font-size: 28px;\n line-height: 1;\n }\n`;\n\nexport const MetricTrend = styled(Box)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n gap: 4px;\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n flex-wrap: nowrap;\n white-space: nowrap;\n\n svg {\n font-size: 13px;\n flex-shrink: 0;\n width: 13px;\n height: 13px;\n }\n\n span {\n display: inline;\n line-height: 1;\n }\n\n @media (max-width: 767px) {\n font-size: 13px;\n line-height: 1;\n flex-wrap: nowrap;\n\n svg {\n font-size: 13px;\n width: 13px;\n height: 13px;\n }\n }\n`;\n\nexport const ComparisonText = styled(Typography)`\n margin: 0;\n padding: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.3;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n @media (max-width: 767px) {\n font-size: 12px;\n line-height: 1.3;\n }\n`;\n\nexport const ChartSection = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n\n @media (max-width: 767px) {\n gap: 8px;\n }\n`;\n\nexport const ChartTitle = styled('h2')`\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n\n @media (max-width: 767px) {\n font-size: 1.125rem;\n }\n`;\n\nexport const ChartContainer = styled(Box)`\n width: 90%;\n height: 450px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 250px;\n margin-bottom: 0;\n }\n`;\n\nexport const TableSection = styled(Box)<{ withCard?: boolean }>`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n ${({ withCard = true, theme }) =>\n withCard &&\n `\n padding: 20px;\n background-color: ${getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${theme.shadows[1]};\n\n @media (max-width: 767px) {\n padding: 16px;\n }\n `}\n`;\n\nexport const LoadingContainer = styled(Box)`\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 400px;\n`;\n\nexport const EmptyStateText = styled(Typography)`\n text-align: center;\n color: ${({ theme }) => theme.palette.text.secondary};\n font-size: 1rem;\n padding: 40px 20px;\n\n @media (max-width: 767px) {\n font-size: 0.875rem;\n padding: 32px 16px;\n }\n`;\n\nexport const MobileCardName = styled(Typography)`\n font-weight: 600;\n font-size: 14px;\n`;\n\nexport const MobileCardSubtext = styled(Typography)`\n font-size: 13px;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileCardDetail = styled(Typography)`\n font-size: 13px;\n`;\n\nexport const MobileCardStatus = styled(Typography)<{ status: string }>`\n font-size: 13px;\n color: ${({ theme, status }) => (status === 'Active' ? theme.palette.success.main : theme.palette.warning.main)};\n`;\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ProductInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const ProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const ProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n\nexport const MobileCardsContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileProductCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileCardHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`;\n\nexport const MobileProductRank = styled(Typography)`\n font-size: 1rem;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.primary.main};\n min-width: 24px;\n`;\n\nexport const MobileProductDetails = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const MobileProductName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n`;\n\nexport const MobileProductSku = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0;\n vertical-align: middle;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import useMediaQuery from '@mui/material/useMediaQuery';\n\nexport const MOBILE_VIEWPORT_QUERY = '(max-width:767px)';\n\nexport function useIsMobileViewport(): boolean {\n return useMediaQuery(MOBILE_VIEWPORT_QUERY, { noSsr: true });\n}\n","import React, { useState } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport { getComparedToText } from '../../utils/comparisonTextUtils';\nimport type {\n ConversionDataPoint,\n OrderHistory,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n ConversionFilterOption,\n} from '../../types.d';\nimport type { TrendDirection } from '../types';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport {\n PageContainer,\n MetricChartCardSection,\n MetricSection,\n MetricValue,\n MetricTrend,\n ChartSection,\n ChartTitle,\n TableSection,\n} from '../FullViewComponents.styled';\nimport {\n MobileOrderCard,\n MobileOrderHeader,\n MobileCustomerInfo,\n MobileCustomerName,\n MobileOrderDate,\n MobileOrderId,\n MobileOrderMetrics,\n MobileMetricItem,\n MobileMetricLabel,\n MobileMetricValue,\n MobileOrdersContainer,\n DesktopTableContainer,\n OrderIdColumnCell,\n ConversionTrendChartContainer,\n ChartWithLegendWrapper,\n ChartLegendContainer,\n LegendItem,\n TrendValueText,\n TrendComparisonText,\n MetricSectionWrapper,\n} from './ConversionRateFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface ConversionRateFullViewProps {\n readonly conversionData: ConversionDataPoint[];\n readonly orders: OrderHistory[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly conversionFilter: ConversionFilterOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly summaryRate?: number;\n readonly summaryChangePct?: number | null;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onConversionFilterChange?: (filter: ConversionFilterOption) => void;\n}\n\nexport const ConversionRateFullView: React.FC<ConversionRateFullViewProps> = ({\n conversionData,\n orders,\n summaryRate,\n summaryChangePct,\n dateRange,\n market,\n conversionFilter,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onConversionFilterChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const currentRate = React.useMemo(() => {\n if (typeof summaryRate === 'number' && Number.isFinite(summaryRate)) return summaryRate;\n return conversionData.at(-1)?.rate ?? 0;\n }, [summaryRate, conversionData]);\n\n const trend = React.useMemo((): { direction: TrendDirection; value: string } => {\n if (summaryChangePct !== undefined) {\n if (summaryChangePct === null)\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n let direction: TrendDirection = 'neutral';\n if (summaryChangePct > 0) direction = 'up';\n else if (summaryChangePct < 0) direction = 'down';\n return { direction, value: `${summaryChangePct >= 0 ? '+' : ''}${summaryChangePct.toFixed(1)}%` };\n }\n if (conversionData.length < 2) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const latestRate = conversionData.at(-1)?.rate ?? 0;\n const previousRate = conversionData[0].rate;\n if (previousRate === 0) return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n const changePercent = ((latestRate - previousRate) / previousRate) * 100;\n if (Math.abs(changePercent) < 0.1) {\n return { direction: 'neutral', value: getTranslation(Keys.defaults.zeroTrend) };\n }\n let direction: TrendDirection = 'neutral';\n if (changePercent > 0) direction = 'up';\n else if (changePercent < 0) direction = 'down';\n return { direction, value: `${changePercent >= 0 ? '+' : ''}${changePercent.toFixed(1)}%` };\n }, [summaryChangePct, conversionData]);\n\n const getConversionFilterLabel = React.useCallback((filter: ConversionFilterOption): string => {\n if (filter === 'standard') return getTranslation(Keys.filter.conversionType.standard);\n if (filter === 'subscription') return getTranslation(Keys.filter.conversionType.subscription);\n return getTranslation(Keys.defaults.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.defaults.all) },\n { value: 'standard', label: getTranslation(Keys.filter.conversionType.standard) },\n { value: 'subscription', label: getTranslation(Keys.filter.conversionType.subscription) },\n ],\n },\n ],\n [conversionFilter, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'customerType') {\n onConversionFilterChange?.(value as ConversionFilterOption);\n setCurrentPage(1);\n }\n },\n [onConversionFilterChange, onDateRangeChange, onMarketChange],\n );\n\n const filteredOrders = React.useMemo(() => {\n if (conversionFilter === 'all') return orders;\n return orders.filter((order) => order.customerType.toLowerCase() === conversionFilter);\n }, [orders, conversionFilter]);\n\n const { totalPages, pageItems: paginatedOrders } = usePaginatedItems(filteredOrders, currentPage, itemsPerPage);\n\n const columns: ColumnDef<OrderHistory>[] = React.useMemo(\n () => [\n {\n key: 'orderId',\n label: getTranslation(Keys.fullView.conversionRate.columns.orderId),\n sortable: true,\n render: (value) => <OrderIdColumnCell>{value as React.ReactNode}</OrderIdColumnCell>,\n },\n { key: 'date', label: getTranslation(Keys.defaults.date), sortable: true },\n {\n key: 'customerName',\n label: getTranslation(Keys.fullView.conversionRate.columns.customer),\n sortable: true,\n },\n { key: 'customerType', label: getTranslation(Keys.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, undefined, 2),\n },\n { key: 'bv', label: getTranslation(Keys.fullView.conversionRate.columns.bv), sortable: true },\n ],\n [],\n );\n\n const getChartColor = React.useCallback(() => {\n if (conversionFilter === 'standard') return '#2e7d32';\n if (conversionFilter === 'subscription') return '#ed6c02';\n return '#1976d2';\n }, [conversionFilter]);\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"conversion-rate-full-view\">\n <PageHeader\n title={getTranslation(Keys.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 <MetricValue data-testid=\"conversion-rate-value\" style={{ marginRight: '6px' }}>\n {currentRate.toFixed(1)}%\n </MetricValue>\n <MetricTrend direction={trend.direction} data-testid=\"conversion-rate-trend\">\n {trend.direction === 'up' && <ArrowUpwardIcon />}\n {trend.direction === 'down' && <ArrowDownwardIcon />}\n <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={conversionData} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"date\" />\n <YAxis tickFormatter={(value) => `${value}%`} domain={[0, 'auto']} />\n <Tooltip\n formatter={(value: unknown) => {\n if (typeof value === 'number') return `${value.toFixed(2)}%`;\n if (typeof value === 'string') return value;\n return getTranslation(Keys.fullView.conversionRate.notAvailable);\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"rate\"\n stroke={getChartColor()}\n strokeWidth={2}\n name={`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </ConversionTrendChartContainer>\n <ChartLegendContainer>\n <LegendItem $color={getChartColor()}>\n {`${getTranslation(Keys.defaults.conversionRate)} (${conversionFilterLabel})`}\n </LegendItem>\n </ChartLegendContainer>\n </ChartWithLegendWrapper>\n </ChartSection>\n </MetricChartCardSection>\n\n <TableSection data-testid=\"conversion-fullview-table-section\">\n <ChartTitle data-testid=\"conversion-fullview-table-title\">\n {getTranslation(Keys.fullView.conversionRate.orderDetailsTitle)} ({filteredOrders.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer data-testid=\"conversion-fullview-desktop-table\">\n <DataTable\n columns={columns}\n data={paginatedOrders}\n getRowKey={(row: OrderHistory) => row.orderId}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOrdersContainer data-testid=\"conversion-fullview-mobile-orders\">\n {paginatedOrders.map((order) => (\n <MobileOrderCard key={order.orderId}>\n <MobileOrderHeader>\n <MobileCustomerInfo>\n <MobileCustomerName>{order.customerName}</MobileCustomerName>\n <MobileOrderDate>{order.date}</MobileOrderDate>\n </MobileCustomerInfo>\n <MobileOrderId>{order.orderId}</MobileOrderId>\n </MobileOrderHeader>\n <MobileOrderMetrics>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.items)}\n </MobileMetricLabel>\n <MobileMetricValue>{order.items}</MobileMetricValue>\n </MobileMetricItem>\n <MobileMetricItem>\n <MobileMetricLabel>\n {getTranslation(Keys.fullView.conversionRate.columns.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 { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const ConversionTrendChartContainer = styled(Box)`\n width: 100%;\n height: 370px;\n margin-bottom: 0;\n\n @media (max-width: 767px) {\n height: 260px;\n }\n`;\n\nexport const MobileOrderCard = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n }\n`;\n\nexport const MobileOrderHeader = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nexport const MobileCustomerInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const MobileCustomerName = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n`;\n\nexport const MobileOrderDate = styled(Typography)`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileOrderId = styled('a')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.primary.main};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const MobileOrderMetrics = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: center;\n`;\n\nexport const MobileMetricLabel = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const MobileMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const MobileOrdersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const ChartWithLegendWrapper = styled(Box)`\n display: flex;\n flex-direction: row;\n gap: 24px;\n align-items: flex-end;\n width: 100%;\n\n @media (max-width: 767px) {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n`;\n\nexport const ChartLegendContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 0;\n margin-bottom: 40px;\n padding: 0;\n flex-shrink: 0;\n min-width: 160px;\n\n @media (max-width: 767px) {\n margin-top: 16px;\n margin-bottom: 0;\n min-width: auto;\n }\n`;\n\nexport const LegendItem = styled(Box)<{ $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 style={{ color: SERIES_COLORS.total }}>\n {getTranslation(Keys.widget.signups.total)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n <LegendItem style={{ color: SERIES_COLORS.brandAffiliates }}>\n {getTranslation(Keys.defaults.brandAffiliates)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'members' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.members }}>\n {getTranslation(Keys.defaults.members)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'retail' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: SERIES_COLORS.retail }}>\n {getTranslation(Keys.defaults.retail)}\n </LegendItem>\n </ChartLegendContainer>\n )}\n {signupView === 'brandAffiliates' && (\n <ChartLegendContainer>\n <LegendItem style={{ color: 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 display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: ${({ theme }) => theme.palette.text.secondary};\n white-space: nowrap;\n\n &::before {\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: currentColor;\n }\n\n @media (max-width: 767px) {\n font-size: 12px;\n }\n`;\n\nexport const NameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n\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 } 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: 'trend', label: getTranslation(Keys.defaults.byTrend) },\n ],\n },\n ],\n [categorySort, dateRange, market, marketOptions],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onCategorySortChange?.(value as CategorySortOption);\n setCurrentPage(1);\n }\n },\n [onCategorySortChange, onDateRangeChange, onMarketChange],\n );\n\n interface CustomLabelProps {\n cx: number;\n cy: number;\n midAngle: number;\n innerRadius: number;\n outerRadius: number;\n percentage: number;\n }\n\n const renderCustomLabel = (props: CustomLabelProps) => {\n 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, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedCategories.reduce((sum, category) => sum + category.revenue, 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) => category.revenue,\n (category) => category.trend?.revenue,\n );\n nextTrendDirection = direction;\n nextFormattedTrend = formatted;\n }\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: nextTrendDirection,\n totalRevenueTrend: nextFormattedTrend,\n };\n }, [sortedCategories, summaryChangePct]);\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) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'volume',\n label: getTranslation(Keys.defaults.volume),\n sortable: true,\n render: (value: unknown) => formatMoney(Number(value ?? 0), currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.categories.columns.percentOfTotal),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.defaults.trend),\n render: (_: unknown, row: CategoryRevenue) =>\n row.trend?.revenue ?? getTranslation(Keys.defaults.noValue),\n },\n ];\n return cols;\n }, [currencyCode]);\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (categories.length === 0) {\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"categories-fullview-empty\">\n {getTranslation(Keys.fullView.categories.noCategoryData)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"categories-full-view\">\n <PageHeader\n title={getTranslation(Keys.widget.topCategories.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"categories-fullview-top-section\">\n <ChartWrapper data-testid=\"categories-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedCategories}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n label={renderCustomLabel}\n labelLine={false}\n >\n {sortedCategories.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"categories-fullview-donut-center\">\n <DonutCenterLabel>{getTranslation(Keys.stats.revenue)}</DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>\n {getTrendIcon(totalRevenueTrendDirection)}\n <span>{totalRevenueTrend}</span>\n </DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"categories-fullview-summary\">\n {topCategories.map((category) => (\n <SummaryItem key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryName>{capitalizeFirstLetter(category.name)}</SummaryName>\n <SummaryValue>{formatMoney(category.revenue, category.currencyCode)}</SummaryValue>\n <SummaryPercentage>({category.percentage}%)</SummaryPercentage>\n {category.trend?.revenue ? (\n <SummaryTrendIcon direction={resolveTrendDirection(category.trend.revenue)}>\n {getTrendIcon(resolveTrendDirection(category.trend.revenue))}\n </SummaryTrendIcon>\n ) : null}\n </SummaryItem>\n ))}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"categories-fullview-table-section\">\n <ChartTitle data-testid=\"categories-fullview-table-title\">\n {getTranslation(Keys.fullView.categories.allCategoriesTitle)} ({sortedCategories.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedCategories}\n sortable\n getRowKey={(row: CategoryRevenue) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileCategoriesContainer>\n {paginatedCategories.map((category) => (\n <MobileCategoryCard key={category.id}>\n <ColorDot dotColor={category.color} />\n <SummaryItemInfo>\n <SummaryItemName>{category.name}</SummaryItemName>\n <SummaryItemSubtext>\n {formatMoney(category.revenue, category.currencyCode)}\n </SummaryItemSubtext>\n </SummaryItemInfo>\n <SummaryItemPercentage>{category.percentage}%</SummaryItemPercentage>\n </MobileCategoryCard>\n ))}\n </MobileCategoriesContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedCategories.length}\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled, ColorUtils } from '@nuskin/foundation-theme';\nimport { styled as muiStyled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const SummaryItemRow = styled('div')`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const SummaryItemInfo = styled('div')`\n flex: 1;\n`;\n\nexport const SummaryItemName = styled('span')`\n font-weight: 600;\n`;\n\nexport const SummaryItemSubtext = styled('span')`\n font-size: 0.875rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryItemPercentage = styled('span')`\n font-weight: 600;\n`;\n\nexport const TopSection = muiStyled(Box)`\n display: flex;\n gap: 32px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n align-items: center;\n justify-content: center;\n width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n align-items: flex-start;\n justify-content: flex-start;\n }\n`;\n\nexport const ChartWrapper = muiStyled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = muiStyled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = muiStyled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = muiStyled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = muiStyled(Typography)<{ direction: 'up' | 'down' | 'neutral' }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const SummaryContainer = muiStyled(Box)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 0;\n`;\n\nexport const SummaryItem = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n white-space: nowrap;\n min-width: 0;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = muiStyled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = muiStyled(Box)`\n display: none;\n`;\n\nexport const SummaryName = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n flex-shrink: 0;\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nexport const SummaryValue = muiStyled(Typography)`\n font-size: 0.75rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n flex-shrink: 0;\n white-space: nowrap;\n`;\n\nexport const SummaryPercentage = muiStyled(Typography)`\n font-size: 0.8125rem;\n font-weight: 500;\n flex-shrink: 0;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DesktopTableContainer = muiStyled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileCategoriesContainer = muiStyled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileCategoryCard = muiStyled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const SummaryTrendIcon = muiStyled('span')<{ direction: 'up' | 'down' | 'neutral' }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ direction }) => {\n if (direction === 'up') return '#2e7d32';\n if (direction === 'down') return '#d32f2f';\n return '#757575';\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n\nexport const CategoryNameColumnCell = styled('span')`\n font-family:\n 'Inter',\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0%;\n vertical-align: middle;\n color: #252525;\n`;\n","import React from 'react';\nimport {\n resolveTranslation,\n setTranslationResolver,\n type TranslateFn,\n type TranslationEntry,\n} from './TranslationKeys/translationResolver';\n\nexport function useTranslationResolver(translate?: TranslateFn): void {\n // 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 { styled } from '@nuskin/foundation-theme';\n\nexport const PoDashboardContainer = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n\n @media (min-width: 768px) {\n gap: 24px;\n }\n\n @media (min-width: 1080px) {\n gap: 24px;\n }\n`;\n\nexport const TopChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const StatsCardStack = styled('div')`\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n gap: 24px;\n justify-content: flex-start;\n }\n`;\n\nexport const BottomChartsRow = styled('div')`\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n\n @media (min-width: 1080px) {\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n`;\n\nexport const ErrorContainer = styled('div')`\n padding: 24px;\n text-align: center;\n color: #d32f2f;\n background-color: #ffebee;\n border-radius: 8px;\n`;\n","import React from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { WidgetMenu } from '../WidgetMenu';\nimport {\n CategoriesContainer,\n ChartHeader,\n ChartTitle,\n SortDropdown,\n ChartAndLegendContainer,\n ChartWrapper,\n LegendContainer,\n LegendItem,\n LegendColor,\n LegendInfo,\n LegendName,\n LegendValue,\n LegendPercentage,\n LegendTrend,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n EmptyState,\n EmptyStateText,\n HeaderActionsContainer,\n} from '../TopCategories/TopCategoriesPieChart.styled';\nimport type { TopPerformingOffer, OfferSortOption } from '../../types.d';\nimport { CategoriesPieChartSkeleton } from '../LoadingSkeletons';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport { getTrendIcon, resolveTrendDirection, calculateWeightedRevenueTrend } from '../../utils/trendUtils';\nimport { formatMoney, capitalizeFirstLetter } from '../../utils/dataUtils';\n\nexport interface TopPerformingOffersPieChartProps {\n readonly offers: TopPerformingOffer[];\n readonly offerSort: OfferSortOption;\n readonly isLoading?: boolean;\n readonly title?: string;\n readonly onSortChange?: (sort: OfferSortOption) => void;\n readonly onTitleClick?: () => void;\n readonly onExport?: () => void;\n}\n\nconst TopPerformingOffersPieChartComponent: React.FC<TopPerformingOffersPieChartProps> = ({\n offers,\n offerSort,\n isLoading = false,\n title,\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, trendDirection, formattedTrend } = React.useMemo(() => {\n const nextSortedOffers = [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n });\n\n const nextTotalRevenue = nextSortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction: nextTrendDirection, formatted: nextFormattedTrend } = calculateWeightedRevenueTrend(\n nextSortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n sortedOffers: nextSortedOffers,\n totalRevenue: nextTotalRevenue,\n trendDirection: nextTrendDirection,\n formattedTrend: nextFormattedTrend,\n };\n }, [offers, offerSort]);\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading && offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <CategoriesPieChartSkeleton />\n </CategoriesContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <CategoriesContainer data-testid=\"widget-top-offers\">\n <ChartHeader>\n <ChartTitle>{title ?? getTranslation(Keys.widget.topPerformingOffers.title)}</ChartTitle>\n </ChartHeader>\n <EmptyState data-testid=\"top-offers-empty-state\">\n <EmptyStateText>{getTranslation(Keys.widget.topPerformingOffers.emptyState)}</EmptyStateText>\n </EmptyState>\n </CategoriesContainer>\n );\n }\n\n return (\n <CategoriesContainer\n as=\"section\"\n data-testid=\"widget-top-offers\"\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <ChartHeader>\n <ChartTitle\n as=\"button\"\n onClick={onTitleClick}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n data-testid=\"widget-title-top-offers\"\n >\n {title ?? getTranslation(Keys.widget.topPerformingOffers.title)}\n </ChartTitle>\n <HeaderActionsContainer>\n <SortDropdown\n id=\"offer-sort\"\n data-testid=\"offer-sort-dropdown\"\n value={offerSort}\n onChange={handleSortChange}\n disabled={isLoading}\n aria-label={getTranslation(Keys.ariaLabel.topOffers)}\n >\n <option value=\"revenue\">{getTranslation(Keys.defaults.byRevenue)}</option>\n <option value=\"units\">{getTranslation(Keys.defaults.byUnits)}</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=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={trendDirection}>{formattedTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <LegendContainer data-testid=\"top-offers-legend-container\">\n {sortedOffers.map((offer, index) => {\n const legendTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <LegendItem key={offer.id} data-testid={`offer-legend-${index}`}>\n <LegendColor color={offer.color} />\n <LegendInfo>\n <LegendName>{capitalizeFirstLetter(offer.name)}</LegendName>\n <LegendValue>{formatMoney(offer.revenue, offer.currencyCode)}</LegendValue>\n </LegendInfo>\n <LegendPercentage>{offer.percentage}%</LegendPercentage>\n {offer.trend?.revenue ? (\n <LegendTrend\n direction={legendTrendDirection}\n data-testid={`offer-legend-trend-${index}`}\n aria-label={offer.trend.revenue}\n >\n {getTrendIcon(legendTrendDirection)}\n </LegendTrend>\n ) : null}\n </LegendItem>\n );\n })}\n </LegendContainer>\n </ChartAndLegendContainer>\n </CategoriesContainer>\n );\n};\n\nexport const TopPerformingOffersPieChart = React.memo(TopPerformingOffersPieChartComponent);\nTopPerformingOffersPieChart.displayName = 'TopPerformingOffersPieChart';\n","import { resolveTranslation } from './translationResolver';\n\ntype TranslationEntry = { readonly key: string; readonly fallback: string };\n\nexport const ProductOfferDashboardTranslationKeys = {\n title: { key: 'productOfferDashboard.title', fallback: 'Performance Overview' },\n error: { key: 'productOfferDashboard.error', fallback: 'Failed to load dashboard data. Please try again.' },\n\n stats: {\n revenue: { key: 'productOfferDashboard.stats.revenue', fallback: 'Total Revenue' },\n offersPurchased: { key: 'productOfferDashboard.stats.offersPurchased', fallback: 'Offers Purchased' },\n conversionRate: { key: 'productOfferDashboard.stats.conversionRate', fallback: 'Conversion Rate' },\n trendUp: { key: 'productOfferDashboard.stats.trendUp', fallback: 'Trending up' },\n trendDown: { key: 'productOfferDashboard.stats.trendDown', fallback: 'Trending down' },\n trendNeutral: { key: 'productOfferDashboard.stats.trendNeutral', fallback: 'No change' },\n comparedTo: { key: 'productOfferDashboard.stats.comparedTo', fallback: 'compared to this time last month' },\n },\n\n filter: {\n dateRange: {\n label: { key: 'productOfferDashboard.filter.dateRange.label', fallback: 'Date Range' },\n last7days: { key: 'productOfferDashboard.filter.dateRange.last7days', fallback: 'Last 7 Days' },\n last30days: { key: 'productOfferDashboard.filter.dateRange.last30days', fallback: 'Last 30 Days' },\n last90days: { key: 'productOfferDashboard.filter.dateRange.last90days', fallback: 'Last 90 Days' },\n thisMonth: { key: 'productOfferDashboard.filter.dateRange.thisMonth', fallback: 'This Month' },\n },\n market: {\n label: { key: 'productOfferDashboard.filter.market.label', fallback: 'Market' },\n all: { key: 'productOfferDashboard.filter.market.all', fallback: 'All Markets' },\n },\n offerSort: {\n byRevenue: { key: 'productOfferDashboard.filter.offerSort.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.filter.offerSort.byUnits', fallback: 'Units' },\n },\n productSort: {\n byUnits: { key: 'productOfferDashboard.filter.productSort.byUnits', fallback: 'Units' },\n byRevenue: { key: 'productOfferDashboard.filter.productSort.byRevenue', fallback: 'Revenue' },\n byVolume: { key: 'productOfferDashboard.filter.productSort.byVolume', fallback: 'Volume' },\n },\n conversionFilter: {\n overall: { key: 'productOfferDashboard.filter.conversionFilter.overall', fallback: 'Overall' },\n },\n },\n\n widget: {\n topProducts: {\n title: { key: 'productOfferDashboard.widget.topProducts.title', fallback: 'Top Selling Products' },\n emptyState: {\n key: 'productOfferDashboard.widget.topProducts.emptyState',\n fallback: 'No products data available',\n },\n },\n conversionRate: {\n title: { key: 'productOfferDashboard.widget.conversionRate.title', fallback: 'Conversion Rate' },\n subtitle: { key: 'productOfferDashboard.widget.conversionRate.subtitle', fallback: 'Orders ÷ Site visits' },\n },\n topPerformingOffers: {\n title: { key: 'productOfferDashboard.widget.topPerformingOffers.title', fallback: 'Top Performing Offers' },\n totalRevenue: {\n key: 'productOfferDashboard.widget.topPerformingOffers.totalRevenue',\n fallback: 'Total revenue',\n },\n emptyState: {\n key: 'productOfferDashboard.widget.topPerformingOffers.emptyState',\n fallback: 'No offers data available',\n },\n },\n menu: {\n fullView: { key: 'productOfferDashboard.widget.menu.fullView', fallback: 'Full View' },\n },\n },\n\n navigation: {\n back: { key: 'productOfferDashboard.navigation.back', fallback: 'Back to Dashboard' },\n },\n\n ariaLabel: {\n dashboard: {\n key: 'productOfferDashboard.ariaLabel.dashboard',\n fallback: 'Product Offer Performance Dashboard',\n },\n statsCard: { key: 'productOfferDashboard.ariaLabel.statsCard', fallback: 'Performance metric' },\n conversionChart: { key: 'productOfferDashboard.ariaLabel.conversionChart', fallback: 'Conversion rate chart' },\n topProducts: { key: 'productOfferDashboard.ariaLabel.topProducts', fallback: 'Top selling products' },\n topOffers: { key: 'productOfferDashboard.ariaLabel.topOffers', fallback: 'Top performing offers chart' },\n widgetMenu: { key: 'productOfferDashboard.ariaLabel.widgetMenu', fallback: 'Widget options menu' },\n filterDateRange: { key: 'productOfferDashboard.ariaLabel.filterDateRange', fallback: 'Filter by date range' },\n filterMarket: { key: 'productOfferDashboard.ariaLabel.filterMarket', fallback: 'Filter by market' },\n backButton: { key: 'productOfferDashboard.ariaLabel.backButton', fallback: 'Back to dashboard overview' },\n },\n\n fullView: {\n topOffers: {\n title: { key: 'productOfferDashboard.fullView.topOffers.title', fallback: 'Top Performing Offers' },\n columnName: { key: 'productOfferDashboard.fullView.topOffers.columnName', fallback: 'Offer Name' },\n columnRevenue: { key: 'productOfferDashboard.fullView.topOffers.columnRevenue', fallback: 'Revenue' },\n columnPercentage: { key: 'productOfferDashboard.fullView.topOffers.columnPercentage', fallback: 'Share' },\n columnTrend: { key: 'productOfferDashboard.fullView.topOffers.columnTrend', fallback: 'Trend' },\n },\n },\n\n defaults: {\n trendZero: { key: 'productOfferDashboard.defaults.trendZero', fallback: '+0%' },\n noData: { key: 'productOfferDashboard.defaults.noData', fallback: '--' },\n byRevenue: { key: 'productOfferDashboard.defaults.byRevenue', fallback: 'Revenue' },\n byUnits: { key: 'productOfferDashboard.defaults.byUnits', fallback: 'Units' },\n byVolume: { key: 'productOfferDashboard.defaults.byVolume', fallback: 'Volume' },\n },\n} as const;\n\nexport function getTranslation(entry: TranslationEntry): string {\n return resolveTranslation(entry);\n}\n","import React from 'react';\nimport type { TopPerformingOffer, TopProduct } from '../types.d';\nimport { exportTopPerformingOffers, exportTopProducts } from '../utils/productOfferExport';\n\nexport interface ProductOfferWidgetExportOptions {\n readonly topProducts: readonly TopProduct[];\n readonly topOffers: readonly TopPerformingOffer[];\n readonly topProductsExportData?: readonly TopProduct[];\n readonly topOffersExportData?: readonly TopPerformingOffer[];\n readonly showTopProductsExportOption?: boolean;\n readonly showTopOffersExportOption?: boolean;\n readonly isLoading?: boolean;\n}\n\nexport interface ProductOfferWidgetExportHandlers {\n readonly onTopProductsExport?: () => Promise<void>;\n readonly onTopOffersExport?: () => Promise<void>;\n}\n\nexport function useProductOfferWidgetExports({\n topProducts,\n topOffers,\n topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = true,\n isLoading = false,\n}: ProductOfferWidgetExportOptions): ProductOfferWidgetExportHandlers {\n const productRows = topProductsExportData ?? topProducts;\n const offerRows = topOffersExportData ?? topOffers;\n\n const canExportProducts = showTopProductsExportOption && !isLoading && productRows.length > 0;\n const canExportOffers = showTopOffersExportOption && !isLoading && offerRows.length > 0;\n\n const onTopProductsExport = React.useCallback(() => exportTopProducts(productRows), [productRows]);\n const onTopOffersExport = React.useCallback(() => exportTopPerformingOffers(offerRows), [offerRows]);\n\n return {\n onTopProductsExport: canExportProducts ? onTopProductsExport : undefined,\n onTopOffersExport: canExportOffers ? onTopOffersExport : 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 { 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\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","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 topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption = true,\n showTopOffersExportOption = 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 } = useProductOfferWidgetExports({\n topProducts: resolvedTopProducts,\n topOffers: resolvedTopOffers,\n topProductsExportData,\n topOffersExportData,\n showTopProductsExportOption,\n showTopOffersExportOption,\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 />\n <StatsCardStack data-testid=\"stats-card-stack\">\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.revenue)}\n value={stats?.metrics?.revenue ?? '$0'}\n trendDirection={getTrendDirection(stats?.trend?.revenue)}\n trendValue={stats?.trend?.revenue}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-revenue\"\n isLoading={isLoading}\n />\n <StatsCard\n layout=\"split\"\n title={getTranslation(Keys.stats.offersPurchased)}\n value={stats?.metrics?.offersPurchased ?? '0'}\n trendDirection={getTrendDirection(stats?.trend?.offersPurchased)}\n trendValue={stats?.trend?.offersPurchased}\n caption={getTranslation(Keys.stats.comparedTo)}\n testId=\"stats-card-offers-purchased\"\n isLoading={isLoading}\n />\n </StatsCardStack>\n </TopChartsRow>\n\n <BottomChartsRow data-testid=\"bottom-charts-row\">\n <TopSellingProductsList\n products={resolvedTopProducts}\n productSort={productSort}\n isLoading={isLoading}\n maxProducts={5}\n onSortChange={onProductSortChange}\n onTitleClick={onProductsTitleClick}\n onExport={onTopProductsExport}\n />\n <TopPerformingOffersPieChart\n offers={resolvedTopOffers}\n offerSort={offerSort}\n isLoading={isLoading}\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 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 showTopProductsExportOption = true,\n showTopOffersExportOption = 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 const hasIntraDashboardHistoryRef = React.useRef(false);\n const [dateRange, setDateRange] = React.useState<DateRangeOption>(initialDateRange);\n const [market, setMarket] = React.useState<MarketOption>(initialMarket);\n const [productSort, setProductSort] = React.useState<ProductSortOption>(initialProductSort);\n const [conversionFilter, setConversionFilter] = React.useState<ConversionFilterOption>(initialConversionFilter);\n const [offerSort, setOfferSort] = React.useState<OfferSortOption>(initialOfferSort);\n\n const resolvedTopProducts = topProducts ?? EMPTY_TOP_PRODUCTS;\n const resolvedConversionData = conversionData ?? EMPTY_CONVERSION_DATA;\n const resolvedTopOffers = topOffers ?? EMPTY_TOP_OFFERS;\n const resolvedAllProducts = allProducts ?? resolvedTopProducts;\n const resolvedOrders = orders ?? EMPTY_ORDERS;\n const resolvedAllOffers = allOffers ?? resolvedTopOffers;\n\n const updateView = React.useCallback(\n (view: ProductOfferDashboardView) => {\n setCurrentView(view);\n onViewChange?.(view);\n },\n [onViewChange],\n );\n\n const readCurrentView = React.useCallback((): ProductOfferDashboardView => {\n if (historyAdapter) {\n return readViewFromState(historyAdapter.location?.state, historyStateKey);\n }\n\n if (typeof window === 'undefined') {\n return 'dashboard';\n }\n\n return readViewFromState(window.history.state, historyStateKey);\n }, [historyAdapter, historyStateKey]);\n\n const writeCurrentView = React.useCallback(\n (view: ProductOfferDashboardView, mode: ViewMode) => {\n if (historyAdapter) {\n const nextState = buildStateWithView(historyAdapter.location?.state, historyStateKey, view);\n const nextLocation = buildLocationWithState(historyAdapter.location, nextState);\n\n if (mode === 'replace') {\n historyAdapter.replace(nextLocation);\n return;\n }\n\n historyAdapter.push(nextLocation);\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const nextState = buildStateWithView(window.history.state, historyStateKey, view);\n\n if (mode === 'replace') {\n window.history.replaceState(nextState, '');\n return;\n }\n\n window.history.pushState(nextState, '');\n },\n [historyAdapter, historyStateKey],\n );\n\n React.useEffect(() => {\n if (resetToDashboardOnMount) {\n writeCurrentView('dashboard', 'replace');\n hasIntraDashboardHistoryRef.current = false;\n updateView('dashboard');\n } else {\n updateView(readCurrentView());\n }\n\n if (historyAdapter) {\n return historyAdapter.listen((location, action) => {\n if (action === 'POP') {\n const nextView = readViewFromState(location.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n }\n });\n }\n\n const handlePopState = (event: PopStateEvent) => {\n const nextView = readViewFromState(event.state, historyStateKey);\n hasIntraDashboardHistoryRef.current = nextView !== 'dashboard';\n updateView(nextView);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => {\n window.removeEventListener('popstate', handlePopState);\n };\n }, [historyAdapter, historyStateKey, readCurrentView, resetToDashboardOnMount, updateView, writeCurrentView]);\n\n const handleOpenFullView = React.useCallback(\n (view: ProductOfferFullViewWidgetType) => {\n hasIntraDashboardHistoryRef.current = true;\n writeCurrentView(view, 'push');\n updateView(view);\n },\n [updateView, writeCurrentView],\n );\n\n const handleBack = React.useCallback(() => {\n if (currentView !== 'dashboard' && hasIntraDashboardHistoryRef.current) {\n if (historyAdapter) {\n historyAdapter.goBack();\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n\n return;\n }\n\n hasIntraDashboardHistoryRef.current = false;\n writeCurrentView('dashboard', 'replace');\n updateView('dashboard');\n }, [currentView, historyAdapter, updateView, writeCurrentView]);\n\n const handleDateRangeChange = React.useCallback(\n (nextDateRange: DateRangeOption) => {\n setDateRange(nextDateRange);\n onDateRangeChange?.(nextDateRange);\n },\n [onDateRangeChange],\n );\n\n const handleMarketChange = React.useCallback(\n (nextMarket: MarketOption) => {\n setMarket(nextMarket);\n onMarketChange?.(nextMarket);\n },\n [onMarketChange],\n );\n\n const handleProductSortChange = React.useCallback(\n (nextProductSort: ProductSortOption) => {\n setProductSort(nextProductSort);\n onProductSortChange?.(nextProductSort);\n },\n [onProductSortChange],\n );\n\n const handleConversionFilterChange = React.useCallback(\n (nextFilter: ConversionFilterOption) => {\n setConversionFilter(nextFilter);\n onConversionFilterChange?.(nextFilter);\n },\n [onConversionFilterChange],\n );\n\n const handleOfferSortChange = React.useCallback(\n (nextSort: OfferSortOption) => {\n setOfferSort(nextSort);\n onOfferSortChange?.(nextSort);\n },\n [onOfferSortChange],\n );\n\n const handleProductsTitleClick = React.useCallback(() => {\n handleOpenFullView('products');\n }, [handleOpenFullView]);\n\n const handleConversionTitleClick = React.useCallback(() => {\n handleOpenFullView('conversion-rate');\n }, [handleOpenFullView]);\n\n const handleOffersTitleClick = React.useCallback(() => {\n handleOpenFullView('top-offers');\n }, [handleOpenFullView]);\n\n if (currentView === 'products') {\n return (\n <ProductsFullView\n products={resolvedAllProducts}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n />\n );\n }\n\n if (currentView === 'conversion-rate') {\n return (\n <ConversionRateFullView\n conversionData={conversionFullViewData ?? resolvedConversionData}\n orders={resolvedOrders}\n summaryRate={conversionFullViewRate ?? conversionSummaryRate}\n summaryChangePct={conversionFullViewChangePct ?? conversionSummaryChangePct}\n dateRange={dateRange}\n market={market}\n conversionFilter={conversionFilter}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onConversionFilterChange={handleConversionFilterChange}\n />\n );\n }\n\n if (currentView === 'top-offers') {\n return (\n <TopPerformingOffersFullView\n offers={resolvedAllOffers}\n dateRange={dateRange}\n market={market}\n offerSort={offerSort}\n markets={markets}\n isLoading={isLoading}\n onBack={handleBack}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onOfferSortChange={handleOfferSortChange}\n />\n );\n }\n\n return (\n <ProductOfferDashboard\n stats={stats}\n topProducts={resolvedTopProducts}\n conversionData={resolvedConversionData}\n topOffers={resolvedTopOffers}\n isLoading={isLoading}\n error={error}\n dashboardTitle={dashboardTitle}\n className={className}\n dateRange={dateRange}\n market={market}\n productSort={productSort}\n conversionFilter={conversionFilter}\n offerSort={offerSort}\n conversionSummaryRate={conversionSummaryRate}\n conversionSummaryChangePct={conversionSummaryChangePct}\n topProductsExportData={topProductsExportData}\n topOffersExportData={topOffersExportData}\n showTopProductsExportOption={showTopProductsExportOption}\n showTopOffersExportOption={showTopOffersExportOption}\n markets={markets}\n onDateRangeChange={handleDateRangeChange}\n onMarketChange={handleMarketChange}\n onProductSortChange={handleProductSortChange}\n onConversionFilterChange={handleConversionFilterChange}\n onOfferSortChange={handleOfferSortChange}\n onProductsTitleClick={handleProductsTitleClick}\n onConversionTitleClick={handleConversionTitleClick}\n onOffersTitleClick={handleOffersTitleClick}\n />\n );\n};\n\nexport default PoDashboardWithNavigation;\n","import React, { useState } from 'react';\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { PageHeader, buildDateRangeFilter, buildMarketFilter, type FilterConfig } from '../PageHeader';\nimport { DataTable, type ColumnDef } from '../DataTable';\nimport { Pagination } from '../Pagination';\nimport { usePaginatedItems, formatMoney } from '../../utils/dataUtils';\nimport { calculateDateRangeFromOption } from '../../utils/dateFormat';\nimport type {\n TopPerformingOffer,\n DateRangeOption,\n MarketOption,\n MarketFilterOption,\n OfferSortOption,\n} from '../../types.d';\nimport { FullViewChartSkeleton } from '../LoadingSkeletons';\nimport { useMarketOptions } from '../../utils/marketOptions';\nimport { PageContainer, TableSection, ChartTitle, EmptyStateText } from '../FullViewComponents.styled';\nimport { SummaryItemRow } from '../TopCategories/CategoriesFullView.styled';\nimport {\n TopSection,\n ChartWrapper,\n DonutCenterOverlay,\n DonutCenterLabel,\n DonutCenterValue,\n DonutCenterTrend,\n SummaryContainer,\n SummaryItem,\n ColorDot,\n SummaryInfo,\n SummaryName,\n SummaryValue,\n SummaryPercentage,\n SummaryTrend,\n TableTrendCell,\n DesktopTableContainer,\n MobileOffersContainer,\n MobileOfferCard,\n MobileOfferHeader,\n MobileOfferName,\n MobileOfferMetricsGrid,\n MobileOfferMetricItem,\n MobileOfferMetricLabel,\n MobileOfferMetricValue,\n MobileOfferTrendValue,\n} from './TopPerformingOffersFullView.styled';\nimport { useIsMobileViewport } from '../useViewport';\nimport {\n getTranslation,\n ProductOfferDashboardTranslationKeys as Keys,\n} from '../../TranslationKeys/ProductOfferDashboardTranslationKeys';\nimport {\n getTrendIcon,\n parseTrendPercent,\n resolveTrendDirection,\n calculateWeightedRevenueTrend,\n} from '../../utils/trendUtils';\n\nexport interface TopPerformingOffersFullViewProps {\n readonly offers: TopPerformingOffer[];\n readonly dateRange: DateRangeOption;\n readonly market: MarketOption;\n readonly offerSort: OfferSortOption;\n readonly markets?: ReadonlyArray<MarketFilterOption>;\n readonly isLoading?: boolean;\n readonly onBack?: () => void;\n readonly onDateRangeChange?: (range: DateRangeOption) => void;\n readonly onMarketChange?: (market: MarketOption) => void;\n readonly onOfferSortChange?: (sort: OfferSortOption) => void;\n}\n\nexport const TopPerformingOffersFullView: React.FC<TopPerformingOffersFullViewProps> = ({\n offers,\n dateRange,\n market,\n offerSort,\n markets,\n isLoading = false,\n onBack,\n onDateRangeChange,\n onMarketChange,\n onOfferSortChange,\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const itemsPerPage = 10;\n const isMobileView = useIsMobileViewport();\n\n const handleBack = React.useCallback(() => onBack?.(), [onBack]);\n\n const marketOptions = useMarketOptions(markets);\n\n const filters: FilterConfig[] = React.useMemo(\n () => [\n buildDateRangeFilter(dateRange, Keys),\n buildMarketFilter(market, marketOptions, Keys),\n {\n key: 'sort',\n label: getTranslation(Keys.defaults.byRevenue),\n value: offerSort,\n options: [\n { value: 'revenue', label: getTranslation(Keys.defaults.byRevenue) },\n { value: 'units', label: getTranslation(Keys.defaults.byUnits) },\n ],\n },\n ],\n [dateRange, market, marketOptions, offerSort],\n );\n\n const handleFilterChange = React.useCallback(\n (key: string, value: string) => {\n if (key === 'dateRange') onDateRangeChange?.(value as DateRangeOption);\n else if (key === 'market') onMarketChange?.(value);\n else if (key === 'sort') {\n onOfferSortChange?.(value as OfferSortOption);\n setCurrentPage(1);\n }\n },\n [onOfferSortChange, onDateRangeChange, onMarketChange],\n );\n\n const sortedOffers = React.useMemo(\n () =>\n [...offers].sort((a, b) => {\n if (offerSort === 'revenue') return b.revenue - a.revenue;\n return b.percentage - a.percentage;\n }),\n [offers, offerSort],\n );\n\n const { totalRevenue, totalRevenueTrendDirection, totalRevenueTrend } = React.useMemo(() => {\n const nextTotalRevenue = sortedOffers.reduce((sum, offer) => sum + offer.revenue, 0);\n\n const { direction, formatted } = calculateWeightedRevenueTrend(\n sortedOffers,\n (offer) => offer.revenue,\n (offer) => offer.trend?.revenue,\n );\n\n return {\n totalRevenue: nextTotalRevenue,\n totalRevenueTrendDirection: direction,\n totalRevenueTrend: formatted,\n };\n }, [sortedOffers]);\n\n const topOffers = React.useMemo(() => sortedOffers.slice(0, 5), [sortedOffers]);\n\n const { totalPages, pageItems: paginatedOffers } = usePaginatedItems(sortedOffers, currentPage, itemsPerPage);\n\n const columns: ColumnDef<TopPerformingOffer>[] = React.useMemo(\n () => [\n {\n key: 'name',\n label: getTranslation(Keys.fullView.topOffers.columnName),\n sortable: true,\n render: (_: unknown, row: TopPerformingOffer) => (\n <SummaryItemRow>\n <ColorDot dotColor={row.color} />\n <span>{row.name}</span>\n </SummaryItemRow>\n ),\n },\n {\n key: 'revenue',\n label: getTranslation(Keys.fullView.topOffers.columnRevenue),\n sortable: true,\n render: (value: unknown, row: TopPerformingOffer) => formatMoney(Number(value), row.currencyCode),\n },\n {\n key: 'percentage',\n label: getTranslation(Keys.fullView.topOffers.columnPercentage),\n sortable: true,\n render: (value: unknown) => `${Number(value)}%`,\n },\n {\n key: 'trend',\n label: getTranslation(Keys.fullView.topOffers.columnTrend),\n render: (_: unknown, row: TopPerformingOffer) => {\n if (!row.trend?.revenue) return getTranslation(Keys.defaults.noData);\n const columnTrendDirection = resolveTrendDirection(row.trend.revenue);\n return (\n <TableTrendCell direction={columnTrendDirection}>\n {getTrendIcon(columnTrendDirection)}\n <span>{row.trend.revenue}</span>\n </TableTrendCell>\n );\n },\n },\n ],\n [],\n );\n\n const currencyCode = sortedOffers[0]?.currencyCode;\n\n if (isLoading) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <FullViewChartSkeleton />\n </PageContainer>\n );\n }\n\n if (offers.length === 0) {\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n <EmptyStateText data-testid=\"top-offers-fullview-empty\">\n {getTranslation(Keys.widget.topPerformingOffers.emptyState)}\n </EmptyStateText>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer data-testid=\"top-offers-full-view\">\n <PageHeader\n title={getTranslation(Keys.fullView.topOffers.title)}\n dateRange={calculateDateRangeFromOption(dateRange)}\n onBack={handleBack}\n filters={filters}\n onFilterChange={handleFilterChange}\n />\n\n <TopSection data-testid=\"top-offers-fullview-top-section\">\n <ChartWrapper data-testid=\"top-offers-fullview-chart\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={sortedOffers}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"50%\"\n outerRadius=\"85%\"\n dataKey=\"revenue\"\n nameKey=\"name\"\n paddingAngle={2}\n >\n {sortedOffers.map((entry) => (\n <Cell key={`cell-${entry.id}`} fill={entry.color} />\n ))}\n </Pie>\n <Tooltip formatter={(value: number) => formatMoney(value, currencyCode)} />\n </PieChart>\n </ResponsiveContainer>\n <DonutCenterOverlay data-testid=\"top-offers-fullview-donut-center\">\n <DonutCenterLabel>\n {getTranslation(Keys.widget.topPerformingOffers.totalRevenue)}\n </DonutCenterLabel>\n <DonutCenterValue>{formatMoney(totalRevenue, currencyCode)}</DonutCenterValue>\n <DonutCenterTrend direction={totalRevenueTrendDirection}>{totalRevenueTrend}</DonutCenterTrend>\n </DonutCenterOverlay>\n </ChartWrapper>\n\n <SummaryContainer data-testid=\"top-offers-fullview-summary\">\n {topOffers.map((offer) => {\n const summaryTrendDirection = resolveTrendDirection(offer.trend?.revenue);\n return (\n <SummaryItem key={offer.id}>\n <ColorDot dotColor={offer.color} />\n <SummaryInfo>\n <SummaryName>{offer.name}</SummaryName>\n <SummaryValue>{formatMoney(offer.revenue, offer.currencyCode)}</SummaryValue>\n </SummaryInfo>\n <SummaryPercentage>{offer.percentage}%</SummaryPercentage>\n {offer.trend?.revenue ? (\n <SummaryTrend direction={summaryTrendDirection} aria-label={offer.trend.revenue}>\n {getTrendIcon(summaryTrendDirection)}\n </SummaryTrend>\n ) : null}\n </SummaryItem>\n );\n })}\n </SummaryContainer>\n </TopSection>\n\n <TableSection data-testid=\"top-offers-table\">\n <ChartTitle data-testid=\"top-offers-fullview-table-title\">\n {getTranslation(Keys.fullView.topOffers.title)} ({sortedOffers.length})\n </ChartTitle>\n {!isMobileView ? (\n <DesktopTableContainer>\n <DataTable\n columns={columns}\n data={paginatedOffers}\n sortable\n getRowKey={(row: TopPerformingOffer) => row.id}\n />\n </DesktopTableContainer>\n ) : (\n <MobileOffersContainer>\n {paginatedOffers.map((offer) => {\n const trendPercent = parseTrendPercent(offer.trend?.revenue);\n let trendDirection: 'up' | 'down' | 'neutral' = 'neutral';\n if (trendPercent !== null && trendPercent > 0) trendDirection = 'up';\n else if (trendPercent !== null && trendPercent < 0) trendDirection = 'down';\n\n return (\n <MobileOfferCard key={offer.id}>\n <MobileOfferHeader>\n <ColorDot dotColor={offer.color} />\n <MobileOfferName>{offer.name}</MobileOfferName>\n </MobileOfferHeader>\n <MobileOfferMetricsGrid>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnRevenue)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>\n {formatMoney(offer.revenue, offer.currencyCode)}\n </MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnPercentage)}\n </MobileOfferMetricLabel>\n <MobileOfferMetricValue>{offer.percentage}%</MobileOfferMetricValue>\n </MobileOfferMetricItem>\n <MobileOfferMetricItem>\n <MobileOfferMetricLabel>\n {getTranslation(Keys.fullView.topOffers.columnTrend)}\n </MobileOfferMetricLabel>\n <MobileOfferTrendValue direction={trendDirection}>\n {offer.trend?.revenue ? (\n <>\n {getTrendIcon(trendDirection)}\n <span>{offer.trend.revenue}</span>\n </>\n ) : (\n getTranslation(Keys.defaults.noData)\n )}\n </MobileOfferTrendValue>\n </MobileOfferMetricItem>\n </MobileOfferMetricsGrid>\n </MobileOfferCard>\n );\n })}\n </MobileOffersContainer>\n )}\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n itemsPerPage={itemsPerPage}\n totalItems={sortedOffers.length}\n data-testid=\"top-offers-pagination\"\n />\n )}\n </TableSection>\n </PageContainer>\n );\n};\n","import { styled } from '@mui/material/styles';\nimport { Box, Typography } from '@mui/material';\nimport { ColorUtils } from '@nuskin/foundation-theme';\nimport type { TrendDirection } from '../types';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const TopSection = styled(Box)`\n display: flex;\n gap: 24px;\n padding: 24px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border-radius: 8px;\n box-shadow: ${({ theme }) => theme.shadows[1]};\n\n @media (max-width: 767px) {\n flex-direction: column;\n padding: 16px;\n gap: 16px;\n }\n`;\n\nexport const ChartWrapper = styled(Box)`\n position: relative;\n width: 280px;\n height: 280px;\n flex-shrink: 0;\n\n @media (max-width: 767px) {\n width: 100%;\n height: 220px;\n }\n`;\n\nexport const DonutCenterOverlay = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n pointer-events: none;\n z-index: 1;\n width: 120px;\n`;\n\nexport const DonutCenterLabel = styled(Typography)`\n font-size: 0.75rem;\n line-height: 1.2;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const DonutCenterValue = styled(Typography)`\n margin-top: 2px;\n font-size: 1.25rem;\n line-height: 1.2;\n font-weight: 700;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const DonutCenterTrend = styled(Typography)<{ direction: TrendDirection }>`\n margin-top: 2px;\n font-size: 0.875rem;\n line-height: 1.2;\n font-weight: 600;\n color: ${({ direction, theme }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n`;\n\nexport const SummaryContainer = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 1;\n`;\n\nexport const SummaryItem = styled(Box)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n`;\n\nexport const ColorDot = styled(Box)<{ dotColor: string }>`\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: ${({ dotColor }) => dotColor};\n flex-shrink: 0;\n`;\n\nexport const SummaryInfo = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n`;\n\nexport const SummaryName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n`;\n\nexport const SummaryValue = styled(Typography)`\n font-size: 0.75rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n`;\n\nexport const SummaryPercentage = styled(Typography)`\n font-size: 1rem;\n font-weight: 600;\n flex-shrink: 0;\n`;\n\nexport const SummaryTrend = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const TableTrendCell = styled(Box)<{ direction: TrendDirection }>`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 16px;\n height: 16px;\n font-size: 16px;\n }\n`;\n\nexport const DesktopTableContainer = styled(Box)`\n display: block;\n @media (max-width: 767px) {\n display: none;\n }\n`;\n\nexport const MobileOffersContainer = styled(Box)`\n display: none;\n @media (max-width: 767px) {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n`;\n\nexport const MobileOfferCard = styled(Box)`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n padding: 16px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => theme.palette.divider};\n border-radius: 8px;\n`;\n\nexport const MobileOfferHeader = styled(Box)`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const MobileOfferName = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme }) => theme.palette.text.primary};\n word-break: break-word;\n`;\n\nexport const MobileOfferMetricsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid ${({ theme }) => theme.palette.divider};\n`;\n\nexport const MobileOfferMetricItem = styled(Box)`\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: center;\n`;\n\nexport const MobileOfferMetricLabel = styled(Typography)`\n font-size: 0.625rem;\n color: ${({ theme }) => theme.palette.text.secondary};\n text-transform: uppercase;\n`;\n\nexport const MobileOfferMetricValue = styled(Typography)`\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme.palette.text.primary};\n`;\n\nexport const MobileOfferTrendValue = styled(Typography)<{ direction: TrendDirection }>`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 0.875rem;\n font-weight: 600;\n color: ${({ theme, direction }) => {\n if (direction === 'up') return theme.palette.success.main;\n if (direction === 'down') return theme.palette.error.main;\n return theme.palette.text.secondary;\n }};\n\n svg {\n width: 14px;\n height: 14px;\n font-size: 14px;\n }\n`;\n","import { ColorUtils, styled } from '@nuskin/foundation-theme';\n\nconst { getGenomeColor } = ColorUtils;\n\nexport const FilterContainer = styled('div')`\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n flex-wrap: wrap;\n`;\n\nexport const FilterDropdown = styled('select')`\n min-width: 160px;\n height: 40px;\n padding: 8px 12px;\n background-color: ${({ theme }) => getGenomeColor(theme, 'N20')};\n border: 1px solid ${({ theme }) => getGenomeColor(theme, 'N40')};\n border-radius: 8px;\n font-size: 14px;\n font-weight: 400;\n color: ${({ theme }) => getGenomeColor(theme, 'N100')};\n cursor: pointer;\n outline: none;\n transition: all 0.2s ease;\n\n &:hover {\n background-color: ${({ theme }) => getGenomeColor(theme, 'N30')};\n }\n\n &:focus {\n border-color: ${({ theme }) => getGenomeColor(theme, 'A70')};\n box-shadow: 0 0 0 3px ${({ theme }) => getGenomeColor(theme, 'A20')};\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`;\n\nexport const FilterLabel = styled('label')`\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: ${({ theme }) => getGenomeColor(theme, 'N70')};\n`;\n","import React from 'react';\nimport { FilterContainer, FilterDropdown, FilterLabel } from './FilterBar.styled';\nimport type { FilterConfig } from './types';\nimport {\n getTranslation,\n ShoppingDashboardTranslationKeys as Keys,\n} from '../TranslationKeys/ShoppingDashboardTranslationKeys';\n\nexport interface FilterBarProps {\n readonly filters: FilterConfig[];\n readonly onChange: (filterKey: string, value: string) => void;\n}\n\nexport const FilterBar: React.FC<FilterBarProps> = ({ filters, onChange }) => {\n return (\n <FilterContainer data-testid=\"filter-bar\">\n {filters.map((filter) => (\n <FilterLabel key={filter.key} htmlFor={`filter-${filter.key}`}>\n {filter.label}\n <FilterDropdown\n id={`filter-${filter.key}`}\n value={filter.value}\n onChange={(e) => onChange(filter.key, e.target.value)}\n disabled={filter.disabled}\n aria-label={`${filter.label} ${getTranslation(Keys.ariaLabel.filterSuffix)}`}\n data-testid={`filter-dropdown-${filter.key}`}\n >\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </FilterDropdown>\n </FilterLabel>\n ))}\n </FilterContainer>\n );\n};\n","import type {\n DashboardStats,\n TopProduct,\n ConversionDataPoint,\n SignupDataPoint,\n CategoryRevenue,\n OrderHistory,\n SignupDetail,\n} from '../types.d';\n\nexport const mockStats: DashboardStats = {\n shopTitle: 'My NuSkin Shop',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$9,453',\n volume: '1,211',\n siteVisits: '17,935',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+12.5%',\n volume: '+8.3%',\n siteVisits: '-2.1%',\n },\n};\n\nexport const mockTopProducts: TopProduct[] = [\n {\n id: 'prod-001',\n rank: 1,\n name: 'ageLOC LumiSpa',\n imageUrl: '',\n unitsSold: 342,\n revenue: 29580,\n volume: 245,\n trend: { units: '+15%', revenue: '+12%', volume: '+8%' },\n },\n {\n id: 'prod-002',\n rank: 2,\n name: 'Pharmanex LifePak',\n imageUrl: '',\n unitsSold: 287,\n revenue: 24395,\n volume: 198,\n trend: { units: '+8%', revenue: '+10%', volume: '+5%' },\n },\n {\n id: 'prod-003',\n rank: 3,\n name: 'ageLOC Meta',\n imageUrl: '',\n unitsSold: 256,\n revenue: 21760,\n volume: 176,\n trend: { units: '-3%', revenue: '-1%', volume: '-2%' },\n },\n {\n id: 'prod-004',\n rank: 4,\n name: 'Nu Skin 180 System',\n imageUrl: '',\n unitsSold: 198,\n revenue: 17820,\n volume: 142,\n trend: { units: '+22%', revenue: '+18%', volume: '+15%' },\n },\n {\n id: 'prod-005',\n rank: 5,\n name: 'Epoch Baobab Body Butter',\n imageUrl: '',\n unitsSold: 176,\n revenue: 8800,\n volume: 88,\n trend: { units: '+5%', revenue: '+3%', volume: '+2%' },\n },\n];\n\nexport const mockConversionData: ConversionDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n rate: Number((4 + (i % 15) * 0.1).toFixed(2)),\n orders: 200 + ((i * 13) % 100),\n siteVisits: 4000 + ((i * 97) % 2000),\n };\n});\n\nexport const mockConversionDataStandard: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 1.35).toFixed(2)),\n orders: Math.round(point.orders * 0.7),\n}));\n\nexport const mockConversionDataSubscription: ConversionDataPoint[] = mockConversionData.map((point) => ({\n ...point,\n rate: Number((point.rate * 0.55).toFixed(2)),\n orders: Math.round(point.orders * 0.3),\n}));\n\nexport const mockSignupData: SignupDataPoint[] = Array.from({ length: 30 }, (_, i) => {\n const date = new Date('2026-03-01');\n date.setDate(date.getDate() + i);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const total = 80 + ((i * 11) % 40);\n const members = Math.floor(total * 0.4);\n const retail = Math.floor(total * 0.35);\n const brandAffiliates = total - members - retail;\n return {\n date: `${months[date.getMonth()]} ${date.getDate()}`,\n total,\n members,\n retail,\n brandAffiliates,\n };\n});\n\nexport const mockCategories: CategoryRevenue[] = [\n {\n id: 'cat-001',\n name: 'Favorites',\n revenue: 45200,\n percentage: 29,\n color: '#C95D63',\n trend: { revenue: '+8%', units: '+10%' },\n },\n {\n id: 'cat-002',\n name: 'Daily Routine',\n revenue: 42100,\n percentage: 27,\n color: '#6C7A9B',\n trend: { revenue: '+12%', units: '+15%' },\n },\n {\n id: 'cat-003',\n name: 'Fit & Trim Body',\n revenue: 34300,\n percentage: 22,\n color: '#E8975E',\n trend: { revenue: '-3%', units: '-1%' },\n },\n {\n id: 'cat-004',\n name: 'Dull Skin',\n revenue: 24900,\n percentage: 16,\n color: '#5F8FC4',\n trend: { revenue: '+5%', units: '+7%' },\n },\n {\n id: 'cat-005',\n name: 'Acne',\n revenue: 9400,\n percentage: 6,\n color: '#A2C3B3',\n trend: { revenue: '+2%', units: '+3%' },\n },\n];\n\nexport const mockOrders: OrderHistory[] = Array.from({ length: 50 }, (_, i) => {\n const firstNames = ['Sarah', 'John', 'Emma', 'Michael', 'Olivia', 'William', 'Ava', 'James'];\n const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n orderId: `ORD-${String(10000 + i).padStart(5, '0')}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n customerName: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n customerType: i % 3 === 0 ? 'Subscription' : 'Standard',\n items: (i % 5) + 1,\n total: Number((50 + ((i * 17) % 200) + (i % 10) * 0.1).toFixed(2)),\n bv: 30 + ((i * 9) % 150),\n };\n});\n\nexport const mockSignupDetails: SignupDetail[] = Array.from({ length: 30 }, (_, i) => {\n const firstNames = ['Alice', 'Bob', 'Carol', 'David', 'Eva', 'Frank', 'Grace', 'Henry'];\n const lastNames = ['Anderson', 'Baker', 'Clark', 'Davis', 'Evans', 'Fisher', 'Grant', 'Hall'];\n const types: ('Member' | 'Retail' | 'Brand Affiliate')[] = ['Member', 'Retail', 'Brand Affiliate'];\n const date = new Date('2026-03-31');\n date.setDate(date.getDate() - (i % 30));\n return {\n id: `SU-${String(1000 + i).padStart(4, '0')}`,\n name: `${firstNames[i % firstNames.length]} ${lastNames[i % lastNames.length]}`,\n date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n type: types[i % types.length],\n email: `${firstNames[i % firstNames.length].toLowerCase()}.${lastNames[i % lastNames.length].toLowerCase()}@example.com`,\n status: i % 4 === 0 ? 'Pending' : 'Active',\n };\n});\n","import type { ProductOfferDashboardStats, TopPerformingOffer } from '../types.d';\n\nexport { mockTopProducts, mockConversionData, mockOrders } from './mockDashboardData';\n\nexport const mockProductOfferStats: ProductOfferDashboardStats = {\n shopTitle: 'Performance Overview',\n dateRange: {\n start: '2026-03-01',\n end: '2026-03-31',\n label: 'Mar 1 - Mar 31',\n },\n selectedMarket: 'all',\n metrics: {\n revenue: '$5,208',\n offersPurchased: '285',\n conversionRate: '4.2%',\n },\n trend: {\n revenue: '+2.3%',\n offersPurchased: '+3.7%',\n },\n};\n\nexport const mockProductOfferStatsPositiveTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+5.1%',\n offersPurchased: '+12.5%',\n },\n};\n\nexport const mockProductOfferStatsNegativeTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '-1.8%',\n offersPurchased: '-3.7%',\n },\n};\n\nexport const mockProductOfferStatsNeutralTrend: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockProductOfferStatsZeroOffers: ProductOfferDashboardStats = {\n ...mockProductOfferStats,\n metrics: {\n ...mockProductOfferStats.metrics,\n offersPurchased: '0',\n },\n trend: {\n revenue: '+0%',\n offersPurchased: '+0%',\n },\n};\n\nexport const mockTopOffers: TopPerformingOffer[] = [\n {\n id: 'offer-1',\n name: 'Winter Skincare Bundle',\n revenue: 2800,\n percentage: 29,\n color: '#6B8E7B',\n trend: { revenue: '-4.2%' },\n },\n {\n id: 'offer-2',\n name: 'Supplement Starter Pack',\n revenue: 2500,\n percentage: 27,\n color: '#E8915A',\n trend: { revenue: '+3.1%' },\n },\n {\n id: 'offer-3',\n name: 'Holiday Special Bundle',\n revenue: 2100,\n percentage: 22,\n color: '#C75B5B',\n trend: { revenue: '-1.5%' },\n },\n {\n id: 'offer-4',\n name: 'LumiSpa Cleansing Kit',\n revenue: 1500,\n percentage: 16,\n color: '#5B8EC7',\n trend: { revenue: '+2.8%' },\n },\n {\n id: 'offer-5',\n name: 'Daily Wellness Bundle',\n revenue: 529,\n percentage: 6,\n color: '#9B8EC7',\n trend: { revenue: '+7.2%' },\n },\n];\n"]}
|