@eric-emg/symphiq-components 1.2.209 → 1.2.210

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.
@@ -54808,13 +54808,23 @@ function getPacingDisplayInfo(pacingPercentage, status, isDark) {
54808
54808
  };
54809
54809
  }
54810
54810
  function calculateMetricPacing(metric) {
54811
+ console.group(`[PACING] calculateMetricPacing for ${metric.metric}`);
54812
+ console.log('[PACING] Input metric:', JSON.stringify(metric, null, 2));
54811
54813
  const currentValue = metric.currentValue || 0;
54812
54814
  const priorYtdValue = metric.priorYtdValue || 0;
54813
54815
  const targetValue = metric.targetValue;
54814
- const pacingPercentage = metric.pacingPercentage ||
54815
- (priorYtdValue > 0 ? ((currentValue - priorYtdValue) / priorYtdValue) * 100 : 0);
54816
+ console.log('[PACING] Extracted values:', { currentValue, priorYtdValue, targetValue });
54817
+ const calculatedPacingPct = priorYtdValue > 0 ? ((currentValue - priorYtdValue) / priorYtdValue) * 100 : 0;
54818
+ const pacingPercentage = metric.pacingPercentage || calculatedPacingPct;
54819
+ console.log('[PACING] Pacing calculation:', {
54820
+ 'metric.pacingPercentage (pre-calculated)': metric.pacingPercentage,
54821
+ 'calculatedPacingPct': calculatedPacingPct,
54822
+ 'final pacingPercentage': pacingPercentage
54823
+ });
54816
54824
  const projectedValue = metric.projectedValue || currentValue;
54817
54825
  const status = calculatePacingStatus(currentValue, priorYtdValue, targetValue);
54826
+ console.log('[PACING] Result:', { pacingPercentage, status, projectedValue });
54827
+ console.groupEnd();
54818
54828
  return {
54819
54829
  pacingPercentage,
54820
54830
  status,
@@ -54822,20 +54832,55 @@ function calculateMetricPacing(metric) {
54822
54832
  };
54823
54833
  }
54824
54834
  function extractMetricPacing(pacingResponse, metricEnum) {
54825
- if (!pacingResponse)
54835
+ console.group(`[PACING] extractMetricPacing for ${metricEnum}`);
54836
+ if (!pacingResponse) {
54837
+ console.log('[PACING] No pacingResponse provided - returning null');
54838
+ console.groupEnd();
54826
54839
  return null;
54840
+ }
54841
+ console.log('[PACING] pacingResponse structure:', {
54842
+ hasSoFarMetricValues: !!pacingResponse.soFarMetricValues,
54843
+ soFarMetricValuesCount: pacingResponse.soFarMetricValues?.length ?? 0,
54844
+ soFarMetrics: pacingResponse.soFarMetricValues?.map(m => m.metric),
54845
+ hasProjectedMetricValues: !!pacingResponse.projectedMetricValues,
54846
+ projectedMetricValuesCount: pacingResponse.projectedMetricValues?.length ?? 0,
54847
+ projectedMetrics: pacingResponse.projectedMetricValues?.map(m => m.metric),
54848
+ hasLastYearMetricValuesMonthly: !!pacingResponse.lastYearMetricValuesMonthly,
54849
+ lastYearMetricValuesMonthlyCount: pacingResponse.lastYearMetricValuesMonthly?.length ?? 0,
54850
+ lastYearMetrics: [...new Set(pacingResponse.lastYearMetricValuesMonthly?.map(m => m.metric))]
54851
+ });
54827
54852
  const soFarMetric = pacingResponse.soFarMetricValues?.find(m => m.metric === metricEnum);
54828
54853
  const projectedMetric = pacingResponse.projectedMetricValues?.find(m => m.metric === metricEnum);
54829
54854
  const lastYearMetrics = pacingResponse.lastYearMetricValuesMonthly?.filter(m => m.metric === metricEnum) || [];
54830
- if (!soFarMetric && !projectedMetric)
54855
+ console.log('[PACING] Found metrics for', metricEnum, ':', {
54856
+ soFarMetric: soFarMetric ? { metric: soFarMetric.metric, value: soFarMetric.value } : null,
54857
+ projectedMetric: projectedMetric ? { metric: projectedMetric.metric, value: projectedMetric.value } : null,
54858
+ lastYearMetricsCount: lastYearMetrics.length,
54859
+ lastYearMetricsValues: lastYearMetrics.map(m => ({ metric: m.metric, value: m.value }))
54860
+ });
54861
+ if (!soFarMetric && !projectedMetric) {
54862
+ console.log('[PACING] No soFarMetric and no projectedMetric found - returning null');
54863
+ console.groupEnd();
54831
54864
  return null;
54865
+ }
54832
54866
  const currentValue = soFarMetric?.value ? parseFloat(soFarMetric.value) : 0;
54833
54867
  const projectedValue = projectedMetric?.value ? parseFloat(projectedMetric.value) : 0;
54834
54868
  const priorYtdValue = lastYearMetrics.reduce((sum, m) => {
54835
54869
  return sum + (m.value ? parseFloat(m.value) : 0);
54836
54870
  }, 0);
54837
- const pacingPercentage = priorYtdValue > 0 ? ((currentValue - priorYtdValue) / priorYtdValue) * 100 : 0;
54838
- return {
54871
+ console.log('[PACING] Calculated values:', {
54872
+ currentValue,
54873
+ projectedValue,
54874
+ priorYtdValue,
54875
+ 'priorYtdValue === 0': priorYtdValue === 0
54876
+ });
54877
+ if (priorYtdValue === 0) {
54878
+ console.log('[PACING] priorYtdValue is 0 - returning null (no prior year data to compare)');
54879
+ console.groupEnd();
54880
+ return null;
54881
+ }
54882
+ const pacingPercentage = ((currentValue - priorYtdValue) / priorYtdValue) * 100;
54883
+ const result = {
54839
54884
  metric: metricEnum,
54840
54885
  currentValue,
54841
54886
  priorYtdValue,
@@ -54843,6 +54888,9 @@ function extractMetricPacing(pacingResponse, metricEnum) {
54843
54888
  pacingPercentage,
54844
54889
  ytdVariancePercent: pacingPercentage
54845
54890
  };
54891
+ console.log('[PACING] Returning PerformanceMetricInterface:', result);
54892
+ console.groupEnd();
54893
+ return result;
54846
54894
  }
54847
54895
 
54848
54896
  class PacingStatusBadgeComponent {
@@ -55015,7 +55063,7 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template
55015
55063
  i0.ɵɵadvance();
55016
55064
  i0.ɵɵproperty("ngClass", ctx_r1.relatedPercentageBadgeClasses());
55017
55065
  i0.ɵɵadvance();
55018
- i0.ɵɵtextInterpolate1(" +", ctx_r1.formatPercentage(metric_r3.calc.percentageIncrease, 1), " ");
55066
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(metric_r3.calc.metric), "", ctx_r1.formatPercentage(metric_r3.calc.percentageIncrease, 1), " ");
55019
55067
  i0.ɵɵadvance();
55020
55068
  i0.ɵɵproperty("ngClass", metric_r3.pacingInfo ? "grid-cols-3" : "grid-cols-2");
55021
55069
  i0.ɵɵadvance(2);
@@ -55035,7 +55083,7 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template(rf, c
55035
55083
  i0.ɵɵtext(3, " Related Metrics ");
55036
55084
  i0.ɵɵelementEnd();
55037
55085
  i0.ɵɵelementStart(4, "div", 19);
55038
- i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template, 18, 14, "div", 20, _forTrack1$3);
55086
+ i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template, 18, 15, "div", 20, _forTrack1$3);
55039
55087
  i0.ɵɵelementEnd()();
55040
55088
  } if (rf & 2) {
55041
55089
  const stage_r1 = i0.ɵɵnextContext().$implicit;
@@ -55087,7 +55135,7 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55087
55135
  i0.ɵɵadvance();
55088
55136
  i0.ɵɵproperty("ngClass", ctx_r1.percentageBadgeClasses());
55089
55137
  i0.ɵɵadvance();
55090
- i0.ɵɵtextInterpolate1(" +", ctx_r1.formatPercentage(stage_r1.stageMetric.percentageIncrease, 1), " ");
55138
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(stage_r1.stageMetric.metric), "", ctx_r1.formatPercentage(stage_r1.stageMetric.percentageIncrease, 1), " ");
55091
55139
  i0.ɵɵadvance(3);
55092
55140
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55093
55141
  i0.ɵɵadvance();
@@ -55119,13 +55167,26 @@ class FunnelMetricsVisualizationComponent {
55119
55167
  this.funnelStages = computed(() => {
55120
55168
  const calcs = this.calculations();
55121
55169
  const pacingResponse = this.pacingMetrics();
55170
+ console.group('[PACING] funnelStages computed');
55171
+ console.log('[PACING] calculations count:', calcs.length);
55172
+ console.log('[PACING] calculations:', calcs.map(c => ({ metric: c.metric, isFunnelStage: c.isFunnelStage, funnelMetric: c.funnelMetric })));
55173
+ console.log('[PACING] pacingResponse exists:', !!pacingResponse);
55174
+ if (pacingResponse) {
55175
+ console.log('[PACING] pacingResponse raw:', JSON.stringify(pacingResponse, null, 2));
55176
+ }
55122
55177
  const grouped = new Map();
55123
55178
  const stageMetrics = calcs.filter(c => c.isFunnelStage);
55124
55179
  const relatedMetrics = calcs.filter(c => !c.isFunnelStage);
55180
+ console.log('[PACING] stageMetrics count:', stageMetrics.length);
55181
+ console.log('[PACING] stageMetrics:', stageMetrics.map(s => s.metric));
55182
+ console.log('[PACING] relatedMetrics count:', relatedMetrics.length);
55125
55183
  stageMetrics.forEach(stageMetric => {
55126
55184
  const related = relatedMetrics.filter(rm => rm.funnelMetric === stageMetric.metric);
55185
+ console.log(`[PACING] Processing stage: ${stageMetric.metric}`);
55127
55186
  const stagePacingMetric = extractMetricPacing(pacingResponse, stageMetric.metric);
55187
+ console.log(`[PACING] stagePacingMetric for ${stageMetric.metric}:`, stagePacingMetric);
55128
55188
  const stagePacingInfo = stagePacingMetric ? calculateMetricPacing(stagePacingMetric) : null;
55189
+ console.log(`[PACING] stagePacingInfo for ${stageMetric.metric}:`, stagePacingInfo);
55129
55190
  const relatedWithPacing = related.map(relMetric => {
55130
55191
  const relPacingMetric = extractMetricPacing(pacingResponse, relMetric.metric);
55131
55192
  const relPacingInfo = relPacingMetric ? calculateMetricPacing(relPacingMetric) : null;
@@ -55137,11 +55198,18 @@ class FunnelMetricsVisualizationComponent {
55137
55198
  pacingInfo: stagePacingInfo
55138
55199
  });
55139
55200
  });
55140
- return Array.from(grouped.values()).sort((a, b) => {
55201
+ const result = Array.from(grouped.values()).sort((a, b) => {
55141
55202
  const aInd = a.stageMetric.funnelInd ?? 999;
55142
55203
  const bInd = b.stageMetric.funnelInd ?? 999;
55143
55204
  return aInd - bInd;
55144
55205
  });
55206
+ console.log('[PACING] Final funnelStages result:', result.map(r => ({
55207
+ stage: r.stageMetric.metric,
55208
+ hasPacingInfo: !!r.pacingInfo,
55209
+ pacingPercentage: r.pacingInfo?.pacingPercentage
55210
+ })));
55211
+ console.groupEnd();
55212
+ return result;
55145
55213
  }, ...(ngDevMode ? [{ debugName: "funnelStages" }] : []));
55146
55214
  }
55147
55215
  stageCardClasses() {
@@ -55242,12 +55310,15 @@ class FunnelMetricsVisualizationComponent {
55242
55310
  getMarkdownTooltipContent(markdown, title) {
55243
55311
  return { title, markdown };
55244
55312
  }
55313
+ getGrowthSign(metric) {
55314
+ return MetricEnumUtil.increaseBad(metric) ? '-' : '+';
55315
+ }
55245
55316
  static { this.ɵfac = function FunnelMetricsVisualizationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FunnelMetricsVisualizationComponent)(); }; }
55246
55317
  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
55318
  i0.ɵɵelementStart(0, "div", 0);
55248
55319
  i0.ɵɵelement(1, "symphiq-tooltip-container");
55249
55320
  i0.ɵɵelementStart(2, "div", 1);
55250
- i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 24, 17, "div", 2, _forTrack0$i);
55321
+ i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 24, 18, "div", 2, _forTrack0$i);
55251
55322
  i0.ɵɵelementEnd()();
55252
55323
  } if (rf & 2) {
55253
55324
  i0.ɵɵadvance(3);
@@ -55261,140 +55332,140 @@ class FunnelMetricsVisualizationComponent {
55261
55332
  standalone: true,
55262
55333
  imports: [CommonModule, PacingStatusBadgeComponent, TooltipDirective, TooltipContainerComponent],
55263
55334
  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>
55335
+ template: `
55336
+ <div class="space-y-6">
55337
+ <symphiq-tooltip-container />
55338
+ <div class="space-y-8">
55339
+ @for (stage of funnelStages(); track stage.stageMetric.metric) {
55340
+ <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55341
+ <div class="flex items-start justify-between mb-4">
55342
+ <div class="flex-1">
55343
+ <div class="flex items-center gap-2 mb-1">
55344
+ <h3 [ngClass]="stageTitleClasses()" class="text-lg font-bold leading-tight m-0">
55345
+ {{ getMetricTitle(stage.stageMetric) }}
55346
+ </h3>
55347
+ @if (stage.stageMetric.description) {
55348
+ <button
55349
+ type="button"
55350
+ [ngClass]="infoIconClasses()"
55351
+ class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55352
+ [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55353
+ tooltipType="markdown"
55354
+ tooltipPosition="right">
55355
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55356
+ <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" />
55357
+ </svg>
55358
+ </button>
55359
+ }
55360
+ </div>
55361
+ </div>
55362
+ <div class="flex items-center gap-3">
55363
+ @if (stage.pacingInfo) {
55364
+ <symphiq-pacing-status-badge
55365
+ [viewMode]="viewMode()"
55366
+ [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55367
+ [status]="stage.pacingInfo.status"
55368
+ />
55369
+ }
55370
+ <div [ngClass]="percentageBadgeClasses()" class="px-4 py-2 rounded-lg font-bold text-sm">
55371
+ {{ getGrowthSign(stage.stageMetric.metric) }}{{ formatPercentage(stage.stageMetric.percentageIncrease, 1) }}
55372
+ </div>
55373
+ </div>
55374
+ </div>
55375
+
55376
+ <div class="grid grid-cols-3 gap-4 mb-4">
55377
+ <div>
55378
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55379
+ {{ priorYear() }} Actual
55380
+ </p>
55381
+ <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55382
+ {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55383
+ </p>
55384
+ </div>
55385
+ @if (stage.pacingInfo) {
55386
+ <div>
55387
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55388
+ {{ currentYear() }} Projected
55389
+ </p>
55390
+ <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold">
55391
+ {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55392
+ </p>
55393
+ </div>
55394
+ }
55395
+ <div>
55396
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55397
+ {{ currentYear() }} Target
55398
+ </p>
55399
+ <p [ngClass]="targetValueClasses()" class="text-2xl font-bold">
55400
+ {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric) }}
55401
+ </p>
55402
+ </div>
55403
+ </div>
55404
+
55405
+ @if (stage.relatedMetrics.length > 0) {
55406
+ <div [ngClass]="dividerClasses()" class="my-4"></div>
55407
+
55408
+ <div class="space-y-2">
55409
+ <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55410
+ Related Metrics
55411
+ </p>
55412
+ <div class="grid gap-2">
55413
+ @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55414
+ <div [ngClass]="relatedMetricCardClasses()" class="p-3 rounded-lg">
55415
+ <div class="flex items-center justify-between mb-2">
55416
+ <div class="flex items-center gap-2 flex-1">
55417
+ <p [ngClass]="relatedMetricNameClasses()" class="text-sm font-semibold leading-tight">
55418
+ {{ getMetricTitle(metric.calc) }}
55419
+ </p>
55420
+ @if (metric.calc.description) {
55421
+ <button
55422
+ type="button"
55423
+ [ngClass]="infoIconClasses()"
55424
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55425
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55426
+ tooltipType="markdown"
55427
+ tooltipPosition="right">
55428
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55429
+ <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" />
55430
+ </svg>
55431
+ </button>
55432
+ }
55433
+ </div>
55434
+ <div class="flex items-center gap-2">
55435
+ @if (metric.pacingInfo) {
55436
+ <symphiq-pacing-status-badge
55437
+ [viewMode]="viewMode()"
55438
+ [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55439
+ [status]="metric.pacingInfo.status"
55440
+ />
55441
+ }
55442
+ <span [ngClass]="relatedPercentageBadgeClasses()" class="px-2 py-1 rounded text-xs font-bold">
55443
+ {{ getGrowthSign(metric.calc.metric) }}{{ formatPercentage(metric.calc.percentageIncrease, 1) }}
55444
+ </span>
55445
+ </div>
55446
+ </div>
55447
+ <div class="grid gap-2 text-xs" [ngClass]="metric.pacingInfo ? 'grid-cols-3' : 'grid-cols-2'">
55448
+ <div>
55449
+ <p [ngClass]="relatedLabelClasses()">{{ priorYear() }}: {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}</p>
55450
+ </div>
55451
+ @if (metric.pacingInfo) {
55452
+ <div>
55453
+ <p [ngClass]="relatedLabelClasses()">Proj: {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}</p>
55454
+ </div>
55455
+ }
55456
+ <div>
55457
+ <p [ngClass]="relatedLabelClasses()">Target: {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric) }}</p>
55458
+ </div>
55459
+ </div>
55460
+ </div>
55461
+ }
55462
+ </div>
55463
+ </div>
55464
+ }
55465
+ </div>
55466
+ }
55467
+ </div>
55468
+ </div>
55398
55469
  `
55399
55470
  }]
55400
55471
  }], 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 +56297,7 @@ var areaChart_component = /*#__PURE__*/Object.freeze({
56226
56297
 
56227
56298
  const _c0$r = ["absoluteInputRef"];
56228
56299
  const _c1$b = ["percentageInputRef"];
56229
- function InitialTargetSettingComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
56300
+ function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
56230
56301
  i0.ɵɵelementStart(0, "div", 10);
56231
56302
  i0.ɵɵnamespaceSVG();
56232
56303
  i0.ɵɵelementStart(1, "svg", 11);
@@ -56250,14 +56321,14 @@ function InitialTargetSettingComponent_Conditional_17_Template(rf, ctx) { if (rf
56250
56321
  i0.ɵɵadvance();
56251
56322
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.currentPaceProjection()), " ");
56252
56323
  } }
