@eric-emg/symphiq-components 1.2.209 → 1.2.211

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.
@@ -54704,19 +54704,13 @@ class RevenueCalculatorWelcomeBannerComponent {
54704
54704
  }], 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 }] }] }); })();
54705
54705
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RevenueCalculatorWelcomeBannerComponent, { className: "RevenueCalculatorWelcomeBannerComponent", filePath: "lib/components/revenue-calculator-dashboard/revenue-calculator-welcome-banner.component.ts", lineNumber: 85 }); })();
54706
54706
 
54707
- function calculatePacingStatus(currentValue, priorValue, targetValue) {
54708
- if (targetValue !== undefined && targetValue > 0) {
54709
- const targetGrowth = ((targetValue - priorValue) / priorValue) * 100;
54710
- const actualGrowth = ((currentValue - priorValue) / priorValue) * 100;
54711
- if (actualGrowth >= targetGrowth * 1.05)
54712
- return 'ahead';
54713
- if (actualGrowth >= targetGrowth * 0.95)
54714
- return 'on-pace';
54715
- return 'behind';
54716
- }
54717
- if (currentValue >= priorValue * 1.05)
54707
+ function calculatePacingStatus(projectedValue, targetValue) {
54708
+ if (targetValue <= 0)
54709
+ return 'on-pace';
54710
+ const pacingPercent = ((projectedValue - targetValue) / targetValue) * 100;
54711
+ if (pacingPercent >= 5)
54718
54712
  return 'ahead';
54719
- if (currentValue >= priorValue * 0.95)
54713
+ if (pacingPercent >= -5)
54720
54714
  return 'on-pace';
54721
54715
  return 'behind';
54722
54716
  }
@@ -54807,42 +54801,44 @@ function getPacingDisplayInfo(pacingPercentage, status, isDark) {
54807
54801
  displayText
54808
54802
  };
54809
54803
  }
54810
- function calculateMetricPacing(metric) {
54811
- const currentValue = metric.currentValue || 0;
54812
- const priorYtdValue = metric.priorYtdValue || 0;
54813
- const targetValue = metric.targetValue;
54814
- const pacingPercentage = metric.pacingPercentage ||
54815
- (priorYtdValue > 0 ? ((currentValue - priorYtdValue) / priorYtdValue) * 100 : 0);
54816
- const projectedValue = metric.projectedValue || currentValue;
54817
- const status = calculatePacingStatus(currentValue, priorYtdValue, targetValue);
54804
+ function calculateMetricPacing(projectedValue, targetValue) {
54805
+ console.group(`[PACING] calculateMetricPacing`);
54806
+ console.log('[PACING] Input:', { projectedValue, targetValue });
54807
+ const pacingPercentage = targetValue > 0
54808
+ ? ((projectedValue - targetValue) / targetValue) * 100
54809
+ : 0;
54810
+ const status = calculatePacingStatus(projectedValue, targetValue);
54811
+ console.log('[PACING] Result:', { pacingPercentage, status, projectedValue });
54812
+ console.groupEnd();
54818
54813
  return {
54819
54814
  pacingPercentage,
54820
54815
  status,
54821
54816
  projectedValue
54822
54817
  };
54823
54818
  }
54824
- function extractMetricPacing(pacingResponse, metricEnum) {
54825
- if (!pacingResponse)
54819
+ function extractProjectedValue(pacingResponse, metricEnum) {
54820
+ console.group(`[PACING] extractProjectedValue for ${metricEnum}`);
54821
+ if (!pacingResponse) {
54822
+ console.log('[PACING] No pacingResponse provided - returning null');
54823
+ console.groupEnd();
54826
54824
  return null;
54827
- const soFarMetric = pacingResponse.soFarMetricValues?.find(m => m.metric === metricEnum);
54828
- const projectedMetric = pacingResponse.projectedMetricValues?.find(m => m.metric === metricEnum);
54829
- const lastYearMetrics = pacingResponse.lastYearMetricValuesMonthly?.filter(m => m.metric === metricEnum) || [];
54830
- if (!soFarMetric && !projectedMetric)
54825
+ }
54826
+ const resp = pacingResponse;
54827
+ console.log('[PACING] pacingResponse structure:', {
54828
+ hasProjectedMetricValues: !!resp.projectedMetricValues,
54829
+ projectedMetricValuesCount: resp.projectedMetricValues?.length ?? 0
54830
+ });
54831
+ const projectedMetric = resp.projectedMetricValues?.find((m) => m.metric === metricEnum);
54832
+ console.log('[PACING] Found projectedMetric for', metricEnum, ':', projectedMetric ? { metric: projectedMetric.metric, value: projectedMetric.value } : null);
54833
+ if (!projectedMetric?.value) {
54834
+ console.log('[PACING] No projectedMetric found - returning null');
54835
+ console.groupEnd();
54831
54836
  return null;
54832
- const currentValue = soFarMetric?.value ? parseFloat(soFarMetric.value) : 0;
54833
- const projectedValue = projectedMetric?.value ? parseFloat(projectedMetric.value) : 0;
54834
- const priorYtdValue = lastYearMetrics.reduce((sum, m) => {
54835
- return sum + (m.value ? parseFloat(m.value) : 0);
54836
- }, 0);
54837
- const pacingPercentage = priorYtdValue > 0 ? ((currentValue - priorYtdValue) / priorYtdValue) * 100 : 0;
54838
- return {
54839
- metric: metricEnum,
54840
- currentValue,
54841
- priorYtdValue,
54842
- projectedValue,
54843
- pacingPercentage,
54844
- ytdVariancePercent: pacingPercentage
54845
- };
54837
+ }
54838
+ const projectedValue = parseFloat(projectedMetric.value);
54839
+ console.log('[PACING] Returning projectedValue:', projectedValue);
54840
+ console.groupEnd();
54841
+ return projectedValue;
54846
54842
  }
54847
54843
 
54848
54844
  class PacingStatusBadgeComponent {
@@ -55015,7 +55011,7 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template
55015
55011
  i0.ɵɵadvance();
55016
55012
  i0.ɵɵproperty("ngClass", ctx_r1.relatedPercentageBadgeClasses());
55017
55013
  i0.ɵɵadvance();
55018
- i0.ɵɵtextInterpolate1(" +", ctx_r1.formatPercentage(metric_r3.calc.percentageIncrease, 1), " ");
55014
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(metric_r3.calc.metric), "", ctx_r1.formatPercentage(ctx_r1.Math.abs(metric_r3.calc.percentageIncrease), 1), " ");
55019
55015
  i0.ɵɵadvance();
55020
55016
  i0.ɵɵproperty("ngClass", metric_r3.pacingInfo ? "grid-cols-3" : "grid-cols-2");
55021
55017
  i0.ɵɵadvance(2);
@@ -55035,7 +55031,7 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template(rf, c
55035
55031
  i0.ɵɵtext(3, " Related Metrics ");
55036
55032
  i0.ɵɵelementEnd();
55037
55033
  i0.ɵɵelementStart(4, "div", 19);
55038
- i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template, 18, 14, "div", 20, _forTrack1$3);
55034
+ i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template, 18, 15, "div", 20, _forTrack1$3);
55039
55035
  i0.ɵɵelementEnd()();
55040
55036
  } if (rf & 2) {
55041
55037
  const stage_r1 = i0.ɵɵnextContext().$implicit;
@@ -55087,7 +55083,7 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55087
55083
  i0.ɵɵadvance();
55088
55084
  i0.ɵɵproperty("ngClass", ctx_r1.percentageBadgeClasses());
55089
55085
  i0.ɵɵadvance();
55090
- i0.ɵɵtextInterpolate1(" +", ctx_r1.formatPercentage(stage_r1.stageMetric.percentageIncrease, 1), " ");
55086
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(stage_r1.stageMetric.metric), "", ctx_r1.formatPercentage(ctx_r1.Math.abs(stage_r1.stageMetric.percentageIncrease), 1), " ");
55091
55087
  i0.ɵɵadvance(3);
55092
55088
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55093
55089
  i0.ɵɵadvance();
