@eric-emg/symphiq-components 1.2.242 → 1.2.243

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.
@@ -32218,7 +32218,7 @@ class ShadowElevationDirective {
32218
32218
  selector: '[symphiqShadowElevation]',
32219
32219
  standalone: true
32220
32220
  }]
32221
- }], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: ScrollDepthService }, { type: Object, decorators: [{
32221
+ }], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: ScrollDepthService }, { type: undefined, decorators: [{
32222
32222
  type: Inject,
32223
32223
  args: [PLATFORM_ID]
32224
32224
  }] }], { scrollContainer: [{
@@ -47226,7 +47226,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
47226
47226
  // Get the scrollable element once for all features
47227
47227
  // Priority 1: Use the scrollElement passed directly from parent (preferred method)
47228
47228
  // Priority 2: Fall back to querying by scrollContainerId (legacy method)
47229
- let scrollElement = this.scrollElement() || null;
47229
+ const scrollElement = this.scrollElement() || null;
47230
47230
  let elementSource = 'none';
47231
47231
  if (scrollElement) {
47232
47232
  elementSource = 'passed-from-parent';
@@ -57157,9 +57157,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template
57157
57157
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r4.targetValue, metric_r4.metric, false), " ");
57158
57158
  i0.ɵɵadvance(4);
57159
57159
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatPercentage(ctx_r1.Math.abs(metric_r4.percentageIncrease), 1), " ");
57160
- i0.ɵɵadvance();
57161
- i0.ɵɵproperty("ngClass", metric_r4.percentageIncrease >= 0 ? "text-emerald-500" : "text-red-500");
57162
- i0.ɵɵadvance();
57160
+ i0.ɵɵadvance(2);
57163
57161
  i0.ɵɵattribute("d", metric_r4.percentageIncrease >= 0 ? "M5 10l7-7m0 0l7 7m-7-7v18" : "M19 14l-7 7m0 0l-7-7m7 7V3");
57164
57162
  } }
57165
57163
  function MetricReportModalComponent_Conditional_0_Conditional_55_Template(rf, ctx) { if (rf & 1) {
@@ -57173,10 +57171,10 @@ function MetricReportModalComponent_Conditional_0_Conditional_55_Template(rf, ct
57173
57171
  i0.ɵɵtext(10, "Target");
57174
57172
  i0.ɵɵelementEnd();
57175
57173
  i0.ɵɵelementStart(11, "th", 43);
57176
- i0.ɵɵtext(12, "Change");
57174
+ i0.ɵɵtext(12, "Improve by");
57177
57175
  i0.ɵɵelementEnd()()();
57178
57176
  i0.ɵɵelementStart(13, "tbody");
57179
- i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template, 15, 8, "tr", 44, _forTrack0$i);
57177
+ i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template, 15, 7, "tr", 44, _forTrack0$i);
57180
57178
  i0.ɵɵelementEnd()()()();
57181
57179
  } if (rf & 2) {
57182
57180
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -57322,7 +57320,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57322
57320
  i0.ɵɵadvance(4);
57323
57321
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57324
57322
  i0.ɵɵadvance();
57325
- i0.ɵɵtextInterpolate1(" Year to Date (", ctx_r1.ytdDateRange(), ") ");
57323
+ i0.ɵɵtextInterpolate1(" Year to Date (", ctx_r1.ytdDateRangeWithYear(), ") ");
57326
57324
  i0.ɵɵadvance();
57327
57325
  i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
57328
57326
  i0.ɵɵadvance();
@@ -57332,7 +57330,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
57332
57330
  i0.ɵɵadvance(2);
57333
57331
  i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
57334
57332
  i0.ɵɵadvance();
57335
- i0.ɵɵtextInterpolate2(" Same Period ", ctx_r1.priorYear(), " (", ctx_r1.ytdDateRange(), ") ");
57333
+ i0.ɵɵtextInterpolate1(" Same Period Last Year (", ctx_r1.priorYearDateRange(), ") ");
57336
57334
  i0.ɵɵadvance();
57337
57335
  i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
57338
57336
  i0.ɵɵadvance();
@@ -57414,10 +57412,28 @@ class MetricReportModalComponent {
57414
57412
  return calculateMetricPacing(projectedValue, metric.targetValue, increaseBad);
57415
57413
  }, ...(ngDevMode ? [{ debugName: "pacingInfo" }] : []));
