@eric-emg/symphiq-components 1.2.224 → 1.2.226

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.
@@ -54722,6 +54722,16 @@ function formatPacingDisplay(pacingPercentage) {
54722
54722
  }
54723
54723
  return `${sign}${formatted}% behind`;
54724
54724
  }
54725
+ function formatPacingDisplayFullText(pacingPercentage, status) {
54726
+ const formatted = Math.abs(pacingPercentage).toFixed(1);
54727
+ if (status === 'ahead') {
54728
+ return `Pacing at ${formatted}% above target`;
54729
+ }
54730
+ if (status === 'on-pace') {
54731
+ return `Pacing on target`;
54732
+ }
54733
+ return `Pacing at ${formatted}% below target`;
54734
+ }
54725
54735
  function calculateGapToTarget(projectedValue, targetValue) {
54726
54736
  const amount = targetValue - projectedValue;
54727
54737
  const percentage = projectedValue > 0 ? (amount / projectedValue) * 100 : 0;
@@ -54789,6 +54799,8 @@ class PacingStatusBadgeComponent {
54789
54799
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
54790
54800
  this.pacingPercentage = input(0, ...(ngDevMode ? [{ debugName: "pacingPercentage" }] : []));
54791
54801
  this.status = input('on-pace', ...(ngDevMode ? [{ debugName: "status" }] : []));
54802
+ this.showAsFullText = input(false, ...(ngDevMode ? [{ debugName: "showAsFullText" }] : []));
54803
+ this.isCompact = input(false, ...(ngDevMode ? [{ debugName: "isCompact" }] : []));
54792
54804
  this.displayInfo = computed(() => {
54793
54805
  const isDark = this.viewMode() === ViewModeEnum.DARK;
54794
54806
  return getPacingDisplayInfo(this.pacingPercentage(), this.status(), isDark);
@@ -54797,9 +54809,20 @@ class PacingStatusBadgeComponent {
54797
54809
  const info = this.displayInfo();
54798
54810
  return `${info.bgClass} ${info.colorClass} ${info.borderClass}`;
54799
54811
  }, ...(ngDevMode ? [{ debugName: "badgeClasses" }] : []));
54812
+ this.sizeClasses = computed(() => {
54813
+ const isCompact = this.isCompact();
54814
+ const baseClasses = 'inline-flex items-center gap-1.5 rounded-lg border font-semibold transition-all';
54815
+ if (isCompact) {
54816
+ return `${baseClasses} px-2.5 py-1 text-2xs`;
54817
+ }
54818
+ return `${baseClasses} px-3 py-1.5 text-xs`;
54819
+ }, ...(ngDevMode ? [{ debugName: "sizeClasses" }] : []));
54800
54820
  this.iconClasses = computed(() => {
54801
54821
  return this.displayInfo().colorClass;
54802
54822
  }, ...(ngDevMode ? [{ debugName: "iconClasses" }] : []));
54823
+ this.iconSizeClasses = computed(() => {
54824
+ return this.isCompact() ? 'text-sm' : 'text-base';
54825
+ }, ...(ngDevMode ? [{ debugName: "iconSizeClasses" }] : []));
54803
54826
  this.iconSymbol = computed(() => {
54804
54827
  const status = this.status();
54805
54828
  if (status === 'ahead')
@@ -54809,20 +54832,25 @@ class PacingStatusBadgeComponent {
54809
54832
  return '→';
54810
54833
  }, ...(ngDevMode ? [{ debugName: "iconSymbol" }] : []));
54811
54834
  this.displayText = computed(() => {
54835
+ if (this.showAsFullText()) {
54836
+ return formatPacingDisplayFullText(this.pacingPercentage(), this.status());
54837
+ }
54812
54838
  return this.displayInfo().displayText;
54813
54839
  }, ...(ngDevMode ? [{ debugName: "displayText" }] : []));
54814
54840
  }
54815
54841
  static { this.ɵfac = function PacingStatusBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PacingStatusBadgeComponent)(); }; }
54816
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PacingStatusBadgeComponent, selectors: [["symphiq-pacing-status-badge"]], inputs: { viewMode: [1, "viewMode"], pacingPercentage: [1, "pacingPercentage"], status: [1, "status"] }, decls: 5, vars: 4, consts: [[1, "inline-flex", "items-center", "gap-2", "px-3", "py-1.5", "rounded-lg", "border", "font-semibold", "text-sm", "transition-all", 3, "ngClass"], [1, "text-lg", 3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
54817
- i0.ɵɵelementStart(0, "div", 0)(1, "span", 1);
54842
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PacingStatusBadgeComponent, selectors: [["symphiq-pacing-status-badge"]], inputs: { viewMode: [1, "viewMode"], pacingPercentage: [1, "pacingPercentage"], status: [1, "status"], showAsFullText: [1, "showAsFullText"], isCompact: [1, "isCompact"] }, decls: 5, vars: 8, consts: [[3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
54843
+ i0.ɵɵelementStart(0, "div", 0)(1, "span", 0);
54818
54844
  i0.ɵɵtext(2);
54819
54845
  i0.ɵɵelementEnd();
54820
54846
  i0.ɵɵelementStart(3, "span");
54821
54847
  i0.ɵɵtext(4);
54822
54848
  i0.ɵɵelementEnd()();
54823
54849
  } if (rf & 2) {
54850
+ i0.ɵɵclassMap(ctx.sizeClasses());
54824
54851
  i0.ɵɵproperty("ngClass", ctx.badgeClasses());
54825
54852
  i0.ɵɵadvance();
54853
+ i0.ɵɵclassMap(ctx.iconSizeClasses());
54826
54854
  i0.ɵɵproperty("ngClass", ctx.iconClasses());
54827
54855
  i0.ɵɵadvance();
54828
54856
  i0.ɵɵtextInterpolate1(" ", ctx.iconSymbol(), " ");
@@ -54840,16 +54868,16 @@ class PacingStatusBadgeComponent {
54840
54868
  template: `
54841
54869
  <div
54842
54870
  [ngClass]="badgeClasses()"
54843
- class="inline-flex items-center gap-2 px-3 py-1.5 rounded-lg border font-semibold text-sm transition-all"
54871
+ [class]="sizeClasses()"
54844
54872
  >
54845
- <span [ngClass]="iconClasses()" class="text-lg">
54873
+ <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
54846
54874
  {{ iconSymbol() }}
54847
54875
  </span>
54848
54876
  <span>{{ displayText() }}</span>
54849
54877
  </div>
54850
54878
  `
54851
54879
  }]
54852
- }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], pacingPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingPercentage", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }] }); })();
54880
+ }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], pacingPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingPercentage", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], showAsFullText: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAsFullText", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }] }); })();
54853
54881
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PacingStatusBadgeComponent, { className: "PacingStatusBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/pacing-status-badge.component.ts", lineNumber: 23 }); })();
54854
54882
 
