@embedreach/components 0.1.12 → 0.1.14
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/chunks/B4MFY5CR.js +12394 -0
- package/dist/chunks/HO4MOOFI.js +38 -0
- package/dist/chunks/HUY7CZI3.js +47 -0
- package/dist/chunks/index.js +37019 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.es.js +7 -0
- package/dist/index.umd.js +1233 -0
- package/dist/styles.css +1 -0
- package/package.json +21 -11
- package/dist/AdDashboard-BEWUbw3u.js +0 -2535
- package/dist/AdDashboard-BEWUbw3u.js.map +0 -1
- package/dist/AdMetricsDashboardHeader-V03rQC0y.js +0 -23
- package/dist/AdMetricsDashboardHeader-V03rQC0y.js.map +0 -1
- package/dist/assets/style-Dpp-A13q.css +0 -1
- package/dist/assets/style-J0h0u-n8.css +0 -1
- package/dist/index-OHOroL_D.js +0 -17027
- package/dist/index-OHOroL_D.js.map +0 -1
- package/dist/reach.es.js +0 -6
- package/dist/reach.es.js.map +0 -1
- package/dist/reach.umd.js +0 -16
- package/dist/reach.umd.js.map +0 -1
- package/dist/styles.module-B1IY0-9d.js +0 -342
- package/dist/styles.module-B1IY0-9d.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdDashboard-BEWUbw3u.js","sources":["../../common/layouts/common/empty-state/EmptyStateLayout.tsx","../../common/context/DashboardFilterContext.tsx","../../common/hooks/useDashboardFilterContext.ts","../../common/components/dashboard/action-bar/date-range-picker/DateRangePicker.tsx","../../common/services/ad-metrics/api.ts","../../common/services/ad-metrics/queries.ts","../../common/services/ad-metrics/meta/api.ts","../../common/services/ad-metrics/meta/queries.ts","../../common/hooks/useCombinedMetrics.ts","../../common/components/dashboard/action-bar/channel-filter/ChannelFilter.tsx","../../common/components/dashboard/action-bar/ActionBar.tsx","../../common/components/dashboard/metrics/config/metrics.config.ts","../../common/components/ui/tooltip.tsx","../../common/components/dashboard/metrics/MetricCard/MetricCard.tsx","../../common/components/dashboard/metrics/MetricsRow/MetricsRow.tsx","../../common/components/ui/chart.tsx","../../common/components/dashboard/charts/roas/ROASChartLegend.tsx","../../common/hooks/useCombinedTimeSeriesMetrics.ts","../../common/utils/currencyUtils.ts","../../common/components/dashboard/charts/roas/ROASChart.tsx","../../../../../../node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../../../../node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../../../../node_modules/@tanstack/react-virtual/dist/esm/index.js","../../common/services/partner-resources/api.ts","../../common/services/partner-resources/queries.ts","../../common/components/dashboard/tables/client-acquisition/cells/SourceCell.tsx","../../common/components/dashboard/tables/client-acquisition/cells/SpendCell.tsx","../../common/components/dashboard/tables/client-acquisition/cells/StatusCell.tsx","../../common/components/dashboard/tables/client-acquisition/ClientAcquisitionTable.tsx","../../common/components/dashboard/tables/channel-performance/ChannelPerformanceTable.tsx","../../common/components/dashboard/tabs/DashboardTabs.tsx","../../common/components/ui/banner/banner.tsx","../../common/layouts/ad-metrics-dashboard/AdDashboard.tsx"],"sourcesContent":["import { Button } from '../../../components/ui/button';\nimport { EmptyStateLayoutProps } from './types';\nimport styles from './styles.module.css';\n\nexport const EmptyStateLayout = ({\n title,\n description,\n buttonText,\n onButtonClick,\n className,\n}: EmptyStateLayoutProps) => {\n return (\n <div className={`${styles.container} ${className}`}>\n <p className={styles.title}>{title}</p>\n <p className={styles.description}>{description}</p>\n {buttonText && onButtonClick && (\n <Button size=\"lg\" onClick={onButtonClick} className={styles.button}>\n {buttonText}\n </Button>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport createDataContext from './createDataContext';\nimport type { DateRange } from '../services/ad-metrics';\nimport { calculateDateRange } from '../utils/dateUtils';\n\nexport type Channel = 'google' | 'meta' | 'all';\n\nexport interface DashboardFilterState {\n dateRange: DateRange | undefined;\n channel: Channel;\n campaignId?: string;\n}\n\ntype DashboardFilterAction =\n | { type: 'SET_DATE_RANGE'; payload: DateRange | undefined }\n | { type: 'SET_CHANNEL'; payload: Channel }\n | { type: 'SET_CAMPAIGN_ID'; payload: string | undefined };\n\nexport interface DashboardFilterContextValue {\n state: DashboardFilterState;\n updateDateRange: (dateRange: DateRange | undefined) => void;\n updateChannel: (channel: Channel) => void;\n updateCampaignId: (campaignId: string | undefined) => void;\n}\n\nconst dashboardFilterReducer = (\n state: DashboardFilterState,\n action: DashboardFilterAction,\n): DashboardFilterState => {\n switch (action.type) {\n case 'SET_DATE_RANGE':\n return { ...state, dateRange: action.payload };\n case 'SET_CHANNEL':\n return { ...state, channel: action.payload };\n case 'SET_CAMPAIGN_ID':\n return { ...state, campaignId: action.payload };\n default:\n return state;\n }\n};\n\nconst updateDateRange =\n (dispatch: React.Dispatch<DashboardFilterAction>) =>\n (dateRange: DateRange | undefined): void => {\n dispatch({ type: 'SET_DATE_RANGE', payload: dateRange });\n };\n\nconst updateChannel =\n (dispatch: React.Dispatch<DashboardFilterAction>) =>\n (channel: Channel): void => {\n dispatch({ type: 'SET_CHANNEL', payload: channel });\n };\n\nconst updateCampaignId =\n (dispatch: React.Dispatch<DashboardFilterAction>) =>\n (campaignId: string | undefined): void => {\n dispatch({ type: 'SET_CAMPAIGN_ID', payload: campaignId });\n };\n\nconst defaultState: DashboardFilterState = {\n dateRange: calculateDateRange('last-month'),\n channel: 'all',\n campaignId: undefined,\n};\n\nexport const { Context, Provider } = createDataContext<\n DashboardFilterState,\n DashboardFilterAction,\n DashboardFilterContextValue\n>(\n dashboardFilterReducer,\n {\n updateDateRange,\n updateChannel,\n updateCampaignId,\n },\n defaultState,\n);\n","import { useContext } from 'react';\nimport { Context as DashboardFilterContext } from '../context/DashboardFilterContext';\nimport type { DashboardFilterContextValue } from '../context/DashboardFilterContext';\n\nconst useDashboardFilterContext = (): DashboardFilterContextValue => {\n const context = useContext(DashboardFilterContext);\n\n if (context === undefined) {\n throw new Error(\n 'useDashboardFilterContext must be used within an DashboardFilterContext',\n );\n }\n\n return context;\n};\n\nexport default useDashboardFilterContext;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { format } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\n\nimport { Calendar } from '../../../ui/calendar';\nimport {\n Select,\n SelectContent,\n SelectValue,\n SelectItem,\n SelectTrigger,\n} from '../../../ui/select';\nimport { Button } from '../../../ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../ui/popover';\nimport { calculateDateRange } from '../../../../utils/dateUtils';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport type { DateRangePreset } from './DateRangePicker.types';\nimport styles from './styles.module.css';\n\nconst DateRangePicker = () => {\n const { state, updateDateRange } = useDashboardFilterContext();\n const [preset, setPreset] = React.useState<DateRangePreset>('last-month');\n const { t } = useTranslation();\n\n const handlePresetChange = (value: DateRangePreset) => {\n const newRange = calculateDateRange(value);\n setPreset(value);\n updateDateRange(newRange);\n };\n\n return (\n <div className={styles.container}>\n <div className={styles.controlsGroup}>\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <CalendarIcon className=\"h-4 w-4 mr-2\" />\n {state.dateRange?.from ? (\n state.dateRange.to ? (\n <>\n {format(state.dateRange.from, 'LLL dd, y')} -{' '}\n {format(state.dateRange.to, 'LLL dd, y')}\n </>\n ) : (\n format(state.dateRange.from, 'LLL dd, y')\n )\n ) : (\n t('select_dates')\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"border-b p-3\">\n <Select onValueChange={handlePresetChange} value={preset}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select preset\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"last-week\">\n {t('dates.last_week')}\n </SelectItem>\n <SelectItem value=\"last-month\">\n {t('dates.last_month')}\n </SelectItem>\n <SelectItem value=\"last-quarter\">\n {t('dates.last_quarter')}\n </SelectItem>\n <SelectItem value=\"last-year\">\n {t('dates.last_year')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n <Calendar\n initialFocus\n mode=\"range\"\n defaultMonth={state.dateRange?.from}\n selected={state.dateRange}\n onSelect={updateDateRange}\n numberOfMonths={2}\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n );\n};\n\nexport default DateRangePicker;\n","import { baseRequest, GOOGLE_ADS_METRICS_PATH } from '../../api/';\nimport { formatDateToString } from '../../utils/dateUtils';\nimport type { AggregatedMetrics, TimeSeriesDataPoint } from './types';\n\nexport const googleAdMetricsKeys = {\n all: ['googleAdMetrics'] as const,\n aggregatedByBusiness: (startDate: string, endDate: string) =>\n [\n ...googleAdMetricsKeys.all,\n 'aggregated',\n 'business',\n startDate,\n endDate,\n ] as const,\n aggregatedByCampaign: (\n campaignId: string,\n startDate: string,\n endDate: string,\n ) =>\n [\n ...googleAdMetricsKeys.all,\n 'aggregated',\n 'campaign',\n campaignId,\n startDate,\n endDate,\n ] as const,\n timeSeriesByBusiness: (startDate: string, endDate: string) =>\n [\n ...googleAdMetricsKeys.all,\n 'timeseries',\n 'business',\n startDate,\n endDate,\n ] as const,\n};\n\nexport const getAggregatedMetricsByBusiness = async (\n startDate: Date,\n endDate: Date,\n): Promise<AggregatedMetrics> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<AggregatedMetrics>(\n `${GOOGLE_ADS_METRICS_PATH}/aggregatedByBusinessId?${queryParams}`,\n );\n\n return response.data;\n};\n\nexport const getAggregatedMetricsByCampaign = async (\n campaignId: string,\n startDate: Date,\n endDate: Date,\n): Promise<AggregatedMetrics> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n campaignId,\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<AggregatedMetrics>(\n `${GOOGLE_ADS_METRICS_PATH}/aggregatedByCampaignId?${queryParams}`,\n );\n\n return response.data;\n};\n\nexport const getTimeSeriesMetricsByBusiness = async (\n startDate: Date,\n endDate: Date,\n): Promise<TimeSeriesDataPoint[]> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<TimeSeriesDataPoint[]>(\n `${GOOGLE_ADS_METRICS_PATH}/timeseriesbybusinessid?${queryParams}`,\n );\n\n return response.data;\n};\n","import { useQuery } from '@tanstack/react-query';\nimport {\n googleAdMetricsKeys,\n getAggregatedMetricsByBusiness,\n getAggregatedMetricsByCampaign,\n getTimeSeriesMetricsByBusiness,\n} from './api';\nimport { CACHE_STANDARD } from '../../api/queryClientConfig';\nimport { useAdAccount } from '../ad-accounts';\nimport type { DateRange } from './types';\nimport { formatDateToString } from '../../utils/dateUtils';\n\nexport const useAggregatedMetricsByBusiness = (dateRange?: DateRange) => {\n const { account } = useAdAccount('google');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? googleAdMetricsKeys.aggregatedByBusiness(\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : googleAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getAggregatedMetricsByBusiness(dateRange.from, dateRange.to);\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n\nexport const useAggregatedMetricsByCampaign = (\n campaignId: string,\n dateRange?: DateRange,\n) => {\n const { account } = useAdAccount('google');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n campaignId &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? googleAdMetricsKeys.aggregatedByCampaign(\n campaignId,\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : googleAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getAggregatedMetricsByCampaign(\n campaignId,\n dateRange.from,\n dateRange.to,\n );\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n\nexport const useTimeSeriesMetrics = (dateRange?: DateRange) => {\n const { account } = useAdAccount('google');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? googleAdMetricsKeys.timeSeriesByBusiness(\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : googleAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getTimeSeriesMetricsByBusiness(dateRange.from, dateRange.to);\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n","import { baseRequest, META_ADS_METRICS_PATH } from '../../../api/';\nimport { formatDateToString } from '../../../utils/dateUtils';\nimport type { AggregatedMetrics, TimeSeriesDataPoint } from '../types';\n\nexport const metaAdMetricsKeys = {\n all: ['metaAdMetrics'] as const,\n aggregatedByBusiness: (startDate: string, endDate: string) =>\n [\n ...metaAdMetricsKeys.all,\n 'aggregated',\n 'business',\n startDate,\n endDate,\n ] as const,\n aggregatedByCampaign: (\n campaignId: string,\n startDate: string,\n endDate: string,\n ) =>\n [\n ...metaAdMetricsKeys.all,\n 'aggregated',\n 'campaign',\n campaignId,\n startDate,\n endDate,\n ] as const,\n timeSeriesByBusiness: (startDate: string, endDate: string) =>\n [\n ...metaAdMetricsKeys.all,\n 'timeseries',\n 'business',\n startDate,\n endDate,\n ] as const,\n};\n\nexport const getAggregatedMetricsByBusiness = async (\n startDate: Date,\n endDate: Date,\n): Promise<AggregatedMetrics> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<AggregatedMetrics>(\n `${META_ADS_METRICS_PATH}/aggregatedbybusinessid?${queryParams}`,\n );\n\n return response.data;\n};\n\nexport const getAggregatedMetricsByCampaign = async (\n campaignId: string,\n startDate: Date,\n endDate: Date,\n): Promise<AggregatedMetrics> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n campaignId,\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<AggregatedMetrics>(\n `${META_ADS_METRICS_PATH}/aggregatedbycampaignid?${queryParams}`,\n );\n\n return response.data;\n};\n\nexport const getTimeSeriesMetricsByBusiness = async (\n startDate: Date,\n endDate: Date,\n): Promise<TimeSeriesDataPoint[]> => {\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n }).toString();\n\n const response = await baseRequest<TimeSeriesDataPoint[]>(\n `${META_ADS_METRICS_PATH}/timeseriesbybusinessid?${queryParams}`,\n );\n\n return response.data;\n};\n","import { useQuery } from '@tanstack/react-query';\nimport {\n metaAdMetricsKeys,\n getAggregatedMetricsByBusiness,\n getAggregatedMetricsByCampaign,\n getTimeSeriesMetricsByBusiness,\n} from './api';\nimport { CACHE_STANDARD } from '../../../api/queryClientConfig';\nimport { useAdAccount } from '../../ad-accounts';\nimport type { DateRange } from '../types';\nimport { formatDateToString } from '../../../utils/dateUtils';\n\nexport const useAggregatedMetricsByBusiness = (dateRange?: DateRange) => {\n const { account } = useAdAccount('meta');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? metaAdMetricsKeys.aggregatedByBusiness(\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : metaAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getAggregatedMetricsByBusiness(dateRange.from, dateRange.to);\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n\nexport const useAggregatedMetricsByCampaign = (\n campaignId: string,\n dateRange?: DateRange,\n) => {\n const { account } = useAdAccount('meta');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n campaignId &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? metaAdMetricsKeys.aggregatedByCampaign(\n campaignId,\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : metaAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getAggregatedMetricsByCampaign(\n campaignId,\n dateRange.from,\n dateRange.to,\n );\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n\nexport const useTimeSeriesMetrics = (dateRange?: DateRange) => {\n const { account } = useAdAccount('meta');\n\n const isEnabled = Boolean(\n account?.status === 'connected' &&\n dateRange?.from instanceof Date &&\n dateRange?.to instanceof Date,\n );\n\n return useQuery({\n queryKey: isEnabled\n ? metaAdMetricsKeys.timeSeriesByBusiness(\n formatDateToString(dateRange!.from as Date),\n formatDateToString(dateRange!.to as Date),\n )\n : metaAdMetricsKeys.all,\n queryFn: () => {\n if (!dateRange?.from || !dateRange?.to) {\n throw new Error('Date range is required');\n }\n return getTimeSeriesMetricsByBusiness(dateRange.from, dateRange.to);\n },\n ...CACHE_STANDARD,\n enabled: isEnabled,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n staleTime: 0, // Force refetch when dates change\n });\n};\n","import { useMemo } from 'react';\nimport { useAggregatedMetricsByBusiness as useGoogleMetrics } from '../services/ad-metrics';\nimport { useAggregatedMetricsByBusiness as useMetaMetrics } from '../services/ad-metrics/meta';\nimport type { DateRange } from '../services/ad-metrics/types';\nimport type { Channel } from '../context/DashboardFilterContext';\n\nconst safeParseFloat = (value: string | undefined | null): number => {\n if (!value) return 0;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? 0 : parsed;\n};\n\nconst calculateRoas = (\n revenue: string | undefined | null,\n spend: string | undefined | null,\n): string => {\n const revenueNum = safeParseFloat(revenue);\n const spendNum = safeParseFloat(spend);\n\n if (spendNum === 0) return '0';\n return (revenueNum / spendNum).toFixed(2);\n};\n\nexport const useCombinedMetrics = (\n dateRange: DateRange | undefined,\n channel: Channel,\n) => {\n const {\n data: googleData,\n isLoading: isGoogleLoading,\n error: googleError,\n } = useGoogleMetrics(dateRange);\n\n const {\n data: metaData,\n isLoading: isMetaLoading,\n error: metaError,\n } = useMetaMetrics(dateRange);\n\n // Determine which channels have data\n const availableChannels = useMemo(() => {\n const channels: Channel[] = [];\n if (googleData) channels.push('google');\n if (metaData) channels.push('meta');\n if (channels.length > 1) channels.push('all');\n return channels;\n }, [googleData, metaData]);\n\n // Determine active sources based on channel and available data\n const sources = useMemo(() => {\n const activeSources: ('google' | 'meta')[] = [];\n\n if (channel === 'all') {\n if (googleData) activeSources.push('google');\n if (metaData) activeSources.push('meta');\n } else if (channel === 'google' && googleData) {\n activeSources.push('google');\n } else if (channel === 'meta' && metaData) {\n activeSources.push('meta');\n }\n\n return activeSources;\n }, [channel, googleData, metaData]);\n\n const data = useMemo(() => {\n if (channel === 'google') return googleData;\n if (channel === 'meta') return metaData;\n if (channel === 'all' && googleData && metaData) {\n const combinedAdsSpend =\n safeParseFloat(googleData.ads_spend) +\n safeParseFloat(metaData.ads_spend);\n\n const combinedMeasuredRevenue =\n safeParseFloat(googleData.measured_revenue) +\n safeParseFloat(metaData.measured_revenue);\n\n return {\n ...googleData,\n ads_spend: combinedAdsSpend.toString(),\n clicks: (googleData.clicks || 0) + (metaData.clicks || 0),\n impressions:\n (googleData.impressions || 0) + (metaData.impressions || 0),\n measured_revenue: combinedMeasuredRevenue.toString(),\n roas: calculateRoas(\n combinedMeasuredRevenue.toString(),\n combinedAdsSpend.toString(),\n ),\n campaign_ids: [\n ...(googleData.campaign_ids || []),\n ...(metaData.campaign_ids || []),\n ],\n };\n }\n return googleData || metaData || null;\n }, [channel, googleData, metaData]);\n\n return {\n data,\n isLoading: isGoogleLoading || isMetaLoading,\n error: googleError || metaError || null,\n sources,\n availableChannels,\n };\n};\n","import { FilterIcon, TvMinimalPlayIcon } from 'lucide-react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Button } from '../../../ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '../../../ui/dropdown-menu';\nimport { GoogleIcon, MetaIcon } from '../../../../icons';\nimport styles from './styles.module.css';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport { useCombinedMetrics } from '../../../../hooks/useCombinedMetrics';\nimport { Channel } from '../../../../context/DashboardFilterContext';\n\nconst ChannelFilter = () => {\n const { state, updateChannel } = useDashboardFilterContext();\n const { availableChannels } = useCombinedMetrics(\n state.dateRange,\n state.channel,\n );\n\n const getChannelNameAndIcon = (channel: Channel) => {\n if (channel === 'google')\n return {\n name: 'Google Ads',\n icon: <GoogleIcon className={styles.channelIcon} />,\n };\n if (channel === 'meta')\n return {\n name: 'Meta Ads',\n icon: <MetaIcon className={styles.channelIcon} />,\n };\n return {\n name: 'All Channels',\n icon: <TvMinimalPlayIcon className={styles.channelIcon} />,\n };\n };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className={styles.filterButton}>\n <FilterIcon className={styles.filterIcon} />\n </Button>\n </DropdownMenuTrigger>\n <AnimatePresence>\n <DropdownMenuContent sideOffset={8} className={styles.content}>\n <motion.div\n className={styles.container}\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.15 }}>\n <div className={styles.header}>Channel Selection</div>\n\n <div className={styles.options}>\n {availableChannels.map(channel => {\n const { name: channelName, icon: channelIcon } =\n getChannelNameAndIcon(channel);\n return (\n <motion.div\n key={channel}\n className={styles.option}\n whileHover={{ backgroundColor: 'var(--hover-bg)' }}\n whileTap={{ scale: 0.98 }}\n onClick={() => updateChannel(channel)}>\n <input\n type=\"checkbox\"\n checked={\n state.channel === channel || state.channel === 'all'\n }\n className={styles.checkbox}\n onChange={() => {}}\n />\n {channelIcon}\n <span className={styles.channelName}>{channelName}</span>\n </motion.div>\n );\n })}\n </div>\n </motion.div>\n </DropdownMenuContent>\n </AnimatePresence>\n </DropdownMenu>\n );\n};\n\nexport default ChannelFilter;\n","import { DateRangePicker } from './date-range-picker';\nimport { ChannelFilter } from './channel-filter';\nimport styles from './styles.module.css';\n\nconst ActionBar = () => {\n return (\n <div className={styles.container}>\n <div className={styles.controlsGroup}>\n <DateRangePicker />\n <ChannelFilter />\n </div>\n </div>\n );\n};\n\nexport default ActionBar;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { AggregatedMetrics } from '../../../../services/ad-metrics/types';\n\nexport interface MetricConfig {\n id: string;\n title: string;\n description: string;\n dataKey: keyof AggregatedMetrics;\n formatter: (value: string) => string;\n}\n\nexport const useMetricsConfig = (): MetricConfig[] => {\n const { t } = useTranslation();\n\n return useMemo(\n () => [\n {\n id: 'ads_spend',\n title: t('dashboard.metrics.ads_spend'),\n description: t('dashboard.metrics.ads_spend_description'),\n dataKey: 'ads_spend',\n formatter: (value: string) =>\n value ? `$${Number(value).toFixed(2)}` : '0',\n },\n {\n id: 'measured_revenue',\n title: t('dashboard.metrics.measured_revenue'),\n description: t('dashboard.metrics.measured_revenue_description'),\n dataKey: 'measured_revenue',\n formatter: (value: string) =>\n value ? `$${Number(value).toFixed(2)}` : '0',\n },\n {\n id: 'measured_conversions',\n title: t('dashboard.metrics.measured_conversions'),\n description: t('dashboard.metrics.measured_conversions_description'),\n dataKey: 'measured_conversions',\n formatter: (value: string) =>\n value ? `${Number(value).toFixed(0)}` : '0',\n },\n {\n id: 'roas',\n title: t('dashboard.metrics.roas'),\n description: t('dashboard.metrics.roas_description'),\n dataKey: 'roas',\n formatter: (value: string) => (value ? `${value}x` : '0'),\n },\n {\n id: 'impressions',\n title: t('dashboard.metrics.impressions'),\n description: t('dashboard.metrics.impressions_description'),\n dataKey: 'impressions',\n formatter: (value: string) => (value ? value.toLocaleString() : '0'),\n },\n {\n id: 'clicks',\n title: t('dashboard.metrics.clicks'),\n description: t('dashboard.metrics.clicks_description'),\n dataKey: 'clicks',\n formatter: (value: string) => (value ? value.toLocaleString() : '0'),\n },\n {\n id: 'website_visitors',\n title: t('dashboard.metrics.website_visitors'),\n description: t('dashboard.metrics.website_visitors_description'),\n dataKey: 'website_visitors',\n formatter: (value: string) => (value ? value.toLocaleString() : '0'),\n },\n {\n id: 'new_leads',\n title: t('dashboard.metrics.new_leads'),\n description: t('dashboard.metrics.new_leads_description'),\n dataKey: 'new_leads',\n formatter: (value: string) => (value ? value.toLocaleString() : '0'),\n },\n {\n id: 'customer_ltv',\n title: t('dashboard.metrics.customer_ltv'),\n description: t('dashboard.metrics.customer_ltv_description'),\n dataKey: 'customer_ltv',\n formatter: (value: string) =>\n value ? `$${Number(value).toFixed(2)}` : '0',\n },\n ],\n [t],\n );\n};\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import { TvMinimalPlayIcon } from 'lucide-react';\nimport { GoogleIcon, MetaIcon } from '../../../../icons';\nimport { cn } from '../../../../utils/cn';\nimport { Card } from '../../../ui/card';\nimport { Skeleton } from '../../../ui/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../../ui/tooltip';\nimport type { MetricCardProps, Source } from './MetricCard.types';\nimport styles from './styles.module.css';\n\nexport const MetricCard = ({\n title,\n value,\n description,\n isLoading,\n className,\n sources,\n}: MetricCardProps) => {\n if (isLoading) {\n return (\n <Card className={`${styles.card} ${className}`}>\n <div className={styles.content}>\n <div className={styles.header}>\n <div className={styles.titleRow}>\n <Skeleton\n className={styles.titleSkeleton}\n data-testid=\"title-skeleton\"\n />\n <div className={styles.rightColumn}>\n <Skeleton\n className={styles.infoIconSkeleton}\n data-testid=\"info-icon-skeleton\"\n />\n <Skeleton\n className={styles.badgeSkeleton}\n data-testid=\"badge-skeleton\"\n />\n </div>\n </div>\n </div>\n <Skeleton\n className={styles.valueSkeleton}\n data-testid=\"value-skeleton\"\n />\n {/* uncomment if/when we show some footer in the card */}\n {/* <div className={styles.footer}>\n <Skeleton\n className={styles.footerSkeleton}\n data-testid=\"footer-skeleton\"\n />\n </div> */}\n </div>\n </Card>\n );\n }\n\n const getSourceIconAndTooltip = (sources: Source[]) => {\n if (sources?.length === 1) {\n if (sources[0].type === 'google')\n return {\n icon: <GoogleIcon className={styles.platformIcon} />,\n tooltip: `${description} (Google Ads)`,\n };\n if (sources[0].type === 'meta')\n return {\n icon: <MetaIcon className={styles.platformIcon} />,\n tooltip: `${description} (Meta Ads)`,\n };\n }\n\n return {\n icon: (\n <TvMinimalPlayIcon\n className={styles.platformIcon}\n data-testid=\"all-channels-icon\"\n />\n ),\n tooltip: `${description} (All Channels)`,\n };\n };\n\n const { icon, tooltip } = getSourceIconAndTooltip(sources);\n\n return (\n <Card className={cn(styles.card, className)}>\n <div className={styles.content}>\n <div className={styles.header}>\n <div className={styles.titleRow}>\n <div className={styles.titleContainer}>\n <span className={styles.cardTitle}>{title}</span>\n </div>\n <div className={styles.rightColumn}>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>{icon}</TooltipTrigger>\n <TooltipContent>\n <p className={styles.tooltipText}>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n </div>\n\n <div className={styles.valueContainer}>\n <div className={styles.metricValue}>{value ?? '0'}</div>\n {/* maybe show a comparison to the previous period */}\n {/* <div className={styles.footer}>\n <div\n className={`${styles.footerContent} ${isPositiveTrend ? styles.positive : styles.negative}`}>\n {isPositiveTrend ? (\n <TrendingUpIcon className={styles.trendIcon} />\n ) : (\n <TrendingDownIcon className={styles.trendIcon} />\n )}\n <span className={styles.footerText}>Since last period</span>\n </div>\n </div> */}\n </div>\n </div>\n </Card>\n );\n};\n","import { useMetricsConfig } from '../config/metrics.config';\nimport { MetricCard } from '../MetricCard';\nimport styles from './styles.module.css';\nimport { useCombinedMetrics } from '../../../../hooks/useCombinedMetrics';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport { GoogleIcon, MetaIcon } from '../../../../icons'; // Assuming you have these icons\n\nexport const MetricsRow = () => {\n const { state } = useDashboardFilterContext();\n const { data, isLoading, sources } = useCombinedMetrics(\n state.dateRange,\n state.channel,\n );\n const metricsConfig = useMetricsConfig();\n\n return (\n <div className={styles.metricsContainer}>\n {metricsConfig.map(metric => (\n <MetricCard\n key={metric.id}\n title={metric.title}\n value={metric.formatter(data?.[metric.dataKey] as string)}\n description={metric.description}\n isLoading={isLoading}\n sources={sources.map(source => ({\n icon: source === 'google' ? <GoogleIcon /> : <MetaIcon />,\n type: source,\n }))}\n />\n ))}\n </div>\n );\n};\n","import * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n// these came out-of-the-box with shadcn chart install are unused\n// import {\n// NameType,\n// Payload,\n// ValueType,\n// } from 'recharts/types/component/DefaultTooltipContent';\n\nimport { cn } from '../../utils/cn';\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const;\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n );\n};\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children'];\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className,\n )}\n {...props}>\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n});\nChartContainer.displayName = 'Chart';\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color,\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join('\\n')}\n}\n`,\n )\n .join('\\n'),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref,\n ) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item.dataKey || item.name || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className,\n )}>\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}>\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n },\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}>\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nChartTooltipContent.displayName = 'ChartTooltip';\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> &\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\n hideIcon?: boolean;\n nameKey?: string;\n }\n>(\n (\n { className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey },\n ref,\n ) => {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className,\n )}>\n {payload.map(item => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground',\n )}>\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n },\n);\nChartLegendContent.displayName = 'ChartLegend';\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string,\n) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload &&\n typeof payload.payload === 'object' &&\n payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === 'string'\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string;\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config];\n}\n\nexport {\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n ChartTooltip,\n ChartTooltipContent,\n};\n","import { useTranslation } from 'react-i18next';\nimport styles from '../styles.module.css';\n\nconst ROASChartLegend = () => {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-row items-center justify-center gap-2 mt-1\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className={`w-2 h-2 rounded-full ${styles.legendSpend}`} />\n <span className=\"text-xs font-medium ml-1\">\n {t('dashboard.channel_performance.spend')}\n </span>\n </div>\n <div className=\"flex flex-row items-center justify-between\">\n <div className={`w-2 h-2 rounded-full ${styles.legendRevenue}`} />\n <span className=\"text-xs font-medium ml-1\">\n {t('dashboard.channel_performance.revenue')}\n </span>\n </div>\n </div>\n );\n};\n\nexport default ROASChartLegend;\n","import { useMemo } from 'react';\nimport { useTimeSeriesMetrics as useGoogleTimeSeriesMetrics } from '../services/ad-metrics';\nimport { useTimeSeriesMetrics as useMetaTimeSeriesMetrics } from '../services/ad-metrics/meta';\nimport type { DateRange } from '../services/ad-metrics/types';\nimport type { Channel } from '../context/DashboardFilterContext';\n\nexport interface TimeSeriesPoint {\n date: string;\n ads_spend: string;\n measured_revenue: string;\n}\n\nexport interface CumulativeDataPoint extends TimeSeriesPoint {\n cumulative_spend: number;\n cumulative_revenue: number;\n cumulative_roas: number;\n}\n\nexport const useCombinedTimeSeriesMetrics = (\n dateRange: DateRange | undefined,\n channel: Channel,\n) => {\n const {\n data: googleData,\n isLoading: googleIsLoading,\n error: googleError,\n } = useGoogleTimeSeriesMetrics(dateRange);\n\n const {\n data: metaData,\n isLoading: metaIsLoading,\n error: metaError,\n } = useMetaTimeSeriesMetrics(dateRange);\n\n const data: CumulativeDataPoint[] = useMemo(() => {\n if (!googleData && !metaData) return [];\n\n const dateMap = new Map<string, TimeSeriesPoint>();\n\n if (channel === 'google' || channel === 'all') {\n googleData?.forEach(point => {\n dateMap.set(point.date, {\n date: point.date,\n ads_spend: point.ads_spend || '0',\n measured_revenue: point.measured_revenue || '0',\n });\n });\n }\n\n if (channel === 'meta' || channel === 'all') {\n metaData?.forEach(point => {\n const existing = dateMap.get(point.date);\n dateMap.set(point.date, {\n date: point.date,\n ads_spend: (\n (Number(existing?.ads_spend) || 0) + (Number(point.ads_spend) || 0)\n ).toString(),\n measured_revenue: (\n (Number(existing?.measured_revenue) || 0) +\n (Number(point.measured_revenue) || 0)\n ).toString(),\n });\n });\n }\n\n const combinedData = Array.from(dateMap.values()).sort(\n (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(),\n );\n\n let spendTotal = 0;\n let revenueTotal = 0;\n\n return combinedData.map(point => {\n spendTotal += Number(point.ads_spend) || 0;\n revenueTotal += Number(point.measured_revenue) || 0;\n const roasValue =\n spendTotal > 0 ? Number((revenueTotal / spendTotal).toFixed(2)) : 0;\n\n return {\n ...point,\n cumulative_spend: spendTotal,\n cumulative_revenue: revenueTotal,\n cumulative_roas: roasValue,\n };\n });\n }, [googleData, metaData, channel]);\n\n return {\n data,\n isLoading: googleIsLoading || metaIsLoading,\n error: googleError || metaError || null,\n };\n};\n","export const formatCurrency = (amount: number): string =>\n new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { cn } from '../../../../utils/cn';\n\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from '../../../../components/ui/card';\nimport { ChartConfig, ChartContainer } from '../../../../components/ui/chart';\nimport { Skeleton } from '../../../../components/ui/skeleton';\nimport ROASChartLegend from './ROASChartLegend';\n\nimport { useCombinedTimeSeriesMetrics } from '../../../../hooks/useCombinedTimeSeriesMetrics';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport { formatCurrency } from '../../../../utils/currencyUtils';\nimport styles from '../styles.module.css';\n\nconst ROASChart = ({ height }: { height: number }) => {\n const { state } = useDashboardFilterContext();\n const { data: cumulativeData, isLoading } = useCombinedTimeSeriesMetrics(\n state.dateRange,\n state.channel,\n );\n\n const { t } = useTranslation();\n\n const chartConfig = {\n spend: {\n label: t('total_ads_spend'),\n color: 'var(--reach-destructive)',\n },\n revenue: {\n label: t('revenue'),\n color: 'var(--reach-primary)',\n },\n } satisfies ChartConfig;\n\n // Calculate max value for y-axis based on cumulative totals\n const maxValue = useMemo(() => {\n if (!cumulativeData.length) return 0;\n return Math.max(\n cumulativeData[cumulativeData.length - 1].cumulative_spend,\n cumulativeData[cumulativeData.length - 1].cumulative_revenue,\n );\n }, [cumulativeData]);\n\n const yAxisMax = useMemo(() => {\n if (maxValue <= 0) return 10;\n const magnitude = Math.pow(10, Math.floor(Math.log10(maxValue)));\n return Math.ceil(maxValue / magnitude) * magnitude;\n }, [maxValue]);\n\n return (\n <Card className={styles.chartCard}>\n <CardHeader className={styles.chartHeader}>\n <div className={styles.chartTitleSection}>\n <CardTitle className={styles.chartTitle}>\n {t('dashboard.roas_chart.title')}\n </CardTitle>\n <ROASChartLegend />\n </div>\n </CardHeader>\n <CardContent className={styles.chartContent}>\n {isLoading ? (\n <div className={styles.chartContainer}>\n <Skeleton className={styles.chartSkeleton} />\n </div>\n ) : (\n <ChartContainer\n config={chartConfig}\n className={cn(\n `aspect-auto h-[${height}px] w-full`,\n styles.chartContainer,\n )}>\n <AreaChart data={cumulativeData}>\n <defs>\n <linearGradient id=\"fillSpend\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" className={styles.areaGradientSpend} />\n <stop offset=\"95%\" className={styles.areaGradientSpendEnd} />\n </linearGradient>\n <linearGradient id=\"fillRevenue\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" className={styles.areaGradientRevenue} />\n <stop\n offset=\"95%\"\n className={styles.areaGradientRevenueEnd}\n />\n </linearGradient>\n </defs>\n <CartesianGrid vertical={false} />\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={32}\n stroke=\"#888888\"\n fontSize={12}\n />\n <YAxis\n stroke=\"#888888\"\n fontSize={12}\n tickLine={false}\n axisLine={false}\n tickFormatter={formatCurrency}\n domain={[0, yAxisMax]}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (active && payload && payload.length) {\n const spendValue = payload[0].value as number;\n const revenueValue = payload[1].value as number;\n\n return (\n <div className={styles.tooltipContainer}>\n <div className={styles.tooltipGrid}>\n <div className=\"flex flex-col\">\n <span className={styles.tooltipLabel}>\n {t('date')}\n </span>\n <span className={styles.tooltipValue}>\n {payload[0].payload.date}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className={styles.tooltipLabel}>\n {t('total_ads_spend')}\n </span>\n <span className={styles.tooltipValue}>\n {formatCurrency(spendValue)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className={styles.tooltipLabel}>\n {t('revenue')}\n </span>\n <span className={styles.tooltipValue}>\n {formatCurrency(revenueValue)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className={styles.tooltipLabel}>\n {t('roas')}\n </span>\n <span className={styles.tooltipValue}>\n {Number(revenueValue / spendValue).toFixed(2)}x\n </span>\n </div>\n </div>\n </div>\n );\n }\n return null;\n }}\n />\n <Area\n type=\"monotone\"\n dataKey=\"cumulative_spend\"\n stroke=\"#FF6B6B\"\n fill=\"url(#fillSpend)\"\n strokeWidth={2}\n name={t('total_ads_spend')}\n />\n <Area\n type=\"monotone\"\n dataKey=\"cumulative_revenue\"\n stroke=\"#4ECDC4\"\n fill=\"url(#fillRevenue)\"\n strokeWidth={2}\n name={t('revenue')}\n />\n </AreaChart>\n </ChartContainer>\n )}\n </CardContent>\n </Card>\n );\n};\n\nexport default ROASChart;\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n return () => {\n var _a, _b, _c, _d;\n let depTime;\n if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts))) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime;\n if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts))) resultTime = Date.now();\n result = fn(...newDeps);\n if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n (_d = opts == null ? void 0 : opts.onChange) == null ? void 0 : _d.call(opts, result);\n return result;\n };\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n };\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { debounce, memo, notUndefined, approxEqual } from \"./utils.js\";\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const arr = [];\n for (let i = start; i <= end; i++) {\n arr.push(i);\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(element.getBoundingClientRect());\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(element.getBoundingClientRect());\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeElementOffset = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n let offset = 0;\n const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n targetWindow,\n () => {\n cb(offset, false);\n },\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n const { horizontal, isRtl } = instance.options;\n offset = horizontal ? element[\"scrollLeft\"] * (isRtl && -1 || 1) : element[\"scrollTop\"];\n fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n endHandler();\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst observeWindowOffset = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n let offset = 0;\n const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n targetWindow,\n () => {\n cb(offset, false);\n },\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = element[instance.options.horizontal ? \"scrollX\" : \"scrollY\"];\n fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n endHandler();\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst measureElement = (element, entry, instance) => {\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n return Math.round(\n element.getBoundingClientRect()[instance.options.horizontal ? \"width\" : \"height\"]\n );\n};\nconst windowScroll = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n const toOffset = offset + adjustments;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n behavior\n });\n};\nconst elementScroll = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n const toOffset = offset + adjustments;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n behavior\n });\n};\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollToIndexTimeoutId = null;\n this.measurementsCache = [];\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.pendingMeasuredCacheIndexes = [];\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n this._measureElement(entry.target, entry);\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n Object.entries(opts2).forEach(([key, value]) => {\n if (typeof value === \"undefined\") delete opts2[key];\n });\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: true,\n useAnimationFrameWithResizeObserver: false,\n ...opts2\n };\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n this.scrollAdjustments = 0;\n this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this.maybeNotify();\n })\n );\n }\n };\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getFurthestMeasurement = (measurements, index) => {\n const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n const furthestMeasurements = /* @__PURE__ */ new Map();\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane\n );\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index;\n }\n return a.end - b.end;\n })[0] : void 0;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled) => {\n this.pendingMeasuredCacheIndexes = [];\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled\n };\n },\n {\n key: false\n }\n );\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCache],\n ({ count, paddingStart, scrollMargin, getItemKey, enabled }, itemSizeCache) => {\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n return [];\n }\n if (this.measurementsCache.length === 0) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;\n this.pendingMeasuredCacheIndexes = [];\n const measurements = this.measurementsCache.slice(0, min);\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n const lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.getScrollOffset()],\n (measurements, outerSize, scrollOffset) => {\n return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n measurements,\n outerSize,\n scrollOffset\n }) : null;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this._measureElement = (node, entry) => {\n const index = this.indexFromElement(node);\n const item = this.measurementsCache[index];\n if (!item) {\n return;\n }\n const key = item.key;\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if (node.isConnected) {\n this.resizeItem(index, this.options.measureElement(node, entry, this));\n }\n };\n this.resizeItem = (index, size) => {\n const item = this.measurementsCache[index];\n if (!item) {\n return;\n }\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size;\n const delta = size - itemSize;\n if (delta !== 0) {\n if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments) {\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n }\n this.pendingMeasuredCacheIndexes.push(item.index);\n this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));\n this.notify(false);\n }\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key);\n }\n });\n return;\n }\n this._measureElement(node, void 0);\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n return notUndefined(\n measurements[findNearestBinarySearch(\n 0,\n measurements.length - 1,\n (index) => notUndefined(measurements[index]).start,\n offset\n )]\n );\n };\n this.getOffsetForAlignment = (toOffset, align) => {\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n if (toOffset >= scrollOffset + size) {\n align = \"end\";\n }\n }\n if (align === \"end\") {\n toOffset -= size;\n }\n const scrollSizeProp = this.options.horizontal ? \"scrollWidth\" : \"scrollHeight\";\n const scrollSize = this.scrollElement ? \"document\" in this.scrollElement ? this.scrollElement.document.documentElement[scrollSizeProp] : this.scrollElement[scrollSizeProp] : 0;\n const maxOffset = scrollSize - size;\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const item = this.measurementsCache[index];\n if (!item) {\n return void 0;\n }\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n const centerOffset = item.start - this.options.scrollPaddingStart + (item.size - size) / 2;\n switch (align) {\n case \"center\":\n return [this.getOffsetForAlignment(centerOffset, align), align];\n case \"end\":\n return [\n this.getOffsetForAlignment(\n item.end + this.options.scrollPaddingEnd,\n align\n ),\n align\n ];\n default:\n return [\n this.getOffsetForAlignment(\n item.start - this.options.scrollPaddingStart,\n align\n ),\n align\n ];\n }\n };\n this.isDynamicMode = () => this.elementsCache.size > 0;\n this.cancelScrollToIndex = () => {\n if (this.scrollToIndexTimeoutId !== null && this.targetWindow) {\n this.targetWindow.clearTimeout(this.scrollToIndexTimeoutId);\n this.scrollToIndexTimeoutId = null;\n }\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior } = {}) => {\n this.cancelScrollToIndex();\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n adjustments: void 0,\n behavior\n });\n };\n this.scrollToIndex = (index, { align: initialAlign = \"auto\", behavior } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n this.cancelScrollToIndex();\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n const offsetAndAlign = this.getOffsetForIndex(index, initialAlign);\n if (!offsetAndAlign) return;\n const [offset, align] = offsetAndAlign;\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n if (behavior !== \"smooth\" && this.isDynamicMode() && this.targetWindow) {\n this.scrollToIndexTimeoutId = this.targetWindow.setTimeout(() => {\n this.scrollToIndexTimeoutId = null;\n const elementInDOM = this.elementsCache.has(\n this.options.getItemKey(index)\n );\n if (elementInDOM) {\n const [latestOffset] = notUndefined(\n this.getOffsetForIndex(index, align)\n );\n if (!approxEqual(latestOffset, this.getScrollOffset())) {\n this.scrollToIndex(index, { align, behavior });\n }\n } else {\n this.scrollToIndex(index, { align, behavior });\n }\n });\n }\n };\n this.scrollBy = (delta, { behavior } = {}) => {\n this.cancelScrollToIndex();\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n this._scrollToOffset(this.getScrollOffset() + delta, {\n adjustments: void 0,\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else {\n end = this.options.lanes === 1 ? ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0 : Math.max(\n ...measurements.slice(-this.options.lanes).map((m) => m.end)\n );\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.notify(false);\n };\n this.setOptions(opts);\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset\n}) {\n const count = measurements.length - 1;\n const getOffset = (index) => measurements[index].start;\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);\n let endIndex = startIndex;\n while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { observeElementRect, observeElementOffset, elementScroll, observeWindowRect, observeWindowOffset, windowScroll, Virtualizer } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase(options) {\n const rerender = React.useReducer(() => ({}), {})[1];\n const resolvedOptions = {\n ...options,\n onChange: (instance2, sync) => {\n var _a;\n if (sync) {\n flushSync(rerender);\n } else {\n rerender();\n }\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n }\n };\n const [instance] = React.useState(\n () => new Virtualizer(resolvedOptions)\n );\n instance.setOptions(resolvedOptions);\n useIsomorphicLayoutEffect(() => {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(() => {\n return instance._willUpdate();\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase({\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase({\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n}\nexport {\n useVirtualizer,\n useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","import { baseRequest, PARTNER_USER_METRICS_PATH } from '../../api';\nimport { formatDateToString } from '../../utils/dateUtils';\nimport { PartnerResource } from './types';\n\nexport const partnerResourcesKeys = {\n all: ['partnerResources'] as const,\n byClientIds: (ids: string[]) =>\n [...partnerResourcesKeys.all, 'byClientIds', ...ids] as const,\n};\n\nexport const getPartnerResourcesByClientIds = async (\n userIds: string[],\n startDate?: Date,\n endDate?: Date,\n): Promise<PartnerResource[]> => {\n if (!userIds.length || !startDate || !endDate) return [];\n\n const formattedStartDate = formatDateToString(startDate);\n const formattedEndDate = formatDateToString(endDate);\n\n const queryParams = new URLSearchParams({\n userIds: userIds.join(','),\n startDate: formattedStartDate,\n endDate: formattedEndDate,\n });\n\n const response = await baseRequest<PartnerResource[]>(\n `${PARTNER_USER_METRICS_PATH}/aggregate-spend-for-user-ids?${queryParams.toString()}`,\n );\n\n return response.data;\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { partnerResourcesKeys, getPartnerResourcesByClientIds } from './api';\nimport { CACHE_STANDARD } from '../../api/queryClientConfig';\nimport type { PartnerResource } from './types';\n\nexport const usePartnerResourcesByClientIds = (\n userIds: string[] = [],\n startDate?: Date,\n endDate?: Date,\n) => {\n return useQuery<PartnerResource[]>({\n queryKey: partnerResourcesKeys.byClientIds(userIds),\n queryFn: () => getPartnerResourcesByClientIds(userIds, startDate, endDate),\n ...CACHE_STANDARD,\n enabled: userIds?.length > 0 && !!startDate && !!endDate,\n });\n};\n","import { UserPlus } from 'lucide-react';\nimport { GoogleIcon, MetaIcon } from '../../../../../icons';\n\nconst SourceIcon = ({ source }: { source: string }) => {\n switch (source.toLowerCase()) {\n case 'google':\n return <GoogleIcon className=\"h-4 w-4\" />;\n case 'meta':\n return <MetaIcon className=\"h-4 w-4\" />;\n case 'direct':\n return <UserPlus className=\"h-4 w-4\" />;\n default:\n return null;\n }\n};\n\nexport const SourceCell = ({ sources }: { sources: string[] }) => (\n <div className=\"space-y-1\">\n {sources.map(source => (\n <div key={source} className=\"flex items-center gap-2\">\n <SourceIcon source={source} />\n <span>{source[0].toUpperCase() + source.slice(1)}</span>\n </div>\n ))}\n </div>\n);\n","import { formatCurrency } from '../../../../../utils/currencyUtils';\n\nexport const SpendCell = ({ amount }: { amount: number }) => (\n <span className=\"font-semibold text-gray-900\">\n {formatCurrency(Number(amount ?? 0))}\n </span>\n);\n","import { HelpCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../../../../components/ui/tooltip';\nimport { formatCurrency } from '../../../../../utils/currencyUtils';\n\nexport const StatusCell = ({\n statusMap,\n}: {\n statusMap: Record<string, number>;\n}) => {\n const { t } = useTranslation();\n const paidAmount = statusMap['Paid'] ?? 0;\n const unpaidAmount = Object.entries(statusMap).reduce(\n (acc, [status, amount]) => (status !== 'Paid' ? acc + amount : acc),\n 0,\n );\n const isPaid = paidAmount > unpaidAmount;\n\n return (\n <div className=\"flex items-center gap-2\">\n <span\n className={`px-2 py-1 rounded-full text-sm ${\n isPaid ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800'\n }`}>\n {isPaid\n ? t('dashboard.client_acquisition.paid')\n : t('dashboard.client_acquisition.unpaid')}\n </span>\n <Tooltip>\n <TooltipTrigger>\n <HelpCircle className=\"h-4 w-4 text-gray-400 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n className=\"bg-white border border-gray-200 shadow-lg p-3 rounded-lg\">\n <div className=\"space-y-2\">\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-sm text-gray-600\">\n {t('dashboard.client_acquisition.paid')}\n </span>\n <span className=\"text-sm font-semibold text-emerald-600\">\n {formatCurrency(paidAmount)}\n </span>\n </div>\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-sm text-gray-600\">\n {t('dashboard.client_acquisition.unpaid')}\n </span>\n <span className=\"text-sm font-semibold text-gray-900\">\n {formatCurrency(unpaidAmount)}\n </span>\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n </div>\n );\n};\n","import { useState, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from '../../../../components/ui/card';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../../../components/ui/table';\nimport { TooltipProvider } from '../../../../components/ui/tooltip';\nimport { Skeleton } from '../../../../components/ui/skeleton';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport { useCombinedMetrics } from '../../../../hooks/useCombinedMetrics';\nimport { usePartnerResourcesByClientIds } from '../../../../services/partner-resources';\nimport { SourceCell, SpendCell, StatusCell } from './cells';\nimport styles from './styles.module.css';\n\nconst ITEMS_PER_PAGE = 10;\nconst ROW_HEIGHT = 75; // Approximate height of each row in pixels\n\nconst COLUMN_WIDTHS = {\n client: '30%',\n source: '25%',\n totalSpent: '25%',\n paymentStatus: '20%',\n};\n\nconst ClientAcquisitionTable = ({ height }: { height: number }) => {\n const { t } = useTranslation();\n const [page, setPage] = useState(1);\n const { state } = useDashboardFilterContext();\n const parentRef = useRef<HTMLDivElement>(null);\n\n const { data: metrics, isLoading: isLoadingMetrics } = useCombinedMetrics(\n state.dateRange,\n state.channel,\n );\n\n const { data: resources, isLoading: isLoadingResources } =\n usePartnerResourcesByClientIds(\n metrics?.converted_users_ids,\n state.dateRange?.from,\n state.dateRange?.to,\n );\n\n const isLoading = isLoadingMetrics || isLoadingResources;\n\n const startIndex = (page - 1) * ITEMS_PER_PAGE;\n const paginatedResources = resources?.slice(\n startIndex,\n startIndex + ITEMS_PER_PAGE,\n );\n const totalPages = Math.ceil((resources?.length ?? 0) / ITEMS_PER_PAGE);\n\n const virtualizer = useVirtualizer({\n count: paginatedResources?.length ?? 0,\n getScrollElement: () => parentRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: 5,\n });\n\n if (isLoading) {\n return (\n <Card className={styles.tableCard}>\n <CardHeader>\n <CardTitle>{t('dashboard.client_acquisition.title')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className={styles.skeletonContainer}>\n <Skeleton className=\"w-full h-full\" />\n </div>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <TooltipProvider>\n <Card className={styles.tableCard}>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>{t('dashboard.client_acquisition.title')}</CardTitle>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setPage(p => Math.max(1, p - 1))}\n disabled={page === 1}\n className=\"p-1 hover:bg-gray-100 rounded disabled:opacity-50 disabled:hover:bg-transparent\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"text-sm text-gray-600\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\n disabled={page === totalPages}\n className=\"p-1 hover:bg-gray-100 rounded disabled:opacity-50 disabled:hover:bg-transparent\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n </CardHeader>\n <CardContent>\n <div className=\"relative\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead style={{ width: COLUMN_WIDTHS.client }}>\n {t('dashboard.client_acquisition.client')}\n </TableHead>\n <TableHead style={{ width: COLUMN_WIDTHS.source }}>\n {t('dashboard.client_acquisition.source')}\n </TableHead>\n <TableHead style={{ width: COLUMN_WIDTHS.totalSpent }}>\n {t('dashboard.client_acquisition.total_spent')}\n </TableHead>\n <TableHead style={{ width: COLUMN_WIDTHS.paymentStatus }}>\n {t('dashboard.client_acquisition.payment_status')}\n </TableHead>\n </TableRow>\n </TableHeader>\n </Table>\n <div\n ref={parentRef}\n style={{ height: `${height - 120}px`, overflowY: 'auto' }}>\n <Table>\n <TableBody>\n {virtualizer.getVirtualItems().map(virtualRow => {\n const resource = paginatedResources?.[virtualRow.index];\n if (!resource) return null;\n\n return (\n <TableRow\n key={resource.userId}\n className=\"hover:bg-gray-50/50 transition-colors\">\n <TableCell style={{ width: COLUMN_WIDTHS.client }}>\n {resource.spend.userName}\n </TableCell>\n <TableCell style={{ width: COLUMN_WIDTHS.source }}>\n <SourceCell\n sources={Object.keys(\n resource.spend.adSourceToAmountMap,\n )}\n />\n </TableCell>\n <TableCell style={{ width: COLUMN_WIDTHS.totalSpent }}>\n <SpendCell amount={resource.spend.totalAmount} />\n </TableCell>\n <TableCell\n style={{ width: COLUMN_WIDTHS.paymentStatus }}>\n <StatusCell\n statusMap={resource.spend.amountToStatusMap}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n </div>\n </CardContent>\n </Card>\n </TooltipProvider>\n );\n};\n\nexport default ClientAcquisitionTable;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../../../components/ui/table';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from '../../../../components/ui/card';\nimport { Skeleton } from '../../../../components/ui/skeleton';\nimport useDashboardFilterContext from '../../../../hooks/useDashboardFilterContext';\nimport { useAggregatedMetricsByBusiness as useGoogleMetrics } from '../../../../services/ad-metrics';\nimport { useAggregatedMetricsByBusiness as useMetaMetrics } from '../../../../services/ad-metrics/meta';\nimport type { DateRange } from '../../../../services/ad-metrics';\nimport { formatCurrency } from '../../../../utils/currencyUtils';\nimport { GoogleIcon, MetaIcon } from '../../../../icons';\ninterface ChannelPerformanceProps {\n dateRange?: DateRange;\n}\n\ninterface ChannelData {\n channel: string;\n id: string;\n icon: React.ReactNode;\n spend?: string;\n revenue?: string;\n roas?: string;\n newCustomers?: string | null;\n}\n\nconst ChannelPerformance = ({ dateRange }: ChannelPerformanceProps) => {\n const { t } = useTranslation();\n const { state } = useDashboardFilterContext();\n const { data: googleData, isLoading: isGoogleLoading } = useGoogleMetrics(\n state.dateRange,\n );\n const { data: metaData, isLoading: isMetaLoading } = useMetaMetrics(\n state.dateRange,\n );\n\n const isLoading = isGoogleLoading || isMetaLoading;\n\n const channelData = [\n googleData && {\n channel: 'Google Ads',\n id: 'google',\n icon: <GoogleIcon className=\"h-4 w-4\" />,\n spend: googleData?.ads_spend,\n revenue: googleData?.measured_revenue,\n roas: googleData?.roas,\n newCustomers: googleData?.new_customers,\n },\n metaData && {\n channel: 'Meta Ads',\n id: 'meta',\n icon: <MetaIcon className=\"h-4 w-4\" />,\n spend: metaData?.ads_spend,\n revenue: metaData?.measured_revenue,\n roas: metaData?.roas,\n newCustomers: metaData?.new_customers,\n },\n ].filter(Boolean) as ChannelData[];\n\n const getFilteredChannelData = () => {\n if (state.channel === 'all') {\n return channelData;\n }\n return channelData.filter(channel => channel.id === state.channel);\n };\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>{t('dashboard.channel_performance.title')}</CardTitle>\n {dateRange && (\n <p className=\"text-sm text-muted-foreground\">\n {dateRange.from?.toLocaleDateString()} -{' '}\n {dateRange.to?.toLocaleDateString()}\n </p>\n )}\n </CardHeader>\n <CardContent>\n {isLoading ? (\n <Skeleton className=\"w-full h-[400px]\" />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {t('dashboard.channel_performance.channel')}\n </TableHead>\n <TableHead className=\"text-right\">\n {t('dashboard.channel_performance.spend')}\n </TableHead>\n <TableHead className=\"text-right\">\n {t('dashboard.channel_performance.revenue')}\n </TableHead>\n <TableHead className=\"text-right\">\n {t('dashboard.channel_performance.roas')}\n </TableHead>\n <TableHead className=\"text-right\">\n {t('dashboard.channel_performance.new_customers')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {getFilteredChannelData().map(row => (\n <TableRow key={row.channel}>\n <TableCell className=\"font-medium flex gap-2 items-center\">\n {row.icon}\n {row.channel}\n </TableCell>\n <TableCell className=\"text-right\">\n {formatCurrency(Number(row.spend))}\n </TableCell>\n <TableCell className=\"text-right\">\n {formatCurrency(Number(row.revenue))}\n </TableCell>\n <TableCell className=\"text-right\">\n {`${Number(row.roas).toFixed(1)}x`}\n </TableCell>\n <TableCell className=\"text-right\">\n {row.newCustomers || 0}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n );\n};\n\nexport default ChannelPerformance;\n","import { useTranslation } from 'react-i18next';\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from '../../../components/ui/tabs';\nimport ActionBar from '../action-bar/ActionBar';\nimport { MetricsRow } from '../metrics/MetricsRow';\nimport ROASChart from '../charts/roas/ROASChart';\nimport ClientAcquisitionTable from '../tables/client-acquisition/ClientAcquisitionTable';\nimport ChannelPerformance from '../tables/channel-performance/ChannelPerformanceTable';\n// import ReengagementDashboard from '../ReengagementDashboard';\nimport styles from './styles.module.css';\n\nconst CHART_HEIGHT = 250;\n\nconst DashboardTabs = () => {\n const { t } = useTranslation();\n\n return (\n <Tabs defaultValue=\"overview\" className={styles.container}>\n <div className={styles.header}>\n <TabsList>\n <TabsTrigger value=\"overview\">\n {t('dashboard.tabs.overview')}\n </TabsTrigger>\n <TabsTrigger value=\"channel-performance\">\n {t('dashboard.tabs.channel_performance')}\n </TabsTrigger>\n {/* <TabsTrigger value=\"reengagement\">Reengagement</TabsTrigger> */}\n </TabsList>\n <div className={styles.actionBarContainer}>\n <ActionBar />\n </div>\n </div>\n\n <TabsContent value=\"overview\" className={styles.overviewContent}>\n <div className={styles.metricsContainer}>\n <div className={styles.metricsWrapper}>\n <MetricsRow />\n </div>\n <div className={styles.chartsGrid}>\n <ROASChart height={CHART_HEIGHT} />\n <ClientAcquisitionTable height={CHART_HEIGHT} />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent\n value=\"channel-performance\"\n className={styles.channelContent}>\n <ChannelPerformance />\n </TabsContent>\n\n {/* <TabsContent value=\"reengagement\" className={styles.reengagementContent}>\n <ReengagementDashboard />\n </TabsContent> */}\n </Tabs>\n );\n};\n\nexport default DashboardTabs;\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n AlertCircle,\n AlertTriangle,\n CheckCircle,\n Info,\n Loader,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../../../utils/cn';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/alert';\n\nconst bannerVariants = cva('w-full border', {\n variants: {\n variant: {\n default: 'bg-slate-50 border-slate-200 text-slate-700',\n primary: 'bg-blue-50 border-blue-200 text-blue-700',\n success: 'bg-green-50 border-green-200 text-green-700',\n warning: 'bg-amber-50 border-amber-200 text-amber-700',\n error: 'bg-red-50 border-red-200 text-red-700',\n },\n size: {\n default: 'py-1',\n sm: 'py-0.5 text-xs',\n lg: 'py-2',\n },\n position: {\n default: 'my-4 rounded-lg',\n top: 'rounded-none border-t border-b fixed top-0 left-0 right-0 z-50',\n bottom:\n 'rounded-none border-t border-b fixed bottom-0 left-0 right-0 z-50',\n inline: 'my-2 rounded-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n position: 'default',\n },\n});\n\n// Icon mapping based on variant\nconst iconMap = {\n default: <Info className=\"h-4 w-4\" />,\n primary: <Info className=\"h-4 w-4\" />,\n success: <CheckCircle className=\"h-4 w-4\" />,\n warning: <AlertTriangle className=\"h-4 w-4\" />,\n error: <AlertCircle className=\"h-4 w-4\" />,\n};\n\nexport interface BannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bannerVariants> {\n loading?: boolean;\n title?: string;\n description?: string;\n asChild?: boolean;\n}\n\nconst Banner = React.forwardRef<HTMLDivElement, BannerProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n position = 'default',\n loading = false,\n title,\n description,\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : Alert;\n\n return (\n <Comp\n ref={ref}\n className={cn(bannerVariants({ variant, size, position, className }))}\n {...props}>\n <div className=\"container mx-auto flex items-center py-1\">\n {loading ? (\n <Loader\n data-testid=\"loading-icon\"\n className=\"h-4 w-4 animate-spin mr-3\"\n />\n ) : (\n <div className=\"mr-3\">\n {iconMap[variant as keyof typeof iconMap]}\n </div>\n )}\n\n <div>\n {title && (\n <AlertTitle className=\"text-sm font-medium\">{title}</AlertTitle>\n )}\n {description && (\n <AlertDescription className=\"text-sm\">\n {description}\n </AlertDescription>\n )}\n {children}\n </div>\n </div>\n </Comp>\n );\n },\n);\n\nBanner.displayName = 'Banner';\n\nexport { Banner };\n","// src/components/AdDashboard/AdDashboard.tsx\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\n\nimport SettingsSheet from '../../components/dashboard/settings-sheet';\nimport { H2 } from '../../components/typography';\nimport { SpinLoader } from '../../components/ui/spin-loader';\nimport { EmptyStateLayout } from '../common/empty-state';\nimport DashboardTabs from '../../components/dashboard/tabs/DashboardTabs';\nimport { Banner } from '../../components/ui/banner';\n\nimport { Provider as DashboardFilterProvider } from '../../context/DashboardFilterContext';\nimport { useAdAccounts } from '../../services/ad-accounts';\nimport { useBusiness } from '../../hooks/useBusiness';\nimport { useCombinedMetrics } from '../../hooks/useCombinedMetrics';\nimport useDashboardFilterContext from '../../hooks/useDashboardFilterContext';\nimport { PATHS } from '../../constants/navigation';\nimport styles from './styles.module.css';\nimport { AdDashboardProps } from './types';\n\nconst AdDashboard = ({ children }: AdDashboardProps) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const { isLoading: isBusinessLoading, error: businessError } = useBusiness();\n const { data: accounts, isLoading: isAccountsLoading } = useAdAccounts();\n const { state } = useDashboardFilterContext();\n const { data: combinedMetrics } = useCombinedMetrics(\n state.dateRange,\n state.channel,\n );\n\n const isLoading = isBusinessLoading || isAccountsLoading;\n\n if (isLoading) {\n return (\n <div className=\"flex h-screen items-center justify-center\">\n <SpinLoader text={['Fetching your data', 'Finishing up']} />\n </div>\n );\n }\n\n if (businessError) {\n return <div>Error loading business data</div>;\n }\n\n const showNoAccounts =\n accounts?.length === 0 ||\n accounts?.every(account => account.status === 'draft');\n\n const showMetricsBanner =\n combinedMetrics &&\n (!combinedMetrics?.ads_spend || combinedMetrics?.ads_spend == '0');\n\n const showRevokedAccountsBanner = accounts?.every(\n account => account.status === 'revoked',\n );\n\n // If children are provided, use component composition\n if (children) {\n console.log('rendering in component mode');\n return (\n <DashboardFilterProvider>\n <div className={styles.container}>\n <DashboardTabs />\n {children}\n </div>\n </DashboardFilterProvider>\n );\n }\n\n // Otherwise, use the default implementation\n console.log('rendering in iframe default mode');\n return (\n <DashboardFilterProvider>\n <div className={styles.container}>\n <div className={styles.innerContainer}>\n <div className={styles.header}>\n <H2>{t('dashboard.title')}</H2>\n {!showNoAccounts && <SettingsSheet />}\n </div>\n {showMetricsBanner && (\n <Banner\n variant=\"default\"\n title={t('dashboard.banners.metrics_crunching.title')}\n description={t('dashboard.banners.metrics_crunching.description')}\n />\n )}\n {showRevokedAccountsBanner && (\n <Banner\n variant=\"error\"\n title={t('dashboard.banners.revoked_accounts.title')}\n description={t('dashboard.banners.revoked_accounts.description')}\n />\n )}\n <div className=\"relative\">\n <DashboardTabs />\n {showNoAccounts && (\n <EmptyStateLayout\n title={t('empty_state.analytics.title')}\n description={t('empty_state.analytics.description')}\n buttonText={t('empty_state.analytics.button_text')}\n onButtonClick={() => navigate(PATHS.MEASURE_SETUP)}\n />\n )}\n </div>\n </div>\n </div>\n </DashboardFilterProvider>\n );\n};\n\nexport default AdDashboard;\n"],"names":["title","description","styles","DashboardFilterContext","updateDateRange","React","getAggregatedMetricsByBusiness","getTimeSeriesMetricsByBusiness","useAggregatedMetricsByBusiness","useTimeSeriesMetrics","useGoogleMetrics","useMetaMetrics","updateChannel","channelName","channelIcon","sources","icon","config","tooltipLabel","useGoogleTimeSeriesMetrics","useMetaTimeSeriesMetrics","Tooltip","_a","options","DashboardFilterProvider"],"mappings":"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","x_google_ignoreList":[20,21,22]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useTranslation } from "react-i18next";
|
|
3
|
-
import { N as useAdAccounts, Q as H2 } from "./index-OHOroL_D.js";
|
|
4
|
-
import { s as styles, S as SettingsSheet } from "./styles.module-B1IY0-9d.js";
|
|
5
|
-
import "@tanstack/react-query";
|
|
6
|
-
const AdMetricsDashboardHeader = ({
|
|
7
|
-
showSettings = true,
|
|
8
|
-
title,
|
|
9
|
-
children
|
|
10
|
-
}) => {
|
|
11
|
-
const { t } = useTranslation();
|
|
12
|
-
const { data: accounts } = useAdAccounts();
|
|
13
|
-
const showNoAccounts = (accounts == null ? void 0 : accounts.length) === 0 || (accounts == null ? void 0 : accounts.every((account) => account.status === "draft"));
|
|
14
|
-
return /* @__PURE__ */ jsxs("div", { className: styles.header, children: [
|
|
15
|
-
title ? /* @__PURE__ */ jsx(H2, { children: title }) : /* @__PURE__ */ jsx(H2, { children: t("dashboard.title") }),
|
|
16
|
-
children,
|
|
17
|
-
showSettings && !showNoAccounts && /* @__PURE__ */ jsx(SettingsSheet, {})
|
|
18
|
-
] });
|
|
19
|
-
};
|
|
20
|
-
export {
|
|
21
|
-
AdMetricsDashboardHeader as default
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=AdMetricsDashboardHeader-V03rQC0y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdMetricsDashboardHeader-V03rQC0y.js","sources":["../../common/layouts/ad-metrics-dashboard/AdMetricsDashboardHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { H2 } from '../../components/typography';\nimport SettingsSheet from '../../components/dashboard/settings-sheet';\nimport { useAdAccounts } from '../../services/ad-accounts';\nimport styles from './styles.module.css';\n\ntype AdMetricsDashboardHeaderProps = {\n showSettings?: boolean;\n title?: string;\n children?: React.ReactNode;\n};\n\nconst AdMetricsDashboardHeader = ({\n showSettings = true,\n title,\n children,\n}: AdMetricsDashboardHeaderProps) => {\n const { t } = useTranslation();\n const { data: accounts } = useAdAccounts();\n\n const showNoAccounts =\n accounts?.length === 0 ||\n accounts?.every(account => account.status === 'draft');\n\n return (\n <div className={styles.header}>\n {title ? <H2>{title}</H2> : <H2>{t('dashboard.title')}</H2>}\n {children}\n {showSettings && !showNoAccounts && <SettingsSheet />}\n </div>\n );\n};\n\nexport default AdMetricsDashboardHeader;\n\n// Similar implementations for AdDashboardMetrics and AdDashboardSettings\n"],"names":[],"mappings":";;;;;AAaA,MAAM,2BAA2B,CAAC;AAAA,EAChC,eAAe;AAAA,EACf;AAAA,EACA;AACF,MAAqC;AAC7B,QAAA,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,EAAE,MAAM,SAAS,IAAI,cAAc;AAEnC,QAAA,kBACJ,qCAAU,YAAW,MACrB,qCAAU,MAAM,CAAA,YAAW,QAAQ,WAAW;AAEhD,SACG,qBAAA,OAAA,EAAI,WAAW,OAAO,QACpB,UAAA;AAAA,IAAQ,QAAA,oBAAC,MAAI,UAAM,MAAA,CAAA,wBAAS,IAAI,EAAA,UAAA,EAAE,iBAAiB,EAAE,CAAA;AAAA,IACrD;AAAA,IACA,gBAAgB,CAAC,kBAAkB,oBAAC,eAAc,CAAA,CAAA;AAAA,EAAA,GACrD;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.reach-styles-module__base___RP4iu{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:.375rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.reach-styles-module__base___RP4iu:disabled{pointer-events:none;opacity:.5}.reach-styles-module__base___RP4iu svg{pointer-events:none;width:1rem;height:1rem;flex-shrink:0}.reach-styles-module__size-default___kIvbz{height:2.25rem;padding:.5rem 1rem}.reach-styles-module__size-sm___45mpF{height:2rem;border-radius:.375rem;padding-left:.75rem;padding-right:.75rem;font-size:.75rem;line-height:1rem}.reach-styles-module__size-lg___49p4A{height:2.5rem;border-radius:.375rem;padding-left:2rem;padding-right:2rem}.reach-styles-module__size-icon___-6vvi{height:2.25rem;width:2.25rem}.reach-styles-module__dialogContent___GAISG{width:90vw!important;max-width:800px!important}@media (min-width: 640px){.reach-styles-module__dialogContent___GAISG{max-width:56rem!important}}.reach-styles-module__loadingContainer___ecnnu{display:flex;min-height:200px;align-items:center;justify-content:center;padding:1rem}.reach-styles-module__buttonContainer___U3yWz{margin-top:1.5rem;display:flex;justify-content:flex-end}.reach-styles-module__buttonContainer___U3yWz>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__searchContainer___xJAxN{position:relative;margin-top:.5rem;display:flex;height:3rem;width:100%;flex-direction:column;justify-content:space-between;gap:1rem;vertical-align:top}@media (min-width: 1024px){.reach-styles-module__searchContainer___xJAxN{flex-direction:row}}.reach-styles-module__searchIcon___zadjE{position:absolute;left:.75rem;top:.625rem;height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__searchInput___kmrGi{min-height:2.5rem;padding-left:2.25rem}.reach-styles-module__accountsContainer___7Enh5{margin-top:1rem;max-height:400px}.reach-styles-module__accountsContainer___7Enh5>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse));--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.reach-styles-module__accountsContainer___7Enh5{overflow-y:auto}.reach-styles-module__sectionHeader___UzvA1{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__accountGroup___ToMw0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.reach-styles-module__subAccountsContainer___G2VJz{margin-left:1rem}.reach-styles-module__accountButton___buAhf{display:flex;width:100%;align-items:center;gap:.75rem;padding:.5rem 1rem;text-align:left}.reach-styles-module__accountButton___buAhf:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.reach-styles-module__selectedAccountButton___zyhLd{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.reach-styles-module__accountId___i35cN{display:none;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__group___sOgJI:hover .reach-styles-module__accountId___i35cN{display:inline-block}.reach-styles-module__selectedAccountDisplay___cHIHo{display:flex;height:2.5rem;width:100%;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;vertical-align:middle}@media (min-width: 1024px){.reach-styles-module__selectedAccountDisplay___cHIHo{width:50%}}.reach-styles-module__selectedAccountText___hRfZy{font-size:.75rem;line-height:1rem}.reach-styles-module__selectedAccountInfo___YtAwZ{display:flex;align-items:center;gap:.5rem}.reach-styles-module__clearButtonContainer___xex-g{margin-left:.5rem}.reach-styles-module__clearButton___VZOKu{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.reach-styles-module__clearButton___VZOKu:hover{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.reach-styles-module__checkboxContainer___7SsCV{margin-top:.5rem;display:flex;align-items:flex-start}.reach-styles-module__checkboxContainer___7SsCV>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__checkboxContainer___7SsCV{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:.75rem}.reach-styles-module__checkboxLabel___8YQuQ{cursor:pointer;font-size:.875rem;line-height:1.25rem;font-weight:500;line-height:1}.reach-styles-module__checkboxDescription___nz8Rf{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__metaContent___4qGBo>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.reach-styles-module__metaContent___4qGBo{padding-top:1rem;padding-bottom:1rem}.reach-styles-module__accountName___LI22z{flex:1 1 0%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__sheetContent___0ciEx{width:100%!important;max-width:100vw!important;overflow-y:auto;will-change:transform}@media (min-width: 640px){.reach-styles-module__sheetContent___0ciEx{max-width:none!important}}@media (min-width: 768px){.reach-styles-module__sheetContent___0ciEx{width:50%!important}}@media (min-width: 1024px){.reach-styles-module__sheetContent___0ciEx{min-width:500px!important}}.reach-styles-module__container___T38N5{display:flex;flex-direction:column;height:100%}.reach-styles-module__sectionTitle___EKjxE{margin-top:1rem;margin-bottom:1rem;font-weight:500}.reach-styles-module__setupContainer___eFNIi{display:flex;width:100%;flex-direction:column;gap:1rem}@media (min-width: 1024px){.reach-styles-module__setupContainer___eFNIi{flex-direction:row}}.reach-styles-module__featureButton___wqCjo{display:flex;height:auto;width:100%;align-items:flex-start;justify-content:space-between;border-radius:.5rem;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-image:linear-gradient(to top right,var(--tw-gradient-stops));--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-from-position: 60%;--tw-gradient-to: rgb(216 180 254 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(216 180 254 / .7) var(--tw-gradient-via-position), var(--tw-gradient-to);--tw-gradient-via-position: 75%;--tw-gradient-to: rgb(236 72 153 / .45) var(--tw-gradient-to-position);padding:1rem}.reach-styles-module__featureButton___wqCjo:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.reach-styles-module__featureButton___wqCjo:disabled{cursor:not-allowed;opacity:.5}.reach-styles-module__featureContent___XZoau{display:flex;flex-direction:column;align-items:flex-start;gap:.5rem}.reach-styles-module__featureTitle___1dex2{text-wrap:wrap;text-align:left;font-weight:500}.reach-styles-module__featureDescription___e6Nh-{text-wrap:wrap;text-align:left;font-size:.875rem;line-height:1.25rem;color:var(--muted-foreground)}.reach-styles-module__imageContainer___fnBSj{display:flex;height:5rem;width:5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:.375rem}.reach-styles-module__featureImage___DZbp8{height:3.5rem;width:3.5rem}.reach-styles-module__connectedAccounts___6e8OJ>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.reach-styles-module__legalSection___EAH2m{margin-top:auto;padding-top:1rem;border-top:1px solid var(--border)}.reach-styles-module__legalLinks___4PwOC{display:flex;gap:1rem;justify-content:center}.reach-styles-module__legalLink___XaCkC{padding:0;height:auto;color:var(--muted-foreground);font-size:.75rem}.reach-styles-module__legalLink___XaCkC:hover{color:var(--foreground)}.reach-styles-module__container___lqhzq{width:100%}.reach-styles-module__innerContainer___ESl0A{max-width:80rem}.reach-styles-module__header___D7EkI{display:flex;align-items:center;justify-content:space-between}.reach-styles-module__container___GuRla{position:absolute;inset:0;height:100%;width:100%;--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;background-color:var(--background)/70}.reach-styles-module__title___3HRHQ{text-align:center;font-size:1.125rem;line-height:1.75rem;font-weight:500}.reach-styles-module__description___RAI1V{text-align:center;font-size:.875rem;line-height:1.25rem}.reach-styles-module__button___5HKgK{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.reach-styles-module__button___5HKgK:hover{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.reach-styles-module__container___vdVjp{display:flex;align-items:center;justify-content:space-between}.reach-styles-module__controlsGroup___xeRAT{display:flex;align-items:center;gap:1rem}.reach-styles-module__dateButton___VYYgL{display:flex;align-items:center;font-size:.875rem;line-height:1.25rem}.reach-styles-module__icon___yfRDZ{margin-right:.5rem;height:1rem;width:1rem}.reach-styles-module__presetSection___C912U{border-bottom-width:1px;padding:.75rem}.reach-styles-module__channelItem___UGH3Z{display:flex;cursor:default;align-items:center}.reach-styles-module__channelItem___UGH3Z>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__channelLabel___bP5D0{font-size:.875rem;line-height:1.25rem;font-weight:500;line-height:1}.reach-styles-module__channelLabelDisabled___C6Psj{cursor:not-allowed;opacity:.7}.reach-styles-module__popoverContent___QIr4Q{width:auto;padding:0}.reach-styles-module__dropdownContent___3Hhp1{width:14rem}.reach-styles-module__filterButton___H-U-Z{padding:8px;height:36px}.reach-styles-module__filterIcon___PegbQ{width:16px;height:16px}.reach-styles-module__content___EEhv3{min-width:240px;padding:0;border-radius:8px;overflow:hidden}.reach-styles-module__container___eaADr{display:flex;flex-direction:column}.reach-styles-module__header___qIzzs{padding:12px 16px;font-weight:500;color:var(--foreground);border-bottom:1px solid var(--border)}.reach-styles-module__options___o57N9{padding:8px}.reach-styles-module__option___BEaPP{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color .15s ease}.reach-styles-module__checkbox___1s-NG{width:16px;height:16px;border-radius:4px;cursor:pointer}.reach-styles-module__channelIcon___wR2Oe{width:20px;height:20px}.reach-styles-module__channelName___6h5In{flex:1;font-size:14px;font-weight:500}.reach-styles-module__comingSoon___yc5ZE{font-size:12px;padding:4px 8px;background:var(--accent);color:var(--accent-foreground);border-radius:999px}:root{--hover-bg: rgba(0, 0, 0, .05);--border: rgba(0, 0, 0, .1)}.reach-styles-module__container___7dvcd{display:flex;align-items:center;justify-content:space-between}.reach-styles-module__controlsGroup___zKKiD{display:flex;align-items:center;gap:1rem}.reach-styles-module__card___16dhP{position:relative;overflow:hidden;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.reach-styles-module__card___16dhP:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.reach-styles-module__card___16dhP{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops));--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: rgb(249 250 251 / .5) var(--tw-gradient-to-position);border-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.reach-styles-module__card___16dhP:hover{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.reach-styles-module__content___pYRpR{display:flex;height:100%;min-height:140px;flex-direction:column;padding:1rem}.reach-styles-module__header___Yxq4J{flex:none}.reach-styles-module__titleRow___AdYCN{display:flex;align-items:flex-start;justify-content:space-between;gap:.5rem}.reach-styles-module__titleContainer___4Sg-1{display:flex;max-width:70%;align-items:flex-start;gap:.5rem}.reach-styles-module__rightColumn___Qm7Pr{display:flex;flex-direction:column;align-items:center;gap:.25rem}.reach-styles-module__cardTitle___pgJm7{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.reach-styles-module__tooltipText___jQMnv{font-size:.875rem;line-height:1.25rem}.reach-styles-module__valueContainer___VBnjC{margin-top:auto}.reach-styles-module__metricValue___6vxdH{font-size:1.5rem;line-height:2rem;font-weight:600;letter-spacing:-.025em;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.reach-styles-module__footer___HPW6-{margin-top:.25rem}.reach-styles-module__footerContent___znjhg{display:flex;align-items:center;gap:.25rem}.reach-styles-module__positive___-z57U{color:#16a34ab3}.reach-styles-module__negative___oWYJQ{color:#dc2626b3}.reach-styles-module__trendIcon___Bn2Kv{height:.75rem;width:.75rem}.reach-styles-module__footerText___8661C{font-size:.75rem;line-height:1rem}.reach-styles-module__titleSkeleton___EHM42{height:1rem;width:6rem}.reach-styles-module__infoIconSkeleton___Xqch0,.reach-styles-module__badgeSkeleton___zfXXM{height:1rem;width:1rem;border-radius:9999px}.reach-styles-module__valueSkeleton___GuhQN{margin-top:auto;height:2rem;width:7rem}.reach-styles-module__footerSkeleton___aeBcZ{margin-top:.25rem;height:1rem;width:8rem}.reach-styles-module__metricsContainer___sLSU8{display:grid;width:100%;gap:1rem;grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width: 640px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1024px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(4,minmax(0,1fr))}}.reach-styles-module__metricsContainer___sLSU8{grid-auto-rows:minmax(0,1fr)}@media (min-width: 1280px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(5,minmax(0,1fr))}}.reach-styles-module__chartCard___uu68R{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartCard___uu68R{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__chartCard___uu68R{--tw-shadow: 0 2px 8px rgba(0,0,0,.04);--tw-shadow-colored: 0 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartCard___uu68R{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}}.reach-styles-module__chartHeader___djnhO{display:flex;flex-direction:column;gap:.5rem;padding:1rem;padding-bottom:0}.reach-styles-module__chartTitleSection___T142a{display:flex;flex-direction:column;gap:.25rem}@media (min-width: 640px){.reach-styles-module__chartTitleSection___T142a{flex-direction:row;align-items:center;justify-content:space-between}}.reach-styles-module__chartTitle___hEksh{font-size:1.125rem;line-height:1.75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartTitle___hEksh{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}}.reach-styles-module__chartDateRange___LZWCQ{display:flex;justify-content:flex-end}.reach-styles-module__dateContainer___ZZOzN{display:flex;align-items:center;gap:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.25rem .75rem}@media (prefers-color-scheme: dark){.reach-styles-module__dateContainer___ZZOzN{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}}.reach-styles-module__dateIcon___DqCwb{height:.875rem;width:.875rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateIcon___DqCwb{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}}.reach-styles-module__dateText___rqjcQ{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateText___rqjcQ{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}}.reach-styles-module__chartContent___1DOVs{padding:1rem}.reach-styles-module__chartContainer___wysu3{height:300px;width:100%;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartContainer___wysu3{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__skeletonContainer___Fv6Gl{height:300px;width:100%;padding:1rem}.reach-styles-module__chartSkeleton___VRRcE{height:100%;width:100%;border-radius:.5rem}.reach-styles-module__tooltipContainer___yNPN6{border-radius:.5rem;border-width:0px;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.75rem}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipContainer___yNPN6{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__tooltipContainer___yNPN6{--tw-bg-opacity: .95;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.reach-styles-module__tooltipGrid___M69Z-{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;min-width:200px}.reach-styles-module__tooltipLabel___k90L-{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipLabel___k90L-{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}}.reach-styles-module__tooltipValue___76dDZ{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipValue___76dDZ{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}}.reach-styles-module__areaGradientSpend___428-Z{stop-color:#e34a67;stop-opacity:.15}.reach-styles-module__areaGradientSpendEnd___EOpKD{stop-color:#e34a67;stop-opacity:.02}.reach-styles-module__areaGradientRevenue___fB5a0{stop-color:#36b37e;stop-opacity:.15}.reach-styles-module__areaGradientRevenueEnd___X2rf-{stop-color:#36b37e;stop-opacity:.02}.reach-styles-module__legendSpend___-MU-z{--tw-bg-opacity: 1;background-color:rgb(227 74 103 / var(--tw-bg-opacity, 1))}.reach-styles-module__legendRevenue___kWA1z{--tw-bg-opacity: 1;background-color:rgb(54 179 126 / var(--tw-bg-opacity, 1))}.reach-styles-module__tableCard___8xy0b{max-height:500px;width:100%;overflow:auto}.reach-styles-module__skeletonContainer___8EjUC{height:200px}.reach-styles-module__platformBadge___mth-X{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__platformBadge___mth-X{background-color:#1e3a8a4d;--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}}.reach-styles-module__platformBadge___mth-X{display:flex;align-items:center;border-radius:9999px;padding:.125rem .375rem;font-size:10px;overflow:hidden;white-space:nowrap;max-width:90px}.reach-styles-module__platformBadge___mth-X span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__rightAligned___Ou-Ub{text-align:right}.reach-styles-module__statusCell___32iSB{display:inline-flex;align-items:center;border-radius:.375rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500}.reach-styles-module__statusPaid___z3i6-{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(22 163 74 / .2) }.reach-styles-module__statusUnpaid___LSUt4{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(202 138 4 / .2) }.reach-styles-module__badgeContainer___lZ3yD{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding-left:.75rem;padding-right:.75rem}@media (min-width: 320px){.reach-styles-module__badgeContainer___lZ3yD{flex-wrap:nowrap}}.reach-styles-module__dateBadge___otHgz{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateBadge___otHgz{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}}.reach-styles-module__dateBadge___otHgz{display:flex;flex-shrink:0;align-items:center;border-radius:9999px;padding:.125rem .375rem;font-size:10px}.reach-styles-module__dateBadge___otHgz span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__noDataContainer___-1C3o{margin-top:.5rem}.reach-styles-module__container___MU7iK{margin-top:1rem;width:100%}.reach-styles-module__header___yz14d{display:flex;width:100%;flex-direction:column;align-items:flex-start;justify-content:flex-start}@media (min-width: 768px){.reach-styles-module__header___yz14d{flex-direction:row;align-items:center;justify-content:space-between}}.reach-styles-module__header___yz14d{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-bottom:1.5rem}@media (prefers-color-scheme: dark){.reach-styles-module__header___yz14d{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}}.reach-styles-module__actionBarContainer___G5hpa{margin-top:.5rem;display:flex;width:100%;flex-direction:row;align-items:flex-start;justify-content:flex-start}@media (min-width: 768px){.reach-styles-module__actionBarContainer___G5hpa{align-items:center;justify-content:flex-end}}.reach-styles-module__overviewContent___UZVfK{margin-top:.5rem;border-radius:.5rem;padding:1.5rem;--tw-bg-opacity: 1;background-color:rgb(245 247 250 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__overviewContent___UZVfK{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}}.reach-styles-module__metricsContainer___23m-t{margin-left:auto;margin-right:auto;display:flex;width:100%;max-width:1800px;flex-direction:column}.reach-styles-module__metricsWrapper___DKNuR{margin-bottom:2rem}.reach-styles-module__chartsGrid___ovwxR{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:2rem}@media (min-width: 1024px){.reach-styles-module__chartsGrid___ovwxR{grid-template-columns:repeat(2,minmax(0,1fr))}}.reach-styles-module__channelContent___Vgz1F,.reach-styles-module__reengagementContent___rEqt7{margin-top:1.5rem}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.reach-styles-module__base___RP4iu{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:.375rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.reach-styles-module__base___RP4iu:disabled{pointer-events:none;opacity:.5}.reach-styles-module__base___RP4iu svg{pointer-events:none;width:1rem;height:1rem;flex-shrink:0}.reach-styles-module__size-default___kIvbz{height:2.25rem;padding:.5rem 1rem}.reach-styles-module__size-sm___45mpF{height:2rem;border-radius:.375rem;padding-left:.75rem;padding-right:.75rem;font-size:.75rem;line-height:1rem}.reach-styles-module__size-lg___49p4A{height:2.5rem;border-radius:.375rem;padding-left:2rem;padding-right:2rem}.reach-styles-module__size-icon___-6vvi{height:2.25rem;width:2.25rem}.reach-styles-module__dialogContent___GAISG{width:90vw!important;max-width:800px!important}@media (min-width: 640px){.reach-styles-module__dialogContent___GAISG{max-width:56rem!important}}.reach-styles-module__loadingContainer___ecnnu{display:flex;min-height:200px;align-items:center;justify-content:center;padding:1rem}.reach-styles-module__buttonContainer___U3yWz{margin-top:1.5rem;display:flex;justify-content:flex-end}.reach-styles-module__buttonContainer___U3yWz>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__searchContainer___xJAxN{position:relative;margin-top:.5rem;display:flex;height:3rem;width:100%;flex-direction:column;justify-content:space-between;gap:1rem;vertical-align:top}@media (min-width: 1024px){.reach-styles-module__searchContainer___xJAxN{flex-direction:row}}.reach-styles-module__searchIcon___zadjE{position:absolute;left:.75rem;top:.625rem;height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__searchInput___kmrGi{min-height:2.5rem;padding-left:2.25rem}.reach-styles-module__accountsContainer___7Enh5{margin-top:1rem;max-height:400px}.reach-styles-module__accountsContainer___7Enh5>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse));--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.reach-styles-module__accountsContainer___7Enh5{overflow-y:auto}.reach-styles-module__sectionHeader___UzvA1{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__accountGroup___ToMw0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.reach-styles-module__subAccountsContainer___G2VJz{margin-left:1rem}.reach-styles-module__accountButton___buAhf{display:flex;width:100%;align-items:center;gap:.75rem;padding:.5rem 1rem;text-align:left}.reach-styles-module__accountButton___buAhf:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.reach-styles-module__selectedAccountButton___zyhLd{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.reach-styles-module__accountId___i35cN{display:none;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__group___sOgJI:hover .reach-styles-module__accountId___i35cN{display:inline-block}.reach-styles-module__selectedAccountDisplay___cHIHo{display:flex;height:2.5rem;width:100%;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;vertical-align:middle}@media (min-width: 1024px){.reach-styles-module__selectedAccountDisplay___cHIHo{width:50%}}.reach-styles-module__selectedAccountText___hRfZy{font-size:.75rem;line-height:1rem}.reach-styles-module__selectedAccountInfo___YtAwZ{display:flex;align-items:center;gap:.5rem}.reach-styles-module__clearButtonContainer___xex-g{margin-left:.5rem}.reach-styles-module__clearButton___VZOKu{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.reach-styles-module__clearButton___VZOKu:hover{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.reach-styles-module__checkboxContainer___7SsCV{margin-top:.5rem;display:flex;align-items:flex-start}.reach-styles-module__checkboxContainer___7SsCV>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__checkboxContainer___7SsCV{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:.75rem}.reach-styles-module__checkboxLabel___8YQuQ{cursor:pointer;font-size:.875rem;line-height:1.25rem;font-weight:500;line-height:1}.reach-styles-module__checkboxDescription___nz8Rf{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.reach-styles-module__metaContent___4qGBo>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.reach-styles-module__metaContent___4qGBo{padding-top:1rem;padding-bottom:1rem}.reach-styles-module__accountName___LI22z{flex:1 1 0%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__sheetContent___0ciEx{width:100%!important;max-width:100vw!important;overflow-y:auto;will-change:transform}@media (min-width: 640px){.reach-styles-module__sheetContent___0ciEx{max-width:none!important}}@media (min-width: 768px){.reach-styles-module__sheetContent___0ciEx{width:50%!important}}@media (min-width: 1024px){.reach-styles-module__sheetContent___0ciEx{min-width:500px!important}}.reach-styles-module__container___T38N5{display:flex;flex-direction:column;height:100%}.reach-styles-module__sectionTitle___EKjxE{margin-top:1rem;margin-bottom:1rem;font-weight:500}.reach-styles-module__setupContainer___eFNIi{display:flex;width:100%;flex-direction:column;gap:1rem}@media (min-width: 1024px){.reach-styles-module__setupContainer___eFNIi{flex-direction:row}}.reach-styles-module__featureButton___wqCjo{display:flex;height:auto;width:100%;align-items:flex-start;justify-content:space-between;border-radius:.5rem;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-image:linear-gradient(to top right,var(--tw-gradient-stops));--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-from-position: 60%;--tw-gradient-to: rgb(216 180 254 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(216 180 254 / .7) var(--tw-gradient-via-position), var(--tw-gradient-to);--tw-gradient-via-position: 75%;--tw-gradient-to: rgb(236 72 153 / .45) var(--tw-gradient-to-position);padding:1rem}.reach-styles-module__featureButton___wqCjo:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.reach-styles-module__featureButton___wqCjo:disabled{cursor:not-allowed;opacity:.5}.reach-styles-module__featureContent___XZoau{display:flex;flex-direction:column;align-items:flex-start;gap:.5rem}.reach-styles-module__featureTitle___1dex2{text-wrap:wrap;text-align:left;font-weight:500}.reach-styles-module__featureDescription___e6Nh-{text-wrap:wrap;text-align:left;font-size:.875rem;line-height:1.25rem;color:var(--muted-foreground)}.reach-styles-module__imageContainer___fnBSj{display:flex;height:5rem;width:5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:.375rem}.reach-styles-module__featureImage___DZbp8{height:3.5rem;width:3.5rem}.reach-styles-module__connectedAccounts___6e8OJ>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.reach-styles-module__legalSection___EAH2m{margin-top:auto;padding-top:1rem;border-top:1px solid var(--border)}.reach-styles-module__legalLinks___4PwOC{display:flex;gap:1rem;justify-content:center}.reach-styles-module__legalLink___XaCkC{padding:0;height:auto;color:var(--muted-foreground);font-size:.75rem}.reach-styles-module__legalLink___XaCkC:hover{color:var(--foreground)}.reach-styles-module__container___GuRla{position:absolute;inset:0;height:100%;width:100%;--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;background-color:var(--background)/70}.reach-styles-module__title___3HRHQ{text-align:center;font-size:1.125rem;line-height:1.75rem;font-weight:500}.reach-styles-module__description___RAI1V{text-align:center;font-size:.875rem;line-height:1.25rem}.reach-styles-module__button___5HKgK{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.reach-styles-module__button___5HKgK:hover{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.reach-styles-module__container___vdVjp{display:flex;align-items:center;justify-content:space-between}.reach-styles-module__controlsGroup___xeRAT{display:flex;align-items:center;gap:1rem}.reach-styles-module__dateButton___VYYgL{display:flex;align-items:center;font-size:.875rem;line-height:1.25rem}.reach-styles-module__icon___yfRDZ{margin-right:.5rem;height:1rem;width:1rem}.reach-styles-module__presetSection___C912U{border-bottom-width:1px;padding:.75rem}.reach-styles-module__channelItem___UGH3Z{display:flex;cursor:default;align-items:center}.reach-styles-module__channelItem___UGH3Z>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.reach-styles-module__channelLabel___bP5D0{font-size:.875rem;line-height:1.25rem;font-weight:500;line-height:1}.reach-styles-module__channelLabelDisabled___C6Psj{cursor:not-allowed;opacity:.7}.reach-styles-module__popoverContent___QIr4Q{width:auto;padding:0}.reach-styles-module__dropdownContent___3Hhp1{width:14rem}.reach-styles-module__filterButton___H-U-Z{padding:8px;height:36px}.reach-styles-module__filterIcon___PegbQ{width:16px;height:16px}.reach-styles-module__content___EEhv3{min-width:240px;padding:0;border-radius:8px;overflow:hidden}.reach-styles-module__container___eaADr{display:flex;flex-direction:column}.reach-styles-module__header___qIzzs{padding:12px 16px;font-weight:500;color:var(--foreground);border-bottom:1px solid var(--border)}.reach-styles-module__options___o57N9{padding:8px}.reach-styles-module__option___BEaPP{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color .15s ease}.reach-styles-module__checkbox___1s-NG{width:16px;height:16px;border-radius:4px;cursor:pointer}.reach-styles-module__channelIcon___wR2Oe{width:20px;height:20px}.reach-styles-module__channelName___6h5In{flex:1;font-size:14px;font-weight:500}.reach-styles-module__comingSoon___yc5ZE{font-size:12px;padding:4px 8px;background:var(--accent);color:var(--accent-foreground);border-radius:999px}:root{--hover-bg: rgba(0, 0, 0, .05);--border: rgba(0, 0, 0, .1)}.reach-styles-module__container___7dvcd{display:flex;align-items:center;justify-content:space-between}.reach-styles-module__controlsGroup___zKKiD{display:flex;align-items:center;gap:1rem}.reach-styles-module__card___16dhP{position:relative;overflow:hidden;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.reach-styles-module__card___16dhP:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.reach-styles-module__card___16dhP{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops));--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: rgb(249 250 251 / .5) var(--tw-gradient-to-position);border-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.reach-styles-module__card___16dhP:hover{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.reach-styles-module__content___pYRpR{display:flex;height:100%;min-height:140px;flex-direction:column;padding:1rem}.reach-styles-module__header___Yxq4J{flex:none}.reach-styles-module__titleRow___AdYCN{display:flex;align-items:flex-start;justify-content:space-between;gap:.5rem}.reach-styles-module__titleContainer___4Sg-1{display:flex;max-width:70%;align-items:flex-start;gap:.5rem}.reach-styles-module__rightColumn___Qm7Pr{display:flex;flex-direction:column;align-items:center;gap:.25rem}.reach-styles-module__cardTitle___pgJm7{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.reach-styles-module__tooltipText___jQMnv{font-size:.875rem;line-height:1.25rem}.reach-styles-module__valueContainer___VBnjC{margin-top:auto}.reach-styles-module__metricValue___6vxdH{font-size:1.5rem;line-height:2rem;font-weight:600;letter-spacing:-.025em;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.reach-styles-module__footer___HPW6-{margin-top:.25rem}.reach-styles-module__footerContent___znjhg{display:flex;align-items:center;gap:.25rem}.reach-styles-module__positive___-z57U{color:#16a34ab3}.reach-styles-module__negative___oWYJQ{color:#dc2626b3}.reach-styles-module__trendIcon___Bn2Kv{height:.75rem;width:.75rem}.reach-styles-module__footerText___8661C{font-size:.75rem;line-height:1rem}.reach-styles-module__titleSkeleton___EHM42{height:1rem;width:6rem}.reach-styles-module__infoIconSkeleton___Xqch0,.reach-styles-module__badgeSkeleton___zfXXM{height:1rem;width:1rem;border-radius:9999px}.reach-styles-module__valueSkeleton___GuhQN{margin-top:auto;height:2rem;width:7rem}.reach-styles-module__footerSkeleton___aeBcZ{margin-top:.25rem;height:1rem;width:8rem}.reach-styles-module__metricsContainer___sLSU8{display:grid;width:100%;gap:1rem;grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width: 640px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1024px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(4,minmax(0,1fr))}}.reach-styles-module__metricsContainer___sLSU8{grid-auto-rows:minmax(0,1fr)}@media (min-width: 1280px){.reach-styles-module__metricsContainer___sLSU8{grid-template-columns:repeat(5,minmax(0,1fr))}}.reach-styles-module__chartCard___uu68R{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartCard___uu68R{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__chartCard___uu68R{--tw-shadow: 0 2px 8px rgba(0,0,0,.04);--tw-shadow-colored: 0 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartCard___uu68R{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}}.reach-styles-module__chartHeader___djnhO{display:flex;flex-direction:column;gap:.5rem;padding:1rem;padding-bottom:0}.reach-styles-module__chartTitleSection___T142a{display:flex;flex-direction:column;gap:.25rem}@media (min-width: 640px){.reach-styles-module__chartTitleSection___T142a{flex-direction:row;align-items:center;justify-content:space-between}}.reach-styles-module__chartTitle___hEksh{font-size:1.125rem;line-height:1.75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartTitle___hEksh{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}}.reach-styles-module__chartDateRange___LZWCQ{display:flex;justify-content:flex-end}.reach-styles-module__dateContainer___ZZOzN{display:flex;align-items:center;gap:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.25rem .75rem}@media (prefers-color-scheme: dark){.reach-styles-module__dateContainer___ZZOzN{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}}.reach-styles-module__dateIcon___DqCwb{height:.875rem;width:.875rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateIcon___DqCwb{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}}.reach-styles-module__dateText___rqjcQ{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateText___rqjcQ{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}}.reach-styles-module__chartContent___1DOVs{padding:1rem}.reach-styles-module__chartContainer___wysu3{height:300px;width:100%;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__chartContainer___wysu3{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__skeletonContainer___Fv6Gl{height:300px;width:100%;padding:1rem}.reach-styles-module__chartSkeleton___VRRcE{height:100%;width:100%;border-radius:.5rem}.reach-styles-module__tooltipContainer___yNPN6{border-radius:.5rem;border-width:0px;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.75rem}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipContainer___yNPN6{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}}.reach-styles-module__tooltipContainer___yNPN6{--tw-bg-opacity: .95;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.reach-styles-module__tooltipGrid___M69Z-{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;min-width:200px}.reach-styles-module__tooltipLabel___k90L-{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipLabel___k90L-{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}}.reach-styles-module__tooltipValue___76dDZ{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__tooltipValue___76dDZ{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}}.reach-styles-module__areaGradientSpend___428-Z{stop-color:#e34a67;stop-opacity:.15}.reach-styles-module__areaGradientSpendEnd___EOpKD{stop-color:#e34a67;stop-opacity:.02}.reach-styles-module__areaGradientRevenue___fB5a0{stop-color:#36b37e;stop-opacity:.15}.reach-styles-module__areaGradientRevenueEnd___X2rf-{stop-color:#36b37e;stop-opacity:.02}.reach-styles-module__legendSpend___-MU-z{--tw-bg-opacity: 1;background-color:rgb(227 74 103 / var(--tw-bg-opacity, 1))}.reach-styles-module__legendRevenue___kWA1z{--tw-bg-opacity: 1;background-color:rgb(54 179 126 / var(--tw-bg-opacity, 1))}.reach-styles-module__tableCard___8xy0b{max-height:500px;width:100%;overflow:auto}.reach-styles-module__skeletonContainer___8EjUC{height:200px}.reach-styles-module__platformBadge___mth-X{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__platformBadge___mth-X{background-color:#1e3a8a4d;--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}}.reach-styles-module__platformBadge___mth-X{display:flex;align-items:center;border-radius:9999px;padding:.125rem .375rem;font-size:10px;overflow:hidden;white-space:nowrap;max-width:90px}.reach-styles-module__platformBadge___mth-X span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__rightAligned___Ou-Ub{text-align:right}.reach-styles-module__statusCell___32iSB{display:inline-flex;align-items:center;border-radius:.375rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500}.reach-styles-module__statusPaid___z3i6-{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(22 163 74 / .2) }.reach-styles-module__statusUnpaid___LSUt4{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(202 138 4 / .2) }.reach-styles-module__badgeContainer___lZ3yD{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding-left:.75rem;padding-right:.75rem}@media (min-width: 320px){.reach-styles-module__badgeContainer___lZ3yD{flex-wrap:nowrap}}.reach-styles-module__dateBadge___otHgz{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__dateBadge___otHgz{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}}.reach-styles-module__dateBadge___otHgz{display:flex;flex-shrink:0;align-items:center;border-radius:9999px;padding:.125rem .375rem;font-size:10px}.reach-styles-module__dateBadge___otHgz span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reach-styles-module__noDataContainer___-1C3o{margin-top:.5rem}.reach-styles-module__container___MU7iK{margin-top:1rem;width:100%}.reach-styles-module__header___yz14d{display:flex;width:100%;flex-direction:column;align-items:flex-start;justify-content:flex-start}@media (min-width: 768px){.reach-styles-module__header___yz14d{flex-direction:row;align-items:center;justify-content:space-between}}.reach-styles-module__header___yz14d{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-bottom:1.5rem}@media (prefers-color-scheme: dark){.reach-styles-module__header___yz14d{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}}.reach-styles-module__actionBarContainer___G5hpa{margin-top:.5rem;display:flex;width:100%;flex-direction:row;align-items:flex-start;justify-content:flex-start}@media (min-width: 768px){.reach-styles-module__actionBarContainer___G5hpa{align-items:center;justify-content:flex-end}}.reach-styles-module__overviewContent___UZVfK{margin-top:.5rem;border-radius:.5rem;padding:1.5rem;--tw-bg-opacity: 1;background-color:rgb(245 247 250 / var(--tw-bg-opacity, 1))}@media (prefers-color-scheme: dark){.reach-styles-module__overviewContent___UZVfK{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}}.reach-styles-module__metricsContainer___23m-t{margin-left:auto;margin-right:auto;display:flex;width:100%;max-width:1800px;flex-direction:column}.reach-styles-module__metricsWrapper___DKNuR{margin-bottom:2rem}.reach-styles-module__chartsGrid___ovwxR{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:2rem}@media (min-width: 1024px){.reach-styles-module__chartsGrid___ovwxR{grid-template-columns:repeat(2,minmax(0,1fr))}}.reach-styles-module__channelContent___Vgz1F,.reach-styles-module__reengagementContent___rEqt7{margin-top:1.5rem}.reach-styles-module__container___lqhzq{width:100%}.reach-styles-module__innerContainer___ESl0A{max-width:80rem}.reach-styles-module__header___D7EkI{display:flex;align-items:center;justify-content:space-between}
|