57416
57414
  this.ytdValue = computed(() => {
57417
- return this.metricData()?.currentValue || 0;
57415
+ const pacingResponse = this.pacingMetrics();
57416
+ const metric = this.metricData();
57417
+ if (!pacingResponse || !metric)
57418
+ return 0;
57419
+ const resp = pacingResponse;
57420
+ const soFarMetric = resp.soFarMetricValues?.find((m) => m.metric === metric.metric);
57421
+ if (soFarMetric?.value) {
57422
+ return parseFloat(soFarMetric.value);
57423
+ }
57424
+ return 0;
57418
57425
  }, ...(ngDevMode ? [{ debugName: "ytdValue" }] : []));
57419
57426
  this.samePeriodLastYearValue = computed(() => {
57420
- return this.metricData()?.currentValue || 0;
57427
+ const pacingResponse = this.pacingMetrics();
57428
+ const metric = this.metricData();
57429
+ if (!pacingResponse || !metric)
57430
+ return 0;
57431
+ const resp = pacingResponse;
57432
+ const lastYearMetric = resp.lastYearMetricValuesMonthly?.find((m) => m.metric === metric.metric);
57433
+ if (lastYearMetric?.value) {
57434
+ return parseFloat(lastYearMetric.value);
57435
+ }
57436
+ return 0;
57421
57437
  }, ...(ngDevMode ? [{ debugName: "samePeriodLastYearValue" }] : []));