54855
54883
  const _forTrack0$i = ($index, $item) => $item.stageMetric.metric;
@@ -54857,124 +54885,134 @@ const _forTrack1$3 = ($index, $item) => $item.calc.metric;
54857
54885
  function FunnelMetricsVisualizationComponent_For_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
54858
54886
  i0.ɵɵelementStart(0, "button", 7);
54859
54887
  i0.ɵɵnamespaceSVG();
54860
- i0.ɵɵelementStart(1, "svg", 14);
54861
- i0.ɵɵelement(2, "path", 15);
54888
+ i0.ɵɵelementStart(1, "svg", 13);
54889
+ i0.ɵɵelement(2, "path", 14);
54862
54890
  i0.ɵɵelementEnd()();
54863
54891
  } if (rf & 2) {
54864
54892
  const stage_r1 = i0.ɵɵnextContext().$implicit;
54865
54893
  const ctx_r1 = i0.ɵɵnextContext();
54866
54894
  i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(stage_r1.stageMetric.description, ctx_r1.getMetricTitle(stage_r1.stageMetric)));
54867
54895
  } }
54868
- function FunnelMetricsVisualizationComponent_For_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
54869
- i0.ɵɵelement(0, "symphiq-pacing-status-badge", 9);
54870
- } if (rf & 2) {
54871
- const stage_r1 = i0.ɵɵnextContext().$implicit;
54872
- const ctx_r1 = i0.ɵɵnextContext();
54873
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", stage_r1.pacingInfo.pacingPercentage)("status", stage_r1.pacingInfo.status);
54874
- } }
54875
- function FunnelMetricsVisualizationComponent_For_4_Conditional_17_Template(rf, ctx) { if (rf & 1) {
54876
- i0.ɵɵelementStart(0, "div")(1, "p", 12);
54896
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template(rf, ctx) { if (rf & 1) {
54897
+ i0.ɵɵelementStart(0, "div")(1, "p", 9);
54877
54898
  i0.ɵɵtext(2);
54878
54899
  i0.ɵɵelementEnd();
54879
- i0.ɵɵelementStart(3, "p", 13);
54900
+ i0.ɵɵelementStart(3, "p", 11);
54880
54901
  i0.ɵɵtext(4);
54881
- i0.ɵɵelementEnd()();
54902
+ i0.ɵɵelementEnd();
54903
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 15);
54904
+ i0.ɵɵelementEnd();
54882
54905
  } if (rf & 2) {
54883
54906
  const stage_r1 = i0.ɵɵnextContext().$implicit;
54884
54907
  const ctx_r1 = i0.ɵɵnextContext();
54885
54908
  i0.ɵɵadvance();
54886
54909
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
54887
54910
  i0.ɵɵadvance();
54888
- i0.ɵɵtextInterpolate1(" ", ctx_r1.currentYear(), " Projected ");
54911
+ i0.ɵɵtextInterpolate1(" Pace for ", ctx_r1.currentYear(), " ");
54889
54912
  i0.ɵɵadvance();
54890
54913
  i0.ɵɵproperty("ngClass", ctx_r1.projectedValueClasses());
54891
54914
  i0.ɵɵadvance();
54892
54915
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.pacingInfo.projectedValue, stage_r1.stageMetric.metric, false), " ");
54916
+ i0.ɵɵadvance();
54917
+ i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", stage_r1.pacingInfo.pacingPercentage)("status", stage_r1.pacingInfo.status)("showAsFullText", true);
54893
54918
  } }
54894
- function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
54895
- i0.ɵɵelementStart(0, "button", 24);
54919
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
54920
+ i0.ɵɵelementStart(0, "button", 23);
54896
54921
  i0.ɵɵnamespaceSVG();
