@eric-emg/symphiq-components 1.2.403 → 1.2.405

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.
@@ -57432,6 +57432,13 @@ class AreaChartComponent {
57432
57432
  });
57433
57433
  // Default colors for area chart series
57434
57434
  const defaultColors = ['#4A90E2', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4'];
57435
+ // Find series with most data points for X-axis categories
57436
+ const seriesWithMostData = chartData.series?.reduce((max, s) => (s.data?.length ?? 0) > (max.data?.length ?? 0) ? s : max, chartData.series[0]);
57437
+ const xAxisData = (seriesWithMostData?.data || []).map(d => ({
57438
+ month: d.month,
57439
+ value: d.value
57440
+ }));
57441
+ xAxis.data.setAll(xAxisData);
57435
57442
  chartData.series?.forEach((seriesData, index) => {
57436
57443
  const colorHex = defaultColors[index % defaultColors.length];
57437
57444
  const seriesColor = color(parseInt(colorHex.replace('#', ''), 16));
@@ -57468,9 +57475,6 @@ class AreaChartComponent {
57468
57475
  value: d.value
57469
57476
  }));
57470
57477
  series.data.setAll(transformedData);
57471
- if (index === 0) {
57472
- xAxis.data.setAll(transformedData);
57473
- }
57474
57478
  series.appear(ChartConstants.ANIMATION.APPEAR_DURATION);
57475
57479
  });
