@eric-emg/symphiq-components 1.2.333 → 1.2.335

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.
@@ -86780,7 +86780,7 @@ class BillingPeriodToggleComponent {
86780
86780
  : 'text-slate-600';
86781
86781
  }
86782
86782
  static { this.ɵfac = function BillingPeriodToggleComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BillingPeriodToggleComponent)(); }; }
86783
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BillingPeriodToggleComponent, selectors: [["symphiq-billing-period-toggle"]], inputs: { viewMode: [1, "viewMode"], selectedPeriodUnit: [1, "selectedPeriodUnit"], isLoading: [1, "isLoading"] }, outputs: { periodUnitChanged: "periodUnitChanged" }, decls: 15, vars: 10, consts: [[1, "flex", "flex-col", "items-center", "gap-4", "mb-8"], [1, "flex", "items-center", "gap-3"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "inline-flex", "rounded-xl", "p-1", "transition-all", "duration-200", 3, "ngClass"], ["type", "button", 1, "relative", "px-6", "py-3", "rounded-lg", "font-semibold", "text-sm", "transition-all", "duration-200", "disabled:cursor-not-allowed", 3, "click", "disabled", "ngClass"], [1, "relative", "z-10"], [1, "absolute", "inset-0", "rounded-lg", "shadow-lg", "opacity-20"], [1, "text-sm", 3, "ngClass"]], template: function BillingPeriodToggleComponent_Template(rf, ctx) { if (rf & 1) {
86783
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BillingPeriodToggleComponent, selectors: [["symphiq-billing-period-toggle"]], inputs: { viewMode: [1, "viewMode"], selectedPeriodUnit: [1, "selectedPeriodUnit"], isLoading: [1, "isLoading"] }, outputs: { periodUnitChanged: "periodUnitChanged" }, decls: 15, vars: 10, consts: [[1, "flex", "flex-col", "items-center", "gap-4", "mb-8"], [1, "flex", "items-center", "gap-3"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "inline-flex", "gap-2", "rounded-xl", "p-1.5", "transition-all", "duration-200", 3, "ngClass"], ["type", "button", 1, "relative", "px-6", "py-3", "rounded-lg", "font-semibold", "text-sm", "transition-all", "duration-200", "disabled:cursor-not-allowed", 3, "click", "disabled", "ngClass"], [1, "relative", "z-10"], [1, "absolute", "inset-0", "rounded-lg", "shadow-lg", "opacity-20"], [1, "text-sm", 3, "ngClass"]], template: function BillingPeriodToggleComponent_Template(rf, ctx) { if (rf & 1) {
86784
86784
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
86785
86785
  i0.ɵɵnamespaceSVG();
86786
86786
  i0.ɵɵelementStart(2, "svg", 2);
@@ -86830,41 +86830,41 @@ class BillingPeriodToggleComponent {
86830
86830
  standalone: true,
86831
86831
  imports: [CommonModule],
86832
86832
  changeDetection: ChangeDetectionStrategy.OnPush,
86833
- template: `
86834
- <div class="flex flex-col items-center gap-4 mb-8">
86835
- <div class="flex items-center gap-3">
86836
- <svg [ngClass]="iconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
86837
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
86838
- </svg>
86839
- <div [ngClass]="toggleContainerClasses()" class="inline-flex rounded-xl p-1 transition-all duration-200">
86840
- <button
86841
- type="button"
86842
- [disabled]="isLoading()"
86843
- (click)="selectPeriod(periodUnitEnum.YEAR)"
86844
- [ngClass]="getButtonClasses(periodUnitEnum.YEAR)"
86845
- class="relative px-6 py-3 rounded-lg font-semibold text-sm transition-all duration-200 disabled:cursor-not-allowed">
86846
- <span class="relative z-10">Annual contract</span>
86847
- @if (selectedPeriodUnit() === periodUnitEnum.YEAR) {
86848
- <div class="absolute inset-0 rounded-lg shadow-lg opacity-20"></div>
86849
- }
86850
- </button>
86851
- <button
86852
- type="button"
86853
- [disabled]="isLoading()"
86854
- (click)="selectPeriod(periodUnitEnum.MONTH)"
86855
- [ngClass]="getButtonClasses(periodUnitEnum.MONTH)"
86856
- class="relative px-6 py-3 rounded-lg font-semibold text-sm transition-all duration-200 disabled:cursor-not-allowed">
86857
- <span class="relative z-10">Monthly contract</span>
86858
- @if (selectedPeriodUnit() === periodUnitEnum.MONTH) {
86859
- <div class="absolute inset-0 rounded-lg shadow-lg opacity-20"></div>
86860
- }
86861
- </button>
86862
- </div>
86863
- </div>
86864
- <p [ngClass]="subtitleClasses()" class="text-sm">
86865
- {{ getSubtitle() }}
86866
- </p>
86867
- </div>
86833
+ template: `
86834
+ <div class="flex flex-col items-center gap-4 mb-8">
86835
+ <div class="flex items-center gap-3">
86836
+ <svg [ngClass]="iconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
86837
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
86838
+ </svg>
86839
+ <div [ngClass]="toggleContainerClasses()" class="inline-flex gap-2 rounded-xl p-1.5 transition-all duration-200">
86840
+ <button
86841
+ type="button"
86842
+ [disabled]="isLoading()"
86843
+ (click)="selectPeriod(periodUnitEnum.YEAR)"
86844
+ [ngClass]="getButtonClasses(periodUnitEnum.YEAR)"
86845
+ class="relative px-6 py-3 rounded-lg font-semibold text-sm transition-all duration-200 disabled:cursor-not-allowed">
86846
+ <span class="relative z-10">Annual contract</span>
86847
+ @if (selectedPeriodUnit() === periodUnitEnum.YEAR) {
86848
+ <div class="absolute inset-0 rounded-lg shadow-lg opacity-20"></div>
86849
+ }
86850
+ </button>
86851
+ <button
86852
+ type="button"
86853
+ [disabled]="isLoading()"
86854
+ (click)="selectPeriod(periodUnitEnum.MONTH)"
86855
+ [ngClass]="getButtonClasses(periodUnitEnum.MONTH)"
86856
+ class="relative px-6 py-3 rounded-lg font-semibold text-sm transition-all duration-200 disabled:cursor-not-allowed">
86857
+ <span class="relative z-10">Monthly contract</span>
86858
+ @if (selectedPeriodUnit() === periodUnitEnum.MONTH) {
86859
+ <div class="absolute inset-0 rounded-lg shadow-lg opacity-20"></div>
86860
+ }
86861
+ </button>
86862
+ </div>
86863
+ </div>
86864
+ <p [ngClass]="subtitleClasses()" class="text-sm">
86865
+ {{ getSubtitle() }}
86866
+ </p>
86867
+ </div>
86868
86868
  `
86869
86869
  }]
86870
86870
  }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], selectedPeriodUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedPeriodUnit", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], periodUnitChanged: [{ type: i0.Output, args: ["periodUnitChanged"] }] }); })();
@@ -86887,8 +86887,8 @@ function PlanCardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
86887
86887
  function PlanCardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
86888
86888
  i0.ɵɵelementStart(0, "button", 15);
86889
86889
  i0.ɵɵnamespaceSVG();
86890
- i0.ɵɵelementStart(1, "svg", 24);
86891
- i0.ɵɵelement(2, "path", 25);
86890
+ i0.ɵɵelementStart(1, "svg", 25);
86891
+ i0.ɵɵelement(2, "path", 26);
86892
86892
  i0.ɵɵelementEnd()();
86893
86893
  } if (rf & 2) {
86894
86894
  const ctx_r0 = i0.ɵɵnextContext();
@@ -86897,8 +86897,8 @@ function PlanCardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
86897
86897
  function PlanCardComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
86898
86898
  i0.ɵɵelementStart(0, "button", 15);
86899
86899
  i0.ɵɵnamespaceSVG();
86900
- i0.ɵɵelementStart(1, "svg", 24);
86901
- i0.ɵɵelement(2, "path", 25);
86900
+ i0.ɵɵelementStart(1, "svg", 25);
86901
+ i0.ɵɵelement(2, "path", 26);
86902
86902
  i0.ɵɵelementEnd()();
86903
86903
  } if (rf & 2) {
86904
86904
  const ctx_r0 = i0.ɵɵnextContext();
@@ -86922,7 +86922,7 @@ class PlanCardComponent {
86922
86922
  this.selectedPeriodUnit = input(ChargebeeItemPricePeriodUnitEnum.YEAR, ...(ngDevMode ? [{ debugName: "selectedPeriodUnit" }] : []));
86923
86923
  this.planSelected = output();
86924
86924
  this.showBestValueBadge = computed(() => {
86925
- return this.planInfo().periodUnit === ChargebeeItemPricePeriodUnitEnum.YEAR;
86925
+ return this.planInfo().bestValue === true;
86926
86926
  }, ...(ngDevMode ? [{ debugName: "showBestValueBadge" }] : []));
86927
86927
  }
86928
86928
  handleCardClick() {
@@ -86930,12 +86930,14 @@ class PlanCardComponent {
86930
86930
  }
86931
86931
  getPlanTitle() {
86932
86932
  const info = this.planInfo();
86933
- const periodLabel = info.periodUnit === ChargebeeItemPricePeriodUnitEnum.YEAR ? 'Pay Annually' : 'Pay Monthly';
86934
- return `${info.planItem.name} - ${periodLabel}`;
86933
+ return info.planItemPrice.externalName || info.planItem.externalName || info.planItem.name || 'Plan';
86935
86934
  }
86936
86935
  formatPrice() {
86937
86936
  const info = this.planInfo();
86938
- const price = info.planItemPrice.price || 0;
86937
+ let price = info.planItemPrice.price || 0;
86938
+ if (info.periodUnit === ChargebeeItemPricePeriodUnitEnum.YEAR) {
86939
+ price = price / 12;
86940
+ }
86939
86941
  const symbol = this.getCurrencySymbol();
86940
86942
  const formattedPrice = Math.floor(price / 100).toLocaleString();
86941
86943
  return `${symbol}${formattedPrice}`;
@@ -87088,7 +87090,7 @@ class PlanCardComponent {
87088
87090
  : 'text-slate-600';
87089
87091
  }
87090
87092
  static { this.ɵfac = function PlanCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PlanCardComponent)(); }; }
87091
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PlanCardComponent, selectors: [["symphiq-plan-card"]], inputs: { viewMode: [1, "viewMode"], planInfo: [1, "planInfo"], isSelected: [1, "isSelected"], selectedPeriodUnit: [1, "selectedPeriodUnit"] }, outputs: { planSelected: "planSelected" }, decls: 51, vars: 34, consts: [[1, "relative", "rounded-2xl", "border-2", "p-6", "transition-all", "duration-200", "cursor-pointer", "hover:scale-[1.02]", 3, "click", "ngClass"], [1, "absolute", "-top-3", "left-1/2", "transform", "-translate-x-1/2", "px-4", "py-1", "rounded-full", "text-xs", "font-bold", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], [1, "flex", "items-baseline", "gap-2"], [1, "text-4xl", "font-bold", 3, "ngClass"], [1, "text-base", 3, "ngClass"], [1, "flex-shrink-0", "ml-4"], [1, "w-6", "h-6", "rounded-full", "border-2", "flex", "items-center", "justify-center", "transition-all", "duration-200", 3, "ngClass"], [1, "w-3", "h-3", "rounded-full", 3, "ngClass"], [1, "space-y-4", 3, "ngClass"], [1, "flex", "justify-between", "items-center", "py-3", "border-b", 3, "ngClass"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "w-4", "h-4", "rounded-full", "flex", "items-center", "justify-center", 3, "ngClass"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "text-right"], [1, "text-xs", "mt-1", 3, "ngClass"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-5", "h-5", 3, "ngClass"], ["fill-rule", "evenodd", "d", "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", "clip-rule", "evenodd"], [1, "pt-4", 3, "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-3", "h-3"], ["fill-rule", "evenodd", "d", "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z", "clip-rule", "evenodd"]], template: function PlanCardComponent_Template(rf, ctx) { if (rf & 1) {
87093
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PlanCardComponent, selectors: [["symphiq-plan-card"]], inputs: { viewMode: [1, "viewMode"], planInfo: [1, "planInfo"], isSelected: [1, "isSelected"], selectedPeriodUnit: [1, "selectedPeriodUnit"] }, outputs: { planSelected: "planSelected" }, decls: 51, vars: 34, consts: [[1, "relative", "rounded-2xl", "border-2", "p-6", "transition-all", "duration-200", "cursor-pointer", "hover:scale-[1.02]", 3, "click", "ngClass"], [1, "absolute", "-top-3", "left-1/2", "transform", "-translate-x-1/2", "px-4", "py-1", "rounded-full", "text-xs", "font-bold", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "mb-6"], [1, "flex-1"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], [1, "flex", "items-baseline", "gap-2"], [1, "text-4xl", "font-bold", 3, "ngClass"], [1, "text-base", 3, "ngClass"], [1, "flex-shrink-0", "ml-4"], [1, "w-6", "h-6", "rounded-full", "border-2", "flex", "items-center", "justify-center", "transition-all", "duration-200", 3, "ngClass"], [1, "w-3", "h-3", "rounded-full", 3, "ngClass"], [1, "space-y-4", 3, "ngClass"], [1, "flex", "justify-between", "items-center", "py-3", "border-b", 3, "ngClass"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "w-4", "h-4", "rounded-full", "flex", "items-center", "justify-center", 3, "ngClass"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "text-right"], [1, "text-xs", "mt-1", 3, "ngClass"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-5", "h-5", 3, "ngClass"], ["fill-rule", "evenodd", "d", "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", "clip-rule", "evenodd"], [1, "flex", "justify-between", "items-center", "py-3", 3, "ngClass"], [1, "pt-4", "mt-4", 3, "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-3", "h-3"], ["fill-rule", "evenodd", "d", "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z", "clip-rule", "evenodd"]], template: function PlanCardComponent_Template(rf, ctx) { if (rf & 1) {
87092
87094
  i0.ɵɵelementStart(0, "div", 0);
87093
87095
  i0.ɵɵlistener("click", function PlanCardComponent_Template_div_click_0_listener() { return ctx.handleCardClick(); });
87094
87096
  i0.ɵɵconditionalCreate(1, PlanCardComponent_Conditional_1_Template, 2, 1, "div", 1);
@@ -87138,7 +87140,7 @@ class PlanCardComponent {
87138
87140
  i0.ɵɵelement(40, "path", 20);
87139
87141
  i0.ɵɵelementEnd()();
87140
87142
  i0.ɵɵnamespaceHTML();
87141
- i0.ɵɵelementStart(41, "div", 12)(42, "span", 14);
87143
+ i0.ɵɵelementStart(41, "div", 21)(42, "span", 14);
87142
87144
  i0.ɵɵtext(43, "Google Analytics integration");
87143
87145
  i0.ɵɵelementEnd();
87144
87146
  i0.ɵɵnamespaceSVG();
@@ -87146,10 +87148,10 @@ class PlanCardComponent {
87146
87148
  i0.ɵɵelement(45, "path", 20);
87147
87149
  i0.ɵɵelementEnd()();
87148
87150
  i0.ɵɵnamespaceHTML();
87149
- i0.ɵɵelementStart(46, "div", 21)(47, "h4", 22);
87151
+ i0.ɵɵelementStart(46, "div", 22)(47, "h4", 23);
87150
87152
  i0.ɵɵtext(48, " Contract terms ");
87151
87153
  i0.ɵɵelementEnd();
87152
- i0.ɵɵelementStart(49, "p", 23);
87154
+ i0.ɵɵelementStart(49, "p", 24);
87153
87155
  i0.ɵɵtext(50);
87154
87156
  i0.ɵɵelementEnd()()()();
87155
87157
  } if (rf & 2) {
@@ -87229,118 +87231,118 @@ class PlanCardComponent {
87229
87231
  standalone: true,
87230
87232
  imports: [CommonModule],
87231
87233
  changeDetection: ChangeDetectionStrategy.OnPush,
87232
- template: `
87233
- <div
87234
- (click)="handleCardClick()"
87235
- [ngClass]="cardContainerClasses()"
87236
- class="relative rounded-2xl border-2 p-6 transition-all duration-200 cursor-pointer hover:scale-[1.02]">
87237
-
87238
- @if (showBestValueBadge()) {
87239
- <div [ngClass]="badgeClasses()" class="absolute -top-3 left-1/2 transform -translate-x-1/2 px-4 py-1 rounded-full text-xs font-bold">
87240
- Best value
87241
- </div>
87242
- }
87243
-
87244
- <div class="flex items-start justify-between mb-6">
87245
- <div class="flex-1">
87246
- <h3 [ngClass]="planTitleClasses()" class="text-xl font-bold mb-2">
87247
- {{ getPlanTitle() }}
87248
- </h3>
87249
- <div class="flex items-baseline gap-2">
87250
- <span [ngClass]="priceClasses()" class="text-4xl font-bold">
87251
- {{ formatPrice() }}
87252
- </span>
87253
- <span [ngClass]="pricePeriodClasses()" class="text-base">
87254
- {{ getPricePeriod() }}
87255
- </span>
87256
- </div>
87257
- </div>
87258
- <div class="flex-shrink-0 ml-4">
87259
- <div [ngClass]="radioClasses()" class="w-6 h-6 rounded-full border-2 flex items-center justify-center transition-all duration-200">
87260
- @if (isSelected()) {
87261
- <div [ngClass]="radioInnerClasses()" class="w-3 h-3 rounded-full"></div>
87262
- }
87263
- </div>
87264
- </div>
87265
- </div>
87266
-
87267
- <div [ngClass]="sectionClasses()" class="space-y-4">
87268
- <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87269
- <div class="flex items-center gap-2">
87270
- <span [ngClass]="labelClasses()" class="text-sm font-medium">AI usage</span>
87271
- @if (hasTooltip('aiUsage')) {
87272
- <button [ngClass]="tooltipButtonClasses()" class="w-4 h-4 rounded-full flex items-center justify-center">
87273
- <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
87274
- <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path>
87275
- </svg>
87276
- </button>
87277
- }
87278
- </div>
87279
- <span [ngClass]="valueClasses()" class="text-sm font-semibold">
87280
- charged monthly based on your actual usage
87281
- </span>
87282
- </div>
87283
-
87284
- <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87285
- <div class="flex items-center gap-2">
87286
- <span [ngClass]="labelClasses()" class="text-sm font-medium">Shops</span>
87287
- @if (hasTooltip('shops')) {
87288
- <button [ngClass]="tooltipButtonClasses()" class="w-4 h-4 rounded-full flex items-center justify-center">
87289
- <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
87290
- <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path>
87291
- </svg>
87292
- </button>
87293
- }
87294
- </div>
87295
- <div class="text-right">
87296
- <div [ngClass]="valueClasses()" class="text-sm font-semibold">
87297
- {{ getShopsQuantity() }}
87298
- </div>
87299
- @if (getAdditionalShopsPrice()) {
87300
- <div [ngClass]="subValueClasses()" class="text-xs mt-1">
87301
- {{ getAdditionalShopsPrice() }}
87302
- </div>
87303
- }
87304
- </div>
87305
- </div>
87306
-
87307
- <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87308
- <span [ngClass]="labelClasses()" class="text-sm font-medium">Unlimited recommendations</span>
87309
- <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87310
- <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87311
- </svg>
87312
- </div>
87313
-
87314
- <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87315
- <span [ngClass]="labelClasses()" class="text-sm font-medium">Unlimited seats</span>
87316
- <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87317
- <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87318
- </svg>
87319
- </div>
87320
-
87321
- <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87322
- <span [ngClass]="labelClasses()" class="text-sm font-medium">Google Analytics integration</span>
87323
- <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87324
- <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87325
- </svg>
87326
- </div>
87327
-
87328
- <div [ngClass]="contractTermsClasses()" class="pt-4">
87329
- <h4 [ngClass]="contractTermsLabelClasses()" class="text-xs font-semibold uppercase tracking-wider mb-2">
87330
- Contract terms
87331
- </h4>
87332
- <p [ngClass]="contractTermsTextClasses()" class="text-sm leading-relaxed">
87333
- {{ getContractTerms() }}
87334
- </p>
87335
- </div>
87336
- </div>
87337
- </div>
87234
+ template: `
87235
+ <div
87236
+ (click)="handleCardClick()"
87237
+ [ngClass]="cardContainerClasses()"
87238
+ class="relative rounded-2xl border-2 p-6 transition-all duration-200 cursor-pointer hover:scale-[1.02]">
87239
+
87240
+ @if (showBestValueBadge()) {
87241
+ <div [ngClass]="badgeClasses()" class="absolute -top-3 left-1/2 transform -translate-x-1/2 px-4 py-1 rounded-full text-xs font-bold">
87242
+ Best value
87243
+ </div>
87244
+ }
87245
+
87246
+ <div class="flex items-start justify-between mb-6">
87247
+ <div class="flex-1">
87248
+ <h3 [ngClass]="planTitleClasses()" class="text-xl font-bold mb-2">
87249
+ {{ getPlanTitle() }}
87250
+ </h3>
87251
+ <div class="flex items-baseline gap-2">
87252
+ <span [ngClass]="priceClasses()" class="text-4xl font-bold">
87253
+ {{ formatPrice() }}
87254
+ </span>
87255
+ <span [ngClass]="pricePeriodClasses()" class="text-base">
87256
+ {{ getPricePeriod() }}
87257
+ </span>
87258
+ </div>
87259
+ </div>
87260
+ <div class="flex-shrink-0 ml-4">
87261
+ <div [ngClass]="radioClasses()" class="w-6 h-6 rounded-full border-2 flex items-center justify-center transition-all duration-200">
87262
+ @if (isSelected()) {
87263
+ <div [ngClass]="radioInnerClasses()" class="w-3 h-3 rounded-full"></div>
87264
+ }
87265
+ </div>
87266
+ </div>
87267
+ </div>
87268
+
87269
+ <div [ngClass]="sectionClasses()" class="space-y-4">
87270
+ <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87271
+ <div class="flex items-center gap-2">
87272
+ <span [ngClass]="labelClasses()" class="text-sm font-medium">AI usage</span>
87273
+ @if (hasTooltip('aiUsage')) {
87274
+ <button [ngClass]="tooltipButtonClasses()" class="w-4 h-4 rounded-full flex items-center justify-center">
87275
+ <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
87276
+ <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path>
87277
+ </svg>
87278
+ </button>
87279
+ }
87280
+ </div>
87281
+ <span [ngClass]="valueClasses()" class="text-sm font-semibold">
87282
+ charged monthly based on your actual usage
87283
+ </span>
87284
+ </div>
87285
+
87286
+ <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87287
+ <div class="flex items-center gap-2">
87288
+ <span [ngClass]="labelClasses()" class="text-sm font-medium">Shops</span>
87289
+ @if (hasTooltip('shops')) {
87290
+ <button [ngClass]="tooltipButtonClasses()" class="w-4 h-4 rounded-full flex items-center justify-center">
87291
+ <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
87292
+ <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path>
87293
+ </svg>
87294
+ </button>
87295
+ }
87296
+ </div>
87297
+ <div class="text-right">
87298
+ <div [ngClass]="valueClasses()" class="text-sm font-semibold">
87299
+ {{ getShopsQuantity() }}
87300
+ </div>
87301
+ @if (getAdditionalShopsPrice()) {
87302
+ <div [ngClass]="subValueClasses()" class="text-xs mt-1">
87303
+ {{ getAdditionalShopsPrice() }}
87304
+ </div>
87305
+ }
87306
+ </div>
87307
+ </div>
87308
+
87309
+ <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87310
+ <span [ngClass]="labelClasses()" class="text-sm font-medium">Unlimited recommendations</span>
87311
+ <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87312
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87313
+ </svg>
87314
+ </div>
87315
+
87316
+ <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3 border-b">
87317
+ <span [ngClass]="labelClasses()" class="text-sm font-medium">Unlimited seats</span>
87318
+ <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87319
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87320
+ </svg>
87321
+ </div>
87322
+
87323
+ <div [ngClass]="featureRowClasses()" class="flex justify-between items-center py-3">
87324
+ <span [ngClass]="labelClasses()" class="text-sm font-medium">Google Analytics integration</span>
87325
+ <svg [ngClass]="checkIconClasses()" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
87326
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
87327
+ </svg>
87328
+ </div>
87329
+
87330
+ <div [ngClass]="contractTermsClasses()" class="pt-4 mt-4">
87331
+ <h4 [ngClass]="contractTermsLabelClasses()" class="text-xs font-semibold uppercase tracking-wider mb-2">
87332
+ Contract terms
87333
+ </h4>
87334
+ <p [ngClass]="contractTermsTextClasses()" class="text-sm leading-relaxed">
87335
+ {{ getContractTerms() }}
87336
+ </p>
87337
+ </div>
87338
+ </div>
87339
+ </div>
87338
87340
  `
87339
87341
  }]
87340
87342
  }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], planInfo: [{ type: i0.Input, args: [{ isSignal: true, alias: "planInfo", required: true }] }], isSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSelected", required: false }] }], selectedPeriodUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedPeriodUnit", required: false }] }], planSelected: [{ type: i0.Output, args: ["planSelected"] }] }); })();
