@eric-emg/symphiq-components 1.2.250 → 1.2.252

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.
@@ -54818,6 +54818,7 @@ function PacingStatusBadgeComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
54818
54818
  } if (rf & 2) {
54819
54819
  const ctx_r0 = i0.ɵɵnextContext();
54820
54820
  i0.ɵɵclassMap(ctx_r0.containerSizeClasses());
54821
+ i0.ɵɵstyleProp("transform", ctx_r0.rotationStyle());
54821
54822
  i0.ɵɵproperty("ngClass", ctx_r0.containerClasses());
54822
54823
  i0.ɵɵadvance();
54823
54824
  i0.ɵɵclassMap(ctx_r0.overlaySizeClasses());
@@ -54844,6 +54845,7 @@ function PacingStatusBadgeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1
54844
54845
  } if (rf & 2) {
54845
54846
  const ctx_r0 = i0.ɵɵnextContext();
54846
54847
  i0.ɵɵclassMap(ctx_r0.fullBadgeSizeClasses());
54848
+ i0.ɵɵstyleProp("transform", ctx_r0.fullBadgeRotationStyle());
54847
54849
  i0.ɵɵproperty("ngClass", ctx_r0.badgeClasses());
54848
54850
  i0.ɵɵadvance();
54849
54851
  i0.ɵɵclassMap(ctx_r0.iconSizeClasses());
@@ -54854,7 +54856,8 @@ function PacingStatusBadgeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1
54854
54856
  i0.ɵɵtextInterpolate(ctx_r0.displayText());
54855
54857
  } }
