@eric-emg/symphiq-components 1.2.227 → 1.2.228

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.
@@ -54794,6 +54794,53 @@ function extractProjectedValue(pacingResponse, metricEnum) {
54794
54794
  return projectedValue;
54795
54795
  }
54796
54796
 
54797
+ function PacingStatusBadgeComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
54798
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 2);
54799
+ i0.ɵɵtext(2);
54800
+ i0.ɵɵelementEnd();
54801
+ i0.ɵɵelementStart(3, "div", 3)(4, "span", 3);
54802
+ i0.ɵɵtext(5);
54803
+ i0.ɵɵelementEnd();
54804
+ i0.ɵɵelementStart(6, "span");
54805
+ i0.ɵɵtext(7);
54806
+ i0.ɵɵelementEnd()()();
54807
+ } if (rf & 2) {
54808
+ const ctx_r0 = i0.ɵɵnextContext();
54809
+ i0.ɵɵadvance();
54810
+ i0.ɵɵclassMap(ctx_r0.overlayPositionClasses());
54811
+ i0.ɵɵproperty("ngClass", ctx_r0.overlayBadgeClasses());
54812
+ i0.ɵɵadvance();
54813
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.extractPercentage(), " ");
54814
+ i0.ɵɵadvance();
54815
+ i0.ɵɵclassMap(ctx_r0.sizeClasses());
54816
+ i0.ɵɵproperty("ngClass", ctx_r0.badgeClasses());
54817
+ i0.ɵɵadvance();
54818
+ i0.ɵɵclassMap(ctx_r0.iconSizeClasses());
54819
+ i0.ɵɵproperty("ngClass", ctx_r0.iconClasses());
54820
+ i0.ɵɵadvance();
54821
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.iconSymbol(), " ");
54822
+ i0.ɵɵadvance(2);
54823
+ i0.ɵɵtextInterpolate(ctx_r0.displayTextWithoutPercentage());
54824
+ } }
54825
+ function PacingStatusBadgeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
54826
+ i0.ɵɵelementStart(0, "div", 3)(1, "span", 3);
54827
+ i0.ɵɵtext(2);
54828
+ i0.ɵɵelementEnd();
54829
+ i0.ɵɵelementStart(3, "span");
54830
+ i0.ɵɵtext(4);
54831
+ i0.ɵɵelementEnd()();
54832
+ } if (rf & 2) {
54833
+ const ctx_r0 = i0.ɵɵnextContext();
54834
+ i0.ɵɵclassMap(ctx_r0.sizeClasses());
54835
+ i0.ɵɵproperty("ngClass", ctx_r0.badgeClasses());
54836
+ i0.ɵɵadvance();
54837
+ i0.ɵɵclassMap(ctx_r0.iconSizeClasses());
54838
+ i0.ɵɵproperty("ngClass", ctx_r0.iconClasses());
54839
+ i0.ɵɵadvance();
54840
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.iconSymbol(), " ");
54841
+ i0.ɵɵadvance(2);
54842
+ i0.ɵɵtextInterpolate(ctx_r0.displayText());
54843
+ } }
54797
54844
  class PacingStatusBadgeComponent {
54798
54845
  constructor() {
54799
54846
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
@@ -54801,6 +54848,7 @@ class PacingStatusBadgeComponent {
54801
54848
  this.status = input('on-pace', ...(ngDevMode ? [{ debugName: "status" }] : []));
54802
54849
  this.showAsFullText = input(false, ...(ngDevMode ? [{ debugName: "showAsFullText" }] : []));
54803
54850
  this.isCompact = input(false, ...(ngDevMode ? [{ debugName: "isCompact" }] : []));
54851
+ this.showEmphasizedPercentage = input(false, ...(ngDevMode ? [{ debugName: "showEmphasizedPercentage" }] : []));
54804
54852
  this.displayInfo = computed(() => {
54805
54853
  const isDark = this.viewMode() === ViewModeEnum.DARK;
54806
54854
  return getPacingDisplayInfo(this.pacingPercentage(), this.status(), isDark);
@@ -54811,11 +54859,16 @@ class PacingStatusBadgeComponent {
54811
54859
  }, ...(ngDevMode ? [{ debugName: "badgeClasses" }] : []));
54812
54860
  this.sizeClasses = computed(() => {
54813
54861
  const isCompact = this.isCompact();
54862
+ const showEmphasized = this.showEmphasizedPercentage();
54814
54863
  const baseClasses = 'inline-flex items-center gap-1.5 rounded-lg border font-semibold transition-all';
54815
54864
  if (isCompact) {
54816
- return `${baseClasses} px-2.5 py-1 text-xs`;
54865
+ return showEmphasized
54866
+ ? `${baseClasses} px-2.5 py-1 pt-2.5 text-xs`
54867
+ : `${baseClasses} px-2.5 py-1 text-xs`;
54817
54868
  }
54818
- return `${baseClasses} px-3 py-1.5 text-xs`;
54869
+ return showEmphasized
54870
+ ? `${baseClasses} px-3 py-1.5 pt-3 text-xs`
54871
+ : `${baseClasses} px-3 py-1.5 text-xs`;
54819
54872
  }, ...(ngDevMode ? [{ debugName: "sizeClasses" }] : []));
54820
54873
  this.iconClasses = computed(() => {
54821
54874
  return this.displayInfo().colorClass;
@@ -54837,25 +54890,59 @@ class PacingStatusBadgeComponent {
54837
54890
  }
54838
54891
  return this.displayInfo().displayText;
54839
54892
  }, ...(ngDevMode ? [{ debugName: "displayText" }] : []));
54893
+ this.extractPercentage = computed(() => {
54894
+ const fullText = this.showAsFullText()
54895
+ ? formatPacingDisplayFullText(this.pacingPercentage(), this.status())
54896
+ : this.displayInfo().displayText;
54897
+ const match = fullText.match(/(\d+\.?\d*%)/);
54898
+ return match ? match[1] : '';
54899
+ }, ...(ngDevMode ? [{ debugName: "extractPercentage" }] : []));
54900
+ this.displayTextWithoutPercentage = computed(() => {
54901
+ const fullText = this.showAsFullText()
54902
+ ? formatPacingDisplayFullText(this.pacingPercentage(), this.status())
54903
+ : this.displayInfo().displayText;
54904
+ const textWithoutPercentage = fullText.replace(/\s*at\s*\d+\.?\d*%\s*/, ' ').replace(/\s+/, ' ');
54905
+ return textWithoutPercentage;
54906
+ }, ...(ngDevMode ? [{ debugName: "displayTextWithoutPercentage" }] : []));
54907
+ this.overlayBadgeClasses = computed(() => {
54908
+ const isDark = this.viewMode() === ViewModeEnum.DARK;
54909
+ const status = this.status();
54910
+ const isCompact = this.isCompact();
54911
+ const baseClasses = 'px-2.5 py-0.5 rounded-md font-extrabold tracking-tight';
54912
+ const sizeClass = isCompact ? 'text-xs' : 'text-sm';
54913
+ if (isDark) {
54914
+ if (status === 'ahead') {
54915
+ return `${baseClasses} ${sizeClass} bg-emerald-500/95 text-white border-emerald-400/50 shadow-emerald-500/50`;
54916
+ }
54917
+ else if (status === 'behind') {
54918
+ return `${baseClasses} ${sizeClass} bg-rose-500/95 text-white border-rose-400/50 shadow-rose-500/50`;
54919
+ }
54920
+ else {
54921
+ return `${baseClasses} ${sizeClass} bg-amber-500/95 text-white border-amber-400/50 shadow-amber-500/50`;
54922
+ }
54923
+ }
54924
+ else {
54925
+ if (status === 'ahead') {
54926
+ return `${baseClasses} ${sizeClass} bg-emerald-600 text-white border-emerald-500 shadow-emerald-600/50`;
54927
+ }
54928
+ else if (status === 'behind') {
54929
+ return `${baseClasses} ${sizeClass} bg-rose-600 text-white border-rose-500 shadow-rose-600/50`;
54930
+ }
54931
+ else {
54932
+ return `${baseClasses} ${sizeClass} bg-amber-600 text-white border-amber-500 shadow-amber-600/50`;
54933
+ }
54934
+ }
54935
+ }, ...(ngDevMode ? [{ debugName: "overlayBadgeClasses" }] : []));
54936
+ this.overlayPositionClasses = computed(() => {
54937
+ const isCompact = this.isCompact();
54938
+ return isCompact ? '-top-0.5 left-1.5' : '-top-1 left-2';
54939
+ }, ...(ngDevMode ? [{ debugName: "overlayPositionClasses" }] : []));
54840
54940
  }
54841
54941
  static { this.ɵfac = function PacingStatusBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PacingStatusBadgeComponent)(); }; }
54842
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PacingStatusBadgeComponent, selectors: [["symphiq-pacing-status-badge"]], inputs: { viewMode: [1, "viewMode"], pacingPercentage: [1, "pacingPercentage"], status: [1, "status"], showAsFullText: [1, "showAsFullText"], isCompact: [1, "isCompact"] }, decls: 5, vars: 8, consts: [[3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
54843
- i0.ɵɵelementStart(0, "div", 0)(1, "span", 0);
54844
- i0.ɵɵtext(2);
54845
- i0.ɵɵelementEnd();
54846
- i0.ɵɵelementStart(3, "span");
54847
- i0.ɵɵtext(4);
54848
- i0.ɵɵelementEnd()();
54942
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PacingStatusBadgeComponent, selectors: [["symphiq-pacing-status-badge"]], inputs: { viewMode: [1, "viewMode"], pacingPercentage: [1, "pacingPercentage"], status: [1, "status"], showAsFullText: [1, "showAsFullText"], isCompact: [1, "isCompact"], showEmphasizedPercentage: [1, "showEmphasizedPercentage"] }, decls: 2, vars: 1, consts: [[1, "relative", "inline-flex"], [3, "ngClass", "class"], [1, "absolute", "z-10", "border-2", "shadow-lg", "transition-all", "duration-200", 3, "ngClass"], [3, "ngClass"]], template: function PacingStatusBadgeComponent_Template(rf, ctx) { if (rf & 1) {
54943
+ i0.ɵɵconditionalCreate(0, PacingStatusBadgeComponent_Conditional_0_Template, 8, 12, "div", 0)(1, PacingStatusBadgeComponent_Conditional_1_Template, 5, 8, "div", 1);
54849
54944
  } if (rf & 2) {
54850
- i0.ɵɵclassMap(ctx.sizeClasses());
54851
- i0.ɵɵproperty("ngClass", ctx.badgeClasses());
54852
- i0.ɵɵadvance();
54853
- i0.ɵɵclassMap(ctx.iconSizeClasses());
54854
- i0.ɵɵproperty("ngClass", ctx.iconClasses());
54855
- i0.ɵɵadvance();
54856
- i0.ɵɵtextInterpolate1(" ", ctx.iconSymbol(), " ");
54857
- i0.ɵɵadvance(2);
54858
- i0.ɵɵtextInterpolate(ctx.displayText());
54945
+ i0.ɵɵconditional(ctx.showEmphasizedPercentage() ? 0 : 1);
54859
54946
  } }, dependencies: [CommonModule, i1$1.NgClass], encapsulation: 2, changeDetection: 0 }); }
