@eric-emg/symphiq-components 1.2.234 → 1.2.236

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.
@@ -2562,14 +2562,27 @@ function isCurrentYearTarget(target) {
2562
2562
  return (targetStart.getTime() === currentYearStart.getTime() &&
2563
2563
  targetEnd.getTime() === currentYearEnd.getTime());
2564
2564
  }
2565
+ function getMinFractionDigitsForSignificantFigures(value, minSigFigs) {
2566
+ if (value === 0)
2567
+ return 0;
2568
+ const absValue = Math.abs(value);
2569
+ if (absValue >= 1) {
2570
+ return 2;
2571
+ }
2572
+ const magnitude = Math.floor(Math.log10(absValue));
2573
+ return Math.max(0, -magnitude + minSigFigs - 1);
2574
+ }
2565
2575
  function formatCurrency(value, currencySymbol = '$') {
2576
+ const fractionDigits = getMinFractionDigitsForSignificantFigures(value, 2);
2566
2577
  return `${currencySymbol}${value.toLocaleString('en-US', {
2567
- minimumFractionDigits: 0,
2568
- maximumFractionDigits: 0
2578
+ minimumFractionDigits: fractionDigits,
2579
+ maximumFractionDigits: fractionDigits
2569
2580
  })}`;
2570
2581
  }
2571
2582
  function formatPercentage(value, decimals = 1) {
2572
- return `${value.toFixed(decimals)}%`;
2583
+ const minDecimals = getMinFractionDigitsForSignificantFigures(value, 2);
2584
+ const finalDecimals = Math.max(decimals, minDecimals);
2585
+ return `${value.toFixed(finalDecimals)}%`;
2573
2586
  }
2574
2587
  function formatNumber(value) {
2575
2588
  return value.toLocaleString('en-US', {
@@ -55112,13 +55125,13 @@ const _forTrack1$3 = ($index, $item) => $item.calc.metric;
55112
55125
  function FunnelMetricsVisualizationComponent_For_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
55113
55126
  i0.ɵɵelementStart(0, "button", 7);
55114
55127
  i0.ɵɵnamespaceSVG();
55115
- i0.ɵɵelementStart(1, "svg", 13);
55116
- i0.ɵɵelement(2, "path", 14);
55128
+ i0.ɵɵelementStart(1, "svg", 15);
55129
+ i0.ɵɵelement(2, "path", 19);
55117
55130
  i0.ɵɵelementEnd()();
55118
55131
  } if (rf & 2) {
55119
- const stage_r1 = i0.ɵɵnextContext().$implicit;
55120
- const ctx_r1 = i0.ɵɵnextContext();
55121
- i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(stage_r1.stageMetric.description, ctx_r1.getMetricTitle(stage_r1.stageMetric)));
55132
+ const stage_r2 = i0.ɵɵnextContext().$implicit;
55133
+ const ctx_r2 = i0.ɵɵnextContext();
55134
+ i0.ɵɵproperty("ngClass", ctx_r2.infoIconClasses())("libSymphiqTooltip", ctx_r2.getMarkdownTooltipContent(stage_r2.stageMetric.description, ctx_r2.getMetricTitle(stage_r2.stageMetric)));
55122
55135
  } }
55123
55136
  function FunnelMetricsVisualizationComponent_For_4_Conditional_19_Template(rf, ctx) { if (rf & 1) {
55124
55137
  i0.ɵɵelementStart(0, "div")(1, "p", 9);
@@ -55127,127 +55140,146 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_19_Template(rf, c
55127
55140
  i0.ɵɵelementStart(3, "p", 11);
55128
55141
  i0.ɵɵtext(4);
55129
55142
  i0.ɵɵelementEnd();
55130
- i0.ɵɵelement(5, "symphiq-pacing-status-badge", 15);
55143
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 20);
55131
55144
  i0.ɵɵelementEnd();
55132
55145
  } if (rf & 2) {
55133
- const stage_r1 = i0.ɵɵnextContext().$implicit;
55134
- const ctx_r1 = i0.ɵɵnextContext();
55146
+ const stage_r2 = i0.ɵɵnextContext().$implicit;
55147
+ const ctx_r2 = i0.ɵɵnextContext();
55135
55148
  i0.ɵɵadvance();
55136
- i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55149
+ i0.ɵɵproperty("ngClass", ctx_r2.labelClasses());
55137
55150
  i0.ɵɵadvance();
55138
- i0.ɵɵtextInterpolate1(" Pace for ", ctx_r1.currentYear(), " ");
55151
+ i0.ɵɵtextInterpolate1(" Pace for ", ctx_r2.currentYear(), " ");
55139
55152
  i0.ɵɵadvance();
55140
- i0.ɵɵproperty("ngClass", ctx_r1.projectedValueClasses());
55153
+ i0.ɵɵproperty("ngClass", ctx_r2.projectedValueClasses());
55141
55154
  i0.ɵɵadvance();
55142
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.pacingInfo.projectedValue, stage_r1.stageMetric.metric, false), " ");
55155
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(stage_r2.pacingInfo.projectedValue, stage_r2.stageMetric.metric, false), " ");
55143
55156
  i0.ɵɵadvance();
55144
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", stage_r1.pacingInfo.pacingPercentage)("status", stage_r1.pacingInfo.status)("showAsFullText", true)("showEmphasizedPercentage", true);
55157
+ i0.ɵɵproperty("viewMode", ctx_r2.viewMode())("pacingPercentage", stage_r2.pacingInfo.pacingPercentage)("status", stage_r2.pacingInfo.status)("showAsFullText", true)("showEmphasizedPercentage", true);
55145
55158
  } }