54856
54858
  class PacingStatusBadgeComponent {
54857
- constructor() {
54859
+ constructor(elementRef) {
54860
+ this.elementRef = elementRef;
54858
54861
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
54859
54862
  this.pacingPercentage = input(0, ...(ngDevMode ? [{ debugName: "pacingPercentage" }] : []));
54860
54863
  this.status = input('on-pace', ...(ngDevMode ? [{ debugName: "status" }] : []));
@@ -54862,6 +54865,9 @@ class PacingStatusBadgeComponent {
54862
54865
  this.isCompact = input(false, ...(ngDevMode ? [{ debugName: "isCompact" }] : []));
54863
54866
  this.showEmphasizedPercentage = input(false, ...(ngDevMode ? [{ debugName: "showEmphasizedPercentage" }] : []));
54864
54867
  this.animatedValue = signal(0, ...(ngDevMode ? [{ debugName: "animatedValue" }] : []));
54868
+ this.animationProgress = signal(0, ...(ngDevMode ? [{ debugName: "animationProgress" }] : []));
54869
+ this.hasAnimated = signal(false, ...(ngDevMode ? [{ debugName: "hasAnimated" }] : []));
54870
+ this.observer = null;
54865
54871
  this.displayInfo = computed(() => {
54866
54872
  const isDark = this.viewMode() === ViewModeEnum.DARK;
54867
54873
  return getPacingDisplayInfo(this.pacingPercentage(), this.status(), isDark);
@@ -54870,14 +54876,24 @@ class PacingStatusBadgeComponent {
54870
54876
  const info = this.displayInfo();
54871
54877
  return `${info.bgClass} ${info.borderClass} border`;
54872
54878
  }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
54879
+ this.targetRotation = computed(() => {
54880
+ const status = this.status();
54881
+ return status === 'ahead' ? -1 : status === 'behind' ? 1 : 0;
54882
+ }, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
54883
+ this.rotationStyle = computed(() => {
54884
+ const target = this.targetRotation();
54885
+ return `rotate(${target}deg)`;
54886
+ }, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
54887
+ this.fullBadgeRotationStyle = computed(() => {
54888
+ const target = this.targetRotation();
54889
+ return `rotate(${target}deg)`;
54890
+ }, ...(ngDevMode ? [{ debugName: "fullBadgeRotationStyle" }] : []));
54873
54891
  this.containerSizeClasses = computed(() => {
54874
54892
  const compact = this.isCompact();
54875
- const status = this.status();
54876
- const tiltClass = status === 'ahead' ? '-rotate-1' : status === 'behind' ? 'rotate-1' : '';
54877
54893
  const baseClasses = 'inline-flex flex-row items-center rounded-xl border-2 overflow-visible transition-transform hover:rotate-0';
54878
54894
  return compact
54879
- ? `${baseClasses} pl-1.5 ${tiltClass}`
54880
- : `${baseClasses} pl-2 ${tiltClass}`;
54895
+ ? `${baseClasses} pl-1.5`
54896
+ : `${baseClasses} pl-2`;
54881
54897
  }, ...(ngDevMode ? [{ debugName: "containerSizeClasses" }] : []));
54882
54898
  this.badgeClasses = computed(() => {
54883
54899
  const info = this.displayInfo();
@@ -54893,9 +54909,7 @@ class PacingStatusBadgeComponent {
54893
54909
  }, ...(ngDevMode ? [{ debugName: "sizeClasses" }] : []));
54894
54910
  this.fullBadgeSizeClasses = computed(() => {
54895
54911
  const isCompact = this.isCompact();
54896
- const status = this.status();
54897
- const tiltClass = status === 'ahead' ? '-rotate-1' : status === 'behind' ? 'rotate-1' : '';
54898
- const baseClasses = `inline-flex items-center gap-1.5 rounded-xl border-2 font-bold tracking-wide shadow-md transition-all hover:rotate-0 ${tiltClass}`;
54912
+ const baseClasses = 'inline-flex items-center gap-1.5 rounded-xl border-2 font-bold tracking-wide shadow-md transition-all hover:rotate-0';
54899
54913
  if (isCompact) {
54900
54914
  return `${baseClasses} px-2.5 py-1 text-xs`;
54901
54915
  }
@@ -54964,14 +54978,34 @@ class PacingStatusBadgeComponent {
54964
54978
  this.overlaySizeClasses = computed(() => {
54965
54979
  const compact = this.isCompact();
54966
54980
  return compact
54967
- ? 'px-2 py-1.5 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1 -mr-1 z-10 inline-flex items-center gap-0.5'
54968
- : 'px-2.5 py-2 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1.5 -mr-1 z-10 inline-flex items-center gap-1';
54981
+ ? 'px-2 py-1.5 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1 -mr-1 z-10 inline-flex items-center gap-0.5 tabular-nums'
54982
+ : 'px-2.5 py-2 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1.5 -mr-1 z-10 inline-flex items-center gap-1 tabular-nums';
54969
54983
  }, ...(ngDevMode ? [{ debugName: "overlaySizeClasses" }] : []));
54984
+ this.setupIntersectionObserver();
54970
54985
  effect(() => {
54971
54986
  const target = Math.abs(this.pacingPercentage());
54972
- this.animateValue(target);
54987
+ if (this.hasAnimated()) {
54988
+ this.animateValue(target);
54989
+ }
54973
54990
  });
54974
54991
  }
54992
+ ngOnDestroy() {
54993
+ if (this.observer) {
54994
+ this.observer.disconnect();
54995
+ }
54996
+ }
54997
+ setupIntersectionObserver() {
54998
+ this.observer = new IntersectionObserver((entries) => {
54999
+ entries.forEach((entry) => {
55000
+ if (entry.isIntersecting && !this.hasAnimated()) {
55001
+ this.hasAnimated.set(true);
55002
+ const target = Math.abs(this.pacingPercentage());
55003
+ this.animateValue(target);
55004
+ }
55005
+ });
55006
+ }, { threshold: 0.1 });
55007
+ this.observer.observe(this.elementRef.nativeElement);
55008
+ }
54975
55009
  animateValue(target) {
54976
55010
  const start = 0;
54977
55011
  const duration = 800;
@@ -54982,15 +55016,16 @@ class PacingStatusBadgeComponent {
54982
55016
  const easeOutQuart = 1 - Math.pow(1 - progress, 4);
54983
55017
  const current = start + (target - start) * easeOutQuart;
54984
55018
  this.animatedValue.set(current);
55019
+ this.animationProgress.set(progress);
54985
55020
  if (progress < 1) {
54986
55021
  requestAnimationFrame(animate);
54987
55022
  }
54988
55023
  };
54989
55024
  requestAnimationFrame(animate);
54990
55025
  }
54991
- static { this.ɵfac = function PacingStatusBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PacingStatusBadgeComponent)(); }; }
54992
- 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"], showEmphasizedPercentage: [1, "showEmphasizedPercentage"] }, decls: 2, vars: 1, consts: [[3, "ngClass", "class"], [3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
54993
- i0.ɵɵconditionalCreate(0, PacingStatusBadgeComponent_Conditional_0_Template, 8, 14, "div", 0)(1, PacingStatusBadgeComponent_Conditional_1_Template, 5, 8, "div", 0);
55026
+ static { this.ɵfac = function PacingStatusBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PacingStatusBadgeComponent)(i0.ɵɵdirectiveInject(i0.ElementRef)); }; }
55027
+ 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"], showEmphasizedPercentage: [1, "showEmphasizedPercentage"] }, decls: 2, vars: 1, consts: [[3, "ngClass", "class", "transform"], [3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
55028
+ i0.ɵɵconditionalCreate(0, PacingStatusBadgeComponent_Conditional_0_Template, 8, 16, "div", 0)(1, PacingStatusBadgeComponent_Conditional_1_Template, 5, 10, "div", 0);
54994
55029
  } if (rf & 2) {
54995
55030
  i0.ɵɵconditional(ctx.showEmphasizedPercentage() && ctx.hasPercentage() ? 0 : 1);
54996
55031
  } }, dependencies: [CommonModule, i1$1.NgClass], encapsulation: 2, changeDetection: 0 }); }
@@ -55002,46 +55037,55 @@ class PacingStatusBadgeComponent {
55002
55037
  standalone: true,
55003
55038
  imports: [CommonModule],
55004
55039
  changeDetection: ChangeDetectionStrategy.OnPush,
55005
- template: `
55006
- @if (showEmphasizedPercentage() && hasPercentage()) {
55007
- <div [ngClass]="containerClasses()" [class]="containerSizeClasses()">
55008
- <div [ngClass]="overlayBadgeClasses()" [class]="overlaySizeClasses()">
55009
- <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55010
- {{ iconSymbol() }}
55011
- </span>
55012
- {{ animatedPercentage() }}
55013
- </div>
55014
- <div
55015
- [class]="sizeClasses()"
55016
- >
55017
- <span>{{ displayTextWithoutPercentage() }}</span>
55018
- </div>
55019
- </div>
55020
- } @else {
55021
- <div
55022
- [ngClass]="badgeClasses()"
55023
- [class]="fullBadgeSizeClasses()"
55024
- >
55025
- <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55026
- {{ iconSymbol() }}
55027
- </span>
55028
- <span>{{ displayText() }}</span>
55029
- </div>
55030
- }
55040
+ template: `
55041
+ @if (showEmphasizedPercentage() && hasPercentage()) {
55042
+ <div
55043
+ [ngClass]="containerClasses()"
55044
+ [class]="containerSizeClasses()"
55045
+ [style.transform]="rotationStyle()"
55046
+ >
55047
+ <div [ngClass]="overlayBadgeClasses()" [class]="overlaySizeClasses()">
55048
+ <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55049
+ {{ iconSymbol() }}
55050
+ </span>
55051
+ {{ animatedPercentage() }}
55052
+ </div>
55053
+ <div
55054
+ [class]="sizeClasses()"
55055
+ >
55056
+ <span>{{ displayTextWithoutPercentage() }}</span>
55057
+ </div>
55058
+ </div>
55059
+ } @else {
55060
+ <div
55061
+ [ngClass]="badgeClasses()"
55062
+ [class]="fullBadgeSizeClasses()"
55063
+ [style.transform]="fullBadgeRotationStyle()"
55064
+ >
55065
+ <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55066
+ {{ iconSymbol() }}
55067
+ </span>
55068
+ <span>{{ displayText() }}</span>
55069
+ </div>
55070
+ }
55031
55071
  `
55032
55072
  }]
55033
- }], () => [], { 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 }] }], showEmphasizedPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmphasizedPercentage", required: false }] }] }); })();
55034
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PacingStatusBadgeComponent, { className: "PacingStatusBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/pacing-status-badge.component.ts", lineNumber: 39 }); })();
55073
+ }], () => [{ type: i0.ElementRef }], { 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 }] }], showEmphasizedPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmphasizedPercentage", required: false }] }] }); })();
55074
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PacingStatusBadgeComponent, { className: "PacingStatusBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/pacing-status-badge.component.ts", lineNumber: 44 }); })();
55035
55075
 
55036
55076
  class TargetChangeBadgeComponent {
55037
- constructor() {
55077
+ constructor(elementRef) {
55078
+ this.elementRef = elementRef;
55038
55079
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
55039
55080
  this.percentageChange = input(0, ...(ngDevMode ? [{ debugName: "percentageChange" }] : []));
55040
55081
  this.metric = input('', ...(ngDevMode ? [{ debugName: "metric" }] : []));
55041
55082
  this.priorYear = input(new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
55042
55083
  this.isCompact = input(false, ...(ngDevMode ? [{ debugName: "isCompact" }] : []));
55043
55084
  this.animatedValue = signal(0, ...(ngDevMode ? [{ debugName: "animatedValue" }] : []));
55085
+ this.animationProgress = signal(0, ...(ngDevMode ? [{ debugName: "animationProgress" }] : []));
55086
+ this.hasAnimated = signal(false, ...(ngDevMode ? [{ debugName: "hasAnimated" }] : []));
55044
55087
  this.isDark = computed(() => this.viewMode() === ViewModeEnum.DARK, ...(ngDevMode ? [{ debugName: "isDark" }] : []));
55088
+ this.observer = null;
55045
55089
  this.isIncreaseBad = computed(() => {
55046
55090
  const metricStr = this.metric();
55047
55091
  if (!metricStr)
@@ -55072,14 +55116,20 @@ class TargetChangeBadgeComponent {
55072
55116
  : 'bg-purple-50 border-purple-200';
55073
55117
  }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
55074
55118
  this.isIncrease = computed(() => this.percentageChange() > 0, ...(ngDevMode ? [{ debugName: "isIncrease" }] : []));
55119
+ this.targetRotation = computed(() => {
55120
+ const change = this.percentageChange();
55121
+ return change > 0 ? -1 : change < 0 ? 1 : 0;
55122
+ }, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
55123
+ this.rotationStyle = computed(() => {
55124
+ const target = this.targetRotation();
55125
+ return `rotate(${target}deg)`;
55126
+ }, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
55075
55127
  this.containerSizeClasses = computed(() => {
55076
55128
  const compact = this.isCompact();
55077
- const change = this.percentageChange();
55078
- const tiltClass = change > 0 ? '-rotate-1' : change < 0 ? 'rotate-1' : '';
55079
55129
  const baseClasses = 'inline-flex flex-row items-center rounded-xl border-2 overflow-visible transition-transform hover:rotate-0';
55080
55130
  return compact
55081
- ? `${baseClasses} pl-1.5 ${tiltClass}`
55082
- : `${baseClasses} pl-2 ${tiltClass}`;
55131
+ ? `${baseClasses} pl-1.5`
55132
+ : `${baseClasses} pl-2`;
55083
55133
  }, ...(ngDevMode ? [{ debugName: "containerSizeClasses" }] : []));
55084
55134
  this.overlayClasses = computed(() => {
55085
55135
  const dark = this.isDark();
@@ -55090,8 +55140,8 @@ class TargetChangeBadgeComponent {
55090
55140
  this.overlaySizeClasses = computed(() => {
55091
55141
  const compact = this.isCompact();
55092
55142
  return compact
55093
- ? 'px-2 py-1.5 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1 -mr-1 z-10 inline-flex items-center gap-0.5'
55094
- : 'px-2.5 py-2 rounded-lg font-extrabold text-base tracking-wide shadow-md transition-all duration-200 -my-1.5 -mr-1 z-10 inline-flex items-center gap-1';
55143
+ ? 'px-2 py-1.5 rounded-lg text-sm font-extrabold tracking-wide shadow-md transition-all duration-200 -my-1 -mr-1 z-10 inline-flex items-center gap-0.5 tabular-nums'
55144
+ : 'px-2.5 py-2 rounded-lg font-extrabold text-base tracking-wide shadow-md transition-all duration-200 -my-1.5 -mr-1 z-10 inline-flex items-center gap-1 tabular-nums';
55095
55145
  }, ...(ngDevMode ? [{ debugName: "overlaySizeClasses" }] : []));
55096
55146
  this.iconSizeClass = computed(() => {
55097
55147
  return this.isCompact() ? 'text-sm' : 'text-base';
@@ -55102,11 +55152,31 @@ class TargetChangeBadgeComponent {
55102
55152
  ? 'px-2.5 py-0.5 text-xs font-semibold inline-block'
55103
55153
  : 'px-3 py-0.5 font-semibold text-xs inline-block';
55104
55154
  }, ...(ngDevMode ? [{ debugName: "descriptionSizeClasses" }] : []));
55155
+ this.setupIntersectionObserver();
55105
55156
  effect(() => {
55106
55157
  const target = this.percentageChange();
55107
- this.animateValue(target);
55158
+ if (this.hasAnimated()) {
55159
+ this.animateValue(target);
55160
+ }
55108
55161
  });
55109
55162
  }
55163
+ ngOnDestroy() {
55164
+ if (this.observer) {
55165
+ this.observer.disconnect();
55166
+ }
55167
+ }
55168
+ setupIntersectionObserver() {
55169
+ this.observer = new IntersectionObserver((entries) => {
55170
+ entries.forEach((entry) => {
55171
+ if (entry.isIntersecting && !this.hasAnimated()) {
55172
+ this.hasAnimated.set(true);
55173
+ const target = this.percentageChange();
55174
+ this.animateValue(target);
55175
+ }
55176
+ });
55177
+ }, { threshold: 0.1 });
55178
+ this.observer.observe(this.elementRef.nativeElement);
55179
+ }
55110
55180
  animateValue(target) {
55111
55181
  const start = 0;
55112
55182
  const duration = 800;
@@ -55117,14 +55187,15 @@ class TargetChangeBadgeComponent {
55117
55187
  const easeOutQuart = 1 - Math.pow(1 - progress, 4);
55118
55188
  const current = start + (target - start) * easeOutQuart;
55119
55189
  this.animatedValue.set(current);
55190
+ this.animationProgress.set(progress);
55120
55191
  if (progress < 1) {
55121
55192
  requestAnimationFrame(animate);
55122
55193
  }
55123
55194
  };
55124
55195
  requestAnimationFrame(animate);
55125
55196
  }
55126
- static { this.ɵfac = function TargetChangeBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TargetChangeBadgeComponent)(); }; }
55127
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TargetChangeBadgeComponent, selectors: [["symphiq-target-change-badge"]], inputs: { viewMode: [1, "viewMode"], percentageChange: [1, "percentageChange"], metric: [1, "metric"], priorYear: [1, "priorYear"], isCompact: [1, "isCompact"] }, decls: 7, vars: 13, consts: [[3, "ngClass"]], template: function TargetChangeBadgeComponent_Template(rf, ctx) { if (rf & 1) {
55197
+ static { this.ɵfac = function TargetChangeBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TargetChangeBadgeComponent)(i0.ɵɵdirectiveInject(i0.ElementRef)); }; }
55198
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TargetChangeBadgeComponent, selectors: [["symphiq-target-change-badge"]], inputs: { viewMode: [1, "viewMode"], percentageChange: [1, "percentageChange"], metric: [1, "metric"], priorYear: [1, "priorYear"], isCompact: [1, "isCompact"] }, decls: 7, vars: 15, consts: [[3, "ngClass"]], template: function TargetChangeBadgeComponent_Template(rf, ctx) { if (rf & 1) {
55128
55199
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 0)(2, "span");
55129
55200
  i0.ɵɵtext(3);
55130
55201
  i0.ɵɵelementEnd();
@@ -55135,6 +55206,7 @@ class TargetChangeBadgeComponent {
55135
55206
  i0.ɵɵelementEnd()();
55136
55207
  } if (rf & 2) {
55137
55208
  i0.ɵɵclassMap(ctx.containerSizeClasses());
55209
+ i0.ɵɵstyleProp("transform", ctx.rotationStyle());
55138
55210
  i0.ɵɵproperty("ngClass", ctx.containerClasses());
55139
55211
  i0.ɵɵadvance();
55140
55212
  i0.ɵɵclassMap(ctx.overlaySizeClasses());
@@ -55158,20 +55230,24 @@ class TargetChangeBadgeComponent {
55158
55230
  standalone: true,
55159
55231
  imports: [CommonModule],
55160
55232
  changeDetection: ChangeDetectionStrategy.OnPush,
55161
- template: `
55162
- <div [ngClass]="containerClasses()" [class]="containerSizeClasses()">
55163
- <div [ngClass]="overlayClasses()" [class]="overlaySizeClasses()">
55164
- <span [class]="iconSizeClass()">{{ iconSymbol() }}</span>
55165
- {{ animatedPercentageText() }}
55166
- </div>
55167
- <div [class]="descriptionSizeClasses()">
55168
- {{ descriptionText() }}
55169
- </div>
55170
- </div>
55233
+ template: `
55234
+ <div
55235
+ [ngClass]="containerClasses()"
55236
+ [class]="containerSizeClasses()"
55237
+ [style.transform]="rotationStyle()"
55238
+ >
55239
+ <div [ngClass]="overlayClasses()" [class]="overlaySizeClasses()">
55240
+ <span [class]="iconSizeClass()">{{ iconSymbol() }}</span>
55241
+ {{ animatedPercentageText() }}
55242
+ </div>
55243
+ <div [class]="descriptionSizeClasses()">
55244
+ {{ descriptionText() }}
55245
+ </div>
55246
+ </div>
55171
55247
  `
55172
55248
  }]
55173
- }], () => [], { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], percentageChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "percentageChange", required: false }] }], metric: [{ type: i0.Input, args: [{ isSignal: true, alias: "metric", required: false }] }], priorYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "priorYear", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }] }); })();
55174
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TargetChangeBadgeComponent, { className: "TargetChangeBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/target-change-badge.component.ts", lineNumber: 23 }); })();
55249
+ }], () => [{ type: i0.ElementRef }], { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], percentageChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "percentageChange", required: false }] }], metric: [{ type: i0.Input, args: [{ isSignal: true, alias: "metric", required: false }] }], priorYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "priorYear", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }] }); })();
55250
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TargetChangeBadgeComponent, { className: "TargetChangeBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/target-change-badge.component.ts", lineNumber: 27 }); })();
55175
55251
 
55176
55252
  const _forTrack0$j = ($index, $item) => $item.stageMetric.metric;
55177
55253
  const _forTrack1$3 = ($index, $item) => $item.calc.metric;