57476
57480
  const legend = chartElement.children.push(Legend.new(root, {
@@ -72528,7 +72532,7 @@ function CapabilityMatrixCardComponent_Conditional_26_Template(rf, ctx) { if (rf
72528
72532
  i0.ɵɵelementEnd();
72529
72533
  } if (rf & 2) {
72530
72534
  const ctx_r0 = i0.ɵɵnextContext();
72531
- i0.ɵɵclassProp("animate-pulse", ctx_r0.isHighImportance());
72535
+ i0.ɵɵclassProp("animate-pulse-slow", ctx_r0.isHighImportance());
72532
72536
  i0.ɵɵproperty("ngClass", ctx_r0.importanceBadgeClasses());
72533
72537
  i0.ɵɵadvance();
72534
72538
  i0.ɵɵtextInterpolate1(" ", ctx_r0.importanceLabel(), " Importance ");
@@ -72781,7 +72785,7 @@ class CapabilityMatrixCardComponent {
72781
72785
  return 'bg-red-500';
72782
72786
  }
72783
72787
  static { this.ɵfac = function CapabilityMatrixCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CapabilityMatrixCardComponent)(); }; }
72784
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CapabilityMatrixCardComponent, selectors: [["symphiq-capability-matrix-card"]], inputs: { capability: [1, "capability"], viewMode: [1, "viewMode"], allGoals: [1, "allGoals"] }, decls: 31, vars: 30, consts: [[1, "rounded-lg", "p-4", 3, "click", "ngClass"], [1, "flex", "items-start", "justify-between", "gap-3", "mb-3"], [1, "flex-1"], [1, "font-semibold", "text-sm", "mb-1", 3, "ngClass"], [1, "text-xs", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded-full", "text-xs", "font-semibold", "whitespace-nowrap", 3, "ngClass"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden", "min-h-0"], [1, "transition-opacity", "duration-300"], [1, "grid", "grid-cols-2", "gap-3", "mb-3"], [1, "p-3", "rounded-lg", 3, "ngClass"], [1, "text-xs", "font-medium", "mb-1", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5"], [1, "w-2", "h-2", "rounded-full", 3, "ngClass"], [1, "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-1.5", "mb-4"], [1, "px-2", "py-1", "rounded", "text-xs", "font-medium", 3, "ngClass", "animate-pulse"], [1, "px-2", "py-1", "rounded", "text-xs", 3, "ngClass"], [1, "space-y-2"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "px-2", "py-1", "rounded", "text-xs", "font-medium", 3, "ngClass"], ["size", "w-3.5 h-3.5", 3, "icon", "ngClass"], [3, "relatedGoalIds", "allGoals", "viewMode"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function CapabilityMatrixCardComponent_Template(rf, ctx) { if (rf & 1) {
72788
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CapabilityMatrixCardComponent, selectors: [["symphiq-capability-matrix-card"]], inputs: { capability: [1, "capability"], viewMode: [1, "viewMode"], allGoals: [1, "allGoals"] }, decls: 31, vars: 30, consts: [[1, "rounded-lg", "p-4", 3, "click", "ngClass"], [1, "flex", "items-start", "justify-between", "gap-3", "mb-3"], [1, "flex-1"], [1, "font-semibold", "text-sm", "mb-1", 3, "ngClass"], [1, "text-xs", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded-full", "text-xs", "font-semibold", "whitespace-nowrap", 3, "ngClass"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden", "min-h-0"], [1, "transition-opacity", "duration-300"], [1, "grid", "grid-cols-2", "gap-3", "mb-3"], [1, "p-3", "rounded-lg", 3, "ngClass"], [1, "text-xs", "font-medium", "mb-1", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5"], [1, "w-2", "h-2", "rounded-full", 3, "ngClass"], [1, "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-1.5", "mb-4"], [1, "px-2", "py-1", "rounded", "text-xs", "font-medium", 3, "ngClass", "animate-pulse-slow"], [1, "px-2", "py-1", "rounded", "text-xs", 3, "ngClass"], [1, "space-y-2"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "px-2", "py-1", "rounded", "text-xs", "font-medium", 3, "ngClass"], ["size", "w-3.5 h-3.5", 3, "icon", "ngClass"], [3, "relatedGoalIds", "allGoals", "viewMode"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function CapabilityMatrixCardComponent_Template(rf, ctx) { if (rf & 1) {
72785
72789
  i0.ɵɵelementStart(0, "div", 0);
72786
72790
  i0.ɵɵlistener("click", function CapabilityMatrixCardComponent_Template_div_click_0_listener($event) { return ctx.onCardClick($event); });
72787
72791
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "h5", 3);
@@ -72848,7 +72852,7 @@ class CapabilityMatrixCardComponent {
72848
72852
  i0.ɵɵadvance();
72849
72853
  i0.ɵɵproperty("ngClass", ctx.stateLabelClasses());
72850
72854
  i0.ɵɵadvance(3);
72851
- i0.ɵɵclassProp("animate-pulse", ctx.isNotImplemented((tmp_11_0 = ctx.capability()) == null ? null : tmp_11_0.currentState));
72855
+ i0.ɵɵclassProp("animate-pulse-slow", ctx.isNotImplemented((tmp_11_0 = ctx.capability()) == null ? null : tmp_11_0.currentState));
72852
72856
  i0.ɵɵproperty("ngClass", ctx.stateIndicatorClasses(((tmp_12_0 = ctx.capability()) == null ? null : tmp_12_0.currentState) || ctx.CapabilityStateEnum.NOT_IMPLEMENTED));
72853
72857
  i0.ɵɵadvance();
72854
72858
  i0.ɵɵproperty("ngClass", ctx.stateValueClasses());
@@ -72883,107 +72887,107 @@ class CapabilityMatrixCardComponent {
72883
72887
  standalone: true,
72884
72888
  imports: [CommonModule, RelatedGoalChipsComponent, SymphiqIconComponent],
72885
72889
  changeDetection: ChangeDetectionStrategy.OnPush,
72886
- template: `
72887
- <div
72888
- [ngClass]="cardClasses()"
72889
- [class.cursor-pointer]="!isExpandedMode()"
72890
- (click)="onCardClick($event)"
72891
- class="rounded-lg p-4">
72892
- <div class="flex items-start justify-between gap-3 mb-3">
72893
- <div class="flex-1">
72894
- <h5 [ngClass]="titleClasses()" class="font-semibold text-sm mb-1">{{ capability()?.name }}</h5>
72895
- @if (capability()?.industryBenchmark) {
72896
- <p [ngClass]="benchmarkClasses()" class="text-xs">Industry: {{ formatIndustryBenchmark(capability()!.industryBenchmark!) }}</p>
72897
- }
72898
- </div>
72899
- @if (capability()?.quadrant) {
72900
- <span [ngClass]="quadrantBadgeClasses()" class="px-2.5 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
72901
- {{ quadrantLabel() }}
72902
- </span>
72903
- }
72904
- </div>
72905
-
72906
- <!-- Expandable Content -->
72907
- <div class="grid transition-[grid-template-rows] duration-300 ease-in-out" [style.grid-template-rows]="shouldShowExpandedContent() ? '1fr' : '0fr'">
72908
- <div class="overflow-hidden min-h-0">
72909
- <div [style.opacity]="shouldShowExpandedContent() ? '1' : '0'" [style.transition-delay]="shouldShowExpandedContent() ? '150ms' : '0ms'" class="transition-opacity duration-300">
72910
-
72911
- <div class="grid grid-cols-2 gap-3 mb-3">
72912
- <div [ngClass]="stateSectionClasses()" class="p-3 rounded-lg">
72913
- <p [ngClass]="stateLabelClasses()" class="text-xs font-medium mb-1">Current</p>
72914
- <div class="flex items-center gap-1.5">
72915
- <div [ngClass]="stateIndicatorClasses(capability()?.currentState || CapabilityStateEnum.NOT_IMPLEMENTED)" [class.animate-pulse]="isNotImplemented(capability()?.currentState)" class="w-2 h-2 rounded-full"></div>
72916
- <p [ngClass]="stateValueClasses()" class="text-xs">{{ formatState(capability()?.currentState) }}</p>
72917
- </div>
72918
- </div>
72919
- <div [ngClass]="stateSectionClasses()" class="p-3 rounded-lg">
72920
- <p [ngClass]="stateLabelClasses()" class="text-xs font-medium mb-1">Desired</p>
72921
- <div class="flex items-center gap-1.5">
72922
- <div [ngClass]="stateIndicatorClasses(capability()?.desiredState || CapabilityStateEnum.FULLY_IMPLEMENTED)" class="w-2 h-2 rounded-full"></div>
72923
- <p [ngClass]="stateValueClasses()" class="text-xs font-semibold">{{ formatState(capability()?.desiredState) }}</p>
72924
- </div>
72925
- </div>
72926
- </div>
72927
-
72928
- <div class="flex flex-wrap gap-1.5 mb-4">
72929
- @if (capability()?.importance) {
72930
- <span [ngClass]="importanceBadgeClasses()" [class.animate-pulse]="isHighImportance()" class="px-2 py-1 rounded text-xs font-medium">
72931
- {{ importanceLabel() }} Importance
72932
- </span>
72933
- }
72934
- @if (capability()?.effort) {
72935
- <span [ngClass]="effortBadgeClasses()" class="px-2 py-1 rounded text-xs">
72936
- {{ effortLabel() }} Effort
72937
- </span>
72938
- }
72939
- @if (capability()?.impact) {
72940
- <span [ngClass]="impactBadgeClasses()" class="px-2 py-1 rounded text-xs">
72941
- {{ impactLabel() }} Impact
72942
- </span>
72943
- }
72944
- </div>
72945
-
72946
- <!-- Related Goals (in expandable section) -->
72947
- @if (capability()?.relatedGoalIds && capability()!.relatedGoalIds!.length > 0) {
72948
- <div class="space-y-2">
72949
- <div class="flex items-center gap-1.5">
72950
- <symphiq-icon
72951
- [icon]="{ name: 'link', source: IconSourceEnum.HEROICONS }"
72952
- size="w-3.5 h-3.5"
72953
- [ngClass]="relatedGoalsIconClasses()"
72954
- />
72955
- <span [ngClass]="relatedGoalsTitleClasses()" class="text-xs font-semibold">Related Goals</span>
72956
- </div>
72957
- <symphiq-related-goal-chips
72958
- [relatedGoalIds]="capability()!.relatedGoalIds!"
72959
- [allGoals]="allGoals()"
72960
- [viewMode]="viewMode()"
72961
- />
72962
- </div>
72963
- }
72964
-
72965
- </div>
72966
- </div>
72967
- </div>
72968
-
72969
- <!-- Learn More / View Less Button (for Compact/Simplified modes) -->
72970
- @if (!isExpandedMode()) {
72971
- <div class="flex items-center gap-2 mt-3 cursor-pointer" (click)="toggleExpanded($event)">
72972
- <span [ngClass]="learnMoreButtonClasses()" class="text-sm font-medium">
72973
- {{ isExpanded() ? 'View Less' : 'Learn More' }}
72974
- </span>
72975
- <svg
72976
- [ngClass]="learnMoreChevronClasses()"
72977
- [class.rotate-180]="isExpanded()"
72978
- class="w-4 h-4 transition-transform duration-200"
72979
- fill="none"
72980
- stroke="currentColor"
72981
- viewBox="0 0 24 24">
72982
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
72983
- </svg>
72984
- </div>
72985
- }
72986
- </div>
72890
+ template: `
72891
+ <div
72892
+ [ngClass]="cardClasses()"
72893
+ [class.cursor-pointer]="!isExpandedMode()"
72894
+ (click)="onCardClick($event)"
72895
+ class="rounded-lg p-4">
72896
+ <div class="flex items-start justify-between gap-3 mb-3">
72897
+ <div class="flex-1">
72898
+ <h5 [ngClass]="titleClasses()" class="font-semibold text-sm mb-1">{{ capability()?.name }}</h5>
72899
+ @if (capability()?.industryBenchmark) {
72900
+ <p [ngClass]="benchmarkClasses()" class="text-xs">Industry: {{ formatIndustryBenchmark(capability()!.industryBenchmark!) }}</p>
72901
+ }
72902
+ </div>
72903
+ @if (capability()?.quadrant) {
72904
+ <span [ngClass]="quadrantBadgeClasses()" class="px-2.5 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
72905
+ {{ quadrantLabel() }}
72906
+ </span>
72907
+ }
72908
+ </div>
72909
+
72910
+ <!-- Expandable Content -->
72911
+ <div class="grid transition-[grid-template-rows] duration-300 ease-in-out" [style.grid-template-rows]="shouldShowExpandedContent() ? '1fr' : '0fr'">
72912
+ <div class="overflow-hidden min-h-0">
72913
+ <div [style.opacity]="shouldShowExpandedContent() ? '1' : '0'" [style.transition-delay]="shouldShowExpandedContent() ? '150ms' : '0ms'" class="transition-opacity duration-300">
72914
+
72915
+ <div class="grid grid-cols-2 gap-3 mb-3">
72916
+ <div [ngClass]="stateSectionClasses()" class="p-3 rounded-lg">
72917
+ <p [ngClass]="stateLabelClasses()" class="text-xs font-medium mb-1">Current</p>
72918
+ <div class="flex items-center gap-1.5">
72919
+ <div [ngClass]="stateIndicatorClasses(capability()?.currentState || CapabilityStateEnum.NOT_IMPLEMENTED)" [class.animate-pulse-slow]="isNotImplemented(capability()?.currentState)" class="w-2 h-2 rounded-full"></div>
72920
+ <p [ngClass]="stateValueClasses()" class="text-xs">{{ formatState(capability()?.currentState) }}</p>
72921
+ </div>
72922
+ </div>
72923
+ <div [ngClass]="stateSectionClasses()" class="p-3 rounded-lg">
72924
+ <p [ngClass]="stateLabelClasses()" class="text-xs font-medium mb-1">Desired</p>
72925
+ <div class="flex items-center gap-1.5">
72926
+ <div [ngClass]="stateIndicatorClasses(capability()?.desiredState || CapabilityStateEnum.FULLY_IMPLEMENTED)" class="w-2 h-2 rounded-full"></div>
72927
+ <p [ngClass]="stateValueClasses()" class="text-xs font-semibold">{{ formatState(capability()?.desiredState) }}</p>
72928
+ </div>
72929
+ </div>
72930
+ </div>
72931
+
72932
+ <div class="flex flex-wrap gap-1.5 mb-4">
72933
+ @if (capability()?.importance) {
72934
+ <span [ngClass]="importanceBadgeClasses()" [class.animate-pulse-slow]="isHighImportance()" class="px-2 py-1 rounded text-xs font-medium">
72935
+ {{ importanceLabel() }} Importance
72936
+ </span>
72937
+ }
72938
+ @if (capability()?.effort) {
72939
+ <span [ngClass]="effortBadgeClasses()" class="px-2 py-1 rounded text-xs">
72940
+ {{ effortLabel() }} Effort
72941
+ </span>
72942
+ }
72943
+ @if (capability()?.impact) {
72944
+ <span [ngClass]="impactBadgeClasses()" class="px-2 py-1 rounded text-xs">
72945
+ {{ impactLabel() }} Impact
72946
+ </span>
72947
+ }
72948
+ </div>
72949
+
72950
+ <!-- Related Goals (in expandable section) -->
72951
+ @if (capability()?.relatedGoalIds && capability()!.relatedGoalIds!.length > 0) {
72952
+ <div class="space-y-2">
72953
+ <div class="flex items-center gap-1.5">
72954
+ <symphiq-icon
72955
+ [icon]="{ name: 'link', source: IconSourceEnum.HEROICONS }"
72956
+ size="w-3.5 h-3.5"
72957
+ [ngClass]="relatedGoalsIconClasses()"
72958
+ />
72959
+ <span [ngClass]="relatedGoalsTitleClasses()" class="text-xs font-semibold">Related Goals</span>
72960
+ </div>
72961
+ <symphiq-related-goal-chips
72962
+ [relatedGoalIds]="capability()!.relatedGoalIds!"
72963
+ [allGoals]="allGoals()"
72964
+ [viewMode]="viewMode()"
72965
+ />
72966
+ </div>
72967
+ }
72968
+
72969
+ </div>
72970
+ </div>
72971
+ </div>
72972
+
72973
+ <!-- Learn More / View Less Button (for Compact/Simplified modes) -->
72974
+ @if (!isExpandedMode()) {
72975
+ <div class="flex items-center gap-2 mt-3 cursor-pointer" (click)="toggleExpanded($event)">
72976
+ <span [ngClass]="learnMoreButtonClasses()" class="text-sm font-medium">
72977
+ {{ isExpanded() ? 'View Less' : 'Learn More' }}
72978
+ </span>
72979
+ <svg
72980
+ [ngClass]="learnMoreChevronClasses()"
72981
+ [class.rotate-180]="isExpanded()"
72982
+ class="w-4 h-4 transition-transform duration-200"
72983
+ fill="none"
72984
+ stroke="currentColor"
72985
+ viewBox="0 0 24 24">
72986
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
72987
+ </svg>
72988
+ </div>
72989
+ }
72990
+ </div>
72987
72991
  `
72988
72992
  }]
72989
72993
  }], () => [], { capability: [{ type: i0.Input, args: [{ isSignal: true, alias: "capability", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], allGoals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allGoals", required: false }] }] }); })();
@@ -73090,7 +73094,7 @@ function CompetitiveComparisonCardComponent_Conditional_13_For_4_Template(rf, ct
73090
73094
  i0.ɵɵadvance(2);
73091
73095
  i0.ɵɵproperty("ngClass", ctx_r1.competitorNameClasses());
73092
73096
  i0.ɵɵadvance();
73093
- i0.ɵɵtextInterpolate(position_r3.competitorId);
73097
+ i0.ɵɵtextInterpolate(ctx_r1.getCompetitorTitle(position_r3.competitorId));
73094
73098
  i0.ɵɵadvance();
73095
73099
  i0.ɵɵproperty("ngClass", ctx_r1.advantageBadgeClasses(position_r3.advantage));
73096
73100
  i0.ɵɵadvance();
@@ -73162,6 +73166,7 @@ class CompetitiveComparisonCardComponent {
73162
73166
  this.comparison = input(...(ngDevMode ? [undefined, { debugName: "comparison" }] : []));
73163
73167
  this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
73164
73168
  this.viewModeService = inject(ViewModeService);
73169
+ this.profileContextService = inject(ProfileContextService);
73165
73170
  this.expandedSignal = signal(false, ...(ngDevMode ? [{ debugName: "expandedSignal" }] : []));
73166
73171
  this.isDark = computed(() => this.viewMode() === ViewModeEnum.DARK, ...(ngDevMode ? [{ debugName: "isDark" }] : []));
73167
73172
  this.globalIsExpanded = computed(() => this.viewModeService.getViewMode() === 'expanded', ...(ngDevMode ? [{ debugName: "globalIsExpanded" }] : []));
@@ -73273,6 +73278,12 @@ class CompetitiveComparisonCardComponent {
73273
73278
  default: return '';
73274
73279
  }
73275
73280
  }
73281
+ getCompetitorTitle(competitorId) {
73282
+ if (!competitorId)
73283
+ return '';
73284
+ const competitors = this.profileContextService.getCompetitorsByIds([competitorId]);
73285
+ return competitors[0]?.label || competitorId;
73286
+ }
73276
73287
  advantageBadgeClasses(advantage) {
73277
73288
  if (this.isDark()) {
73278
73289
  if (advantage === AdvantageEnum.YOURS) {
@@ -73431,7 +73442,7 @@ class CompetitiveComparisonCardComponent {
73431
73442
  @for (position of comparison()!.competitorPositions; track position.competitorId || $index) {
73432
73443
  <div [ngClass]="competitorCardClasses()" class="p-3 rounded-lg">
73433
73444
  <div class="flex items-start justify-between gap-2 mb-2">
73434
- <p [ngClass]="competitorNameClasses()" class="text-sm font-medium">{{ position.competitorId }}</p>
73445
+ <p [ngClass]="competitorNameClasses()" class="text-sm font-medium">{{ getCompetitorTitle(position.competitorId) }}</p>
73435
73446
  <span [ngClass]="advantageBadgeClasses(position.advantage)" class="px-2 py-0.5 rounded-full text-xs font-semibold whitespace-nowrap">
73436
73447
  {{ formatAdvantage(position.advantage) }}
73437
73448
  </span>
@@ -73481,7 +73492,7 @@ class CompetitiveComparisonCardComponent {
73481
73492
  `
73482
73493
  }]
73483
73494
  }], () => [], { comparison: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparison", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }] }); })();
73484
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveComparisonCardComponent, { className: "CompetitiveComparisonCardComponent", filePath: "lib/components/profile-analysis-dashboard/cards/competitive-comparison-card.component.ts", lineNumber: 125 }); })();
73495
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveComparisonCardComponent, { className: "CompetitiveComparisonCardComponent", filePath: "lib/components/profile-analysis-dashboard/cards/competitive-comparison-card.component.ts", lineNumber: 126 }); })();
73485
73496
 