55146
- function FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55147
- i0.ɵɵelementStart(0, "button", 23);
55159
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55160
+ i0.ɵɵelementStart(0, "button", 28);
55148
55161
  i0.ɵɵnamespaceSVG();
55149
- i0.ɵɵelementStart(1, "svg", 29);
55150
- i0.ɵɵelement(2, "path", 14);
55162
+ i0.ɵɵelementStart(1, "svg", 36);
55163
+ i0.ɵɵelement(2, "path", 19);
55151
55164
  i0.ɵɵelementEnd()();
55152
55165
  } if (rf & 2) {
55153
- const metric_r3 = i0.ɵɵnextContext().$implicit;
55154
- const ctx_r1 = i0.ɵɵnextContext(3);
55155
- i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(metric_r3.calc.description, ctx_r1.getMetricTitle(metric_r3.calc)));
55166
+ const metric_r5 = i0.ɵɵnextContext().$implicit;
55167
+ const ctx_r2 = i0.ɵɵnextContext(3);
55168
+ i0.ɵɵproperty("ngClass", ctx_r2.infoIconClasses())("libSymphiqTooltip", ctx_r2.getMarkdownTooltipContent(metric_r5.calc.description, ctx_r2.getMetricTitle(metric_r5.calc)));
55156
55169
  } }
55157
- function FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
55158
- i0.ɵɵelementStart(0, "div")(1, "p", 25);
55170
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
55171
+ i0.ɵɵelementStart(0, "div")(1, "p", 30);
55159
55172
  i0.ɵɵtext(2);
55160
55173
  i0.ɵɵelementEnd();
55161
- i0.ɵɵelementStart(3, "p", 27);
55174
+ i0.ɵɵelementStart(3, "p", 32);
55162
55175
  i0.ɵɵtext(4);
55163
55176
  i0.ɵɵelementEnd();
55164
- i0.ɵɵelement(5, "symphiq-pacing-status-badge", 30);
55177
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 37);
55165
55178
  i0.ɵɵelementEnd();
55166
55179
  } if (rf & 2) {
55167
- const metric_r3 = i0.ɵɵnextContext().$implicit;
55168
- const ctx_r1 = i0.ɵɵnextContext(3);
55180
+ const metric_r5 = i0.ɵɵnextContext().$implicit;
55181
+ const ctx_r2 = i0.ɵɵnextContext(3);
55169
55182
  i0.ɵɵadvance();
55170
- i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
55183
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedLabelClasses());
55171
55184
  i0.ɵɵadvance();
55172
- i0.ɵɵtextInterpolate1(" Pace for ", ctx_r1.currentYear(), " ");
55185
+ i0.ɵɵtextInterpolate1(" Pace for ", ctx_r2.currentYear(), " ");
55173
55186
  i0.ɵɵadvance();
55174
- i0.ɵɵproperty("ngClass", ctx_r1.relatedProjectedValueClasses());
55187
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedProjectedValueClasses());
55175
55188
  i0.ɵɵadvance();
55176
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.pacingInfo.projectedValue, metric_r3.calc.metric, false), " ");
55189
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(metric_r5.pacingInfo.projectedValue, metric_r5.calc.metric, false), " ");
55177
55190
  i0.ɵɵadvance();
55178
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", metric_r3.pacingInfo.pacingPercentage)("status", metric_r3.pacingInfo.status)("showAsFullText", true)("isCompact", true)("showEmphasizedPercentage", true);
55191
+ i0.ɵɵproperty("viewMode", ctx_r2.viewMode())("pacingPercentage", metric_r5.pacingInfo.pacingPercentage)("status", metric_r5.pacingInfo.status)("showAsFullText", true)("isCompact", true)("showEmphasizedPercentage", true);
55179
55192
  } }