@@ -56613,8 +56689,9 @@ class LineChartComponent {
56613
56689
  this.showAxisLabels = input(false, ...(ngDevMode ? [{ debugName: "showAxisLabels" }] : []));
56614
56690
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
56615
56691
  this.currencySymbol = input('$', ...(ngDevMode ? [{ debugName: "currencySymbol" }] : []));
56692
+ this.height = input(undefined, ...(ngDevMode ? [{ debugName: "height" }] : []));
56616
56693
  // Memoized computed signals to avoid recalculation on every change detection
56617
- this.chartHeight = computed(() => this.showAxisLabels() ? '500px' : '133px', ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
56694
+ this.chartHeight = computed(() => this.height() ?? (this.showAxisLabels() ? '500px' : '133px'), ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
56618
56695
  this.cursorColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x94a3b8, ...(ngDevMode ? [{ debugName: "cursorColor" }] : []));
56619
56696
  this.tooltipTextColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x000000, ...(ngDevMode ? [{ debugName: "tooltipTextColor" }] : []));
56620
56697
  this.chartHash = computed(() => this.generateChartHash(this.chart()), ...(ngDevMode ? [{ debugName: "chartHash" }] : []));
@@ -57059,7 +57136,7 @@ class LineChartComponent {
57059
57136
  } if (rf & 2) {
57060
57137
  let _t;
57061
57138
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chartDiv = _t.first);
57062
- } }, inputs: { chart: [1, "chart"], showAxisLabels: [1, "showAxisLabels"], viewMode: [1, "viewMode"], currencySymbol: [1, "currencySymbol"] }, decls: 3, vars: 4, consts: [["chartdiv", ""], [1, "chart-container"], [1, "chart", 2, "width", "100%"]], template: function LineChartComponent_Template(rf, ctx) { if (rf & 1) {
57139
+ } }, inputs: { chart: [1, "chart"], showAxisLabels: [1, "showAxisLabels"], viewMode: [1, "viewMode"], currencySymbol: [1, "currencySymbol"], height: [1, "height"] }, decls: 3, vars: 4, consts: [["chartdiv", ""], [1, "chart-container"], [1, "chart", 2, "width", "100%"]], template: function LineChartComponent_Template(rf, ctx) { if (rf & 1) {
57063
57140
  i0.ɵɵdomElementStart(0, "div", 1);
57064
57141
  i0.ɵɵdomElement(1, "div", 2, 0);
57065
57142
  i0.ɵɵdomElementEnd();
@@ -57076,7 +57153,7 @@ class LineChartComponent {
57076
57153
  <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
57077
57154
  </div>
57078
57155
  `, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
57079
- }], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], chartDiv: [{
57156
+ }], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], chartDiv: [{
57080
57157
  type: ViewChild,
57081
57158
  args: ['chartdiv', { static: true }]
57082
57159
  }] }); })();
@@ -57370,16 +57447,16 @@ function MetricReportModalComponent_Conditional_0_Conditional_12_Template(rf, ct
57370
57447
  i0.ɵɵelementEnd()();
57371
57448
  } if (rf & 2) {
57372
57449
  const ctx_r1 = i0.ɵɵnextContext(2);
57373
- i0.ɵɵproperty("ngClass", ctx_r1.headerInfoIconClasses())("libSymphiqTooltip", ctx_r1.metricData().description);
57450
+ i0.ɵɵproperty("ngClass", ctx_r1.headerInfoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(ctx_r1.metricData().description, ctx_r1.metricTitle()));
57374
57451
  } }
57375
- function MetricReportModalComponent_Conditional_0_Conditional_32_Template(rf, ctx) { if (rf & 1) {
57452
+ function MetricReportModalComponent_Conditional_0_Conditional_31_Template(rf, ctx) { if (rf & 1) {
57376
57453
  i0.ɵɵelement(0, "symphiq-target-change-badge", 23);
57377
57454
  } if (rf & 2) {
57378
57455
  let tmp_4_0;
57379
57456
  const ctx_r1 = i0.ɵɵnextContext(2);
57380
57457
  i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("percentageChange", ctx_r1.ytdChangePercentage())("metric", ((tmp_4_0 = ctx_r1.metricData()) == null ? null : tmp_4_0.metric) || "")("priorYear", ctx_r1.priorYear())("isCompact", true);
57381
57458
  } }
57382
- function MetricReportModalComponent_Conditional_0_Conditional_48_Template(rf, ctx) { if (rf & 1) {
57459
+ function MetricReportModalComponent_Conditional_0_Conditional_47_Template(rf, ctx) { if (rf & 1) {
57383
57460
  i0.ɵɵelementStart(0, "div")(1, "p", 24);
57384
57461
  i0.ɵɵtext(2);
57385
57462
  i0.ɵɵelementEnd();
@@ -57402,6 +57479,19 @@ function MetricReportModalComponent_Conditional_0_Conditional_48_Template(rf, ct
57402
57479
  i0.ɵɵadvance();
57403
57480
  i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", ctx_r1.pacingInfo().pacingPercentage)("status", ctx_r1.pacingInfo().status)("showAsFullText", false)("isCompact", true)("showEmphasizedPercentage", true);
57404
57481
  } }
57482
+ function MetricReportModalComponent_Conditional_0_Conditional_53_Template(rf, ctx) { if (rf & 1) {
57483
+ i0.ɵɵelementStart(0, "div")(1, "p", 24);
57484
+ i0.ɵɵtext(2, " Year-over-Year Trend ");
57485
+ i0.ɵɵelementEnd();
57486
+ i0.ɵɵelement(3, "symphiq-area-chart", 35);
57487
+ i0.ɵɵelementEnd();
57488
+ } if (rf & 2) {
57489
+ const ctx_r1 = i0.ɵɵnextContext(2);
57490
+ i0.ɵɵadvance();
57491
+ i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57492
+ i0.ɵɵadvance(2);
57493
+ i0.ɵɵproperty("chart", ctx_r1.trendChartData())("showAxisLabels", false)("viewMode", ctx_r1.viewMode())("currencySymbol", "$")("height", "80px");
57494
+ } }
57405
57495
  function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ctx) { if (rf & 1) {
57406
57496
  i0.ɵɵelementStart(0, "div", 25);
57407
57497
  i0.ɵɵelement(1, "symphiq-pacing-status-badge", 34);
@@ -57409,7 +57499,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ct
57409
57499
  i0.ɵɵelementStart(2, "div", 25)(3, "p", 28);
57410
57500
  i0.ɵɵtext(4);
57411
57501
  i0.ɵɵelementEnd()();
57412
- i0.ɵɵelement(5, "symphiq-progress-to-target-chart", 35);
57502
+ i0.ɵɵelement(5, "symphiq-progress-to-target-chart", 36);
57413
57503
  } if (rf & 2) {
57414
57504
  const ctx_r1 = i0.ɵɵnextContext(2);
57415
57505
  i0.ɵɵadvance();
@@ -57422,7 +57512,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ct
57422
57512
  i0.ɵɵproperty("data", ctx_r1.progressToTargetData())("viewMode", ctx_r1.viewMode());
57423
57513
  } }
57424
57514
  function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template(rf, ctx) { if (rf & 1) {
57425
- i0.ɵɵelementStart(0, "button", 45);
57515
+ i0.ɵɵelementStart(0, "button", 11);
57426
57516
  i0.ɵɵnamespaceSVG();
57427
57517
  i0.ɵɵelementStart(1, "svg", 51);
57428
57518
  i0.ɵɵelement(2, "path", 33);
@@ -57433,15 +57523,15 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditio
57433
57523
  i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(metric_r3.description, ctx_r1.getMetricTitle(metric_r3)));
57434
57524
  } }
57435
57525
  function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Template(rf, ctx) { if (rf & 1) {
57436
- i0.ɵɵelementStart(0, "tr", 41)(1, "td", 42)(2, "div", 43)(3, "span", 44);
57526
+ i0.ɵɵelementStart(0, "tr", 42)(1, "td", 43)(2, "div", 44)(3, "span", 45);
57437
57527
  i0.ɵɵtext(4);
57438
57528
  i0.ɵɵelementEnd();
57439
- i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button", 45);
57529
+ i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button", 11);
57440
57530
  i0.ɵɵelementEnd()();
57441
57531
  i0.ɵɵelementStart(6, "td", 46)(7, "span", 47);
57442
57532
  i0.ɵɵtext(8);
57443
57533
  i0.ɵɵelementEnd()();
57444
- i0.ɵɵelementStart(9, "td", 46)(10, "div", 48)(11, "span", 44);
57534
+ i0.ɵɵelementStart(9, "td", 46)(10, "div", 48)(11, "span", 45);
57445
57535
  i0.ɵɵtext(12);
57446
57536
  i0.ɵɵelementEnd();
57447
57537
  i0.ɵɵnamespaceSVG();
@@ -57469,17 +57559,17 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_Template(rf, ct
57469
57559
  i0.ɵɵelementStart(0, "div", 16)(1, "h4", 17);
57470
57560
  i0.ɵɵtext(2, " Contributing Metric Targets ");
57471
57561
  i0.ɵɵelementEnd();
57472
- i0.ɵɵelementStart(3, "div", 36)(4, "table", 37)(5, "thead")(6, "tr", 38)(7, "th", 39);
57562
+ i0.ɵɵelementStart(3, "div", 37)(4, "table", 38)(5, "thead")(6, "tr", 39)(7, "th", 40);
57473
57563
  i0.ɵɵtext(8, "Metric");
57474
57564
  i0.ɵɵelementEnd();
57475
- i0.ɵɵelementStart(9, "th", 40);
57565
+ i0.ɵɵelementStart(9, "th", 41);
57476
57566
  i0.ɵɵtext(10, "Target");
57477
57567
  i0.ɵɵelementEnd();
57478
- i0.ɵɵelementStart(11, "th", 40);
57568
+ i0.ɵɵelementStart(11, "th", 41);
57479
57569
  i0.ɵɵtext(12, "Improve by");
57480
57570
  i0.ɵɵelementEnd()()();
57481
57571
  i0.ɵɵelementStart(13, "tbody");
57482
- i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Template, 15, 7, "tr", 41, _forTrack0$i);
57572
+ i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Template, 15, 7, "tr", 42, _forTrack0$i);
57483
57573
  i0.ɵɵelementEnd()()()();
57484
57574
  } if (rf & 2) {
57485
57575
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -57496,15 +57586,15 @@ function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ct
57496
57586
  i0.ɵɵtext(2, " Pace ");
57497
57587
  i0.ɵɵelementEnd();
57498
57588
  i0.ɵɵelementStart(3, "div", 52);
57499
- i0.ɵɵelement(4, "symphiq-line-chart", 53);
57589
+ i0.ɵɵelement(4, "symphiq-line-chart", 35);
57500
57590
  i0.ɵɵelementEnd();
57501
- i0.ɵɵelementStart(5, "p", 54);
57591
+ i0.ɵɵelementStart(5, "p", 53);
57502
57592
  i0.ɵɵtext(6);
57503
57593
  i0.ɵɵelementEnd();
57504
- i0.ɵɵelementStart(7, "p", 55);
57594
+ i0.ɵɵelementStart(7, "p", 54);
57505
57595
  i0.ɵɵtext(8);
57506
57596
  i0.ɵɵelementEnd();
57507
- i0.ɵɵelementStart(9, "p", 55);
57597
+ i0.ɵɵelementStart(9, "p", 54);
57508
57598
  i0.ɵɵtext(10);
57509
57599
  i0.ɵɵelementEnd()();
57510
57600
  } if (rf & 2) {
@@ -57513,7 +57603,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ct
57513
57603
  i0.ɵɵadvance();
57514
57604
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
57515
57605
  i0.ɵɵadvance(3);
57516
- i0.ɵɵproperty("chart", ctx_r1.pacingChartData())("showAxisLabels", true)("viewMode", ctx_r1.viewMode())("currencySymbol", "$");
57606
+ i0.ɵɵproperty("chart", ctx_r1.pacingChartData())("showAxisLabels", true)("viewMode", ctx_r1.viewMode())("currencySymbol", "$")("height", "250px");
57517
57607
  i0.ɵɵadvance();
57518
57608
  i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
57519
57609
  i0.ɵɵadvance();
@@ -57550,50 +57640,50 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57550
57640
  i0.ɵɵelement(15, "path", 14);
57551
57641
  i0.ɵɵelementEnd()()()();
57552
57642
  i0.ɵɵnamespaceHTML();
57553
- i0.ɵɵelementStart(16, "div", 15);
57554
- i0.ɵɵelement(17, "symphiq-tooltip-container");
57555
- i0.ɵɵelementStart(18, "div", 16)(19, "h4", 17);
57556
- i0.ɵɵtext(20, " At a Glance ");
57643
+ i0.ɵɵelementStart(16, "div", 15)(17, "div", 16)(18, "h4", 17);
57644
+ i0.ɵɵtext(19, " At a Glance ");
57557
57645
  i0.ɵɵelementEnd();
57558
- i0.ɵɵelementStart(21, "div", 18)(22, "div")(23, "div", 19)(24, "p", 20);
57559
- i0.ɵɵtext(25, " Year to date ");
57646
+ i0.ɵɵelementStart(20, "div", 18)(21, "div")(22, "div", 19)(23, "p", 20);
57647
+ i0.ɵɵtext(24, " Year to date ");
57560
57648
  i0.ɵɵelementEnd();
57561
- i0.ɵɵelementStart(26, "p", 21);
57562
- i0.ɵɵtext(27);
57649
+ i0.ɵɵelementStart(25, "p", 21);
57650
+ i0.ɵɵtext(26);
57563
57651
  i0.ɵɵelementEnd();
57564
- i0.ɵɵelementStart(28, "p", 21);
57565
- i0.ɵɵtext(29);
57652
+ i0.ɵɵelementStart(27, "p", 21);
57653
+ i0.ɵɵtext(28);
57566
57654
  i0.ɵɵelementEnd()();
57567
- i0.ɵɵelementStart(30, "p", 22);
57568
- i0.ɵɵtext(31);
57655
+ i0.ɵɵelementStart(29, "p", 22);
57656
+ i0.ɵɵtext(30);
57569
57657
  i0.ɵɵelementEnd();
57570
- i0.ɵɵconditionalCreate(32, MetricReportModalComponent_Conditional_0_Conditional_32_Template, 1, 5, "symphiq-target-change-badge", 23);
57658
+ i0.ɵɵconditionalCreate(31, MetricReportModalComponent_Conditional_0_Conditional_31_Template, 1, 5, "symphiq-target-change-badge", 23);
57571
57659
  i0.ɵɵelementEnd();
57572
- i0.ɵɵelementStart(33, "div")(34, "div", 19)(35, "p", 20);
57573
- i0.ɵɵtext(36, " Same period last year ");
57660
+ i0.ɵɵelementStart(32, "div")(33, "div", 19)(34, "p", 20);
57661
+ i0.ɵɵtext(35, " Same period last year ");
57574
57662
  i0.ɵɵelementEnd();
57575
- i0.ɵɵelementStart(37, "p", 21);
57576
- i0.ɵɵtext(38);
57663
+ i0.ɵɵelementStart(36, "p", 21);
57664
+ i0.ɵɵtext(37);
57577
57665
  i0.ɵɵelementEnd();
57578
- i0.ɵɵelementStart(39, "p", 21);
57579
- i0.ɵɵtext(40);
57666
+ i0.ɵɵelementStart(38, "p", 21);
57667
+ i0.ɵɵtext(39);
57580
57668
  i0.ɵɵelementEnd()();
57581
- i0.ɵɵelementStart(41, "p", 10);
57582
- i0.ɵɵtext(42);
57669
+ i0.ɵɵelementStart(40, "p", 10);
57670
+ i0.ɵɵtext(41);
57583
57671
  i0.ɵɵelementEnd()();
57584
- i0.ɵɵelementStart(43, "div")(44, "p", 24);
57585
- i0.ɵɵtext(45);
57672
+ i0.ɵɵelementStart(42, "div")(43, "p", 24);
57673
+ i0.ɵɵtext(44);
57586
57674
  i0.ɵɵelementEnd();
57587
- i0.ɵɵelementStart(46, "p", 10);
57588
- i0.ɵɵtext(47);
57675
+ i0.ɵɵelementStart(45, "p", 10);
57676
+ i0.ɵɵtext(46);
57589
57677
  i0.ɵɵelementEnd()();
57590
- i0.ɵɵconditionalCreate(48, MetricReportModalComponent_Conditional_0_Conditional_48_Template, 6, 10, "div");
57591
- i0.ɵɵelementStart(49, "div")(50, "p", 24);
57592
- i0.ɵɵtext(51);
57678
+ i0.ɵɵconditionalCreate(47, MetricReportModalComponent_Conditional_0_Conditional_47_Template, 6, 10, "div");
57679
+ i0.ɵɵelementStart(48, "div")(49, "p", 24);
57680
+ i0.ɵɵtext(50);
57593
57681
  i0.ɵɵelementEnd();
57594
- i0.ɵɵelementStart(52, "p", 10);
57595
- i0.ɵɵtext(53);
57596
- i0.ɵɵelementEnd()()()();
57682
+ i0.ɵɵelementStart(51, "p", 10);
57683
+ i0.ɵɵtext(52);
57684
+ i0.ɵɵelementEnd()();
57685
+ i0.ɵɵconditionalCreate(53, MetricReportModalComponent_Conditional_0_Conditional_53_Template, 4, 6, "div");
57686
+ i0.ɵɵelementEnd()();
57597
57687
  i0.ɵɵelementStart(54, "div", 16)(55, "h4", 17);
57598
57688
  i0.ɵɵtext(56, " Target Analysis ");
57599
57689
  i0.ɵɵelementEnd();
@@ -57609,7 +57699,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57609
57699
  i0.ɵɵconditionalCreate(64, MetricReportModalComponent_Conditional_0_Conditional_64_Template, 6, 10);
57610
57700
  i0.ɵɵelementEnd();
57611
57701
  i0.ɵɵconditionalCreate(65, MetricReportModalComponent_Conditional_0_Conditional_65_Template, 16, 3, "div", 16);
57612
- i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11, 12, "div", 29);
57702
+ i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11, 13, "div", 29);
57613
57703
  i0.ɵɵelementEnd();
57614
57704
  i0.ɵɵelementStart(67, "div", 30)(68, "button", 31);
57615
57705
  i0.ɵɵlistener("click", function MetricReportModalComponent_Conditional_0_Template_button_click_68_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
@@ -57621,8 +57711,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57621
57711
  let tmp_27_0;
57622
57712
  let tmp_31_0;
57623
57713
  let tmp_36_0;
57624
- let tmp_41_0;
57625
- let tmp_43_0;
57714
+ let tmp_42_0;
57715
+ let tmp_44_0;
57626
57716
  const ctx_r1 = i0.ɵɵnextContext();
57627
57717
  i0.ɵɵadvance(2);
57628
57718
  i0.ɵɵproperty("ngClass", ctx_r1.backdropClasses())("@fadeIn", undefined);
@@ -57640,7 +57730,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57640
57730
  i0.ɵɵproperty("ngClass", ctx_r1.closeButtonClasses());
57641
57731
  i0.ɵɵadvance(3);
57642
57732
  i0.ɵɵproperty("ngClass", ctx_r1.contentClasses());
57643
- i0.ɵɵadvance(2);
57733
+ i0.ɵɵadvance();
57644
57734
  i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
57645
57735
  i0.ɵɵadvance();
57646
57736
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
@@ -57659,7 +57749,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57659
57749
  i0.ɵɵadvance();
57660
57750
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(ctx_r1.ytdValue(), ((tmp_19_0 = ctx_r1.metricData()) == null ? null : tmp_19_0.metric) || ""), " ");
57661
57751
  i0.ɵɵadvance();
57662
- i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ? 32 : -1);
57752
+ i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ? 31 : -1);
57663
57753
  i0.ɵɵadvance(3);
57664
57754
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57665
57755
  i0.ɵɵadvance(2);
@@ -57683,7 +57773,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57683
57773
  i0.ɵɵadvance();
57684
57774
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_31_0 = ctx_r1.metricData()) == null ? null : tmp_31_0.currentValue) || 0, ((tmp_31_0 = ctx_r1.metricData()) == null ? null : tmp_31_0.metric) || ""), " ");
57685
57775
  i0.ɵɵadvance();
57686
- i0.ɵɵconditional(ctx_r1.pacingInfo() ? 48 : -1);
57776
+ i0.ɵɵconditional(ctx_r1.pacingInfo() ? 47 : -1);
57687
57777
  i0.ɵɵadvance(2);
57688
57778
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57689
57779
  i0.ɵɵadvance();
@@ -57693,6 +57783,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57693
57783
  i0.ɵɵadvance();
57694
57784
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_36_0 = ctx_r1.metricData()) == null ? null : tmp_36_0.targetValue) || 0, ((tmp_36_0 = ctx_r1.metricData()) == null ? null : tmp_36_0.metric) || "", false), " ");
57695
57785
  i0.ɵɵadvance();
57786
+ i0.ɵɵconditional(ctx_r1.trendChartData() ? 53 : -1);
57787
+ i0.ɵɵadvance();
57696
57788
  i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
57697
57789
  i0.ɵɵadvance();
57698
57790
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
@@ -57701,11 +57793,11 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57701
57793
  i0.ɵɵadvance(2);
57702
57794
  i0.ɵɵproperty("ngClass", ctx_r1.targetValueClasses());
57703
57795
  i0.ɵɵadvance();
57704
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_41_0 = ctx_r1.metricData()) == null ? null : tmp_41_0.targetValue) || 0, ((tmp_41_0 = ctx_r1.metricData()) == null ? null : tmp_41_0.metric) || "", false), " ");
57796
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_42_0 = ctx_r1.metricData()) == null ? null : tmp_42_0.targetValue) || 0, ((tmp_42_0 = ctx_r1.metricData()) == null ? null : tmp_42_0.metric) || "", false), " ");
57705
57797
  i0.ɵɵadvance();
57706
57798
  i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
57707
57799
  i0.ɵɵadvance();
57708
- i0.ɵɵtextInterpolate4(" Your target represents a ", ctx_r1.formatPercentage(ctx_r1.Math.abs(((tmp_43_0 = ctx_r1.metricData()) == null ? null : tmp_43_0.percentageIncrease) || 0), 1), " ", (((tmp_43_0 = ctx_r1.metricData()) == null ? null : tmp_43_0.percentageIncrease) || 0) >= 0 ? "increase" : "decrease", " from your ", ctx_r1.priorYear(), " actual of ", ctx_r1.formatMetricValue(((tmp_43_0 = ctx_r1.metricData()) == null ? null : tmp_43_0.currentValue) || 0, ((tmp_43_0 = ctx_r1.metricData()) == null ? null : tmp_43_0.metric) || ""), ". ");
57800
+ i0.ɵɵtextInterpolate4(" Your target represents a ", ctx_r1.formatPercentage(ctx_r1.Math.abs(((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.percentageIncrease) || 0), 1), " ", (((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.percentageIncrease) || 0) >= 0 ? "increase" : "decrease", " from your ", ctx_r1.priorYear(), " actual of ", ctx_r1.formatMetricValue(((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.currentValue) || 0, ((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.metric) || ""), ". ");
57709
57801
  i0.ɵɵadvance();
57710
57802
  i0.ɵɵconditional(ctx_r1.pacingInfo() ? 64 : -1);
57711
57803
  i0.ɵɵadvance();
@@ -57724,6 +57816,7 @@ class MetricReportModalComponent {
57724
57816
  this.metricData = input(undefined, ...(ngDevMode ? [{ debugName: "metricData" }] : []));
57725
57817
  this.contributingMetrics = input([], ...(ngDevMode ? [{ debugName: "contributingMetrics" }] : []));
57726
57818
  this.pacingMetrics = input(undefined, ...(ngDevMode ? [{ debugName: "pacingMetrics" }] : []));
57819
+ this.trendChartData = input(null, ...(ngDevMode ? [{ debugName: "trendChartData" }] : []));
57727
57820
  this.isOpen = input(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
57728
57821
  this.closed = output();
57729
57822
  this.showDefinition = signal(false, ...(ngDevMode ? [{ debugName: "showDefinition" }] : []));
@@ -57881,7 +57974,7 @@ class MetricReportModalComponent {
57881
57974
  const metric = this.metricTitle();
57882
57975
  const currentYear = this.currentYear();
57883
57976
  const priorYear = this.priorYear();
57884
- return `This chart shows the ${metric} performance trend for ${currentYear} (solid line), compared to ${priorYear} (dashed line), with the target projection (dotted line) for the remainder of the year.`;
57977
+ return `This chart shows the ${metric} performance trend for ${currentYear} (solid yellow line, this month includes projections for the remaining days of the month), compared to ${priorYear} (dashed green line), with the target projection (dotted blue line) for the remainder of the year.`;
57885
57978
  }, ...(ngDevMode ? [{ debugName: "chartLegendDescription" }] : []));
57886
57979
  this.chartDescriptionSentence1 = computed(() => {
57887
57980
  const metricData = this.metricData();
@@ -57916,7 +58009,7 @@ class MetricReportModalComponent {
57916
58009
  lineChartData: {
57917
58010
  series: [
57918
58011
  {
57919
- name: 'Target Projection',
58012
+ name: '2026 Projected',
57920
58013
  data: projectionData
57921
58014
  },
57922
58015
  {
@@ -58138,15 +58231,15 @@ class MetricReportModalComponent {
58138
58231
  : 'bg-slate-700 hover:bg-slate-600 text-white';
58139
58232
  }
58140
58233
  static { this.ɵfac = function MetricReportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricReportModalComponent)(); }; }
58141
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricReportModalComponent, selectors: [["symphiq-metric-report-modal"]], inputs: { viewMode: [1, "viewMode"], metricEnum: [1, "metricEnum"], metricData: [1, "metricData"], contributingMetrics: [1, "contributingMetrics"], pacingMetrics: [1, "pacingMetrics"], isOpen: [1, "isOpen"] }, outputs: { closed: "closed" }, decls: 1, vars: 1, consts: [[1, "fixed", "inset-0", "overflow-y-auto", "z-50"], [1, "fixed", "inset-0", "overflow-y-auto", "z-50", 3, "click"], [1, "flex", "items-center", "justify-center", "min-h-screen", "px-4", "pt-4", "pb-20", "text-center", "sm:block", "sm:p-0"], ["aria-hidden", "true", 1, "fixed", "inset-0", "backdrop-blur-md", 3, "ngClass"], ["aria-hidden", "true", 1, "hidden", "sm:inline-block", "sm:align-middle", "sm:h-screen"], [1, "relative", "inline-block", "align-bottom", "rounded-2xl", "text-left", "overflow-hidden", "shadow-xl", "sm:my-8", "sm:align-middle", "sm:w-full", "sm:max-w-4xl", "border", "backdrop-blur-xl", 3, "click", "ngClass"], [1, "px-6", "py-5", "border-b", "backdrop-blur-sm", "sticky", "top-0", "z-10", 3, "ngClass"], [1, "flex", "items-start", "justify-between"], [1, "flex-1"], [1, "flex", "items-center", "gap-3", "mb-2"], [1, "text-xl", "font-bold", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-7", "h-7", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", "self-center", 3, "ngClass", "libSymphiqTooltip"], [1, "ml-4", "transition-all", "rounded-lg", "p-1", "hover:scale-110", "active:scale-90", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "px-6", "py-6", "max-h-[70vh]", "overflow-y-auto", "backdrop-blur-sm", 3, "ngClass"], [1, "rounded-xl", "p-6", "mb-6", 3, "ngClass"], [1, "text-sm", "font-semibold", "uppercase", "tracking-wider", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-6"], [1, "mb-1.5"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-xs", 3, "ngClass"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-3xl", "font-extrabold", "mb-3", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "rounded-xl", "p-6", 3, "ngClass"], [1, "px-6", "py-4", "border-t", 3, "ngClass"], [1, "w-full", "px-4", "py-2", "rounded-lg", "transition-all", "font-medium", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "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", "isCompact", "showEmphasizedPercentage"], [3, "data", "viewMode"], [1, "overflow-x-auto"], [1, "w-full"], [1, "border-b", 3, "ngClass"], [1, "text-left", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "text-right", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "border-b", "transition-colors", 3, "ngClass"], [1, "py-3", "px-4"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium"], ["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, "py-3", "px-4", "text-right"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "justify-end", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "text-emerald-500"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3"], [1, "min-h-[400px]"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol"], [1, "text-sm", "leading-relaxed", "mt-4", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mt-2", 3, "ngClass"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
58142
- i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 70, 51, "div", 0);
58234
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricReportModalComponent, selectors: [["symphiq-metric-report-modal"]], inputs: { viewMode: [1, "viewMode"], metricEnum: [1, "metricEnum"], metricData: [1, "metricData"], contributingMetrics: [1, "contributingMetrics"], pacingMetrics: [1, "pacingMetrics"], trendChartData: [1, "trendChartData"], isOpen: [1, "isOpen"] }, outputs: { closed: "closed" }, decls: 1, vars: 1, consts: [[1, "fixed", "inset-0", "overflow-y-auto", "z-50"], [1, "fixed", "inset-0", "overflow-y-auto", "z-50", 3, "click"], [1, "flex", "items-center", "justify-center", "min-h-screen", "px-4", "pt-4", "pb-20", "text-center", "sm:block", "sm:p-0"], ["aria-hidden", "true", 1, "fixed", "inset-0", "backdrop-blur-md", 3, "ngClass"], ["aria-hidden", "true", 1, "hidden", "sm:inline-block", "sm:align-middle", "sm:h-screen"], [1, "relative", "inline-block", "align-bottom", "rounded-2xl", "text-left", "overflow-hidden", "shadow-xl", "sm:my-8", "sm:align-middle", "sm:w-full", "sm:max-w-4xl", "border", "backdrop-blur-xl", 3, "click", "ngClass"], [1, "px-6", "py-5", "border-b", "backdrop-blur-sm", "sticky", "top-0", "z-10", 3, "ngClass"], [1, "flex", "items-start", "justify-between"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-2"], [1, "text-xl", "font-bold", 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, "ml-4", "transition-all", "rounded-lg", "p-1", "hover:scale-110", "active:scale-90", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "px-6", "py-6", "max-h-[70vh]", "overflow-y-auto", "backdrop-blur-sm", 3, "ngClass"], [1, "rounded-xl", "p-6", "mb-6", 3, "ngClass"], [1, "text-sm", "font-semibold", "uppercase", "tracking-wider", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-6"], [1, "mb-1.5"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-xs", 3, "ngClass"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-3xl", "font-extrabold", "mb-3", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "rounded-xl", "p-6", 3, "ngClass"], [1, "px-6", "py-4", "border-t", 3, "ngClass"], [1, "w-full", "px-4", "py-2", "rounded-lg", "transition-all", "font-medium", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], ["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", "isCompact", "showEmphasizedPercentage"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol", "height"], [3, "data", "viewMode"], [1, "overflow-x-auto"], [1, "w-full"], [1, "border-b", 3, "ngClass"], [1, "text-left", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "text-right", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "border-b", "transition-colors", 3, "ngClass"], [1, "py-3", "px-4"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium"], [1, "py-3", "px-4", "text-right"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "justify-end", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "text-emerald-500"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3"], [1, "min-h-[250px]"], [1, "text-sm", "leading-relaxed", "mt-4", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mt-2", 3, "ngClass"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
58235
+ i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 70, 52, "div", 0);
58143
58236
  } if (rf & 2) {
58144
58237
  i0.ɵɵconditional(ctx.isOpen() ? 0 : -1);
58145
58238
  } }, dependencies: [CommonModule, i1$1.NgClass, PacingStatusBadgeComponent,
58146
58239
  TargetChangeBadgeComponent,
58147
58240
  TooltipDirective,
58148
- TooltipContainerComponent,
58149
58241
  LineChartComponent,
58242
+ AreaChartComponent,
58150
58243
  ProgressToTargetChartComponent], encapsulation: 2, data: { animation: [
58151
58244
  trigger('fadeIn', [
58152
58245
  transition(':enter', [
@@ -58172,8 +58265,8 @@ class MetricReportModalComponent {
58172
58265
  PacingStatusBadgeComponent,
58173
58266
  TargetChangeBadgeComponent,
58174
58267
  TooltipDirective,
58175
- TooltipContainerComponent,
58176
58268
  LineChartComponent,
58269
+ AreaChartComponent,
58177
58270
  ProgressToTargetChartComponent
58178
58271
  ],
58179
58272
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -58214,7 +58307,7 @@ class MetricReportModalComponent {
58214
58307
  <div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
58215
58308
  <div class="flex items-start justify-between">
58216
58309
  <div class="flex-1">
58217
- <div class="flex items-center gap-3 mb-2">
58310
+ <div class="flex items-center gap-2 mb-2">
58218
58311
  <h3 [ngClass]="titleClasses()" class="text-xl font-bold">
58219
58312
  {{ metricTitle() }}
58220
58313
  </h3>
@@ -58222,11 +58315,11 @@ class MetricReportModalComponent {
58222
58315
  <button
58223
58316
  type="button"
58224
58317
  [ngClass]="headerInfoIconClasses()"
58225
- class="flex-shrink-0 w-7 h-7 rounded-full inline-flex items-center justify-center transition-colors self-center"
58226
- [libSymphiqTooltip]="metricData()!.description!"
58318
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
58319
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metricData()!.description!, metricTitle())"
58227
58320
  tooltipType="markdown"
58228
58321
  tooltipPosition="right">
58229
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58322
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58230
58323
  <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" />
58231
58324
  </svg>
58232
58325
  </button>
@@ -58246,8 +58339,6 @@ class MetricReportModalComponent {
58246
58339
 
58247
58340
  <!-- Content -->
58248
58341
  <div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
58249
- <symphiq-tooltip-container />
58250
-
58251
58342
  <!-- At a Glance Summary -->
58252
58343
  <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58253
58344
  <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
@@ -58338,6 +58429,22 @@ class MetricReportModalComponent {
58338
58429
  {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
58339
58430
  </p>
58340
58431
  </div>
58432
+
58433
+ <!-- Year-over-Year Trend Chart -->
58434
+ @if (trendChartData()) {
58435
+ <div>
58436
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58437
+ Year-over-Year Trend
58438
+ </p>
58439
+ <symphiq-area-chart
58440
+ [chart]="trendChartData()!"
58441
+ [showAxisLabels]="false"
58442
+ [viewMode]="viewMode()"
58443
+ [currencySymbol]="'$'"
58444
+ [height]="'80px'"
58445
+ />
58446
+ </div>
58447
+ }
58341
58448
  </div>
58342
58449
  </div>
58343
58450
 
@@ -58461,12 +58568,13 @@ class MetricReportModalComponent {
58461
58568
  <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58462
58569
  Pace
58463
58570
  </h4>
58464
- <div class="min-h-[400px]">
58571
+ <div class="min-h-[250px]">
58465
58572
  <symphiq-line-chart
58466
58573
  [chart]="pacingChartData()!"
58467
58574
  [showAxisLabels]="true"
58468
58575
  [viewMode]="viewMode()"
58469
58576
  [currencySymbol]="'$'"
58577
+ [height]="'250px'"
58470
58578
  />
58471
58579
  </div>
58472
58580
  <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
@@ -58497,8 +58605,8 @@ class MetricReportModalComponent {
58497
58605
  }
58498
58606
  `
58499
58607
  }]
58500
- }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], metricEnum: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricEnum", required: false }] }], metricData: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricData", required: false }] }], contributingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "contributingMetrics", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] }); })();
58501
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 349 }); })();
58608
+ }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], metricEnum: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricEnum", required: false }] }], metricData: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricData", required: false }] }], contributingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "contributingMetrics", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], trendChartData: [{ type: i0.Input, args: [{ isSignal: true, alias: "trendChartData", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] }); })();
58609
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 364 }); })();
58502
58610
 
