@eric-emg/symphiq-components 1.2.192 → 1.2.194

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3, MetricEnum, FocusAreaDetailStatusEnum, FocusAreaDomainEnumUtil, FocusAreaDomainEnum, ShopDataLoadStatusEnum, DimensionEnum, UiDataPeriodEnum, UiDataComparePeriodEnum, AiDynamicContentStatusEnum, FocusAreaHealthEnum, ProfileAnalysisPriorityEnum, CapabilityStateEnum, QuadrantEnum, AdvantageEnum, OverallGradeEnum, OperationalMaturityEnum, ProfileAnalysisEffortLevelEnum, ProfileAnalysisImpactLevelEnum, ProfileAnalysisTypeEnum, LineChartUseCaseEnum, BarChartUseCaseEnum } from '@jebgem/model';
1
+ import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, MetricEnum, DimensionEnum, UiDataPeriodEnum, UiDataComparePeriodEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3, FocusAreaDetailStatusEnum, FocusAreaDomainEnumUtil, FocusAreaDomainEnum, ShopDataLoadStatusEnum, AiDynamicContentStatusEnum, FocusAreaHealthEnum, ProfileAnalysisPriorityEnum, CapabilityStateEnum, QuadrantEnum, AdvantageEnum, OverallGradeEnum, OperationalMaturityEnum, ProfileAnalysisEffortLevelEnum, ProfileAnalysisImpactLevelEnum, ProfileAnalysisTypeEnum, LineChartUseCaseEnum, BarChartUseCaseEnum } from '@jebgem/model';
2
2
  export * from '@jebgem/model';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injectable, signal, computed, input, ChangeDetectionStrategy, Component, output, inject, ElementRef, Renderer2, effect, Directive, HostListener, untracked, ViewChild, PLATFORM_ID, Inject, Input } from '@angular/core';
@@ -2535,8 +2535,613 @@ class ConfettiService {
2535
2535
  }]
2536
2536
  }], null, null); })();
2537
2537
 
2538
+ function getCurrentYearStart() {
2539
+ const now = new Date();
2540
+ return new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
2541
+ }
2542
+ function getCurrentYearEnd() {
2543
+ const now = new Date();
2544
+ return new Date(now.getFullYear(), 11, 31, 23, 59, 59, 999);
2545
+ }
2546
+ function getPriorYearStart() {
2547
+ const now = new Date();
2548
+ return new Date(now.getFullYear() - 1, 0, 1, 0, 0, 0, 0);
2549
+ }
2550
+ function getPriorYearEnd() {
2551
+ const now = new Date();
2552
+ return new Date(now.getFullYear() - 1, 11, 31, 23, 59, 59, 999);
2553
+ }
2554
+ function isCurrentYearTarget(target) {
2555
+ if (!target.startDate || !target.endDate) {
2556
+ return false;
2557
+ }
2558
+ const currentYearStart = getCurrentYearStart();
2559
+ const currentYearEnd = getCurrentYearEnd();
2560
+ const targetStart = new Date(target.startDate);
2561
+ const targetEnd = new Date(target.endDate);
2562
+ return (targetStart.getTime() === currentYearStart.getTime() &&
2563
+ targetEnd.getTime() === currentYearEnd.getTime());
2564
+ }
2565
+ function formatCurrency(value, currencySymbol = '$') {
2566
+ return `${currencySymbol}${value.toLocaleString('en-US', {
2567
+ minimumFractionDigits: 0,
2568
+ maximumFractionDigits: 0
2569
+ })}`;
2570
+ }
2571
+ function formatPercentage(value, decimals = 1) {
2572
+ return `${value.toFixed(decimals)}%`;
2573
+ }
2574
+ function formatNumber(value) {
2575
+ return value.toLocaleString('en-US', {
2576
+ minimumFractionDigits: 0,
2577
+ maximumFractionDigits: 0
2578
+ });
2579
+ }
2580
+
2581
+ function calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
2582
+ const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
2583
+ const metricCalculations = [];
2584
+ const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
2585
+ const aFunnel = a.funnelInd ?? 999;
2586
+ const bFunnel = b.funnelInd ?? 999;
2587
+ if (aFunnel !== bFunnel)
2588
+ return aFunnel - bFunnel;
2589
+ const aRelated = a.relatedInd ?? 999;
2590
+ const bRelated = b.relatedInd ?? 999;
2591
+ return aRelated - bRelated;
2592
+ });
2593
+ const funnelStages = getUniqueFunnelStages(sortedFunnelMetrics);
2594
+ const numFunnelStages = funnelStages.length;
2595
+ const revenueIncreaseFactor = revenueTarget / priorYearRevenue;
2596
+ const perStageFactor = Math.pow(revenueIncreaseFactor, 1 / numFunnelStages);
2597
+ const funnelStageMetrics = new Map();
2598
+ sortedFunnelMetrics.forEach(fm => {
2599
+ if (fm.funnelMetric) {
2600
+ if (!funnelStageMetrics.has(fm.funnelMetric)) {
2601
+ funnelStageMetrics.set(fm.funnelMetric, []);
2602
+ }
2603
+ funnelStageMetrics.get(fm.funnelMetric).push(fm);
2604
+ }
2605
+ });
2606
+ const stagePercentageIncrease = (perStageFactor - 1) * 100;
2607
+ sortedFunnelMetrics.forEach((funnelMetric) => {
2608
+ const metric = funnelMetric.relatedMetric;
2609
+ if (!metric)
2610
+ return;
2611
+ const currentValue = baselineValues.get(metric) || 0;
2612
+ const isFunnelStage = funnelMetric.funnelMetric === metric;
2613
+ let percentageIncrease;
2614
+ let targetValue;
2615
+ if (metric === MetricEnum.BOUNCE_RATE) {
2616
+ percentageIncrease = -stagePercentageIncrease;
2617
+ targetValue = currentValue * (1 + percentageIncrease / 100);
2618
+ }
2619
+ else if (isDerivedMetric$1(metric)) {
2620
+ percentageIncrease = 0;
2621
+ targetValue = currentValue;
2622
+ }
2623
+ else {
2624
+ percentageIncrease = stagePercentageIncrease;
2625
+ targetValue = currentValue * perStageFactor;
2626
+ }
2627
+ metricCalculations.push({
2628
+ metric,
2629
+ funnelMetric: funnelMetric.funnelMetric,
2630
+ currentValue,
2631
+ targetValue,
2632
+ percentageIncrease,
2633
+ isFunnelStage,
2634
+ funnelInd: funnelMetric.funnelInd,
2635
+ relatedInd: funnelMetric.relatedInd,
2636
+ description: funnelMetric.relatedMetricDescription
2637
+ });
2638
+ });
2639
+ return {
2640
+ revenueTarget,
2641
+ revenuePercentageIncrease,
2642
+ metricCalculations
2643
+ };
2644
+ }
2645
+ function getUniqueFunnelStages(funnelMetrics) {
2646
+ const stages = [];
2647
+ const seen = new Set();
2648
+ funnelMetrics.forEach(fm => {
2649
+ if (fm.funnelMetric && fm.funnelMetric === fm.relatedMetric && !seen.has(fm.funnelMetric)) {
2650
+ seen.add(fm.funnelMetric);
2651
+ stages.push(fm.funnelMetric);
2652
+ }
2653
+ });
2654
+ return stages;
2655
+ }
2656
+ const DERIVED_METRICS$1 = new Set([
2657
+ MetricEnum.REVENUE_PER_PRODUCT_VIEW,
2658
+ MetricEnum.REVENUE_PER_ADD_TO_CART,
2659
+ MetricEnum.REVENUE_PER_CHECKOUT
2660
+ ]);
2661
+ function isDerivedMetric$1(metric) {
2662
+ return DERIVED_METRICS$1.has(metric);
2663
+ }
2664
+ function generateTargetsFromCalculations(shopId, calculations) {
2665
+ const startDate = getCurrentYearStart();
2666
+ const endDate = getCurrentYearEnd();
2667
+ return calculations.map((calc) => ({
2668
+ shopId,
2669
+ metric: calc.metric,
2670
+ amount: calc.targetValue,
2671
+ startDate,
2672
+ endDate
2673
+ }));
2674
+ }
2675
+ function groupMetricsByFunnelStage(calculations) {
2676
+ const grouped = new Map();
2677
+ calculations.forEach((calc) => {
2678
+ if (calc.funnelMetric) {
2679
+ if (!grouped.has(calc.funnelMetric)) {
2680
+ grouped.set(calc.funnelMetric, []);
2681
+ }
2682
+ grouped.get(calc.funnelMetric).push(calc);
2683
+ }
2684
+ });
2685
+ return grouped;
2686
+ }
2687
+ function getFunnelStageMetrics(calculations) {
2688
+ return calculations.filter((calc) => calc.isFunnelStage);
2689
+ }
2690
+
2691
+ function transformUiDataToChartSeries(mainUiData, ytdComparisonUiData, metricToExtract) {
2692
+ const series = [];
2693
+ if (ytdComparisonUiData?.convertedDataResults) {
2694
+ const priorYearSeries = extractSeriesFromConvertedData(ytdComparisonUiData.convertedDataResults, metricToExtract, 'Prior Year');
2695
+ if (priorYearSeries) {
2696
+ series.push(priorYearSeries);
2697
+ }
2698
+ }
2699
+ if (mainUiData?.convertedDataResults) {
2700
+ const currentYearSeries = extractSeriesFromConvertedData(mainUiData.convertedDataResults, metricToExtract, 'Current Year');
2701
+ if (currentYearSeries) {
2702
+ series.push(currentYearSeries);
2703
+ }
2704
+ }
2705
+ return series;
2706
+ }
2707
+ function extractSeriesFromConvertedData(convertedData, metricToExtract, seriesName) {
2708
+ const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
2709
+ if (metricIndex === undefined || metricIndex === -1)
2710
+ return null;
2711
+ const dimensionIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
2712
+ if (dimensionIndex === undefined || dimensionIndex === -1)
2713
+ return null;
2714
+ const dataPoints = [];
2715
+ convertedData.rows?.forEach((row) => {
2716
+ const monthValue = row.dimensionValues?.[dimensionIndex];
2717
+ const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
2718
+ if (monthValue) {
2719
+ dataPoints.push({
2720
+ category: monthValue,
2721
+ value: metricValue,
2722
+ displayLabel: formatMonthLabel(monthValue)
2723
+ });
2724
+ }
2725
+ });
2726
+ return {
2727
+ name: seriesName,
2728
+ data: sortDataByMonth(dataPoints)
2729
+ };
2730
+ }
2731
+ function formatMonthLabel(monthValue) {
2732
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
2733
+ const monthNum = parseInt(monthValue, 10);
2734
+ if (monthNum >= 1 && monthNum <= 12) {
2735
+ return months[monthNum - 1];
2736
+ }
2737
+ return monthValue;
2738
+ }
2739
+ function sortDataByMonth(data) {
2740
+ return data.sort((a, b) => {
2741
+ const aMonth = parseInt(a.category, 10);
2742
+ const bMonth = parseInt(b.category, 10);
2743
+ return aMonth - bMonth;
2744
+ });
2745
+ }
2746
+ function transformTrendUiDataToChartSeries(trendUiData, metricToExtract) {
2747
+ if (!trendUiData?.convertedDataResults) {
2748
+ return [];
2749
+ }
2750
+ const convertedData = trendUiData.convertedDataResults;
2751
+ const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
2752
+ if (metricIndex === undefined || metricIndex === -1)
2753
+ return [];
2754
+ const dateIndex = convertedData.dimensions?.indexOf(DimensionEnum.DATE);
2755
+ const monthIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
2756
+ const dimensionIndex = dateIndex !== undefined && dateIndex !== -1
2757
+ ? dateIndex
2758
+ : (monthIndex !== undefined && monthIndex !== -1 ? monthIndex : -1);
2759
+ if (dimensionIndex === -1)
2760
+ return [];
2761
+ const currentYear = new Date().getFullYear();
2762
+ const priorYear = currentYear - 1;
2763
+ const priorYearPoints = [];
2764
+ const currentYearPoints = [];
2765
+ convertedData.rows?.forEach((row) => {
2766
+ const dimValue = row.dimensionValues?.[dimensionIndex];
2767
+ const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
2768
+ if (dimValue) {
2769
+ let year;
2770
+ let month;
2771
+ if (dimValue.includes('-')) {
2772
+ const parts = dimValue.split('-');
2773
+ year = parseInt(parts[0], 10);
2774
+ month = parseInt(parts[1], 10);
2775
+ }
2776
+ else if (dimValue.length >= 6) {
2777
+ year = parseInt(dimValue.substring(0, 4), 10);
2778
+ month = parseInt(dimValue.substring(4, 6), 10);
2779
+ }
2780
+ else {
2781
+ month = parseInt(dimValue, 10);
2782
+ year = currentYear;
2783
+ }
2784
+ const point = {
2785
+ category: String(month),
2786
+ value: metricValue,
2787
+ displayLabel: formatMonthLabel(String(month))
2788
+ };
2789
+ if (year === priorYear) {
2790
+ priorYearPoints.push(point);
2791
+ }
2792
+ else if (year === currentYear) {
2793
+ currentYearPoints.push(point);
2794
+ }
2795
+ }
2796
+ });
2797
+ const series = [];
2798
+ if (priorYearPoints.length > 0) {
2799
+ series.push({
2800
+ name: String(priorYear),
2801
+ data: aggregateAndSortByMonth(priorYearPoints)
2802
+ });
2803
+ }
2804
+ if (currentYearPoints.length > 0) {
2805
+ series.push({
2806
+ name: String(currentYear),
2807
+ data: aggregateAndSortByMonth(currentYearPoints)
2808
+ });
2809
+ }
2810
+ return series;
2811
+ }
2812
+ function aggregateAndSortByMonth(points) {
2813
+ const monthMap = new Map();
2814
+ points.forEach(point => {
2815
+ const existing = monthMap.get(point.category);
2816
+ if (existing) {
2817
+ existing.value += point.value;
2818
+ }
2819
+ else {
2820
+ monthMap.set(point.category, { ...point });
2821
+ }
2822
+ });
2823
+ return sortDataByMonth(Array.from(monthMap.values()));
2824
+ }
2825
+ function getConvertedDataForSource(uiData, source) {
2826
+ if (!uiData)
2827
+ return undefined;
2828
+ const periodInfo = uiData.periodInfo;
2829
+ let result;
2830
+ switch (source) {
2831
+ case 'current':
2832
+ result = uiData.convertedDataResults;
2833
+ break;
2834
+ case 'compare':
2835
+ result = uiData.convertedDataResultsCompare;
2836
+ break;
2837
+ case 'priorYear':
2838
+ if (periodInfo?.period === UiDataPeriodEnum.THIS_YEAR &&
2839
+ periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
2840
+ result = uiData.convertedDataResultsCompare;
2841
+ }
2842
+ else if (periodInfo?.period === UiDataPeriodEnum.THIS_AND_LAST_YEAR) {
2843
+ result = uiData.convertedDataResults;
2844
+ }
2845
+ else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.SAME_PERIOD_LAST_YEAR) {
2846
+ result = uiData.convertedDataResultsCompare;
2847
+ }
2848
+ else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
2849
+ result = uiData.convertedDataResultsCompare;
2850
+ }
2851
+ else {
2852
+ result = uiData.convertedDataResultsCompare;
2853
+ }
2854
+ break;
2855
+ }
2856
+ return result;
2857
+ }
2858
+ function sumMetricFromUiData(uiData, metricToSum, source = 'current') {
2859
+ const convertedData = getConvertedDataForSource(uiData, source);
2860
+ if (!convertedData) {
2861
+ return 0;
2862
+ }
2863
+ let total = 0;
2864
+ const metricIndex = convertedData.metrics?.indexOf(metricToSum);
2865
+ if (metricIndex === undefined || metricIndex === -1) {
2866
+ return 0;
2867
+ }
2868
+ convertedData.rows?.forEach((row) => {
2869
+ const rawValue = row.metricValues?.[metricIndex];
2870
+ const metricValue = parseFloat(rawValue || '0');
2871
+ total += metricValue;
2872
+ });
2873
+ return total;
2874
+ }
2875
+
2876
+ function calculateFunnelRatios(funnelMetrics, baselineValues) {
2877
+ const ratios = new Map();
2878
+ const stages = funnelMetrics
2879
+ .filter(fm => fm.funnelMetric === fm.relatedMetric)
2880
+ .sort((a, b) => (a.funnelInd ?? 0) - (b.funnelInd ?? 0));
2881
+ for (let i = 0; i < stages.length - 1; i++) {
2882
+ const fromStage = stages[i].relatedMetric;
2883
+ const toStage = stages[i + 1].relatedMetric;
2884
+ if (fromStage && toStage) {
2885
+ const fromValue = baselineValues.get(fromStage) || 0;
2886
+ const toValue = baselineValues.get(toStage) || 0;
2887
+ if (fromValue > 0) {
2888
+ const ratio = toValue / fromValue;
2889
+ const key = `${fromStage}_to_${toStage}`;
2890
+ ratios.set(key, ratio);
2891
+ }
2892
+ }
2893
+ }
2894
+ return ratios;
2895
+ }
2896
+ function calculateRelatedMetricRatios(funnelMetrics, baselineValues) {
2897
+ const ratios = new Map();
2898
+ const stageGroups = new Map();
2899
+ funnelMetrics.forEach(fm => {
2900
+ if (fm.funnelMetric && fm.relatedMetric && fm.funnelMetric !== fm.relatedMetric) {
2901
+ if (!stageGroups.has(fm.funnelMetric)) {
2902
+ stageGroups.set(fm.funnelMetric, []);
2903
+ }
2904
+ stageGroups.get(fm.funnelMetric).push(fm);
2905
+ }
2906
+ });
2907
+ stageGroups.forEach((relatedMetrics, funnelStage) => {
2908
+ const funnelValue = baselineValues.get(funnelStage) || 0;
2909
+ if (funnelValue > 0) {
2910
+ relatedMetrics.forEach(fm => {
2911
+ if (fm.relatedMetric) {
2912
+ const relatedValue = baselineValues.get(fm.relatedMetric) || 0;
2913
+ const ratio = relatedValue / funnelValue;
2914
+ const key = `${fm.relatedMetric}_to_${funnelStage}`;
2915
+ ratios.set(key, ratio);
2916
+ }
2917
+ });
2918
+ }
2919
+ });
2920
+ return ratios;
2921
+ }
2922
+ function calculateMetricTargetsFromRevenueReverse(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
2923
+ const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
2924
+ const funnelRatios = calculateFunnelRatios(funnelMetrics, baselineValues);
2925
+ const relatedRatios = calculateRelatedMetricRatios(funnelMetrics, baselineValues);
2926
+ const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
2927
+ const aFunnel = a.funnelInd ?? 999;
2928
+ const bFunnel = b.funnelInd ?? 999;
2929
+ if (aFunnel !== bFunnel)
2930
+ return aFunnel - bFunnel;
2931
+ const aRelated = a.relatedInd ?? 999;
2932
+ const bRelated = b.relatedInd ?? 999;
2933
+ return aRelated - bRelated;
2934
+ });
2935
+ const stages = sortedFunnelMetrics
2936
+ .filter(fm => fm.funnelMetric === fm.relatedMetric)
2937
+ .map(fm => fm.relatedMetric)
2938
+ .filter(Boolean);
2939
+ const stageTargets = new Map();
2940
+ let currentRevenue = revenueTarget;
2941
+ for (let i = stages.length - 1; i >= 0; i--) {
2942
+ const stage = stages[i];
2943
+ const baseline = baselineValues.get(stage) || 0;
2944
+ if (i === stages.length - 1) {
2945
+ stageTargets.set(stage, currentRevenue);
2946
+ }
2947
+ else {
2948
+ const nextStage = stages[i + 1];
2949
+ const ratioKey = `${stage}_to_${nextStage}`;
2950
+ const ratio = funnelRatios.get(ratioKey) || 0;
2951
+ if (ratio > 0) {
2952
+ const nextStageTarget = stageTargets.get(nextStage) || 0;
2953
+ currentRevenue = nextStageTarget / ratio;
2954
+ stageTargets.set(stage, currentRevenue);
2955
+ }
2956
+ else {
2957
+ const increaseNeeded = revenueTarget / baseline;
2958
+ stageTargets.set(stage, baseline * increaseNeeded);
2959
+ }
2960
+ }
2961
+ }
2962
+ const metricCalculations = [];
2963
+ const stageGroups = new Map();
2964
+ sortedFunnelMetrics.forEach(fm => {
2965
+ if (fm.funnelMetric) {
2966
+ if (!stageGroups.has(fm.funnelMetric)) {
2967
+ stageGroups.set(fm.funnelMetric, []);
2968
+ }
2969
+ stageGroups.get(fm.funnelMetric).push(fm);
2970
+ }
2971
+ });
2972
+ stageGroups.forEach((metrics, funnelStage) => {
2973
+ const stageTarget = stageTargets.get(funnelStage);
2974
+ const stageBaseline = baselineValues.get(funnelStage) || 0;
2975
+ const stageIncrease = stageTarget ? stageTarget - stageBaseline : 0;
2976
+ metrics.forEach(fm => {
2977
+ if (!fm.relatedMetric)
2978
+ return;
2979
+ const currentValue = baselineValues.get(fm.relatedMetric) || 0;
2980
+ const isFunnelStage = fm.funnelMetric === fm.relatedMetric;
2981
+ let targetValue;
2982
+ let percentageIncrease;
2983
+ if (isFunnelStage && stageTarget !== undefined) {
2984
+ targetValue = stageTarget;
2985
+ percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
2986
+ }
2987
+ else if (fm.relatedMetric === MetricEnum.BOUNCE_RATE) {
2988
+ const stageTargetValue = stageTargets.get(funnelStage) || stageBaseline;
2989
+ const stageIncreaseRatio = stageBaseline > 0 ? stageTargetValue / stageBaseline : 1;
2990
+ targetValue = currentValue / stageIncreaseRatio;
2991
+ percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
2992
+ }
2993
+ else if (isDerivedMetric(fm.relatedMetric)) {
2994
+ targetValue = currentValue;
2995
+ percentageIncrease = 0;
2996
+ }
2997
+ else {
2998
+ const ratioKey = `${fm.relatedMetric}_to_${funnelStage}`;
2999
+ const impactRatio = relatedRatios.get(ratioKey) || 1;
3000
+ const relatedMetrics = metrics.filter(m => m.relatedMetric &&
3001
+ m.relatedMetric !== funnelStage &&
3002
+ !isDerivedMetric(m.relatedMetric) &&
3003
+ m.relatedMetric !== MetricEnum.BOUNCE_RATE);
3004
+ const numRelatedMetrics = relatedMetrics.length;
3005
+ if (numRelatedMetrics > 0 && stageBaseline > 0) {
3006
+ const avgIncreaseNeeded = stageIncrease / numRelatedMetrics;
3007
+ const metricIncreaseNeeded = impactRatio > 0 ? avgIncreaseNeeded / impactRatio : avgIncreaseNeeded;
3008
+ targetValue = currentValue + metricIncreaseNeeded;
3009
+ percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
3010
+ }
3011
+ else {
3012
+ const stageTargetValue = stageTargets.get(funnelStage) || stageBaseline;
3013
+ const stageIncreaseRatio = stageBaseline > 0 ? stageTargetValue / stageBaseline : 1;
3014
+ targetValue = currentValue * stageIncreaseRatio;
3015
+ percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
3016
+ }
3017
+ }
3018
+ metricCalculations.push({
3019
+ metric: fm.relatedMetric,
3020
+ funnelMetric: fm.funnelMetric,
3021
+ currentValue,
3022
+ targetValue,
3023
+ percentageIncrease,
3024
+ isFunnelStage,
3025
+ funnelInd: fm.funnelInd,
3026
+ relatedInd: fm.relatedInd,
3027
+ description: fm.relatedMetricDescription
3028
+ });
3029
+ });
3030
+ });
3031
+ const validation = validateRevenueTarget(revenueTarget, metricCalculations, baselineValues, funnelRatios);
3032
+ let adjustmentApplied = 0;
3033
+ if (Math.abs(validation.difference) > 0.01) {
3034
+ metricCalculations.forEach(calc => {
3035
+ if (calc.isFunnelStage && calc.metric !== MetricEnum.BOUNCE_RATE) {
3036
+ calc.targetValue += validation.difference / stages.length;
3037
+ calc.percentageIncrease = calc.currentValue > 0
3038
+ ? ((calc.targetValue - calc.currentValue) / calc.currentValue) * 100
3039
+ : 0;
3040
+ }
3041
+ });
3042
+ adjustmentApplied = validation.difference;
3043
+ }
3044
+ return {
3045
+ revenueTarget,
3046
+ revenuePercentageIncrease,
3047
+ metricCalculations,
3048
+ adjustmentApplied
3049
+ };
3050
+ }
3051
+ const DERIVED_METRICS = new Set([
3052
+ MetricEnum.REVENUE_PER_PRODUCT_VIEW,
3053
+ MetricEnum.REVENUE_PER_ADD_TO_CART,
3054
+ MetricEnum.REVENUE_PER_CHECKOUT
3055
+ ]);
3056
+ function isDerivedMetric(metric) {
3057
+ return DERIVED_METRICS.has(metric);
3058
+ }
3059
+ function validateRevenueTarget(targetRevenue, calculations, baselineValues, funnelRatios) {
3060
+ const stages = calculations
3061
+ .filter(c => c.isFunnelStage)
3062
+ .sort((a, b) => (a.funnelInd ?? 0) - (b.funnelInd ?? 0));
3063
+ let calculatedRevenue = 0;
3064
+ if (stages.length > 0) {
3065
+ calculatedRevenue = stages[stages.length - 1].targetValue;
3066
+ }
3067
+ const difference = targetRevenue - calculatedRevenue;
3068
+ const percentageDifference = targetRevenue > 0 ? (difference / targetRevenue) * 100 : 0;
3069
+ const withinTolerance = Math.abs(difference) < 0.01 || Math.abs(percentageDifference) < 0.001;
3070
+ return {
3071
+ calculatedRevenue,
3072
+ difference,
3073
+ percentageDifference,
3074
+ withinTolerance
3075
+ };
3076
+ }
3077
+
3078
+ class RevenueCalculatorService {
3079
+ calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics) {
3080
+ const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
3081
+ const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
3082
+ return calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
3083
+ }
3084
+ calculateTargetsFromPercentage(percentageIncrease, mainUiData, funnelMetrics) {
3085
+ const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
3086
+ const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
3087
+ return this.calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics);
3088
+ }
3089
+ calculateTargetsFromRevenueWithRatios(revenueTarget, mainUiData, funnelMetrics) {
3090
+ const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
3091
+ const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
3092
+ return calculateMetricTargetsFromRevenueReverse(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
3093
+ }
3094
+ calculateTargetsFromPercentageWithRatios(percentageIncrease, mainUiData, funnelMetrics) {
3095
+ const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
3096
+ const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
3097
+ return this.calculateTargetsFromRevenueWithRatios(revenueTarget, mainUiData, funnelMetrics);
3098
+ }
3099
+ extractPriorYearRevenue(mainUiData) {
3100
+ return sumMetricFromUiData(mainUiData, MetricEnum.PURCHASE_REVENUE, 'priorYear');
3101
+ }
3102
+ extractBaselineValues(mainUiData, funnelMetrics) {
3103
+ const baselineValues = new Map();
3104
+ if (!mainUiData) {
3105
+ return baselineValues;
3106
+ }
3107
+ funnelMetrics.forEach(fm => {
3108
+ if (fm.relatedMetric) {
3109
+ const value = sumMetricFromUiData(mainUiData, fm.relatedMetric, 'priorYear');
3110
+ baselineValues.set(fm.relatedMetric, value);
3111
+ }
3112
+ });
3113
+ return baselineValues;
3114
+ }
3115
+ getMetricsByFunnelStage(calculations) {
3116
+ const grouped = new Map();
3117
+ calculations.forEach(calc => {
3118
+ if (calc.isFunnelStage) {
3119
+ if (!grouped.has(calc.metric)) {
3120
+ grouped.set(calc.metric, []);
3121
+ }
3122
+ grouped.get(calc.metric).push(calc);
3123
+ }
3124
+ else if (calc.funnelMetric) {
3125
+ if (!grouped.has(calc.funnelMetric)) {
3126
+ grouped.set(calc.funnelMetric, []);
3127
+ }
3128
+ grouped.get(calc.funnelMetric).push(calc);
3129
+ }
3130
+ });
3131
+ return grouped;
3132
+ }
3133
+ static { this.ɵfac = function RevenueCalculatorService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RevenueCalculatorService)(); }; }
3134
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: RevenueCalculatorService, factory: RevenueCalculatorService.ɵfac, providedIn: 'root' }); }
3135
+ }
3136
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RevenueCalculatorService, [{
3137
+ type: Injectable,
3138
+ args: [{
3139
+ providedIn: 'root'
3140
+ }]
3141
+ }], null, null); })();
3142
+
2538
3143
  const _c0$16 = a0 => ["skeleton-loader", "rounded-lg", "relative", "overflow-hidden", a0];