54860
54947
  }
54861
54948
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PacingStatusBadgeComponent, [{
@@ -54866,41 +54953,60 @@ class PacingStatusBadgeComponent {
54866
54953
  imports: [CommonModule],
54867
54954
  changeDetection: ChangeDetectionStrategy.OnPush,
54868
54955
  template: `
54869
- <div
54870
- [ngClass]="badgeClasses()"
54871
- [class]="sizeClasses()"
54872
- >
54873
- <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
54874
- {{ iconSymbol() }}
54875
- </span>
54876
- <span>{{ displayText() }}</span>
54877
- </div>
54956
+ @if (showEmphasizedPercentage()) {
54957
+ <div class="relative inline-flex">
54958
+ <div [ngClass]="overlayBadgeClasses()"
54959
+ [class]="overlayPositionClasses()"
54960
+ class="absolute z-10 border-2 shadow-lg transition-all duration-200">
54961
+ {{ extractPercentage() }}
54962
+ </div>
54963
+ <div
54964
+ [ngClass]="badgeClasses()"
54965
+ [class]="sizeClasses()"
54966
+ >
54967
+ <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
54968
+ {{ iconSymbol() }}
54969
+ </span>
54970
+ <span>{{ displayTextWithoutPercentage() }}</span>
54971
+ </div>
54972
+ </div>
54973
+ } @else {
54974
+ <div
54975
+ [ngClass]="badgeClasses()"
54976
+ [class]="sizeClasses()"
54977
+ >
54978
+ <span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
54979
+ {{ iconSymbol() }}
54980
+ </span>
54981
+ <span>{{ displayText() }}</span>
54982
+ </div>
54983
+ }
54878
54984
  `
54879
54985
  }]
54880
- }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], pacingPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingPercentage", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], showAsFullText: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAsFullText", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }] }); })();
54881
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PacingStatusBadgeComponent, { className: "PacingStatusBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/pacing-status-badge.component.ts", lineNumber: 23 }); })();
54986
+ }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], pacingPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingPercentage", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], showAsFullText: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAsFullText", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }], showEmphasizedPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmphasizedPercentage", required: false }] }] }); })();
54987
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PacingStatusBadgeComponent, { className: "PacingStatusBadgeComponent", filePath: "lib/components/revenue-calculator-dashboard/pacing-status-badge.component.ts", lineNumber: 42 }); })();
54882
54988
 