56253
- function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56324
+ function InitialTargetSettingComponent_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56254
56325
  const _r3 = i0.ɵɵgetCurrentView();
56255
56326
  i0.ɵɵelementStart(0, "div", 34)(1, "span", 35);
56256
56327
  i0.ɵɵtext(2, " $ ");
56257
56328
  i0.ɵɵelementEnd();
56258
56329
  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()); });
56330
+ 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); });
56331
+ 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
56332
  i0.ɵɵelementEnd()();
56262
56333
  } if (rf & 2) {
56263
56334
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -56267,11 +56338,11 @@ function InitialTargetSettingComponent_Conditional_21_Conditional_5_Template(rf,
56267
56338
  i0.ɵɵtwoWayProperty("ngModel", ctx_r0.absoluteInput);
56268
56339
  i0.ɵɵproperty("ngClass", ctx_r0.inputClasses());
56269
56340
  } }
56270
- function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template(rf, ctx) { if (rf & 1) {
56341
+ function InitialTargetSettingComponent_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
56271
56342
  const _r4 = i0.ɵɵgetCurrentView();
56272
56343
  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()); });
56344
+ 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); });
56345
+ 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
56346
  i0.ɵɵelementEnd();
56276
56347
  i0.ɵɵelementStart(3, "span", 38);