2539
- const _c1$C = a0 => ["skeleton-shimmer-overlay", "absolute", "inset-0", "bg-gradient-to-r", a0];
3144
+ const _c1$D = a0 => ["skeleton-shimmer-overlay", "absolute", "inset-0", "bg-gradient-to-r", a0];
2540
3145
  class SkeletonLoaderComponent {
2541
3146
  constructor() {
2542
3147
  this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
@@ -2554,7 +3159,7 @@ class SkeletonLoaderComponent {
2554
3159
  i0.ɵɵclassProp("skeleton-shimmer", true)("skeleton-pulse", ctx.pulse());
2555
3160
  i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c0$16, ctx.isLightMode() ? "bg-slate-200/80" : "bg-slate-700/80"));
2556
3161
  i0.ɵɵadvance();
2557
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(12, _c1$C, ctx.isLightMode() ? "from-transparent via-white/60 to-transparent" : "from-transparent via-slate-500/40 to-transparent"));
3162
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(12, _c1$D, ctx.isLightMode() ? "from-transparent via-white/60 to-transparent" : "from-transparent via-slate-500/40 to-transparent"));
2558
3163
  } }, dependencies: [NgClass], styles: [".skeleton-loader[_ngcontent-%COMP%]{position:relative;overflow:hidden}.skeleton-shimmer-overlay[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_shimmer 2s infinite cubic-bezier(.4,0,.6,1);transform:translate(-100%)}@keyframes _ngcontent-%COMP%_shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.skeleton-pulse[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.6}}"], changeDetection: 0 }); }
2559
3164
  }
2560
3165
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkeletonLoaderComponent, [{
@@ -5496,7 +6101,7 @@ class OverallAssessmentComponent {
5496
6101
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(OverallAssessmentComponent, { className: "OverallAssessmentComponent", filePath: "lib/components/funnel-analysis-dashboard/overall-assessment.component.ts", lineNumber: 303 }); })();
5497
6102
 
5498
6103
  const _c0$13 = () => [1, 2, 3];
5499
- const _c1$B = () => [1, 2, 3, 4];
6104
+ const _c1$C = () => [1, 2, 3, 4];
5500
6105
  const _c2$q = () => [];
5501
6106
  function InsightCardComponent_Conditional_0_Conditional_0_For_7_Template(rf, ctx) { if (rf & 1) {
5502
6107
  i0.ɵɵelementStart(0, "div", 7);
@@ -5535,7 +6140,7 @@ function InsightCardComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if
5535
6140
  i0.ɵɵadvance();
5536
6141
  i0.ɵɵrepeater(i0.ɵɵpureFunction0(8, _c0$13));
5537
6142
  i0.ɵɵadvance(3);
5538
- i0.ɵɵrepeater(i0.ɵɵpureFunction0(9, _c1$B));
6143
+ i0.ɵɵrepeater(i0.ɵɵpureFunction0(9, _c1$C));
5539
6144
  } }
5540
6145
  function InsightCardComponent_Conditional_0_Conditional_1_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
5541
6146
  i0.ɵɵnamespaceSVG();
@@ -8234,7 +8839,7 @@ class MetricCardComponent {
8234
8839
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricCardComponent, { className: "MetricCardComponent", filePath: "lib/components/funnel-analysis-dashboard/metric-card.component.ts", lineNumber: 537 }); })();
8235
8840
 
8236
8841
  const _c0$12 = () => [1, 2, 3];
8237
- const _c1$A = (a0, a1, a2) => [a0, a1, a2];
8842
+ const _c1$B = (a0, a1, a2) => [a0, a1, a2];
8238
8843
  const _c2$p = (a0, a1) => [a0, a1];
8239
8844
  const _forTrack0$O = ($index, $item) => $item.metric;
8240
8845
  const _forTrack1$7 = ($index, $item) => $item.dimensionValue;
@@ -8446,7 +9051,7 @@ function BreakdownSectionComponent_Conditional_1_For_9_For_27_Template(rf, ctx)
8446
9051
  const ɵ$index_133_r9 = ctx.$index;
8447
9052
  const group_r5 = i0.ɵɵnextContext().$implicit;
8448
9053
  const ctx_r0 = i0.ɵɵnextContext(2);
8449
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(31, _c1$A, ctx_r0.getRowBackgroundClass(metric_r8, ɵ$index_133_r9), ctx_r0.getPriorityDividerClass(metric_r8, ɵ$index_133_r9, group_r5.values), ctx_r0.isLightMode() ? "hover:bg-blue-50" : "hover:bg-slate-700/30"));
9054
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(31, _c1$B, ctx_r0.getRowBackgroundClass(metric_r8, ɵ$index_133_r9), ctx_r0.getPriorityDividerClass(metric_r8, ɵ$index_133_r9, group_r5.values), ctx_r0.isLightMode() ? "hover:bg-blue-50" : "hover:bg-slate-700/30"));
8450
9055
  i0.ɵɵadvance(3);
8451
9056
  i0.ɵɵproperty("ngClass", ctx_r0.isLightMode() ? "text-slate-600 group-hover:text-slate-900" : "text-slate-400 group-hover:text-white")("libSymphiqTooltip", ctx_r0.getBreakdownRowTooltip(metric_r8))("tooltipPosition", "auto");
8452
9057
  i0.ɵɵadvance();
@@ -13834,20 +14439,12 @@ class ProfileItemLookupService {
13834
14439
  return undefined;
13835
14440
  }
13836
14441
  findItemsByIds(ids) {
13837
- console.log('[ProfileItemLookupService] findItemsByIds called:', {
13838
- inputIds: ids,
13839
- hasProfileData: !!this.profileData(),
13840
- hasProfileStructured: !!this.profileData()?.profileStructured,
13841
- hasSections: !!this.profileData()?.profileStructured?.sections
13842
- });
13843
14442
  const results = ids
13844
14443
  .map(id => {
13845
14444
  const found = this.findItemById(id);
13846
- console.log('[ProfileItemLookupService] findItemById:', { id, found: !!found });
13847
14445
  return found;
13848
14446
  })
13849
14447
  .filter((item) => item !== undefined);
13850
- console.log('[ProfileItemLookupService] findItemsByIds result:', { inputCount: ids.length, foundCount: results.length });
13851
14448
  return results;
13852
14449
  }