55180
- function FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Template(rf, ctx) { if (rf & 1) {
55181
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "p", 22);
55193
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Template(rf, ctx) { if (rf & 1) {
55194
+ const _r4 = i0.ɵɵgetCurrentView();
55195
+ i0.ɵɵelementStart(0, "div", 25)(1, "div", 26)(2, "p", 27);
55182
55196
  i0.ɵɵtext(3);
55183
55197
  i0.ɵɵelementEnd();
55184
- i0.ɵɵconditionalCreate(4, FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Conditional_4_Template, 3, 2, "button", 23);
55198
+ i0.ɵɵconditionalCreate(4, FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Conditional_4_Template, 3, 2, "button", 28);
55185
55199
  i0.ɵɵelementEnd();
55186
- i0.ɵɵelementStart(5, "div", 24)(6, "div")(7, "p", 25);
55200
+ i0.ɵɵelementStart(5, "div", 29)(6, "div")(7, "p", 30);
55187
55201
  i0.ɵɵtext(8);
55188
55202
  i0.ɵɵelementEnd();
55189
- i0.ɵɵelementStart(9, "p", 26);
55203
+ i0.ɵɵelementStart(9, "p", 31);
55190
55204
  i0.ɵɵtext(10);
55191
55205
  i0.ɵɵelementEnd()();
55192
- i0.ɵɵelementStart(11, "div")(12, "p", 25);
55206
+ i0.ɵɵelementStart(11, "div")(12, "p", 30);
55193
55207
  i0.ɵɵtext(13);
55194
55208
  i0.ɵɵelementEnd();
55195
- i0.ɵɵelementStart(14, "p", 27);
55209
+ i0.ɵɵelementStart(14, "p", 32);
55196
55210
  i0.ɵɵtext(15);
55197
55211
  i0.ɵɵelementEnd();
55198
- i0.ɵɵelement(16, "symphiq-target-change-badge", 28);
55212
+ i0.ɵɵelement(16, "symphiq-target-change-badge", 33);
55199
55213
  i0.ɵɵelementEnd();
55200
- i0.ɵɵconditionalCreate(17, FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Conditional_17_Template, 6, 10, "div");
55201
- i0.ɵɵelementEnd()();
55214
+ i0.ɵɵconditionalCreate(17, FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Conditional_17_Template, 6, 10, "div");
55215
+ i0.ɵɵelementEnd();
55216
+ i0.ɵɵelementStart(18, "div", 34)(19, "button", 35);
55217
+ i0.ɵɵlistener("click", function FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Template_button_click_19_listener() { const metric_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onViewRelatedMetricReport(metric_r5.calc.metric)); });
55218
+ i0.ɵɵnamespaceSVG();
55219
+ i0.ɵɵelementStart(20, "svg", 15);
55220
+ i0.ɵɵelement(21, "path", 16);
55221
+ i0.ɵɵelementEnd();
55222
+ i0.ɵɵnamespaceHTML();
55223
+ i0.ɵɵelementStart(22, "span", 17);
55224
+ i0.ɵɵtext(23, "View Report");
55225
+ i0.ɵɵelementEnd();
55226
+ i0.ɵɵelementStart(24, "span", 18);
55227
+ i0.ɵɵtext(25, "Report");
55228
+ i0.ɵɵelementEnd()()()();
55202
55229
  } if (rf & 2) {
55203
- const metric_r3 = ctx.$implicit;
55204
- const ctx_r1 = i0.ɵɵnextContext(3);
55205
- i0.ɵɵproperty("ngClass", ctx_r1.relatedMetricCardClasses());
55230
+ const metric_r5 = ctx.$implicit;
55231
+ const ctx_r2 = i0.ɵɵnextContext(3);
55232
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedMetricCardClasses());
55206
55233
  i0.ɵɵadvance(2);
55207
- i0.ɵɵproperty("ngClass", ctx_r1.relatedMetricNameClasses());
55234
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedMetricNameClasses());
55208
55235
  i0.ɵɵadvance();
55209
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getMetricTitle(metric_r3.calc), " ");
55236
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getMetricTitle(metric_r5.calc), " ");
55210
55237
  i0.ɵɵadvance();
55211
- i0.ɵɵconditional(metric_r3.calc.description ? 4 : -1);
55238
+ i0.ɵɵconditional(metric_r5.calc.description ? 4 : -1);
55212
55239
  i0.ɵɵadvance(3);
55213
- i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
55240
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedLabelClasses());
55214
55241
  i0.ɵɵadvance();
55215
- i0.ɵɵtextInterpolate1(" ", ctx_r1.priorYear(), " Actual ");
55242
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.priorYear(), " Actual ");
55216
55243
  i0.ɵɵadvance();
55217
- i0.ɵɵproperty("ngClass", ctx_r1.relatedValueClasses());
55244
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedValueClasses());
55218
55245
  i0.ɵɵadvance();
55219
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.calc.currentValue, metric_r3.calc.metric), " ");
55246
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(metric_r5.calc.currentValue, metric_r5.calc.metric), " ");
55220
55247
  i0.ɵɵadvance(2);
55221
- i0.ɵɵproperty("ngClass", ctx_r1.relatedLabelClasses());
55248
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedLabelClasses());
55249
+ i0.ɵɵadvance();
55250
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentYear(), " Target ");
55251
+ i0.ɵɵadvance();
55252
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedTargetValueClasses());
55222
55253
  i0.ɵɵadvance();
55223
- i0.ɵɵtextInterpolate1(" ", ctx_r1.currentYear(), " Target ");
55254
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(metric_r5.calc.targetValue, metric_r5.calc.metric, false), " ");
55224
55255
  i0.ɵɵadvance();
55225
- i0.ɵɵproperty("ngClass", ctx_r1.relatedTargetValueClasses());
55256
+ i0.ɵɵproperty("viewMode", ctx_r2.viewMode())("percentageChange", metric_r5.calc.percentageIncrease)("metric", metric_r5.calc.metric)("priorYear", ctx_r2.priorYear())("isCompact", true);
55226
55257
  i0.ɵɵadvance();
55227
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.calc.targetValue, metric_r3.calc.metric, false), " ");
55258
+ i0.ɵɵconditional(metric_r5.pacingInfo ? 17 : -1);
55228
55259
  i0.ɵɵadvance();
55229
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("percentageChange", metric_r3.calc.percentageIncrease)("metric", metric_r3.calc.metric)("priorYear", ctx_r1.priorYear())("isCompact", true);
55260
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedActionBarClasses());
55230
55261
  i0.ɵɵadvance();
55231
- i0.ɵɵconditional(metric_r3.pacingInfo ? 17 : -1);
55262
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedActionButtonClasses());
55232
55263
  } }