73486
73497
  const _c0$j = a0 => ({ name: "chevron-right", source: a0 });
73487
73498
  const _forTrack0$j = ($index, $item) => $item.id;
@@ -73523,20 +73534,22 @@ function PhaseTimelineCardComponent_Conditional_8_Template(rf, ctx) { if (rf & 1
73523
73534
  i0.ɵɵrepeater(ctx_r2.goalObjects());
73524
73535
  } }
73525
73536
  function PhaseTimelineCardComponent_Conditional_9_For_7_Template(rf, ctx) { if (rf & 1) {
73526
- i0.ɵɵelementStart(0, "li", 19);
73527
- i0.ɵɵelement(1, "div", 20);
73528
- i0.ɵɵelementStart(2, "span", 21);
73529
- i0.ɵɵtext(3);
73530
- i0.ɵɵelementEnd()();
73537
+ const _r4 = i0.ɵɵgetCurrentView();
73538
+ i0.ɵɵelementStart(0, "button", 15);
73539
+ i0.ɵɵlistener("click", function PhaseTimelineCardComponent_Conditional_9_For_7_Template_button_click_0_listener($event) { const recommendation_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openRecommendationModal(recommendation_r5, $event)); });
73540
+ i0.ɵɵelementStart(1, "span");
73541
+ i0.ɵɵtext(2);
73542
+ i0.ɵɵelementEnd();
73543
+ i0.ɵɵelement(3, "symphiq-icon", 16);
73544
+ i0.ɵɵelementEnd();
73531
73545
  } if (rf & 2) {
73532
- const recommendationId_r4 = ctx.$implicit;
73546
+ const recommendation_r5 = ctx.$implicit;
73533
73547
  const ctx_r2 = i0.ɵɵnextContext(2);
73548
+ i0.ɵɵproperty("ngClass", ctx_r2.recommendationBadgeClasses());
73549
+ i0.ɵɵadvance(2);
73550
+ i0.ɵɵtextInterpolate(recommendation_r5.title);
73534
73551
  i0.ɵɵadvance();
73535
- i0.ɵɵproperty("ngClass", ctx_r2.bulletClasses());
73536
- i0.ɵɵadvance();
73537
- i0.ɵɵproperty("ngClass", ctx_r2.recommendationTextClasses());
73538
- i0.ɵɵadvance();
73539
- i0.ɵɵtextInterpolate(recommendationId_r4);
73552
+ i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(3, _c0$j, ctx_r2.IconSourceEnum.HEROICONS));
73540
73553
  } }