56277
56348
  i0.ɵɵtext(4, " % ");
@@ -56284,17 +56355,17 @@ function InitialTargetSettingComponent_Conditional_21_Conditional_6_Template(rf,
56284
56355
  i0.ɵɵadvance(2);
56285
56356
  i0.ɵɵproperty("ngClass", ctx_r0.inputSuffixClasses());
56286
56357
  } }
56287
- function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
56358
+ function InitialTargetSettingComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
56288
56359
  const _r2 = i0.ɵɵgetCurrentView();
56289
56360
  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")); });
56361
+ 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
56362
  i0.ɵɵtext(2, " Absolute Amount ");
56292
56363
  i0.ɵɵelementEnd();
56293
56364
  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")); });
56365
+ 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
56366
  i0.ɵɵtext(4, " % Increase ");
56296
56367
  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);
56368
+ 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
56369
  } if (rf & 2) {
56299
56370
  const ctx_r0 = i0.ɵɵnextContext();
56300
56371
  i0.ɵɵadvance();
@@ -56304,13 +56375,13 @@ function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf
56304
56375
  i0.ɵɵadvance(2);
56305
56376
  i0.ɵɵconditional(ctx_r0.inputMode() === "absolute" ? 5 : 6);
56306
56377
  } }
56307
- function InitialTargetSettingComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
56378
+ function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
56308
56379
  i0.ɵɵelement(0, "symphiq-area-chart", 22);