13853
14450
  findItemWithContext(id) {
@@ -13924,11 +14521,6 @@ class RelatedAreaChipsComponent {
13924
14521
  this.relatedItems = computed(() => {
13925
14522
  const ids = this.relatedAreaIds();
13926
14523
  const items = this.lookupService.findItemsByIds(ids);
13927
- console.log('[RelatedAreaChips] relatedItems computed:', {
13928
- inputIds: ids,
13929
- foundItems: items,
13930
- foundCount: items.length
13931
- });
13932
14524
  return items;
13933
14525
  }, ...(ngDevMode ? [{ debugName: "relatedItems" }] : []));
13934
14526
  }
@@ -14032,16 +14624,8 @@ class CompetitorChipListComponent {
14032
14624
  this.modalService = inject(ModalService);
14033
14625
  this.competitorItems = computed(() => {
14034
14626
  const ids = this.relatedCompetitorIds();
14035
- console.log('[CompetitorChipList] competitorItems computed:', {
14036
- inputIds: ids,
14037
- hasIds: ids && ids.length > 0
14038
- });
14039
14627
  if (ids && ids.length > 0) {
14040
14628
  const items = this.lookupService.findItemsByIds(ids);
14041
- console.log('[CompetitorChipList] lookupService.findItemsByIds result:', {
14042
- foundItems: items,
14043
- foundCount: items.length
14044
- });
14045
14629
  return items;
14046
14630
  }
14047
14631
  return [];
@@ -14049,11 +14633,9 @@ class CompetitorChipListComponent {
14049
14633
  this.displayItems = computed(() => {
14050
14634
  const items = this.competitorItems();
14051
14635
  if (items.length > 0) {
14052
- console.log('[CompetitorChipList] displayItems: using competitorItems', { count: items.length });
14053
14636
  return items;
14054
14637
  }
14055
14638
  const fallbackItems = this.competitors().map(name => ({ label: name }));
14056
- console.log('[CompetitorChipList] displayItems: using fallback competitors', { count: fallbackItems.length, fallbackItems });
14057
14639
  return fallbackItems;
14058
14640
  }, ...(ngDevMode ? [{ debugName: "displayItems" }] : []));
14059
14641
  }
@@ -14599,7 +15181,6 @@ class RelatedRecommendationChipsComponent {
14599
15181
  scrollToRecommendation(recommendationId) {
14600
15182
  const targetElement = document.getElementById(`recommendation-${recommendationId}`);
14601
15183
  if (!targetElement) {
14602
- console.warn(`Recommendation element not found: recommendation-${recommendationId}`);
14603
15184
  const recommendationsSection = document.querySelector('[data-subsection-id="recommendations"]');
14604
15185
  if (recommendationsSection) {
14605
15186
  const expandButton = recommendationsSection.querySelector('[aria-expanded="false"]');
@@ -15422,29 +16003,13 @@ class RecommendationCardComponent {
15422
16003
  let result;
15423
16004
  if (this.recommendation()) {
15424
16005
  result = this.recommendation();
15425
- console.log('[RecommendationCard] detailedRecommendation: using direct recommendation input', {
15426
- id: result?.id,
15427
- hasRelatedCompetitorIds: !!result?.relatedCompetitorIds,
15428
- relatedCompetitorIds: result?.relatedCompetitorIds,
15429
- hasRelatedProfileItemIds: !!result?.relatedProfileItemIds,
15430
- relatedProfileItemIds: result?.relatedProfileItemIds
15431
- });
15432
16006
  return result;
15433
16007
  }
15434
16008
  const item = this.item();
15435
16009
  if (!item?.id) {
15436
- console.log('[RecommendationCard] detailedRecommendation: no item id');
15437
16010
  return undefined;
15438
16011
  }
15439
16012
  result = this.profileContextService.getRecommendationById(item.id);
15440
- console.log('[RecommendationCard] detailedRecommendation: from profileContextService', {
15441
- itemId: item.id,
15442
- found: !!result,
15443
- hasRelatedCompetitorIds: !!result?.relatedCompetitorIds,
15444
- relatedCompetitorIds: result?.relatedCompetitorIds,
15445
- hasRelatedProfileItemIds: !!result?.relatedProfileItemIds,
15446
- relatedProfileItemIds: result?.relatedProfileItemIds
15447
- });
15448
16013
  return result;
15449
16014
  }, ...(ngDevMode ? [{ debugName: "detailedRecommendation" }] : []));
15450
16015
  this.businessContextItems = computed(() => {
@@ -15507,13 +16072,6 @@ class RecommendationCardComponent {
15507
16072
  const hasCompetitors = !!(detailed?.relatedCompetitorIds && detailed.relatedCompetitorIds.length > 0);
15508
16073
  const isExpanded = this.isActuallyExpanded();
15509
16074
  const shouldShow = hasCompetitors && isExpanded;
15510
- console.log('[RecommendationCard] shouldShowRelatedCompetitors:', {
15511
- hasDetailedRec: !!detailed,
15512
- relatedCompetitorIds: detailed?.relatedCompetitorIds,
15513
- hasCompetitors,
15514
- isExpanded,
15515
- shouldShow
15516
- });
15517
16075
  return shouldShow;
15518
16076
  }, ...(ngDevMode ? [{ debugName: "shouldShowRelatedCompetitors" }] : []));
15519
16077
  this.shouldShowRelatedAreas = computed(() => {
@@ -15521,13 +16079,6 @@ class RecommendationCardComponent {
15521
16079
  const hasAreas = !!(detailed?.relatedProfileItemIds && detailed.relatedProfileItemIds.length > 0);
15522
16080
  const isExpanded = this.isActuallyExpanded();
15523
16081
  const shouldShow = hasAreas && isExpanded;
15524
- console.log('[RecommendationCard] shouldShowRelatedAreas:', {
15525
- hasDetailedRec: !!detailed,
15526
- relatedProfileItemIds: detailed?.relatedProfileItemIds,
15527
- hasAreas,
15528
- isExpanded,
15529
- shouldShow
15530
- });
15531
16082
  return shouldShow;
15532
16083
  }, ...(ngDevMode ? [{ debugName: "shouldShowRelatedAreas" }] : []));
15533
16084
  this.shouldShowRelatedFocusAreas = computed(() => {
@@ -15701,23 +16252,9 @@ class RecommendationCardComponent {
15701
16252
  return detailed?.relatedFocusAreas || [];
15702
16253
  }
15703
16254
  logCompetitorData() {
15704
- const detailed = this.detailedRecommendation();
15705
- console.log('[RecommendationCard] logCompetitorData:', {
15706
- recommendationId: this.item()?.id,
15707
- recommendationLabel: this.displayItem()?.label,
15708
- relatedCompetitorIds: detailed?.relatedCompetitorIds,
15709
- hasCompetitors: !!(detailed?.relatedCompetitorIds && detailed.relatedCompetitorIds.length > 0)
15710
- });
15711
16255
  return false;
15712
16256
  }
15713
16257
  logAreaData() {
15714
- const detailed = this.detailedRecommendation();
15715
- console.log('[RecommendationCard] logAreaData:', {
15716
- recommendationId: this.item()?.id,
15717
- recommendationLabel: this.displayItem()?.label,
15718
- relatedProfileItemIds: detailed?.relatedProfileItemIds,
15719
- hasAreas: !!(detailed?.relatedProfileItemIds && detailed.relatedProfileItemIds.length > 0)
15720
- });
15721
16258
  return false;
15722
16259
  }
15723
16260
  onCardClick(event) {
@@ -24531,9 +25068,6 @@ class FloatingTocComponent {
24531
25068
  if (element) {
24532
25069
  this.scrollToElement(element);
24533
25070
  }
24534
- else {
24535
- console.warn('[FloatingTOC] Element not found for section:', sectionId);
24536
- }
24537
25071
  if (!this.isPinned()) {
24538
25072
  this.isHovered.set(false);
24539
25073
  }
@@ -24543,9 +25077,6 @@ class FloatingTocComponent {
24543
25077
  if (element) {
24544
25078
  this.scrollToElement(element);
24545
25079
  }
24546
- else {
24547
- console.warn('[FloatingTOC] Element not found for subsection:', subsectionId);
24548
- }
24549
25080
  if (!this.isPinned()) {
24550
25081
  this.isHovered.set(false);
24551
25082
  }
@@ -26775,7 +27306,7 @@ class FunnelWelcomeBannerComponent {
26775
27306
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelWelcomeBannerComponent, { className: "FunnelWelcomeBannerComponent", filePath: "lib/components/funnel-analysis-dashboard/funnel-welcome-banner.component.ts", lineNumber: 113 }); })();
26776
27307
 
26777
27308
  const _c0$W = [[["", "slot", "overall-performance"]], [["", "slot", "performance-metrics"]], [["", "slot", "performance-breakdowns"]], [["", "slot", "competitive-intelligence"]]];
26778
- const _c1$z = ["[slot=overall-performance]", "[slot=performance-metrics]", "[slot=performance-breakdowns]", "[slot=competitive-intelligence]"];
27309
+ const _c1$A = ["[slot=overall-performance]", "[slot=performance-metrics]", "[slot=performance-breakdowns]", "[slot=competitive-intelligence]"];
26779
27310
  class CollapsibleFunnelSectionGroupComponent {
26780
27311
  constructor() {
26781
27312
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
@@ -26906,7 +27437,7 @@ class CollapsibleFunnelSectionGroupComponent {
26906
27437
  : 'border-slate-200';
26907
27438
  }
26908
27439
  static { this.ɵfac = function CollapsibleFunnelSectionGroupComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollapsibleFunnelSectionGroupComponent)(); }; }
26909
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollapsibleFunnelSectionGroupComponent, selectors: [["symphiq-collapsible-funnel-section-group"]], inputs: { viewMode: [1, "viewMode"] }, ngContentSelectors: _c1$z, decls: 90, vars: 58, consts: [[1, "rounded-2xl", "border", "shadow-lg", "overflow-hidden", 3, "ngClass"], [1, "px-6", "py-5", "border-b", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "flex", "items-center", "gap-3"], [1, "p-2.5", "rounded-lg", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", "mt-0.5", 3, "ngClass"], [1, "p-6", 3, "ngClass"], [1, "mb-6", "p-4", "rounded-xl", "border", "flex", "items-start", "gap-3", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "flex-1"], [1, "font-semibold", "text-sm", "mb-1", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "space-y-3"], [1, "rounded-xl", "border", "overflow-hidden", "transition-all", "duration-200", 3, "id", "ngClass"], ["type", "button", 1, "cursor-pointer", "w-full", "px-5", "py-4", "flex", "items-center", "justify-between", "gap-4", "text-left", "transition-colors", "duration-200", 3, "click", "ngClass"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], [1, "p-2", "rounded-lg", "flex-shrink-0", "transition-colors", "duration-200", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"], [1, "flex-1", "min-w-0"], [1, "font-semibold", "transition-colors", "duration-200", 3, "ngClass"], [1, "text-sm", "mt-0.5", "transition-colors", "duration-200", 3, "ngClass"], [1, "w-5", "h-5", "flex-shrink-0", "transition-transform", "duration-200", 3, "ngClass"], ["stroke", "currentColor", "stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden"], [1, "border-t", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"]], template: function CollapsibleFunnelSectionGroupComponent_Template(rf, ctx) { if (rf & 1) {
27440
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollapsibleFunnelSectionGroupComponent, selectors: [["symphiq-collapsible-funnel-section-group"]], inputs: { viewMode: [1, "viewMode"] }, ngContentSelectors: _c1$A, decls: 90, vars: 58, consts: [[1, "rounded-2xl", "border", "shadow-lg", "overflow-hidden", 3, "ngClass"], [1, "px-6", "py-5", "border-b", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "flex", "items-center", "gap-3"], [1, "p-2.5", "rounded-lg", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", "mt-0.5", 3, "ngClass"], [1, "p-6", 3, "ngClass"], [1, "mb-6", "p-4", "rounded-xl", "border", "flex", "items-start", "gap-3", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "flex-1"], [1, "font-semibold", "text-sm", "mb-1", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "space-y-3"], [1, "rounded-xl", "border", "overflow-hidden", "transition-all", "duration-200", 3, "id", "ngClass"], ["type", "button", 1, "cursor-pointer", "w-full", "px-5", "py-4", "flex", "items-center", "justify-between", "gap-4", "text-left", "transition-colors", "duration-200", 3, "click", "ngClass"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], [1, "p-2", "rounded-lg", "flex-shrink-0", "transition-colors", "duration-200", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"], [1, "flex-1", "min-w-0"], [1, "font-semibold", "transition-colors", "duration-200", 3, "ngClass"], [1, "text-sm", "mt-0.5", "transition-colors", "duration-200", 3, "ngClass"], [1, "w-5", "h-5", "flex-shrink-0", "transition-transform", "duration-200", 3, "ngClass"], ["stroke", "currentColor", "stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden"], [1, "border-t", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"]], template: function CollapsibleFunnelSectionGroupComponent_Template(rf, ctx) { if (rf & 1) {
26910
27441
  i0.ɵɵprojectionDef(_c0$W);
26911
27442
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "div", 4);
26912
27443
  i0.ɵɵnamespaceSVG();
@@ -27751,7 +28282,7 @@ class ViewModeSwitcherModalComponent {
27751
28282
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewModeSwitcherModalComponent, { className: "ViewModeSwitcherModalComponent", filePath: "lib/components/shared/view-mode-switcher-modal.component.ts", lineNumber: 160 }); })();
27752
28283
 
27753
28284
  const _c0$V = a0 => ({ name: "check-badge", source: a0 });
27754
- const _c1$y = a0 => ({ name: "check-circle", source: a0 });
28285
+ const _c1$z = a0 => ({ name: "check-circle", source: a0 });
27755
28286
  const _c2$o = a0 => ({ name: "chevron-right", source: a0 });
27756
28287
  const _forTrack0$z = ($index, $item) => $item.area;
27757
28288
  function KeyStrengthsListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -27812,7 +28343,7 @@ function KeyStrengthsListModalContentComponent_Conditional_2_For_2_Template(rf,
27812
28343
  i0.ɵɵadvance();
27813
28344
  i0.ɵɵtextInterpolate1(" ", strength_r3.description, " ");
27814
28345
  i0.ɵɵadvance(3);
27815
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$y, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
28346
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$z, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
27816
28347
  i0.ɵɵadvance();
27817
28348
  i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
27818
28349
  i0.ɵɵadvance();
@@ -27983,7 +28514,7 @@ class KeyStrengthsListModalContentComponent {
27983
28514
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KeyStrengthsListModalContentComponent, { className: "KeyStrengthsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/key-strengths-list-modal-content.component.ts", lineNumber: 79 }); })();
27984
28515
 
27985
28516
  const _c0$U = a0 => ({ name: "shield-check", source: a0 });
27986
- const _c1$x = a0 => ({ name: "exclamation-triangle", source: a0 });
28517
+ const _c1$y = a0 => ({ name: "exclamation-triangle", source: a0 });
27987
28518
  const _c2$n = a0 => ({ name: "document-text", source: a0 });
27988
28519
  const _c3$h = a0 => ({ name: "chevron-right", source: a0 });
27989
28520
  const _forTrack0$y = ($index, $item) => $item.area;
@@ -28053,7 +28584,7 @@ function CriticalGapsListModalContentComponent_Conditional_2_For_2_Template(rf,
28053
28584
  i0.ɵɵadvance();
28054
28585
  i0.ɵɵproperty("ngClass", ctx_r0.impactContainerClasses());
28055
28586
  i0.ɵɵadvance(2);
28056
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(19, _c1$x, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.impactIconClasses(gap_r3.urgency));
28587
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(19, _c1$y, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.impactIconClasses(gap_r3.urgency));
28057
28588
  i0.ɵɵadvance(2);
28058
28589
  i0.ɵɵproperty("ngClass", ctx_r0.impactLabelClasses());
28059
28590
  i0.ɵɵadvance(2);
@@ -28299,7 +28830,7 @@ class CriticalGapsListModalContentComponent {
28299
28830
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CriticalGapsListModalContentComponent, { className: "CriticalGapsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/critical-gaps-list-modal-content.component.ts", lineNumber: 98 }); })();
28300
28831
 
28301
28832
  const _c0$T = a0 => ({ name: "check-circle", source: a0 });
28302
- const _c1$w = a0 => ({ name: "chat-bubble-left-right", source: a0 });
28833
+ const _c1$x = a0 => ({ name: "chat-bubble-left-right", source: a0 });
28303
28834
  const _forTrack0$x = ($index, $item) => $item.questionId;
28304
28835
  function KeyStrengthDetailModalContentComponent_Conditional_13_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
28305
28836
  i0.ɵɵelementStart(0, "div", 19)(1, "span", 20);
@@ -28329,7 +28860,7 @@ function KeyStrengthDetailModalContentComponent_Conditional_13_For_6_Template(rf
28329
28860
  const ctx_r1 = i0.ɵɵnextContext(2);
28330
28861
  i0.ɵɵproperty("ngClass", ctx_r1.answerCardClasses());
28331
28862
  i0.ɵɵadvance(2);
28332
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(8, _c1$w, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.answerIconClasses());
28863
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(8, _c1$x, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.answerIconClasses());
28333
28864
  i0.ɵɵadvance(2);
28334
28865
  i0.ɵɵproperty("ngClass", ctx_r1.questionClasses());
28335
28866
  i0.ɵɵadvance();
@@ -28540,7 +29071,7 @@ class KeyStrengthDetailModalContentComponent {
28540
29071
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KeyStrengthDetailModalContentComponent, { className: "KeyStrengthDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/key-strength-detail-modal-content.component.ts", lineNumber: 79 }); })();
28541
29072
 
28542
29073
  const _c0$S = a0 => ({ name: "exclamation-triangle", source: a0 });
28543
- const _c1$v = a0 => ({ name: "document-text", source: a0 });
29074
+ const _c1$w = a0 => ({ name: "document-text", source: a0 });
28544
29075
  const _c2$m = a0 => ({ name: "chat-bubble-left-right", source: a0 });
28545
29076
  const _forTrack0$w = ($index, $item) => $item.questionId;
28546
29077
  function CriticalGapDetailModalContentComponent_Conditional_20_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
@@ -28618,7 +29149,7 @@ function CriticalGapDetailModalContentComponent_Conditional_20_Template(rf, ctx)
28618
29149
  i0.ɵɵclassMap(ctx_r1.isLightMode() ? "border-slate-200" : "border-slate-700");
28619
29150
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
28620
29151
  i0.ɵɵadvance();
28621
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(5, _c1$v, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.sectionIconClasses());
29152
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(5, _c1$w, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.sectionIconClasses());
28622
29153
  i0.ɵɵadvance(3);
28623
29154
  i0.ɵɵrepeater(ctx_r1.gap().supportingAnswers);
28624
29155
  } }
@@ -30403,7 +30934,7 @@ class TopPriorityDetailModalContentComponent {
30403
30934
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TopPriorityDetailModalContentComponent, { className: "TopPriorityDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/top-priority-detail-modal-content.component.ts", lineNumber: 72 }); })();
30404
30935
 
30405
30936
  const _c0$R = a0 => ({ name: "check-badge", source: a0 });
30406
- const _c1$u = a0 => ({ name: "check-circle", source: a0 });
30937
+ const _c1$v = a0 => ({ name: "check-circle", source: a0 });
30407
30938
  const _c2$l = a0 => ({ name: "chevron-right", source: a0 });
30408
30939
  const _c3$g = a0 => ({ name: "chart-bar", source: a0 });
30409
30940
  const _forTrack0$v = ($index, $item) => $item.capability;
@@ -30511,7 +31042,7 @@ function FocusAreaStrengthsListModalContentComponent_Conditional_2_For_2_Templat
30511
31042
  i0.ɵɵadvance(2);
30512
31043
  i0.ɵɵconditional(ctx_r0.getLinkedMetricsCount(strength_r3) > 0 ? 9 : -1);
30513
31044
  i0.ɵɵadvance(2);
30514
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$u, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
31045
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$v, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
30515
31046
  i0.ɵɵadvance();
30516
31047
  i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
30517
31048
  i0.ɵɵadvance();
@@ -30726,7 +31257,7 @@ class FocusAreaStrengthsListModalContentComponent {
30726
31257
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaStrengthsListModalContentComponent, { className: "FocusAreaStrengthsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-strengths-list-modal-content.component.ts", lineNumber: 109 }); })();
30727
31258
 
30728
31259
  const _c0$Q = a0 => ({ name: "exclamation-triangle", source: a0 });
30729
- const _c1$t = a0 => ({ name: "exclamation-circle", source: a0 });
31260
+ const _c1$u = a0 => ({ name: "exclamation-circle", source: a0 });
30730
31261
  const _c2$k = a0 => ({ name: "chevron-right", source: a0 });
30731
31262
  function _forTrack0$u($index, $item) { return this.getGapTitle($item); }
30732
31263
  function FocusAreaGapsListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -30835,7 +31366,7 @@ function FocusAreaGapsListModalContentComponent_Conditional_2_For_2_Template(rf,
30835
31366
  i0.ɵɵadvance();
30836
31367
  i0.ɵɵconditional(ctx_r0.getImpactOnMetric(gap_r3) ? 8 : -1);
30837
31368
  i0.ɵɵadvance(3);
30838
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$t, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses(gap_r3));
31369
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$u, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses(gap_r3));
30839
31370
  i0.ɵɵadvance();
30840
31371
  i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
30841
31372
  i0.ɵɵadvance();
@@ -31120,7 +31651,7 @@ class FocusAreaGapsListModalContentComponent {
31120
31651
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaGapsListModalContentComponent, { className: "FocusAreaGapsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-gaps-list-modal-content.component.ts", lineNumber: 106 }); })();
31121
31652
 
31122
31653
  const _c0$P = a0 => ({ name: "light-bulb", source: a0 });
31123
- const _c1$s = a0 => ({ name: "chevron-right", source: a0 });
31654
+ const _c1$t = a0 => ({ name: "chevron-right", source: a0 });
31124
31655
  const _c2$j = a0 => ({ name: "chart-bar", source: a0 });
31125
31656
  const _forTrack0$t = ($index, $item) => $item.opportunity;
31126
31657
  function FocusAreaOpportunitiesListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -31209,7 +31740,7 @@ function FocusAreaOpportunitiesListModalContentComponent_Conditional_2_For_2_Tem
31209
31740
  i0.ɵɵadvance(2);
31210
31741
  i0.ɵɵconditional(ctx_r0.getLinkedMetricsCount(opportunity_r3) > 0 ? 8 : -1);
31211
31742
  i0.ɵɵadvance(2);
31212
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$s, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.chevronClasses());
31743
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$t, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.chevronClasses());
31213
31744
  } }
