@eric-emg/symphiq-components 1.2.251 → 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.
@@ -54881,16 +54881,12 @@ class PacingStatusBadgeComponent {
54881
54881
  return status === 'ahead' ? -1 : status === 'behind' ? 1 : 0;
54882
54882
  }, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
54883
54883
  this.rotationStyle = computed(() => {
54884
- const progress = this.animationProgress();
54885
54884
  const target = this.targetRotation();
54886
- const currentRotation = progress * target;
54887
- return `rotate(${currentRotation}deg)`;
54885
+ return `rotate(${target}deg)`;
54888
54886
  }, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
54889
54887
  this.fullBadgeRotationStyle = computed(() => {
54890
- const progress = this.animationProgress();
54891
54888
  const target = this.targetRotation();
54892
- const currentRotation = progress * target;
54893
- return `rotate(${currentRotation}deg)`;
54889
+ return `rotate(${target}deg)`;
54894
54890
  }, ...(ngDevMode ? [{ debugName: "fullBadgeRotationStyle" }] : []));
54895
54891
  this.containerSizeClasses = computed(() => {
54896
54892
  const compact = this.isCompact();
@@ -55041,37 +55037,37 @@ class PacingStatusBadgeComponent {
55041
55037
  standalone: true,
55042
55038
  imports: [CommonModule],
55043
55039
  changeDetection: ChangeDetectionStrategy.OnPush,
55044
- template: `
55045
- @if (showEmphasizedPercentage() && hasPercentage()) {
55046
- <div
55047
- [ngClass]="containerClasses()"
55048
- [class]="containerSizeClasses()"
55049
- [style.transform]="rotationStyle()"
55050
- >
55051
- <div [ngClass]="overlayBadgeClasses()" [class]="overlaySizeClasses()">
55052
- <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55053
- {{ iconSymbol() }}
55054
- </span>
55055
- {{ animatedPercentage() }}
55056
- </div>
55057
- <div
55058
- [class]="sizeClasses()"
55059
- >
55060
- <span>{{ displayTextWithoutPercentage() }}</span>
55061
- </div>
55062
- </div>
55063
- } @else {
55064
- <div
55065
- [ngClass]="badgeClasses()"
55066
- [class]="fullBadgeSizeClasses()"
55067
- [style.transform]="fullBadgeRotationStyle()"
55068
- >
55069
- <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
55070
- {{ iconSymbol() }}
55071
- </span>
55072
- <span>{{ displayText() }}</span>
55073
- </div>
55074
- }
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
+ }
55075
55071
  `
55076
55072
  }]
55077
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 }] }] }); })();
@@ -55125,10 +55121,8 @@ class TargetChangeBadgeComponent {
55125
55121
  return change > 0 ? -1 : change < 0 ? 1 : 0;
55126
55122
  }, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