73541
73554
  function PhaseTimelineCardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
73542
73555
  i0.ɵɵelementStart(0, "div", 7)(1, "h6", 10);
@@ -73547,47 +73560,47 @@ function PhaseTimelineCardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1
73547
73560
  i0.ɵɵtext(4, " Recommendations ");
73548
73561
  i0.ɵɵelementEnd();
73549
73562
  i0.ɵɵnamespaceHTML();
73550
- i0.ɵɵelementStart(5, "ul", 18);
73551
- i0.ɵɵrepeaterCreate(6, PhaseTimelineCardComponent_Conditional_9_For_7_Template, 4, 3, "li", 19, i0.ɵɵrepeaterTrackByIndex);
73563
+ i0.ɵɵelementStart(5, "div", 13);
73564
+ i0.ɵɵrepeaterCreate(6, PhaseTimelineCardComponent_Conditional_9_For_7_Template, 4, 5, "button", 14, _forTrack0$j);
73552
73565
  i0.ɵɵelementEnd()();
73553
73566
  } if (rf & 2) {
73554
73567
  const ctx_r2 = i0.ɵɵnextContext();
73555
73568
  i0.ɵɵadvance();
73556
73569
  i0.ɵɵproperty("ngClass", ctx_r2.sectionLabelClasses());
73557
73570
  i0.ɵɵadvance(5);
73558
- i0.ɵɵrepeater(ctx_r2.phase().recommendationIds);
73571
+ i0.ɵɵrepeater(ctx_r2.recommendationObjects());
73559
73572
  } }
73560
73573
  function PhaseTimelineCardComponent_Conditional_10_For_10_Template(rf, ctx) { if (rf & 1) {
73561
- i0.ɵɵelementStart(0, "li", 19);
73574
+ i0.ɵɵelementStart(0, "li", 23);
73562
73575
  i0.ɵɵnamespaceSVG();
73563
- i0.ɵɵelementStart(1, "svg", 27);
73564
- i0.ɵɵelement(2, "path", 28);
73576
+ i0.ɵɵelementStart(1, "svg", 24);
73577
+ i0.ɵɵelement(2, "path", 25);
73565
73578
  i0.ɵɵelementEnd();
73566
73579
  i0.ɵɵnamespaceHTML();
73567
- i0.ɵɵelementStart(3, "span", 21);
73580
+ i0.ɵɵelementStart(3, "span", 26);
73568
73581
  i0.ɵɵtext(4);
73569
73582
  i0.ɵɵelementEnd()();
73570
73583
  } if (rf & 2) {
73571
- const outcome_r5 = ctx.$implicit;
73584
+ const outcome_r6 = ctx.$implicit;
73572
73585
  const ctx_r2 = i0.ɵɵnextContext(2);
73573
73586
  i0.ɵɵadvance();
73574
73587
  i0.ɵɵproperty("ngClass", ctx_r2.outcomeIconClasses());
73575
73588
  i0.ɵɵadvance(2);
73576
73589
  i0.ɵɵproperty("ngClass", ctx_r2.outcomeTextClasses());
73577
73590
  i0.ɵɵadvance();
73578
- i0.ɵɵtextInterpolate(outcome_r5);
73591
+ i0.ɵɵtextInterpolate(outcome_r6);
73579
73592
  } }
73580
73593
  function PhaseTimelineCardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
73581
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 23)(2, "div")(3, "h6", 10);
73594
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 19)(2, "div")(3, "h6", 10);
73582
73595
  i0.ɵɵnamespaceSVG();
73583
73596
  i0.ɵɵelementStart(4, "svg", 11);
73584
- i0.ɵɵelement(5, "path", 24);
73597
+ i0.ɵɵelement(5, "path", 20);
73585
73598
  i0.ɵɵelementEnd();
73586
73599
  i0.ɵɵtext(6, " Expected Outcomes ");
73587
73600
  i0.ɵɵelementEnd();
73588
73601
  i0.ɵɵnamespaceHTML();
73589
- i0.ɵɵelementStart(7, "div", 25)(8, "ul", 26);
73590
- i0.ɵɵrepeaterCreate(9, PhaseTimelineCardComponent_Conditional_10_For_10_Template, 5, 3, "li", 19, i0.ɵɵrepeaterTrackByIndex);
73602
+ i0.ɵɵelementStart(7, "div", 21)(8, "ul", 22);
73603
+ i0.ɵɵrepeaterCreate(9, PhaseTimelineCardComponent_Conditional_10_For_10_Template, 5, 3, "li", 23, i0.ɵɵrepeaterTrackByIndex);
73591
73604
  i0.ɵɵelementEnd()()()()();