55233
- function FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template(rf, ctx) { if (rf & 1) {
55234
- i0.ɵɵelement(0, "div", 16);
55235
- i0.ɵɵelementStart(1, "div", 17)(2, "p", 18);
55264
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_28_Template(rf, ctx) { if (rf & 1) {
55265
+ i0.ɵɵelement(0, "div", 21);
55266
+ i0.ɵɵelementStart(1, "div", 22)(2, "p", 23);
55236
55267
  i0.ɵɵtext(3, " Related Metrics ");
55237
55268
  i0.ɵɵelementEnd();
55238
- i0.ɵɵelementStart(4, "div", 19);
55239
- i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_20_For_6_Template, 18, 18, "div", 20, _forTrack1$3);
55269
+ i0.ɵɵelementStart(4, "div", 24);
55270
+ i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_28_For_6_Template, 26, 20, "div", 25, _forTrack1$3);
55240
55271
  i0.ɵɵelementEnd()();
55241
55272
  } if (rf & 2) {
55242
- const stage_r1 = i0.ɵɵnextContext().$implicit;
55243
- const ctx_r1 = i0.ɵɵnextContext();
55244
- i0.ɵɵproperty("ngClass", ctx_r1.dividerClasses());
55273
+ const stage_r2 = i0.ɵɵnextContext().$implicit;
55274
+ const ctx_r2 = i0.ɵɵnextContext();
55275
+ i0.ɵɵproperty("ngClass", ctx_r2.dividerClasses());
55245
55276
  i0.ɵɵadvance(2);
55246
- i0.ɵɵproperty("ngClass", ctx_r1.relatedTitleClasses());
55277
+ i0.ɵɵproperty("ngClass", ctx_r2.relatedTitleClasses());
55247
55278
  i0.ɵɵadvance(3);
55248
- i0.ɵɵrepeater(stage_r1.relatedMetrics);
55279
+ i0.ɵɵrepeater(stage_r2.relatedMetrics);
55249
55280
  } }
55250
55281
  function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf & 1) {
55282
+ const _r1 = i0.ɵɵgetCurrentView();
55251
55283
  i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5)(4, "h3", 6);
55252
55284
  i0.ɵɵtext(5);
55253
55285
  i0.ɵɵelementEnd();
@@ -55269,46 +55301,65 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55269
55301
  i0.ɵɵelementEnd();
55270
55302
  i0.ɵɵconditionalCreate(19, FunnelMetricsVisualizationComponent_For_4_Conditional_19_Template, 6, 9, "div");
55271
55303
  i0.ɵɵelementEnd();
55272
- i0.ɵɵconditionalCreate(20, FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template, 7, 2);
55304
+ i0.ɵɵelementStart(20, "div", 13)(21, "button", 14);
55305
+ i0.ɵɵlistener("click", function FunnelMetricsVisualizationComponent_For_4_Template_button_click_21_listener() { const stage_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewStageReport(stage_r2.stageMetric.metric)); });
55306
+ i0.ɵɵnamespaceSVG();
55307
+ i0.ɵɵelementStart(22, "svg", 15);
55308
+ i0.ɵɵelement(23, "path", 16);
55309
+ i0.ɵɵelementEnd();
55310
+ i0.ɵɵnamespaceHTML();
55311
+ i0.ɵɵelementStart(24, "span", 17);
55312
+ i0.ɵɵtext(25, "View Report");
55313
+ i0.ɵɵelementEnd();
55314
+ i0.ɵɵelementStart(26, "span", 18);
55315
+ i0.ɵɵtext(27, "Report");
55316
+ i0.ɵɵelementEnd()()();
55317
+ i0.ɵɵconditionalCreate(28, FunnelMetricsVisualizationComponent_For_4_Conditional_28_Template, 7, 2);
55273
55318
  i0.ɵɵelementEnd();
55274
55319
  } if (rf & 2) {
55275
- const stage_r1 = ctx.$implicit;
55276
- const ctx_r1 = i0.ɵɵnextContext();
55277
- i0.ɵɵproperty("ngClass", ctx_r1.stageCardClasses());
55320
+ const stage_r2 = ctx.$implicit;
55321
+ const ctx_r2 = i0.ɵɵnextContext();
55322
+ i0.ɵɵproperty("ngClass", ctx_r2.stageCardClasses());
55278
55323
  i0.ɵɵadvance(4);
55279
- i0.ɵɵproperty("ngClass", ctx_r1.stageTitleClasses());
55324
+ i0.ɵɵproperty("ngClass", ctx_r2.stageTitleClasses());
55280
55325
  i0.ɵɵadvance();
55281
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getMetricTitle(stage_r1.stageMetric), " ");
55326
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getMetricTitle(stage_r2.stageMetric), " ");
55282
55327
  i0.ɵɵadvance();
55283
- i0.ɵɵconditional(stage_r1.stageMetric.description ? 6 : -1);
55328
+ i0.ɵɵconditional(stage_r2.stageMetric.description ? 6 : -1);
55284
55329
  i0.ɵɵadvance(3);
55285
- i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55330
+ i0.ɵɵproperty("ngClass", ctx_r2.labelClasses());
55286
55331
  i0.ɵɵadvance();
55287
- i0.ɵɵtextInterpolate1(" ", ctx_r1.priorYear(), " Actual ");
55332
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.priorYear(), " Actual ");
55288
55333
  i0.ɵɵadvance();
55289
- i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
55334
+ i0.ɵɵproperty("ngClass", ctx_r2.valueClasses());
55290
55335
  i0.ɵɵadvance();
55291
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.stageMetric.currentValue, stage_r1.stageMetric.metric), " ");
55336
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(stage_r2.stageMetric.currentValue, stage_r2.stageMetric.metric), " ");
55292
55337
  i0.ɵɵadvance(2);
55293
- i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
55338
+ i0.ɵɵproperty("ngClass", ctx_r2.labelClasses());
55294
55339
  i0.ɵɵadvance();
55295
- i0.ɵɵtextInterpolate1(" ", ctx_r1.currentYear(), " Target ");
55340
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentYear(), " Target ");
55296
55341
  i0.ɵɵadvance();