55127
55123
  this.rotationStyle = computed(() => {
55128
- const progress = this.animationProgress();
55129
55124
  const target = this.targetRotation();
55130
- const currentRotation = progress * target;
55131
- return `rotate(${currentRotation}deg)`;
55125
+ return `rotate(${target}deg)`;
55132
55126
  }, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
55133
55127
  this.containerSizeClasses = computed(() => {
55134
55128
  const compact = this.isCompact();
@@ -55236,20 +55230,20 @@ class TargetChangeBadgeComponent {
55236
55230
  standalone: true,
55237
55231
  imports: [CommonModule],
55238
55232
  changeDetection: ChangeDetectionStrategy.OnPush,
55239
- template: `
55240
- <div
55241
- [ngClass]="containerClasses()"
55242
- [class]="containerSizeClasses()"
55243
- [style.transform]="rotationStyle()"
55244
- >
55245
- <div [ngClass]="overlayClasses()" [class]="overlaySizeClasses()">
55246
- <span [class]="iconSizeClass()">{{ iconSymbol() }}</span>
55247
- {{ animatedPercentageText() }}
55248
- </div>
55249
- <div [class]="descriptionSizeClasses()">
55250
- {{ descriptionText() }}
55251
- </div>
55252
- </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>
55253
55247
  `
55254
55248
  }]
55255
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 }] }] }); })();
@@ -56695,8 +56689,9 @@ class LineChartComponent {
56695
56689
  this.showAxisLabels = input(false, ...(ngDevMode ? [{ debugName: "showAxisLabels" }] : []));
56696
56690
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
56697
56691
  this.currencySymbol = input('$', ...(ngDevMode ? [{ debugName: "currencySymbol" }] : []));
56692
+ this.height = input(undefined, ...(ngDevMode ? [{ debugName: "height" }] : []));
56698
56693
  // Memoized computed signals to avoid recalculation on every change detection
56699
- this.chartHeight = computed(() => this.showAxisLabels() ? '500px' : '133px', ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
56694
+ this.chartHeight = computed(() => this.height() ?? (this.showAxisLabels() ? '500px' : '133px'), ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
56700
56695
  this.cursorColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x94a3b8, ...(ngDevMode ? [{ debugName: "cursorColor" }] : []));
56701
56696
  this.tooltipTextColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x000000, ...(ngDevMode ? [{ debugName: "tooltipTextColor" }] : []));
56702
56697
  this.chartHash = computed(() => this.generateChartHash(this.chart()), ...(ngDevMode ? [{ debugName: "chartHash" }] : []));
@@ -57141,7 +57136,7 @@ class LineChartComponent {
57141
57136
  } if (rf & 2) {
57142
57137
  let _t;
57143
57138
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chartDiv = _t.first);
57144
- } }, 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) {
57145
57140
  i0.ɵɵdomElementStart(0, "div", 1);
57146
57141
  i0.ɵɵdomElement(1, "div", 2, 0);
57147
57142
  i0.ɵɵdomElementEnd();
@@ -57153,12 +57148,12 @@ class LineChartComponent {
57153
57148
  }
57154
57149
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LineChartComponent, [{
57155
57150
  type: Component,
57156
- args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
57157
- <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
57158
- <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
57159
- </div>
57151
+ args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
57152
+ <div class="chart-container" [class.mini-mode]="!showAxisLabels()">
57153
+ <div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
57154
+ </div>
57160
57155
  `, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
57161
- }], () => [], { 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: [{
57162
57157
  type: ViewChild,
57163
57158
  args: ['chartdiv', { static: true }]
57164
57159
  }] }); })();
@@ -57447,28 +57442,28 @@ const _forTrack0$i = ($index, $item) => $item.metric;
57447
57442
  function MetricReportModalComponent_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
57448
57443
  i0.ɵɵelementStart(0, "button", 11);
57449
57444
  i0.ɵɵnamespaceSVG();
57450
- i0.ɵɵelementStart(1, "svg", 33);
57451
- i0.ɵɵelement(2, "path", 34);
57445
+ i0.ɵɵelementStart(1, "svg", 32);
57446
+ i0.ɵɵelement(2, "path", 33);
57452
57447
  i0.ɵɵelementEnd()();
57453
57448
  } if (rf & 2) {
57454
57449
  const ctx_r1 = i0.ɵɵnextContext(2);
57455
57450
  i0.ɵɵproperty("ngClass", ctx_r1.headerInfoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(ctx_r1.metricData().description, ctx_r1.metricTitle()));
57456
57451
  } }
57457
- 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) {
57458
57453
  i0.ɵɵelement(0, "symphiq-target-change-badge", 23);
57459
57454
  } if (rf & 2) {
57460
57455
  let tmp_4_0;
57461
57456
  const ctx_r1 = i0.ɵɵnextContext(2);
57462
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);
57463
57458
  } }
57464
- function MetricReportModalComponent_Conditional_0_Conditional_48_Template(rf, ctx) { if (rf & 1) {
57465
- i0.ɵɵelementStart(0, "div")(1, "p", 25);
57459
+ function MetricReportModalComponent_Conditional_0_Conditional_47_Template(rf, ctx) { if (rf & 1) {
57460
+ i0.ɵɵelementStart(0, "div")(1, "p", 24);
57466
57461
  i0.ɵɵtext(2);
57467
57462
  i0.ɵɵelementEnd();
57468
57463
  i0.ɵɵelementStart(3, "p", 22);
57469
57464
  i0.ɵɵtext(4);
57470
57465
  i0.ɵɵelementEnd();
57471
- i0.ɵɵelement(5, "symphiq-pacing-status-badge", 35);
57466
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 34);
57472
57467
  i0.ɵɵelementEnd();
57473
57468
  } if (rf & 2) {
57474
57469
  let tmp_5_0;
@@ -57484,11 +57479,24 @@ function MetricReportModalComponent_Conditional_0_Conditional_48_Template(rf, ct
57484
57479
  i0.ɵɵadvance();
57485
57480
  i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", ctx_r1.pacingInfo().pacingPercentage)("status", ctx_r1.pacingInfo().status)("showAsFullText", false)("isCompact", true)("showEmphasizedPercentage", true);
57486
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
+ } }
57487
57495
  function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ctx) { if (rf & 1) {
57488
- i0.ɵɵelementStart(0, "div", 26);
57489
- i0.ɵɵelement(1, "symphiq-pacing-status-badge", 35);
57496
+ i0.ɵɵelementStart(0, "div", 25);
57497
+ i0.ɵɵelement(1, "symphiq-pacing-status-badge", 34);
57490
57498
  i0.ɵɵelementEnd();
57491
- i0.ɵɵelementStart(2, "div", 26)(3, "p", 29);
57499
+ i0.ɵɵelementStart(2, "div", 25)(3, "p", 28);
57492
57500
  i0.ɵɵtext(4);
57493
57501
  i0.ɵɵelementEnd()();
57494
57502
  i0.ɵɵelement(5, "symphiq-progress-to-target-chart", 36);
@@ -57504,10 +57512,10 @@ function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ct
57504
57512
  i0.ɵɵproperty("data", ctx_r1.progressToTargetData())("viewMode", ctx_r1.viewMode());
57505
57513
  } }
57506
57514
  function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template(rf, ctx) { if (rf & 1) {
57507
- i0.ɵɵelementStart(0, "button", 46);
57515
+ i0.ɵɵelementStart(0, "button", 11);
57508
57516
  i0.ɵɵnamespaceSVG();
57509
- i0.ɵɵelementStart(1, "svg", 52);
57510
- i0.ɵɵelement(2, "path", 34);
57517
+ i0.ɵɵelementStart(1, "svg", 51);
57518
+ i0.ɵɵelement(2, "path", 33);
57511
57519
  i0.ɵɵelementEnd()();
57512
57520
  } if (rf & 2) {
57513
57521
  const metric_r3 = i0.ɵɵnextContext().$implicit;
@@ -57518,17 +57526,17 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Template
57518
57526
  i0.ɵɵelementStart(0, "tr", 42)(1, "td", 43)(2, "div", 44)(3, "span", 45);
57519
57527
  i0.ɵɵtext(4);
57520
57528
  i0.ɵɵelementEnd();
57521
- i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button", 46);
57529
+ i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button", 11);
57522
57530
  i0.ɵɵelementEnd()();
57523
- i0.ɵɵelementStart(6, "td", 47)(7, "span", 48);
57531
+ i0.ɵɵelementStart(6, "td", 46)(7, "span", 47);
57524
57532
  i0.ɵɵtext(8);
57525
57533
  i0.ɵɵelementEnd()();
57526
- i0.ɵɵelementStart(9, "td", 47)(10, "div", 49)(11, "span", 45);
57534
+ i0.ɵɵelementStart(9, "td", 46)(10, "div", 48)(11, "span", 45);
57527
57535
  i0.ɵɵtext(12);
57528
57536
  i0.ɵɵelementEnd();
57529
57537
  i0.ɵɵnamespaceSVG();
57530
- i0.ɵɵelementStart(13, "svg", 50);
57531
- i0.ɵɵelement(14, "path", 51);
57538
+ i0.ɵɵelementStart(13, "svg", 49);
57539
+ i0.ɵɵelement(14, "path", 50);
57532
57540
  i0.ɵɵelementEnd()()()();
57533
57541
  } if (rf & 2) {
57534
57542
  const metric_r3 = ctx.$implicit;
@@ -57574,19 +57582,19 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_Template(rf, ct
57574
57582
  i0.ɵɵrepeater(ctx_r1.contributingMetrics());
57575
57583
  } }
57576
57584
  function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ctx) { if (rf & 1) {
57577
- i0.ɵɵelementStart(0, "div", 30)(1, "h4", 17);
57585
+ i0.ɵɵelementStart(0, "div", 29)(1, "h4", 17);
57578
57586
  i0.ɵɵtext(2, " Pace ");
57579
57587
  i0.ɵɵelementEnd();
57580
- i0.ɵɵelementStart(3, "div", 53);
57581
- i0.ɵɵelement(4, "symphiq-line-chart", 54);
57588
+ i0.ɵɵelementStart(3, "div", 52);
57589
+ i0.ɵɵelement(4, "symphiq-line-chart", 35);
57582
57590
  i0.ɵɵelementEnd();
57583
- i0.ɵɵelementStart(5, "p", 55);
57591
+ i0.ɵɵelementStart(5, "p", 53);
57584
57592
  i0.ɵɵtext(6);
57585
57593
  i0.ɵɵelementEnd();
57586
- i0.ɵɵelementStart(7, "p", 56);
57594
+ i0.ɵɵelementStart(7, "p", 54);
57587
57595
  i0.ɵɵtext(8);
57588
57596
  i0.ɵɵelementEnd();
57589
- i0.ɵɵelementStart(9, "p", 56);
57597
+ i0.ɵɵelementStart(9, "p", 54);
57590
57598
  i0.ɵɵtext(10);
57591
57599
  i0.ɵɵelementEnd()();
57592
57600
  } if (rf & 2) {
@@ -57595,7 +57603,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ct
57595
57603
  i0.ɵɵadvance();
57596
57604
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
57597
57605
  i0.ɵɵadvance(3);
57598
- 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");
57599
57607
  i0.ɵɵadvance();
57600
57608
  i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
57601
57609
  i0.ɵɵadvance();
@@ -57632,68 +57640,68 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57632
57640
  i0.ɵɵelement(15, "path", 14);
57633
57641
  i0.ɵɵelementEnd()()()();
57634
57642
  i0.ɵɵnamespaceHTML();
57635
- i0.ɵɵelementStart(16, "div", 15);
57636
- i0.ɵɵelement(17, "symphiq-tooltip-container");
57637
- i0.ɵɵelementStart(18, "div", 16)(19, "h4", 17);
57638
- 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 ");
57639
57645
  i0.ɵɵelementEnd();
57640
- i0.ɵɵelementStart(21, "div", 18)(22, "div")(23, "div", 19)(24, "p", 20);
57641
- 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 ");
57642
57648
  i0.ɵɵelementEnd();
57643
- i0.ɵɵelementStart(26, "p", 21);
57644
- i0.ɵɵtext(27);
57649
+ i0.ɵɵelementStart(25, "p", 21);
57650
+ i0.ɵɵtext(26);
57645
57651
  i0.ɵɵelementEnd();
57646
- i0.ɵɵelementStart(28, "p", 21);
57647
- i0.ɵɵtext(29);
57652
+ i0.ɵɵelementStart(27, "p", 21);
57653
+ i0.ɵɵtext(28);
57648
57654
  i0.ɵɵelementEnd()();
57649
- i0.ɵɵelementStart(30, "p", 22);
57650
- i0.ɵɵtext(31);
57655
+ i0.ɵɵelementStart(29, "p", 22);
57656
+ i0.ɵɵtext(30);
57651
57657
  i0.ɵɵelementEnd();
57652
- 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);
57653
57659
  i0.ɵɵelementEnd();
57654
- i0.ɵɵelementStart(33, "div")(34, "div", 19)(35, "p", 20);
57655
- 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 ");
57656
57662
  i0.ɵɵelementEnd();
57657
- i0.ɵɵelementStart(37, "p", 21);
57658
- i0.ɵɵtext(38);
57663
+ i0.ɵɵelementStart(36, "p", 21);
57664
+ i0.ɵɵtext(37);
57659
57665
  i0.ɵɵelementEnd();
57660
- i0.ɵɵelementStart(39, "p", 21);
57661
- i0.ɵɵtext(40);
57666
+ i0.ɵɵelementStart(38, "p", 21);
57667
+ i0.ɵɵtext(39);
57662
57668
  i0.ɵɵelementEnd()();
57663
- i0.ɵɵelementStart(41, "p", 24);
57664
- i0.ɵɵtext(42);
57669
+ i0.ɵɵelementStart(40, "p", 10);
57670
+ i0.ɵɵtext(41);
57665
57671
  i0.ɵɵelementEnd()();
57666
- i0.ɵɵelementStart(43, "div")(44, "p", 25);
57667
- i0.ɵɵtext(45);
57672
+ i0.ɵɵelementStart(42, "div")(43, "p", 24);
57673
+ i0.ɵɵtext(44);
57668
57674
  i0.ɵɵelementEnd();
57669
- i0.ɵɵelementStart(46, "p", 24);
57670
- i0.ɵɵtext(47);
57675
+ i0.ɵɵelementStart(45, "p", 10);
57676
+ i0.ɵɵtext(46);
57671
57677
  i0.ɵɵelementEnd()();
57672
- i0.ɵɵconditionalCreate(48, MetricReportModalComponent_Conditional_0_Conditional_48_Template, 6, 10, "div");
57673
- i0.ɵɵelementStart(49, "div")(50, "p", 25);
57674
- 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);
57675
57681
  i0.ɵɵelementEnd();
57676
- i0.ɵɵelementStart(52, "p", 24);
57677
- i0.ɵɵtext(53);
57678
- 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()();
57679
57687
  i0.ɵɵelementStart(54, "div", 16)(55, "h4", 17);
57680
57688
  i0.ɵɵtext(56, " Target Analysis ");
57681
57689
  i0.ɵɵelementEnd();
57682
- i0.ɵɵelementStart(57, "div", 26)(58, "p", 27);
57690
+ i0.ɵɵelementStart(57, "div", 25)(58, "p", 26);
57683
57691
  i0.ɵɵtext(59, " Your Target ");
57684
57692
  i0.ɵɵelementEnd();
57685
- i0.ɵɵelementStart(60, "p", 28);
57693
+ i0.ɵɵelementStart(60, "p", 27);
57686
57694
  i0.ɵɵtext(61);
57687
57695
  i0.ɵɵelementEnd();
57688
- i0.ɵɵelementStart(62, "p", 29);
57696
+ i0.ɵɵelementStart(62, "p", 28);
57689
57697
  i0.ɵɵtext(63);
57690
57698
  i0.ɵɵelementEnd()();
57691
57699
  i0.ɵɵconditionalCreate(64, MetricReportModalComponent_Conditional_0_Conditional_64_Template, 6, 10);
57692
57700
  i0.ɵɵelementEnd();
57693
57701
  i0.ɵɵconditionalCreate(65, MetricReportModalComponent_Conditional_0_Conditional_65_Template, 16, 3, "div", 16);
57694
- i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11, 12, "div", 30);
57702
+ i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11, 13, "div", 29);
57695
57703
  i0.ɵɵelementEnd();
57696
- i0.ɵɵelementStart(67, "div", 31)(68, "button", 32);
57704
+ i0.ɵɵelementStart(67, "div", 30)(68, "button", 31);
57697
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()); });
57698
57706
  i0.ɵɵtext(69, " Close ");
57699
57707
  i0.ɵɵelementEnd()()()()();
@@ -57703,8 +57711,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57703
57711
  let tmp_27_0;
57704
57712
  let tmp_31_0;
57705
57713
  let tmp_36_0;
57706
- let tmp_41_0;
57707
- let tmp_43_0;
57714
+ let tmp_42_0;
57715
+ let tmp_44_0;
57708
57716
  const ctx_r1 = i0.ɵɵnextContext();
57709
57717
  i0.ɵɵadvance(2);
57710
57718
  i0.ɵɵproperty("ngClass", ctx_r1.backdropClasses())("@fadeIn", undefined);
@@ -57722,7 +57730,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57722
57730
  i0.ɵɵproperty("ngClass", ctx_r1.closeButtonClasses());
57723
57731
  i0.ɵɵadvance(3);
57724
57732
  i0.ɵɵproperty("ngClass", ctx_r1.contentClasses());
57725
- i0.ɵɵadvance(2);
57733
+ i0.ɵɵadvance();
57726
57734
  i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
57727
57735
  i0.ɵɵadvance();
57728
57736
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
@@ -57741,7 +57749,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57741
57749
  i0.ɵɵadvance();
57742
57750
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(ctx_r1.ytdValue(), ((tmp_19_0 = ctx_r1.metricData()) == null ? null : tmp_19_0.metric) || ""), " ");
57743
57751
  i0.ɵɵadvance();
57744
- i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ? 32 : -1);
57752
+ i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ? 31 : -1);
57745
57753
  i0.ɵɵadvance(3);
57746
57754
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57747
57755
  i0.ɵɵadvance(2);
@@ -57765,7 +57773,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57765
57773
  i0.ɵɵadvance();
57766
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) || ""), " ");
57767
57775
  i0.ɵɵadvance();
57768
- i0.ɵɵconditional(ctx_r1.pacingInfo() ? 48 : -1);
57776
+ i0.ɵɵconditional(ctx_r1.pacingInfo() ? 47 : -1);
57769
57777
  i0.ɵɵadvance(2);
57770
57778
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57771
57779
  i0.ɵɵadvance();
@@ -57775,6 +57783,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57775
57783
  i0.ɵɵadvance();
57776
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), " ");
57777
57785
  i0.ɵɵadvance();
57786
+ i0.ɵɵconditional(ctx_r1.trendChartData() ? 53 : -1);
57787
+ i0.ɵɵadvance();
57778
57788
  i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
57779
57789
  i0.ɵɵadvance();
57780
57790
  i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
@@ -57783,11 +57793,11 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57783
57793
  i0.ɵɵadvance(2);
57784
57794
  i0.ɵɵproperty("ngClass", ctx_r1.targetValueClasses());
57785
57795
  i0.ɵɵadvance();
57786
- 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), " ");
57787
57797
  i0.ɵɵadvance();
57788
57798
  i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
57789
57799
  i0.ɵɵadvance();
57790
- 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) || ""), ". ");
57791
57801
  i0.ɵɵadvance();
57792
57802
  i0.ɵɵconditional(ctx_r1.pacingInfo() ? 64 : -1);
57793
57803
  i0.ɵɵadvance();
@@ -57806,6 +57816,7 @@ class MetricReportModalComponent {
57806
57816
  this.metricData = input(undefined, ...(ngDevMode ? [{ debugName: "metricData" }] : []));
57807
57817
  this.contributingMetrics = input([], ...(ngDevMode ? [{ debugName: "contributingMetrics" }] : []));
57808
57818
  this.pacingMetrics = input(undefined, ...(ngDevMode ? [{ debugName: "pacingMetrics" }] : []));
57819
+ this.trendChartData = input(null, ...(ngDevMode ? [{ debugName: "trendChartData" }] : []));
57809
57820
  this.isOpen = input(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
57810
57821
  this.closed = output();
57811
57822
  this.showDefinition = signal(false, ...(ngDevMode ? [{ debugName: "showDefinition" }] : []));
@@ -57963,7 +57974,7 @@ class MetricReportModalComponent {
57963
57974
  const metric = this.metricTitle();
57964
57975
  const currentYear = this.currentYear();
57965
57976
  const priorYear = this.priorYear();
57966
- return `This chart shows the ${metric} performance trend for ${currentYear} (solid yellow line, this month includes projections), compared to ${priorYear} (dashed green line), with the target projection (dotted blue 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.`;
57967
57978
  }, ...(ngDevMode ? [{ debugName: "chartLegendDescription" }] : []));
57968
57979
  this.chartDescriptionSentence1 = computed(() => {
57969
57980
  const metricData = this.metricData();
@@ -57998,7 +58009,7 @@ class MetricReportModalComponent {
57998
58009
  lineChartData: {
57999
58010
  series: [
58000
58011
  {
58001
- name: 'Target Projection',
58012
+ name: '2026 Projected',
58002
58013
  data: projectionData
58003
58014
  },
58004
58015
  {
@@ -58220,15 +58231,15 @@ class MetricReportModalComponent {
58220
58231
  : 'bg-slate-700 hover:bg-slate-600 text-white';
58221
58232
  }
58222
58233
  static { this.ɵfac = function MetricReportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricReportModalComponent)(); }; }
58223
- 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", "leading-none", 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", 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-xl", "font-bold", 3, "ngClass"], [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) {
58224
- 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);
58225
58236
  } if (rf & 2) {
58226
58237
  i0.ɵɵconditional(ctx.isOpen() ? 0 : -1);
58227
58238
  } }, dependencies: [CommonModule, i1$1.NgClass, PacingStatusBadgeComponent,
58228
58239
  TargetChangeBadgeComponent,
58229
58240
  TooltipDirective,
58230
- TooltipContainerComponent,
58231
58241
  LineChartComponent,
58242
+ AreaChartComponent,
58232
58243
  ProgressToTargetChartComponent], encapsulation: 2, data: { animation: [
58233
58244
  trigger('fadeIn', [
58234
58245
  transition(':enter', [
@@ -58254,8 +58265,8 @@ class MetricReportModalComponent {
58254
58265
  PacingStatusBadgeComponent,
58255
58266
  TargetChangeBadgeComponent,
58256
58267
  TooltipDirective,
58257
- TooltipContainerComponent,
58258
58268
  LineChartComponent,
58269
+ AreaChartComponent,
58259
58270
  ProgressToTargetChartComponent
58260
58271
  ],
58261
58272
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -58273,376 +58284,391 @@ class MetricReportModalComponent {
58273
58284
  ])
58274
58285
  ])
58275
58286
  ],
58276
- template: `
58277
- @if (isOpen()) {
58278
- <div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
58279
- <div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
58280
- <div
58281
- [ngClass]="backdropClasses()"
58282
- class="fixed inset-0 backdrop-blur-md"
58283
- aria-hidden="true"
58284
- @fadeIn>
58285
- </div>
58286
-
58287
- <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
58288
-
58289
- <div
58290
- (click)="$event.stopPropagation()"
58291
- [ngClass]="modalContainerClasses()"
58292
- class="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"
58293
- @slideUpFade>
58294
-
58295
- <!-- Header -->
58296
- <div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
58297
- <div class="flex items-start justify-between">
58298
- <div class="flex-1">
58299
- <div class="flex items-center gap-3 mb-2">
58300
- <h3 [ngClass]="titleClasses()" class="text-xl font-bold leading-none">
58301
- {{ metricTitle() }}
58302
- </h3>
58303
- @if (metricData()?.description) {
58304
- <button
58305
- type="button"
58306
- [ngClass]="headerInfoIconClasses()"
58307
- class="flex-shrink-0 w-7 h-7 rounded-full inline-flex items-center justify-center transition-colors"
58308
- [libSymphiqTooltip]="getMarkdownTooltipContent(metricData()!.description!, metricTitle())"
58309
- tooltipType="markdown"
58310
- tooltipPosition="right">
58311
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58312
- <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" />
58313
- </svg>
58314
- </button>
58315
- }
58316
- </div>
58317
- </div>
58318
- <button
58319
- (click)="close()"
58320
- [ngClass]="closeButtonClasses()"
58321
- class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
58322
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58323
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
58324
- </svg>
58325
- </button>
58326
- </div>
58327
- </div>
58328
-
58329
- <!-- Content -->
58330
- <div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
58331
- <symphiq-tooltip-container />
58332
-
58333
- <!-- At a Glance Summary -->
58334
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58335
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58336
- At a Glance
58337
- </h4>
58338
- <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
58339
- <!-- YTD Value -->
58340
- <div>
58341
- <div class="mb-1.5">
58342
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
58343
- Year to date
58344
- </p>
58345
- <p [ngClass]="dateLabelClasses()" class="text-xs">
58346
- {{ ytdStartDate() }}
58347
- </p>
58348
- <p [ngClass]="dateLabelClasses()" class="text-xs">
58349
- {{ ytdEndDate() }}
58350
- </p>
58351
- </div>
58352
- <p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
58353
- {{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
58354
- </p>
58355
- @if (ytdChangePercentage() !== null) {
58356
- <symphiq-target-change-badge
58357
- [viewMode]="viewMode()"
58358
- [percentageChange]="ytdChangePercentage()!"
58359
- [metric]="metricData()?.metric || ''"
58360
- [priorYear]="priorYear()"
58361
- [isCompact]="true"
58362
- />
58363
- }
58364
- </div>
58365
-
58366
- <!-- Same Period Last Year -->
58367
- <div>
58368
- <div class="mb-1.5">
58369
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
58370
- Same period last year
58371
- </p>
58372
- <p [ngClass]="dateLabelClasses()" class="text-xs">
58373
- {{ priorYearStartDate() }}
58374
- </p>
58375
- <p [ngClass]="dateLabelClasses()" class="text-xs">
58376
- {{ priorYearEndDate() }}
58377
- </p>
58378
- </div>
58379
- <p [ngClass]="valueClasses()" class="text-xl font-bold">
58380
- {{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
58381
- </p>
58382
- </div>
58383
-
58384
- <!-- Full Last Year -->
58385
- <div>
58386
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58387
- Full {{ priorYear() }} Actual
58388
- </p>
58389
- <p [ngClass]="valueClasses()" class="text-xl font-bold">
58390
- {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
58391
- </p>
58392
- </div>
58393
-
58394
- <!-- Current Pace -->
58395
- @if (pacingInfo()) {
58396
- <div>
58397
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58398
- Pace for {{ currentYear() }}
58399
- </p>
58400
- <p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
58401
- {{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
58402
- </p>
58403
- <symphiq-pacing-status-badge
58404
- [viewMode]="viewMode()"
58405
- [pacingPercentage]="pacingInfo()!.pacingPercentage"
58406
- [status]="pacingInfo()!.status"
58407
- [showAsFullText]="false"
58408
- [isCompact]="true"
58409
- [showEmphasizedPercentage]="true"
58410
- />
58411
- </div>
58412
- }
58413
-
58414
- <!-- Current Target -->
58415
- <div>
58416
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58417
- {{ currentYear() }} Target
58418
- </p>
58419
- <p [ngClass]="targetValueClasses()" class="text-xl font-bold">
58420
- {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
58421
- </p>
58422
- </div>
58423
- </div>
58424
- </div>
58425
-
58426
- <!-- Target Analysis -->
58427
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58428
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58429
- Target Analysis
58430
- </h4>
58431
-
58432
- <div class="mb-4">
58433
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
58434
- Your Target
58435
- </p>
58436
- <p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
58437
- {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
58438
- </p>
58439
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
58440
- Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
58441
- {{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
58442
- from your {{ priorYear() }} actual of
58443
- {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
58444
- </p>
58445
- </div>
58446
-
58447
- @if (pacingInfo()) {
58448
- <div class="mb-4">
58449
- <symphiq-pacing-status-badge
58450
- [viewMode]="viewMode()"
58451
- [pacingPercentage]="pacingInfo()!.pacingPercentage"
58452
- [status]="pacingInfo()!.status"
58453
- [showAsFullText]="true"
58454
- [isCompact]="false"
58455
- [showEmphasizedPercentage]="true"
58456
- />
58457
- </div>
58458
-
58459
- <div class="mb-4">
58460
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
58461
- {{ gapAnalysisText() }}
58462
- </p>
58463
- </div>
58464
-
58465
- <!-- Progress to Target Chart -->
58466
- <symphiq-progress-to-target-chart
58467
- [data]="progressToTargetData()"
58468
- [viewMode]="viewMode()"
58469
- />
58470
- }
58471
- </div>
58472
-
58473
- <!-- Contributing Metrics Table (only for funnel stage metrics) -->
58474
- @if (contributingMetrics().length > 0) {
58475
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58476
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58477
- Contributing Metric Targets
58478
- </h4>
58479
- <div class="overflow-x-auto">
58480
- <table class="w-full">
58481
- <thead>
58482
- <tr [ngClass]="tableHeaderClasses()" class="border-b">
58483
- <th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
58484
- <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
58485
- <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
58486
- </tr>
58487
- </thead>
58488
- <tbody>
58489
- @for (metric of contributingMetrics(); track metric.metric) {
58490
- <tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
58491
- <td class="py-3 px-4">
58492
- <div class="flex items-center gap-2">
58493
- <span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
58494
- @if (metric.description) {
58495
- <button
58496
- type="button"
58497
- [ngClass]="infoIconClasses()"
58498
- class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
58499
- [libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
58500
- tooltipType="markdown"
58501
- tooltipPosition="right">
58502
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58503
- <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" />
58504
- </svg>
58505
- </button>
58506
- }
58507
- </div>
58508
- </td>
58509
- <td class="py-3 px-4 text-right">
58510
- <span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
58511
- {{ formatMetricValue(metric.targetValue, metric.metric, false) }}
58512
- </span>
58513
- </td>
58514
- <td class="py-3 px-4 text-right">
58515
- <div class="flex items-center justify-end gap-2">
58516
- <span class="text-sm font-medium">
58517
- {{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
58518
- </span>
58519
- <svg
58520
- class="w-4 h-4 text-emerald-500"
58521
- fill="none"
58522
- stroke="currentColor"
58523
- viewBox="0 0 24 24">
58524
- <path
58525
- stroke-linecap="round"
58526
- stroke-linejoin="round"
58527
- stroke-width="2"
58528
- [attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
58529
- </svg>
58530
- </div>
58531
- </td>
58532
- </tr>
58533
- }
58534
- </tbody>
58535
- </table>
58536
- </div>
58537
- </div>
58538
- }
58539
-
58540
- <!-- Pacing Chart -->
58541
- @if (pacingChartData()) {
58542
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
58543
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58544
- Pace
58545
- </h4>
58546
- <div class="min-h-[400px]">
58547
- <symphiq-line-chart
58548
- [chart]="pacingChartData()!"
58549
- [showAxisLabels]="true"
58550
- [viewMode]="viewMode()"
58551
- [currencySymbol]="'$'"
58552
- />
58553
- </div>
58554
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
58555
- {{ chartLegendDescription() }}
58556
- </p>
58557
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
58558
- {{ chartDescriptionSentence1() }}
58559
- </p>
58560
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
58561
- {{ chartDescriptionSentence2() }}
58562
- </p>
58563
- </div>
58564
- }
58565
- </div>
58566
-
58567
- <!-- Footer -->
58568
- <div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
58569
- <button
58570
- (click)="close()"
58571
- [ngClass]="closeFooterButtonClasses()"
58572
- class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
58573
- Close
58574
- </button>
58575
- </div>
58576
- </div>
58577
- </div>
58578
- </div>
58579
- }
58580
- `
58581
- }]
58582
- }], 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"] }] }); })();
58583
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 349 }); })();
58287
+ template: `
58288
+ @if (isOpen()) {
58289
+ <div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
58290
+ <div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
58291
+ <div
58292
+ [ngClass]="backdropClasses()"
58293
+ class="fixed inset-0 backdrop-blur-md"
58294
+ aria-hidden="true"
58295
+ @fadeIn>
58296
+ </div>
58584
58297
 
58585
- const _c0$q = ["absoluteInputRef"];
58586
- const _c1$b = ["percentageInputRef"];
58587
- function InitialTargetSettingComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58588
- i0.ɵɵtext(0);
58589
- } if (rf & 2) {
58590
- const ctx_r0 = i0.ɵɵnextContext();
58591
- i0.ɵɵtextInterpolate1(" Your ", ctx_r0.currentYear(), " Revenue Target ");
58592
- } }
58593
- function InitialTargetSettingComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
58594
- i0.ɵɵtext(0);
58595
- } if (rf & 2) {
58596
- const ctx_r0 = i0.ɵɵnextContext();
58597
- i0.ɵɵtextInterpolate1(" Calculate Your ", ctx_r0.currentYear(), " Revenue Target ");
58598
- } }
58599
- function InitialTargetSettingComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
58600
- i0.ɵɵnamespaceSVG();
58601
- i0.ɵɵelementStart(0, "svg", 34);
58602
- i0.ɵɵelement(1, "path", 35);
58603
- i0.ɵɵelementEnd();
58604
- } if (rf & 2) {
58605
- const ctx_r0 = i0.ɵɵnextContext();
58606
- i0.ɵɵclassProp("chevron-rotate-expanded", ctx_r0.detailsExpanded());
58607
- i0.ɵɵproperty("ngClass", ctx_r0.chevronClasses());
58608
- } }
58609
- function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
58610
- const _r2 = i0.ɵɵgetCurrentView();
58611
- i0.ɵɵelementStart(0, "div", 11);
58612
- i0.ɵɵnamespaceSVG();
58613
- i0.ɵɵelementStart(1, "svg", 12);
58614
- i0.ɵɵelement(2, "path", 36);
58615
- i0.ɵɵelementEnd();
58616
- i0.ɵɵnamespaceHTML();
58617
- i0.ɵɵelementStart(3, "div")(4, "div", 37)(5, "p", 14);
58618
- i0.ɵɵtext(6, " Current Pace Projection ");
58619
- i0.ɵɵelementEnd();
58620
- i0.ɵɵelementStart(7, "button", 38);
58621
- i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_21_Template_button_click_7_listener($event) { i0.ɵɵrestoreView(_r2); return i0.ɵɵresetView($event.stopPropagation()); });
58622
- i0.ɵɵnamespaceSVG();
58623
- i0.ɵɵelementStart(8, "svg", 39);
58624
- i0.ɵɵelement(9, "path", 40);
58625
- i0.ɵɵelementEnd()()();
58626
- i0.ɵɵnamespaceHTML();
58627
- i0.ɵɵelementStart(10, "p", 15);
58628
- i0.ɵɵtext(11);
58629
- i0.ɵɵelementEnd()()();
58630
- } if (rf & 2) {
58631
- const ctx_r0 = i0.ɵɵnextContext();
58632
- i0.ɵɵadvance();
58633
- i0.ɵɵproperty("ngClass", ctx_r0.projectionIconClasses());
58634
- i0.ɵɵadvance(4);
58635
- i0.ɵɵproperty("ngClass", ctx_r0.projectionLabelClasses());
58636
- i0.ɵɵadvance(2);
58637
- i0.ɵɵproperty("ngClass", ctx_r0.infoIconClasses())("libSymphiqTooltip", ctx_r0.currentPaceProjectionTooltip);
58638
- i0.ɵɵadvance(3);
58639
- i0.ɵɵproperty("ngClass", ctx_r0.projectionValueClasses());
58640
- i0.ɵɵadvance();
58641
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.currentPaceProjection()), " ");
58642
- } }
58643
- function InitialTargetSettingComponent_Conditional_25_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58644
- const _r4 = i0.ɵɵgetCurrentView();
58645
- i0.ɵɵelementStart(0, "div", 43)(1, "span", 45);
58298
+ <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
58299
+
58300
+ <div
58301
+ (click)="$event.stopPropagation()"
58302
+ [ngClass]="modalContainerClasses()"
58303
+ class="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"
58304
+ @slideUpFade>
58305
+
58306
+ <!-- Header -->
58307
+ <div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
58308
+ <div class="flex items-start justify-between">
58309
+ <div class="flex-1">
58310
+ <div class="flex items-center gap-2 mb-2">
58311
+ <h3 [ngClass]="titleClasses()" class="text-xl font-bold">
58312
+ {{ metricTitle() }}
58313
+ </h3>
58314
+ @if (metricData()?.description) {
58315
+ <button
58316
+ type="button"
58317
+ [ngClass]="headerInfoIconClasses()"
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())"
58320
+ tooltipType="markdown"
58321
+ tooltipPosition="right">
58322
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
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" />
58324
+ </svg>
58325
+ </button>
58326
+ }
58327
+ </div>
58328
+ </div>
58329
+ <button
58330
+ (click)="close()"
58331
+ [ngClass]="closeButtonClasses()"
58332
+ class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
58333
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58334
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
58335
+ </svg>
58336
+ </button>
58337
+ </div>
58338
+ </div>
58339
+
58340
+ <!-- Content -->
58341
+ <div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
58342
+ <!-- At a Glance Summary -->
58343
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58344
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58345
+ At a Glance
58346
+ </h4>
58347
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
58348
+ <!-- YTD Value -->
58349
+ <div>
58350
+ <div class="mb-1.5">
58351
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
58352
+ Year to date
58353
+ </p>
58354
+ <p [ngClass]="dateLabelClasses()" class="text-xs">
58355
+ {{ ytdStartDate() }}
58356
+ </p>
58357
+ <p [ngClass]="dateLabelClasses()" class="text-xs">
58358
+ {{ ytdEndDate() }}
58359
+ </p>
58360
+ </div>
58361
+ <p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
58362
+ {{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
58363
+ </p>
58364
+ @if (ytdChangePercentage() !== null) {
58365
+ <symphiq-target-change-badge
58366
+ [viewMode]="viewMode()"
58367
+ [percentageChange]="ytdChangePercentage()!"
58368
+ [metric]="metricData()?.metric || ''"
58369
+ [priorYear]="priorYear()"
58370
+ [isCompact]="true"
58371
+ />
58372
+ }
58373
+ </div>
58374
+
58375
+ <!-- Same Period Last Year -->
58376
+ <div>
58377
+ <div class="mb-1.5">
58378
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
58379
+ Same period last year
58380
+ </p>
58381
+ <p [ngClass]="dateLabelClasses()" class="text-xs">
58382
+ {{ priorYearStartDate() }}
58383
+ </p>
58384
+ <p [ngClass]="dateLabelClasses()" class="text-xs">
58385
+ {{ priorYearEndDate() }}
58386
+ </p>
58387
+ </div>
58388
+ <p [ngClass]="valueClasses()" class="text-xl font-bold">
58389
+ {{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
58390
+ </p>
58391
+ </div>
58392
+
58393
+ <!-- Full Last Year -->
58394
+ <div>
58395
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58396
+ Full {{ priorYear() }} Actual
58397
+ </p>
58398
+ <p [ngClass]="valueClasses()" class="text-xl font-bold">
58399
+ {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
58400
+ </p>
58401
+ </div>
58402
+
58403
+ <!-- Current Pace -->
58404
+ @if (pacingInfo()) {
58405
+ <div>
58406
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58407
+ Pace for {{ currentYear() }}
58408
+ </p>
58409
+ <p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
58410
+ {{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
58411
+ </p>
58412
+ <symphiq-pacing-status-badge
58413
+ [viewMode]="viewMode()"
58414
+ [pacingPercentage]="pacingInfo()!.pacingPercentage"
58415
+ [status]="pacingInfo()!.status"
58416
+ [showAsFullText]="false"
58417
+ [isCompact]="true"
58418
+ [showEmphasizedPercentage]="true"
58419
+ />
58420
+ </div>
58421
+ }
58422
+
58423
+ <!-- Current Target -->
58424
+ <div>
58425
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
58426
+ {{ currentYear() }} Target
58427
+ </p>
58428
+ <p [ngClass]="targetValueClasses()" class="text-xl font-bold">
58429
+ {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
58430
+ </p>
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
+ }
58448
+ </div>
58449
+ </div>
58450
+
58451
+ <!-- Target Analysis -->
58452
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58453
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58454
+ Target Analysis
58455
+ </h4>
58456
+
58457
+ <div class="mb-4">
58458
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
58459
+ Your Target
58460
+ </p>
58461
+ <p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
58462
+ {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
58463
+ </p>
58464
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
58465
+ Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
58466
+ {{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
58467
+ from your {{ priorYear() }} actual of
58468
+ {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
58469
+ </p>
58470
+ </div>
58471
+
58472
+ @if (pacingInfo()) {
58473
+ <div class="mb-4">
58474
+ <symphiq-pacing-status-badge
58475
+ [viewMode]="viewMode()"
58476
+ [pacingPercentage]="pacingInfo()!.pacingPercentage"
58477
+ [status]="pacingInfo()!.status"
58478
+ [showAsFullText]="true"
58479
+ [isCompact]="false"
58480
+ [showEmphasizedPercentage]="true"
58481
+ />
58482
+ </div>
58483
+
58484
+ <div class="mb-4">
58485
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
58486
+ {{ gapAnalysisText() }}
58487
+ </p>
58488
+ </div>
58489
+
58490
+ <!-- Progress to Target Chart -->
58491
+ <symphiq-progress-to-target-chart
58492
+ [data]="progressToTargetData()"
58493
+ [viewMode]="viewMode()"
58494
+ />
58495
+ }
58496
+ </div>
58497
+
58498
+ <!-- Contributing Metrics Table (only for funnel stage metrics) -->
58499
+ @if (contributingMetrics().length > 0) {
58500
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
58501
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58502
+ Contributing Metric Targets
58503
+ </h4>
58504
+ <div class="overflow-x-auto">
58505
+ <table class="w-full">
58506
+ <thead>
58507
+ <tr [ngClass]="tableHeaderClasses()" class="border-b">
58508
+ <th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
58509
+ <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
58510
+ <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
58511
+ </tr>
58512
+ </thead>
58513
+ <tbody>
58514
+ @for (metric of contributingMetrics(); track metric.metric) {
58515
+ <tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
58516
+ <td class="py-3 px-4">
58517
+ <div class="flex items-center gap-2">
58518
+ <span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
58519
+ @if (metric.description) {
58520
+ <button
58521
+ type="button"
58522
+ [ngClass]="infoIconClasses()"
58523
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
58524
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
58525
+ tooltipType="markdown"
58526
+ tooltipPosition="right">
58527
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58528
+ <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" />
58529
+ </svg>
58530
+ </button>
58531
+ }
58532
+ </div>
58533
+ </td>
58534
+ <td class="py-3 px-4 text-right">
58535
+ <span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
58536
+ {{ formatMetricValue(metric.targetValue, metric.metric, false) }}
58537
+ </span>
58538
+ </td>
58539
+ <td class="py-3 px-4 text-right">
58540
+ <div class="flex items-center justify-end gap-2">
58541
+ <span class="text-sm font-medium">
58542
+ {{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
58543
+ </span>
58544
+ <svg
58545
+ class="w-4 h-4 text-emerald-500"
58546
+ fill="none"
58547
+ stroke="currentColor"
58548
+ viewBox="0 0 24 24">
58549
+ <path
58550
+ stroke-linecap="round"
58551
+ stroke-linejoin="round"
58552
+ stroke-width="2"
58553
+ [attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
58554
+ </svg>
58555
+ </div>
58556
+ </td>
58557
+ </tr>
58558
+ }
58559
+ </tbody>
58560
+ </table>
58561
+ </div>
58562
+ </div>
58563
+ }
58564
+
58565
+ <!-- Pacing Chart -->
58566
+ @if (pacingChartData()) {
58567
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
58568
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58569
+ Pace
58570
+ </h4>
58571
+ <div class="min-h-[250px]">
58572
+ <symphiq-line-chart
58573
+ [chart]="pacingChartData()!"
58574
+ [showAxisLabels]="true"
58575
+ [viewMode]="viewMode()"
58576
+ [currencySymbol]="'$'"
58577
+ [height]="'250px'"
58578
+ />
58579
+ </div>
58580
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
58581
+ {{ chartLegendDescription() }}
58582
+ </p>
58583
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
58584
+ {{ chartDescriptionSentence1() }}
58585
+ </p>
58586
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
58587
+ {{ chartDescriptionSentence2() }}
58588
+ </p>
58589
+ </div>
58590
+ }
58591
+ </div>
58592
+
58593
+ <!-- Footer -->
58594
+ <div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
58595
+ <button
58596
+ (click)="close()"
58597
+ [ngClass]="closeFooterButtonClasses()"
58598
+ class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
58599
+ Close
58600
+ </button>
58601
+ </div>
58602
+ </div>
58603
+ </div>
58604
+ </div>
58605
+ }
58606
+ `
58607
+ }]
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 }); })();
58610
+
58611
+ const _c0$q = ["absoluteInputRef"];
58612
+ const _c1$b = ["percentageInputRef"];
58613
+ function InitialTargetSettingComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58614
+ i0.ɵɵtext(0);
58615
+ } if (rf & 2) {
58616
+ const ctx_r0 = i0.ɵɵnextContext();
58617
+ i0.ɵɵtextInterpolate1(" Your ", ctx_r0.currentYear(), " Revenue Target ");
58618
+ } }
58619
+ function InitialTargetSettingComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
58620
+ i0.ɵɵtext(0);
58621
+ } if (rf & 2) {
58622
+ const ctx_r0 = i0.ɵɵnextContext();
58623
+ i0.ɵɵtextInterpolate1(" Calculate Your ", ctx_r0.currentYear(), " Revenue Target ");
58624
+ } }
58625
+ function InitialTargetSettingComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
58626
+ i0.ɵɵnamespaceSVG();
58627
+ i0.ɵɵelementStart(0, "svg", 34);
58628
+ i0.ɵɵelement(1, "path", 35);
58629
+ i0.ɵɵelementEnd();
58630
+ } if (rf & 2) {
58631
+ const ctx_r0 = i0.ɵɵnextContext();
58632
+ i0.ɵɵclassProp("chevron-rotate-expanded", ctx_r0.detailsExpanded());
58633
+ i0.ɵɵproperty("ngClass", ctx_r0.chevronClasses());
58634
+ } }
58635
+ function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
58636
+ const _r2 = i0.ɵɵgetCurrentView();
58637
+ i0.ɵɵelementStart(0, "div", 11);
58638
+ i0.ɵɵnamespaceSVG();
58639
+ i0.ɵɵelementStart(1, "svg", 12);
58640
+ i0.ɵɵelement(2, "path", 36);
58641
+ i0.ɵɵelementEnd();
58642
+ i0.ɵɵnamespaceHTML();
58643
+ i0.ɵɵelementStart(3, "div")(4, "div", 37)(5, "p", 14);
58644
+ i0.ɵɵtext(6, " Current Pace Projection ");
58645
+ i0.ɵɵelementEnd();
58646
+ i0.ɵɵelementStart(7, "button", 38);
58647
+ i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_21_Template_button_click_7_listener($event) { i0.ɵɵrestoreView(_r2); return i0.ɵɵresetView($event.stopPropagation()); });
58648
+ i0.ɵɵnamespaceSVG();
58649
+ i0.ɵɵelementStart(8, "svg", 39);
58650
+ i0.ɵɵelement(9, "path", 40);
58651
+ i0.ɵɵelementEnd()()();
58652
+ i0.ɵɵnamespaceHTML();
58653
+ i0.ɵɵelementStart(10, "p", 15);
58654
+ i0.ɵɵtext(11);
58655
+ i0.ɵɵelementEnd()()();
58656
+ } if (rf & 2) {
58657
+ const ctx_r0 = i0.ɵɵnextContext();
58658
+ i0.ɵɵadvance();
58659
+ i0.ɵɵproperty("ngClass", ctx_r0.projectionIconClasses());
58660
+ i0.ɵɵadvance(4);
58661
+ i0.ɵɵproperty("ngClass", ctx_r0.projectionLabelClasses());
58662
+ i0.ɵɵadvance(2);
58663
+ i0.ɵɵproperty("ngClass", ctx_r0.infoIconClasses())("libSymphiqTooltip", ctx_r0.currentPaceProjectionTooltip);
58664
+ i0.ɵɵadvance(3);
58665
+ i0.ɵɵproperty("ngClass", ctx_r0.projectionValueClasses());
58666
+ i0.ɵɵadvance();
58667
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.currentPaceProjection()), " ");
58668
+ } }
58669
+ function InitialTargetSettingComponent_Conditional_25_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58670
+ const _r4 = i0.ɵɵgetCurrentView();
58671
+ i0.ɵɵelementStart(0, "div", 43)(1, "span", 45);
58646
58672
  i0.ɵɵtext(2, " $ ");
58647
58673
  i0.ɵɵelementEnd();
58648
58674
  i0.ɵɵelementStart(3, "input", 46, 0);
@@ -58908,7 +58934,7 @@ function InitialTargetSettingComponent_Conditional_37_Conditional_4_Template(rf,
58908
58934
  i0.ɵɵelement(0, "symphiq-area-chart", 23);
58909
58935
  } if (rf & 2) {
58910
58936
  const ctx_r0 = i0.ɵɵnextContext(2);
58911
- 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");
58912
58938
  } }
58913
58939
  function InitialTargetSettingComponent_Conditional_37_Conditional_5_Template(rf, ctx) { if (rf & 1) {
58914
58940
  i0.ɵɵelementStart(0, "div", 24)(1, "p", 50);
@@ -59530,7 +59556,7 @@ class InitialTargetSettingComponent {
59530
59556
  let _t;
59531
59557
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
59532
59558
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
59533
- } }, 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) {
59534
59560
  i0.ɵɵelementStart(0, "div", 2);
59535
59561
  i0.ɵɵelement(1, "symphiq-tooltip-container");
59536
59562
  i0.ɵɵelementStart(2, "div", 3);
@@ -59630,7 +59656,7 @@ class InitialTargetSettingComponent {
59630
59656
  i0.ɵɵadvance();
59631
59657
  i0.ɵɵproperty("viewMode", ctx.viewMode())("isValid", ctx.isValid())("isSubmitting", ctx.isCalculating())("validationMessage", ctx.validationMessage())("buttonText", ctx.submitButtonText())("showCancelButton", ctx.calculationState() === "input" && ctx.hasStoredResponse());
59632
59658
  i0.ɵɵadvance();
59633
- 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());
59634
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,
59635
59661
  StickySubmitBarComponent,
59636
59662
  AreaChartComponent,
@@ -59649,390 +59675,391 @@ class InitialTargetSettingComponent {
59649
59675
  TooltipDirective,
59650
59676
  TooltipContainerComponent,
59651
59677
  MetricReportModalComponent
59652
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
59653
- <div class="space-y-8 pb-32">
59654
- <symphiq-tooltip-container />
59655
- <div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
59656
- [class.cursor-pointer]="calculationState() === 'results'"
59657
- [class.lg:sticky]="calculationState() === 'results'"
59658
- [style.top]="calculationState() === 'results' ? '148px' : 'auto'"
59659
- [class.z-30]="calculationState() === 'results'"
59660
- (click)="onCardClick()">
59661
- <div class="flex items-center justify-between mb-6">
59662
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold">
59663
- @if (calculationState() === 'results') {
59664
- Your {{ currentYear() }} Revenue Target
59665
- } @else {
59666
- Calculate Your {{ currentYear() }} Revenue Target
59667
- }
59668
- </h2>
59669
- @if (calculationState() === 'results') {
59670
- <svg
59671
- class="w-6 h-6 chevron-rotate"
59672
- [class.chevron-rotate-expanded]="detailsExpanded()"
59673
- [ngClass]="chevronClasses()"
59674
- fill="none"
59675
- stroke="currentColor"
59676
- viewBox="0 0 24 24">
59677
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
59678
- </svg>
59679
- }
59680
- </div>
59681
-
59682
- <div class="flex flex-col gap-4">
59683
- <div class="grid lg:grid-cols-2 gap-4">
59684
- <div class="flex flex-col gap-4">
59685
- <div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
59686
- <div class="flex flex-wrap gap-4 place-content-between">
59687
- <div class="flex items-center gap-2">
59688
- <svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59689
- <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>
59690
- </svg>
59691
- <div>
59692
- <p [ngClass]="baselineLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59693
- {{ priorYear() }} Revenue
59694
- </p>
59695
- <p [ngClass]="baselineValueClasses()" class="text-lg font-bold">
59696
- {{ formatCurrency(priorYearRevenue()) }}
59697
- </p>
59698
- </div>
59699
- </div>
59700
- @if (currentPaceProjection() > 0) {
59701
- <div class="flex items-center gap-2">
59702
- <svg class="w-4 h-4" [ngClass]="projectionIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59703
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
59704
- </svg>
59705
- <div>
59706
- <div class="flex items-center gap-1">
59707
- <p [ngClass]="projectionLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59708
- Current Pace Projection
59709
- </p>
59710
- <button
59711
- type="button"
59712
- [ngClass]="infoIconClasses()"
59713
- class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59714
- [libSymphiqTooltip]="currentPaceProjectionTooltip"
59715
- tooltipType="markdown"
59716
- tooltipPosition="top"
59717
- (click)="$event.stopPropagation()">
59718
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59719
- <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" />
59720
- </svg>
59721
- </button>
59722
- </div>
59723
- <p [ngClass]="projectionValueClasses()" class="text-lg font-bold">
59724
- {{ formatCurrency(currentPaceProjection()) }}
59725
- </p>
59726
- </div>
59727
- </div>
59728
- }
59729
- </div>
59730
-
59731
- <div class="form-area-collapse" [class.form-area-collapse-hidden]="calculationState() === 'results'" [class.mt-6]="calculationState() !== 'results'">
59732
- <div class="form-area-content">
59733
- <div class="space-y-6">
59734
- @if (calculationState() !== 'results') {
59735
- <div class="flex gap-2">
59736
- <button
59737
- (click)="setInputMode('absolute')"
59738
- [ngClass]="inputModeButtonClasses('absolute')"
59739
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59740
- Absolute Amount
59741
- </button>
59742
- <button
59743
- (click)="setInputMode('percentage')"
59744
- [ngClass]="inputModeButtonClasses('percentage')"
59745
- class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
59746
- % Increase
59747
- </button>
59748
- </div>
59749
-
59750
- @if (inputMode() === 'absolute') {
59751
- <div class="relative">
59752
- <span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59753
- $
59754
- </span>
59755
- <input
59756
- #absoluteInputRef
59757
- type="number"
59758
- [(ngModel)]="absoluteInput"
59759
- (ngModelChange)="onAbsoluteInputChange()"
59760
- [ngClass]="inputClasses()"
59761
- class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59762
- placeholder="0"
59763
- min="0"
59764
- step="1000">
59765
- </div>
59766
- } @else {
59767
- <div class="relative">
59768
- <input
59769
- #percentageInputRef
59770
- type="number"
59771
- [(ngModel)]="percentageInput"
59772
- (ngModelChange)="onPercentageInputChange()"
59773
- [ngClass]="inputClasses()"
59774
- class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
59775
- placeholder="0"
59776
- min="0"
59777
- max="1000"
59778
- step="0.1">
59779
- <span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
59780
- %
59781
- </span>
59782
- </div>
59783
- }
59784
-
59785
- @if (hasStoredResponse()) {
59786
- <div class="flex justify-end">
59787
- <button
59788
- (click)="handleCancel()"
59789
- [ngClass]="cancelButtonClasses()"
59790
- class="px-4 py-2 rounded-lg text-sm font-semibold transition-all">
59791
- Cancel
59792
- </button>
59793
- </div>
59794
- }
59795
- }
59796
- </div>
59797
- </div>
59798
- </div>
59799
- </div>
59800
-
59801
- <div class="chart-in-column" [class.chart-in-column-active]="calculationState() === 'results' && detailsExpanded()">
59802
- <div class="chart-in-column-content">
59803
- <div>
59804
- <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59805
- Year-over-Year Revenue Trend
59806
- </p>
59807
- <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59808
- @if (revenueChartData()) {
59809
- <symphiq-area-chart
59810
- [chart]="revenueChartData()!"
59811
- [showAxisLabels]="true"
59812
- [viewMode]="viewMode()"
59813
- [currencySymbol]="'$'"
59814
- [height]="'108px'"
59815
- />
59816
- } @else {
59817
- <div class="h-64 flex items-center justify-center">
59818
- <p [ngClass]="noDataClasses()" class="text-sm">
59819
- No revenue data available
59820
- </p>
59821
- </div>
59822
- }
59823
- </div>
59824
- </div>
59825
- </div>
59826
- </div>
59827
- </div>
59828
-
59829
- <div class="calculated-card-enter order-first lg:order-last" [class.calculated-card-enter-active]="calculatedRevenue() > 0">
59830
- <div class="calculated-card-content">
59831
- @if (calculatedRevenue() > 0) {
59832
- <div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2"
59833
- [class.h-full]="calculationState() !== 'results' || detailsExpanded()">
59834
- <div>
59835
- <div class="flex items-center justify-between">
59836
- <div>
59837
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59838
- {{ currentYear() }} Revenue Target
59839
- </p>
59840
- <p [ngClass]="calculatedValueClasses()" class="font-bold transition-all duration-300 text-lg"
59841
- [class.lg:text-3xl]="calculationState() !== 'results' || detailsExpanded()">
59842
- @if (calculationState() === 'results' && targets() === undefined && submittedAbsoluteInput() !== null) {
59843
- > {{ formatCurrency(submittedAbsoluteInput()!) }}
59844
- } @else {
59845
- {{ formatCurrency(displayedTargetRevenue()) }}
59846
- }
59847
- </p>
59848
- </div>
59849
- @if (calculationState() === 'results' && targets() === undefined) {
59850
- <button
59851
- (click)="handleAdjustTarget(); $event.stopPropagation()"
59852
- [ngClass]="secondaryButtonClasses()"
59853
- class="px-4 py-2 rounded-lg text-sm font-semibold transition-all whitespace-nowrap">
59854
- Adjust Revenue Target
59855
- </button>
59856
- }
59857
- </div>
59858
-
59859
- <div class="details-collapse" [class.details-collapse-expanded]="calculationState() !== 'results' || detailsExpanded()">
59860
- <div class="details-collapse-content">
59861
- <div class="relative pt-6 mt-6">
59862
- <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59863
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59864
- <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59865
- vs. {{ priorYear() }}
59866
- </span>
59867
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59868
- </div>
59869
- <div class="grid grid-cols-2 gap-4 pt-2">
59870
- <div>
59871
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59872
- Increase Amount
59873
- </p>
59874
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59875
- @if (isTargetValid()) {
59876
- {{ formatCurrency(animatedIncreaseAmount()) }}
59877
- } @else {
59878
- --
59879
- }
59880
- </p>
59881
- </div>
59882
- <div>
59883
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59884
- % Growth
59885
- </p>
59886
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59887
- @if (isTargetValid()) {
59888
- +{{ formatPercentage(animatedPercentageGrowth(), 1) }}
59889
- } @else {
59890
- --
59891
- }
59892
- </p>
59893
- </div>
59894
- </div>
59895
- </div>
59896
-
59897
- @if (currentPaceProjection() > 0) {
59898
- <div class="relative pt-6 mt-6">
59899
- <div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
59900
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59901
- <span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
59902
- {{ currentYear() }} YTD Gap
59903
- </span>
59904
- <div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
59905
- </div>
59906
- <div class="grid grid-cols-2 gap-4 pt-2">
59907
- <div>
59908
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
59909
- Gap to Close
59910
- </p>
59911
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59912
- @if (isTargetValid()) {
59913
- {{ formatCurrency(animatedGapAmount()) }}
59914
- } @else {
59915
- --
59916
- }
59917
- </p>
59918
- </div>
59919
- <div>
59920
- <div class="flex items-center gap-1 mb-1">
59921
- <p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
59922
- Additional Growth Needed
59923
- </p>
59924
- <button
59925
- type="button"
59926
- [ngClass]="infoIconClasses()"
59927
- class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
59928
- [libSymphiqTooltip]="additionalGrowthTooltip"
59929
- tooltipType="markdown"
59930
- tooltipPosition="top"
59931
- (click)="$event.stopPropagation()">
59932
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59933
- <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" />
59934
- </svg>
59935
- </button>
59936
- </div>
59937
- <p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
59938
- @if (isTargetValid()) {
59939
- {{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(animatedGapPercentage(), 1) }}
59940
- } @else {
59941
- --
59942
- }
59943
- </p>
59944
- </div>
59945
- </div>
59946
- </div>
59947
- }
59948
-
59949
- </div>
59950
- </div>
59951
- </div>
59952
- </div>
59953
- }
59954
- </div>
59955
- </div>
59956
- </div>
59957
-
59958
- @if (calculationState() !== 'results') {
59959
- <div class="w-full">
59960
- <p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
59961
- Year-over-Year Revenue Trend
59962
- </p>
59963
- <div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
59964
- @if (revenueChartData()) {
59965
- <symphiq-area-chart
59966
- [chart]="revenueChartData()!"
59967
- [showAxisLabels]="true"
59968
- [viewMode]="viewMode()"
59969
- [currencySymbol]="'$'"
59970
- [height]="'320px'"
59971
- />
59972
- } @else {
59973
- <div class="h-64 flex items-center justify-center">
59974
- <p [ngClass]="noDataClasses()" class="text-sm">
59975
- No revenue data available
59976
- </p>
59977
- </div>
59978
- }
59979
- </div>
59980
- </div>
59981
- }
59982
- </div>
59983
- </div>
59984
-
59985
- <div class="metrics-section-enter" [class.metrics-section-enter-active]="showMetricsVisualization()">
59986
- <div class="metrics-section-content">
59987
- @if (showMetricsVisualization()) {
59988
- <div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
59989
- <div class="mb-6">
59990
- <h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
59991
- Contributing Metrics
59992
- </h2>
59993
- <p [ngClass]="sectionDescriptionClasses()" class="text-sm">
59994
- @if (targets() === undefined && submittedAbsoluteInput() !== null) {
59995
- 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.
59996
- } @else {
59997
- 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.
59998
- }
59999
- </p>
60000
- </div>
60001
-
60002
- <symphiq-funnel-metrics-visualization
60003
- [viewMode]="viewMode()"
60004
- [calculations]="displayedMetricCalculations()"
60005
- [pacingMetrics]="pacingMetrics()"
60006
- (viewStageReport)="openMetricReport($event)"
60007
- (viewRelatedMetricReport)="openMetricReport($event)"
60008
- />
60009
- </div>
60010
- }
60011
- </div>
60012
- </div>
60013
-
60014
- <symphiq-sticky-submit-bar
60015
- [viewMode]="viewMode()"
60016
- [isValid]="isValid()"
60017
- [isSubmitting]="isCalculating()"
60018
- [validationMessage]="validationMessage()"
60019
- [buttonText]="submitButtonText()"
60020
- [showCancelButton]="calculationState() === 'input' && hasStoredResponse()"
60021
- (submitClick)="handleSubmitClick()"
60022
- (cancelClick)="handleCancel()"
60023
- />
60024
-
60025
- <!-- Metric Report Modal -->
60026
- <symphiq-metric-report-modal
60027
- [viewMode]="viewMode()"
60028
- [metricEnum]="selectedMetricEnum()"
60029
- [metricData]="selectedMetricData()"
60030
- [contributingMetrics]="selectedContributingMetrics()"
60031
- [pacingMetrics]="pacingMetrics()"
60032
- [isOpen]="isMetricReportOpen()"
60033
- (closed)="closeMetricReport()"
60034
- />
60035
- </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>
60036
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"] }]
60037
60064
  }], () => [], { absoluteInputRef: [{
60038
60065
  type: ViewChild,
@@ -60041,7 +60068,7 @@ class InitialTargetSettingComponent {
60041
60068
  type: ViewChild,
60042
60069
  args: ['percentageInputRef']
60043
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"] }] }); })();
60044
- (() => { (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 }); })();
60045
60072
 
60046
60073
  function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
60047
60074
  i0.ɵɵelement(0, "div", 5);