57422
57438
  this.ytdChangePercentage = computed(() => {
57423
57439
  const current = this.ytdValue();
@@ -57428,10 +57444,28 @@ class MetricReportModalComponent {
57428
57444
  }, ...(ngDevMode ? [{ debugName: "ytdChangePercentage" }] : []));
57429
57445
  this.ytdDateRange = computed(() => {
57430
57446
  const now = new Date();
57431
- const start = `Jan 1`;
57432
- const end = now.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
57433
- return `${start} - ${end}`;
57447
+ const yesterday = new Date(now);
57448
+ yesterday.setDate(yesterday.getDate() - 1);
57449
+ const startMonth = 'Jan';
57450
+ const startDay = 1;
57451
+ const endMonth = yesterday.toLocaleDateString('en-US', { month: 'short' });
57452
+ const endDay = yesterday.getDate();
57453
+ return `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
57434
57454
  }, ...(ngDevMode ? [{ debugName: "ytdDateRange" }] : []));
57455
+ this.ytdDateRangeWithYear = computed(() => {
57456
+ const now = new Date();
57457
+ const yesterday = new Date(now);
57458
+ yesterday.setDate(yesterday.getDate() - 1);
57459
+ const year = this.currentYear();
57460
+ return `Jan 1, ${year} - ${yesterday.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}, ${year}`;
57461
+ }, ...(ngDevMode ? [{ debugName: "ytdDateRangeWithYear" }] : []));
57462
+ this.priorYearDateRange = computed(() => {
57463
+ const now = new Date();
57464
+ const yesterday = new Date(now);
57465
+ yesterday.setDate(yesterday.getDate() - 1);
57466
+ const priorYear = this.priorYear();
57467
+ return `Jan 1, ${priorYear} - ${yesterday.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}, ${priorYear}`;
57468
+ }, ...(ngDevMode ? [{ debugName: "priorYearDateRange" }] : []));
57435
57469
  this.gapAnalysisText = computed(() => {
57436
57470
  const pacing = this.pacingInfo();
57437
57471
  const metric = this.metricData();
@@ -57674,8 +57708,8 @@ class MetricReportModalComponent {
57674
57708
  : 'bg-slate-700 hover:bg-slate-600 text-white';
57675
57709
  }
57676
57710
  static { this.ɵfac = function MetricReportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricReportModalComponent)(); }; }
57677
- 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, "text-xl", "font-bold", "mb-2", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "ngClass"], [1, "mt-3", "p-4", "rounded-lg", "border", "text-sm", "leading-relaxed", 3, "ngClass"], [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-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xl", "font-bold", 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"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 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"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"], [1, "space-y-2"], [1, "flex", "justify-between", "text-xs", 3, "ngClass"], [1, "h-3", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-500", 3, "ngClass"], [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", 3, "ngClass"], ["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"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
57678
- i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 60, 47, "div", 0);
57711
+ 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, "text-xl", "font-bold", "mb-2", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "ngClass"], [1, "mt-3", "p-4", "rounded-lg", "border", "text-sm", "leading-relaxed", 3, "ngClass"], [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-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xl", "font-bold", 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"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 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"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"], [1, "space-y-2"], [1, "flex", "justify-between", "text-xs", 3, "ngClass"], [1, "h-3", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-500", 3, "ngClass"], [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"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
57712
+ i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 60, 46, "div", 0);
57679
57713
  } if (rf & 2) {
57680
57714
  i0.ɵɵconditional(ctx.isOpen() ? 0 : -1);
57681
57715
  } }, dependencies: [CommonModule, i1$1.NgClass, PacingStatusBadgeComponent,
@@ -57725,312 +57759,311 @@ class MetricReportModalComponent {
57725
57759
  ])
57726
57760
  ])
57727
57761
  ],
57728
- template: `
57729
- @if (isOpen()) {
57730
- <div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
57731
- <div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
57732
- <div
57733
- [ngClass]="backdropClasses()"
57734
- class="fixed inset-0 backdrop-blur-md"
57735
- aria-hidden="true"
57736
- @fadeIn>
57737
- </div>
57738
-
57739
- <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
57740
-
57741
- <div
57742
- (click)="$event.stopPropagation()"
57743
- [ngClass]="modalContainerClasses()"
57744
- 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"
57745
- @slideUpFade>
57746
-
57747
- <!-- Header -->
57748
- <div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
57749
- <div class="flex items-start justify-between">
57750
- <div class="flex-1">
57751
- <h3 [ngClass]="titleClasses()" class="text-xl font-bold mb-2">
57752
- {{ metricTitle() }}
57753
- </h3>
57754
- @if (metricData()?.description) {
57755
- <button
57756
- type="button"
57757
- (click)="toggleDefinition()"
57758
- [ngClass]="definitionToggleClasses()"
57759
- class="inline-flex items-center gap-2 text-sm font-medium transition-colors">
57760
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57761
- <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" />
57762
- </svg>
57763
- <span>What is {{ metricTitle() }}?</span>
57764
- <svg
57765
- [class.rotate-180]="showDefinition()"
57766
- class="w-4 h-4 transition-transform"
57767
- fill="none"
57768
- stroke="currentColor"
57769
- viewBox="0 0 24 24">
57770
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
57771
- </svg>
57772
- </button>
57773
- }
57774
- @if (showDefinition() && metricData()?.description) {
57775
- <div [ngClass]="definitionBoxClasses()" class="mt-3 p-4 rounded-lg border text-sm leading-relaxed">
57776
- {{ metricData()?.description }}
57777
- </div>
57778
- }
57779
- </div>
57780
- <button
57781
- (click)="close()"
57782
- [ngClass]="closeButtonClasses()"
57783
- class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
57784
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57785
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
57786
- </svg>
57787
- </button>
57788
- </div>
57789
- </div>
57790
-
57791
- <!-- Content -->
57792
- <div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
57793
- <symphiq-tooltip-container />
57794
-
57795
- <!-- At a Glance Summary -->
57796
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57797
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57798
- At a Glance
57799
- </h4>
57800
- <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
57801
- <!-- YTD Value -->
57802
- <div>
57803
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57804
- Year to Date ({{ ytdDateRange() }})
57805
- </p>
57806
- <p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
57807
- {{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
57808
- </p>
57809
- @if (ytdChangePercentage() !== null) {
57810
- <symphiq-target-change-badge
57811
- [viewMode]="viewMode()"
57812
- [percentageChange]="ytdChangePercentage()!"
57813
- [metric]="metricData()?.metric || ''"
57814
- [priorYear]="priorYear()"
57815
- [isCompact]="true"
57816
- />
57817
- }
57818
- </div>
57819
-
57820
- <!-- Same Period Last Year -->
57821
- <div>
57822
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57823
- Same Period {{ priorYear() }} ({{ ytdDateRange() }})
57824
- </p>
57825
- <p [ngClass]="valueClasses()" class="text-xl font-bold">
57826
- {{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
57827
- </p>
57828
- </div>
57829
-
57830
- <!-- Full Last Year -->
57831
- <div>
57832
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57833
- Full {{ priorYear() }} Actual
57834
- </p>
57835
- <p [ngClass]="valueClasses()" class="text-xl font-bold">
57836
- {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
57837
- </p>
57838
- </div>
57839
-
57840
- <!-- Current Pace -->
57841
- @if (pacingInfo()) {
57842
- <div>
57843
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57844
- Pace for {{ currentYear() }}
57845
- </p>
57846
- <p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
57847
- {{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
57848
- </p>
57849
- <symphiq-pacing-status-badge
57850
- [viewMode]="viewMode()"
57851
- [pacingPercentage]="pacingInfo()!.pacingPercentage"
57852
- [status]="pacingInfo()!.status"
57853
- [showAsFullText]="false"
57854
- [isCompact]="true"
57855
- [showEmphasizedPercentage]="true"
57856
- />
57857
- </div>
57858
- }
57859
-
57860
- <!-- Current Target -->
57861
- <div>
57862
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57863
- {{ currentYear() }} Target
57864
- </p>
57865
- <p [ngClass]="targetValueClasses()" class="text-xl font-bold">
57866
- {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
57867
- </p>
57868
- </div>
57869
- </div>
57870
- </div>
57871
-
57872
- <!-- Target Analysis -->
57873
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57874
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57875
- Target Analysis
57876
- </h4>
57877
-
57878
- <div class="mb-4">
57879
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
57880
- Your Target
57881
- </p>
57882
- <p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
57883
- {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
57884
- </p>
57885
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
57886
- Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
57887
- {{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
57888
- from your {{ priorYear() }} actual of
57889
- {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
57890
- </p>
57891
- </div>
57892
-
57893
- @if (pacingInfo()) {
57894
- <div class="mb-4">
57895
- <symphiq-pacing-status-badge
57896
- [viewMode]="viewMode()"
57897
- [pacingPercentage]="pacingInfo()!.pacingPercentage"
57898
- [status]="pacingInfo()!.status"
57899
- [showAsFullText]="true"
57900
- [isCompact]="false"
57901
- [showEmphasizedPercentage]="true"
57902
- />
57903
- </div>
57904
-
57905
- <div class="mb-4">
57906
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
57907
- {{ gapAnalysisText() }}
57908
- </p>
57909
- </div>
57910
-
57911
- <!-- Progress Bar -->
57912
- <div class="space-y-2">
57913
- <div class="flex justify-between text-xs" [ngClass]="labelClasses()">
57914
- <span>Progress to Target</span>
57915
- <span>{{ formatPercentage(progressToTarget(), 1) }}</span>
57916
- </div>
57917
- <div [ngClass]="progressBarBgClasses()" class="h-3 rounded-full overflow-hidden">
57918
- <div
57919
- [ngClass]="progressBarFillClasses()"
57920
- [style.width.%]="Math.min(progressToTarget(), 100)"
57921
- class="h-full transition-all duration-500">
57922
- </div>
57923
- </div>
57924
- </div>
57925
- }
57926
- </div>
57927
-
57928
- <!-- Contributing Metrics Table (only for funnel stage metrics) -->
57929
- @if (contributingMetrics().length > 0) {
57930
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57931
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57932
- Contributing Metrics
57933
- </h4>
57934
- <div class="overflow-x-auto">
57935
- <table class="w-full">
57936
- <thead>
57937
- <tr [ngClass]="tableHeaderClasses()" class="border-b">
57938
- <th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
57939
- <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
57940
- <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Change</th>
57941
- </tr>
57942
- </thead>
57943
- <tbody>
57944
- @for (metric of contributingMetrics(); track metric.metric) {
57945
- <tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
57946
- <td class="py-3 px-4">
57947
- <div class="flex items-center gap-2">
57948
- <span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
57949
- @if (metric.description) {
57950
- <button
57951
- type="button"
57952
- [ngClass]="infoIconClasses()"
57953
- class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
57954
- [libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
57955
- tooltipType="markdown"
57956
- tooltipPosition="right">
57957
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57958
- <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" />
57959
- </svg>
57960
- </button>
57961
- }
57962
- </div>
57963
- </td>
57964
- <td class="py-3 px-4 text-right">
57965
- <span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
57966
- {{ formatMetricValue(metric.targetValue, metric.metric, false) }}
57967
- </span>
57968
- </td>
57969
- <td class="py-3 px-4 text-right">
57970
- <div class="flex items-center justify-end gap-2">
57971
- <span class="text-sm font-medium">
57972
- {{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
57973
- </span>
57974
- <svg
57975
- [ngClass]="metric.percentageIncrease >= 0 ? 'text-emerald-500' : 'text-red-500'"
57976
- class="w-4 h-4"
57977
- fill="none"
57978
- stroke="currentColor"
57979
- viewBox="0 0 24 24">
57980
- <path
57981
- stroke-linecap="round"
57982
- stroke-linejoin="round"
57983
- stroke-width="2"
57984
- [attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
57985
- </svg>
57986
- </div>
57987
- </td>
57988
- </tr>
57989
- }
57990
- </tbody>
57991
- </table>
57992
- </div>
57993
- </div>
57994
- }
57995
-
57996
- <!-- Pacing Chart -->
57997
- @if (pacingChartData()) {
57998
- <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
57999
- <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58000
- Pace
58001
- </h4>
58002
- <div class="min-h-[400px]">
58003
- <symphiq-line-chart
58004
- [chart]="pacingChartData()!"
58005
- [showAxisLabels]="true"
58006
- [viewMode]="viewMode()"
58007
- [currencySymbol]="'$'"
58008
- />
58009
- </div>
58010
- <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
58011
- {{ chartDescriptionText() }}
58012
- </p>
58013
- </div>
58014
- }
58015
- </div>
58016
-
58017
- <!-- Footer -->
58018
- <div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
58019
- <button
58020
- (click)="close()"
58021
- [ngClass]="closeFooterButtonClasses()"
58022
- class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
58023
- Close
58024
- </button>
58025
- </div>
58026
- </div>
58027
- </div>
58028
- </div>
58029
- }
57762
+ template: `
57763
+ @if (isOpen()) {
57764
+ <div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
57765
+ <div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
57766
+ <div
57767
+ [ngClass]="backdropClasses()"
57768
+ class="fixed inset-0 backdrop-blur-md"
57769
+ aria-hidden="true"
57770
+ @fadeIn>
57771
+ </div>
57772
+
57773
+ <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
57774
+
57775
+ <div
57776
+ (click)="$event.stopPropagation()"
57777
+ [ngClass]="modalContainerClasses()"
57778
+ 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"
57779
+ @slideUpFade>
57780
+
57781
+ <!-- Header -->
57782
+ <div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
57783
+ <div class="flex items-start justify-between">
57784
+ <div class="flex-1">
57785
+ <h3 [ngClass]="titleClasses()" class="text-xl font-bold mb-2">
57786
+ {{ metricTitle() }}
57787
+ </h3>
57788
+ @if (metricData()?.description) {
57789
+ <button
57790
+ type="button"
57791
+ (click)="toggleDefinition()"
57792
+ [ngClass]="definitionToggleClasses()"
57793
+ class="inline-flex items-center gap-2 text-sm font-medium transition-colors">
57794
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57795
+ <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" />
57796
+ </svg>
57797
+ <span>What is {{ metricTitle() }}?</span>
57798
+ <svg
57799
+ [class.rotate-180]="showDefinition()"
57800
+ class="w-4 h-4 transition-transform"
57801
+ fill="none"
57802
+ stroke="currentColor"
57803
+ viewBox="0 0 24 24">
57804
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
57805
+ </svg>
57806
+ </button>
57807
+ }
57808
+ @if (showDefinition() && metricData()?.description) {
57809
+ <div [ngClass]="definitionBoxClasses()" class="mt-3 p-4 rounded-lg border text-sm leading-relaxed">
57810
+ {{ metricData()?.description }}
57811
+ </div>
57812
+ }
57813
+ </div>
57814
+ <button
57815
+ (click)="close()"
57816
+ [ngClass]="closeButtonClasses()"
57817
+ class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
57818
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57819
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
57820
+ </svg>
57821
+ </button>
57822
+ </div>
57823
+ </div>
57824
+
57825
+ <!-- Content -->
57826
+ <div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
57827
+ <symphiq-tooltip-container />
57828
+
57829
+ <!-- At a Glance Summary -->
57830
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57831
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57832
+ At a Glance
57833
+ </h4>
57834
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
57835
+ <!-- YTD Value -->
57836
+ <div>
57837
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57838
+ Year to Date ({{ ytdDateRangeWithYear() }})
57839
+ </p>
57840
+ <p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
57841
+ {{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
57842
+ </p>
57843
+ @if (ytdChangePercentage() !== null) {
57844
+ <symphiq-target-change-badge
57845
+ [viewMode]="viewMode()"
57846
+ [percentageChange]="ytdChangePercentage()!"
57847
+ [metric]="metricData()?.metric || ''"
57848
+ [priorYear]="priorYear()"
57849
+ [isCompact]="true"
57850
+ />
57851
+ }
57852
+ </div>
57853
+
57854
+ <!-- Same Period Last Year -->
57855
+ <div>
57856
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57857
+ Same Period Last Year ({{ priorYearDateRange() }})
57858
+ </p>
57859
+ <p [ngClass]="valueClasses()" class="text-xl font-bold">
57860
+ {{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
57861
+ </p>
57862
+ </div>
57863
+
57864
+ <!-- Full Last Year -->
57865
+ <div>
57866
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57867
+ Full {{ priorYear() }} Actual
57868
+ </p>
57869
+ <p [ngClass]="valueClasses()" class="text-xl font-bold">
57870
+ {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
57871
+ </p>
57872
+ </div>
57873
+
57874
+ <!-- Current Pace -->
57875
+ @if (pacingInfo()) {
57876
+ <div>
57877
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57878
+ Pace for {{ currentYear() }}
57879
+ </p>
57880
+ <p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
57881
+ {{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
57882
+ </p>
57883
+ <symphiq-pacing-status-badge
57884
+ [viewMode]="viewMode()"
57885
+ [pacingPercentage]="pacingInfo()!.pacingPercentage"
57886
+ [status]="pacingInfo()!.status"
57887
+ [showAsFullText]="false"
57888
+ [isCompact]="true"
57889
+ [showEmphasizedPercentage]="true"
57890
+ />
57891
+ </div>
57892
+ }
57893
+
57894
+ <!-- Current Target -->
57895
+ <div>
57896
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
57897
+ {{ currentYear() }} Target
57898
+ </p>
57899
+ <p [ngClass]="targetValueClasses()" class="text-xl font-bold">
57900
+ {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
57901
+ </p>
57902
+ </div>
57903
+ </div>
57904
+ </div>
57905
+
57906
+ <!-- Target Analysis -->
57907
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57908
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57909
+ Target Analysis
57910
+ </h4>
57911
+
57912
+ <div class="mb-4">
57913
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
57914
+ Your Target
57915
+ </p>
57916
+ <p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
57917
+ {{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
57918
+ </p>
57919
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
57920
+ Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
57921
+ {{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
57922
+ from your {{ priorYear() }} actual of
57923
+ {{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
57924
+ </p>
57925
+ </div>
57926
+
57927
+ @if (pacingInfo()) {
57928
+ <div class="mb-4">
57929
+ <symphiq-pacing-status-badge
57930
+ [viewMode]="viewMode()"
57931
+ [pacingPercentage]="pacingInfo()!.pacingPercentage"
57932
+ [status]="pacingInfo()!.status"
57933
+ [showAsFullText]="true"
57934
+ [isCompact]="false"
57935
+ [showEmphasizedPercentage]="true"
57936
+ />
57937
+ </div>
57938
+
57939
+ <div class="mb-4">
57940
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
57941
+ {{ gapAnalysisText() }}
57942
+ </p>
57943
+ </div>
57944
+
57945
+ <!-- Progress Bar -->
57946
+ <div class="space-y-2">
57947
+ <div class="flex justify-between text-xs" [ngClass]="labelClasses()">
57948
+ <span>Progress to Target</span>
57949
+ <span>{{ formatPercentage(progressToTarget(), 1) }}</span>
57950
+ </div>
57951
+ <div [ngClass]="progressBarBgClasses()" class="h-3 rounded-full overflow-hidden">
57952
+ <div
57953
+ [ngClass]="progressBarFillClasses()"
57954
+ [style.width.%]="Math.min(progressToTarget(), 100)"
57955
+ class="h-full transition-all duration-500">
57956
+ </div>
57957
+ </div>
57958
+ </div>
57959
+ }
57960
+ </div>
57961
+
57962
+ <!-- Contributing Metrics Table (only for funnel stage metrics) -->
57963
+ @if (contributingMetrics().length > 0) {
57964
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
57965
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
57966
+ Contributing Metrics
57967
+ </h4>
57968
+ <div class="overflow-x-auto">
57969
+ <table class="w-full">
57970
+ <thead>
57971
+ <tr [ngClass]="tableHeaderClasses()" class="border-b">
57972
+ <th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
57973
+ <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
57974
+ <th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
57975
+ </tr>
57976
+ </thead>
57977
+ <tbody>
57978
+ @for (metric of contributingMetrics(); track metric.metric) {
57979
+ <tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
57980
+ <td class="py-3 px-4">
57981
+ <div class="flex items-center gap-2">
57982
+ <span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
57983
+ @if (metric.description) {
57984
+ <button
57985
+ type="button"
57986
+ [ngClass]="infoIconClasses()"
57987
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
57988
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
57989
+ tooltipType="markdown"
57990
+ tooltipPosition="right">
57991
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57992
+ <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" />
57993
+ </svg>
57994
+ </button>
57995
+ }
57996
+ </div>
57997
+ </td>
57998
+ <td class="py-3 px-4 text-right">
57999
+ <span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
58000
+ {{ formatMetricValue(metric.targetValue, metric.metric, false) }}
58001
+ </span>
58002
+ </td>
58003
+ <td class="py-3 px-4 text-right">
58004
+ <div class="flex items-center justify-end gap-2">
58005
+ <span class="text-sm font-medium">
58006
+ {{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
58007
+ </span>
58008
+ <svg
58009
+ class="w-4 h-4 text-emerald-500"
58010
+ fill="none"
58011
+ stroke="currentColor"
58012
+ viewBox="0 0 24 24">
58013
+ <path
58014
+ stroke-linecap="round"
58015
+ stroke-linejoin="round"
58016
+ stroke-width="2"
58017
+ [attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
58018
+ </svg>
58019
+ </div>
58020
+ </td>
58021
+ </tr>
58022
+ }
58023
+ </tbody>
58024
+ </table>
58025
+ </div>
58026
+ </div>
58027
+ }
58028
+
58029
+ <!-- Pacing Chart -->
58030
+ @if (pacingChartData()) {
58031
+ <div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
58032
+ <h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
58033
+ Pace
58034
+ </h4>
58035
+ <div class="min-h-[400px]">
58036
+ <symphiq-line-chart
58037
+ [chart]="pacingChartData()!"
58038
+ [showAxisLabels]="true"
58039
+ [viewMode]="viewMode()"
58040
+ [currencySymbol]="'$'"
58041
+ />
58042
+ </div>
58043
+ <p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
58044
+ {{ chartDescriptionText() }}
58045
+ </p>
58046
+ </div>
58047
+ }
58048
+ </div>
58049
+
58050
+ <!-- Footer -->
58051
+ <div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
58052
+ <button
58053
+ (click)="close()"
58054
+ [ngClass]="closeFooterButtonClasses()"
58055
+ class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
58056
+ Close
58057
+ </button>
58058
+ </div>
58059
+ </div>
58060
+ </div>
58061
+ </div>
58062
+ }
58030
58063
  `
58031
58064
  }]
58032
58065
  }], 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"] }] }); })();
58033
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 345 }); })();
58066
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 344 }); })();
58034
58067
 
58035
58068
  const _c0$q = ["absoluteInputRef"];
58036
58069
  const _c1$b = ["percentageInputRef"];
@@ -58454,7 +58487,8 @@ class InitialTargetSettingComponent {
58454
58487
  if (!selectedMetric || !selectedMetric.isFunnelStage) {
58455
58488
  return [];
58456
58489
  }
58457
- return calcs.filter(c => !c.isFunnelStage && c.funnelMetric === metricEnum);
58490
+ return calcs.filter(c => !c.isFunnelStage && c.funnelMetric === metricEnum)
58491
+ .sort((a, b) => (a.relatedInd ?? 0) - (b.relatedInd ?? 0));
58458
58492
  }, ...(ngDevMode ? [{ debugName: "selectedContributingMetrics" }] : []));
58459
58493
  this.animatedIncreaseAmount = signal(0, ...(ngDevMode ? [{ debugName: "animatedIncreaseAmount" }] : []));
58460
58494
  this.animatedPercentageGrowth = signal(0, ...(ngDevMode ? [{ debugName: "animatedPercentageGrowth" }] : []));