56309
56380
  } if (rf & 2) {
56310
56381
  const ctx_r0 = i0.ɵɵnextContext();
56311
56382
  i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "108px");
56312
56383
  } }
56313
- function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
56384
+ function InitialTargetSettingComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
56314
56385
  i0.ɵɵelementStart(0, "div", 23)(1, "p", 39);
56315
56386
  i0.ɵɵtext(2, " No revenue data available ");
56316
56387
  i0.ɵɵelementEnd()();
@@ -56319,77 +56390,96 @@ function InitialTargetSettingComponent_Conditional_29_Template(rf, ctx) { if (rf
56319
56390
  i0.ɵɵadvance();
56320
56391
  i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
56321
56392
  } }
56322
- function InitialTargetSettingComponent_Conditional_32_Conditional_8_Template(rf, ctx) { if (rf & 1) {
56393
+ function InitialTargetSettingComponent_Conditional_33_Conditional_8_Template(rf, ctx) { if (rf & 1) {
56323
56394
  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()); });
56395
+ i0.ɵɵelementStart(0, "button", 50);
56396
+ 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
56397
  i0.ɵɵtext(1, " Adjust Revenue Target ");
56327
56398
  i0.ɵɵelementEnd();
56328
56399
  } if (rf & 2) {
56329
56400
  const ctx_r0 = i0.ɵɵnextContext(2);
56330
56401
  i0.ɵɵproperty("ngClass", ctx_r0.secondaryButtonClasses());
56331
56402
  } }
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 ");
56403
+ function InitialTargetSettingComponent_Conditional_33_Conditional_26_Template(rf, ctx) { if (rf & 1) {
56404
+ i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
56405
+ i0.ɵɵelement(2, "div", 46);
56406
+ i0.ɵɵelementStart(3, "span", 47);
56407
+ i0.ɵɵtext(4);
56338
56408
  i0.ɵɵelementEnd();
56339
- i0.ɵɵelementStart(8, "p", 48);
56340
- i0.ɵɵtext(9);
56409
+ i0.ɵɵelement(5, "div", 46);
56410
+ i0.ɵɵelementEnd();
56411
+ i0.ɵɵelementStart(6, "div", 48)(7, "div")(8, "p", 41);
56412
+ i0.ɵɵtext(9, " Gap to Close ");
56413
+ i0.ɵɵelementEnd();
56414
+ i0.ɵɵelementStart(10, "p", 49);
56415
+ i0.ɵɵtext(11);
56341
56416
  i0.ɵɵelementEnd()();
56342
- i0.ɵɵelementStart(10, "div")(11, "p", 41);
56343
- i0.ɵɵtext(12, " Additional Growth Needed ");
56417
+ i0.ɵɵelementStart(12, "div")(13, "div", 51)(14, "p", 13);
56418
+ i0.ɵɵtext(15, " Additional Growth Needed ");
56344
56419
  i0.ɵɵelementEnd();
56345
- i0.ɵɵelementStart(13, "p", 48);
56346
- i0.ɵɵtext(14);
56420
+ i0.ɵɵelementStart(16, "button", 52);
56421
+ i0.ɵɵnamespaceSVG();
56422
+ i0.ɵɵelementStart(17, "svg", 53);
56423
+ i0.ɵɵelement(18, "path", 54);
56424
+ i0.ɵɵelementEnd()()();
56425
+ i0.ɵɵnamespaceHTML();
56426
+ i0.ɵɵelementStart(19, "p", 49);
56427
+ i0.ɵɵtext(20);
56347
56428
  i0.ɵɵelementEnd()()()();
56348
56429
  } if (rf & 2) {
56349
56430
  const ctx_r0 = i0.ɵɵnextContext(2);
56350
- i0.ɵɵproperty("ngClass", ctx_r0.calculatedDividerClasses());
56351
56431
  i0.ɵɵadvance(2);
56432
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56433
+ i0.ɵɵadvance();
56352
56434
  i0.ɵɵproperty("ngClass", ctx_r0.dividerLabelClasses());
56353
56435
  i0.ɵɵadvance();
56354
56436
  i0.ɵɵtextInterpolate1(" ", ctx_r0.currentYear(), " YTD Gap ");
56437
+ i0.ɵɵadvance();
56438
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56355
56439
  i0.ɵɵadvance(3);
56356
56440
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56357
56441
  i0.ɵɵadvance(2);
56358
56442
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedSecondaryClasses());
56359
56443
  i0.ɵɵadvance();
56360
56444
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.absValue(ctx_r0.gapToClose().amount)), " ");
56361
- i0.ɵɵadvance(2);
56445
+ i0.ɵɵadvance(3);
56362
56446
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56363
56447
  i0.ɵɵadvance(2);