55297
- i0.ɵɵproperty("ngClass", ctx_r1.targetValueClasses());
55342
+ i0.ɵɵproperty("ngClass", ctx_r2.targetValueClasses());
55343
+ i0.ɵɵadvance();
55344
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatMetricValue(stage_r2.stageMetric.targetValue, stage_r2.stageMetric.metric, false), " ");
55298
55345
  i0.ɵɵadvance();
55299
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.stageMetric.targetValue, stage_r1.stageMetric.metric, false), " ");
55346
+ i0.ɵɵproperty("viewMode", ctx_r2.viewMode())("percentageChange", stage_r2.stageMetric.percentageIncrease)("metric", stage_r2.stageMetric.metric)("priorYear", ctx_r2.priorYear());
55300
55347
  i0.ɵɵadvance();
55301
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("percentageChange", stage_r1.stageMetric.percentageIncrease)("metric", stage_r1.stageMetric.metric)("priorYear", ctx_r1.priorYear());
55348
+ i0.ɵɵconditional(stage_r2.pacingInfo ? 19 : -1);
55302
55349
  i0.ɵɵadvance();
55303
- i0.ɵɵconditional(stage_r1.pacingInfo ? 19 : -1);
55350
+ i0.ɵɵproperty("ngClass", ctx_r2.stageActionBarClasses());
55304
55351
  i0.ɵɵadvance();
55305
- i0.ɵɵconditional(stage_r1.relatedMetrics.length > 0 ? 20 : -1);
55352
+ i0.ɵɵproperty("ngClass", ctx_r2.actionButtonClasses());
55353
+ i0.ɵɵadvance(7);
55354
+ i0.ɵɵconditional(stage_r2.relatedMetrics.length > 0 ? 28 : -1);
55306
55355
  } }