31214
31745
  function FocusAreaOpportunitiesListModalContentComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
31215
31746
  i0.ɵɵelementStart(0, "div", 2);
@@ -31389,7 +31920,7 @@ class FocusAreaOpportunitiesListModalContentComponent {
31389
31920
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaOpportunitiesListModalContentComponent, { className: "FocusAreaOpportunitiesListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-opportunities-list-modal-content.component.ts", lineNumber: 90 }); })();
31390
31921
 
31391
31922
  const _c0$O = a0 => ({ name: "chevron-right", source: a0 });
31392
- const _c1$r = a0 => ({ name: "chat-bubble-left-right", source: a0 });
31923
+ const _c1$s = a0 => ({ name: "chat-bubble-left-right", source: a0 });
31393
31924
  const _forTrack0$s = ($index, $item) => $item.performanceItemId;
31394
31925
  function FocusAreaStrengthDetailModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
31395
31926
  i0.ɵɵelementStart(0, "div")(1, "p", 2);
@@ -31512,7 +32043,7 @@ function FocusAreaStrengthDetailModalContentComponent_Conditional_6_For_5_Templa
31512
32043
  const ctx_r0 = i0.ɵɵnextContext(2);
31513
32044
  i0.ɵɵproperty("ngClass", ctx_r0.answerClasses());
31514
32045
  i0.ɵɵadvance(2);
31515
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$r, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.answerIconClasses());
32046
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$s, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.answerIconClasses());
31516
32047
  i0.ɵɵadvance();
31517
32048
  i0.ɵɵproperty("ngClass", ctx_r0.answerQuestionClasses());
31518
32049
  i0.ɵɵadvance();
@@ -32110,7 +32641,7 @@ class FocusAreaGapDetailModalContentComponent {
32110
32641
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaGapDetailModalContentComponent, { className: "FocusAreaGapDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-gap-detail-modal-content.component.ts", lineNumber: 98 }); })();
32111
32642
 
32112
32643
  const _c0$M = a0 => ({ name: "chevron-right", source: a0 });
32113
- const _c1$q = () => [];
32644
+ const _c1$r = () => [];
32114
32645
  const _forTrack0$r = ($index, $item) => $item.performanceItemId;
32115
32646
  function FocusAreaOpportunityDetailModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
32116
32647
  i0.ɵɵelementStart(0, "div")(1, "p", 2);
@@ -32199,7 +32730,7 @@ function FocusAreaOpportunityDetailModalContentComponent_Conditional_4_Template(
32199
32730
  i0.ɵɵadvance();
32200
32731
  i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
32201
32732
  i0.ɵɵadvance(3);
32202
- i0.ɵɵrepeater(ctx_r0.opportunity().linkedGoalIds || i0.ɵɵpureFunction0(2, _c1$q));
32733
+ i0.ɵɵrepeater(ctx_r0.opportunity().linkedGoalIds || i0.ɵɵpureFunction0(2, _c1$r));
32203
32734
  } }
32204
32735
  function FocusAreaOpportunityDetailModalContentComponent_Conditional_5_For_5_Template(rf, ctx) { if (rf & 1) {
32205
32736
  i0.ɵɵelementStart(0, "span", 10);
@@ -32225,7 +32756,7 @@ function FocusAreaOpportunityDetailModalContentComponent_Conditional_5_Template(
32225
32756
  i0.ɵɵadvance();
32226
32757
  i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
32227
32758
  i0.ɵɵadvance(3);
32228
- i0.ɵɵrepeater(ctx_r0.opportunity().linkedFunnelStrengthIds || i0.ɵɵpureFunction0(2, _c1$q));
32759
+ i0.ɵɵrepeater(ctx_r0.opportunity().linkedFunnelStrengthIds || i0.ɵɵpureFunction0(2, _c1$r));
32229
32760
  } }
32230
32761
  class FocusAreaOpportunityDetailModalContentComponent {
32231
32762
  constructor() {
@@ -32562,7 +33093,7 @@ class CircularProgressComponent {
32562
33093
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CircularProgressComponent, { className: "CircularProgressComponent", filePath: "lib/components/business-analysis-dashboard/visualizations/circular-progress.component.ts", lineNumber: 41 }); })();
32563
33094
 
32564
33095
  const _c0$L = ["*"];
32565
- const _c1$p = (a0, a1) => [a0, a1];
33096
+ const _c1$q = (a0, a1) => [a0, a1];
32566
33097
  function VisualizationContainerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
32567
33098
  const _r1 = i0.ɵɵgetCurrentView();
32568
33099
  i0.ɵɵelementStart(0, "button", 3);
@@ -32573,7 +33104,7 @@ function VisualizationContainerComponent_Conditional_1_Template(rf, ctx) { if (r
32573
33104
  i0.ɵɵelementEnd()();
32574
33105
  } if (rf & 2) {
32575
33106
  const ctx_r1 = i0.ɵɵnextContext();
32576
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(1, _c1$p, ctx_r1.iconClass(), ctx_r1.isLightMode() ? "bg-white/90 hover:bg-white" : "bg-slate-800/90 hover:bg-slate-800"));
33107
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(1, _c1$q, ctx_r1.iconClass(), ctx_r1.isLightMode() ? "bg-white/90 hover:bg-white" : "bg-slate-800/90 hover:bg-slate-800"));
32577
33108
  } }
32578
33109
  class VisualizationContainerComponent {
32579
33110
  constructor() {
@@ -32728,7 +33259,7 @@ class MetricBadgeComponent {
32728
33259
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricBadgeComponent, { className: "MetricBadgeComponent", filePath: "lib/components/business-analysis-dashboard/badges/metric-badge.component.ts", lineNumber: 22 }); })();
32729
33260
 
32730
33261
  const _c0$K = a0 => ({ name: "light-bulb", source: a0 });
32731
- const _c1$o = a0 => ({ name: "chevron-right", source: a0 });
33262
+ const _c1$p = a0 => ({ name: "chevron-right", source: a0 });
32732
33263
  function OpportunityHighlightBannerComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
32733
33264
  i0.ɵɵelementStart(0, "p", 7);
32734
33265
  i0.ɵɵtext(1);
@@ -32803,7 +33334,7 @@ class OpportunityHighlightBannerComponent {
32803
33334
  i0.ɵɵconditional(ctx.message() ? 9 : -1);
32804
33335
  i0.ɵɵadvance();
32805
33336
  i0.ɵɵclassProp("rotate-90", ctx.isExpanded());
32806
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(13, _c1$o, ctx.iconSource))("ngClass", ctx.chevronClasses());
33337
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(13, _c1$p, ctx.iconSource))("ngClass", ctx.chevronClasses());
32807
33338
  } }, dependencies: [CommonModule, i1$1.NgClass, SymphiqIconComponent], encapsulation: 2, changeDetection: 0 }); }
32808
33339
  }
32809
33340
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OpportunityHighlightBannerComponent, [{
@@ -33429,7 +33960,7 @@ class ViewportAnimationDirective {
33429
33960
  }] }); })();
33430
33961
 
33431
33962
  const _c0$I = a0 => ({ name: "star", source: a0 });
33432
- const _c1$n = a0 => ({ name: "globe-americas", source: a0 });
33963
+ const _c1$o = a0 => ({ name: "globe-americas", source: a0 });
33433
33964
  const _c2$i = a0 => ({ name: "academic-cap", source: a0 });
33434
33965
  const _c3$f = a0 => ({ name: "information-circle", source: a0 });
33435
33966
  const _c4$b = a0 => ({ name: "signal", source: a0 });
@@ -33537,7 +34068,7 @@ function RegionCardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
33537
34068
  const ctx_r0 = i0.ɵɵnextContext();
33538
34069
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
33539
34070
  i0.ɵɵadvance(2);
33540
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$n, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
34071
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$o, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
33541
34072
  i0.ɵɵadvance();
33542
34073
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
33543
34074
  i0.ɵɵadvance(2);
@@ -34507,7 +35038,7 @@ class CompetitiveInsightBadgeComponent {
34507
35038
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveInsightBadgeComponent, { className: "CompetitiveInsightBadgeComponent", filePath: "lib/components/business-analysis-dashboard/badges/competitive-insight-badge.component.ts", lineNumber: 25 }); })();
34508
35039
 
34509
35040
  const _c0$H = a0 => ({ name: "calendar-days", source: a0 });
34510
- const _c1$m = a0 => ({ name: "chart-bar", source: a0 });
35041
+ const _c1$n = a0 => ({ name: "chart-bar", source: a0 });
34511
35042
  const _c2$h = a0 => ({ name: "academic-cap", source: a0 });
34512
35043
  const _c3$e = a0 => ({ name: "information-circle", source: a0 });
34513
35044
  const _c4$a = a0 => ({ name: "signal", source: a0 });
@@ -34623,7 +35154,7 @@ function SeasonCardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
34623
35154
  const ctx_r0 = i0.ɵɵnextContext();
34624
35155
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
34625
35156
  i0.ɵɵadvance(2);
34626
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$m, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
35157
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$n, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
34627
35158
  i0.ɵɵadvance();
34628
35159
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
34629
35160
  i0.ɵɵadvance(2);
@@ -35345,7 +35876,7 @@ class SeasonCardComponent {
35345
35876
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SeasonCardComponent, { className: "SeasonCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/season-card.component.ts", lineNumber: 270 }); })();
35346
35877
 
35347
35878
  const _c0$G = a0 => ({ name: "currency-dollar", source: a0 });
35348
- const _c1$l = a0 => ({ name: "chart-bar", source: a0 });
35879
+ const _c1$m = a0 => ({ name: "chart-bar", source: a0 });
35349
35880
  const _c2$g = a0 => ({ name: "academic-cap", source: a0 });
35350
35881
  const _c3$d = a0 => ({ name: "information-circle", source: a0 });
35351
35882
  const _c4$9 = a0 => ({ name: "signal", source: a0 });
@@ -35634,7 +36165,7 @@ function CustomerSegmentCardComponent_Conditional_23_Template(rf, ctx) { if (rf
35634
36165
  const ctx_r0 = i0.ɵɵnextContext();
35635
36166
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
35636
36167
  i0.ɵɵadvance(2);
35637
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(12, _c1$l, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
36168
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(12, _c1$m, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
35638
36169
  i0.ɵɵadvance();
35639
36170
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
35640
36171
  i0.ɵɵadvance(2);
@@ -36462,7 +36993,7 @@ class CustomerSegmentCardComponent {
36462
36993
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CustomerSegmentCardComponent, { className: "CustomerSegmentCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/customer-segment-card.component.ts", lineNumber: 366 }); })();
36463
36994
 
36464
36995
  const _c0$F = a0 => ({ name: "currency-dollar", source: a0 });
36465
- const _c1$k = a0 => ({ name: "document-text", source: a0 });
36996
+ const _c1$l = a0 => ({ name: "document-text", source: a0 });
36466
36997
  const _c2$f = a0 => ({ name: "academic-cap", source: a0 });
36467
36998
  const _c3$c = a0 => ({ name: "information-circle", source: a0 });
36468
36999
  const _c4$8 = a0 => ({ name: "signal", source: a0 });
@@ -36582,7 +37113,7 @@ function PriceTierCardComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
36582
37113
  const ctx_r0 = i0.ɵɵnextContext();
36583
37114
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
36584
37115
  i0.ɵɵadvance(2);
36585
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$k, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
37116
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$l, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
36586
37117
  i0.ɵɵadvance();
36587
37118
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
36588
37119
  i0.ɵɵadvance(2);
@@ -37299,7 +37830,7 @@ class PriceTierCardComponent {
37299
37830
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PriceTierCardComponent, { className: "PriceTierCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/price-tier-card.component.ts", lineNumber: 261 }); })();
37300
37831
 
37301
37832
  const _c0$E = () => ({ name: "cube", source: "HEROICONS" });
37302
- const _c1$j = () => ({ name: "currency-dollar", source: "HEROICONS" });
37833
+ const _c1$k = () => ({ name: "currency-dollar", source: "HEROICONS" });
37303
37834
  const _c2$e = () => ({ name: "chart-bar", source: "HEROICONS" });
37304
37835
  const _c3$b = a0 => ({ name: "chart-bar", source: a0 });
37305
37836
  const _c4$7 = a0 => ({ name: "academic-cap", source: a0 });
@@ -37366,7 +37897,7 @@ function ProductCategoryCardComponent_Conditional_14_Conditional_3_Template(rf,
37366
37897
  const ctx_r0 = i0.ɵɵnextContext(2);
37367
37898
  i0.ɵɵproperty("ngClass", ctx_r0.getStatBoxClasses());
37368
37899
  i0.ɵɵadvance(2);
37369
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction0(6, _c1$j))("ngClass", ctx_r0.getStatIconClasses());
37900
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction0(6, _c1$k))("ngClass", ctx_r0.getStatIconClasses());
37370
37901
  i0.ɵɵadvance(2);
37371
37902
  i0.ɵɵproperty("ngClass", ctx_r0.getStatLabelClasses());
37372
37903
  i0.ɵɵadvance(2);
@@ -38456,7 +38987,7 @@ function getCategoryBadgeClasses(category, isDark) {
38456
38987
  }
38457
38988
 
38458
38989
  const _c0$C = a0 => ({ name: "shield-check", source: a0 });
38459
- const _c1$i = a0 => ({ name: "building-storefront", source: a0 });
38990
+ const _c1$j = a0 => ({ name: "building-storefront", source: a0 });
38460
38991
  const _c2$d = a0 => ({ name: "academic-cap", source: a0 });
38461
38992
  const _c3$a = a0 => ({ name: "information-circle", source: a0 });
38462
38993
  const _c4$6 = a0 => ({ name: "signal", source: a0 });
@@ -38506,7 +39037,7 @@ function EnhancedListItemCardComponent_Conditional_21_Conditional_7_Template(rf,
38506
39037
  const ctx_r0 = i0.ɵɵnextContext(2);
38507
39038
  i0.ɵɵclassProp("mt-3", ctx_r0.getCompetitorPositioning() || ((tmp_2_0 = ctx_r0.item()) == null ? null : tmp_2_0.differentiationStrength));
38508
39039
  i0.ɵɵadvance(2);
38509
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$i, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
39040
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$j, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
38510
39041
  i0.ɵɵadvance();
38511
39042
  i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSubtitleClasses());