54897
54922
  i0.ɵɵelementStart(1, "svg", 29);
54898
- i0.ɵɵelement(2, "path", 15);
54923
+ i0.ɵɵelement(2, "path", 14);
54899
54924
  i0.ɵɵelementEnd()();
54900
54925
  } if (rf & 2) {
54901
54926
  const metric_r3 = i0.ɵɵnextContext().$implicit;
54902
54927
  const ctx_r1 = i0.ɵɵnextContext(3);
54903
54928
  i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(metric_r3.calc.description, ctx_r1.getMetricTitle(metric_r3.calc)));
54904
54929
  } }
54905
- function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
54906
- i0.ɵɵelement(0, "symphiq-pacing-status-badge", 9);
54907
- } if (rf & 2) {
54908
- const metric_r3 = i0.ɵɵnextContext().$implicit;
54909
- const ctx_r1 = i0.ɵɵnextContext(3);
54910
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", metric_r3.pacingInfo.pacingPercentage)("status", metric_r3.pacingInfo.status);
54911
- } }
54912
- function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_14_Template(rf, ctx) { if (rf & 1) {
54913
- i0.ɵɵelementStart(0, "div")(1, "p", 28);
54930
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
54931
+ i0.ɵɵelementStart(0, "div")(1, "p", 25);
54914
54932
  i0.ɵɵtext(2);
54915
- i0.ɵɵelementEnd()();
54933
+ i0.ɵɵelementEnd();
54934
+ i0.ɵɵelementStart(3, "p", 27);
54935
+ i0.ɵɵtext(4);
54936
+ i0.ɵɵelementEnd();
54937
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 30);
54938
+ i0.ɵɵelementEnd();
54916
54939
  } if (rf & 2) {
54917
54940
  const metric_r3 = i0.ɵɵnextContext().$implicit;
54918
54941
  const ctx_r1 = i0.ɵɵnextContext(3);
54919
54942
  i0.ɵɵadvance();
54920
54943
  i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
54921
54944
  i0.ɵɵadvance();
54922
- i0.ɵɵtextInterpolate1("Proj: ", ctx_r1.formatMetricValue(metric_r3.pacingInfo.projectedValue, metric_r3.calc.metric, false));
54945
+ i0.ɵɵtextInterpolate1(" Pace for ", ctx_r1.currentYear(), " ");
54946
+ i0.ɵɵadvance();
54947
+ i0.ɵɵproperty("ngClass", ctx_r1.relatedProjectedValueClasses());
54948
+ i0.ɵɵadvance();
54949
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.pacingInfo.projectedValue, metric_r3.calc.metric, false), " ");
54950
+ i0.ɵɵadvance();
54951
+ i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", metric_r3.pacingInfo.pacingPercentage)("status", metric_r3.pacingInfo.status)("showAsFullText", true)("isCompact", true);
54923
54952
  } }
54924
- function FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template(rf, ctx) { if (rf & 1) {
54925
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "div", 22)(3, "p", 23);
54926
- i0.ɵɵtext(4);
54953
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Template(rf, ctx) { if (rf & 1) {
54954
+ i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "p", 22);
54955
+ i0.ɵɵtext(3);
54927
54956
  i0.ɵɵelementEnd();
54928
- i0.ɵɵconditionalCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_5_Template, 3, 2, "button", 24);
54957
+ i0.ɵɵconditionalCreate(4, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_4_Template, 3, 2, "button", 23);
54929
54958
  i0.ɵɵelementEnd();
54930
- i0.ɵɵelementStart(6, "div", 25);
54931
- i0.ɵɵconditionalCreate(7, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_7_Template, 1, 3, "symphiq-pacing-status-badge", 9);
54932
- i0.ɵɵelementStart(8, "span", 26);
54933
- i0.ɵɵtext(9);
54934
- i0.ɵɵelementEnd()()();
54935
- i0.ɵɵelementStart(10, "div", 27)(11, "div")(12, "p", 28);
54936
- i0.ɵɵtext(13);
54959
+ i0.ɵɵelementStart(5, "div", 24)(6, "div")(7, "p", 25);
54960
+ i0.ɵɵtext(8);
54961
+ i0.ɵɵelementEnd();
54962
+ i0.ɵɵelementStart(9, "p", 26);
54963
+ i0.ɵɵtext(10);
54937
54964
  i0.ɵɵelementEnd()();
54938
- i0.ɵɵconditionalCreate(14, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Conditional_14_Template, 3, 2, "div");
54939
- i0.ɵɵelementStart(15, "div")(16, "p", 28);
54965
+ i0.ɵɵelementStart(11, "div")(12, "p", 25);
54966
+ i0.ɵɵtext(13);
54967
+ i0.ɵɵelementEnd();
54968
+ i0.ɵɵelementStart(14, "p", 27);
54969
+ i0.ɵɵtext(15);
54970
+ i0.ɵɵelementEnd();
54971
+ i0.ɵɵelementStart(16, "div", 28);
54940
54972
  i0.ɵɵtext(17);
54941
- i0.ɵɵelementEnd()()()();
54973
+ i0.ɵɵelementEnd()();
54974
+ i0.ɵɵconditionalCreate(18, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_18_Template, 6, 9, "div");
54975
+ i0.ɵɵelementEnd()();
54942
54976
  } if (rf & 2) {
54943
54977
  const metric_r3 = ctx.$implicit;
54944
54978
  const ctx_r1 = i0.ɵɵnextContext(3);
54945
54979
  i0.ɵɵproperty("ngClass", ctx_r1.relatedMetricCardClasses());
54946
- i0.ɵɵadvance(3);
54980
+ i0.ɵɵadvance(2);
54947
54981
  i0.ɵɵproperty("ngClass", ctx_r1.relatedMetricNameClasses());
54948
54982
  i0.ɵɵadvance();
54949
54983
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getMetricTitle(metric_r3.calc), " ");
54950
54984
  i0.ɵɵadvance();