73592
73605
  } if (rf & 2) {
73593
73606
  const ctx_r2 = i0.ɵɵnextContext();
@@ -73600,15 +73613,15 @@ function PhaseTimelineCardComponent_Conditional_10_Template(rf, ctx) { if (rf &
73600
73613
  i0.ɵɵrepeater(ctx_r2.phase().outcomes);
73601
73614
  } }
73602
73615
  function PhaseTimelineCardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
73603
- const _r6 = i0.ɵɵgetCurrentView();
73604
- i0.ɵɵelementStart(0, "div", 29);
73605
- i0.ɵɵlistener("click", function PhaseTimelineCardComponent_Conditional_11_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleExpanded()); });
73606
- i0.ɵɵelementStart(1, "span", 30);
73616
+ const _r7 = i0.ɵɵgetCurrentView();
73617
+ i0.ɵɵelementStart(0, "div", 27);
73618
+ i0.ɵɵlistener("click", function PhaseTimelineCardComponent_Conditional_11_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleExpanded($event)); });
73619
+ i0.ɵɵelementStart(1, "span", 28);
73607
73620
  i0.ɵɵtext(2);
73608
73621
  i0.ɵɵelementEnd();
73609
73622
  i0.ɵɵnamespaceSVG();
73610
- i0.ɵɵelementStart(3, "svg", 31);
73611
- i0.ɵɵelement(4, "path", 32);
73623
+ i0.ɵɵelementStart(3, "svg", 29);
73624
+ i0.ɵɵelement(4, "path", 30);
73612
73625
  i0.ɵɵelementEnd()();