54883
54989
  const _forTrack0$i = ($index, $item) => $item.stageMetric.metric;
54884
54990
  const _forTrack1$3 = ($index, $item) => $item.calc.metric;
54885
54991
  function FunnelMetricsVisualizationComponent_For_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
54886
54992
  i0.ɵɵelementStart(0, "button", 7);
54887
54993
  i0.ɵɵnamespaceSVG();
54888
- i0.ɵɵelementStart(1, "svg", 13);
54889
- i0.ɵɵelement(2, "path", 14);
54994
+ i0.ɵɵelementStart(1, "svg", 15);
54995
+ i0.ɵɵelement(2, "path", 16);
54890
54996
  i0.ɵɵelementEnd()();
54891
54997
  } if (rf & 2) {
54892
54998
  const stage_r1 = i0.ɵɵnextContext().$implicit;
54893
54999
  const ctx_r1 = i0.ɵɵnextContext();
54894
55000
  i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(stage_r1.stageMetric.description, ctx_r1.getMetricTitle(stage_r1.stageMetric)));
54895
55001
  } }
54896
- function FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template(rf, ctx) { if (rf & 1) {
55002
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template(rf, ctx) { if (rf & 1) {
54897
55003
  i0.ɵɵelementStart(0, "div")(1, "p", 9);
54898
55004
  i0.ɵɵtext(2);
54899
55005
  i0.ɵɵelementEnd();
54900
55006
  i0.ɵɵelementStart(3, "p", 11);
54901
55007
  i0.ɵɵtext(4);
54902
55008
  i0.ɵɵelementEnd();
54903
- i0.ɵɵelement(5, "symphiq-pacing-status-badge", 15);
55009
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 17);
54904
55010
  i0.ɵɵelementEnd();
54905
55011
  } if (rf & 2) {
54906
55012
  const stage_r1 = i0.ɵɵnextContext().$implicit;
@@ -54914,27 +55020,27 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template(rf, c
54914
55020
  i0.ɵɵadvance();
54915
55021
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.pacingInfo.projectedValue, stage_r1.stageMetric.metric, false), " ");
54916
55022
  i0.ɵɵadvance();
54917
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", stage_r1.pacingInfo.pacingPercentage)("status", stage_r1.pacingInfo.status)("showAsFullText", true);
55023
+ i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", stage_r1.pacingInfo.pacingPercentage)("status", stage_r1.pacingInfo.status)("showAsFullText", true)("showEmphasizedPercentage", true);
54918
55024
  } }