56448
+ i0.ɵɵproperty("ngClass", ctx_r0.infoIconClasses())("libSymphiqTooltip", ctx_r0.additionalGrowthTooltip);
56449
+ i0.ɵɵadvance(3);
56364
56450
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedSecondaryClasses());
56365
56451
  i0.ɵɵadvance();
56366
56452
  i0.ɵɵtextInterpolate2(" ", ctx_r0.gapToClose().amount > 0 ? "+" : "", "", ctx_r0.formatPercentage(ctx_r0.gapToClose().percentage, 1), " ");
56367
56453
  } }
56368
- function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
56454
+ function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
56369
56455
  i0.ɵɵelementStart(0, "div", 26)(1, "div", 17)(2, "div", 40)(3, "div")(4, "p", 41);
56370
56456
  i0.ɵɵtext(5);
56371
56457
  i0.ɵɵelementEnd();
56372
56458
  i0.ɵɵelementStart(6, "p", 42);
56373
56459
  i0.ɵɵtext(7);
56374
56460
  i0.ɵɵelementEnd()();
56375
- i0.ɵɵconditionalCreate(8, InitialTargetSettingComponent_Conditional_32_Conditional_8_Template, 2, 1, "button", 43);
56461
+ i0.ɵɵconditionalCreate(8, InitialTargetSettingComponent_Conditional_33_Conditional_8_Template, 2, 1, "button", 43);
56376
56462
  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 ");
56463
+ i0.ɵɵelementStart(9, "div", 44)(10, "div", 45);
56464
+ i0.ɵɵelement(11, "div", 46);
56465
+ i0.ɵɵelementStart(12, "span", 47);
56466
+ i0.ɵɵtext(13);
56382
56467
  i0.ɵɵelementEnd();
56383
- i0.ɵɵelementStart(17, "p", 48);
56384
- i0.ɵɵtext(18);
56468
+ i0.ɵɵelement(14, "div", 46);
56469
+ i0.ɵɵelementEnd();
56470
+ i0.ɵɵelementStart(15, "div", 48)(16, "div")(17, "p", 41);
56471
+ i0.ɵɵtext(18, " Increase Amount ");
56472
+ i0.ɵɵelementEnd();
56473
+ i0.ɵɵelementStart(19, "p", 49);
56474
+ i0.ɵɵtext(20);
56385
56475
  i0.ɵɵelementEnd()();
56386
- i0.ɵɵelementStart(19, "div")(20, "p", 41);
56387
- i0.ɵɵtext(21, " % Growth ");
56476
+ i0.ɵɵelementStart(21, "div")(22, "p", 41);
56477
+ i0.ɵɵtext(23, " % Growth ");
56388
56478
  i0.ɵɵelementEnd();
56389
- i0.ɵɵelementStart(22, "p", 48);
56390
- i0.ɵɵtext(23);
56479
+ i0.ɵɵelementStart(24, "p", 49);
56480
+ i0.ɵɵtext(25);
56391
56481
  i0.ɵɵelementEnd()()()();
56392
- i0.ɵɵconditionalCreate(24, InitialTargetSettingComponent_Conditional_32_Conditional_24_Template, 15, 10, "div", 44);
56482
+ i0.ɵɵconditionalCreate(26, InitialTargetSettingComponent_Conditional_33_Conditional_26_Template, 21, 13, "div", 44);
56393
56483
  i0.ɵɵelementEnd()();
56394
56484
  } if (rf & 2) {
56395
56485
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56404,12 +56494,14 @@ function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf
56404
56494
  i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.displayedTargetRevenue()), " ");
56405
56495
  i0.ɵɵadvance();
56406
56496
  i0.ɵɵconditional(ctx_r0.calculationState() === "results" ? 8 : -1);
56497
+ i0.ɵɵadvance(3);
56498
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56407
56499
  i0.ɵɵadvance();
56408
- i0.ɵɵproperty("ngClass", ctx_r0.calculatedDividerClasses());
56409
- i0.ɵɵadvance(2);
56410
56500
  i0.ɵɵproperty("ngClass", ctx_r0.dividerLabelClasses());
56411
56501
  i0.ɵɵadvance();
56412
56502
  i0.ɵɵtextInterpolate1(" vs. ", ctx_r0.priorYear(), " ");
56503
+ i0.ɵɵadvance();
56504
+ i0.ɵɵproperty("ngClass", ctx_r0.dividerBorderClasses());
56413
56505
  i0.ɵɵadvance(3);
56414
56506
  i0.ɵɵproperty("ngClass", ctx_r0.calculatedLabelClasses());
56415
56507
  i0.ɵɵadvance(2);
@@ -56423,15 +56515,15 @@ function InitialTargetSettingComponent_Conditional_32_Template(rf, ctx) { if (rf
56423
56515
  i0.ɵɵadvance();
56424
56516
  i0.ɵɵtextInterpolate1(" +", ctx_r0.formatPercentage(ctx_r0.percentageIncrease(), 1), " ");
56425
56517
  i0.ɵɵadvance();
56426
- i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 24 : -1);
56518
+ i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 26 : -1);
56427
56519
  } }
56428
- function InitialTargetSettingComponent_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
56520
+ function InitialTargetSettingComponent_Conditional_34_Conditional_4_Template(rf, ctx) { if (rf & 1) {
56429
56521
  i0.ɵɵelement(0, "symphiq-area-chart", 22);
56430
56522
  } if (rf & 2) {
56431
56523
  const ctx_r0 = i0.ɵɵnextContext(2);
56432
56524
  i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "320px");
56433
56525
  } }