38512
39043
  i0.ɵɵadvance(2);
@@ -39172,7 +39703,7 @@ class EnhancedListItemCardComponent {
39172
39703
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EnhancedListItemCardComponent, { className: "EnhancedListItemCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/enhanced-list-item-card.component.ts", lineNumber: 221 }); })();
39173
39704
 
39174
39705
  const _c0$B = a0 => ({ name: "academic-cap", source: a0 });
39175
- const _c1$h = a0 => ({ name: "information-circle", source: a0 });
39706
+ const _c1$i = a0 => ({ name: "information-circle", source: a0 });
39176
39707
  const _c2$c = a0 => ({ name: "signal", source: a0 });
39177
39708
  const _c3$9 = a0 => ({ name: "wrench-screwdriver", source: a0 });
39178
39709
  function FocusAreaDetailCardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
@@ -39273,7 +39804,7 @@ function FocusAreaDetailCardComponent_Conditional_16_Conditional_6_Template(rf,
39273
39804
  const ctx_r0 = i0.ɵɵnextContext(2);
39274
39805
  i0.ɵɵproperty("ngClass", ctx_r0.getCompetitiveGapSectionClasses());
39275
39806
  i0.ɵɵadvance(2);
39276
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$h, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.expandedIconClasses());
39807
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$i, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.expandedIconClasses());
39277
39808
  i0.ɵɵadvance();
39278
39809
  i0.ɵɵproperty("ngClass", ctx_r0.expandedTitleClasses());
39279
39810
  i0.ɵɵadvance(2);
@@ -40639,7 +41170,6 @@ class CompetitorAnalysisCardComponent {
40639
41170
  return;
40640
41171
  const context = this.lookupService.findItemWithContext(item.id);
40641
41172
  if (!context) {
40642
- console.warn(`Item not found: ${item.id}`);
40643
41173
  return;
40644
41174
  }
40645
41175
  // Check if an item-detail modal is currently open
@@ -42220,7 +42750,7 @@ class ProfileItemCardComponent {
42220
42750
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProfileItemCardComponent, { className: "ProfileItemCardComponent", filePath: "lib/components/business-analysis-dashboard/profile-item-card.component.ts", lineNumber: 171 }); })();
42221
42751
 
42222
42752
  const _c0$z = ["scrollContainer"];
42223
- const _c1$g = a0 => ({ name: "arrow-right", source: a0 });
42753
+ const _c1$h = a0 => ({ name: "arrow-right", source: a0 });
42224
42754
  function ItemDetailModalComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
42225
42755
  const _r2 = i0.ɵɵgetCurrentView();
42226
42756
  i0.ɵɵelementStart(0, "button", 7);
@@ -42232,7 +42762,7 @@ function ItemDetailModalComponent_Conditional_7_Template(rf, ctx) { if (rf & 1)
42232
42762
  const ctx_r2 = i0.ɵɵnextContext();
42233
42763
  i0.ɵɵproperty("ngClass", ctx_r2.getPrimaryButtonClasses());
42234
42764
  i0.ɵɵadvance();
42235
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(2, _c1$g, ctx_r2.IconSourceEnum.HEROICONS));
42765
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(2, _c1$h, ctx_r2.IconSourceEnum.HEROICONS));
42236
42766
  } }
42237
42767
  class ItemDetailModalComponent {
42238
42768
  constructor() {
@@ -42419,7 +42949,7 @@ class ItemDetailModalComponent {
42419
42949
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ItemDetailModalComponent, { className: "ItemDetailModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/item-detail-modal.component.ts", lineNumber: 53 }); })();
42420
42950
 
42421
42951
  const _c0$y = ["modalContent"];
42422
- const _c1$f = ["modalWrapper"];
42952
+ const _c1$g = ["modalWrapper"];
42423
42953
  const _c2$b = ["*"];
42424
42954
  const ProfileAnalysisModalComponent_Conditional_0_Conditional_31_Conditional_3_Defer_2_DepsFn = () => [Promise.resolve().then(function () { return lineChart_component; }).then(m => m.LineChartComponent)];
42425
42955
  const ProfileAnalysisModalComponent_Conditional_0_Conditional_31_Conditional_4_Defer_2_DepsFn = () => [Promise.resolve().then(function () { return barChart_component; }).then(m => m.BarChartComponent)];
@@ -44645,57 +45175,12 @@ class ProfileAnalysisModalComponent {
44645
45175
  return undefined;
44646
45176
  }
44647
45177
  logContainingBlockInfo() {
44648
- console.group('[ProfileAnalysisModal] Containing Block Debug Info');
44649
- let element = this.hostElement.nativeElement;
44650
- const containingBlockTriggers = [];
44651
- while (element && element !== this.document.body) {
44652
- const styles = window.getComputedStyle(element);
44653
- const transform = styles.transform;
44654
- const willChange = styles.willChange;
44655
- const contain = styles.contain;
44656
- const filter = styles.filter;
44657
- const perspective = styles.perspective;
44658
- const backdropFilter = styles.backdropFilter || styles.getPropertyValue('backdrop-filter');
44659
- if (transform && transform !== 'none') {
44660
- containingBlockTriggers.push({ element, property: 'transform', value: transform });
44661
- }
44662
- if (willChange && (willChange.includes('transform') || willChange.includes('perspective') || willChange.includes('filter'))) {
44663
- containingBlockTriggers.push({ element, property: 'will-change', value: willChange });
44664
- }
44665
- if (contain && contain !== 'none') {
44666
- containingBlockTriggers.push({ element, property: 'contain', value: contain });
44667
- }
44668
- if (filter && filter !== 'none') {
44669
- containingBlockTriggers.push({ element, property: 'filter', value: filter });
44670
- }
44671
- if (perspective && perspective !== 'none') {
44672
- containingBlockTriggers.push({ element, property: 'perspective', value: perspective });
44673
- }
44674
- if (backdropFilter && backdropFilter !== 'none') {
44675
- containingBlockTriggers.push({ element, property: 'backdrop-filter', value: backdropFilter });
44676
- }
44677
- element = element.parentElement;
44678
- }
44679
- if (containingBlockTriggers.length > 0) {
44680
- console.warn('Found CSS properties that create containing blocks for fixed positioning:');
44681
- containingBlockTriggers.forEach(({ element, property, value }) => {
44682
- console.log(` Element:`, element);
44683
- console.log(` ${property}: ${value}`);
44684
- });
44685
- }
44686
- else {
44687
- console.log('No containing block triggers found in ancestor chain');
44688
- }
44689
- console.log('Host element:', this.hostElement.nativeElement);
44690
- console.log('Modal wrapper ref:', this.modalWrapper);
44691
- console.groupEnd();
44692
45178
  }
44693
45179
  moveModalToBody() {
44694
45180
  if (this.modalMovedToBody || !this.modalWrapper?.nativeElement) {
44695
45181
  return;
44696
45182
  }
44697
45183
  const modalEl = this.modalWrapper.nativeElement;
44698
- console.log('[ProfileAnalysisModal] Moving modal to document.body');
44699
45184
  this.renderer.appendChild(this.document.body, modalEl);
44700
45185
  this.modalMovedToBody = true;
44701
45186
  }
@@ -44704,7 +45189,6 @@ class ProfileAnalysisModalComponent {
44704
45189
  return;
44705
45190
  }
44706
45191
  const modalEl = this.modalWrapper.nativeElement;
44707
- console.log('[ProfileAnalysisModal] Returning modal to host element');
44708
45192
  this.renderer.appendChild(this.hostElement.nativeElement, modalEl);
44709
45193
  this.modalMovedToBody = false;
44710
45194
  }
@@ -44714,7 +45198,7 @@ class ProfileAnalysisModalComponent {
44714
45198
  static { this.ɵfac = function ProfileAnalysisModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProfileAnalysisModalComponent)(); }; }
44715
45199
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProfileAnalysisModalComponent, selectors: [["symphiq-profile-analysis-modal"]], viewQuery: function ProfileAnalysisModalComponent_Query(rf, ctx) { if (rf & 1) {
44716
45200
  i0.ɵɵviewQuery(_c0$y, 5);
44717
- i0.ɵɵviewQuery(_c1$f, 5);
45201
+ i0.ɵɵviewQuery(_c1$g, 5);
44718
45202
  } if (rf & 2) {
44719
45203
  let _t;
44720
45204
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modalContent = _t.first);
@@ -45269,7 +45753,7 @@ class ProfileAnalysisModalComponent {
45269
45753
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProfileAnalysisModalComponent, { className: "ProfileAnalysisModalComponent", filePath: "lib/components/profile-analysis-dashboard/profile-analysis-modal.component.ts", lineNumber: 554 }); })();
45270
45754
 
45271
45755
  const _c0$x = a0 => ({ name: "light-bulb", source: a0 });
45272
- const _c1$e = a0 => ({ name: "trophy", source: a0 });
45756
+ const _c1$f = a0 => ({ name: "trophy", source: a0 });
45273
45757
  const _c2$a = a0 => ({ name: "academic-cap", source: a0 });
45274
45758
  const _c3$7 = a0 => ({ name: "signal", source: a0 });
45275
45759
  const _c4$4 = a0 => ({ name: "wrench-screwdriver", source: a0 });
@@ -45307,7 +45791,7 @@ function CompetitiveGapModalComponent_Conditional_10_Template(rf, ctx) { if (rf
45307
45791
  const ctx_r0 = i0.ɵɵnextContext();
45308
45792
  i0.ɵɵproperty("ngClass", ctx_r0.sectionClasses());
45309
45793
  i0.ɵɵadvance(2);
45310
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$e, ctx_r0.iconSource))("ngClass", ctx_r0.sectionIconClasses());
45794
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$f, ctx_r0.iconSource))("ngClass", ctx_r0.sectionIconClasses());
45311
45795
  i0.ɵɵadvance();
45312
45796
  i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
45313
45797
  i0.ɵɵadvance(2);
@@ -45600,7 +46084,7 @@ class CompetitiveGapModalComponent {
45600
46084
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveGapModalComponent, { className: "CompetitiveGapModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/competitive-gap-modal.component.ts", lineNumber: 101 }); })();
45601
46085
 
45602
46086
  const _c0$w = a0 => ({ name: "list-bullet", source: a0 });
45603
- const _c1$d = a0 => ({ name: "arrow-right", source: a0 });
46087
+ const _c1$e = a0 => ({ name: "arrow-right", source: a0 });
45604
46088
  const _c2$9 = a0 => ({ name: "check-circle", source: a0 });
45605
46089
  const _c3$6 = a0 => ({ name: "exclamation-circle", source: a0 });
45606
46090
  const _forTrack0$o = ($index, $item) => $item.order;
@@ -45672,7 +46156,7 @@ function RecommendationActionStepsModalComponent_For_4_Template(rf, ctx) { if (r
45672
46156
  i0.ɵɵadvance();
45673
46157
  i0.ɵɵtextInterpolate1(" ", step_r2.order, " ");
45674
46158
  i0.ɵɵadvance(4);
45675
- i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$d, ctx_r0.iconSource))("ngClass", ctx_r0.actionIconClasses());
46159
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$e, ctx_r0.iconSource))("ngClass", ctx_r0.actionIconClasses());
45676
46160
  i0.ɵɵadvance();
45677
46161
  i0.ɵɵproperty("ngClass", ctx_r0.actionTitleClasses());
45678
46162
  i0.ɵɵadvance(2);
@@ -45840,7 +46324,7 @@ class RecommendationActionStepsModalComponent {
45840
46324
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecommendationActionStepsModalComponent, { className: "RecommendationActionStepsModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/recommendation-action-steps-modal.component.ts", lineNumber: 69 }); })();
45841
46325
 
45842
46326
  const _c0$v = ["modalContent"];
45843
- const _c1$c = ["modalWrapper"];
46327
+ const _c1$d = ["modalWrapper"];
45844
46328
  function BusinessAnalysisModalComponent_Conditional_0_Conditional_10_For_6_Conditional_0_Template(rf, ctx) { if (rf & 1) {
45845
46329
  const _r4 = i0.ɵɵgetCurrentView();
45846
46330
  i0.ɵɵelementStart(0, "button", 28);
@@ -46363,7 +46847,7 @@ class BusinessAnalysisModalComponent {
46363
46847
  static { this.ɵfac = function BusinessAnalysisModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BusinessAnalysisModalComponent)(); }; }
46364
46848
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BusinessAnalysisModalComponent, selectors: [["symphiq-business-analysis-modal"]], viewQuery: function BusinessAnalysisModalComponent_Query(rf, ctx) { if (rf & 1) {
46365
46849
  i0.ɵɵviewQuery(_c0$v, 5);
46366
- i0.ɵɵviewQuery(_c1$c, 5);
46850
+ i0.ɵɵviewQuery(_c1$d, 5);
46367
46851
  } if (rf & 2) {
46368
46852
  let _t;
46369
46853
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modalContent = _t.first);
@@ -46548,7 +47032,7 @@ class BusinessAnalysisModalComponent {
46548
47032
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BusinessAnalysisModalComponent, { className: "BusinessAnalysisModalComponent", filePath: "lib/components/business-analysis-dashboard/business-analysis-modal.component.ts", lineNumber: 171 }); })();
46549
47033
 
46550
47034
  const _c0$u = ["dashboardContainer"];
46551
- const _c1$b = () => ({});
47035
+ const _c1$c = () => ({});
46552
47036
  const _c2$8 = () => [1, 2, 3, 4, 5, 6];
46553
47037
  const _c3$5 = () => [1, 2, 3];
46554
47038
  const _c4$3 = () => [1, 2, 3, 4];
@@ -46855,7 +47339,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_50_Conditional_8_Co
46855
47339
  i0.ɵɵelementEnd();
46856
47340
  } if (rf & 2) {
46857
47341
  const ctx_r2 = i0.ɵɵnextContext(3);
46858
- i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$b))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", true)("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
47342
+ i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$c))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", true)("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
46859
47343
  } }
46860
47344
  function SymphiqFunnelAnalysisDashboardComponent_Conditional_50_Conditional_8_Template(rf, ctx) { if (rf & 1) {
46861
47345
  i0.ɵɵelementStart(0, "div", 72);
@@ -47005,7 +47489,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_51_Conditional_2_Co
47005
47489
  i0.ɵɵelementEnd();
47006
47490
  } if (rf & 2) {
47007
47491
  const ctx_r2 = i0.ɵɵnextContext(3);
47008
- i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$b))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", ctx_r2.viewModeService.isCompact())("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
47492
+ i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$c))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", ctx_r2.viewModeService.isCompact())("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
47009
47493
  } }
47010
47494
  function SymphiqFunnelAnalysisDashboardComponent_Conditional_51_Conditional_2_Template(rf, ctx) { if (rf & 1) {
47011
47495
  i0.ɵɵelementStart(0, "div", 93);
@@ -55740,49 +56224,6 @@ class RevenueCalculatorWelcomeBannerComponent {
55740
56224
  }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], dataLoadStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataLoadStatus", required: false }] }], hasTargets: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasTargets", required: false }] }] }); })();
55741
56225
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RevenueCalculatorWelcomeBannerComponent, { className: "RevenueCalculatorWelcomeBannerComponent", filePath: "lib/components/revenue-calculator-dashboard/revenue-calculator-welcome-banner.component.ts", lineNumber: 85 }); })();
55742
56226
 