54919
- function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
54920
- i0.ɵɵelementStart(0, "button", 23);
55025
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55026
+ i0.ɵɵelementStart(0, "button", 25);
54921
55027
  i0.ɵɵnamespaceSVG();
54922
- i0.ɵɵelementStart(1, "svg", 29);
54923
- i0.ɵɵelement(2, "path", 14);
55028
+ i0.ɵɵelementStart(1, "svg", 32);
55029
+ i0.ɵɵelement(2, "path", 16);
54924
55030
  i0.ɵɵelementEnd()();
54925
55031
  } if (rf & 2) {
54926
55032
  const metric_r3 = i0.ɵɵnextContext().$implicit;
54927
55033
  const ctx_r1 = i0.ɵɵnextContext(3);
54928
55034
  i0.ɵɵproperty("ngClass", ctx_r1.infoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(metric_r3.calc.description, ctx_r1.getMetricTitle(metric_r3.calc)));
54929
55035
  } }
54930
- function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
54931
- i0.ɵɵelementStart(0, "div")(1, "p", 25);
55036
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Conditional_21_Template(rf, ctx) { if (rf & 1) {
55037
+ i0.ɵɵelementStart(0, "div")(1, "p", 27);
54932
55038
  i0.ɵɵtext(2);
54933
55039
  i0.ɵɵelementEnd();
54934
- i0.ɵɵelementStart(3, "p", 27);
55040
+ i0.ɵɵelementStart(3, "p", 29);
54935
55041
  i0.ɵɵtext(4);
54936
55042
  i0.ɵɵelementEnd();
54937
- i0.ɵɵelement(5, "symphiq-pacing-status-badge", 30);
55043
+ i0.ɵɵelement(5, "symphiq-pacing-status-badge", 33);
54938
55044
  i0.ɵɵelementEnd();
54939
55045
  } if (rf & 2) {
54940
55046
  const metric_r3 = i0.ɵɵnextContext().$implicit;
@@ -54948,30 +55054,33 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditio
54948
55054
  i0.ɵɵadvance();
54949
55055
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.pacingInfo.projectedValue, metric_r3.calc.metric, false), " ");
54950
55056
  i0.ɵɵadvance();
54951
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", metric_r3.pacingInfo.pacingPercentage)("status", metric_r3.pacingInfo.status)("showAsFullText", true)("isCompact", true);
55057
+ i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", metric_r3.pacingInfo.pacingPercentage)("status", metric_r3.pacingInfo.status)("showAsFullText", true)("isCompact", true)("showEmphasizedPercentage", true);
54952
55058
  } }