56434
- function InitialTargetSettingComponent_Conditional_33_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56526
+ function InitialTargetSettingComponent_Conditional_34_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56435
56527
  i0.ɵɵelementStart(0, "div", 23)(1, "p", 39);
56436
56528
  i0.ɵɵtext(2, " No revenue data available ");
56437
56529
  i0.ɵɵelementEnd()();
@@ -56440,12 +56532,12 @@ function InitialTargetSettingComponent_Conditional_33_Conditional_5_Template(rf,
56440
56532
  i0.ɵɵadvance();
56441
56533
  i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
56442
56534
  } }
56443
- function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
56535
+ function InitialTargetSettingComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
56444
56536
  i0.ɵɵelementStart(0, "div", 27)(1, "p", 20);
56445
56537
  i0.ɵɵtext(2, " Year-over-Year Revenue Trend ");
56446
56538
  i0.ɵɵelementEnd();
56447
56539
  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);
56540
+ 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
56541
  i0.ɵɵelementEnd()();
56450
56542
  } if (rf & 2) {
56451
56543
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56456,14 +56548,14 @@ function InitialTargetSettingComponent_Conditional_33_Template(rf, ctx) { if (rf
56456
56548
  i0.ɵɵadvance();
56457
56549
  i0.ɵɵconditional(ctx_r0.revenueChartData() ? 4 : 5);
56458
56550
  } }
56459
- function InitialTargetSettingComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
56460
- i0.ɵɵelementStart(0, "div", 3)(1, "div", 50)(2, "h2", 51);
56551
+ function InitialTargetSettingComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
56552
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 55)(2, "h2", 56);
56461
56553
  i0.ɵɵtext(3, " Contributing Metrics ");
56462
56554
  i0.ɵɵelementEnd();
56463
56555
  i0.ɵɵelementStart(4, "p", 39);
56464
56556
  i0.ɵɵtext(5);
56465
56557
  i0.ɵɵelementEnd()();
56466
- i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 52);
56558
+ i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 57);
56467
56559
  i0.ɵɵelementEnd();
56468
56560
  } if (rf & 2) {
56469
56561
  const ctx_r0 = i0.ɵɵnextContext();
@@ -56535,16 +56627,33 @@ class InitialTargetSettingComponent {
56535
56627
  }, ...(ngDevMode ? [{ debugName: "percentageIncrease" }] : []));