54951
- i0.ɵɵconditional(metric_r3.calc.description ? 5 : -1);
54952
- i0.ɵɵadvance(2);
54953
- i0.ɵɵconditional(metric_r3.pacingInfo ? 7 : -1);
54985
+ i0.ɵɵconditional(metric_r3.calc.description ? 4 : -1);
54986
+ i0.ɵɵadvance(3);
54987
+ i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
54954
54988
  i0.ɵɵadvance();
54955
- i0.ɵɵproperty("ngClass", ctx_r1.relatedPercentageBadgeClasses());
54989
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.priorYear(), " Actual ");
54956
54990
  i0.ɵɵadvance();
54957
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(metric_r3.calc.metric), "", ctx_r1.formatPercentage(ctx_r1.Math.abs(metric_r3.calc.percentageIncrease), 1), " ");
54991
+ i0.ɵɵproperty("ngClass", ctx_r1.relatedValueClasses());
54958
54992
  i0.ɵɵadvance();
54959
- i0.ɵɵproperty("ngClass", metric_r3.pacingInfo ? "grid-cols-3" : "grid-cols-2");
54993
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.calc.currentValue, metric_r3.calc.metric), " ");
54960
54994
  i0.ɵɵadvance(2);
54961
54995
  i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
54962
54996
  i0.ɵɵadvance();
54963
- i0.ɵɵtextInterpolate2("", ctx_r1.priorYear(), ": ", ctx_r1.formatMetricValue(metric_r3.calc.currentValue, metric_r3.calc.metric));
54997
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.currentYear(), " Target ");
54998
+ i0.ɵɵadvance();
54999
+ i0.ɵɵproperty("ngClass", ctx_r1.relatedTargetValueClasses());
54964
55000
  i0.ɵɵadvance();
54965
- i0.ɵɵconditional(metric_r3.pacingInfo ? 14 : -1);
54966
- i0.ɵɵadvance(2);
54967
- i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
55001
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.calc.targetValue, metric_r3.calc.metric, false), " ");
54968
55002
  i0.ɵɵadvance();
54969
- i0.ɵɵtextInterpolate1("Target: ", ctx_r1.formatMetricValue(metric_r3.calc.targetValue, metric_r3.calc.metric, false));
55003
+ i0.ɵɵproperty("ngClass", ctx_r1.relatedPercentageBadgeClasses());
55004
+ i0.ɵɵadvance();
55005
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getTargetIncreaseText(metric_r3.calc.percentageIncrease, metric_r3.calc.metric), " ");
55006
+ i0.ɵɵadvance();
55007
+ i0.ɵɵconditional(metric_r3.pacingInfo ? 18 : -1);
54970
55008
  } }