54953
- function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Template(rf, ctx) { if (rf & 1) {
54954
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "p", 22);
55059
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Template(rf, ctx) { if (rf & 1) {
55060
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 23)(2, "p", 24);
54955
55061
  i0.ɵɵtext(3);
54956
55062
  i0.ɵɵelementEnd();
54957
- i0.ɵɵconditionalCreate(4, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_4_Template, 3, 2, "button", 23);
55063
+ i0.ɵɵconditionalCreate(4, FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Conditional_4_Template, 3, 2, "button", 25);
54958
55064
  i0.ɵɵelementEnd();
54959
- i0.ɵɵelementStart(5, "div", 24)(6, "div")(7, "p", 25);
55065
+ i0.ɵɵelementStart(5, "div", 26)(6, "div")(7, "p", 27);
54960
55066
  i0.ɵɵtext(8);
54961
55067
  i0.ɵɵelementEnd();
54962
- i0.ɵɵelementStart(9, "p", 26);
55068
+ i0.ɵɵelementStart(9, "p", 28);
54963
55069
  i0.ɵɵtext(10);
54964
55070
  i0.ɵɵelementEnd()();
54965
- i0.ɵɵelementStart(11, "div")(12, "p", 25);
55071
+ i0.ɵɵelementStart(11, "div")(12, "p", 27);
54966
55072
  i0.ɵɵtext(13);
54967
55073
  i0.ɵɵelementEnd();
54968
- i0.ɵɵelementStart(14, "p", 27);
55074
+ i0.ɵɵelementStart(14, "p", 29);
54969
55075
  i0.ɵɵtext(15);
54970
55076
  i0.ɵɵelementEnd();
54971
- i0.ɵɵelementStart(16, "div", 28);
54972
- i0.ɵɵtext(17);
54973
- i0.ɵɵelementEnd()();
54974
- i0.ɵɵconditionalCreate(18, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Conditional_18_Template, 6, 9, "div");
55077
+ i0.ɵɵelementStart(16, "div", 12)(17, "div", 30);
55078
+ i0.ɵɵtext(18);
55079
+ i0.ɵɵelementEnd();
55080
+ i0.ɵɵelementStart(19, "div", 31);
55081
+ i0.ɵɵtext(20);
55082
+ i0.ɵɵelementEnd()()();
55083
+ i0.ɵɵconditionalCreate(21, FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Conditional_21_Template, 6, 10, "div");
54975
55084
  i0.ɵɵelementEnd()();
54976
55085
  } if (rf & 2) {
54977
55086
  const metric_r3 = ctx.$implicit;
@@ -54999,20 +55108,24 @@ function FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Template
54999
55108
  i0.ɵɵproperty("ngClass", ctx_r1.relatedTargetValueClasses());
55000
55109
  i0.ɵɵadvance();
55001
55110
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r3.calc.targetValue, metric_r3.calc.metric, false), " ");
55111
+ i0.ɵɵadvance(2);
55112
+ i0.ɵɵproperty("ngClass", ctx_r1.overlayBadgeClasses(metric_r3.calc.percentageIncrease, metric_r3.calc.metric, true));
55113
+ i0.ɵɵadvance();
55114
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getPercentageOnly(metric_r3.calc.percentageIncrease, metric_r3.calc.metric), " ");
55002
55115
  i0.ɵɵadvance();
55003
55116
  i0.ɵɵproperty("ngClass", ctx_r1.relatedPercentageBadgeClasses());
55004
55117
  i0.ɵɵadvance();
55005
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getTargetIncreaseText(metric_r3.calc.percentageIncrease, metric_r3.calc.metric), " ");
55118
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getDescriptionOnly(metric_r3.calc.percentageIncrease, metric_r3.calc.metric), " ");
55006
55119
  i0.ɵɵadvance();
55007
- i0.ɵɵconditional(metric_r3.pacingInfo ? 18 : -1);
55120
+ i0.ɵɵconditional(metric_r3.pacingInfo ? 21 : -1);
55008
55121
  } }