@@ -55114,21 +55110,39 @@ class FunnelMetricsVisualizationComponent {
55114
55110
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
55115
55111
  this.calculations = input([], ...(ngDevMode ? [{ debugName: "calculations" }] : []));
55116
55112
  this.pacingMetrics = input(undefined, ...(ngDevMode ? [{ debugName: "pacingMetrics" }] : []));
55113
+ this.Math = Math;
55117
55114
  this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
55118
55115
  this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
55119
55116
  this.funnelStages = computed(() => {
55120
55117
  const calcs = this.calculations();
55121
55118
  const pacingResponse = this.pacingMetrics();
55119
+ console.group('[PACING] funnelStages computed');
55120
+ console.log('[PACING] calculations count:', calcs.length);
55121
+ console.log('[PACING] calculations:', calcs.map(c => ({ metric: c.metric, isFunnelStage: c.isFunnelStage, funnelMetric: c.funnelMetric })));
55122
+ console.log('[PACING] pacingResponse exists:', !!pacingResponse);
55123
+ if (pacingResponse) {
55124
+ console.log('[PACING] pacingResponse raw:', JSON.stringify(pacingResponse, null, 2));
55125
+ }
55122
55126
  const grouped = new Map();
55123
55127
  const stageMetrics = calcs.filter(c => c.isFunnelStage);
55124
55128
  const relatedMetrics = calcs.filter(c => !c.isFunnelStage);
55129
+ console.log('[PACING] stageMetrics count:', stageMetrics.length);
55130
+ console.log('[PACING] stageMetrics:', stageMetrics.map(s => s.metric));
55131
+ console.log('[PACING] relatedMetrics count:', relatedMetrics.length);
55125
55132
  stageMetrics.forEach(stageMetric => {
55126
55133
  const related = relatedMetrics.filter(rm => rm.funnelMetric === stageMetric.metric);
55127
- const stagePacingMetric = extractMetricPacing(pacingResponse, stageMetric.metric);
55128
- const stagePacingInfo = stagePacingMetric ? calculateMetricPacing(stagePacingMetric) : null;
55134
+ console.log(`[PACING] Processing stage: ${stageMetric.metric}`);
55135
+ const stageProjectedValue = extractProjectedValue(pacingResponse, stageMetric.metric);
55136
+ console.log(`[PACING] stageProjectedValue for ${stageMetric.metric}:`, stageProjectedValue);
55137
+ const stagePacingInfo = stageProjectedValue !== null
55138
+ ? calculateMetricPacing(stageProjectedValue, stageMetric.targetValue)
55139
+ : null;
55140
+ console.log(`[PACING] stagePacingInfo for ${stageMetric.metric}:`, stagePacingInfo);
55129
55141
  const relatedWithPacing = related.map(relMetric => {
55130
- const relPacingMetric = extractMetricPacing(pacingResponse, relMetric.metric);
55131
- const relPacingInfo = relPacingMetric ? calculateMetricPacing(relPacingMetric) : null;
55142
+ const relProjectedValue = extractProjectedValue(pacingResponse, relMetric.metric);
55143
+ const relPacingInfo = relProjectedValue !== null
55144
+ ? calculateMetricPacing(relProjectedValue, relMetric.targetValue)
55145
+ : null;
55132
55146
  return { calc: relMetric, pacingInfo: relPacingInfo };
55133
55147
  });
55134
55148
  grouped.set(stageMetric.metric, {
@@ -55137,11 +55151,18 @@ class FunnelMetricsVisualizationComponent {
55137
55151
  pacingInfo: stagePacingInfo
55138
55152
  });
55139
55153
  });
55140
- return Array.from(grouped.values()).sort((a, b) => {
55154
+ const result = Array.from(grouped.values()).sort((a, b) => {
55141
55155
  const aInd = a.stageMetric.funnelInd ?? 999;
55142
55156
  const bInd = b.stageMetric.funnelInd ?? 999;
55143
55157
  return aInd - bInd;
55144
55158
  });
55159
+ console.log('[PACING] Final funnelStages result:', result.map(r => ({
55160
+ stage: r.stageMetric.metric,
55161
+ hasPacingInfo: !!r.pacingInfo,
55162
+ pacingPercentage: r.pacingInfo?.pacingPercentage
55163
+ })));
55164
+ console.groupEnd();
55165
+ return result;
55145
55166
  }, ...(ngDevMode ? [{ debugName: "funnelStages" }] : []));
55146
55167
  }
55147
55168
  stageCardClasses() {
@@ -55242,12 +55263,15 @@ class FunnelMetricsVisualizationComponent {
55242
55263
  getMarkdownTooltipContent(markdown, title) {
55243
55264
  return { title, markdown };
55244
55265
  }
55266
+ getGrowthSign(metric) {
55267
+ return MetricEnumUtil.increaseBad(metric) ? '-' : '+';
55268
+ }
55245
55269
  static { this.ɵfac = function FunnelMetricsVisualizationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FunnelMetricsVisualizationComponent)(); }; }
55246
55270
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FunnelMetricsVisualizationComponent, selectors: [["symphiq-funnel-metrics-visualization"]], inputs: { viewMode: [1, "viewMode"], calculations: [1, "calculations"], pacingMetrics: [1, "pacingMetrics"] }, decls: 5, vars: 0, consts: [[1, "space-y-6"], [1, "space-y-8"], [1, "rounded-xl", "p-6", "border-2", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-4"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-1"], [1, "text-lg", "font-bold", "leading-tight", "m-0", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-6", "h-6", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "flex", "items-center", "gap-3"], [3, "viewMode", "pacingPercentage", "status"], [1, "px-4", "py-2", "rounded-lg", "font-bold", "text-sm", 3, "ngClass"], [1, "grid", "grid-cols-3", "gap-4", "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-2xl", "font-bold", 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", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "my-4", 3, "ngClass"], [1, "space-y-2"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-3", 3, "ngClass"], [1, "grid", "gap-2"], [1, "p-3", "rounded-lg", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "mb-2"], [1, "flex", "items-center", "gap-2", "flex-1"], [1, "text-sm", "font-semibold", "leading-tight", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "flex", "items-center", "gap-2"], [1, "px-2", "py-1", "rounded", "text-xs", "font-bold", 3, "ngClass"], [1, "grid", "gap-2", "text-xs", 3, "ngClass"], [3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55247
55271
  i0.ɵɵelementStart(0, "div", 0);
55248
55272
  i0.ɵɵelement(1, "symphiq-tooltip-container");
55249
55273
  i0.ɵɵelementStart(2, "div", 1);
55250
- i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 24, 17, "div", 2, _forTrack0$i);
55274
+ i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 24, 18, "div", 2, _forTrack0$i);
55251
55275
  i0.ɵɵelementEnd()();
55252
55276
  } if (rf & 2) {
55253
55277
  i0.ɵɵadvance(3);
@@ -55261,140 +55285,140 @@ class FunnelMetricsVisualizationComponent {
55261
55285
  standalone: true,
55262
55286
  imports: [CommonModule, PacingStatusBadgeComponent, TooltipDirective, TooltipContainerComponent],
55263
55287
  changeDetection: ChangeDetectionStrategy.OnPush,
55264
- template: `
55265
- <div class="space-y-6">
55266
- <symphiq-tooltip-container />
55267
- <div class="space-y-8">
55268
- @for (stage of funnelStages(); track stage.stageMetric.metric) {
55269
- <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55270
- <div class="flex items-start justify-between mb-4">
55271
- <div class="flex-1">
55272
- <div class="flex items-center gap-2 mb-1">
55273
- <h3 [ngClass]="stageTitleClasses()" class="text-lg font-bold leading-tight m-0">
55274
- {{ getMetricTitle(stage.stageMetric) }}
55275
- </h3>
55276
- @if (stage.stageMetric.description) {
55277
- <button
55278
- type="button"
55279
- [ngClass]="infoIconClasses()"
55280
- class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55281
- [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55282
- tooltipType="markdown"
55283
- tooltipPosition="right">
55284
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55285
- <path 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" />
55286
- </svg>
55287
- </button>
55288
- }
55289
- </div>
55290
- </div>
55291
- <div class="flex items-center gap-3">
55292
- @if (stage.pacingInfo) {
55293
- <symphiq-pacing-status-badge
55294
- [viewMode]="viewMode()"
55295
- [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55296
- [status]="stage.pacingInfo.status"
55297
- />
55298
- }
55299
- <div [ngClass]="percentageBadgeClasses()" class="px-4 py-2 rounded-lg font-bold text-sm">
55300
- +{{ formatPercentage(stage.stageMetric.percentageIncrease, 1) }}
55301
- </div>
55302
- </div>
55303
- </div>
55304
-
55305
- <div class="grid grid-cols-3 gap-4 mb-4">
55306
- <div>
55307
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55308
- {{ priorYear() }} Actual
55309
- </p>
55310
- <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55311
- {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55312
- </p>
55313
- </div>
55314
- @if (stage.pacingInfo) {
55315
- <div>
55316
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55317
- {{ currentYear() }} Projected
55318
- </p>
55319
- <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold">
55320
- {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55321
- </p>
55322
- </div>
55323
- }
55324
- <div>
55325
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55326
- {{ currentYear() }} Target
55327
- </p>
55328
- <p [ngClass]="targetValueClasses()" class="text-2xl font-bold">
55329
- {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric) }}
55330
- </p>
55331
- </div>
55332
- </div>
55333
-
55334
- @if (stage.relatedMetrics.length > 0) {
55335
- <div [ngClass]="dividerClasses()" class="my-4"></div>
55336
-
55337
- <div class="space-y-2">
55338
- <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55339
- Related Metrics
55340
- </p>
55341
- <div class="grid gap-2">
55342
- @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55343
- <div [ngClass]="relatedMetricCardClasses()" class="p-3 rounded-lg">
55344
- <div class="flex items-center justify-between mb-2">
55345
- <div class="flex items-center gap-2 flex-1">
55346
- <p [ngClass]="relatedMetricNameClasses()" class="text-sm font-semibold leading-tight">
55347
- {{ getMetricTitle(metric.calc) }}
55348
- </p>
55349
- @if (metric.calc.description) {
55350
- <button
55351
- type="button"
55352
- [ngClass]="infoIconClasses()"
55353
- class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55354
- [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55355
- tooltipType="markdown"
55356
- tooltipPosition="right">
55357
- <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55358
- <path 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" />
55359
- </svg>
55360
- </button>
55361
- }
55362
- </div>
55363
- <div class="flex items-center gap-2">
55364
- @if (metric.pacingInfo) {
55365
- <symphiq-pacing-status-badge
55366
- [viewMode]="viewMode()"
55367
- [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55368
- [status]="metric.pacingInfo.status"
55369
- />
55370
- }
55371
- <span [ngClass]="relatedPercentageBadgeClasses()" class="px-2 py-1 rounded text-xs font-bold">
55372
- +{{ formatPercentage(metric.calc.percentageIncrease, 1) }}
55373
- </span>
55374
- </div>
55375
- </div>
55376
- <div class="grid gap-2 text-xs" [ngClass]="metric.pacingInfo ? 'grid-cols-3' : 'grid-cols-2'">
55377
- <div>
55378
- <p [ngClass]="relatedLabelClasses()">{{ priorYear() }}: {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}</p>
55379
- </div>
55380
- @if (metric.pacingInfo) {
55381
- <div>
55382
- <p [ngClass]="relatedLabelClasses()">Proj: {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}</p>
55383
- </div>
55384
- }
55385
- <div>
55386
- <p [ngClass]="relatedLabelClasses()">Target: {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric) }}</p>
55387
- </div>
55388
- </div>
55389
- </div>
55390
- }
55391
- </div>
55392
- </div>
55393
- }
55394
- </div>
55395
- }
55396
- </div>
55397
- </div>
55288
+ template: `
55289
+ <div class="space-y-6">
55290
+ <symphiq-tooltip-container />
55291
+ <div class="space-y-8">
55292
+ @for (stage of funnelStages(); track stage.stageMetric.metric) {
55293
+ <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55294
+ <div class="flex items-start justify-between mb-4">
55295
+ <div class="flex-1">
55296
+ <div class="flex items-center gap-2 mb-1">
55297
+ <h3 [ngClass]="stageTitleClasses()" class="text-lg font-bold leading-tight m-0">
55298
+ {{ getMetricTitle(stage.stageMetric) }}
55299
+ </h3>
55300
+ @if (stage.stageMetric.description) {
55301
+ <button
55302
+ type="button"
55303
+ [ngClass]="infoIconClasses()"
55304
+ class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55305
+ [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55306
+ tooltipType="markdown"
55307
+ tooltipPosition="right">
55308
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55309
+ <path 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" />
55310
+ </svg>
55311
+ </button>
55312
+ }
55313
+ </div>
55314
+ </div>
55315
+ <div class="flex items-center gap-3">
55316
+ @if (stage.pacingInfo) {
55317
+ <symphiq-pacing-status-badge
55318
+ [viewMode]="viewMode()"
55319
+ [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55320
+ [status]="stage.pacingInfo.status"
55321
+ />
55322
+ }
55323
+ <div [ngClass]="percentageBadgeClasses()" class="px-4 py-2 rounded-lg font-bold text-sm">
55324
+ {{ getGrowthSign(stage.stageMetric.metric) }}{{ formatPercentage(Math.abs(stage.stageMetric.percentageIncrease), 1) }}
55325
+ </div>
55326
+ </div>
55327
+ </div>
55328
+
55329
+ <div class="grid grid-cols-3 gap-4 mb-4">
55330
+ <div>
55331
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55332
+ {{ priorYear() }} Actual
55333
+ </p>
55334
+ <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55335
+ {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55336
+ </p>
55337
+ </div>
55338
+ @if (stage.pacingInfo) {
55339
+ <div>
55340
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55341
+ {{ currentYear() }} Projected
55342
+ </p>
55343
+ <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold">
55344
+ {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55345
+ </p>
55346
+ </div>
55347
+ }
55348
+ <div>
55349
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55350
+ {{ currentYear() }} Target
55351
+ </p>
55352
+ <p [ngClass]="targetValueClasses()" class="text-2xl font-bold">
55353
+ {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric) }}
55354
+ </p>
55355
+ </div>
55356
+ </div>
55357
+
55358
+ @if (stage.relatedMetrics.length > 0) {
55359
+ <div [ngClass]="dividerClasses()" class="my-4"></div>
55360
+
55361
+ <div class="space-y-2">
55362
+ <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55363
+ Related Metrics
55364
+ </p>
55365
+ <div class="grid gap-2">
55366
+ @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55367
+ <div [ngClass]="relatedMetricCardClasses()" class="p-3 rounded-lg">
55368
+ <div class="flex items-center justify-between mb-2">
55369
+ <div class="flex items-center gap-2 flex-1">
55370
+ <p [ngClass]="relatedMetricNameClasses()" class="text-sm font-semibold leading-tight">
55371
+ {{ getMetricTitle(metric.calc) }}
55372
+ </p>
55373
+ @if (metric.calc.description) {
55374
+ <button
55375
+ type="button"
55376
+ [ngClass]="infoIconClasses()"
55377
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55378
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55379
+ tooltipType="markdown"
55380
+ tooltipPosition="right">
55381
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55382
+ <path 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" />
55383
+ </svg>
55384
+ </button>
55385
+ }
55386
+ </div>
55387
+ <div class="flex items-center gap-2">
55388
+ @if (metric.pacingInfo) {
55389
+ <symphiq-pacing-status-badge
55390
+ [viewMode]="viewMode()"
55391
+ [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55392
+ [status]="metric.pacingInfo.status"
55393
+ />
55394
+ }
55395
+ <span [ngClass]="relatedPercentageBadgeClasses()" class="px-2 py-1 rounded text-xs font-bold">
55396
+ {{ getGrowthSign(metric.calc.metric) }}{{ formatPercentage(Math.abs(metric.calc.percentageIncrease), 1) }}
55397
+ </span>
55398
+ </div>
55399
+ </div>
55400
+ <div class="grid gap-2 text-xs" [ngClass]="metric.pacingInfo ? 'grid-cols-3' : 'grid-cols-2'">
55401
+ <div>
55402
+ <p [ngClass]="relatedLabelClasses()">{{ priorYear() }}: {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}</p>
55403
+ </div>
55404
+ @if (metric.pacingInfo) {
55405
+ <div>
55406
+ <p [ngClass]="relatedLabelClasses()">Proj: {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}</p>
55407
+ </div>
55408
+ }
55409
+ <div>
55410
+ <p [ngClass]="relatedLabelClasses()">Target: {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric) }}</p>
55411
+ </div>
55412
+ </div>
55413
+ </div>
55414
+ }
55415
+ </div>
55416
+ </div>
55417
+ }
55418
+ </div>
55419
+ }
55420
+ </div>
55421
+ </div>
55398
55422
  `
55399
55423
  }]
55400
55424
  }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], calculations: [{ type: i0.Input, args: [{ isSignal: true, alias: "calculations", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }] }); })();
@@ -56226,7 +56250,7 @@ var areaChart_component = /*#__PURE__*/Object.freeze({
56226
56250
 
56227
56251
  const _c0$r = ["absoluteInputRef"];
56228
56252
  const _c1$b = ["percentageInputRef"];
56229
- function InitialTargetSettingComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
56253
+ function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
56230
56254
  i0.ɵɵelementStart(0, "div", 10);
56231
56255
  i0.ɵɵnamespaceSVG();
56232
56256
  i0.ɵɵelementStart(1, "svg", 11);
@@ -56250,14 +56274,14 @@ function InitialTargetSettingComponent_Conditional_17_Template(rf, ctx) { if (rf
56250
56274
  i0.ɵɵadvance();
56251
56275
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.currentPaceProjection()), " ");
56252
56276
  } }
56253
- function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56277
+ function InitialTargetSettingComponent_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56254
56278
  const _r3 = i0.ɵɵgetCurrentView();
56255
56279
  i0.ɵɵelementStart(0, "div", 34)(1, "span", 35);
56256
56280
  i0.ɵɵtext(2, " $ ");
56257
56281
  i0.ɵɵelementEnd();
56258
56282
  i0.ɵɵelementStart(3, "input", 36, 0);
56259
- i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.absoluteInput, $event) || (ctx_r0.absoluteInput = $event); return i0.ɵɵresetView($event); });
56260
- i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onAbsoluteInputChange()); });
56283
+ i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_22_Conditional_5_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.absoluteInput, $event) || (ctx_r0.absoluteInput = $event); return i0.ɵɵresetView($event); });
56284
+ i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_22_Conditional_5_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onAbsoluteInputChange()); });
56261
56285
  i0.ɵɵelementEnd()();
56262
56286
  } if (rf & 2) {
56263
56287
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -56267,11 +56291,11 @@ function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template(rf,
56267
56291
  i0.ɵɵtwoWayProperty("ngModel", ctx_r0.absoluteInput);
56268
56292
  i0.ɵɵproperty("ngClass", ctx_r0.inputClasses());
56269
56293
  } }
56270
- function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template(rf, ctx) { if (rf & 1) {
56294
+ function InitialTargetSettingComponent_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
56271
56295
  const _r4 = i0.ɵɵgetCurrentView();
56272
56296
  i0.ɵɵelementStart(0, "div", 34)(1, "input", 37, 1);
56273
- i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.percentageInput, $event) || (ctx_r0.percentageInput = $event); return i0.ɵɵresetView($event); });
56274
- i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template_input_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onPercentageInputChange()); });
56297
+ i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_22_Conditional_6_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.percentageInput, $event) || (ctx_r0.percentageInput = $event); return i0.ɵɵresetView($event); });
56298
+ i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_22_Conditional_6_Template_input_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onPercentageInputChange()); });
56275
56299
  i0.ɵɵelementEnd();
56276
56300
  i0.ɵɵelementStart(3, "span", 38);
56277
56301
  i0.ɵɵtext(4, " % ");
@@ -56284,17 +56308,17 @@ function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template(rf,
56284
56308
  i0.ɵɵadvance(2);
56285
56309
  i0.ɵɵproperty("ngClass", ctx_r0.inputSuffixClasses());
56286
56310
  } }
56287
- function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
56311
+ function InitialTargetSettingComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
56288
56312
  const _r2 = i0.ɵɵgetCurrentView();
56289
56313
  i0.ɵɵelementStart(0, "div", 32)(1, "button", 33);
56290
- i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_21_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setInputMode("absolute")); });
56314
+ i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_22_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setInputMode("absolute")); });
56291
56315
  i0.ɵɵtext(2, " Absolute Amount ");
56292
56316
  i0.ɵɵelementEnd();
56293
56317
  i0.ɵɵelementStart(3, "button", 33);
56294
- i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_21_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setInputMode("percentage")); });
56318
+ i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_22_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setInputMode("percentage")); });
56295
56319
  i0.ɵɵtext(4, " % Increase ");
56296
56320
  i0.ɵɵelementEnd()();
56297
- i0.ɵɵconditionalCreate(5, InitialTargetSettingComponent_Conditional_21_Conditional_5_Template, 5, 3, "div", 34)(6, InitialTargetSettingComponent_Conditional_21_Conditional_6_Template, 5, 3, "div", 34);
56321
+ i0.ɵɵconditionalCreate(5, InitialTargetSettingComponent_Conditional_22_Conditional_5_Template, 5, 3, "div", 34)(6, InitialTargetSettingComponent_Conditional_22_Conditional_6_Template, 5, 3, "div", 34);
56298
56322
  } if (rf & 2) {
56299
56323
  const ctx_r0 = i0.ɵɵnextContext();
56300
56324
  i0.ɵɵadvance();
@@ -56304,13 +56328,13 @@ function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf
56304
56328
  i0.ɵɵadvance(2);
56305
56329
  i0.ɵɵconditional(ctx_r0.inputMode() === "absolute" ? 5 : 6);
56306
56330
  } }
56307
- function InitialTargetSettingComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
56331
+ function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
56308
56332
  i0.ɵɵelement(0, "symphiq-area-chart", 22);
56309
56333
  } if (rf & 2) {
56310
56334
  const ctx_r0 = i0.ɵɵnextContext();
56311
56335
  i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "108px");
56312
56336
  } }
56313
- function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
56337
+ function InitialTargetSettingComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
56314
56338
  i0.ɵɵelementStart(0, "div", 23)(1, "p", 39);
56315
56339
  i0.ɵɵtext(2, " No revenue data available ");
56316
56340
  i0.ɵɵelementEnd()();
@@ -56319,77 +56343,96 @@ function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf
56319
56343
  i0.ɵɵadvance();
56320
56344
  i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
56321
56345
  } }
56322
- function InitialTargetSettingComponent_Conditional_32_Conditional_8_Template(rf, ctx) { if (rf & 1) {
56346
+ function InitialTargetSettingComponent_Conditional_33_Conditional_8_Template(rf, ctx) { if (rf & 1) {
56323
56347
  const _r5 = i0.ɵɵgetCurrentView();
56324
- i0.ɵɵelementStart(0, "button", 49);
56325
- i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_32_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.handleAdjustTarget()); });
56348
+ i0.ɵɵelementStart(0, "button", 50);
56349
+ i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_33_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.handleAdjustTarget()); });
56326
56350
  i0.ɵɵtext(1, " Adjust Revenue Target ");
56327
56351
  i0.ɵɵelementEnd();
56328
56352
  } if (rf & 2) {
56329
56353
  const ctx_r0 = i0.ɵɵnextContext(2);
56330
56354
  i0.ɵɵproperty("ngClass", ctx_r0.secondaryButtonClasses());
56331
56355
  } }
56332
- function InitialTargetSettingComponent_Conditional_32_Conditional_24_Template(rf, ctx) { if (rf & 1) {
56333
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 45)(2, "span", 46);
56334
- i0.ɵɵtext(3);
56335
- i0.ɵɵelementEnd()();
56336
- i0.ɵɵelementStart(4, "div", 47)(5, "div")(6, "p", 41);
56337
- i0.ɵɵtext(7, " Gap to Close ");
56356
+ function InitialTargetSettingComponent_Conditional_33_Conditional_26_Template(rf, ctx) { if (rf & 1) {
56357
+ i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
56358
+ i0.ɵɵelement(2, "div", 46);
56359
+ i0.ɵɵelementStart(3, "span", 47);
56360
+ i0.ɵɵtext(4);
56338
56361
  i0.ɵɵelementEnd();
56339
- i0.ɵɵelementStart(8, "p", 48);
56340
- i0.ɵɵtext(9);
56362
+ i0.ɵɵelement(5, "div", 46);
56363
+ i0.ɵɵelementEnd();
56364
+ i0.ɵɵelementStart(6, "div", 48)(7, "div")(8, "p", 41);
56365
+ i0.ɵɵtext(9, " Gap to Close ");
56366
+ i0.ɵɵelementEnd();
56367
+ i0.ɵɵelementStart(10, "p", 49);
56368
+ i0.ɵɵtext(11);
56341
56369
  i0.ɵɵelementEnd()();
56342
- i0.ɵɵelementStart(10, "div")(11, "p", 41);
56343
- i0.ɵɵtext(12, " Additional Growth Needed ");
56370
+ i0.ɵɵelementStart(12, "div")(13, "div", 51)(14, "p", 13);
56371
+ i0.ɵɵtext(15, " Additional Growth Needed ");
56344
56372
  i0.ɵɵelementEnd();
56345
- i0.ɵɵelementStart(13, "p", 48);
56346
- i0.ɵɵtext(14);
56373
+ i0.ɵɵelementStart(16, "button", 52);
56374
+ i0.ɵɵnamespaceSVG();
56375
+ i0.ɵɵelementStart(17, "svg", 53);
56376
+ i0.ɵɵelement(18, "path", 54);
56377
+ i0.ɵɵelementEnd()()();
56378
+ i0.ɵɵnamespaceHTML();
56379
+ i0.ɵɵelementStart(19, "p", 49);
56380
+ i0.ɵɵtext(20);
56347
56381
  i0.ɵɵelementEnd()()()();
56348
56382
  } if (rf & 2) {
56349
56383
  const ctx_r0 = i0.ɵɵnextContext(2);
56350
- i0.ɵɵproperty("ngClass", ctx_r0.calculatedDividerClasses());
56351
56384
  i0.ɵɵadvance(2);
56385
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56386
+ i0.ɵɵadvance();
56352
56387
  i0.ɵɵproperty("ngClass", ctx_r0.dividerLabelClasses());
56353
56388
  i0.ɵɵadvance();
56354
56389
  i0.ɵɵtextInterpolate1(" ", ctx_r0.currentYear(), " YTD Gap ");
56390
+ i0.ɵɵadvance();
56391
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56355
56392
  i0.ɵɵadvance(3);
56356
56393
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56357
56394
  i0.ɵɵadvance(2);
56358
56395
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedSecondaryClasses());
56359
56396
  i0.ɵɵadvance();
56360
56397
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.absValue(ctx_r0.gapToClose().amount)), " ");
56361
- i0.ɵɵadvance(2);
56398
+ i0.ɵɵadvance(3);
56362
56399
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56363
56400
  i0.ɵɵadvance(2);
56401
+ i0.ɵɵproperty("ngClass", ctx_r0.infoIconClasses())("libSymphiqTooltip", ctx_r0.additionalGrowthTooltip);
56402
+ i0.ɵɵadvance(3);
56364
56403
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedSecondaryClasses());
56365
56404
  i0.ɵɵadvance();
56366
56405
  i0.ɵɵtextInterpolate2(" ", ctx_r0.gapToClose().amount > 0 ? "+" : "", "", ctx_r0.formatPercentage(ctx_r0.gapToClose().percentage, 1), " ");
56367
56406
  } }
56368
- function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
56407
+ function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
56369
56408
  i0.ɵɵelementStart(0, "div", 26)(1, "div", 17)(2, "div", 40)(3, "div")(4, "p", 41);
56370
56409
  i0.ɵɵtext(5);
56371
56410
  i0.ɵɵelementEnd();
56372
56411
  i0.ɵɵelementStart(6, "p", 42);
56373
56412
  i0.ɵɵtext(7);
56374
56413
  i0.ɵɵelementEnd()();
56375
- i0.ɵɵconditionalCreate(8, InitialTargetSettingComponent_Conditional_32_Conditional_8_Template, 2, 1, "button", 43);
56414
+ i0.ɵɵconditionalCreate(8, InitialTargetSettingComponent_Conditional_33_Conditional_8_Template, 2, 1, "button", 43);
56376
56415
  i0.ɵɵelementEnd();
56377
- i0.ɵɵelementStart(9, "div", 44)(10, "div", 45)(11, "span", 46);
56378
- i0.ɵɵtext(12);
56379
- i0.ɵɵelementEnd()();
56380
- i0.ɵɵelementStart(13, "div", 47)(14, "div")(15, "p", 41);
56381
- i0.ɵɵtext(16, " Increase Amount ");
56416
+ i0.ɵɵelementStart(9, "div", 44)(10, "div", 45);
56417
+ i0.ɵɵelement(11, "div", 46);
56418
+ i0.ɵɵelementStart(12, "span", 47);
56419
+ i0.ɵɵtext(13);
56382
56420
  i0.ɵɵelementEnd();
56383
- i0.ɵɵelementStart(17, "p", 48);
56384
- i0.ɵɵtext(18);
56421
+ i0.ɵɵelement(14, "div", 46);
56422
+ i0.ɵɵelementEnd();
56423
+ i0.ɵɵelementStart(15, "div", 48)(16, "div")(17, "p", 41);
56424
+ i0.ɵɵtext(18, " Increase Amount ");
56425
+ i0.ɵɵelementEnd();
56426
+ i0.ɵɵelementStart(19, "p", 49);
56427
+ i0.ɵɵtext(20);
56385
56428
  i0.ɵɵelementEnd()();
56386
- i0.ɵɵelementStart(19, "div")(20, "p", 41);
56387
- i0.ɵɵtext(21, " % Growth ");
56429
+ i0.ɵɵelementStart(21, "div")(22, "p", 41);
56430
+ i0.ɵɵtext(23, " % Growth ");
56388
56431
  i0.ɵɵelementEnd();
56389
- i0.ɵɵelementStart(22, "p", 48);
56390
- i0.ɵɵtext(23);
56432
+ i0.ɵɵelementStart(24, "p", 49);
56433
+ i0.ɵɵtext(25);
56391
56434
  i0.ɵɵelementEnd()()()();
56392
- i0.ɵɵconditionalCreate(24, InitialTargetSettingComponent_Conditional_32_Conditional_24_Template, 15, 10, "div", 44);
56435
+ i0.ɵɵconditionalCreate(26, InitialTargetSettingComponent_Conditional_33_Conditional_26_Template, 21, 13, "div", 44);
56393
56436
  i0.ɵɵelementEnd()();
56394
56437
  } if (rf & 2) {
56395
56438
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56404,12 +56447,14 @@ function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf
56404
56447
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.displayedTargetRevenue()), " ");
56405
56448
  i0.ɵɵadvance();
56406
56449
  i0.ɵɵconditional(ctx_r0.calculationState() === "results" ? 8 : -1);
56450
+ i0.ɵɵadvance(3);
56451
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56407
56452
  i0.ɵɵadvance();
56408
- i0.ɵɵproperty("ngClass", ctx_r0.calculatedDividerClasses());
56409
- i0.ɵɵadvance(2);
56410
56453
  i0.ɵɵproperty("ngClass", ctx_r0.dividerLabelClasses());
56411
56454
  i0.ɵɵadvance();
56412
56455
  i0.ɵɵtextInterpolate1(" vs. ", ctx_r0.priorYear(), " ");
56456
+ i0.ɵɵadvance();
56457
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56413
56458
  i0.ɵɵadvance(3);
56414
56459
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56415
56460
  i0.ɵɵadvance(2);
@@ -56423,15 +56468,15 @@ function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf
56423
56468
  i0.ɵɵadvance();
56424
56469
  i0.ɵɵtextInterpolate1(" +", ctx_r0.formatPercentage(ctx_r0.percentageIncrease(), 1), " ");
56425
56470
  i0.ɵɵadvance();
56426
- i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 24 : -1);
56471
+ i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 26 : -1);
56427
56472
  } }
56428
- function InitialTargetSettingComponent_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
56473
+ function InitialTargetSettingComponent_Conditional_34_Conditional_4_Template(rf, ctx) { if (rf & 1) {
56429
56474
  i0.ɵɵelement(0, "symphiq-area-chart", 22);
56430
56475
  } if (rf & 2) {
56431
56476
  const ctx_r0 = i0.ɵɵnextContext(2);
56432
56477
  i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "320px");
56433
56478
  } }
56434
- function InitialTargetSettingComponent_Conditional_33_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56479
+ function InitialTargetSettingComponent_Conditional_34_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56435
56480
  i0.ɵɵelementStart(0, "div", 23)(1, "p", 39);
56436
56481
  i0.ɵɵtext(2, " No revenue data available ");
56437
56482
  i0.ɵɵelementEnd()();
@@ -56440,12 +56485,12 @@ function InitialTargetSettingComponent_Conditional_33_Conditional_5_Template(rf,
56440
56485
  i0.ɵɵadvance();
56441
56486
  i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
56442
56487
  } }
56443
- function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
56488
+ function InitialTargetSettingComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
56444
56489
  i0.ɵɵelementStart(0, "div", 27)(1, "p", 20);
56445
56490
  i0.ɵɵtext(2, " Year-over-Year Revenue Trend ");
56446
56491
  i0.ɵɵelementEnd();
56447
56492
  i0.ɵɵelementStart(3, "div", 21);
56448
- i0.ɵɵconditionalCreate(4, InitialTargetSettingComponent_Conditional_33_Conditional_4_Template, 1, 5, "symphiq-area-chart", 22)(5, InitialTargetSettingComponent_Conditional_33_Conditional_5_Template, 3, 1, "div", 23);
56493
+ i0.ɵɵconditionalCreate(4, InitialTargetSettingComponent_Conditional_34_Conditional_4_Template, 1, 5, "symphiq-area-chart", 22)(5, InitialTargetSettingComponent_Conditional_34_Conditional_5_Template, 3, 1, "div", 23);
56449
56494
  i0.ɵɵelementEnd()();
56450
56495
  } if (rf & 2) {
56451
56496
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56456,14 +56501,14 @@ function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf
56456
56501
  i0.ɵɵadvance();
56457
56502
  i0.ɵɵconditional(ctx_r0.revenueChartData() ? 4 : 5);
56458
56503
  } }
56459
- function InitialTargetSettingComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
56460
- i0.ɵɵelementStart(0, "div", 3)(1, "div", 50)(2, "h2", 51);
56504
+ function InitialTargetSettingComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
56505
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 55)(2, "h2", 56);
56461
56506
  i0.ɵɵtext(3, " Contributing Metrics ");
56462
56507
  i0.ɵɵelementEnd();
56463
56508
  i0.ɵɵelementStart(4, "p", 39);
56464
56509
  i0.ɵɵtext(5);
56465
56510
  i0.ɵɵelementEnd()();
56466
- i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 52);
56511
+ i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 57);
56467
56512
  i0.ɵɵelementEnd();
56468
56513
  } if (rf & 2) {
56469
56514
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56535,16 +56580,33 @@ class InitialTargetSettingComponent {
56535
56580
  }, ...(ngDevMode ? [{ debugName: "percentageIncrease" }] : []));
56536
56581
  this.displayedMetricCalculations = computed(() => {
56537
56582
  const response = this.storedResponse();
56583
+ const pacingData = this.pacingMetrics();
56584
+ console.group('[PACING] displayedMetricCalculations computed');
56585
+ console.log('[PACING] storedResponse exists:', !!response);
56586
+ console.log('[PACING] pacingMetrics exists:', !!pacingData);
56587
+ if (pacingData) {
56588
+ console.log('[PACING] pacingMetrics summary:', {
56589
+ soFarMetricValuesCount: pacingData.soFarMetricValues?.length ?? 0,
56590
+ soFarMetrics: pacingData.soFarMetricValues?.map(m => ({ metric: m.metric, value: m.value })),
56591
+ projectedMetricValuesCount: pacingData.projectedMetricValues?.length ?? 0,
56592
+ lastYearMetricValuesMonthlyCount: pacingData.lastYearMetricValuesMonthly?.length ?? 0,
56593
+ lastYearUniqueMetrics: [...new Set(pacingData.lastYearMetricValuesMonthly?.map(m => m.metric))]
56594
+ });
56595
+ }
56538
56596
  if (!response) {
56597
+ console.log('[PACING] No storedResponse - returning empty array');
56598
+ console.groupEnd();
56539
56599
  return [];
56540
56600
  }
56541
56601
  const results = [];
56542
56602
  if (response.funnelMetricValues) {
56603
+ console.log('[PACING] Processing funnelMetricValues:', response.funnelMetricValues.length);
56543
56604
  response.funnelMetricValues.forEach((metricValue) => {
56544
56605
  const metric = metricValue.metric;
56545
56606
  const funnelMetric = this.funnelMetrics().find(fm => fm.funnelMetric === metric && fm.funnelMetric === fm.relatedMetric);
56546
56607
  const currentValue = sumMetricFromUiData(this.mainUiData(), metric, 'priorYear');
56547
56608
  const { targetValue, percentageIncrease } = this.parseMetricValue(metricValue.value);
56609
+ console.log(`[PACING] Stage metric ${metric}:`, { currentValue, targetValue, percentageIncrease, funnelInd: funnelMetric?.funnelInd });
56548
56610
  results.push({
56549
56611
  metric,
56550
56612
  funnelMetric: metric,
@@ -56559,6 +56621,7 @@ class InitialTargetSettingComponent {
56559
56621
  });
56560
56622
  }
56561
56623
  if (response.relatedMetricTargets) {
56624
+ console.log('[PACING] Processing relatedMetricTargets:', response.relatedMetricTargets.length);
56562
56625
  response.relatedMetricTargets.forEach((metricValue) => {
56563
56626
  const metric = metricValue.metric;
56564
56627
  const funnelMetric = this.funnelMetrics().find(fm => fm.relatedMetric === metric);
@@ -56577,6 +56640,10 @@ class InitialTargetSettingComponent {
56577
56640
  });
56578
56641
  });
56579
56642
  }
56643
+ console.log('[PACING] Final results count:', results.length);
56644
+ console.log('[PACING] Stage metrics:', results.filter(r => r.isFunnelStage).map(r => r.metric));
56645
+ console.log('[PACING] Related metrics:', results.filter(r => !r.isFunnelStage).map(r => r.metric));
56646
+ console.groupEnd();
56580
56647
  return results;
56581
56648
  }, ...(ngDevMode ? [{ debugName: "displayedMetricCalculations" }] : []));
56582
56649
  this.displayedTargetRevenue = computed(() => {
@@ -56643,6 +56710,10 @@ class InitialTargetSettingComponent {
56643
56710
  }, ...(ngDevMode ? [{ debugName: "revenueChartData" }] : []));
56644
56711
  this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
56645
56712
  this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
56713
+ this.additionalGrowthTooltip = {
56714
+ title: 'Additional Growth Needed',
56715
+ markdown: 'This percentage represents the additional growth required beyond your current projected pace to reach your revenue target. It shows how much more improvement is needed in your funnel metrics to close the gap between your projected performance and your goal.'
56716
+ };
56646
56717
  effect(() => {
56647
56718
  const response = this.reverseCalculationResponse();
56648
56719
  if (response) {
@@ -56828,6 +56899,11 @@ class InitialTargetSettingComponent {
56828
56899
  ? 'border-t border-purple-500/20'
56829
56900
  : 'border-t border-purple-200';
56830
56901
  }
56902
+ dividerBorderClasses() {
56903
+ return this.viewMode() === ViewModeEnum.DARK
56904
+ ? 'bg-purple-500/20'
56905
+ : 'bg-purple-200';
56906
+ }
56831
56907
  chartTitleClasses() {
56832
56908
  return this.viewMode() === ViewModeEnum.DARK
56833
56909
  ? 'text-slate-200'
@@ -56898,6 +56974,11 @@ class InitialTargetSettingComponent {
56898
56974
  ? 'bg-slate-800/60 border-slate-600'
56899
56975
  : 'bg-slate-50 border-slate-300';
56900
56976
  }
56977
+ infoIconClasses() {
56978
+ return this.viewMode() === ViewModeEnum.DARK
56979
+ ? 'bg-slate-700/50 text-slate-400 hover:bg-slate-600/50 hover:text-slate-300'
56980
+ : 'bg-slate-100 text-slate-500 hover:bg-slate-200 hover:text-slate-700';
56981
+ }
56901
56982
  static { this.ɵfac = function InitialTargetSettingComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || InitialTargetSettingComponent)(); }; }
56902
56983
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: InitialTargetSettingComponent, selectors: [["symphiq-initial-target-setting"]], viewQuery: function InitialTargetSettingComponent_Query(rf, ctx) { if (rf & 1) {
56903
56984
  i0.ɵɵviewQuery(_c0$r, 5);
@@ -56906,46 +56987,48 @@ class InitialTargetSettingComponent {
56906
56987
  let _t;
56907
56988
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
56908
56989
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
56909
- } }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"], reverseCalculationResponse: [1, "reverseCalculationResponse"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 38, vars: 33, 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, "flex", "flex-col", "gap-8"], [1, "grid", "lg:grid-cols-2", "gap-8"], [1, "flex", "flex-col", "gap-4"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-4", "place-content-between"], [1, "flex", "items-center", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", 3, "ngClass"], ["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, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "form-area-collapse"], [1, "form-area-content"], [1, "space-y-6"], [1, "chart-in-column"], [1, "chart-in-column-content"], [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"], [1, "calculated-card-enter", "order-first", "lg:order-last"], [1, "calculated-card-content"], [1, "p-6", "rounded-xl", "border-2", "h-full", 3, "ngClass"], [1, "w-full"], [1, "metrics-section-enter"], [1, "metrics-section-content"], [3, "submitClick", "cancelClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText", "showCancelButton"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"], [1, "flex", "gap-2"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [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, "text-sm", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "ngClass"], [1, "relative", "pt-6", "mt-6", 3, "ngClass"], [1, "absolute", "top-0", "left-1/2", "-translate-x-1/2", "-translate-y-1/2"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-semibold", "whitespace-nowrap", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-2"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "click", "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) {
56910
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "h2", 4);
56911
- i0.ɵɵtext(3);
56990
+ } }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"], reverseCalculationResponse: [1, "reverseCalculationResponse"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 39, vars: 33, 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, "flex", "flex-col", "gap-8"], [1, "grid", "lg:grid-cols-2", "gap-8"], [1, "flex", "flex-col", "gap-4"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-4", "place-content-between"], [1, "flex", "items-center", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", 3, "ngClass"], ["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, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "form-area-collapse"], [1, "form-area-content"], [1, "space-y-6"], [1, "chart-in-column"], [1, "chart-in-column-content"], [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"], [1, "calculated-card-enter", "order-first", "lg:order-last"], [1, "calculated-card-content"], [1, "p-6", "rounded-xl", "border-2", "h-full", 3, "ngClass"], [1, "w-full"], [1, "metrics-section-enter"], [1, "metrics-section-content"], [3, "submitClick", "cancelClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText", "showCancelButton"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"], [1, "flex", "gap-2"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [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, "text-sm", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "ngClass"], [1, "relative", "pt-6", "mt-6"], [1, "absolute", "top-0", "left-0", "right-0", "flex", "items-center", "-translate-y-1/2"], [1, "flex-1", "h-px", 3, "ngClass"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-semibold", "whitespace-nowrap", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-2"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "click", "ngClass"], [1, "flex", "items-center", "gap-1", "mb-1"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "top", 1, "flex-shrink-0", "w-4", "h-4", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3"], ["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, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
56991
+ i0.ɵɵelementStart(0, "div", 2);
56992
+ i0.ɵɵelement(1, "symphiq-tooltip-container");
56993
+ i0.ɵɵelementStart(2, "div", 3)(3, "h2", 4);
56994
+ i0.ɵɵtext(4);
56912
56995
  i0.ɵɵelementEnd();
56913
- i0.ɵɵelementStart(4, "div", 5)(5, "div", 6)(6, "div", 7)(7, "div", 8)(8, "div", 9)(9, "div", 10);
56996
+ i0.ɵɵelementStart(5, "div", 5)(6, "div", 6)(7, "div", 7)(8, "div", 8)(9, "div", 9)(10, "div", 10);
56914
56997
  i0.ɵɵnamespaceSVG();
56915
- i0.ɵɵelementStart(10, "svg", 11);
56916
- i0.ɵɵelement(11, "path", 12);
56998
+ i0.ɵɵelementStart(11, "svg", 11);
56999
+ i0.ɵɵelement(12, "path", 12);
56917
57000
  i0.ɵɵelementEnd();
56918
57001
  i0.ɵɵnamespaceHTML();
56919
- i0.ɵɵelementStart(12, "div")(13, "p", 13);
56920
- i0.ɵɵtext(14);
57002
+ i0.ɵɵelementStart(13, "div")(14, "p", 13);
57003
+ i0.ɵɵtext(15);
56921
57004
  i0.ɵɵelementEnd();
56922
- i0.ɵɵelementStart(15, "p", 14);
56923
- i0.ɵɵtext(16);
57005
+ i0.ɵɵelementStart(16, "p", 14);
57006
+ i0.ɵɵtext(17);
56924
57007
  i0.ɵɵelementEnd()()();
56925
- i0.ɵɵconditionalCreate(17, InitialTargetSettingComponent_Conditional_17_Template, 8, 4, "div", 10);
57008
+ i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 8, 4, "div", 10);
56926
57009
  i0.ɵɵelementEnd();
56927
- i0.ɵɵelementStart(18, "div", 15)(19, "div", 16)(20, "div", 17);
56928
- i0.ɵɵconditionalCreate(21, InitialTargetSettingComponent_Conditional_21_Template, 7, 3);
57010
+ i0.ɵɵelementStart(19, "div", 15)(20, "div", 16)(21, "div", 17);
57011
+ i0.ɵɵconditionalCreate(22, InitialTargetSettingComponent_Conditional_22_Template, 7, 3);
56929
57012
  i0.ɵɵelementEnd()()()();
56930
- i0.ɵɵelementStart(22, "div", 18)(23, "div", 19)(24, "div")(25, "p", 20);
56931
- i0.ɵɵtext(26, " Year-over-Year Revenue Trend ");
57013
+ i0.ɵɵelementStart(23, "div", 18)(24, "div", 19)(25, "div")(26, "p", 20);
57014
+ i0.ɵɵtext(27, " Year-over-Year Revenue Trend ");
56932
57015
  i0.ɵɵelementEnd();
56933
- i0.ɵɵelementStart(27, "div", 21);
56934
- i0.ɵɵconditionalCreate(28, InitialTargetSettingComponent_Conditional_28_Template, 1, 5, "symphiq-area-chart", 22)(29, InitialTargetSettingComponent_Conditional_29_Template, 3, 1, "div", 23);
57016
+ i0.ɵɵelementStart(28, "div", 21);
57017
+ i0.ɵɵconditionalCreate(29, InitialTargetSettingComponent_Conditional_29_Template, 1, 5, "symphiq-area-chart", 22)(30, InitialTargetSettingComponent_Conditional_30_Template, 3, 1, "div", 23);
56935
57018
  i0.ɵɵelementEnd()()()()();
56936
- i0.ɵɵelementStart(30, "div", 24)(31, "div", 25);
56937
- i0.ɵɵconditionalCreate(32, InitialTargetSettingComponent_Conditional_32_Template, 25, 16, "div", 26);
57019
+ i0.ɵɵelementStart(31, "div", 24)(32, "div", 25);
57020
+ i0.ɵɵconditionalCreate(33, InitialTargetSettingComponent_Conditional_33_Template, 27, 17, "div", 26);
56938
57021
  i0.ɵɵelementEnd()()();
56939
- i0.ɵɵconditionalCreate(33, InitialTargetSettingComponent_Conditional_33_Template, 6, 3, "div", 27);
57022
+ i0.ɵɵconditionalCreate(34, InitialTargetSettingComponent_Conditional_34_Template, 6, 3, "div", 27);
56940
57023
  i0.ɵɵelementEnd()();
56941
- i0.ɵɵelementStart(34, "div", 28)(35, "div", 29);
56942
- i0.ɵɵconditionalCreate(36, InitialTargetSettingComponent_Conditional_36_Template, 7, 7, "div", 3);
57024
+ i0.ɵɵelementStart(35, "div", 28)(36, "div", 29);
57025
+ i0.ɵɵconditionalCreate(37, InitialTargetSettingComponent_Conditional_37_Template, 7, 7, "div", 3);
56943
57026
  i0.ɵɵelementEnd()();
56944
- i0.ɵɵelementStart(37, "symphiq-sticky-submit-bar", 30);
56945
- i0.ɵɵlistener("submitClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_submitClick_37_listener() { return ctx.handleSubmitClick(); })("cancelClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_cancelClick_37_listener() { return ctx.handleCancel(); });
57027
+ i0.ɵɵelementStart(38, "symphiq-sticky-submit-bar", 30);
57028
+ i0.ɵɵlistener("submitClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_submitClick_38_listener() { return ctx.handleSubmitClick(); })("cancelClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_cancelClick_38_listener() { return ctx.handleCancel(); });
56946
57029
  i0.ɵɵelementEnd()();
56947
57030
  } if (rf & 2) {
56948
- i0.ɵɵadvance();
57031
+ i0.ɵɵadvance(2);
56949
57032
  i0.ɵɵproperty("ngClass", ctx.sectionCardClasses());
56950
57033
  i0.ɵɵadvance();
56951
57034
  i0.ɵɵproperty("ngClass", ctx.sectionTitleClasses());
@@ -56966,11 +57049,11 @@ class InitialTargetSettingComponent {
56966
57049
  i0.ɵɵadvance();
56967
57050
  i0.ɵɵtextInterpolate1(" ", ctx.formatCurrency(ctx.priorYearRevenue()), " ");
56968
57051
  i0.ɵɵadvance();
56969
- i0.ɵɵconditional(ctx.currentPaceProjection() > 0 ? 17 : -1);
57052
+ i0.ɵɵconditional(ctx.currentPaceProjection() > 0 ? 18 : -1);
56970
57053
  i0.ɵɵadvance();
56971
57054
  i0.ɵɵclassProp("form-area-collapse-hidden", ctx.calculationState() === "results");
56972
57055
  i0.ɵɵadvance(3);
56973
- i0.ɵɵconditional(ctx.calculationState() !== "results" ? 21 : -1);
57056
+ i0.ɵɵconditional(ctx.calculationState() !== "results" ? 22 : -1);
56974
57057
  i0.ɵɵadvance();
56975
57058
  i0.ɵɵclassProp("chart-in-column-active", ctx.calculationState() === "results");
56976
57059
  i0.ɵɵadvance(3);
@@ -56978,22 +57061,24 @@ class InitialTargetSettingComponent {
56978
57061
  i0.ɵɵadvance(2);
56979
57062
  i0.ɵɵproperty("ngClass", ctx.chartContainerClasses());
56980
57063
  i0.ɵɵadvance();
56981
- i0.ɵɵconditional(ctx.revenueChartData() ? 28 : 29);
57064
+ i0.ɵɵconditional(ctx.revenueChartData() ? 29 : 30);
56982
57065
  i0.ɵɵadvance(2);
56983
57066
  i0.ɵɵclassProp("calculated-card-enter-active", ctx.calculatedRevenue() > 0);
56984
57067
  i0.ɵɵadvance(2);
56985
- i0.ɵɵconditional(ctx.calculatedRevenue() > 0 ? 32 : -1);
57068
+ i0.ɵɵconditional(ctx.calculatedRevenue() > 0 ? 33 : -1);
56986
57069
  i0.ɵɵadvance();
56987
- i0.ɵɵconditional(ctx.calculationState() !== "results" ? 33 : -1);
57070
+ i0.ɵɵconditional(ctx.calculationState() !== "results" ? 34 : -1);
56988
57071
  i0.ɵɵadvance();
56989
57072
  i0.ɵɵclassProp("metrics-section-enter-active", ctx.showMetricsVisualization());
56990
57073
  i0.ɵɵadvance(2);
56991
- i0.ɵɵconditional(ctx.showMetricsVisualization() ? 36 : -1);
57074
+ i0.ɵɵconditional(ctx.showMetricsVisualization() ? 37 : -1);
56992
57075
  i0.ɵɵadvance();
56993
57076
  i0.ɵɵproperty("viewMode", ctx.viewMode())("isValid", ctx.isValid())("isSubmitting", ctx.isCalculating())("validationMessage", ctx.validationMessage())("buttonText", ctx.submitButtonText())("showCancelButton", ctx.calculationState() === "input" && ctx.hasStoredResponse());
56994
57077
  } }, dependencies: [CommonModule, i1$1.NgClass, FormsModule, i2$1.DefaultValueAccessor, i2$1.NumberValueAccessor, i2$1.NgControlStatus, i2$1.MinValidator, i2$1.MaxValidator, i2$1.NgModel, FunnelMetricsVisualizationComponent,
56995
57078
  StickySubmitBarComponent,
56996
- AreaChartComponent], styles: [".calculated-card-enter[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease-out}.calculated-card-enter-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.calculated-card-content[_ngcontent-%COMP%]{overflow:hidden}.form-area-collapse[_ngcontent-%COMP%]{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.form-area-collapse-hidden[_ngcontent-%COMP%]{grid-template-rows:0fr}.form-area-content[_ngcontent-%COMP%]{overflow:hidden}.chart-section-collapse[_ngcontent-%COMP%]{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.chart-section-collapse-hidden[_ngcontent-%COMP%]{grid-template-rows:0fr}.chart-section-content[_ngcontent-%COMP%]{overflow:hidden}.chart-in-column[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.chart-in-column-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.chart-in-column-content[_ngcontent-%COMP%]{overflow:hidden}.metrics-section-enter[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s ease-out}.metrics-section-enter-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.metrics-section-content[_ngcontent-%COMP%]{overflow:hidden}"], changeDetection: 0 }); }
57079
+ AreaChartComponent,
57080
+ TooltipDirective,
57081
+ TooltipContainerComponent], styles: [".calculated-card-enter[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease-out}.calculated-card-enter-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.calculated-card-content[_ngcontent-%COMP%]{overflow:hidden}.form-area-collapse[_ngcontent-%COMP%]{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.form-area-collapse-hidden[_ngcontent-%COMP%]{grid-template-rows:0fr}.form-area-content[_ngcontent-%COMP%]{overflow:hidden}.chart-section-collapse[_ngcontent-%COMP%]{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.chart-section-collapse-hidden[_ngcontent-%COMP%]{grid-template-rows:0fr}.chart-section-content[_ngcontent-%COMP%]{overflow:hidden}.chart-in-column[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.chart-in-column-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.chart-in-column-content[_ngcontent-%COMP%]{overflow:hidden}.metrics-section-enter[_ngcontent-%COMP%]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s ease-out}.metrics-section-enter-active[_ngcontent-%COMP%]{grid-template-rows:1fr}.metrics-section-content[_ngcontent-%COMP%]{overflow:hidden}"], changeDetection: 0 }); }
56997
57082
  }
56998
57083
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(InitialTargetSettingComponent, [{
56999
57084
  type: Component,
@@ -57002,9 +57087,12 @@ class InitialTargetSettingComponent {
57002
57087
  FormsModule,
57003
57088
  FunnelMetricsVisualizationComponent,
57004
57089
  StickySubmitBarComponent,
57005
- AreaChartComponent
57090
+ AreaChartComponent,
57091
+ TooltipDirective,
57092
+ TooltipContainerComponent
57006
57093
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57007
57094
  <div class="space-y-8 pb-32">
57095
+ <symphiq-tooltip-container />
57008
57096
  <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
57009
57097
  <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
57010
57098
  Calculate Your {{ currentYear() }} Revenue Target
@@ -57156,11 +57244,13 @@ class InitialTargetSettingComponent {
57156
57244
  }
57157
57245
  </div>
57158
57246
 
57159
- <div class="relative pt-6 mt-6" [ngClass]="calculatedDividerClasses()">
57160
- <div class="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2">
57247
+ <div class="relative pt-6 mt-6">
57248
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
57249
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57161
57250
  <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
57162
57251
  vs. {{ priorYear() }}
57163
57252
  </span>
57253
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57164
57254
  </div>
57165
57255
  <div class="grid grid-cols-2 gap-4 pt-2">
57166
57256
  <div>
@@ -57183,11 +57273,13 @@ class InitialTargetSettingComponent {
57183
57273
  </div>
57184
57274
 
57185
57275
  @if (currentPaceProjection() > 0 && gapToClose().amount !== 0) {
57186
- <div class="relative pt-6 mt-6" [ngClass]="calculatedDividerClasses()">
57187
- <div class="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2">
57276
+ <div class="relative pt-6 mt-6">
57277
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
57278
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57188
57279
  <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
57189
57280
  {{ currentYear() }} YTD Gap
57190
57281
  </span>
57282
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57191
57283
  </div>
57192
57284
  <div class="grid grid-cols-2 gap-4 pt-2">
57193
57285
  <div>
@@ -57199,9 +57291,22 @@ class InitialTargetSettingComponent {
57199
57291
  </p>
57200
57292
  </div>
57201
57293
  <div>
57202
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
57203
- Additional Growth Needed
57204
- </p>
57294
+ <div class="flex items-center gap-1 mb-1">
57295
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
57296
+ Additional Growth Needed
57297
+ </p>
57298
+ <button
57299
+ type="button"
57300
+ [ngClass]="infoIconClasses()"
57301
+ class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
57302
+ [libSymphiqTooltip]="additionalGrowthTooltip"
57303
+ tooltipType="markdown"
57304
+ tooltipPosition="top">
57305
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57306
+ <path 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" />
57307
+ </svg>
57308
+ </button>
57309
+ </div>
57205
57310
  <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
57206
57311
  {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(gapToClose().percentage, 1) }}
57207
57312
  </p>
@@ -57285,7 +57390,7 @@ class InitialTargetSettingComponent {
57285
57390
  type: ViewChild,
57286
57391
  args: ['percentageInputRef']
57287
57392
  }], 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 }] }], reverseCalculationResponse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverseCalculationResponse", required: false }] }], targetsCreated: [{ type: i0.Output, args: ["targetsCreated"] }], calculateRevenueRequest: [{ type: i0.Output, args: ["calculateRevenueRequest"] }] }); })();
57288
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 396 }); })();
57393
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 418 }); })();
57289
57394
 
57290
57395
  function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
57291
57396
  i0.ɵɵelement(0, "div", 5);