73613
73626
  } if (rf & 2) {
73614
73627
  const ctx_r2 = i0.ɵɵnextContext();
@@ -73628,6 +73641,7 @@ class PhaseTimelineCardComponent {
73628
73641
  this.allGoals = input([], ...(ngDevMode ? [{ debugName: "allGoals" }] : []));
73629
73642
  this.viewModeService = inject(ViewModeService);
73630
73643
  this.modalService = inject(ModalService);
73644
+ this.profileContextService = inject(ProfileContextService);
73631
73645
  this.expandedSignal = signal(false, ...(ngDevMode ? [{ debugName: "expandedSignal" }] : []));
73632
73646
  this.IconSourceEnum = IconSourceEnum;
73633
73647
  this.isDark = computed(() => this.viewMode() === ViewModeEnum.DARK, ...(ngDevMode ? [{ debugName: "isDark" }] : []));
@@ -73635,6 +73649,12 @@ class PhaseTimelineCardComponent {
73635
73649
  const goalIds = this.phase()?.goalIds || [];
73636
73650
  return this.allGoals().filter((goal) => goalIds.includes(goal.id || ''));
73637
73651
  }, ...(ngDevMode ? [{ debugName: "goalObjects" }] : []));
73652
+ this.recommendationObjects = computed(() => {
73653
+ const recommendationIds = this.phase()?.recommendationIds || [];
73654
+ return recommendationIds
73655
+ .map(id => this.profileContextService.getRecommendationById(id))
73656
+ .filter((rec) => rec !== undefined);
73657
+ }, ...(ngDevMode ? [{ debugName: "recommendationObjects" }] : []));
73638
73658
  this.globalIsExpanded = computed(() => this.viewModeService.getViewMode() === 'expanded', ...(ngDevMode ? [{ debugName: "globalIsExpanded" }] : []));
73639
73659
  this.formattedPhaseName = computed(() => {
73640
73660
  const phaseData = this.phase();
@@ -73690,6 +73710,12 @@ class PhaseTimelineCardComponent {
73690
73710
  }
73691
73711
  return 'bg-blue-50 text-blue-700 border border-blue-200 hover:bg-blue-100 hover:border-blue-300 hover:shadow-lg hover:shadow-blue-500/20';
73692
73712
  }, ...(ngDevMode ? [{ debugName: "goalBadgeClasses" }] : []));
73713
+ this.recommendationBadgeClasses = computed(() => {
73714
+ if (this.isDark()) {
73715
+ return 'bg-purple-500/20 text-purple-400 border border-purple-500/30 hover:bg-purple-500/30 hover:border-purple-500/40 hover:shadow-lg hover:shadow-purple-500/20';
73716
+ }
73717
+ return 'bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 hover:border-purple-300 hover:shadow-lg hover:shadow-purple-500/20';
73718
+ }, ...(ngDevMode ? [{ debugName: "recommendationBadgeClasses" }] : []));
73693
73719
  this.bulletClasses = computed(() => {
73694
73720
  return this.isDark() ? 'bg-slate-400' : 'bg-slate-400';
73695
73721
  }, ...(ngDevMode ? [{ debugName: "bulletClasses" }] : []));
@@ -73732,7 +73758,10 @@ class PhaseTimelineCardComponent {
73732
73758
  shouldShowExpandedContent() {
73733
73759
  return this.globalIsExpanded() || this.expandedSignal();
73734
73760
  }
73735
- toggleExpanded() {
73761
+ toggleExpanded(event) {
73762
+ if (event) {
73763
+ event.stopPropagation();
73764
+ }
73736
73765
  if (!this.globalIsExpanded()) {
73737
73766
  this.expandedSignal.update(v => !v);
73738
73767
  }
@@ -73749,8 +73778,20 @@ class PhaseTimelineCardComponent {
73749
73778
  }
73750
73779
  this.modalService.openGoalDetailModal(goal, this.viewMode());
73751
73780
  }
73781
+ openRecommendationModal(recommendation, event) {
73782
+ if (event) {
73783
+ event.stopPropagation();
73784
+ event.preventDefault();
73785
+ }
73786
+ const goalContext = {
73787
+ title: recommendation.title || 'Recommendation',
73788
+ description: recommendation.description || '',
73789
+ icon: 'light-bulb'
73790
+ };
73791
+ this.modalService.navigateToBusinessInsightDetail(recommendation, goalContext, this.viewMode());
73792
+ }
73752
73793
  static { this.ɵfac = function PhaseTimelineCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PhaseTimelineCardComponent)(); }; }
73753
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PhaseTimelineCardComponent, selectors: [["symphiq-phase-timeline-card"]], inputs: { phase: [1, "phase"], viewMode: [1, "viewMode"], isLast: [1, "isLast"], allGoals: [1, "allGoals"] }, decls: 12, vars: 12, consts: [[1, "rounded-lg", "p-5", "relative", 3, "click", "ngClass"], [1, "flex", "items-start", "gap-4", "relative"], [1, "z-10", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"], [1, "flex-1"], [1, "font-bold", "text-lg", "mb-4", 3, "ngClass"], [1, "mb-4"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out", 3, "grid-template-rows"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "text-sm", "font-semibold", "mb-2", "flex", "items-center", "gap-2", 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", "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"], [1, "flex", "flex-wrap", "gap-2"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", "hover:shadow-md", 3, "ngClass"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", "hover:shadow-md", 3, "click", "ngClass"], ["size", "w-3.5 h-3.5", 1, "flex-shrink-0", "opacity-60", 3, "icon"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"], [1, "space-y-2"], [1, "flex", "items-start", "gap-2"], [1, "w-1.5", "h-1.5", "rounded-full", "mt-1.5", "flex-shrink-0", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "p-3", "rounded-lg", 3, "ngClass"], [1, "space-y-1.5"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M5 13l4 4L19 7"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function PhaseTimelineCardComponent_Template(rf, ctx) { if (rf & 1) {
73794
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PhaseTimelineCardComponent, selectors: [["symphiq-phase-timeline-card"]], inputs: { phase: [1, "phase"], viewMode: [1, "viewMode"], isLast: [1, "isLast"], allGoals: [1, "allGoals"] }, decls: 12, vars: 12, consts: [[1, "rounded-lg", "p-5", "relative", 3, "click", "ngClass"], [1, "flex", "items-start", "gap-4", "relative"], [1, "z-10", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"], [1, "flex-1"], [1, "font-bold", "text-lg", "mb-4", 3, "ngClass"], [1, "mb-4"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out", 3, "grid-template-rows"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "text-sm", "font-semibold", "mb-2", "flex", "items-center", "gap-2", 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", "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"], [1, "flex", "flex-wrap", "gap-2"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", "hover:shadow-md", 3, "ngClass"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", "hover:shadow-md", 3, "click", "ngClass"], ["size", "w-3.5 h-3.5", 1, "flex-shrink-0", "opacity-60", 3, "icon"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "p-3", "rounded-lg", 3, "ngClass"], [1, "space-y-1.5"], [1, "flex", "items-start", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M5 13l4 4L19 7"], [1, "text-sm", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function PhaseTimelineCardComponent_Template(rf, ctx) { if (rf & 1) {
73754
73795
  i0.ɵɵelementStart(0, "div", 0);
73755
73796
  i0.ɵɵlistener("click", function PhaseTimelineCardComponent_Template_div_click_0_listener($event) { return ctx.onCardClick($event); });
73756
73797
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2);
@@ -73769,7 +73810,6 @@ class PhaseTimelineCardComponent {
73769
73810
  i0.ɵɵelementEnd()()();
73770
73811
  } if (rf & 2) {
73771
73812
  let tmp_6_0;
73772
- let tmp_7_0;
73773
73813
  let tmp_8_0;
73774
73814
  let tmp_9_0;
73775
73815
  i0.ɵɵclassProp("mb-6", !ctx.isLast())("cursor-pointer", ctx.isCompactMode());
@@ -73783,7 +73823,7 @@ class PhaseTimelineCardComponent {
73783
73823
  i0.ɵɵadvance();
73784
73824
  i0.ɵɵconditional(((tmp_6_0 = ctx.phase()) == null ? null : tmp_6_0.goalIds) && ctx.phase().goalIds.length > 0 ? 8 : -1);
73785
73825
  i0.ɵɵadvance();
73786
- i0.ɵɵconditional(((tmp_7_0 = ctx.phase()) == null ? null : tmp_7_0.recommendationIds) && ctx.phase().recommendationIds.length > 0 ? 9 : -1);
73826
+ i0.ɵɵconditional(ctx.recommendationObjects().length > 0 ? 9 : -1);
73787
73827
  i0.ɵɵadvance();
73788
73828
  i0.ɵɵconditional(((tmp_8_0 = ctx.phase()) == null ? null : tmp_8_0.outcomes) && ctx.phase().outcomes.length > 0 ? 10 : -1);
73789
73829
  i0.ɵɵadvance();
@@ -73837,7 +73877,7 @@ class PhaseTimelineCardComponent {
73837
73877
  </div>
73838
73878
  }
73839
73879
 
73840
- @if (phase()?.recommendationIds && phase()!.recommendationIds!.length > 0) {
73880
+ @if (recommendationObjects().length > 0) {
73841
73881
  <div class="mb-4">
73842
73882
  <h6 [ngClass]="sectionLabelClasses()" class="text-sm font-semibold mb-2 flex items-center gap-2">
73843
73883
  <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -73845,14 +73885,18 @@ class PhaseTimelineCardComponent {
73845
73885
  </svg>
73846
73886
  Recommendations
73847
73887
  </h6>
73848
- <ul class="space-y-2">
73849
- @for (recommendationId of phase()!.recommendationIds; track $index) {
73850
- <li class="flex items-start gap-2">
73851
- <div [ngClass]="bulletClasses()" class="w-1.5 h-1.5 rounded-full mt-1.5 flex-shrink-0"></div>
73852
- <span [ngClass]="recommendationTextClasses()" class="text-sm">{{ recommendationId }}</span>
73853
- </li>
73888
+ <div class="flex flex-wrap gap-2">
73889
+ @for (recommendation of recommendationObjects(); track recommendation.id) {
73890
+ <button
73891
+ type="button"
73892
+ [ngClass]="recommendationBadgeClasses()"
73893
+ (click)="openRecommendationModal(recommendation, $event)"
73894
+ class="cursor-pointer flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition-all duration-200 hover:scale-105 hover:shadow-md">
73895
+ <span>{{ recommendation.title }}</span>
73896
+ <symphiq-icon [icon]="{ name: 'chevron-right', source: IconSourceEnum.HEROICONS }" size="w-3.5 h-3.5" class="flex-shrink-0 opacity-60"></symphiq-icon>
73897
+ </button>
73854
73898
  }
73855
- </ul>
73899
+ </div>
73856
73900
  </div>
73857
73901
  }
73858
73902
 
@@ -73886,7 +73930,7 @@ class PhaseTimelineCardComponent {
73886
73930
 
73887
73931
  <!-- Learn More / View Less Button (for Compact mode) -->
73888
73932
  @if (isCompactMode() && phase()?.outcomes && phase()!.outcomes!.length > 0) {
73889
- <div class="flex items-center gap-2 mt-3 cursor-pointer" (click)="toggleExpanded()">
73933
+ <div class="flex items-center gap-2 mt-3 cursor-pointer" (click)="toggleExpanded($event)">
73890
73934
  <span [ngClass]="learnMoreButtonClasses()" class="text-sm font-medium">
73891
73935
  {{ isExpanded() ? 'View Less' : 'Learn More' }}
73892
73936
  </span>
@@ -73907,7 +73951,7 @@ class PhaseTimelineCardComponent {
73907
73951
  `
73908
73952
  }]
73909
73953
  }], () => [], { phase: [{ type: i0.Input, args: [{ isSignal: true, alias: "phase", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], isLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLast", required: false }] }], allGoals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allGoals", required: false }] }] }); })();
73910
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PhaseTimelineCardComponent, { className: "PhaseTimelineCardComponent", filePath: "lib/components/profile-analysis-dashboard/cards/phase-timeline-card.component.ts", lineNumber: 123 }); })();
73954
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PhaseTimelineCardComponent, { className: "PhaseTimelineCardComponent", filePath: "lib/components/profile-analysis-dashboard/cards/phase-timeline-card.component.ts", lineNumber: 128 }); })();
73911
73955
 
73912
73956
  const _c0$i = a0 => ({ name: "chevron-right", source: a0 });
73913
73957
  function OperationalCategoryCardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
@@ -74276,7 +74320,7 @@ class OperationalCategoryCardComponent {
74276
74320
  static { this.ɵfac = function OperationalCategoryCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || OperationalCategoryCardComponent)(); }; }
74277
74321
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: OperationalCategoryCardComponent, selectors: [["symphiq-operational-category-card"]], hostVars: 1, hostBindings: function OperationalCategoryCardComponent_HostBindings(rf, ctx) { if (rf & 2) {
74278
74322
  i0.ɵɵattribute("data-animate-progress", true);
74279
- } }, inputs: { category: [1, "category"], viewMode: [1, "viewMode"] }, outputs: { categoryClick: "categoryClick" }, decls: 25, vars: 25, consts: [[1, "rounded-xl", "p-6", "transition-all", "duration-300", "group", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "ngClass"], [1, "flex", "items-start", "justify-between", "mb-4"], [1, "flex-1", "min-w-0", "mr-3"], [1, "text-lg", "font-bold", "mb-2", 3, "ngClass"], [1, "inline-flex", "items-center", "px-2.5", "py-1", "rounded-full", "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "flex-col", "items-end", "gap-2"], [1, "px-4", "py-2", "rounded-lg", "text-center", "min-w-[60px]", 3, "ngClass"], [1, "text-2xl", "font-bold"], [1, "text-xs", "font-medium", "opacity-90"], [1, "text-sm", "mb-4", 3, "ngClass"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden", "min-h-0"], [1, "transition-opacity", "duration-300"], [1, "mb-4"], [1, "flex", "flex-wrap", "gap-2", "mb-4", "px-1", "-mx-1"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", "animate-pulse", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "pt-3", "border-t", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "flex", "items-center", "justify-between", "text-xs", "mb-1.5"], [3, "ngClass"], [1, "font-bold", 3, "ngClass"], [1, "h-2", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-1000", "ease-out", "rounded-full", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"], ["size", "w-3.5 h-3.5", 1, "transform", "group-hover:translate-x-0.5", "transition-transform", 3, "icon"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", "animate-pulse", 3, "click", "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "flex", "items-center", "justify-between", "pt-3", "border-t", 3, "click", "ngClass"], [1, "text-sm", "font-semibold", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "transform", "group-hover:translate-x-1", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 5l7 7-7 7"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function OperationalCategoryCardComponent_Template(rf, ctx) { if (rf & 1) {
74323
+ } }, inputs: { category: [1, "category"], viewMode: [1, "viewMode"] }, outputs: { categoryClick: "categoryClick" }, decls: 25, vars: 25, consts: [[1, "rounded-xl", "p-6", "transition-all", "duration-300", "group", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "ngClass"], [1, "flex", "items-start", "justify-between", "mb-4"], [1, "flex-1", "min-w-0", "mr-3"], [1, "text-lg", "font-bold", "mb-2", 3, "ngClass"], [1, "inline-flex", "items-center", "px-2.5", "py-1", "rounded-full", "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "flex-col", "items-end", "gap-2"], [1, "px-4", "py-2", "rounded-lg", "text-center", "min-w-[60px]", 3, "ngClass"], [1, "text-2xl", "font-bold"], [1, "text-xs", "font-medium", "opacity-90"], [1, "text-sm", "mb-4", 3, "ngClass"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden", "min-h-0"], [1, "transition-opacity", "duration-300"], [1, "mb-4"], [1, "flex", "flex-wrap", "gap-2", "mb-4", "px-1", "-mx-1"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", "animate-pulse-slow", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "pt-3", "border-t", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer"], [1, "flex", "items-center", "justify-between", "text-xs", "mb-1.5"], [3, "ngClass"], [1, "font-bold", 3, "ngClass"], [1, "h-2", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-1000", "ease-out", "rounded-full", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"], ["size", "w-3.5 h-3.5", 1, "transform", "group-hover:translate-x-0.5", "transition-transform", 3, "icon"], [1, "flex", "items-center", "gap-1.5", "px-3", "py-1.5", "rounded-lg", "text-xs", "font-semibold", "cursor-pointer", "hover:scale-[1.03]", "transition-transform", "group", "animate-pulse-slow", 3, "click", "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "flex", "items-center", "justify-between", "pt-3", "border-t", 3, "click", "ngClass"], [1, "text-sm", "font-semibold", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "transform", "group-hover:translate-x-1", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 5l7 7-7 7"], [1, "flex", "items-center", "gap-2", "mt-3", "cursor-pointer", 3, "click"], [1, "text-sm", "font-medium", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform", "duration-200", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"]], template: function OperationalCategoryCardComponent_Template(rf, ctx) { if (rf & 1) {
74280
74324
  i0.ɵɵelementStart(0, "div", 0);
74281
74325
  i0.ɵɵlistener("click", function OperationalCategoryCardComponent_Template_div_click_0_listener($event) { return ctx.onCardClick($event); });
74282
74326
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "h3", 3);
@@ -74435,7 +74479,7 @@ class OperationalCategoryCardComponent {
74435
74479
  <div
74436
74480
  (click)="openGapsModal($event)"
74437
74481
  [ngClass]="gapChipClasses()"
74438
- class="flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer hover:scale-[1.03] transition-transform group animate-pulse">
74482
+ class="flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer hover:scale-[1.03] transition-transform group animate-pulse-slow">
74439
74483
  <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
74440
74484
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
74441
74485
  </svg>
@@ -84542,120 +84586,120 @@ class GapDetailModalContentComponent {
84542
84586
  standalone: true,
84543
84587
  imports: [CommonModule, RelatedGoalChipsComponent],
84544
84588
  changeDetection: ChangeDetectionStrategy.OnPush,
84545
- template: `
84546
- <div class="space-y-6">
84547
- <!-- Header -->
84548
- <div [ngClass]="headerClasses()" class="rounded-xl p-6 border">
84549
- <div class="flex items-start gap-3 mb-4">
84550
- <div class="flex-shrink-0">
84551
- <svg class="w-8 h-8 text-orange-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84552
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
84553
- </svg>
84554
- </div>
84555
- <div class="flex-1">
84556
- <div class="flex items-center gap-3 mb-2">
84557
- <h3 [ngClass]="titleClasses()" class="text-2xl font-bold">
84558
- {{ gap()?.capability }}
84559
- </h3>
84560
- @if (gap()?.severity) {
84561
- <span [ngClass]="severityBadgeClasses()" class="px-3 py-1 rounded-full text-xs font-bold">
84562
- {{ gap()?.severity }}
84563
- </span>
84564
- }
84565
- </div>
84566
- <span class="inline-block px-3 py-1 rounded-full text-xs font-semibold bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300">
84567
- Gap
84568
- </span>
84569
- </div>
84570
- </div>
84571
- </div>
84572
-
84573
- <!-- Description -->
84574
- @if (gap()?.description) {
84575
- <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84576
- <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 flex items-center gap-2 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84577
- <svg [ngClass]="sectionIconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84578
- <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"/>
84579
- </svg>
84580
- Description
84581
- </h4>
84582
- <p [ngClass]="descriptionClasses()" class="text-base leading-relaxed">
84583
- {{ gap()?.description }}
84584
- </p>
84585
- </div>
84586
- }
84587
-
84588
- <!-- Impact on Funnel -->
84589
- @if (gap()?.impactOnFunnel) {
84590
- <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84591
- <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 flex items-center gap-2 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84592
- <svg [ngClass]="sectionIconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84593
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
84594
- </svg>
84595
- Impact on Funnel
84596
- </h4>
84597
- <p [ngClass]="descriptionClasses()" class="text-base leading-relaxed">
84598
- {{ gap()?.impactOnFunnel }}
84599
- </p>
84600
- </div>
84601
- }
84602
-
84603
- <!-- Linked Funnel Weaknesses -->
84604
- @if (gap()?.linkedFunnelWeaknessIds && (gap()?.linkedFunnelWeaknessIds?.length ?? 0) > 0) {
84605
- <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84606
- <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84607
- Related Funnel Weaknesses
84608
- </h4>
84609
- <div class="flex flex-wrap gap-2">
84610
- @for (weaknessId of gap()?.linkedFunnelWeaknessIds; track $index) {
84611
- <button
84612
- type="button"
84613
- (click)="openWeaknessDetail(weaknessId); $event.stopPropagation()"
84614
- [ngClass]="weaknessChipClasses()"
84615
- class="px-3 py-1.5 rounded-lg text-sm font-medium flex items-center gap-2 transition-all duration-200 hover:scale-105 hover:shadow-lg cursor-pointer group">
84616
- <span>{{ getWeaknessTitle(weaknessId) }}</span>
84617
- <svg class="w-4 h-4 transition-transform duration-200 group-hover:translate-x-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84618
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
84619
- </svg>
84620
- </button>
84621
- }
84622
- </div>
84623
- </div>
84624
- }
84625
-
84626
- <!-- Linked Goals -->
84627
- @if (gap()?.linkedGoalIds && (gap()?.linkedGoalIds?.length ?? 0) > 0) {
84628
- <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84629
- <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84630
- Related Goals
84631
- </h4>
84632
- <symphiq-related-goal-chips
84633
- [relatedGoalIds]="gap()?.linkedGoalIds ?? []"
84634
- [allGoals]="allGoals()"
84635
- [viewMode]="viewMode()"
84636
- />
84637
- </div>
84638
- }
84639
-
84640
- <!-- Supporting Answers -->
84641
- @if (gap()?.supportingAnswers && (gap()?.supportingAnswers?.length ?? 0) > 0) {
84642
- <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84643
- <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84644
- Supporting Evidence
84645
- </h4>
84646
- <div class="space-y-2">
84647
- @for (answer of gap()?.supportingAnswers; track $index) {
84648
- <div [ngClass]="answerItemClasses()" class="px-4 py-2 rounded-lg flex items-center gap-2">
84649
- <svg class="w-4 h-4 flex-shrink-0 text-orange-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84650
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
84651
- </svg>
84652
- <span [ngClass]="answerTextClasses()" class="text-sm">{{ answer.answer || answer }}</span>
84653
- </div>
84654
- }
84655
- </div>
84656
- </div>
84657
- }
84658
- </div>
84589
+ template: `
84590
+ <div class="space-y-6">
84591
+ <!-- Header -->
84592
+ <div [ngClass]="headerClasses()" class="rounded-xl p-6 border">
84593
+ <div class="flex items-start gap-3 mb-4">
84594
+ <div class="flex-shrink-0">
84595
+ <svg class="w-8 h-8 text-orange-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84596
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
84597
+ </svg>
84598
+ </div>
84599
+ <div class="flex-1">
84600
+ <div class="flex items-center gap-3 mb-2">
84601
+ <h3 [ngClass]="titleClasses()" class="text-2xl font-bold">
84602
+ {{ gap()?.capability }}
84603
+ </h3>
84604
+ @if (gap()?.severity) {
84605
+ <span [ngClass]="severityBadgeClasses()" class="px-3 py-1 rounded-full text-xs font-bold">
84606
+ {{ gap()?.severity }}
84607
+ </span>
84608
+ }
84609
+ </div>
84610
+ <span class="inline-block px-3 py-1 rounded-full text-xs font-semibold bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300">
84611
+ Gap
84612
+ </span>
84613
+ </div>
84614
+ </div>
84615
+ </div>
84616
+
84617
+ <!-- Description -->
84618
+ @if (gap()?.description) {
84619
+ <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84620
+ <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 flex items-center gap-2 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84621
+ <svg [ngClass]="sectionIconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84622
+ <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"/>
84623
+ </svg>
84624
+ Description
84625
+ </h4>
84626
+ <p [ngClass]="descriptionClasses()" class="text-base leading-relaxed">
84627
+ {{ gap()?.description }}
84628
+ </p>
84629
+ </div>
84630
+ }
84631
+
84632
+ <!-- Impact on Funnel -->
84633
+ @if (gap()?.impactOnFunnel) {
84634
+ <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84635
+ <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 flex items-center gap-2 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84636
+ <svg [ngClass]="sectionIconClasses()" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84637
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
84638
+ </svg>
84639
+ Impact on Funnel
84640
+ </h4>
84641
+ <p [ngClass]="descriptionClasses()" class="text-base leading-relaxed">
84642
+ {{ gap()?.impactOnFunnel }}
84643
+ </p>
84644
+ </div>
84645
+ }
84646
+
84647
+ <!-- Linked Funnel Weaknesses -->
84648
+ @if (gap()?.linkedFunnelWeaknessIds && (gap()?.linkedFunnelWeaknessIds?.length ?? 0) > 0) {
84649
+ <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84650
+ <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84651
+ Related Funnel Weaknesses
84652
+ </h4>
84653
+ <div class="flex flex-wrap gap-2">
84654
+ @for (weaknessId of gap()?.linkedFunnelWeaknessIds; track $index) {
84655
+ <button
84656
+ type="button"
84657
+ (click)="openWeaknessDetail(weaknessId); $event.stopPropagation()"
84658
+ [ngClass]="weaknessChipClasses()"
84659
+ class="px-3 py-1.5 rounded-lg text-sm font-medium flex items-center gap-2 transition-all duration-200 hover:scale-105 hover:shadow-lg cursor-pointer group">
84660
+ <span>{{ getWeaknessTitle(weaknessId) }}</span>
84661
+ <svg class="w-4 h-4 transition-transform duration-200 group-hover:translate-x-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84662
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
84663
+ </svg>
84664
+ </button>
84665
+ }
84666
+ </div>
84667
+ </div>
84668
+ }
84669
+
84670
+ <!-- Linked Goals -->
84671
+ @if (gap()?.linkedGoalIds && (gap()?.linkedGoalIds?.length ?? 0) > 0) {
84672
+ <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84673
+ <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84674
+ Related Goals
84675
+ </h4>
84676
+ <symphiq-related-goal-chips
84677
+ [relatedGoalIds]="gap()?.linkedGoalIds ?? []"
84678
+ [allGoals]="allGoals()"
84679
+ [viewMode]="viewMode()"
84680
+ />
84681
+ </div>
84682
+ }
84683
+
84684
+ <!-- Supporting Answers -->
84685
+ @if (gap()?.supportingAnswers && (gap()?.supportingAnswers?.length ?? 0) > 0) {
84686
+ <div [ngClass]="cardClasses()" class="rounded-xl p-5 border">
84687
+ <h4 [ngClass]="sectionTitleClasses()" class="text-base font-bold mb-4 pb-3 border-b" [class]="isDark() ? 'border-slate-700' : 'border-slate-200'">
84688
+ Supporting Evidence
84689
+ </h4>
84690
+ <div class="space-y-2">
84691
+ @for (answer of gap()?.supportingAnswers; track $index) {
84692
+ <div [ngClass]="answerItemClasses()" class="px-4 py-2 rounded-lg flex items-center gap-2">
84693
+ <svg class="w-4 h-4 flex-shrink-0 text-orange-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84694
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
84695
+ </svg>
84696
+ <span [ngClass]="answerTextClasses()" class="text-sm">{{ answer.answer || answer }}</span>
84697
+ </div>
84698
+ }
84699
+ </div>
84700
+ </div>
84701
+ }
84702
+ </div>
84659
84703
  `
84660
84704
  }]
84661
84705
  }], null, { gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], allGoals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allGoals", required: false }] }], allWeaknesses: [{ type: i0.Input, args: [{ isSignal: true, alias: "allWeaknesses", required: false }] }], currentModalState: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentModalState", required: false }] }] }); })();