54971
- function FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template(rf, ctx) { if (rf & 1) {
55009
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_Template(rf, ctx) { if (rf & 1) {
54972
55010
  i0.ɵɵelement(0, "div", 16);
54973
55011
  i0.ɵɵelementStart(1, "div", 17)(2, "p", 18);
54974
55012
  i0.ɵɵtext(3, " Related Metrics ");
54975
55013
  i0.ɵɵelementEnd();
54976
55014
  i0.ɵɵelementStart(4, "div", 19);
54977
- i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_23_For_6_Template, 18, 15, "div", 20, _forTrack1$3);
55015
+ i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Template, 19, 15, "div", 20, _forTrack1$3);
54978
55016
  i0.ɵɵelementEnd()();
54979
55017
  } if (rf & 2) {
54980
55018
  const stage_r1 = i0.ɵɵnextContext().$implicit;
@@ -54990,26 +55028,25 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
54990
55028
  i0.ɵɵtext(5);
54991
55029
  i0.ɵɵelementEnd();
54992
55030
  i0.ɵɵconditionalCreate(6, FunnelMetricsVisualizationComponent_For_4_Conditional_6_Template, 3, 2, "button", 7);
54993
- i0.ɵɵelementEnd()();
54994
- i0.ɵɵelementStart(7, "div", 8);
54995
- i0.ɵɵconditionalCreate(8, FunnelMetricsVisualizationComponent_For_4_Conditional_8_Template, 1, 3, "symphiq-pacing-status-badge", 9);
54996
- i0.ɵɵelementStart(9, "div", 10);
54997
- i0.ɵɵtext(10);
54998
55031
  i0.ɵɵelementEnd()()();
54999
- i0.ɵɵelementStart(11, "div", 11)(12, "div")(13, "p", 12);
55000
- i0.ɵɵtext(14);
55032
+ i0.ɵɵelementStart(7, "div", 8)(8, "div")(9, "p", 9);
55033
+ i0.ɵɵtext(10);
55001
55034
  i0.ɵɵelementEnd();
55002
- i0.ɵɵelementStart(15, "p", 13);
55003
- i0.ɵɵtext(16);
55035
+ i0.ɵɵelementStart(11, "p", 10);
55036
+ i0.ɵɵtext(12);
55004
55037
  i0.ɵɵelementEnd()();
55005
- i0.ɵɵconditionalCreate(17, FunnelMetricsVisualizationComponent_For_4_Conditional_17_Template, 5, 4, "div");
55006
- i0.ɵɵelementStart(18, "div")(19, "p", 12);
55007
- i0.ɵɵtext(20);
55038
+ i0.ɵɵelementStart(13, "div")(14, "p", 9);
55039
+ i0.ɵɵtext(15);
55008
55040
  i0.ɵɵelementEnd();
55009
- i0.ɵɵelementStart(21, "p", 13);
55010
- i0.ɵɵtext(22);
55011
- i0.ɵɵelementEnd()()();
55012
- i0.ɵɵconditionalCreate(23, FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template, 7, 2);
55041
+ i0.ɵɵelementStart(16, "p", 11);
55042
+ i0.ɵɵtext(17);
55043
+ i0.ɵɵelementEnd();
55044
+ i0.ɵɵelementStart(18, "div", 12);
55045
+ i0.ɵɵtext(19);
55046
+ i0.ɵɵelementEnd()();
55047
+ i0.ɵɵconditionalCreate(20, FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template, 6, 8, "div");
55048
+ i0.ɵɵelementEnd();
55049
+ i0.ɵɵconditionalCreate(21, FunnelMetricsVisualizationComponent_For_4_Conditional_21_Template, 7, 2);
55013
55050
  i0.ɵɵelementEnd();
55014
55051
  } if (rf & 2) {
55015
55052
  const stage_r1 = ctx.$implicit;
@@ -55021,12 +55058,6 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55021
55058
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getMetricTitle(stage_r1.stageMetric), " ");
55022
55059
  i0.ɵɵadvance();
55023
55060
  i0.ɵɵconditional(stage_r1.stageMetric.description ? 6 : -1);
55024
- i0.ɵɵadvance(2);
55025
- i0.ɵɵconditional(stage_r1.pacingInfo ? 8 : -1);
55026
- i0.ɵɵadvance();
55027
- i0.ɵɵproperty("ngClass", ctx_r1.percentageBadgeClasses());
55028
- i0.ɵɵadvance();
55029
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getGrowthSign(stage_r1.stageMetric.metric), "", ctx_r1.formatPercentage(ctx_r1.Math.abs(stage_r1.stageMetric.percentageIncrease), 1), " ");
55030
55061
  i0.ɵɵadvance(3);
55031
55062
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55032
55063
  i0.ɵɵadvance();
@@ -55035,8 +55066,6 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55035
55066
  i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
55036
55067
  i0.ɵɵadvance();
55037
55068
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.stageMetric.currentValue, stage_r1.stageMetric.metric), " ");
55038
- i0.ɵɵadvance();
55039
- i0.ɵɵconditional(stage_r1.pacingInfo ? 17 : -1);
55040
55069
  i0.ɵɵadvance(2);
55041
55070
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55042
55071
  i0.ɵɵadvance();
@@ -55046,7 +55075,13 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55046
55075
  i0.ɵɵadvance();
55047
55076
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.stageMetric.targetValue, stage_r1.stageMetric.metric, false), " ");
55048
55077
  i0.ɵɵadvance();
55049
- i0.ɵɵconditional(stage_r1.relatedMetrics.length > 0 ? 23 : -1);
55078
+ i0.ɵɵproperty("ngClass", ctx_r1.percentageBadgeClasses());
55079
+ i0.ɵɵadvance();
55080
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getTargetIncreaseText(stage_r1.stageMetric.percentageIncrease, stage_r1.stageMetric.metric), " ");
55081
+ i0.ɵɵadvance();
55082
+ i0.ɵɵconditional(stage_r1.pacingInfo ? 20 : -1);
55083
+ i0.ɵɵadvance();
55084
+ i0.ɵɵconditional(stage_r1.relatedMetrics.length > 0 ? 21 : -1);
55050
55085
  } }