55009
- function FunnelMetricsVisualizationComponent_For_4_Conditional_21_Template(rf, ctx) { if (rf & 1) {
55010
- i0.ɵɵelement(0, "div", 16);
55011
- i0.ɵɵelementStart(1, "div", 17)(2, "p", 18);
55122
+ function FunnelMetricsVisualizationComponent_For_4_Conditional_24_Template(rf, ctx) { if (rf & 1) {
55123
+ i0.ɵɵelement(0, "div", 18);
55124
+ i0.ɵɵelementStart(1, "div", 19)(2, "p", 20);
55012
55125
  i0.ɵɵtext(3, " Related Metrics ");
55013
55126
  i0.ɵɵelementEnd();
55014
- i0.ɵɵelementStart(4, "div", 19);
55015
- i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_21_For_6_Template, 19, 15, "div", 20, _forTrack1$3);
55127
+ i0.ɵɵelementStart(4, "div", 21);
55128
+ i0.ɵɵrepeaterCreate(5, FunnelMetricsVisualizationComponent_For_4_Conditional_24_For_6_Template, 22, 17, "div", 22, _forTrack1$3);
55016
55129
  i0.ɵɵelementEnd()();
55017
55130
  } if (rf & 2) {
55018
55131
  const stage_r1 = i0.ɵɵnextContext().$implicit;
@@ -55041,12 +55154,15 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55041
55154
  i0.ɵɵelementStart(16, "p", 11);
55042
55155
  i0.ɵɵtext(17);
55043
55156
  i0.ɵɵelementEnd();
55044
- i0.ɵɵelementStart(18, "div", 12);
55045
- i0.ɵɵtext(19);
55046
- i0.ɵɵelementEnd()();
55047
- i0.ɵɵconditionalCreate(20, FunnelMetricsVisualizationComponent_For_4_Conditional_20_Template, 6, 8, "div");
55157
+ i0.ɵɵelementStart(18, "div", 12)(19, "div", 13);
55158
+ i0.ɵɵtext(20);
55159
+ i0.ɵɵelementEnd();
55160
+ i0.ɵɵelementStart(21, "div", 14);
55161
+ i0.ɵɵtext(22);
55162
+ i0.ɵɵelementEnd()()();
55163
+ i0.ɵɵconditionalCreate(23, FunnelMetricsVisualizationComponent_For_4_Conditional_23_Template, 6, 9, "div");
55048
55164
  i0.ɵɵelementEnd();
55049
- i0.ɵɵconditionalCreate(21, FunnelMetricsVisualizationComponent_For_4_Conditional_21_Template, 7, 2);
55165
+ i0.ɵɵconditionalCreate(24, FunnelMetricsVisualizationComponent_For_4_Conditional_24_Template, 7, 2);
55050
55166
  i0.ɵɵelementEnd();
55051
55167
  } if (rf & 2) {
55052
55168
  const stage_r1 = ctx.$implicit;
@@ -55074,14 +55190,18 @@ function FunnelMetricsVisualizationComponent_For_4_Template(rf, ctx) { if (rf &
55074
55190
  i0.ɵɵproperty("ngClass", ctx_r1.targetValueClasses());
55075
55191
  i0.ɵɵadvance();
55076
55192
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(stage_r1.stageMetric.targetValue, stage_r1.stageMetric.metric, false), " ");
55193
+ i0.ɵɵadvance(2);
55194
+ i0.ɵɵproperty("ngClass", ctx_r1.overlayBadgeClasses(stage_r1.stageMetric.percentageIncrease, stage_r1.stageMetric.metric));
55195
+ i0.ɵɵadvance();
55196
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getPercentageOnly(stage_r1.stageMetric.percentageIncrease, stage_r1.stageMetric.metric), " ");
55077
55197
  i0.ɵɵadvance();
55078
55198
  i0.ɵɵproperty("ngClass", ctx_r1.percentageBadgeClasses());
55079
55199
  i0.ɵɵadvance();
55080
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getTargetIncreaseText(stage_r1.stageMetric.percentageIncrease, stage_r1.stageMetric.metric), " ");
55200
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getDescriptionOnly(stage_r1.stageMetric.percentageIncrease, stage_r1.stageMetric.metric), " ");
55081
55201
  i0.ɵɵadvance();
55082
- i0.ɵɵconditional(stage_r1.pacingInfo ? 20 : -1);
55202
+ i0.ɵɵconditional(stage_r1.pacingInfo ? 23 : -1);
55083
55203
  i0.ɵɵadvance();
55084
- i0.ɵɵconditional(stage_r1.relatedMetrics.length > 0 ? 21 : -1);
55204
+ i0.ɵɵconditional(stage_r1.relatedMetrics.length > 0 ? 24 : -1);
55085
55205
  } }