56536
56628
  this.displayedMetricCalculations = computed(() => {
56537
56629
  const response = this.storedResponse();
56630
+ const pacingData = this.pacingMetrics();
56631
+ console.group('[PACING] displayedMetricCalculations computed');
56632
+ console.log('[PACING] storedResponse exists:', !!response);
56633
+ console.log('[PACING] pacingMetrics exists:', !!pacingData);
56634
+ if (pacingData) {
56635
+ console.log('[PACING] pacingMetrics summary:', {
56636
+ soFarMetricValuesCount: pacingData.soFarMetricValues?.length ?? 0,
56637
+ soFarMetrics: pacingData.soFarMetricValues?.map(m => ({ metric: m.metric, value: m.value })),
56638
+ projectedMetricValuesCount: pacingData.projectedMetricValues?.length ?? 0,
56639
+ lastYearMetricValuesMonthlyCount: pacingData.lastYearMetricValuesMonthly?.length ?? 0,
56640
+ lastYearUniqueMetrics: [...new Set(pacingData.lastYearMetricValuesMonthly?.map(m => m.metric))]
56641
+ });
56642
+ }
56538
56643
  if (!response) {
56644
+ console.log('[PACING] No storedResponse - returning empty array');
56645
+ console.groupEnd();
56539
56646
  return [];
56540
56647
  }
56541
56648
  const results = [];
56542
56649
  if (response.funnelMetricValues) {
56650
+ console.log('[PACING] Processing funnelMetricValues:', response.funnelMetricValues.length);
56543
56651
  response.funnelMetricValues.forEach((metricValue) => {
56544
56652
  const metric = metricValue.metric;
56545
56653
  const funnelMetric = this.funnelMetrics().find(fm => fm.funnelMetric === metric && fm.funnelMetric === fm.relatedMetric);
56546
56654
  const currentValue = sumMetricFromUiData(this.mainUiData(), metric, 'priorYear');
56547
56655
  const { targetValue, percentageIncrease } = this.parseMetricValue(metricValue.value);
56656
+ console.log(`[PACING] Stage metric ${metric}:`, { currentValue, targetValue, percentageIncrease, funnelInd: funnelMetric?.funnelInd });
56548
56657
  results.push({
56549
56658
  metric,
56550
56659
  funnelMetric: metric,
@@ -56559,6 +56668,7 @@ class InitialTargetSettingComponent {
56559
56668
  });
56560
56669
  }
56561
56670
  if (response.relatedMetricTargets) {
56671
+ console.log('[PACING] Processing relatedMetricTargets:', response.relatedMetricTargets.length);
56562
56672
  response.relatedMetricTargets.forEach((metricValue) => {
56563
56673
  const metric = metricValue.metric;
56564
56674
  const funnelMetric = this.funnelMetrics().find(fm => fm.relatedMetric === metric);
@@ -56577,6 +56687,10 @@ class InitialTargetSettingComponent {
56577
56687
  });
56578
56688
  });
56579
56689
  }
56690
+ console.log('[PACING] Final results count:', results.length);
56691
+ console.log('[PACING] Stage metrics:', results.filter(r => r.isFunnelStage).map(r => r.metric));
56692
+ console.log('[PACING] Related metrics:', results.filter(r => !r.isFunnelStage).map(r => r.metric));
56693
+ console.groupEnd();
56580
56694
  return results;
56581
56695
  }, ...(ngDevMode ? [{ debugName: "displayedMetricCalculations" }] : []));
56582
56696
  this.displayedTargetRevenue = computed(() => {
@@ -56643,6 +56757,10 @@ class InitialTargetSettingComponent {
56643
56757
  }, ...(ngDevMode ? [{ debugName: "revenueChartData" }] : []));
56644
56758
  this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
56645
56759
  this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
56760
+ this.additionalGrowthTooltip = {
56761
+ title: 'Additional Growth Needed',
56762
+ 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.'
56763
+ };
56646
56764
  effect(() => {
56647
56765
  const response = this.reverseCalculationResponse();
56648
56766
  if (response) {
@@ -56828,6 +56946,11 @@ class InitialTargetSettingComponent {
56828
56946
  ? 'border-t border-purple-500/20'
56829
56947
  : 'border-t border-purple-200';
56830
56948
  }
56949
+ dividerBorderClasses() {
56950
+ return this.viewMode() === ViewModeEnum.DARK
56951
+ ? 'bg-purple-500/20'
56952
+ : 'bg-purple-200';
56953
+ }
56831
56954
  chartTitleClasses() {
56832
56955
  return this.viewMode() === ViewModeEnum.DARK
56833
56956
  ? 'text-slate-200'
@@ -56898,6 +57021,11 @@ class InitialTargetSettingComponent {
56898
57021
  ? 'bg-slate-800/60 border-slate-600'
56899
57022
  : 'bg-slate-50 border-slate-300';
56900
57023
  }
57024
+ infoIconClasses() {
57025
+ return this.viewMode() === ViewModeEnum.DARK
57026
+ ? 'bg-slate-700/50 text-slate-400 hover:bg-slate-600/50 hover:text-slate-300'
57027
+ : 'bg-slate-100 text-slate-500 hover:bg-slate-200 hover:text-slate-700';
57028
+ }
56901
57029
  static { this.ɵfac = function InitialTargetSettingComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || InitialTargetSettingComponent)(); }; }
56902
57030
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: InitialTargetSettingComponent, selectors: [["symphiq-initial-target-setting"]], viewQuery: function InitialTargetSettingComponent_Query(rf, ctx) { if (rf & 1) {
56903
57031
  i0.ɵɵviewQuery(_c0$r, 5);
@@ -56906,46 +57034,48 @@ class InitialTargetSettingComponent {
56906
57034
  let _t;
56907
57035
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
56908
57036
  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);
57037
+ } }, 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) {
57038
+ i0.ɵɵelementStart(0, "div", 2);
57039
+ i0.ɵɵelement(1, "symphiq-tooltip-container");
57040
+ i0.ɵɵelementStart(2, "div", 3)(3, "h2", 4);
57041
+ i0.ɵɵtext(4);
56912
57042
  i0.ɵɵelementEnd();
56913
- i0.ɵɵelementStart(4, "div", 5)(5, "div", 6)(6, "div", 7)(7, "div", 8)(8, "div", 9)(9, "div", 10);
57043
+ i0.ɵɵelementStart(5, "div", 5)(6, "div", 6)(7, "div", 7)(8, "div", 8)(9, "div", 9)(10, "div", 10);
56914
57044
  i0.ɵɵnamespaceSVG();
56915
- i0.ɵɵelementStart(10, "svg", 11);
56916
- i0.ɵɵelement(11, "path", 12);
57045
+ i0.ɵɵelementStart(11, "svg", 11);
57046
+ i0.ɵɵelement(12, "path", 12);
56917
57047
  i0.ɵɵelementEnd();
56918
57048
  i0.ɵɵnamespaceHTML();
56919
- i0.ɵɵelementStart(12, "div")(13, "p", 13);
56920
- i0.ɵɵtext(14);
57049
+ i0.ɵɵelementStart(13, "div")(14, "p", 13);
57050
+ i0.ɵɵtext(15);
56921
57051
  i0.ɵɵelementEnd();
56922
- i0.ɵɵelementStart(15, "p", 14);
56923
- i0.ɵɵtext(16);
57052
+ i0.ɵɵelementStart(16, "p", 14);
57053
+ i0.ɵɵtext(17);
56924
57054
  i0.ɵɵelementEnd()()();
56925
- i0.ɵɵconditionalCreate(17, InitialTargetSettingComponent_Conditional_17_Template, 8, 4, "div", 10);
57055
+ i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 8, 4, "div", 10);
56926
57056
  i0.ɵɵelementEnd();
56927
- i0.ɵɵelementStart(18, "div", 15)(19, "div", 16)(20, "div", 17);
56928
- i0.ɵɵconditionalCreate(21, InitialTargetSettingComponent_Conditional_21_Template, 7, 3);
57057
+ i0.ɵɵelementStart(19, "div", 15)(20, "div", 16)(21, "div", 17);
57058
+ i0.ɵɵconditionalCreate(22, InitialTargetSettingComponent_Conditional_22_Template, 7, 3);
56929
57059
  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 ");
57060
+ i0.ɵɵelementStart(23, "div", 18)(24, "div", 19)(25, "div")(26, "p", 20);
57061
+ i0.ɵɵtext(27, " Year-over-Year Revenue Trend ");
56932
57062
  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);
57063
+ i0.ɵɵelementStart(28, "div", 21);
57064
+ i0.ɵɵconditionalCreate(29, InitialTargetSettingComponent_Conditional_29_Template, 1, 5, "symphiq-area-chart", 22)(30, InitialTargetSettingComponent_Conditional_30_Template, 3, 1, "div", 23);
56935
57065
  i0.ɵɵelementEnd()()()()();
56936
- i0.ɵɵelementStart(30, "div", 24)(31, "div", 25);
56937
- i0.ɵɵconditionalCreate(32, InitialTargetSettingComponent_Conditional_32_Template, 25, 16, "div", 26);
57066
+ i0.ɵɵelementStart(31, "div", 24)(32, "div", 25);
57067
+ i0.ɵɵconditionalCreate(33, InitialTargetSettingComponent_Conditional_33_Template, 27, 17, "div", 26);
56938
57068
  i0.ɵɵelementEnd()()();
56939
- i0.ɵɵconditionalCreate(33, InitialTargetSettingComponent_Conditional_33_Template, 6, 3, "div", 27);
57069
+ i0.ɵɵconditionalCreate(34, InitialTargetSettingComponent_Conditional_34_Template, 6, 3, "div", 27);
56940
57070
  i0.ɵɵelementEnd()();
56941
- i0.ɵɵelementStart(34, "div", 28)(35, "div", 29);
56942
- i0.ɵɵconditionalCreate(36, InitialTargetSettingComponent_Conditional_36_Template, 7, 7, "div", 3);
57071
+ i0.ɵɵelementStart(35, "div", 28)(36, "div", 29);
57072
+ i0.ɵɵconditionalCreate(37, InitialTargetSettingComponent_Conditional_37_Template, 7, 7, "div", 3);
56943
57073
  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(); });
57074
+ i0.ɵɵelementStart(38, "symphiq-sticky-submit-bar", 30);
57075
+ 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
57076
  i0.ɵɵelementEnd()();
56947
57077
  } if (rf & 2) {
56948
- i0.ɵɵadvance();
57078
+ i0.ɵɵadvance(2);
56949
57079
  i0.ɵɵproperty("ngClass", ctx.sectionCardClasses());
56950
57080
  i0.ɵɵadvance();
56951
57081
  i0.ɵɵproperty("ngClass", ctx.sectionTitleClasses());
@@ -56966,11 +57096,11 @@ class InitialTargetSettingComponent {
56966
57096
  i0.ɵɵadvance();
56967
57097
  i0.ɵɵtextInterpolate1(" ", ctx.formatCurrency(ctx.priorYearRevenue()), " ");
56968
57098
  i0.ɵɵadvance();
56969
- i0.ɵɵconditional(ctx.currentPaceProjection() > 0 ? 17 : -1);
57099
+ i0.ɵɵconditional(ctx.currentPaceProjection() > 0 ? 18 : -1);
56970
57100
  i0.ɵɵadvance();
56971
57101
  i0.ɵɵclassProp("form-area-collapse-hidden", ctx.calculationState() === "results");
56972
57102
  i0.ɵɵadvance(3);
56973
- i0.ɵɵconditional(ctx.calculationState() !== "results" ? 21 : -1);
57103
+ i0.ɵɵconditional(ctx.calculationState() !== "results" ? 22 : -1);
56974
57104
  i0.ɵɵadvance();
56975
57105
  i0.ɵɵclassProp("chart-in-column-active", ctx.calculationState() === "results");
56976
57106
  i0.ɵɵadvance(3);
@@ -56978,22 +57108,24 @@ class InitialTargetSettingComponent {
56978
57108
  i0.ɵɵadvance(2);
56979
57109
  i0.ɵɵproperty("ngClass", ctx.chartContainerClasses());
56980
57110
  i0.ɵɵadvance();
56981
- i0.ɵɵconditional(ctx.revenueChartData() ? 28 : 29);
57111
+ i0.ɵɵconditional(ctx.revenueChartData() ? 29 : 30);
56982
57112
  i0.ɵɵadvance(2);
56983
57113
  i0.ɵɵclassProp("calculated-card-enter-active", ctx.calculatedRevenue() > 0);
56984
57114
  i0.ɵɵadvance(2);
56985
- i0.ɵɵconditional(ctx.calculatedRevenue() > 0 ? 32 : -1);
57115
+ i0.ɵɵconditional(ctx.calculatedRevenue() > 0 ? 33 : -1);
56986
57116
  i0.ɵɵadvance();
56987
- i0.ɵɵconditional(ctx.calculationState() !== "results" ? 33 : -1);
57117
+ i0.ɵɵconditional(ctx.calculationState() !== "results" ? 34 : -1);
56988
57118
  i0.ɵɵadvance();
56989
57119
  i0.ɵɵclassProp("metrics-section-enter-active", ctx.showMetricsVisualization());
56990
57120
  i0.ɵɵadvance(2);
56991
- i0.ɵɵconditional(ctx.showMetricsVisualization() ? 36 : -1);
57121
+ i0.ɵɵconditional(ctx.showMetricsVisualization() ? 37 : -1);
56992
57122
  i0.ɵɵadvance();
56993
57123
  i0.ɵɵproperty("viewMode", ctx.viewMode())("isValid", ctx.isValid())("isSubmitting", ctx.isCalculating())("validationMessage", ctx.validationMessage())("buttonText", ctx.submitButtonText())("showCancelButton", ctx.calculationState() === "input" && ctx.hasStoredResponse());
56994
57124
  } }, 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
57125
  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 }); }