55051
55086
  class FunnelMetricsVisualizationComponent {
55052
55087
  constructor() {
@@ -55161,9 +55196,29 @@ class FunnelMetricsVisualizationComponent {
55161
55196
  ? 'text-slate-400'
55162
55197
  : 'text-slate-600';
55163
55198
  }
55199
+ relatedValueClasses() {
55200
+ return this.viewMode() === ViewModeEnum.DARK
55201
+ ? 'text-white'
55202
+ : 'text-slate-900';
55203
+ }
55204
+ relatedTargetValueClasses() {
55205
+ return this.viewMode() === ViewModeEnum.DARK
55206
+ ? 'text-purple-300'
55207
+ : 'text-purple-700';
55208
+ }
55209
+ relatedProjectedValueClasses() {
55210
+ return this.viewMode() === ViewModeEnum.DARK
55211
+ ? 'text-amber-300'
55212
+ : 'text-amber-700';
55213
+ }
55164
55214
  formatPercentage(value, decimals) {
55165
55215
  return formatPercentage(value, decimals);
55166
55216
  }
55217
+ getTargetIncreaseText(percentageIncrease, metric) {
55218
+ const sign = MetricEnumUtil.increaseBad(metric) ? '' : '+';
55219
+ const absValue = Math.abs(percentageIncrease);
55220
+ return `${sign}${formatPercentage(absValue, 1)} increase over ${this.priorYear()}`;
55221
+ }
55167
55222
  formatMetricValue(value, metric, fromUiData = true) {
55168
55223
  if (metric.includes('REVENUE')) {
55169
55224
  return formatCurrency(value);
@@ -55193,11 +55248,11 @@ class FunnelMetricsVisualizationComponent {
55193
55248
  return MetricEnumUtil.increaseBad(metric) ? '-' : '+';
55194
55249
  }
55195
55250
  static { this.ɵfac = function FunnelMetricsVisualizationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FunnelMetricsVisualizationComponent)(); }; }
55196
- 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) {
55251
+ 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-6"], [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, "grid", "grid-cols-3", "gap-6", "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-3", 3, "ngClass"], [1, "px-3", "py-1.5", "rounded-lg", "font-semibold", "text-xs", "inline-block", 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"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText"], [1, "my-4", 3, "ngClass"], [1, "space-y-3"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-3", 3, "ngClass"], [1, "grid", "gap-3"], [1, "p-4", "rounded-lg", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mb-4"], [1, "text-xs", "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, "grid", "grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "text-base", "font-bold", 3, "ngClass"], [1, "text-base", "font-bold", "mb-2", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded", "text-2xs", "font-semibold", "inline-block", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55197
55252
  i0.ɵɵelementStart(0, "div", 0);
55198
55253
  i0.ɵɵelement(1, "symphiq-tooltip-container");
55199
55254
  i0.ɵɵelementStart(2, "div", 1);
55200
- i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 24, 18, "div", 2, _forTrack0$i);
55255
+ i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 22, 16, "div", 2, _forTrack0$i);
55201
55256
  i0.ɵɵelementEnd()();