58503
58611
  const _c0$q = ["absoluteInputRef"];
58504
58612
  const _c1$b = ["percentageInputRef"];
@@ -58826,7 +58934,7 @@ function InitialTargetSettingComponent_Conditional_37_Conditional_4_Template(rf,
58826
58934
  i0.ɵɵelement(0, "symphiq-area-chart", 23);
58827
58935
  } if (rf & 2) {
58828
58936
  const ctx_r0 = i0.ɵɵnextContext(2);
58829
- i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "320px");
58937
+ i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "200px");
58830
58938
  } }
58831
58939
  function InitialTargetSettingComponent_Conditional_37_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58832
58940
  i0.ɵɵelementStart(0, "div", 24)(1, "p", 50);
@@ -59448,7 +59556,7 @@ class InitialTargetSettingComponent {
59448
59556
  let _t;
59449
59557
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
59450
59558
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
59451
- } }, 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"], targets: [1, "targets"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 43, vars: 50, consts: [["absoluteInputRef", ""], ["percentageInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "click", "ngClass"], [1, "flex", "items-center", "justify-between", "mb-6"], [1, "text-2xl", "font-bold", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "chevron-rotate-expanded", "ngClass"], [1, "flex", "flex-col", "gap-4"], [1, "grid", "lg:grid-cols-2", "gap-4"], [1, "p-6", "rounded-xl", "border-2", 3, "click", "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", 3, "ngClass", "h-full"], [1, "w-full"], [1, "metrics-section-enter"], [1, "metrics-section-content"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [3, "submitClick", "cancelClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText", "showCancelButton"], [3, "closed", "viewMode", "metricEnum", "metricData", "contributingMetrics", "pacingMetrics", "isOpen"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"], [1, "flex", "items-center", "gap-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, "click", "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, "flex", "gap-2"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "flex", "justify-end"], [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, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "font-bold", "transition-all", "duration-300", "text-lg", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "ngClass"], [1, "details-collapse"], [1, "details-collapse-content"], [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-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [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"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewStageReport", "viewRelatedMetricReport", "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
59559
+ } }, 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"], targets: [1, "targets"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 43, vars: 51, consts: [["absoluteInputRef", ""], ["percentageInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "click", "ngClass"], [1, "flex", "items-center", "justify-between", "mb-6"], [1, "text-2xl", "font-bold", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "chevron-rotate-expanded", "ngClass"], [1, "flex", "flex-col", "gap-4"], [1, "grid", "lg:grid-cols-2", "gap-4"], [1, "p-6", "rounded-xl", "border-2", 3, "click", "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", 3, "ngClass", "h-full"], [1, "w-full"], [1, "metrics-section-enter"], [1, "metrics-section-content"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [3, "submitClick", "cancelClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText", "showCancelButton"], [3, "closed", "viewMode", "metricEnum", "metricData", "contributingMetrics", "pacingMetrics", "trendChartData", "isOpen"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"], [1, "flex", "items-center", "gap-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, "click", "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, "flex", "gap-2"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "flex", "justify-end"], [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, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "font-bold", "transition-all", "duration-300", "text-lg", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "ngClass"], [1, "details-collapse"], [1, "details-collapse-content"], [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-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [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"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewStageReport", "viewRelatedMetricReport", "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
59452
59560
  i0.ɵɵelementStart(0, "div", 2);
59453
59561
  i0.ɵɵelement(1, "symphiq-tooltip-container");
59454
59562
  i0.ɵɵelementStart(2, "div", 3);
@@ -59548,7 +59656,7 @@ class InitialTargetSettingComponent {
59548
59656
  i0.ɵɵadvance();
59549
59657
  i0.ɵɵproperty("viewMode", ctx.viewMode())("isValid", ctx.isValid())("isSubmitting", ctx.isCalculating())("validationMessage", ctx.validationMessage())("buttonText", ctx.submitButtonText())("showCancelButton", ctx.calculationState() === "input" && ctx.hasStoredResponse());
59550
59658
  i0.ɵɵadvance();
59551
- i0.ɵɵproperty("viewMode", ctx.viewMode())("metricEnum", ctx.selectedMetricEnum())("metricData", ctx.selectedMetricData())("contributingMetrics", ctx.selectedContributingMetrics())("pacingMetrics", ctx.pacingMetrics())("isOpen", ctx.isMetricReportOpen());
59659
+ i0.ɵɵproperty("viewMode", ctx.viewMode())("metricEnum", ctx.selectedMetricEnum())("metricData", ctx.selectedMetricData())("contributingMetrics", ctx.selectedContributingMetrics())("pacingMetrics", ctx.pacingMetrics())("trendChartData", ctx.revenueChartData())("isOpen", ctx.isMetricReportOpen());
59552
59660
  } }, 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,
59553
59661
  StickySubmitBarComponent,
59554
59662
  AreaChartComponent,
@@ -59567,390 +59675,391 @@ class InitialTargetSettingComponent {
59567
59675
  TooltipDirective,
59568
59676
  TooltipContainerComponent,
59569
59677
  MetricReportModalComponent
59570
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
59571
- <div class="space-y-8 pb-32">
59572
- <symphiq-tooltip-container />
59573
- <div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
59574
- [class.cursor-pointer]="calculationState() === 'results'"
59575
- [class.lg:sticky]="calculationState() === 'results'"
59576
- [style.top]="calculationState() === 'results' ? '148px' : 'auto'"
59577
- [class.z-30]="calculationState() === 'results'"
59578
- (click)="onCardClick()">
59579
- <div class="flex items-center justify-between mb-6">
59580
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold">
59581
- @if (calculationState() === 'results') {
59582
- Your {{ currentYear() }} Revenue Target
59583
- } @else {
59584
- Calculate Your {{ currentYear() }} Revenue Target
59585
- }
59586
- </h2>
59587
- @if (calculationState() === 'results') {
59588
- <svg
59589
- class="w-6 h-6 chevron-rotate"
59590
- [class.chevron-rotate-expanded]="detailsExpanded()"
59591
- [ngClass]="chevronClasses()"
59592
- fill="none"
59593
- stroke="currentColor"
59594
- viewBox="0 0 24 24">
59595
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
59596
- </svg>
59597
- }
59598
- </div>
59599
-
59600
- <div class="flex flex-col gap-4">
59601
- <div class="grid lg:grid-cols-2 gap-4">
59602
- <div class="flex flex-col gap-4">
59603
- <div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
59604
- <div class="flex flex-wrap gap-4 place-content-between">
59605
- <div class="flex items-center gap-2">
59606
- <svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59607
- <path 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"></path>
59608
- </svg>
59609
- <div>
59610
- <p [ngClass]="baselineLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59611
- {{ priorYear() }} Revenue
59612
- </p>
59613
- <p [ngClass]="baselineValueClasses()" class="text-lg font-bold">
59614
- {{ formatCurrency(priorYearRevenue()) }}
59615
- </p>
59616
- </div>
59617
- </div>
59618
- @if (currentPaceProjection() > 0) {
59619
- <div class="flex items-center gap-2">
59620
- <svg class="w-4 h-4" [ngClass]="projectionIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59621
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
59622
- </svg>
59623
- <div>
59624
- <div class="flex items-center gap-1">
59625
- <p [ngClass]="projectionLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59626
- Current Pace Projection
59627
- </p>
59628
- <button
59629
- type="button"
59630
- [ngClass]="infoIconClasses()"
59631
- class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59632
- [libSymphiqTooltip]="currentPaceProjectionTooltip"
59633
- tooltipType="markdown"
59634
- tooltipPosition="top"
59635
- (click)="$event.stopPropagation()">
59636
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59637
- <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" />
59638
- </svg>
59639
- </button>
59640
- </div>
59641
- <p [ngClass]="projectionValueClasses()" class="text-lg font-bold">
59642
- {{ formatCurrency(currentPaceProjection()) }}
59643
- </p>
59644
- </div>
59645
- </div>
59646
- }
59647
- </div>
59648
-
59649
- <div class="form-area-collapse" [class.form-area-collapse-hidden]="calculationState() === 'results'" [class.mt-6]="calculationState() !== 'results'">
59650
- <div class="form-area-content">
59651
- <div class="space-y-6">
59652
- @if (calculationState() !== 'results') {
59653
- <div class="flex gap-2">
59654
- <button
59655
- (click)="setInputMode('absolute')"
59656
- [ngClass]="inputModeButtonClasses('absolute')"
59657
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59658
- Absolute Amount
59659
- </button>
59660
- <button
59661
- (click)="setInputMode('percentage')"
59662
- [ngClass]="inputModeButtonClasses('percentage')"
59663
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59664
- % Increase
59665
- </button>
59666
- </div>
59667
-
59668
- @if (inputMode() === 'absolute') {
59669
- <div class="relative">
59670
- <span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59671
- $
59672
- </span>
59673
- <input
59674
- #absoluteInputRef
59675
- type="number"
59676
- [(ngModel)]="absoluteInput"
59677
- (ngModelChange)="onAbsoluteInputChange()"
59678
- [ngClass]="inputClasses()"
59679
- class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59680
- placeholder="0"
59681
- min="0"
59682
- step="1000">
59683
- </div>
59684
- } @else {
59685
- <div class="relative">
59686
- <input
59687
- #percentageInputRef
59688
- type="number"
59689
- [(ngModel)]="percentageInput"
59690
- (ngModelChange)="onPercentageInputChange()"
59691
- [ngClass]="inputClasses()"
59692
- class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59693
- placeholder="0"
59694
- min="0"
59695
- max="1000"
59696
- step="0.1">
59697
- <span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59698
- %
59699
- </span>
59700
- </div>
59701
- }
59702
-
59703
- @if (hasStoredResponse()) {
59704
- <div class="flex justify-end">
59705
- <button
59706
- (click)="handleCancel()"
59707
- [ngClass]="cancelButtonClasses()"
59708
- class="px-4 py-2 rounded-lg text-sm font-semibold transition-all">
59709
- Cancel
59710
- </button>
59711
- </div>
59712
- }
59713
- }
59714
- </div>
59715
- </div>
59716
- </div>
59717
- </div>
59718
-
59719
- <div class="chart-in-column" [class.chart-in-column-active]="calculationState() === 'results' && detailsExpanded()">
59720
- <div class="chart-in-column-content">
59721
- <div>
59722
- <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59723
- Year-over-Year Revenue Trend
59724
- </p>
59725
- <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59726
- @if (revenueChartData()) {
59727
- <symphiq-area-chart
59728
- [chart]="revenueChartData()!"
59729
- [showAxisLabels]="true"
59730
- [viewMode]="viewMode()"
59731
- [currencySymbol]="'$'"
59732
- [height]="'108px'"
59733
- />
59734
- } @else {
59735
- <div class="h-64 flex items-center justify-center">
59736
- <p [ngClass]="noDataClasses()" class="text-sm">
59737
- No revenue data available
59738
- </p>
59739
- </div>
59740
- }
59741
- </div>
59742
- </div>
59743
- </div>
59744
- </div>
59745
- </div>
59746
-
59747
- <div class="calculated-card-enter order-first lg:order-last" [class.calculated-card-enter-active]="calculatedRevenue() > 0">
59748
- <div class="calculated-card-content">
59749
- @if (calculatedRevenue() > 0) {
59750
- <div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2"
59751
- [class.h-full]="calculationState() !== 'results' || detailsExpanded()">
59752
- <div>
59753
- <div class="flex items-center justify-between">
59754
- <div>
59755
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59756
- {{ currentYear() }} Revenue Target
59757
- </p>
59758
- <p [ngClass]="calculatedValueClasses()" class="font-bold transition-all duration-300 text-lg"
59759
- [class.lg:text-3xl]="calculationState() !== 'results' || detailsExpanded()">
59760
- @if (calculationState() === 'results' && targets() === undefined && submittedAbsoluteInput() !== null) {
59761
- > {{ formatCurrency(submittedAbsoluteInput()!) }}
59762
- } @else {
59763
- {{ formatCurrency(displayedTargetRevenue()) }}
59764
- }
59765
- </p>
59766
- </div>
59767
- @if (calculationState() === 'results' && targets() === undefined) {
59768
- <button
59769
- (click)="handleAdjustTarget(); $event.stopPropagation()"
59770
- [ngClass]="secondaryButtonClasses()"
59771
- class="px-4 py-2 rounded-lg text-sm font-semibold transition-all whitespace-nowrap">
59772
- Adjust Revenue Target
59773
- </button>
59774
- }
59775
- </div>
59776
-
59777
- <div class="details-collapse" [class.details-collapse-expanded]="calculationState() !== 'results' || detailsExpanded()">
59778
- <div class="details-collapse-content">
59779
- <div class="relative pt-6 mt-6">
59780
- <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59781
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59782
- <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59783
- vs. {{ priorYear() }}
59784
- </span>
59785
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59786
- </div>
59787
- <div class="grid grid-cols-2 gap-4 pt-2">
59788
- <div>
59789
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59790
- Increase Amount
59791
- </p>
59792
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59793
- @if (isTargetValid()) {
59794
- {{ formatCurrency(animatedIncreaseAmount()) }}
59795
- } @else {
59796
- --
59797
- }
59798
- </p>
59799
- </div>
59800
- <div>
59801
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59802
- % Growth
59803
- </p>
59804
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59805
- @if (isTargetValid()) {
59806
- +{{ formatPercentage(animatedPercentageGrowth(), 1) }}
59807
- } @else {
59808
- --
59809
- }
59810
- </p>
59811
- </div>
59812
- </div>
59813
- </div>
59814
-
59815
- @if (currentPaceProjection() > 0) {
59816
- <div class="relative pt-6 mt-6">
59817
- <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59818
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59819
- <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59820
- {{ currentYear() }} YTD Gap
59821
- </span>
59822
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59823
- </div>
59824
- <div class="grid grid-cols-2 gap-4 pt-2">
59825
- <div>
59826
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59827
- Gap to Close
59828
- </p>
59829
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59830
- @if (isTargetValid()) {
59831
- {{ formatCurrency(animatedGapAmount()) }}
59832
- } @else {
59833
- --
59834
- }
59835
- </p>
59836
- </div>
59837
- <div>
59838
- <div class="flex items-center gap-1 mb-1">
59839
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59840
- Additional Growth Needed
59841
- </p>
59842
- <button
59843
- type="button"
59844
- [ngClass]="infoIconClasses()"
59845
- class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59846
- [libSymphiqTooltip]="additionalGrowthTooltip"
59847
- tooltipType="markdown"
59848
- tooltipPosition="top"
59849
- (click)="$event.stopPropagation()">
59850
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59851
- <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" />
59852
- </svg>
59853
- </button>
59854
- </div>
59855
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59856
- @if (isTargetValid()) {
59857
- {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(animatedGapPercentage(), 1) }}
59858
- } @else {
59859
- --
59860
- }
59861
- </p>
59862
- </div>
59863
- </div>
59864
- </div>
59865
- }
59866
-
59867
- </div>
59868
- </div>
59869
- </div>
59870
- </div>
59871
- }
59872
- </div>
59873
- </div>
59874
- </div>
59875
-
59876
- @if (calculationState() !== 'results') {
59877
- <div class="w-full">
59878
- <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59879
- Year-over-Year Revenue Trend
59880
- </p>
59881
- <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59882
- @if (revenueChartData()) {
59883
- <symphiq-area-chart
59884
- [chart]="revenueChartData()!"
59885
- [showAxisLabels]="true"
59886
- [viewMode]="viewMode()"
59887
- [currencySymbol]="'$'"
59888
- [height]="'320px'"
59889
- />
59890
- } @else {
59891
- <div class="h-64 flex items-center justify-center">
59892
- <p [ngClass]="noDataClasses()" class="text-sm">
59893
- No revenue data available
59894
- </p>
59895
- </div>
59896
- }
59897
- </div>
59898
- </div>
59899
- }
59900
- </div>
59901
- </div>
59902
-
59903
- <div class="metrics-section-enter" [class.metrics-section-enter-active]="showMetricsVisualization()">
59904
- <div class="metrics-section-content">
59905
- @if (showMetricsVisualization()) {
59906
- <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
59907
- <div class="mb-6">
59908
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
59909
- Contributing Metrics
59910
- </h2>
59911
- <p [ngClass]="sectionDescriptionClasses()" class="text-sm">
59912
- @if (targets() === undefined && submittedAbsoluteInput() !== null) {
59913
- To achieve your revenue target of over {{ formatCurrency(submittedAbsoluteInput()!) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
59914
- } @else {
59915
- To achieve your revenue target of {{ formatCurrency(displayedTargetRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
59916
- }
59917
- </p>
59918
- </div>
59919
-
59920
- <symphiq-funnel-metrics-visualization
59921
- [viewMode]="viewMode()"
59922
- [calculations]="displayedMetricCalculations()"
59923
- [pacingMetrics]="pacingMetrics()"
59924
- (viewStageReport)="openMetricReport($event)"
59925
- (viewRelatedMetricReport)="openMetricReport($event)"
59926
- />
59927
- </div>
59928
- }
59929
- </div>
59930
- </div>
59931
-
59932
- <symphiq-sticky-submit-bar
59933
- [viewMode]="viewMode()"
59934
- [isValid]="isValid()"
59935
- [isSubmitting]="isCalculating()"
59936
- [validationMessage]="validationMessage()"
59937
- [buttonText]="submitButtonText()"
59938
- [showCancelButton]="calculationState() === 'input' && hasStoredResponse()"
59939
- (submitClick)="handleSubmitClick()"
59940
- (cancelClick)="handleCancel()"
59941
- />
59942
-
59943
- <!-- Metric Report Modal -->
59944
- <symphiq-metric-report-modal
59945
- [viewMode]="viewMode()"
59946
- [metricEnum]="selectedMetricEnum()"
59947
- [metricData]="selectedMetricData()"
59948
- [contributingMetrics]="selectedContributingMetrics()"
59949
- [pacingMetrics]="pacingMetrics()"
59950
- [isOpen]="isMetricReportOpen()"
59951
- (closed)="closeMetricReport()"
59952
- />
59953
- </div>
59678
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
59679
+ <div class="space-y-8 pb-32">
59680
+ <symphiq-tooltip-container />
59681
+ <div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
59682
+ [class.cursor-pointer]="calculationState() === 'results'"
59683
+ [class.lg:sticky]="calculationState() === 'results'"
59684
+ [style.top]="calculationState() === 'results' ? '148px' : 'auto'"
59685
+ [class.z-30]="calculationState() === 'results'"
59686
+ (click)="onCardClick()">
59687
+ <div class="flex items-center justify-between mb-6">
59688
+ <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold">
59689
+ @if (calculationState() === 'results') {
59690
+ Your {{ currentYear() }} Revenue Target
59691
+ } @else {
59692
+ Calculate Your {{ currentYear() }} Revenue Target
59693
+ }
59694
+ </h2>
59695
+ @if (calculationState() === 'results') {
59696
+ <svg
59697
+ class="w-6 h-6 chevron-rotate"
59698
+ [class.chevron-rotate-expanded]="detailsExpanded()"
59699
+ [ngClass]="chevronClasses()"
59700
+ fill="none"
59701
+ stroke="currentColor"
59702
+ viewBox="0 0 24 24">
59703
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
59704
+ </svg>
59705
+ }
59706
+ </div>
59707
+
59708
+ <div class="flex flex-col gap-4">
59709
+ <div class="grid lg:grid-cols-2 gap-4">
59710
+ <div class="flex flex-col gap-4">
59711
+ <div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
59712
+ <div class="flex flex-wrap gap-4 place-content-between">
59713
+ <div class="flex items-center gap-2">
59714
+ <svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59715
+ <path 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"></path>
59716
+ </svg>
59717
+ <div>
59718
+ <p [ngClass]="baselineLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59719
+ {{ priorYear() }} Revenue
59720
+ </p>
59721
+ <p [ngClass]="baselineValueClasses()" class="text-lg font-bold">
59722
+ {{ formatCurrency(priorYearRevenue()) }}
59723
+ </p>
59724
+ </div>
59725
+ </div>
59726
+ @if (currentPaceProjection() > 0) {
59727
+ <div class="flex items-center gap-2">
59728
+ <svg class="w-4 h-4" [ngClass]="projectionIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59729
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
59730
+ </svg>
59731
+ <div>
59732
+ <div class="flex items-center gap-1">
59733
+ <p [ngClass]="projectionLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59734
+ Current Pace Projection
59735
+ </p>
59736
+ <button
59737
+ type="button"
59738
+ [ngClass]="infoIconClasses()"
59739
+ class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59740
+ [libSymphiqTooltip]="currentPaceProjectionTooltip"
59741
+ tooltipType="markdown"
59742
+ tooltipPosition="top"
59743
+ (click)="$event.stopPropagation()">
59744
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59745
+ <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" />
59746
+ </svg>
59747
+ </button>
59748
+ </div>
59749
+ <p [ngClass]="projectionValueClasses()" class="text-lg font-bold">
59750
+ {{ formatCurrency(currentPaceProjection()) }}
59751
+ </p>
59752
+ </div>
59753
+ </div>
59754
+ }
59755
+ </div>
59756
+
59757
+ <div class="form-area-collapse" [class.form-area-collapse-hidden]="calculationState() === 'results'" [class.mt-6]="calculationState() !== 'results'">
59758
+ <div class="form-area-content">
59759
+ <div class="space-y-6">
59760
+ @if (calculationState() !== 'results') {
59761
+ <div class="flex gap-2">
59762
+ <button
59763
+ (click)="setInputMode('absolute')"
59764
+ [ngClass]="inputModeButtonClasses('absolute')"
59765
+ class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59766
+ Absolute Amount
59767
+ </button>
59768
+ <button
59769
+ (click)="setInputMode('percentage')"
59770
+ [ngClass]="inputModeButtonClasses('percentage')"
59771
+ class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59772
+ % Increase
59773
+ </button>
59774
+ </div>
59775
+
59776
+ @if (inputMode() === 'absolute') {
59777
+ <div class="relative">
59778
+ <span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59779
+ $
59780
+ </span>
59781
+ <input
59782
+ #absoluteInputRef
59783
+ type="number"
59784
+ [(ngModel)]="absoluteInput"
59785
+ (ngModelChange)="onAbsoluteInputChange()"
59786
+ [ngClass]="inputClasses()"
59787
+ class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59788
+ placeholder="0"
59789
+ min="0"
59790
+ step="1000">
59791
+ </div>
59792
+ } @else {
59793
+ <div class="relative">
59794
+ <input
59795
+ #percentageInputRef
59796
+ type="number"
59797
+ [(ngModel)]="percentageInput"
59798
+ (ngModelChange)="onPercentageInputChange()"
59799
+ [ngClass]="inputClasses()"
59800
+ class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59801
+ placeholder="0"
59802
+ min="0"
59803
+ max="1000"
59804
+ step="0.1">
59805
+ <span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59806
+ %
59807
+ </span>
59808
+ </div>
59809
+ }
59810
+
59811
+ @if (hasStoredResponse()) {
59812
+ <div class="flex justify-end">
59813
+ <button
59814
+ (click)="handleCancel()"
59815
+ [ngClass]="cancelButtonClasses()"
59816
+ class="px-4 py-2 rounded-lg text-sm font-semibold transition-all">
59817
+ Cancel
59818
+ </button>
59819
+ </div>
59820
+ }
59821
+ }
59822
+ </div>
59823
+ </div>
59824
+ </div>
59825
+ </div>
59826
+
59827
+ <div class="chart-in-column" [class.chart-in-column-active]="calculationState() === 'results' && detailsExpanded()">
59828
+ <div class="chart-in-column-content">
59829
+ <div>
59830
+ <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59831
+ Year-over-Year Revenue Trend
59832
+ </p>
59833
+ <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59834
+ @if (revenueChartData()) {
59835
+ <symphiq-area-chart
59836
+ [chart]="revenueChartData()!"
59837
+ [showAxisLabels]="true"
59838
+ [viewMode]="viewMode()"
59839
+ [currencySymbol]="'$'"
59840
+ [height]="'108px'"
59841
+ />
59842
+ } @else {
59843
+ <div class="h-64 flex items-center justify-center">
59844
+ <p [ngClass]="noDataClasses()" class="text-sm">
59845
+ No revenue data available
59846
+ </p>
59847
+ </div>
59848
+ }
59849
+ </div>
59850
+ </div>
59851
+ </div>
59852
+ </div>
59853
+ </div>
59854
+
59855
+ <div class="calculated-card-enter order-first lg:order-last" [class.calculated-card-enter-active]="calculatedRevenue() > 0">
59856
+ <div class="calculated-card-content">
59857
+ @if (calculatedRevenue() > 0) {
59858
+ <div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2"
59859
+ [class.h-full]="calculationState() !== 'results' || detailsExpanded()">
59860
+ <div>
59861
+ <div class="flex items-center justify-between">
59862
+ <div>
59863
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59864
+ {{ currentYear() }} Revenue Target
59865
+ </p>
59866
+ <p [ngClass]="calculatedValueClasses()" class="font-bold transition-all duration-300 text-lg"
59867
+ [class.lg:text-3xl]="calculationState() !== 'results' || detailsExpanded()">
59868
+ @if (calculationState() === 'results' && targets() === undefined && submittedAbsoluteInput() !== null) {
59869
+ > {{ formatCurrency(submittedAbsoluteInput()!) }}
59870
+ } @else {
59871
+ {{ formatCurrency(displayedTargetRevenue()) }}
59872
+ }
59873
+ </p>
59874
+ </div>
59875
+ @if (calculationState() === 'results' && targets() === undefined) {
59876
+ <button
59877
+ (click)="handleAdjustTarget(); $event.stopPropagation()"
59878
+ [ngClass]="secondaryButtonClasses()"
59879
+ class="px-4 py-2 rounded-lg text-sm font-semibold transition-all whitespace-nowrap">
59880
+ Adjust Revenue Target
59881
+ </button>
59882
+ }
59883
+ </div>
59884
+
59885
+ <div class="details-collapse" [class.details-collapse-expanded]="calculationState() !== 'results' || detailsExpanded()">
59886
+ <div class="details-collapse-content">
59887
+ <div class="relative pt-6 mt-6">
59888
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59889
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59890
+ <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59891
+ vs. {{ priorYear() }}
59892
+ </span>
59893
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59894
+ </div>
59895
+ <div class="grid grid-cols-2 gap-4 pt-2">
59896
+ <div>
59897
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59898
+ Increase Amount
59899
+ </p>
59900
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59901
+ @if (isTargetValid()) {
59902
+ {{ formatCurrency(animatedIncreaseAmount()) }}
59903
+ } @else {
59904
+ --
59905
+ }
59906
+ </p>
59907
+ </div>
59908
+ <div>
59909
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59910
+ % Growth
59911
+ </p>
59912
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59913
+ @if (isTargetValid()) {
59914
+ +{{ formatPercentage(animatedPercentageGrowth(), 1) }}
59915
+ } @else {
59916
+ --
59917
+ }
59918
+ </p>
59919
+ </div>
59920
+ </div>
59921
+ </div>
59922
+
59923
+ @if (currentPaceProjection() > 0) {
59924
+ <div class="relative pt-6 mt-6">
59925
+ <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59926
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59927
+ <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59928
+ {{ currentYear() }} YTD Gap
59929
+ </span>
59930
+ <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59931
+ </div>
59932
+ <div class="grid grid-cols-2 gap-4 pt-2">
59933
+ <div>
59934
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59935
+ Gap to Close
59936
+ </p>
59937
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59938
+ @if (isTargetValid()) {
59939
+ {{ formatCurrency(animatedGapAmount()) }}
59940
+ } @else {
59941
+ --
59942
+ }
59943
+ </p>
59944
+ </div>
59945
+ <div>
59946
+ <div class="flex items-center gap-1 mb-1">
59947
+ <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59948
+ Additional Growth Needed
59949
+ </p>
59950
+ <button
59951
+ type="button"
59952
+ [ngClass]="infoIconClasses()"
59953
+ class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59954
+ [libSymphiqTooltip]="additionalGrowthTooltip"
59955
+ tooltipType="markdown"
59956
+ tooltipPosition="top"
59957
+ (click)="$event.stopPropagation()">
59958
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59959
+ <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" />
59960
+ </svg>
59961
+ </button>
59962
+ </div>
59963
+ <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59964
+ @if (isTargetValid()) {
59965
+ {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(animatedGapPercentage(), 1) }}
59966
+ } @else {
59967
+ --
59968
+ }
59969
+ </p>
59970
+ </div>
59971
+ </div>
59972
+ </div>
59973
+ }
59974
+
59975
+ </div>
59976
+ </div>
59977
+ </div>
59978
+ </div>
59979
+ }
59980
+ </div>
59981
+ </div>
59982
+ </div>
59983
+
59984
+ @if (calculationState() !== 'results') {
59985
+ <div class="w-full">
59986
+ <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59987
+ Year-over-Year Revenue Trend
59988
+ </p>
59989
+ <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59990
+ @if (revenueChartData()) {
59991
+ <symphiq-area-chart
59992
+ [chart]="revenueChartData()!"
59993
+ [showAxisLabels]="true"
59994
+ [viewMode]="viewMode()"
59995
+ [currencySymbol]="'$'"
59996
+ [height]="'200px'"
59997
+ />
59998
+ } @else {
59999
+ <div class="h-64 flex items-center justify-center">
60000
+ <p [ngClass]="noDataClasses()" class="text-sm">
60001
+ No revenue data available
60002
+ </p>
60003
+ </div>
60004
+ }
60005
+ </div>
60006
+ </div>
60007
+ }
60008
+ </div>
60009
+ </div>
60010
+
60011
+ <div class="metrics-section-enter" [class.metrics-section-enter-active]="showMetricsVisualization()">
60012
+ <div class="metrics-section-content">
60013
+ @if (showMetricsVisualization()) {
60014
+ <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
60015
+ <div class="mb-6">
60016
+ <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
60017
+ Contributing Metrics
60018
+ </h2>
60019
+ <p [ngClass]="sectionDescriptionClasses()" class="text-sm">
60020
+ @if (targets() === undefined && submittedAbsoluteInput() !== null) {
60021
+ To achieve your revenue target of over {{ formatCurrency(submittedAbsoluteInput()!) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
60022
+ } @else {
60023
+ To achieve your revenue target of {{ formatCurrency(displayedTargetRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
60024
+ }
60025
+ </p>
60026
+ </div>
60027
+
60028
+ <symphiq-funnel-metrics-visualization
60029
+ [viewMode]="viewMode()"
60030
+ [calculations]="displayedMetricCalculations()"
60031
+ [pacingMetrics]="pacingMetrics()"
60032
+ (viewStageReport)="openMetricReport($event)"
60033
+ (viewRelatedMetricReport)="openMetricReport($event)"
60034
+ />
60035
+ </div>
60036
+ }
60037
+ </div>
60038
+ </div>
60039
+
60040
+ <symphiq-sticky-submit-bar
60041
+ [viewMode]="viewMode()"
60042
+ [isValid]="isValid()"
60043
+ [isSubmitting]="isCalculating()"
60044
+ [validationMessage]="validationMessage()"
60045
+ [buttonText]="submitButtonText()"
60046
+ [showCancelButton]="calculationState() === 'input' && hasStoredResponse()"
60047
+ (submitClick)="handleSubmitClick()"
60048
+ (cancelClick)="handleCancel()"
60049
+ />
60050
+
60051
+ <!-- Metric Report Modal -->
60052
+ <symphiq-metric-report-modal
60053
+ [viewMode]="viewMode()"
60054
+ [metricEnum]="selectedMetricEnum()"
60055
+ [metricData]="selectedMetricData()"
60056
+ [contributingMetrics]="selectedContributingMetrics()"
60057
+ [pacingMetrics]="pacingMetrics()"
60058
+ [trendChartData]="revenueChartData()"
60059
+ [isOpen]="isMetricReportOpen()"
60060
+ (closed)="closeMetricReport()"
60061
+ />
60062
+ </div>
59954
60063
  `, styles: [".calculated-card-enter{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease-out}.calculated-card-enter-active{grid-template-rows:1fr}.calculated-card-content{overflow:hidden}.form-area-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.form-area-collapse-hidden{grid-template-rows:0fr}.form-area-content{overflow:hidden}.chart-section-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.chart-section-collapse-hidden{grid-template-rows:0fr}.chart-section-content{overflow:hidden}.chart-in-column{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.chart-in-column-active{grid-template-rows:1fr}.chart-in-column-content{overflow:hidden}.metrics-section-enter{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s ease-out}.metrics-section-enter-active{grid-template-rows:1fr}.metrics-section-content{overflow:hidden}.details-collapse{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.details-collapse-expanded{grid-template-rows:1fr}.details-collapse-content{overflow:hidden}.chevron-rotate{transition:transform .3s ease-out}.chevron-rotate-expanded{transform:rotate(180deg)}\n"] }]
59955
60064
  }], () => [], { absoluteInputRef: [{
59956
60065
  type: ViewChild,
@@ -59959,7 +60068,7 @@ class InitialTargetSettingComponent {
59959
60068
  type: ViewChild,
59960
60069
  args: ['percentageInputRef']
59961
60070
  }], 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 }] }], targets: [{ type: i0.Input, args: [{ isSignal: true, alias: "targets", required: false }] }], targetsCreated: [{ type: i0.Output, args: ["targetsCreated"] }], calculateRevenueRequest: [{ type: i0.Output, args: ["calculateRevenueRequest"] }] }); })();
59962
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 535 }); })();
60071
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 536 }); })();
59963
60072
 
59964
60073
  function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
59965
60074
  i0.ɵɵelement(0, "div", 5);