87341
87343
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PlanCardComponent, { className: "PlanCardComponent", filePath: "lib/components/profile-analysis-dashboard/cards/plan-card.component.ts", lineNumber: 118 }); })();
87342
87344
 
87343
- const _forTrack0$1 = ($index, $item) => $item.planItem.id;
87345
+ const _forTrack0$1 = ($index, $item) => $item.planItemPrice.id;
87344
87346
  function PlanSelectionContainerComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
87345
87347
  i0.ɵɵelementStart(0, "div", 14);
87346
87348
  i0.ɵɵelement(1, "symphiq-indeterminate-spinner", 17);
@@ -87413,11 +87415,11 @@ class PlanSelectionContainerComponent {
87413
87415
  this.periodUnitChanged.emit(period);
87414
87416
  }
87415
87417
  handlePlanSelection(plan) {
87416
- this.selectedPlanId.set(plan.planItem.id);
87418
+ this.selectedPlanId.set(plan.planItemPrice.id);
87417
87419
  this.planSelected.emit(plan);
87418
87420
  }
87419
87421
  isSelectedPlan(plan) {
87420
- return this.selectedPlanId() === plan.planItem.id;
87422
+ return this.selectedPlanId() === plan.planItemPrice.id;
87421
87423
  }
87422
87424
  containerClasses() {
87423
87425
  return this.viewMode() === ViewModeEnum.DARK
@@ -87586,7 +87588,7 @@ class PlanSelectionContainerComponent {
87586
87588
  </div>
87587
87589
  } @else if (planCardInfos() && planCardInfos()!.length > 0) {
87588
87590
  <div class="flex flex-col gap-8 mb-32">
87589
- @for (plan of planCardInfos(); track plan.planItem.id) {
87591
+ @for (plan of planCardInfos(); track plan.planItemPrice.id) {
87590
87592
  <symphiq-plan-card
87591
87593
  [viewMode]="viewMode()"
87592
87594
  [planInfo]="plan"
@@ -88935,7 +88937,7 @@ class SymphiqProfileAnalysisDashboardComponent {
88935
88937
  this.isEditingCurrency = signal(false, ...(ngDevMode ? [{ debugName: "isEditingCurrency" }] : []));
88936
88938
  this.editingCurrencySelection = signal(null, ...(ngDevMode ? [{ debugName: "editingCurrencySelection" }] : []));
88937
88939
  this.selectedPeriodUnit = computed(() => {
88938
- return this.account()?.onboardingPeriodUnit || ChargebeeItemPricePeriodUnitEnum.YEAR;
88940
+ return this.account()?.chargebeeItemPricePeriodUnit || ChargebeeItemPricePeriodUnitEnum.YEAR;
88939
88941
  }, ...(ngDevMode ? [{ debugName: "selectedPeriodUnit" }] : []));
88940
88942
  this.showPlanSelection = computed(() => {
88941
88943
  return this.hasBillingCurrency() && this.planCardInfos() && this.planCardInfos().length > 0;
@@ -88974,7 +88976,10 @@ class SymphiqProfileAnalysisDashboardComponent {
88974
88976
  }, ...(ngDevMode ? [{ debugName: "currencySelectionEffect" }] : []));
88975
88977
  this.planLoadingEffect = effect(() => {
88976
88978
  const planCardInfos = this.planCardInfos();
88977
- if (planCardInfos && this.isPlanLoading()) {
88979
+ const isLoading = untracked(() => this.isPlanLoading());
88980
+ console.log('[planLoadingEffect] triggered', { planCardInfos: planCardInfos?.length, isPlanLoading: isLoading });
88981
+ if (planCardInfos && isLoading) {
88982
+ console.log('[planLoadingEffect] resetting isPlanLoading to false');
88978
88983
  this.isPlanLoading.set(false);
88979
88984
  }
88980
88985
  }, ...(ngDevMode ? [{ debugName: "planLoadingEffect" }] : []));
@@ -89698,7 +89703,9 @@ class SymphiqProfileAnalysisDashboardComponent {
89698
89703
  }
89699
89704
  }
89700
89705
  handlePeriodUnitChange(periodUnit) {
89706
+ console.log('[handlePeriodUnitChange] setting isPlanLoading to true', { periodUnit });
89701
89707
  this.isPlanLoading.set(true);
89708
+ console.log('[handlePeriodUnitChange] isPlanLoading is now:', this.isPlanLoading());
89702
89709
  this.periodUnitChanged.emit(periodUnit);
89703
89710
  }
89704
89711
  handlePlanSelection(plan) {
@@ -90476,7 +90483,7 @@ class SymphiqProfileAnalysisDashboardComponent {
90476
90483
  type: HostListener,
90477
90484
  args: ['window:scroll', ['$event']]
90478
90485
  }] }); })();
90479
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqProfileAnalysisDashboardComponent, { className: "SymphiqProfileAnalysisDashboardComponent", filePath: "lib/components/profile-analysis-dashboard/symphiq-profile-analysis-dashboard.component.ts", lineNumber: 720 }); })();
90486
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqProfileAnalysisDashboardComponent, { className: "SymphiqProfileAnalysisDashboardComponent", filePath: "lib/components/profile-analysis-dashboard/symphiq-profile-analysis-dashboard.component.ts", lineNumber: 721 }); })();
90480
90487
 
90481
90488
  class ScrollProgressBarComponent {
90482
90489
  constructor() {