55743
- function getCurrentYearStart() {
55744
- const now = new Date();
55745
- return new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
55746
- }
55747
- function getCurrentYearEnd() {
55748
- const now = new Date();
55749
- return new Date(now.getFullYear(), 11, 31, 23, 59, 59, 999);
55750
- }
55751
- function getPriorYearStart() {
55752
- const now = new Date();
55753
- return new Date(now.getFullYear() - 1, 0, 1, 0, 0, 0, 0);
55754
- }
55755
- function getPriorYearEnd() {
55756
- const now = new Date();
55757
- return new Date(now.getFullYear() - 1, 11, 31, 23, 59, 59, 999);
55758
- }
55759
- function isCurrentYearTarget(target) {
55760
- if (!target.startDate || !target.endDate) {
55761
- return false;
55762
- }
55763
- const currentYearStart = getCurrentYearStart();
55764
- const currentYearEnd = getCurrentYearEnd();
55765
- const targetStart = new Date(target.startDate);
55766
- const targetEnd = new Date(target.endDate);
55767
- return (targetStart.getTime() === currentYearStart.getTime() &&
55768
- targetEnd.getTime() === currentYearEnd.getTime());
55769
- }
55770
- function formatCurrency(value, currencySymbol = '$') {
55771
- return `${currencySymbol}${value.toLocaleString('en-US', {
55772
- minimumFractionDigits: 0,
55773
- maximumFractionDigits: 0
55774
- })}`;
55775
- }
55776
- function formatPercentage(value, decimals = 1) {
55777
- return `${value.toFixed(decimals)}%`;
55778
- }
55779
- function formatNumber(value) {
55780
- return value.toLocaleString('en-US', {
55781
- minimumFractionDigits: 0,
55782
- maximumFractionDigits: 0
55783
- });
55784
- }
55785
-
55786
56227
  function calculatePacingStatus(currentValue, priorValue, targetValue) {
55787
56228
  if (targetValue !== undefined && targetValue > 0) {
55788
56229
  const targetGrowth = ((targetValue - priorValue) / priorValue) * 100;
@@ -57267,390 +57708,10 @@ var areaChart_component = /*#__PURE__*/Object.freeze({
57267
57708
  AreaChartComponent: AreaChartComponent
57268
57709
  });
57269
57710
 
57270
- function calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
57271
- const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
57272
- const metricCalculations = [];
57273
- const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
57274
- const aFunnel = a.funnelInd ?? 999;
57275
- const bFunnel = b.funnelInd ?? 999;
57276
- if (aFunnel !== bFunnel)
57277
- return aFunnel - bFunnel;
57278
- const aRelated = a.relatedInd ?? 999;
57279
- const bRelated = b.relatedInd ?? 999;
57280
- return aRelated - bRelated;
57281
- });
57282
- const funnelStages = getUniqueFunnelStages(sortedFunnelMetrics);
57283
- const numFunnelStages = funnelStages.length;
57284
- const revenueIncreaseFactor = revenueTarget / priorYearRevenue;
57285
- const perStageFactor = Math.pow(revenueIncreaseFactor, 1 / numFunnelStages);
57286
- const funnelStageMetrics = new Map();
57287
- sortedFunnelMetrics.forEach(fm => {
57288
- if (fm.funnelMetric) {
57289
- if (!funnelStageMetrics.has(fm.funnelMetric)) {
57290
- funnelStageMetrics.set(fm.funnelMetric, []);
57291
- }
57292
- funnelStageMetrics.get(fm.funnelMetric).push(fm);
57293
- }
57294
- });
57295
- const stagePercentageIncrease = (perStageFactor - 1) * 100;
57296
- sortedFunnelMetrics.forEach((funnelMetric) => {
57297
- const metric = funnelMetric.relatedMetric;
57298
- if (!metric)
57299
- return;
57300
- const currentValue = baselineValues.get(metric) || 0;
57301
- const isFunnelStage = funnelMetric.funnelMetric === metric;
57302
- let percentageIncrease;
57303
- let targetValue;
57304
- if (metric === MetricEnum.BOUNCE_RATE) {
57305
- percentageIncrease = -stagePercentageIncrease;
57306
- targetValue = currentValue * (1 + percentageIncrease / 100);
57307
- }
57308
- else if (isDerivedMetric(metric)) {
57309
- percentageIncrease = 0;
57310
- targetValue = currentValue;
57311
- }
57312
- else {
57313
- percentageIncrease = stagePercentageIncrease;
57314
- targetValue = currentValue * perStageFactor;
57315
- }
57316
- metricCalculations.push({
57317
- metric,
57318
- funnelMetric: funnelMetric.funnelMetric,
57319
- currentValue,
57320
- targetValue,
57321
- percentageIncrease,
57322
- isFunnelStage,
57323
- funnelInd: funnelMetric.funnelInd,
57324
- relatedInd: funnelMetric.relatedInd,
57325
- description: funnelMetric.relatedMetricDescription
57326
- });
57327
- });
57328
- return {
57329
- revenueTarget,
57330
- revenuePercentageIncrease,
57331
- metricCalculations
57332
- };
57333
- }
57334
- function getUniqueFunnelStages(funnelMetrics) {
57335
- const stages = [];
57336
- const seen = new Set();
57337
- funnelMetrics.forEach(fm => {
57338
- if (fm.funnelMetric && fm.funnelMetric === fm.relatedMetric && !seen.has(fm.funnelMetric)) {
57339
- seen.add(fm.funnelMetric);
57340
- stages.push(fm.funnelMetric);
57341
- }
57342
- });
57343
- return stages;
57344
- }
57345
- const DERIVED_METRICS = new Set([
57346
- MetricEnum.REVENUE_PER_PRODUCT_VIEW,
57347
- MetricEnum.REVENUE_PER_ADD_TO_CART,
57348
- MetricEnum.REVENUE_PER_CHECKOUT
57349
- ]);
57350
- function isDerivedMetric(metric) {
57351
- return DERIVED_METRICS.has(metric);
57352
- }
57353
- function generateTargetsFromCalculations(shopId, calculations) {
57354
- const startDate = getCurrentYearStart();
57355
- const endDate = getCurrentYearEnd();
57356
- return calculations.map((calc) => ({
57357
- shopId,
57358
- metric: calc.metric,
57359
- amount: calc.targetValue,
57360
- startDate,
57361
- endDate
57362
- }));
57363
- }
57364
- function groupMetricsByFunnelStage(calculations) {
57365
- const grouped = new Map();
57366
- calculations.forEach((calc) => {
57367
- if (calc.funnelMetric) {
57368
- if (!grouped.has(calc.funnelMetric)) {
57369
- grouped.set(calc.funnelMetric, []);
57370
- }
57371
- grouped.get(calc.funnelMetric).push(calc);
57372
- }
57373
- });
57374
- return grouped;
57375
- }
57376
- function getFunnelStageMetrics(calculations) {
57377
- return calculations.filter((calc) => calc.isFunnelStage);
57378
- }
57379
-
57380
- function transformUiDataToChartSeries(mainUiData, ytdComparisonUiData, metricToExtract) {
57381
- const series = [];
57382
- if (ytdComparisonUiData?.convertedDataResults) {
57383
- const priorYearSeries = extractSeriesFromConvertedData(ytdComparisonUiData.convertedDataResults, metricToExtract, 'Prior Year');
57384
- if (priorYearSeries) {
57385
- series.push(priorYearSeries);
57386
- }
57387
- }
57388
- if (mainUiData?.convertedDataResults) {
57389
- const currentYearSeries = extractSeriesFromConvertedData(mainUiData.convertedDataResults, metricToExtract, 'Current Year');
57390
- if (currentYearSeries) {
57391
- series.push(currentYearSeries);
57392
- }
57393
- }
57394
- return series;
57395
- }
57396
- function extractSeriesFromConvertedData(convertedData, metricToExtract, seriesName) {
57397
- const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
57398
- if (metricIndex === undefined || metricIndex === -1)
57399
- return null;
57400
- const dimensionIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
57401
- if (dimensionIndex === undefined || dimensionIndex === -1)
57402
- return null;
57403
- const dataPoints = [];
57404
- convertedData.rows?.forEach((row) => {
57405
- const monthValue = row.dimensionValues?.[dimensionIndex];
57406
- const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
57407
- if (monthValue) {
57408
- dataPoints.push({
57409
- category: monthValue,
57410
- value: metricValue,
57411
- displayLabel: formatMonthLabel(monthValue)
57412
- });
57413
- }
57414
- });
57415
- return {
57416
- name: seriesName,
57417
- data: sortDataByMonth(dataPoints)
57418
- };
57419
- }
57420
- function formatMonthLabel(monthValue) {
57421
- const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
57422
- const monthNum = parseInt(monthValue, 10);
57423
- if (monthNum >= 1 && monthNum <= 12) {
57424
- return months[monthNum - 1];
57425
- }
57426
- return monthValue;
57427
- }
57428
- function sortDataByMonth(data) {
57429
- return data.sort((a, b) => {
57430
- const aMonth = parseInt(a.category, 10);
57431
- const bMonth = parseInt(b.category, 10);
57432
- return aMonth - bMonth;
57433
- });
57434
- }
57435
- function transformTrendUiDataToChartSeries(trendUiData, metricToExtract) {
57436
- if (!trendUiData?.convertedDataResults) {
57437
- return [];
57438
- }
57439
- const convertedData = trendUiData.convertedDataResults;
57440
- const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
57441
- if (metricIndex === undefined || metricIndex === -1)
57442
- return [];
57443
- const dateIndex = convertedData.dimensions?.indexOf(DimensionEnum.DATE);
57444
- const monthIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
57445
- const dimensionIndex = dateIndex !== undefined && dateIndex !== -1
57446
- ? dateIndex
57447
- : (monthIndex !== undefined && monthIndex !== -1 ? monthIndex : -1);
57448
- if (dimensionIndex === -1)
57449
- return [];
57450
- const currentYear = new Date().getFullYear();
57451
- const priorYear = currentYear - 1;
57452
- const priorYearPoints = [];
57453
- const currentYearPoints = [];
57454
- convertedData.rows?.forEach((row) => {
57455
- const dimValue = row.dimensionValues?.[dimensionIndex];
57456
- const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
57457
- if (dimValue) {
57458
- let year;
57459
- let month;
57460
- if (dimValue.includes('-')) {
57461
- const parts = dimValue.split('-');
57462
- year = parseInt(parts[0], 10);
57463
- month = parseInt(parts[1], 10);
57464
- }
57465
- else if (dimValue.length >= 6) {
57466
- year = parseInt(dimValue.substring(0, 4), 10);
57467
- month = parseInt(dimValue.substring(4, 6), 10);
57468
- }
57469
- else {
57470
- month = parseInt(dimValue, 10);
57471
- year = currentYear;
57472
- }
57473
- const point = {
57474
- category: String(month),
57475
- value: metricValue,
57476
- displayLabel: formatMonthLabel(String(month))
57477
- };
57478
- if (year === priorYear) {
57479
- priorYearPoints.push(point);
57480
- }
57481
- else if (year === currentYear) {
57482
- currentYearPoints.push(point);
57483
- }
57484
- }
57485
- });
57486
- const series = [];
57487
- if (priorYearPoints.length > 0) {
57488
- series.push({
57489
- name: String(priorYear),
57490
- data: aggregateAndSortByMonth(priorYearPoints)
57491
- });
57492
- }
57493
- if (currentYearPoints.length > 0) {
57494
- series.push({
57495
- name: String(currentYear),
57496
- data: aggregateAndSortByMonth(currentYearPoints)
57497
- });
57498
- }
57499
- return series;
57500
- }
57501
- function aggregateAndSortByMonth(points) {
57502
- const monthMap = new Map();
57503
- points.forEach(point => {
57504
- const existing = monthMap.get(point.category);
57505
- if (existing) {
57506
- existing.value += point.value;
57507
- }
57508
- else {
57509
- monthMap.set(point.category, { ...point });
57510
- }
57511
- });
57512
- return sortDataByMonth(Array.from(monthMap.values()));
57513
- }
57514
- function getConvertedDataForSource(uiData, source) {
57515
- if (!uiData)
57516
- return undefined;
57517
- const periodInfo = uiData.periodInfo;
57518
- console.group('[getConvertedDataForSource] Debug');
57519
- console.log('source:', source);
57520
- console.log('periodInfo:', periodInfo);
57521
- console.log('period:', periodInfo?.period);
57522
- console.log('comparePeriod:', periodInfo?.comparePeriod);
57523
- let result;
57524
- switch (source) {
57525
- case 'current':
57526
- result = uiData.convertedDataResults;
57527
- console.log('Using convertedDataResults (current period)');
57528
- break;
57529
- case 'compare':
57530
- result = uiData.convertedDataResultsCompare;
57531
- console.log('Using convertedDataResultsCompare (compare period)');
57532
- break;
57533
- case 'priorYear':
57534
- if (periodInfo?.period === UiDataPeriodEnum.THIS_YEAR &&
57535
- periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
57536
- result = uiData.convertedDataResultsCompare;
57537
- console.log('THIS_YEAR + PREVIOUS_PERIOD: Using convertedDataResultsCompare (all of last year)');
57538
- }
57539
- else if (periodInfo?.period === UiDataPeriodEnum.THIS_AND_LAST_YEAR) {
57540
- console.log('THIS_AND_LAST_YEAR: Need to filter by year from convertedDataResults');
57541
- result = uiData.convertedDataResults;
57542
- }
57543
- else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.SAME_PERIOD_LAST_YEAR) {
57544
- result = uiData.convertedDataResultsCompare;
57545
- console.log('SAME_PERIOD_LAST_YEAR: Using convertedDataResultsCompare');
57546
- }
57547
- else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
57548
- result = uiData.convertedDataResultsCompare;
57549
- console.log('PREVIOUS_PERIOD: Using convertedDataResultsCompare');
57550
- }
57551
- else {
57552
- console.log('No matching period config for priorYear, falling back to convertedDataResultsCompare');
57553
- result = uiData.convertedDataResultsCompare;
57554
- }
57555
- break;
57556
- }
57557
- console.log('Result exists:', !!result);
57558
- console.groupEnd();
57559
- return result;
57560
- }
57561
- function sumMetricFromUiData(uiData, metricToSum, source = 'current') {
57562
- console.group('[sumMetricFromUiData] Debug');
57563
- console.log('metricToSum:', metricToSum);
57564
- console.log('source:', source);
57565
- const convertedData = getConvertedDataForSource(uiData, source);
57566
- if (!convertedData) {
57567
- console.log('EARLY RETURN: convertedData is falsy');
57568
- console.log('convertedDataResults exists:', !!uiData?.convertedDataResults);
57569
- console.log('convertedDataResultsCompare exists:', !!uiData?.convertedDataResultsCompare);
57570
- console.groupEnd();
57571
- return 0;
57572
- }
57573
- let total = 0;
57574
- const metricIndex = convertedData.metrics?.indexOf(metricToSum);
57575
- console.log('Available metrics:', convertedData.metrics);
57576
- console.log('metricIndex for', metricToSum, ':', metricIndex);
57577
- if (metricIndex === undefined || metricIndex === -1) {
57578
- console.log('EARLY RETURN: metricIndex is undefined or -1');
57579
- console.groupEnd();
57580
- return 0;
57581
- }
57582
- console.log('Number of rows:', convertedData.rows?.length ?? 0);
57583
- convertedData.rows?.forEach((row, idx) => {
57584
- const rawValue = row.metricValues?.[metricIndex];
57585
- const metricValue = parseFloat(rawValue || '0');
57586
- if (idx < 3) {
57587
- console.log(`Row ${idx}: raw="${rawValue}", parsed=${metricValue}`);
57588
- }
57589
- total += metricValue;
57590
- });
57591
- console.log('Final total:', total);
57592
- console.groupEnd();
57593
- return total;
57594
- }
57595
-
57596
- class RevenueCalculatorService {
57597
- calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics) {
57598
- const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
57599
- const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
57600
- return calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
57601
- }
57602
- calculateTargetsFromPercentage(percentageIncrease, mainUiData, funnelMetrics) {
57603
- const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
57604
- const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
57605
- return this.calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics);
57606
- }
57607
- extractPriorYearRevenue(mainUiData) {
57608
- return sumMetricFromUiData(mainUiData, MetricEnum.PURCHASE_REVENUE, 'priorYear');
57609
- }
57610
- extractBaselineValues(mainUiData, funnelMetrics) {
57611
- const baselineValues = new Map();
57612
- if (!mainUiData) {
57613
- return baselineValues;
57614
- }
57615
- funnelMetrics.forEach(fm => {
57616
- if (fm.relatedMetric) {
57617
- const value = sumMetricFromUiData(mainUiData, fm.relatedMetric, 'priorYear');
57618
- baselineValues.set(fm.relatedMetric, value);
57619
- }
57620
- });
57621
- return baselineValues;
57622
- }
57623
- getMetricsByFunnelStage(calculations) {
57624
- const grouped = new Map();
57625
- calculations.forEach(calc => {
57626
- if (calc.isFunnelStage) {
57627
- if (!grouped.has(calc.metric)) {
57628
- grouped.set(calc.metric, []);
57629
- }
57630
- grouped.get(calc.metric).push(calc);
57631
- }
57632
- else if (calc.funnelMetric) {
57633
- if (!grouped.has(calc.funnelMetric)) {
57634
- grouped.set(calc.funnelMetric, []);
57635
- }
57636
- grouped.get(calc.funnelMetric).push(calc);
57637
- }
57638
- });
57639
- return grouped;
57640
- }
57641
- static { this.ɵfac = function RevenueCalculatorService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RevenueCalculatorService)(); }; }
57642
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: RevenueCalculatorService, factory: RevenueCalculatorService.ɵfac, providedIn: 'root' }); }
57643
- }
57644
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RevenueCalculatorService, [{
57645
- type: Injectable,
57646
- args: [{
57647
- providedIn: 'root'
57648
- }]
57649
- }], null, null); })();
57650
-
57651
57711
  const _c0$r = ["absoluteInputRef"];
57712
+ const _c1$b = ["percentageInputRef"];
57652
57713
  function InitialTargetSettingComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
57653
- i0.ɵɵelementStart(0, "p", 8);
57714
+ i0.ɵɵelementStart(0, "p", 9);
57654
57715
  i0.ɵɵtext(1);
57655
57716
  i0.ɵɵelementEnd();
57656
57717
  } if (rf & 2) {
@@ -57661,10 +57722,10 @@ function InitialTargetSettingComponent_Conditional_12_Template(rf, ctx) { if (rf
57661
57722
  } }
57662
57723
  function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
57663
57724
  const _r2 = i0.ɵɵgetCurrentView();
57664
- i0.ɵɵelementStart(0, "div", 11)(1, "span", 18);
57725
+ i0.ɵɵelementStart(0, "div", 12)(1, "span", 19);
57665
57726
  i0.ɵɵtext(2, " $ ");
57666
57727
  i0.ɵɵelementEnd();
57667
- i0.ɵɵelementStart(3, "input", 19, 0);
57728
+ i0.ɵɵelementStart(3, "input", 20, 0);
57668
57729
  i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_18_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.absoluteInput, $event) || (ctx_r0.absoluteInput = $event); return i0.ɵɵresetView($event); });
57669
57730
  i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_18_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onAbsoluteInputChange()); });
57670
57731
  i0.ɵɵelementEnd()();
@@ -57678,32 +57739,32 @@ function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf
57678
57739
  } }
57679
57740
  function InitialTargetSettingComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
57680
57741
  const _r3 = i0.ɵɵgetCurrentView();
57681
- i0.ɵɵelementStart(0, "div", 11)(1, "input", 20);
57742
+ i0.ɵɵelementStart(0, "div", 12)(1, "input", 21, 1);
57682
57743
  i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_19_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.percentageInput, $event) || (ctx_r0.percentageInput = $event); return i0.ɵɵresetView($event); });
57683
57744
  i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_19_Template_input_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onPercentageInputChange()); });
57684
57745
  i0.ɵɵelementEnd();
57685
- i0.ɵɵelementStart(2, "span", 21);
57686
- i0.ɵɵtext(3, " % ");
57746
+ i0.ɵɵelementStart(3, "span", 22);
57747
+ i0.ɵɵtext(4, " % ");
57687
57748
  i0.ɵɵelementEnd()();