57126
+ AreaChartComponent,
57127
+ TooltipDirective,
57128
+ 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
57129
  }
56998
57130
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(InitialTargetSettingComponent, [{
56999
57131
  type: Component,
@@ -57002,9 +57134,12 @@ class InitialTargetSettingComponent {
57002
57134
  FormsModule,
57003
57135
  FunnelMetricsVisualizationComponent,
57004
57136
  StickySubmitBarComponent,
57005
- AreaChartComponent
57137
+ AreaChartComponent,
57138
+ TooltipDirective,
57139
+ TooltipContainerComponent
57006
57140
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57007
57141
  <div class="space-y-8 pb-32">
57142
+ <symphiq-tooltip-container />
57008
57143
  <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
57009
57144
  <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
57010
57145
  Calculate Your {{ currentYear() }} Revenue Target
@@ -57156,11 +57291,13 @@ class InitialTargetSettingComponent {
57156
57291
  }
57157
57292
  </div>
57158
57293
 
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">
57294
+ <div class="relative pt-6 mt-6">
57295
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
57296
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57161
57297
  <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
57162
57298
  vs. {{ priorYear() }}
57163
57299
  </span>
57300
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57164
57301
  </div>
57165
57302
  <div class="grid grid-cols-2 gap-4 pt-2">
57166
57303
  <div>
@@ -57183,11 +57320,13 @@ class InitialTargetSettingComponent {
57183
57320
  </div>
57184
57321
 
57185
57322
  @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">
57323
+ <div class="relative pt-6 mt-6">
57324
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
57325
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57188
57326
  <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
57189
57327
  {{ currentYear() }} YTD Gap
57190
57328
  </span>
57329
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
57191
57330
  </div>
57192
57331
  <div class="grid grid-cols-2 gap-4 pt-2">
57193
57332
  <div>
@@ -57199,9 +57338,22 @@ class InitialTargetSettingComponent {
57199
57338
  </p>
57200
57339
  </div>
57201
57340
  <div>
57202
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
57203
- Additional Growth Needed
57204
- </p>
57341
+ <div class="flex items-center gap-1 mb-1">
57342
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
57343
+ Additional Growth Needed
57344
+ </p>
57345
+ <button
57346
+ type="button"
57347
+ [ngClass]="infoIconClasses()"
57348
+ class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
57349
+ [libSymphiqTooltip]="additionalGrowthTooltip"
57350
+ tooltipType="markdown"
57351
+ tooltipPosition="top">
57352
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57353
+ <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" />
57354
+ </svg>
57355
+ </button>
57356
+ </div>
57205
57357
  <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
57206
57358
  {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(gapToClose().percentage, 1) }}
57207
57359
  </p>
@@ -57285,7 +57437,7 @@ class InitialTargetSettingComponent {
57285
57437
  type: ViewChild,
57286
57438
  args: ['percentageInputRef']
57287
57439
  }], 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 }); })();
57440
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 418 }); })();
57289
57441
 
57290
57442
  function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
57291
57443
  i0.ɵɵelement(0, "div", 5);