55307
55356
  class FunnelMetricsVisualizationComponent {
55308
55357
  constructor() {
55309
55358
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
55310
55359
  this.calculations = input([], ...(ngDevMode ? [{ debugName: "calculations" }] : []));
55311
55360
  this.pacingMetrics = input(undefined, ...(ngDevMode ? [{ debugName: "pacingMetrics" }] : []));
55361
+ this.viewStageReport = output();
55362
+ this.viewRelatedMetricReport = output();
55312
55363
  this.Math = Math;
55313
55364
  this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
55314
55365
  this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
@@ -55450,12 +55501,38 @@ class FunnelMetricsVisualizationComponent {
55450
55501
  getMarkdownTooltipContent(markdown, title) {
55451
55502
  return { title, markdown };
55452
55503
  }
55504
+ stageActionBarClasses() {
55505
+ return this.viewMode() === ViewModeEnum.DARK
55506
+ ? 'border-purple-500/20'
55507
+ : 'border-purple-200/50';
55508
+ }
55509
+ actionButtonClasses() {
55510
+ return this.viewMode() === ViewModeEnum.DARK
55511
+ ? 'bg-purple-500/20 text-purple-300 hover:bg-purple-500/30 hover:text-purple-200 border border-purple-400/30 hover:border-purple-400/50'
55512
+ : 'bg-purple-50 text-purple-700 hover:bg-purple-100 hover:text-purple-800 border border-purple-200 hover:border-purple-300';
55513
+ }
55514
+ relatedActionBarClasses() {
55515
+ return this.viewMode() === ViewModeEnum.DARK
55516
+ ? 'border-slate-700/50'
55517
+ : 'border-slate-200';
55518
+ }
55519
+ relatedActionButtonClasses() {
55520
+ return this.viewMode() === ViewModeEnum.DARK
55521
+ ? 'bg-slate-700/50 text-slate-300 hover:bg-slate-600/50 hover:text-slate-200 border border-slate-600/50 hover:border-slate-500/50'
55522
+ : 'bg-slate-50 text-slate-700 hover:bg-slate-100 hover:text-slate-800 border border-slate-200 hover:border-slate-300';
55523
+ }
55524
+ onViewStageReport(metric) {
55525
+ this.viewStageReport.emit(metric);
55526
+ }
55527
+ onViewRelatedMetricReport(metric) {
55528
+ this.viewRelatedMetricReport.emit(metric);
55529
+ }
55453
55530
  static { this.ɵfac = function FunnelMetricsVisualizationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FunnelMetricsVisualizationComponent)(); }; }
55454
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FunnelMetricsVisualizationComponent, selectors: [["symphiq-funnel-metrics-visualization"]], inputs: { viewMode: [1, "viewMode"], calculations: [1, "calculations"], pacingMetrics: [1, "pacingMetrics"] }, decls: 5, vars: 0, consts: [[1, "space-y-6"], [1, "space-y-8"], [1, "rounded-xl", "p-6", "border-2", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-1"], [1, "text-lg", "sm:text-xl", "font-bold", "leading-tight", "m-0", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-6", "h-6", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-6", "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-3", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear"], ["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", "showEmphasizedPercentage"], [1, "my-4", 3, "ngClass"], [1, "space-y-3"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-3", 3, "ngClass"], [1, "grid", "gap-3"], [1, "p-4", "rounded-lg", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mb-4"], [1, "text-sm", "sm:text-base", "font-semibold", "leading-tight", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "text-lg", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55531
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FunnelMetricsVisualizationComponent, selectors: [["symphiq-funnel-metrics-visualization"]], inputs: { viewMode: [1, "viewMode"], calculations: [1, "calculations"], pacingMetrics: [1, "pacingMetrics"] }, outputs: { viewStageReport: "viewStageReport", viewRelatedMetricReport: "viewRelatedMetricReport" }, decls: 5, vars: 0, consts: [[1, "space-y-6"], [1, "space-y-8"], [1, "rounded-xl", "p-6", "border-2", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-1"], [1, "text-lg", "sm:text-xl", "font-bold", "leading-tight", "m-0", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-6", "h-6", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-6", "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-3", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear"], [1, "mt-4", "pt-3", "border-t", "flex", "justify-end", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "px-4", "py-2.5", "rounded-lg", "font-medium", "text-sm", "transition-all", "duration-200", 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", "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"], [1, "hidden", "sm:inline"], [1, "sm:hidden"], ["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", "showEmphasizedPercentage"], [1, "my-4", 3, "ngClass"], [1, "space-y-3"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-3", 3, "ngClass"], [1, "grid", "gap-3"], [1, "p-4", "rounded-lg", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mb-4"], [1, "text-sm", "sm:text-base", "font-semibold", "leading-tight", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "text-lg", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "mt-3", "pt-3", "border-t", "flex", "justify-end", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "px-3", "py-2", "rounded-lg", "font-medium", "text-sm", "transition-all", "duration-200", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55455
55532
  i0.ɵɵelementStart(0, "div", 0);
55456
55533
  i0.ɵɵelement(1, "symphiq-tooltip-container");
55457
55534
  i0.ɵɵelementStart(2, "div", 1);
55458
- i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 21, 18, "div", 2, _forTrack0$i);
55535
+ i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 29, 20, "div", 2, _forTrack0$i);
55459
55536
  i0.ɵɵelementEnd()();
55460
55537
  } if (rf & 2) {
55461
55538
  i0.ɵɵadvance(3);
@@ -55469,161 +55546,189 @@ class FunnelMetricsVisualizationComponent {
55469
55546
  standalone: true,
55470
55547
  imports: [CommonModule, PacingStatusBadgeComponent, TargetChangeBadgeComponent, TooltipDirective, TooltipContainerComponent],
55471
55548
  changeDetection: ChangeDetectionStrategy.OnPush,
55472
- template: `
55473
- <div class="space-y-6">
55474
- <symphiq-tooltip-container />
55475
- <div class="space-y-8">
55476
- @for (stage of funnelStages(); track stage.stageMetric.metric) {
55477
- <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55478
- <div class="flex items-start justify-between mb-6">
55479
- <div class="flex-1">
55480
- <div class="flex items-center gap-2 mb-1">
55481
- <h3 [ngClass]="stageTitleClasses()" class="text-lg sm:text-xl font-bold leading-tight m-0">
55482
- {{ getMetricTitle(stage.stageMetric) }}
55483
- </h3>
55484
- @if (stage.stageMetric.description) {
55485
- <button
55486
- type="button"
55487
- [ngClass]="infoIconClasses()"
55488
- class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55489
- [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55490
- tooltipType="markdown"
55491
- tooltipPosition="right">
55492
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55493
- <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" />
55494
- </svg>
55495
- </button>
55496
- }
55497
- </div>
55498
- </div>
55499
- </div>
55500
-
55501
- <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4">
55502
- <div>
55503
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55504
- {{ priorYear() }} Actual
55505
- </p>
55506
- <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55507
- {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55508
- </p>
55509
- </div>
55510
- <div>
55511
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55512
- {{ currentYear() }} Target
55513
- </p>
55514
- <p [ngClass]="targetValueClasses()" class="text-2xl font-bold mb-3">
55515
- {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric, false) }}
55516
- </p>
55517
- <symphiq-target-change-badge
55518
- [viewMode]="viewMode()"
55519
- [percentageChange]="stage.stageMetric.percentageIncrease"
55520
- [metric]="stage.stageMetric.metric"
55521
- [priorYear]="priorYear()"
55522
- />
55523
- </div>
55524
- @if (stage.pacingInfo) {
55525
- <div>
55526
- <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55527
- Pace for {{ currentYear() }}
55528
- </p>
55529
- <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold mb-3">
55530
- {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55531
- </p>
55532
- <symphiq-pacing-status-badge
55533
- [viewMode]="viewMode()"
55534
- [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55535
- [status]="stage.pacingInfo.status"
55536
- [showAsFullText]="true"
55537
- [showEmphasizedPercentage]="true"
55538
- />
55539
- </div>
55540
- }
55541
- </div>
55542
-
55543
- @if (stage.relatedMetrics.length > 0) {
55544
- <div [ngClass]="dividerClasses()" class="my-4"></div>
55545
-
55546
- <div class="space-y-3">
55547
- <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55548
- Related Metrics
55549
- </p>
55550
- <div class="grid gap-3">
55551
- @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55552
- <div [ngClass]="relatedMetricCardClasses()" class="p-4 rounded-lg">
55553
- <div class="flex items-center gap-2 mb-4">
55554
- <p [ngClass]="relatedMetricNameClasses()" class="text-sm sm:text-base font-semibold leading-tight">
55555
- {{ getMetricTitle(metric.calc) }}
55556
- </p>
55557
- @if (metric.calc.description) {
55558
- <button
55559
- type="button"
55560
- [ngClass]="infoIconClasses()"
55561
- class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55562
- [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55563
- tooltipType="markdown"
55564
- tooltipPosition="right">
55565
- <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55566
- <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" />
55567
- </svg>
55568
- </button>
55569
- }
55570
- </div>
55571
- <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
55572
- <div>
55573
- <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55574
- {{ priorYear() }} Actual
55575
- </p>
55576
- <p [ngClass]="relatedValueClasses()" class="text-lg font-bold">
55577
- {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}
55578
- </p>
55579
- </div>
55580
- <div>
55581
- <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55582
- {{ currentYear() }} Target
55583
- </p>
55584
- <p [ngClass]="relatedTargetValueClasses()" class="text-lg font-bold mb-2">
55585
- {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric, false) }}
55586
- </p>
55587
- <symphiq-target-change-badge
55588
- [viewMode]="viewMode()"
55589
- [percentageChange]="metric.calc.percentageIncrease"
55590
- [metric]="metric.calc.metric"
55591
- [priorYear]="priorYear()"
55592
- [isCompact]="true"
55593
- />
55594
- </div>
55595
- @if (metric.pacingInfo) {
55596
- <div>
55597
- <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55598
- Pace for {{ currentYear() }}
55599
- </p>
55600
- <p [ngClass]="relatedProjectedValueClasses()" class="text-lg font-bold mb-2">
55601
- {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}
55602
- </p>
55603
- <symphiq-pacing-status-badge
55604
- [viewMode]="viewMode()"
55605
- [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55606
- [status]="metric.pacingInfo.status"
55607
- [showAsFullText]="true"
55608
- [isCompact]="true"
55609
- [showEmphasizedPercentage]="true"
55610
- />
55611
- </div>
55612
- }
55613
- </div>
55614
- </div>
55615
- }
55616
- </div>
55617
- </div>
55618
- }
55619
- </div>
55620
- }
55621
- </div>
55622
- </div>
55549
+ template: `
55550
+ <div class="space-y-6">
55551
+ <symphiq-tooltip-container />
55552
+ <div class="space-y-8">
55553
+ @for (stage of funnelStages(); track stage.stageMetric.metric) {
55554
+ <div [ngClass]="stageCardClasses()" class="rounded-xl p-6 border-2 transition-all duration-200">
55555
+ <div class="flex items-start justify-between mb-6">
55556
+ <div class="flex-1">
55557
+ <div class="flex items-center gap-2 mb-1">
55558
+ <h3 [ngClass]="stageTitleClasses()" class="text-lg sm:text-xl font-bold leading-tight m-0">
55559
+ {{ getMetricTitle(stage.stageMetric) }}
55560
+ </h3>
55561
+ @if (stage.stageMetric.description) {
55562
+ <button
55563
+ type="button"
55564
+ [ngClass]="infoIconClasses()"
55565
+ class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center transition-colors"
55566
+ [libSymphiqTooltip]="getMarkdownTooltipContent(stage.stageMetric.description, getMetricTitle(stage.stageMetric))"
55567
+ tooltipType="markdown"
55568
+ tooltipPosition="right">
55569
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55570
+ <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" />
55571
+ </svg>
55572
+ </button>
55573
+ }
55574
+ </div>
55575
+ </div>
55576
+ </div>
55577
+
55578
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4">
55579
+ <div>
55580
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55581
+ {{ priorYear() }} Actual
55582
+ </p>
55583
+ <p [ngClass]="valueClasses()" class="text-2xl font-bold">
55584
+ {{ formatMetricValue(stage.stageMetric.currentValue, stage.stageMetric.metric) }}
55585
+ </p>
55586
+ </div>
55587
+ <div>
55588
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55589
+ {{ currentYear() }} Target
55590
+ </p>
55591
+ <p [ngClass]="targetValueClasses()" class="text-2xl font-bold mb-3">
55592
+ {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric, false) }}
55593
+ </p>
55594
+ <symphiq-target-change-badge
55595
+ [viewMode]="viewMode()"
55596
+ [percentageChange]="stage.stageMetric.percentageIncrease"
55597
+ [metric]="stage.stageMetric.metric"
55598
+ [priorYear]="priorYear()"
55599
+ />
55600
+ </div>
55601
+ @if (stage.pacingInfo) {
55602
+ <div>
55603
+ <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55604
+ Pace for {{ currentYear() }}
55605
+ </p>
55606
+ <p [ngClass]="projectedValueClasses()" class="text-2xl font-bold mb-3">
55607
+ {{ formatMetricValue(stage.pacingInfo.projectedValue, stage.stageMetric.metric, false) }}
55608
+ </p>
55609
+ <symphiq-pacing-status-badge
55610
+ [viewMode]="viewMode()"
55611
+ [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55612
+ [status]="stage.pacingInfo.status"
55613
+ [showAsFullText]="true"
55614
+ [showEmphasizedPercentage]="true"
55615
+ />
55616
+ </div>
55617
+ }
55618
+ </div>
55619
+
55620
+ <div [ngClass]="stageActionBarClasses()" class="mt-4 pt-3 border-t flex justify-end">
55621
+ <button
55622
+ type="button"
55623
+ (click)="onViewStageReport(stage.stageMetric.metric)"
55624
+ [ngClass]="actionButtonClasses()"
55625
+ class="inline-flex items-center gap-2 px-4 py-2.5 rounded-lg font-medium text-sm transition-all duration-200">
55626
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55627
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
55628
+ </svg>
55629
+ <span class="hidden sm:inline">View Report</span>
55630
+ <span class="sm:hidden">Report</span>
55631
+ </button>
55632
+ </div>
55633
+
55634
+ @if (stage.relatedMetrics.length > 0) {
55635
+ <div [ngClass]="dividerClasses()" class="my-4"></div>
55636
+
55637
+ <div class="space-y-3">
55638
+ <p [ngClass]="relatedTitleClasses()" class="text-xs font-semibold uppercase tracking-wider mb-3">
55639
+ Related Metrics
55640
+ </p>
55641
+ <div class="grid gap-3">
55642
+ @for (metric of stage.relatedMetrics; track metric.calc.metric) {
55643
+ <div [ngClass]="relatedMetricCardClasses()" class="p-4 rounded-lg">
55644
+ <div class="flex items-center gap-2 mb-4">
55645
+ <p [ngClass]="relatedMetricNameClasses()" class="text-sm sm:text-base font-semibold leading-tight">
55646
+ {{ getMetricTitle(metric.calc) }}
55647
+ </p>
55648
+ @if (metric.calc.description) {
55649
+ <button
55650
+ type="button"
55651
+ [ngClass]="infoIconClasses()"
55652
+ class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
55653
+ [libSymphiqTooltip]="getMarkdownTooltipContent(metric.calc.description, getMetricTitle(metric.calc))"
55654
+ tooltipType="markdown"
55655
+ tooltipPosition="right">
55656
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55657
+ <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" />
55658
+ </svg>
55659
+ </button>
55660
+ }
55661
+ </div>
55662
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
55663
+ <div>
55664
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55665
+ {{ priorYear() }} Actual
55666
+ </p>
55667
+ <p [ngClass]="relatedValueClasses()" class="text-lg font-bold">
55668
+ {{ formatMetricValue(metric.calc.currentValue, metric.calc.metric) }}
55669
+ </p>
55670
+ </div>
55671
+ <div>
55672
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55673
+ {{ currentYear() }} Target
55674
+ </p>
55675
+ <p [ngClass]="relatedTargetValueClasses()" class="text-lg font-bold mb-2">
55676
+ {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric, false) }}
55677
+ </p>
55678
+ <symphiq-target-change-badge
55679
+ [viewMode]="viewMode()"
55680
+ [percentageChange]="metric.calc.percentageIncrease"
55681
+ [metric]="metric.calc.metric"
55682
+ [priorYear]="priorYear()"
55683
+ [isCompact]="true"
55684
+ />
55685
+ </div>
55686
+ @if (metric.pacingInfo) {
55687
+ <div>
55688
+ <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55689
+ Pace for {{ currentYear() }}
55690
+ </p>
55691
+ <p [ngClass]="relatedProjectedValueClasses()" class="text-lg font-bold mb-2">
55692
+ {{ formatMetricValue(metric.pacingInfo.projectedValue, metric.calc.metric, false) }}
55693
+ </p>
55694
+ <symphiq-pacing-status-badge
55695
+ [viewMode]="viewMode()"
55696
+ [pacingPercentage]="metric.pacingInfo.pacingPercentage"
55697
+ [status]="metric.pacingInfo.status"
55698
+ [showAsFullText]="true"
55699
+ [isCompact]="true"
55700
+ [showEmphasizedPercentage]="true"
55701
+ />
55702
+ </div>
55703
+ }
55704
+ </div>
55705
+
55706
+ <div [ngClass]="relatedActionBarClasses()" class="mt-3 pt-3 border-t flex justify-end">
55707
+ <button
55708
+ type="button"
55709
+ (click)="onViewRelatedMetricReport(metric.calc.metric)"
55710
+ [ngClass]="relatedActionButtonClasses()"
55711
+ class="inline-flex items-center gap-2 px-3 py-2 rounded-lg font-medium text-sm transition-all duration-200">
55712
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
55713
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
55714
+ </svg>
55715
+ <span class="hidden sm:inline">View Report</span>
55716
+ <span class="sm:hidden">Report</span>
55717
+ </button>
55718
+ </div>
55719
+ </div>
55720
+ }
55721
+ </div>
55722
+ </div>
55723
+ }
55724
+ </div>
55725
+ }
55726
+ </div>
55727
+ </div>
55623
55728
  `
55624
55729
  }]
55625
- }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], calculations: [{ type: i0.Input, args: [{ isSignal: true, alias: "calculations", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }] }); })();
55626
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 170 }); })();
55730
+ }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], calculations: [{ type: i0.Input, args: [{ isSignal: true, alias: "calculations", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], viewStageReport: [{ type: i0.Output, args: ["viewStageReport"] }], viewRelatedMetricReport: [{ type: i0.Output, args: ["viewRelatedMetricReport"] }] }); })();
55731
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 198 }); })();
55627
55732
 
55628
55733
  function StickySubmitBarComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55629
55734
  i0.ɵɵelementStart(0, "div", 4);
@@ -57381,7 +57486,7 @@ class InitialTargetSettingComponent {
57381
57486
  i0.ɵɵconditionalCreate(7, InitialTargetSettingComponent_Conditional_7_Template, 2, 3, ":svg:svg", 6);
57382
57487
  i0.ɵɵelementEnd();
57383
57488
  i0.ɵɵelementStart(8, "div", 7)(9, "div", 8)(10, "div", 7)(11, "div", 9);
57384
- i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_div_click_11_listener() { return ctx.onCardClick(); });
57489
+ i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_div_click_11_listener($event) { ctx.onCardClick(); return $event.stopPropagation(); });
57385
57490
  i0.ɵɵelementStart(12, "div", 10)(13, "div", 11);
57386
57491
  i0.ɵɵnamespaceSVG();
57387
57492
  i0.ɵɵelementStart(14, "svg", 12);
@@ -57515,7 +57620,7 @@ class InitialTargetSettingComponent {
57515
57620
  <div class="flex flex-col gap-4">
57516
57621
  <div class="grid lg:grid-cols-2 gap-4">
57517
57622
  <div class="flex flex-col gap-4">
57518
- <div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick()">
57623
+ <div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
57519
57624
  <div class="flex flex-wrap gap-4 place-content-between">
57520
57625
  <div class="flex items-center gap-2">
57521
57626
  <svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">