57688
57749
  } if (rf & 2) {
57689
57750
  const ctx_r0 = i0.ɵɵnextContext();
57690
57751
  i0.ɵɵadvance();
57691
57752
  i0.ɵɵtwoWayProperty("ngModel", ctx_r0.percentageInput);
57692
57753
  i0.ɵɵproperty("ngClass", ctx_r0.inputClasses());
57693
- i0.ɵɵadvance();
57754
+ i0.ɵɵadvance(2);
57694
57755
  i0.ɵɵproperty("ngClass", ctx_r0.inputSuffixClasses());
57695
57756
  } }
57696
57757
  function InitialTargetSettingComponent_Conditional_20_Conditional_18_Template(rf, ctx) { if (rf & 1) {
57697
- i0.ɵɵelementStart(0, "div", 25)(1, "div")(2, "p", 23);
57758
+ i0.ɵɵelementStart(0, "div", 26)(1, "div")(2, "p", 24);
57698
57759
  i0.ɵɵtext(3, " Gap to Close ");
57699
57760
  i0.ɵɵelementEnd();
57700
- i0.ɵɵelementStart(4, "p", 26);
57761
+ i0.ɵɵelementStart(4, "p", 27);
57701
57762
  i0.ɵɵtext(5);
57702
57763
  i0.ɵɵelementEnd()();
57703
- i0.ɵɵelementStart(6, "div")(7, "p", 23);
57764
+ i0.ɵɵelementStart(6, "div")(7, "p", 24);
57704
57765
  i0.ɵɵtext(8, " Additional Growth Needed ");
57705
57766
  i0.ɵɵelementEnd();
57706
- i0.ɵɵelementStart(9, "p", 26);
57767
+ i0.ɵɵelementStart(9, "p", 27);
57707
57768
  i0.ɵɵtext(10);
57708
57769
  i0.ɵɵelementEnd()()();
57709
57770
  } if (rf & 2) {
@@ -57723,25 +57784,25 @@ function InitialTargetSettingComponent_Conditional_20_Conditional_18_Template(rf
57723
57784
  i0.ɵɵtextInterpolate2(" ", ctx_r0.gapToClose().amount > 0 ? "+" : "", "", ctx_r0.formatPercentage(ctx_r0.gapToClose().percentage, 1), " ");
57724
57785
  } }
57725
57786
  function InitialTargetSettingComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
57726
- i0.ɵɵelementStart(0, "div", 12)(1, "div", 22)(2, "div")(3, "p", 23);
57787
+ i0.ɵɵelementStart(0, "div", 13)(1, "div", 23)(2, "div")(3, "p", 24);
57727
57788
  i0.ɵɵtext(4);
57728
57789
  i0.ɵɵelementEnd();
57729
- i0.ɵɵelementStart(5, "p", 24);
57790
+ i0.ɵɵelementStart(5, "p", 25);
57730
57791
  i0.ɵɵtext(6);
57731
57792
  i0.ɵɵelementEnd()();
57732
- i0.ɵɵelementStart(7, "div", 25)(8, "div")(9, "p", 23);
57793
+ i0.ɵɵelementStart(7, "div", 26)(8, "div")(9, "p", 24);
57733
57794
  i0.ɵɵtext(10, " Increase Amount ");
57734
57795
  i0.ɵɵelementEnd();
57735
- i0.ɵɵelementStart(11, "p", 26);
57796
+ i0.ɵɵelementStart(11, "p", 27);
57736
57797
  i0.ɵɵtext(12);
57737
57798
  i0.ɵɵelementEnd()();
57738
- i0.ɵɵelementStart(13, "div")(14, "p", 23);
57799
+ i0.ɵɵelementStart(13, "div")(14, "p", 24);
57739
57800
  i0.ɵɵtext(15, " % Growth ");
57740
57801
  i0.ɵɵelementEnd();
57741
- i0.ɵɵelementStart(16, "p", 26);
57802
+ i0.ɵɵelementStart(16, "p", 27);
57742
57803
  i0.ɵɵtext(17);
57743
57804
  i0.ɵɵelementEnd()()();
57744
- i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_20_Conditional_18_Template, 11, 8, "div", 25);
57805
+ i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_20_Conditional_18_Template, 11, 8, "div", 26);
57745
57806
  i0.ɵɵelementEnd()();
57746
57807
  } if (rf & 2) {
57747
57808
  const ctx_r0 = i0.ɵɵnextContext();
@@ -57772,13 +57833,13 @@ function InitialTargetSettingComponent_Conditional_20_Template(rf, ctx) { if (rf
57772
57833
  i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 18 : -1);
57773
57834
  } }
57774
57835
  function InitialTargetSettingComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
57775
- i0.ɵɵelement(0, "symphiq-area-chart", 15);
57836
+ i0.ɵɵelement(0, "symphiq-area-chart", 16);
57776
57837
  } if (rf & 2) {
57777
57838
  const ctx_r0 = i0.ɵɵnextContext();
57778
57839
  i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "320px");
57779
57840
  } }
57780
57841
  function InitialTargetSettingComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
57781
- i0.ɵɵelementStart(0, "div", 16)(1, "p", 27);
57842
+ i0.ɵɵelementStart(0, "div", 17)(1, "p", 28);
57782
57843
  i0.ɵɵtext(2, " No revenue data available ");
57783
57844
  i0.ɵɵelementEnd()();
57784
57845
  } if (rf & 2) {
@@ -57787,13 +57848,13 @@ function InitialTargetSettingComponent_Conditional_26_Template(rf, ctx) { if (rf
57787
57848
  i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
57788
57849
  } }
57789
57850
  function InitialTargetSettingComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
57790
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 28)(2, "h2", 29);
57851
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 29)(2, "h2", 30);
57791
57852
  i0.ɵɵtext(3, " Contributing Metrics ");
57792
57853
  i0.ɵɵelementEnd();
57793
- i0.ɵɵelementStart(4, "p", 27);
57854
+ i0.ɵɵelementStart(4, "p", 28);
57794
57855
  i0.ɵɵtext(5);
57795
57856
  i0.ɵɵelementEnd()();
57796
- i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 30);
57857
+ i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 31);
57797
57858
  i0.ɵɵelementEnd();
57798
57859
  } if (rf & 2) {
57799
57860
  const ctx_r0 = i0.ɵɵnextContext();
@@ -57820,7 +57881,7 @@ class InitialTargetSettingComponent {
57820
57881
  this.targetsCreated = output();
57821
57882
  this.inputMode = signal('absolute', ...(ngDevMode ? [{ debugName: "inputMode" }] : []));
57822
57883
  this.absoluteInput = signal(null, ...(ngDevMode ? [{ debugName: "absoluteInput" }] : []));
57823
- this.percentageInput = signal(0, ...(ngDevMode ? [{ debugName: "percentageInput" }] : []));
57884
+ this.percentageInput = signal(null, ...(ngDevMode ? [{ debugName: "percentageInput" }] : []));
57824
57885
  this.isSubmitting = signal(false, ...(ngDevMode ? [{ debugName: "isSubmitting" }] : []));
57825
57886
  this.priorYearRevenue = computed(() => {
57826
57887
  return sumMetricFromUiData(this.mainUiData(), MetricEnum.PURCHASE_REVENUE, 'priorYear');
@@ -57849,6 +57910,8 @@ class InitialTargetSettingComponent {
57849
57910
  }
57850
57911
  else {
57851
57912
  const pct = this.percentageInput();
57913
+ if (pct === null)
57914
+ return 0;
57852
57915
  return priorRevenue * (1 + pct / 100);
57853
57916
  }
57854
57917
  }, ...(ngDevMode ? [{ debugName: "calculatedRevenue" }] : []));
@@ -57870,7 +57933,10 @@ class InitialTargetSettingComponent {
57870
57933
  return this.revenueCalcService.calculateTargetsFromRevenue(revenue, mainData, metrics).metricCalculations;
57871
57934
  }
57872
57935
  else {
57873
- return this.revenueCalcService.calculateTargetsFromPercentage(this.percentageInput(), mainData, metrics).metricCalculations;
57936
+ const pct = this.percentageInput();
57937
+ if (pct === null)
57938
+ return [];
57939
+ return this.revenueCalcService.calculateTargetsFromPercentage(pct, mainData, metrics).metricCalculations;
57874
57940
  }
57875
57941
  }, ...(ngDevMode ? [{ debugName: "metricCalculations" }] : []));
57876
57942
  this.isValid = computed(() => {
@@ -57912,31 +57978,6 @@ class InitialTargetSettingComponent {
57912
57978
  }, ...(ngDevMode ? [{ debugName: "revenueChartData" }] : []));
57913
57979
  this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
57914
57980
  this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
57915
- effect(() => {
57916
- const mainData = this.mainUiData();
57917
- console.group('[InitialTargetSetting] mainUiData Debug');
57918
- console.log('mainUiData exists:', !!mainData);
57919
- console.log('mainUiData:', mainData);
57920
- if (mainData) {
57921
- console.log('convertedDataResults exists:', !!mainData.convertedDataResults);
57922
- if (mainData.convertedDataResults) {
57923
- const converted = mainData.convertedDataResults;
57924
- console.log('metrics array:', converted.metrics);
57925
- console.log('dimensions array:', converted.dimensions);
57926
- console.log('rows count:', converted.rows?.length ?? 0);
57927
- console.log('first 3 rows:', converted.rows?.slice(0, 3));
57928
- const metricIndex = converted.metrics?.indexOf(MetricEnum.PURCHASE_REVENUE);
57929
- console.log('PURCHASE_REVENUE enum value:', MetricEnum.PURCHASE_REVENUE);
57930
- console.log('PURCHASE_REVENUE index in metrics:', metricIndex);
57931
- if (metricIndex !== undefined && metricIndex !== -1 && converted.rows?.length) {
57932
- const sampleValues = converted.rows.slice(0, 5).map(r => r.metricValues?.[metricIndex]);
57933
- console.log('Sample metric values at index', metricIndex, ':', sampleValues);
57934
- }
57935
- }
57936
- }
57937
- console.log('Computed priorYearRevenue:', this.priorYearRevenue());
57938
- console.groupEnd();
57939
- });
57940
57981
  }
57941
57982
  ngAfterViewInit() {
57942
57983
  setTimeout(() => {
@@ -57945,6 +57986,14 @@ class InitialTargetSettingComponent {
57945
57986
  }
57946
57987
  setInputMode(mode) {
57947
57988
  this.inputMode.set(mode);
57989
+ setTimeout(() => {
57990
+ if (mode === 'absolute' && this.absoluteInput() === null) {
57991
+ this.absoluteInputRef?.nativeElement?.focus();
57992
+ }
57993
+ else if (mode === 'percentage' && this.percentageInput() === null) {
57994
+ this.percentageInputRef?.nativeElement?.focus();
57995
+ }
57996
+ });
57948
57997
  }
57949
57998
  onAbsoluteInputChange() {
57950
57999
  const value = this.absoluteInput() ?? 0;
@@ -57955,7 +58004,7 @@ class InitialTargetSettingComponent {
57955
58004
  }
57956
58005
  onPercentageInputChange() {
57957
58006
  const pct = this.percentageInput();
57958
- if (pct >= 0 && this.priorYearRevenue() > 0) {
58007
+ if (pct !== null && pct >= 0 && this.priorYearRevenue() > 0) {
57959
58008
  const absolute = this.priorYearRevenue() * (1 + pct / 100);
57960
58009
  this.absoluteInput.set(absolute);
57961
58010
  }
@@ -58074,41 +58123,43 @@ class InitialTargetSettingComponent {
58074
58123
  static { this.ɵfac = function InitialTargetSettingComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || InitialTargetSettingComponent)(); }; }
58075
58124
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: InitialTargetSettingComponent, selectors: [["symphiq-initial-target-setting"]], viewQuery: function InitialTargetSettingComponent_Query(rf, ctx) { if (rf & 1) {
58076
58125
  i0.ɵɵviewQuery(_c0$r, 5);
58126
+ i0.ɵɵviewQuery(_c1$b, 5);
58077
58127
  } if (rf & 2) {
58078
58128
  let _t;
58079
58129
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
58080
- } }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"] }, outputs: { targetsCreated: "targetsCreated" }, decls: 29, vars: 21, consts: [["absoluteInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-6", 3, "ngClass"], [1, "grid", "lg:grid-cols-2", "gap-8"], [1, "space-y-6"], [1, "block", "text-sm", "font-semibold", "mb-2", 3, "ngClass"], [1, "space-y-1", "mb-4"], [1, "text-xs", 3, "ngClass"], [1, "flex", "gap-2", "mb-4"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "text-sm", "font-semibold", "mb-3", 3, "ngClass"], [1, "rounded-xl", "border", "p-4", 3, "ngClass"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol", "height"], [1, "h-64", "flex", "items-center", "justify-center"], [3, "submitClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText"], [1, "absolute", "left-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "step", "1000", 1, "w-full", "pl-10", "pr-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "max", "1000", "step", "0.1", 1, "w-full", "pr-10", "pl-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], [1, "absolute", "right-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], [1, "space-y-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-4", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
58081
- i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h2", 3);
58130
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
58131
+ } }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"] }, outputs: { targetsCreated: "targetsCreated" }, decls: 29, vars: 21, consts: [["absoluteInputRef", ""], ["percentageInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-6", 3, "ngClass"], [1, "grid", "lg:grid-cols-2", "gap-8"], [1, "space-y-6"], [1, "block", "text-sm", "font-semibold", "mb-2", 3, "ngClass"], [1, "space-y-1", "mb-4"], [1, "text-xs", 3, "ngClass"], [1, "flex", "gap-2", "mb-4"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "text-sm", "font-semibold", "mb-3", 3, "ngClass"], [1, "rounded-xl", "border", "p-4", 3, "ngClass"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol", "height"], [1, "h-64", "flex", "items-center", "justify-center"], [3, "submitClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText"], [1, "absolute", "left-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "step", "1000", 1, "w-full", "pl-10", "pr-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "max", "1000", "step", "0.1", 1, "w-full", "pr-10", "pl-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], [1, "absolute", "right-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], [1, "space-y-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-4", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
58132
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "h2", 4);
58082
58133
  i0.ɵɵtext(3, " Calculate Your Revenue Target ");
58083
58134
  i0.ɵɵelementEnd();
58084
- i0.ɵɵelementStart(4, "div", 4)(5, "div", 5)(6, "div")(7, "label", 6);
58135
+ i0.ɵɵelementStart(4, "div", 5)(5, "div", 6)(6, "div")(7, "label", 7);
58085
58136
  i0.ɵɵtext(8);
58086
58137
  i0.ɵɵelementEnd();
58087
- i0.ɵɵelementStart(9, "div", 7)(10, "p", 8);
58138
+ i0.ɵɵelementStart(9, "div", 8)(10, "p", 9);
58088
58139
  i0.ɵɵtext(11);
58089
58140
  i0.ɵɵelementEnd();
58090
- i0.ɵɵconditionalCreate(12, InitialTargetSettingComponent_Conditional_12_Template, 2, 2, "p", 8);
58141
+ i0.ɵɵconditionalCreate(12, InitialTargetSettingComponent_Conditional_12_Template, 2, 2, "p", 9);
58091
58142
  i0.ɵɵelementEnd();
58092
- i0.ɵɵelementStart(13, "div", 9)(14, "button", 10);
58143
+ i0.ɵɵelementStart(13, "div", 10)(14, "button", 11);
58093
58144
  i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_button_click_14_listener() { return ctx.setInputMode("absolute"); });
58094
58145
  i0.ɵɵtext(15, " Absolute Amount ");
58095
58146
  i0.ɵɵelementEnd();
58096
- i0.ɵɵelementStart(16, "button", 10);
58147
+ i0.ɵɵelementStart(16, "button", 11);
58097
58148
  i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_button_click_16_listener() { return ctx.setInputMode("percentage"); });
58098
58149
  i0.ɵɵtext(17, " % Increase ");
58099
58150
  i0.ɵɵelementEnd()();
58100
- i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 5, 3, "div", 11)(19, InitialTargetSettingComponent_Conditional_19_Template, 4, 3, "div", 11);
58151
+ i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 5, 3, "div", 12)(19, InitialTargetSettingComponent_Conditional_19_Template, 5, 3, "div", 12);
58101
58152
  i0.ɵɵelementEnd();
58102
- i0.ɵɵconditionalCreate(20, InitialTargetSettingComponent_Conditional_20_Template, 19, 13, "div", 12);
58153
+ i0.ɵɵconditionalCreate(20, InitialTargetSettingComponent_Conditional_20_Template, 19, 13, "div", 13);
58103
58154
  i0.ɵɵelementEnd();
58104
- i0.ɵɵelementStart(21, "div")(22, "p", 13);
58155
+ i0.ɵɵelementStart(21, "div")(22, "p", 14);
58105
58156
  i0.ɵɵtext(23, " Year-over-Year Revenue Trend ");
58106
58157
  i0.ɵɵelementEnd();
58107
- i0.ɵɵelementStart(24, "div", 14);
58108
- i0.ɵɵconditionalCreate(25, InitialTargetSettingComponent_Conditional_25_Template, 1, 5, "symphiq-area-chart", 15)(26, InitialTargetSettingComponent_Conditional_26_Template, 3, 1, "div", 16);
58158
+ i0.ɵɵelementStart(24, "div", 15);
58159
+ i0.ɵɵconditionalCreate(25, InitialTargetSettingComponent_Conditional_25_Template, 1, 5, "symphiq-area-chart", 16)(26, InitialTargetSettingComponent_Conditional_26_Template, 3, 1, "div", 17);
58109
58160
  i0.ɵɵelementEnd()()()();