55086
55206
  class FunnelMetricsVisualizationComponent {
55087
55207
  constructor() {
@@ -55219,6 +55339,42 @@ class FunnelMetricsVisualizationComponent {
55219
55339
  const absValue = Math.abs(percentageIncrease);
55220
55340
  return `${sign}${formatPercentage(absValue, 1)} increase over ${this.priorYear()}`;
55221
55341
  }
55342
+ getPercentageOnly(percentageIncrease, metric) {
55343
+ const sign = MetricEnumUtil.increaseBad(metric) ? '' : '+';
55344
+ const absValue = Math.abs(percentageIncrease);
55345
+ return `${sign}${formatPercentage(absValue, 1)}`;
55346
+ }
55347
+ getDescriptionOnly(percentageIncrease, metric) {
55348
+ return `increase over ${this.priorYear()}`;
55349
+ }
55350
+ overlayBadgeClasses(percentageIncrease, metric, isCompact = false) {
55351
+ const isDark = this.viewMode() === ViewModeEnum.DARK;
55352
+ const isIncrease = !MetricEnumUtil.increaseBad(metric);
55353
+ if (isDark) {
55354
+ if (isIncrease) {
55355
+ return isCompact
55356
+ ? 'bg-emerald-500/95 text-white border-emerald-400/50 shadow-emerald-500/40'
55357
+ : 'bg-emerald-500/95 text-white border-emerald-400/50 shadow-emerald-500/50';
55358
+ }
55359
+ else {
55360
+ return isCompact
55361
+ ? 'bg-purple-500/95 text-white border-purple-400/50 shadow-purple-500/40'
55362
+ : 'bg-purple-500/95 text-white border-purple-400/50 shadow-purple-500/50';
55363
+ }
55364
+ }
55365
+ else {
55366
+ if (isIncrease) {
55367
+ return isCompact
55368
+ ? 'bg-emerald-600 text-white border-emerald-500 shadow-emerald-600/40'
55369
+ : 'bg-emerald-600 text-white border-emerald-500 shadow-emerald-600/50';
55370
+ }
55371
+ else {
55372
+ return isCompact
55373
+ ? 'bg-purple-600 text-white border-purple-500 shadow-purple-600/40'
55374
+ : 'bg-purple-600 text-white border-purple-500 shadow-purple-600/50';
55375
+ }
55376
+ }
55377
+ }
55222
55378
  formatMetricValue(value, metric, fromUiData = true) {
55223
55379
  if (metric.includes('REVENUE')) {
55224
55380
  return formatCurrency(value);
@@ -55248,11 +55404,11 @@ class FunnelMetricsVisualizationComponent {
55248
55404
  return MetricEnumUtil.increaseBad(metric) ? '-' : '+';
55249
55405
  }
55250
55406
  static { this.ɵfac = function FunnelMetricsVisualizationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FunnelMetricsVisualizationComponent)(); }; }
55251
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FunnelMetricsVisualizationComponent, selectors: [["symphiq-funnel-metrics-visualization"]], inputs: { viewMode: [1, "viewMode"], calculations: [1, "calculations"], pacingMetrics: [1, "pacingMetrics"] }, decls: 5, vars: 0, consts: [[1, "space-y-6"], [1, "space-y-8"], [1, "rounded-xl", "p-6", "border-2", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-1"], [1, "text-lg", "font-bold", "leading-tight", "m-0", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-6", "h-6", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-3", "gap-6", "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-3", 3, "ngClass"], [1, "px-3", "py-1.5", "rounded-lg", "font-semibold", "text-xs", "inline-block", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText"], [1, "my-4", 3, "ngClass"], [1, "space-y-3"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-3", 3, "ngClass"], [1, "grid", "gap-3"], [1, "p-4", "rounded-lg", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mb-4"], [1, "text-xs", "font-semibold", "leading-tight", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "text-lg", "font-bold", "mb-2", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded", "text-xs", "font-semibold", "inline-block", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55407
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FunnelMetricsVisualizationComponent, selectors: [["symphiq-funnel-metrics-visualization"]], inputs: { viewMode: [1, "viewMode"], calculations: [1, "calculations"], pacingMetrics: [1, "pacingMetrics"] }, decls: 5, vars: 0, consts: [[1, "space-y-6"], [1, "space-y-8"], [1, "rounded-xl", "p-6", "border-2", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "flex", "items-center", "gap-2", "mb-1"], [1, "text-lg", "font-bold", "leading-tight", "m-0", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-6", "h-6", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-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"], [1, "relative", "inline-flex"], [1, "absolute", "-top-1", "left-2", "px-2.5", "py-0.5", "rounded-md", "font-extrabold", "text-sm", "tracking-tight", "z-10", "border-2", "shadow-lg", "transition-all", "duration-200", 3, "ngClass"], [1, "px-3", "py-1.5", "pt-3", "rounded-lg", "font-semibold", "text-xs", "inline-block", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "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-xs", "font-semibold", "leading-tight", 3, "ngClass"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "grid", "grid-cols-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"], [1, "absolute", "-top-0.5", "left-1.5", "px-2", "py-0.5", "rounded", "text-xs", "font-extrabold", "tracking-tight", "z-10", "border", "shadow-md", "transition-all", "duration-200", 3, "ngClass"], [1, "px-2.5", "py-1", "pt-2.5", "rounded", "text-xs", "font-semibold", "inline-block", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"]], template: function FunnelMetricsVisualizationComponent_Template(rf, ctx) { if (rf & 1) {
55252
55408
  i0.ɵɵelementStart(0, "div", 0);
55253
55409
  i0.ɵɵelement(1, "symphiq-tooltip-container");
55254
55410
  i0.ɵɵelementStart(2, "div", 1);
55255
- i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 22, 16, "div", 2, _forTrack0$i);
55411
+ i0.ɵɵrepeaterCreate(3, FunnelMetricsVisualizationComponent_For_4_Template, 25, 18, "div", 2, _forTrack0$i);
55256
55412
  i0.ɵɵelementEnd()();
55257
55413
  } if (rf & 2) {
55258
55414
  i0.ɵɵadvance(3);
@@ -55295,7 +55451,7 @@ class FunnelMetricsVisualizationComponent {
55295
55451
  </div>
55296
55452
  </div>
55297
55453
 
55298
- <div class="grid grid-cols-3 gap-6 mb-4">
55454
+ <div class="grid grid-cols-2 lg:grid-cols-3 gap-6 mb-4">
55299
55455
  <div>
55300
55456
  <p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
55301
55457
  {{ priorYear() }} Actual
@@ -55311,8 +55467,14 @@ class FunnelMetricsVisualizationComponent {
55311
55467
  <p [ngClass]="targetValueClasses()" class="text-2xl font-bold mb-3">
55312
55468
  {{ formatMetricValue(stage.stageMetric.targetValue, stage.stageMetric.metric, false) }}
55313
55469
  </p>
55314
- <div [ngClass]="percentageBadgeClasses()" class="px-3 py-1.5 rounded-lg font-semibold text-xs inline-block">
55315
- {{ getTargetIncreaseText(stage.stageMetric.percentageIncrease, stage.stageMetric.metric) }}
55470
+ <div class="relative inline-flex">
55471
+ <div [ngClass]="overlayBadgeClasses(stage.stageMetric.percentageIncrease, stage.stageMetric.metric)"
55472
+ class="absolute -top-1 left-2 px-2.5 py-0.5 rounded-md font-extrabold text-sm tracking-tight z-10 border-2 shadow-lg transition-all duration-200">
55473
+ {{ getPercentageOnly(stage.stageMetric.percentageIncrease, stage.stageMetric.metric) }}
55474
+ </div>
55475
+ <div [ngClass]="percentageBadgeClasses()" class="px-3 py-1.5 pt-3 rounded-lg font-semibold text-xs inline-block">
55476
+ {{ getDescriptionOnly(stage.stageMetric.percentageIncrease, stage.stageMetric.metric) }}
55477
+ </div>
55316
55478
  </div>
55317
55479
  </div>
55318
55480
  @if (stage.pacingInfo) {
@@ -55328,6 +55490,7 @@ class FunnelMetricsVisualizationComponent {
55328
55490
  [pacingPercentage]="stage.pacingInfo.pacingPercentage"
55329
55491
  [status]="stage.pacingInfo.status"
55330
55492
  [showAsFullText]="true"
55493
+ [showEmphasizedPercentage]="true"
55331
55494
  />
55332
55495
  </div>
55333
55496
  }
@@ -55361,7 +55524,7 @@ class FunnelMetricsVisualizationComponent {
55361
55524
  </button>
55362
55525
  }
55363
55526
  </div>
55364
- <div class="grid grid-cols-3 gap-4">
55527
+ <div class="grid grid-cols-2 lg:grid-cols-3 gap-4">
55365
55528
  <div>
55366
55529
  <p [ngClass]="relatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
55367
55530
  {{ priorYear() }} Actual
@@ -55377,8 +55540,14 @@ class FunnelMetricsVisualizationComponent {
55377
55540
  <p [ngClass]="relatedTargetValueClasses()" class="text-lg font-bold mb-2">
55378
55541
  {{ formatMetricValue(metric.calc.targetValue, metric.calc.metric, false) }}
55379
55542
  </p>
55380
- <div [ngClass]="relatedPercentageBadgeClasses()" class="px-2.5 py-1 rounded text-xs font-semibold inline-block">
55381
- {{ getTargetIncreaseText(metric.calc.percentageIncrease, metric.calc.metric) }}
55543
+ <div class="relative inline-flex">
55544
+ <div [ngClass]="overlayBadgeClasses(metric.calc.percentageIncrease, metric.calc.metric, true)"
55545
+ class="absolute -top-0.5 left-1.5 px-2 py-0.5 rounded text-xs font-extrabold tracking-tight z-10 border shadow-md transition-all duration-200">
55546
+ {{ getPercentageOnly(metric.calc.percentageIncrease, metric.calc.metric) }}
55547
+ </div>
55548
+ <div [ngClass]="relatedPercentageBadgeClasses()" class="px-2.5 py-1 pt-2.5 rounded text-xs font-semibold inline-block">
55549
+ {{ getDescriptionOnly(metric.calc.percentageIncrease, metric.calc.metric) }}
55550
+ </div>
55382
55551
  </div>
55383
55552
  </div>
55384
55553
  @if (metric.pacingInfo) {
@@ -55395,6 +55564,7 @@ class FunnelMetricsVisualizationComponent {
55395
55564
  [status]="metric.pacingInfo.status"
55396
55565
  [showAsFullText]="true"
55397
55566
  [isCompact]="true"
55567
+ [showEmphasizedPercentage]="true"
55398
55568
  />
55399
55569
  </div>
55400
55570
  }
@@ -55411,7 +55581,7 @@ class FunnelMetricsVisualizationComponent {
55411
55581
  `
55412
55582
  }]
55413
55583
  }], 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 }] }] }); })();
55414
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 160 }); })();
55584
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelMetricsVisualizationComponent, { className: "FunnelMetricsVisualizationComponent", filePath: "lib/components/revenue-calculator-dashboard/funnel-metrics-visualization.component.ts", lineNumber: 174 }); })();
55415
55585
 
55416
55586
  function StickySubmitBarComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55417
55587
  i0.ɵɵelementStart(0, "div", 4);