55202
55257
  } if (rf & 2) {
55203
55258
  i0.ɵɵadvance(3);
@@ -55211,144 +55266,152 @@ class FunnelMetricsVisualizationComponent {
55211
55266
  standalone: true,
55212
55267
  imports: [CommonModule, PacingStatusBadgeComponent, TooltipDirective, TooltipContainerComponent],
55213
55268
  changeDetection: ChangeDetectionStrategy.OnPush,
55214
- template: `
55215
- <div class="space-y-6">
55216
- <symphiq-tooltip-container />
55217
- <div class="space-y-8">
55218
- @for (stage of funnelStages(); track stage.stageMetric.metric) {
55219
- <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55220
- <div class="flex items-start justify-between mb-4">
55221
- <div class="flex-1">
55222
- <div class="flex items-center gap-2 mb-1">
55223
- <h3 [ngClass]="stageTitleClasses()" class="text-lg font-bold leading-tight m-0">
55224
- {{ getMetricTitle(stage.stageMetric) }}
55225
- </h3>
55226
- @if (stage.stageMetric.description) {
55227
- <button
55228
- type="button"
55229
- [ngClass]="infoIconClasses()"
55230
- class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55231
- [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55232
- tooltipType="markdown"
55233
- tooltipPosition="right">
55234
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55235
- <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" />
55236
- </svg>
55237
- </button>
55238
- }
55239
- </div>
55240
- </div>
55241
- <div class="flex items-center gap-3">
55242
- @if (stage.pacingInfo) {
55243
- <symphiq-pacing-status-badge
55244
- [viewMode]="viewMode()"
55245
- [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55246
- [status]="stage.pacingInfo.status"
55247
- />
55248
- }
55249
- <div [ngClass]="percentageBadgeClasses()" class="px-4 py-2 rounded-lg font-bold text-sm">
55250
- {{ getGrowthSign(stage.stageMetric.metric) }}{{ formatPercentage(Math.abs(stage.stageMetric.percentageIncrease), 1) }}
55251
- </div>
55252
- </div>
55253
- </div>
55254
-
55255
- <div class="grid grid-cols-3 gap-4 mb-4">
55256
- <div>
55257
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55258
- {{ priorYear() }} Actual
55259
- </p>
55260
- <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55261
- {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55262
- </p>
55263
- </div>
55264
- @if (stage.pacingInfo) {
55265
- <div>
55266
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55267
- {{ currentYear() }} Projected
55268
- </p>
55269
- <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold">
55270
- {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55271
- </p>
55272
- </div>
55273
- }
55274
- <div>
55275
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
55276
- {{ currentYear() }} Target
55277
- </p>
55278
- <p [ngClass]="targetValueClasses()" class="text-2xl font-bold">
55279
- {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric, false) }}
55280
- </p>
55281
- </div>
55282
- </div>
55283
-
55284
- @if (stage.relatedMetrics.length > 0) {
55285
- <div [ngClass]="dividerClasses()" class="my-4"></div>
55286
-
55287
- <div class="space-y-2">
55288
- <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55289
- Related Metrics
55290
- </p>
55291
- <div class="grid gap-2">
55292
- @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55293
- <div [ngClass]="relatedMetricCardClasses()" class="p-3 rounded-lg">
55294
- <div class="flex items-center justify-between mb-2">
55295
- <div class="flex items-center gap-2 flex-1">
55296
- <p [ngClass]="relatedMetricNameClasses()" class="text-sm font-semibold leading-tight">
55297
- {{ getMetricTitle(metric.calc) }}
55298
- </p>
55299
- @if (metric.calc.description) {
55300
- <button
55301
- type="button"
55302
- [ngClass]="infoIconClasses()"
55303
- class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55304
- [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55305
- tooltipType="markdown"
55306
- tooltipPosition="right">
55307
- <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55308
- <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" />
55309
- </svg>
55310
- </button>
55311
- }
55312
- </div>
55313
- <div class="flex items-center gap-2">
55314
- @if (metric.pacingInfo) {
55315
- <symphiq-pacing-status-badge
55316
- [viewMode]="viewMode()"
55317
- [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55318
- [status]="metric.pacingInfo.status"
55319
- />
55320
- }
55321
- <span [ngClass]="relatedPercentageBadgeClasses()" class="px-2 py-1 rounded text-xs font-bold">
55322
- {{ getGrowthSign(metric.calc.metric) }}{{ formatPercentage(Math.abs(metric.calc.percentageIncrease), 1) }}
55323
- </span>
55324
- </div>
55325
- </div>
55326
- <div class="grid gap-2 text-xs" [ngClass]="metric.pacingInfo ? 'grid-cols-3' : 'grid-cols-2'">
55327
- <div>
55328
- <p [ngClass]="relatedLabelClasses()">{{ priorYear() }}: {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}</p>
55329
- </div>
55330
- @if (metric.pacingInfo) {
55331
- <div>
55332
- <p [ngClass]="relatedLabelClasses()">Proj: {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}</p>
55333
- </div>
55334
- }
55335
- <div>
55336
- <p [ngClass]="relatedLabelClasses()">Target: {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric, false) }}</p>
55337
- </div>
55338
- </div>
55339
- </div>
55340
- }
55341
- </div>
55342
- </div>
55343
- }
55344
- </div>
55345
- }
55346
- </div>
55347
- </div>
55269
+ template: `
55270
+ <div class="space-y-6">
55271
+ <symphiq-tooltip-container />
55272
+ <div class="space-y-8">
55273
+ @for (stage of funnelStages(); track stage.stageMetric.metric) {
55274
+ <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55275
+ <div class="flex items-start justify-between mb-6">
55276
+ <div class="flex-1">
55277
+ <div class="flex items-center gap-2 mb-1">
55278
+ <h3 [ngClass]="stageTitleClasses()" class="text-lg font-bold leading-tight m-0">
55279
+ {{ getMetricTitle(stage.stageMetric) }}
55280
+ </h3>
55281
+ @if (stage.stageMetric.description) {
55282
+ <button
55283
+ type="button"
55284
+ [ngClass]="infoIconClasses()"
55285
+ class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55286
+ [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55287
+ tooltipType="markdown"
55288
+ tooltipPosition="right">
55289
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55290
+ <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" />
55291
+ </svg>
55292
+ </button>
55293
+ }
55294
+ </div>
55295
+ </div>
55296
+ </div>
55297
+
55298
+ <div class="grid grid-cols-3 gap-6 mb-4">
55299
+ <div>
55300
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55301
+ {{ priorYear() }} Actual
55302
+ </p>
55303
+ <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55304
+ {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55305
+ </p>
55306
+ </div>
55307
+ <div>
55308
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55309
+ {{ currentYear() }} Target
55310
+ </p>
55311
+ <p [ngClass]="targetValueClasses()" class="text-2xl font-bold mb-3">
55312
+ {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric, false) }}
55313
+ </p>
55314
+ <div [ngClass]="percentageBadgeClasses()" class="px-3 py-1.5 rounded-lg font-semibold text-xs inline-block">
55315
+ {{ getTargetIncreaseText(stage.stageMetric.percentageIncrease, stage.stageMetric.metric) }}
55316
+ </div>
55317
+ </div>
55318
+ @if (stage.pacingInfo) {
55319
+ <div>
55320
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55321
+ Pace for {{ currentYear() }}
55322
+ </p>
55323
+ <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold mb-3">
55324
+ {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55325
+ </p>
55326
+ <symphiq-pacing-status-badge
55327
+ [viewMode]="viewMode()"
55328
+ [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55329
+ [status]="stage.pacingInfo.status"
55330
+ [showAsFullText]="true"
55331
+ />
55332
+ </div>
55333
+ }
55334
+ </div>
55335
+
55336
+ @if (stage.relatedMetrics.length > 0) {
55337
+ <div [ngClass]="dividerClasses()" class="my-4"></div>
55338
+
55339
+ <div class="space-y-3">
55340
+ <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55341
+ Related Metrics
55342
+ </p>
55343
+ <div class="grid gap-3">
55344
+ @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55345
+ <div [ngClass]="relatedMetricCardClasses()" class="p-4 rounded-lg">
55346
+ <div class="flex items-center gap-2 mb-4">
55347
+ <p [ngClass]="relatedMetricNameClasses()" class="text-xs font-semibold leading-tight">
55348
+ {{ getMetricTitle(metric.calc) }}
55349
+ </p>
55350
+ @if (metric.calc.description) {
55351
+ <button
55352
+ type="button"
55353
+ [ngClass]="infoIconClasses()"
55354
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55355
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55356
+ tooltipType="markdown"
55357
+ tooltipPosition="right">
55358
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55359
+ <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" />
55360
+ </svg>
55361
+ </button>
55362
+ }
55363
+ </div>
55364
+ <div class="grid grid-cols-3 gap-4">
55365
+ <div>
55366
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55367
+ {{ priorYear() }} Actual
55368
+ </p>
55369
+ <p [ngClass]="relatedValueClasses()" class="text-base font-bold">
55370
+ {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}
55371
+ </p>
55372
+ </div>
55373
+ <div>
55374
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55375
+ {{ currentYear() }} Target
55376
+ </p>
55377
+ <p [ngClass]="relatedTargetValueClasses()" class="text-base font-bold mb-2">
55378
+ {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric, false) }}
55379
+ </p>
55380
+ <div [ngClass]="relatedPercentageBadgeClasses()" class="px-2.5 py-1 rounded text-2xs font-semibold inline-block">
55381
+ {{ getTargetIncreaseText(metric.calc.percentageIncrease, metric.calc.metric) }}
55382
+ </div>
55383
+ </div>
55384
+ @if (metric.pacingInfo) {
55385
+ <div>
55386
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55387
+ Pace for {{ currentYear() }}
55388
+ </p>
55389
+ <p [ngClass]="relatedProjectedValueClasses()" class="text-base font-bold mb-2">
55390
+ {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}
55391
+ </p>
55392
+ <symphiq-pacing-status-badge
55393
+ [viewMode]="viewMode()"
55394
+ [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55395
+ [status]="metric.pacingInfo.status"
55396
+ [showAsFullText]="true"
55397
+ [isCompact]="true"
55398
+ />
55399
+ </div>
55400
+ }
55401
+ </div>
55402
+ </div>
55403
+ }
55404
+ </div>
55405
+ </div>
55406
+ }
55407
+ </div>
55408
+ }
55409
+ </div>
55410
+ </div>
55348
55411
  `
55349
55412
  }]
55350
55413
  }], 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 }] }] }); })();
55351
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 152 }); })();
55414
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 160 }); })();
55352
55415
 
55353
55416
  function StickySubmitBarComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55354
55417
  i0.ɵɵelementStart(0, "div", 4);
@@ -56901,10 +56964,12 @@ class InitialTargetSettingComponent {
56901
56964
  absValue(value) {
56902
56965
  return Math.abs(value);
56903
56966
  }
56904
- sectionCardClasses() {
56905
- return this.viewMode() === ViewModeEnum.DARK
56906
- ? 'bg-slate-800/40 border-slate-700/50'
56907
- : 'bg-white border-slate-200';
56967
+ sectionCardClasses(forStickyCard = false) {
56968
+ const isSticky = forStickyCard && this.calculationState() === 'results';
56969
+ if (this.viewMode() === ViewModeEnum.DARK) {
56970
+ return isSticky ? 'bg-slate-800 border-slate-700/50' : 'bg-slate-800/40 border-slate-700/50';
56971
+ }
56972
+ return isSticky ? 'bg-white border-slate-200' : 'bg-white border-slate-200';
56908
56973
  }
56909
56974
  sectionTitleClasses() {
56910
56975
  return this.viewMode() === ViewModeEnum.DARK
@@ -57123,8 +57188,9 @@ class InitialTargetSettingComponent {
57123
57188
  i0.ɵɵelementEnd()();
57124
57189
  } if (rf & 2) {
57125
57190
  i0.ɵɵadvance(2);
57126
- i0.ɵɵclassProp("cursor-pointer", ctx.calculationState() === "results")("sticky", ctx.calculationState() === "results")("top-32", ctx.calculationState() === "results")("z-30", ctx.calculationState() === "results");
57127
- i0.ɵɵproperty("ngClass", ctx.sectionCardClasses());
57191
+ i0.ɵɵstyleProp("top", ctx.calculationState() === "results" ? "148px" : "auto");
57192
+ i0.ɵɵclassProp("cursor-pointer", ctx.calculationState() === "results")("sticky", ctx.calculationState() === "results")("z-30", ctx.calculationState() === "results");
57193
+ i0.ɵɵproperty("ngClass", ctx.sectionCardClasses(true));
57128
57194
  i0.ɵɵadvance(2);
57129
57195
  i0.ɵɵproperty("ngClass", ctx.sectionTitleClasses());
57130
57196
  i0.ɵɵadvance();
@@ -57189,10 +57255,10 @@ class InitialTargetSettingComponent {
57189
57255
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57190
57256
  <div class="space-y-8 pb-32">
57191
57257
  <symphiq-tooltip-container />
57192
- <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8"
57258
+ <div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
57193
57259
  [class.cursor-pointer]="calculationState() === 'results'"
57194
57260
  [class.sticky]="calculationState() === 'results'"
57195
- [class.top-32]="calculationState() === 'results'"
57261
+ [style.top]="calculationState() === 'results' ? '148px' : 'auto'"
57196
57262
  [class.z-30]="calculationState() === 'results'"
57197
57263
  (click)="onCardClick()">
57198
57264
  <div class="flex items-center justify-between mb-6">