58110
- i0.ɵɵconditionalCreate(27, InitialTargetSettingComponent_Conditional_27_Template, 7, 7, "div", 2);
58111
- i0.ɵɵelementStart(28, "symphiq-sticky-submit-bar", 17);
58161
+ i0.ɵɵconditionalCreate(27, InitialTargetSettingComponent_Conditional_27_Template, 7, 7, "div", 3);
58162
+ i0.ɵɵelementStart(28, "symphiq-sticky-submit-bar", 18);
58112
58163
  i0.ɵɵlistener("submitClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_submitClick_28_listener() { return ctx.handleSubmit(); });
58113
58164
  i0.ɵɵelementEnd()();
58114
58165
  } if (rf & 2) {
@@ -58161,194 +58212,198 @@ class InitialTargetSettingComponent {
58161
58212
  AreaChartComponent
58162
58213
  ],
58163
58214
  changeDetection: ChangeDetectionStrategy.OnPush,
58164
- template: `
58165
- <div class="space-y-8 pb-32">
58166
- <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
58167
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
58168
- Calculate Your Revenue Target
58169
- </h2>
58170
-
58171
- <div class="grid lg:grid-cols-2 gap-8">
58172
- <div class="space-y-6">
58173
- <div>
58174
- <label [ngClass]="labelClasses()" class="block text-sm font-semibold mb-2">
58175
- {{ currentYear() }} Revenue
58176
- </label>
58177
- <div class="space-y-1 mb-4">
58178
- <p [ngClass]="priorYearLabelClasses()" class="text-xs">
58179
- {{ priorYear() }} Revenue: {{ formatCurrency(priorYearRevenue()) }}
58180
- </p>
58181
- @if (currentPaceProjection() > 0) {
58182
- <p [ngClass]="priorYearLabelClasses()" class="text-xs">
58183
- Current Pace Projection: {{ formatCurrency(currentPaceProjection()) }}
58184
- </p>
58185
- }
58186
- </div>
58187
-
58188
- <div class="flex gap-2 mb-4">
58189
- <button
58190
- (click)="setInputMode('absolute')"
58191
- [ngClass]="inputModeButtonClasses('absolute')"
58192
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
58193
- Absolute Amount
58194
- </button>
58195
- <button
58196
- (click)="setInputMode('percentage')"
58197
- [ngClass]="inputModeButtonClasses('percentage')"
58198
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
58199
- % Increase
58200
- </button>
58201
- </div>
58202
-
58203
- @if (inputMode() === 'absolute') {
58204
- <div class="relative">
58205
- <span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
58206
- $
58207
- </span>
58208
- <input
58209
- #absoluteInputRef
58210
- type="number"
58211
- [(ngModel)]="absoluteInput"
58212
- (ngModelChange)="onAbsoluteInputChange()"
58213
- [ngClass]="inputClasses()"
58214
- class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
58215
- placeholder="0"
58216
- min="0"
58217
- step="1000">
58218
- </div>
58219
- } @else {
58220
- <div class="relative">
58221
- <input
58222
- type="number"
58223
- [(ngModel)]="percentageInput"
58224
- (ngModelChange)="onPercentageInputChange()"
58225
- [ngClass]="inputClasses()"
58226
- class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
58227
- placeholder="0"
58228
- min="0"
58229
- max="1000"
58230
- step="0.1">
58231
- <span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
58232
- %
58233
- </span>
58234
- </div>
58235
- }
58236
- </div>
58237
-
58238
- @if (calculatedRevenue() > 0) {
58239
- <div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2">
58240
- <div class="space-y-4">
58241
- <div>
58242
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58243
- {{ currentYear() }} Revenue Target
58244
- </p>
58245
- <p [ngClass]="calculatedValueClasses()" class="text-3xl font-bold">
58246
- {{ formatCurrency(calculatedRevenue()) }}
58247
- </p>
58248
- </div>
58249
- <div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
58250
- <div>
58251
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58252
- Increase Amount
58253
- </p>
58254
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58255
- {{ formatCurrency(calculatedRevenue() - priorYearRevenue()) }}
58256
- </p>
58257
- </div>
58258
- <div>
58259
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58260
- % Growth
58261
- </p>
58262
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58263
- +{{ formatPercentage(percentageIncrease(), 1) }}
58264
- </p>
58265
- </div>
58266
- </div>
58267
- @if (currentPaceProjection() > 0 && gapToClose().amount !== 0) {
58268
- <div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
58269
- <div>
58270
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58271
- Gap to Close
58272
- </p>
58273
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58274
- {{ formatCurrency(absValue(gapToClose().amount)) }}
58275
- </p>
58276
- </div>
58277
- <div>
58278
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58279
- Additional Growth Needed
58280
- </p>
58281
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58282
- {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(gapToClose().percentage, 1) }}
58283
- </p>
58284
- </div>
58285
- </div>
58286
- }
58287
- </div>
58288
- </div>
58289
- }
58290
- </div>
58291
-
58292
- <div>
58293
- <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
58294
- Year-over-Year Revenue Trend
58295
- </p>
58296
- <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
58297
- @if (revenueChartData()) {
58298
- <symphiq-area-chart
58299
- [chart]="revenueChartData()!"
58300
- [showAxisLabels]="true"
58301
- [viewMode]="viewMode()"
58302
- [currencySymbol]="'$'"
58303
- [height]="'320px'"
58304
- />
58305
- } @else {
58306
- <div class="h-64 flex items-center justify-center">
58307
- <p [ngClass]="noDataClasses()" class="text-sm">
58308
- No revenue data available
58309
- </p>
58310
- </div>
58311
- }
58312
- </div>
58313
- </div>
58314
- </div>
58315
- </div>
58316
-
58317
- @if (showMetricsVisualization()) {
58318
- <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
58319
- <div class="mb-6">
58320
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
58321
- Contributing Metrics
58322
- </h2>
58323
- <p [ngClass]="sectionDescriptionClasses()" class="text-sm">
58324
- To achieve your revenue target of {{ formatCurrency(calculatedRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
58325
- </p>
58326
- </div>
58327
-
58328
- <symphiq-funnel-metrics-visualization
58329
- [viewMode]="viewMode()"
58330
- [calculations]="metricCalculations()"
58331
- [pacingMetrics]="pacingMetrics()"
58332
- />
58333
- </div>
58334
- }
58335
-
58336
- <symphiq-sticky-submit-bar
58337
- [viewMode]="viewMode()"
58338
- [isValid]="isValid()"
58339
- [isSubmitting]="isSubmitting()"
58340
- [validationMessage]="validationMessage()"
58341
- [buttonText]="'Set Revenue Targets'"
58342
- (submitClick)="handleSubmit()"
58343
- />
58344
- </div>
58215
+ template: `
58216
+ <div class="space-y-8 pb-32">
58217
+ <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
58218
+ <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
58219
+ Calculate Your Revenue Target
58220
+ </h2>
58221
+
58222
+ <div class="grid lg:grid-cols-2 gap-8">
58223
+ <div class="space-y-6">
58224
+ <div>
58225
+ <label [ngClass]="labelClasses()" class="block text-sm font-semibold mb-2">
58226
+ {{ currentYear() }} Revenue
58227
+ </label>
58228
+ <div class="space-y-1 mb-4">
58229
+ <p [ngClass]="priorYearLabelClasses()" class="text-xs">
58230
+ {{ priorYear() }} Revenue: {{ formatCurrency(priorYearRevenue()) }}
58231
+ </p>
58232
+ @if (currentPaceProjection() > 0) {
58233
+ <p [ngClass]="priorYearLabelClasses()" class="text-xs">
58234
+ Current Pace Projection: {{ formatCurrency(currentPaceProjection()) }}
58235
+ </p>
58236
+ }
58237
+ </div>
58238
+
58239
+ <div class="flex gap-2 mb-4">
58240
+ <button
58241
+ (click)="setInputMode('absolute')"
58242
+ [ngClass]="inputModeButtonClasses('absolute')"
58243
+ class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
58244
+ Absolute Amount
58245
+ </button>
58246
+ <button
58247
+ (click)="setInputMode('percentage')"
58248
+ [ngClass]="inputModeButtonClasses('percentage')"
58249
+ class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
58250
+ % Increase
58251
+ </button>
58252
+ </div>
58253
+
58254
+ @if (inputMode() === 'absolute') {
58255
+ <div class="relative">
58256
+ <span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
58257
+ $
58258
+ </span>
58259
+ <input
58260
+ #absoluteInputRef
58261
+ type="number"
58262
+ [(ngModel)]="absoluteInput"
58263
+ (ngModelChange)="onAbsoluteInputChange()"
58264
+ [ngClass]="inputClasses()"
58265
+ class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
58266
+ placeholder="0"
58267
+ min="0"
58268
+ step="1000">
58269
+ </div>
58270
+ } @else {
58271
+ <div class="relative">
58272
+ <input
58273
+ #percentageInputRef
58274
+ type="number"
58275
+ [(ngModel)]="percentageInput"
58276
+ (ngModelChange)="onPercentageInputChange()"
58277
+ [ngClass]="inputClasses()"
58278
+ class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
58279
+ placeholder="0"
58280
+ min="0"
58281
+ max="1000"
58282
+ step="0.1">
58283
+ <span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
58284
+ %
58285
+ </span>
58286
+ </div>
58287
+ }
58288
+ </div>
58289
+
58290
+ @if (calculatedRevenue() > 0) {
58291
+ <div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2">
58292
+ <div class="space-y-4">
58293
+ <div>
58294
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58295
+ {{ currentYear() }} Revenue Target
58296
+ </p>
58297
+ <p [ngClass]="calculatedValueClasses()" class="text-3xl font-bold">
58298
+ {{ formatCurrency(calculatedRevenue()) }}
58299
+ </p>
58300
+ </div>
58301
+ <div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
58302
+ <div>
58303
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58304
+ Increase Amount
58305
+ </p>
58306
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58307
+ {{ formatCurrency(calculatedRevenue() - priorYearRevenue()) }}
58308
+ </p>
58309
+ </div>
58310
+ <div>
58311
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58312
+ % Growth
58313
+ </p>
58314
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58315
+ +{{ formatPercentage(percentageIncrease(), 1) }}
58316
+ </p>
58317
+ </div>
58318
+ </div>
58319
+ @if (currentPaceProjection() > 0 && gapToClose().amount !== 0) {
58320
+ <div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
58321
+ <div>
58322
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58323
+ Gap to Close
58324
+ </p>
58325
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58326
+ {{ formatCurrency(absValue(gapToClose().amount)) }}
58327
+ </p>
58328
+ </div>
58329
+ <div>
58330
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
58331
+ Additional Growth Needed
58332
+ </p>
58333
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
58334
+ {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(gapToClose().percentage, 1) }}
58335
+ </p>
58336
+ </div>
58337
+ </div>
58338
+ }
58339
+ </div>
58340
+ </div>
58341
+ }
58342
+ </div>
58343
+
58344
+ <div>
58345
+ <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
58346
+ Year-over-Year Revenue Trend
58347
+ </p>
58348
+ <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
58349
+ @if (revenueChartData()) {
58350
+ <symphiq-area-chart
58351
+ [chart]="revenueChartData()!"
58352
+ [showAxisLabels]="true"
58353
+ [viewMode]="viewMode()"
58354
+ [currencySymbol]="'$'"
58355
+ [height]="'320px'"
58356
+ />
58357
+ } @else {
58358
+ <div class="h-64 flex items-center justify-center">
58359
+ <p [ngClass]="noDataClasses()" class="text-sm">
58360
+ No revenue data available
58361
+ </p>
58362
+ </div>
58363
+ }
58364
+ </div>
58365
+ </div>
58366
+ </div>
58367
+ </div>
58368
+
58369
+ @if (showMetricsVisualization()) {
58370
+ <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
58371
+ <div class="mb-6">
58372
+ <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
58373
+ Contributing Metrics
58374
+ </h2>
58375
+ <p [ngClass]="sectionDescriptionClasses()" class="text-sm">
58376
+ To achieve your revenue target of {{ formatCurrency(calculatedRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
58377
+ </p>
58378
+ </div>
58379
+
58380
+ <symphiq-funnel-metrics-visualization
58381
+ [viewMode]="viewMode()"
58382
+ [calculations]="metricCalculations()"
58383
+ [pacingMetrics]="pacingMetrics()"
58384
+ />
58385
+ </div>
58386
+ }
58387
+
58388
+ <symphiq-sticky-submit-bar
58389
+ [viewMode]="viewMode()"
58390
+ [isValid]="isValid()"
58391
+ [isSubmitting]="isSubmitting()"
58392
+ [validationMessage]="validationMessage()"
58393
+ [buttonText]="'Set Revenue Targets'"
58394
+ (submitClick)="handleSubmit()"
58395
+ />
58396
+ </div>
58345
58397
  `
58346
58398
  }]
58347
58399
  }], () => [], { absoluteInputRef: [{
58348
58400
  type: ViewChild,
58349
58401
  args: ['absoluteInputRef']
58402
+ }], percentageInputRef: [{
58403
+ type: ViewChild,
58404
+ args: ['percentageInputRef']
58350
58405
  }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], funnelMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "funnelMetrics", required: false }] }], mainUiData: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainUiData", required: false }] }], trendUiData: [{ type: i0.Input, args: [{ isSignal: true, alias: "trendUiData", required: false }] }], shopId: [{ type: i0.Input, args: [{ isSignal: true, alias: "shopId", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], dataResults: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataResults", required: false }] }], targetsCreated: [{ type: i0.Output, args: ["targetsCreated"] }] }); })();
58351
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 217 }); })();
58406
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 218 }); })();
58352
58407
 
58353
58408
  function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
58354
58409
  i0.ɵɵelement(0, "div", 5);
@@ -63054,7 +63109,6 @@ class SymphiqBusinessAnalysisDashboardComponent {
63054
63109
  const HEADER_OFFSET = 120;
63055
63110
  const targetElement = document.querySelector(`[data-id="${event.itemId}"]`);
63056
63111
  if (!targetElement) {
63057
- console.warn(`Item not found: ${event.itemId}`);
63058
63112
  return;
63059
63113
  }
63060
63114
  const elementPosition = targetElement.getBoundingClientRect().top + window.scrollY;
@@ -84201,15 +84255,8 @@ class SymphiqProfileAnalysisDashboardComponent {
84201
84255
  modal.setMetricsAndInsights(this.allMetrics(), [], this.allCharts());
84202
84256
  }
84203
84257
  });
84204
- // Update ProfileItemLookupService when profile changes
84205
- // This enables competitor and focus area chip lookups in business insights
84206
84258
  effect(() => {
84207
84259
  const profileValue = this.profile();
84208
- console.log('[ProfileAnalysisDashboard] profile effect triggered:', {
84209
- hasProfile: !!profileValue,
84210
- hasProfileStructured: !!profileValue?.profileStructured,
84211
- hasSections: !!profileValue?.profileStructured?.sections
84212
- });
84213
84260
  if (profileValue) {
84214
84261
  this.profileItemLookupService.setProfile(profileValue);
84215
84262
  }
@@ -85281,10 +85328,6 @@ class LineChartComponent {
85281
85328
  });
85282
85329
  }
85283
85330
  ngOnInit() {
85284
- const chartData = this.chart().lineChartData;
85285
- if (!chartData) {
85286
- console.error('LineChartComponent: chart input with lineChartData is required');
85287
- }
85288
85331
  }
85289
85332
  /**
85290
85333
  * Generate a hash of the chart data to detect actual changes
@@ -85706,10 +85749,10 @@ class LineChartComponent {
85706
85749
  }
85707
85750
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LineChartComponent, [{
85708
85751
  type: Component,
85709
- args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
85710
- <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
85711
- <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
85712
- </div>
85752
+ args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
85753
+ <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
85754
+ <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
85755
+ </div>
85713
85756
  `, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
85714
85757
  }], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], chartDiv: [{
85715
85758
  type: ViewChild,
@@ -86380,10 +86423,6 @@ class PieChartComponent {
86380
86423
  });
86381
86424
  }
86382
86425
  ngOnInit() {
86383
- const chartData = this.chart().pieChartData;
86384
- if (!chartData) {
86385
- console.error('PieChartComponent: chart input with pieChartData is required');
86386
- }
86387
86426
  }
86388
86427
  /**
86389
86428
  * Generate a hash of the chart data to detect actual changes
@@ -86497,17 +86536,13 @@ class PieChartComponent {
86497
86536
  }
86498
86537
  createChart() {
86499
86538
  const chartData = this.chart().pieChartData;
86500
- // Debug logging
86501
86539
  if (!chartData || Object.keys(chartData).length === 0) {
86502
- console.warn('PieChartComponent: No data provided');
86503
86540
  return;
86504
86541
  }
86505
86542
  if (!this.chartDiv) {
86506
- console.error('PieChartComponent: chartDiv reference not found');
86507
86543
  return;
86508
86544
  }
86509
86545
  if (!chartData.series || chartData.series.length === 0) {
86510
- console.warn('PieChartComponent: No series data', { chartData });
86511
86546
  return;
86512
86547
  }
86513
86548
  this.root = Root.new(this.chartDiv.nativeElement);
@@ -86643,10 +86678,10 @@ class PieChartComponent {
86643
86678
  }
86644
86679
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PieChartComponent, [{
86645
86680
  type: Component,
86646
- args: [{ selector: 'symphiq-pie-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
86647
- <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
86648
- <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
86649
- </div>
86681
+ args: [{ selector: 'symphiq-pie-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
86682
+ <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
86683
+ <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
86684
+ </div>
86650
86685
  `, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
86651
86686
  }], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], chartDiv: [{
86652
86687
  type: ViewChild,
@@ -108806,5 +108841,5 @@ const PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS = ({
108806
108841
  * Generated bundle index. Do not edit.
108807
108842
  */
108808
108843
 
108809
- export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfettiService, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, ContentGenerationProgressWithConfettiComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, IndeterminateSpinnerComponent, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, RevenueCalculatorWelcomeBannerComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqRevenueCalculatorDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, isLightMode };
108844
+ export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfettiService, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, ContentGenerationProgressWithConfettiComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, IndeterminateSpinnerComponent, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, RevenueCalculatorService, RevenueCalculatorWelcomeBannerComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqRevenueCalculatorDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, calculateFunnelRatios, calculateMetricTargetsFromRevenue, calculateMetricTargetsFromRevenueReverse, calculateRelatedMetricRatios, generateTargetsFromCalculations, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getFunnelStageMetrics, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, groupMetricsByFunnelStage, isLightMode, validateRevenueTarget };
108810
108845
  //# sourceMappingURL=symphiq-components.mjs.map