@eric-emg/symphiq-components 1.2.160 → 1.2.162

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.
@@ -7,6 +7,7 @@ import { map, catchError, shareReplay, debounceTime, switchMap } from 'rxjs/oper
7
7
  import * as i1 from '@angular/common/http';
8
8
  import * as i2 from '@angular/platform-browser';
9
9
  import { DomSanitizer } from '@angular/platform-browser';
10
+ import confetti from 'canvas-confetti';
10
11
  import * as i1$1 from '@angular/common';
11
12
  import { NgClass, CommonModule, isPlatformBrowser, DOCUMENT } from '@angular/common';
12
13
  import * as i2$1 from '@angular/forms';
@@ -2436,6 +2437,103 @@ class CrossDashboardRelationshipsService {
2436
2437
  }]
2437
2438
  }], null, null); })();
2438
2439
 
2440
+ class ConfettiService {
2441
+ constructor() {
2442
+ this.lightModeColors = [
2443
+ '#3b82f6',
2444
+ '#06b6d4',
2445
+ '#a855f7',
2446
+ '#60a5fa',
2447
+ '#22d3ee'
2448
+ ];
2449
+ this.darkModeColors = [
2450
+ '#60a5fa',
2451
+ '#22d3ee',
2452
+ '#c084fc',
2453
+ '#93c5fd',
2454
+ '#67e8f9'
2455
+ ];
2456
+ }
2457
+ getColors(customColors) {
2458
+ if (customColors && customColors.length > 0) {
2459
+ return customColors;
2460
+ }
2461
+ const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
2462
+ return isDarkMode ? this.darkModeColors : this.lightModeColors;
2463
+ }
2464
+ getIntensityConfig(intensity) {
2465
+ switch (intensity) {
2466
+ case 'subtle':
2467
+ return {
2468
+ bursts: 2,
2469
+ particleCount: 30,
2470
+ spread: 45,
2471
+ startVelocity: 20,
2472
+ scalar: 0.7
2473
+ };
2474
+ case 'celebration':
2475
+ return {
2476
+ bursts: 4,
2477
+ particleCount: 100,
2478
+ spread: 80,
2479
+ startVelocity: 35,
2480
+ scalar: 1.2
2481
+ };
2482
+ case 'normal':
2483
+ default:
2484
+ return {
2485
+ bursts: 3,
2486
+ particleCount: 60,
2487
+ spread: 60,
2488
+ startVelocity: 25,
2489
+ scalar: 1.0
2490
+ };
2491
+ }
2492
+ }
2493
+ trigger(config = {}) {
2494
+ const { intensity = 'normal', colors: customColors, delay = 200 } = config;
2495
+ const intensityConfig = this.getIntensityConfig(intensity);
2496
+ const colors = this.getColors(customColors);
2497
+ setTimeout(() => {
2498
+ this.fireConfetti(intensityConfig, colors);
2499
+ }, delay);
2500
+ }
2501
+ fireConfetti(config, colors) {
2502
+ const { bursts, particleCount, spread, startVelocity, scalar } = config;
2503
+ let burstCount = 0;
2504
+ const burstInterval = setInterval(() => {
2505
+ if (burstCount >= bursts) {
2506
+ clearInterval(burstInterval);
2507
+ return;
2508
+ }
2509
+ const x = 0.5;
2510
+ const y = 0.5;
2511
+ confetti({
2512
+ particleCount,
2513
+ spread,
2514
+ startVelocity,
2515
+ origin: { x, y },
2516
+ colors,
2517
+ scalar,
2518
+ gravity: 1.2,
2519
+ decay: 0.94,
2520
+ ticks: 200,
2521
+ shapes: ['circle', 'square'],
2522
+ zIndex: 100
2523
+ });
2524
+ burstCount++;
2525
+ }, 150);
2526
+ }
2527
+ static { this.ɵfac = function ConfettiService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConfettiService)(); }; }
2528
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ConfettiService, factory: ConfettiService.ɵfac, providedIn: 'root' }); }
2529
+ }
2530
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfettiService, [{
2531
+ type: Injectable,
2532
+ args: [{
2533
+ providedIn: 'root'
2534
+ }]
2535
+ }], null, null); })();
2536
+
2439
2537
  const _c0$13 = a0 => ["skeleton-loader", "rounded-lg", "relative", "overflow-hidden", a0];
2440
2538
  const _c1$C = a0 => ["skeleton-shimmer-overlay", "absolute", "inset-0", "bg-gradient-to-r", a0];
2441
2539
  class SkeletonLoaderComponent {
@@ -57835,8 +57933,30 @@ class CollapsibleSectionGroupComponent {
57835
57933
  }], null, { sections: [{ type: i0.Input, args: [{ isSignal: true, alias: "sections", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }] }); })();
57836
57934
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollapsibleSectionGroupComponent, { className: "CollapsibleSectionGroupComponent", filePath: "lib/components/business-analysis-dashboard/collapsible-section-group.component.ts", lineNumber: 100 }); })();
57837
57935
 
57838
- function ContentGenerationProgressComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
57839
- i0.ɵɵelement(0, "div", 26);
57936
+ function ContentGenerationProgressComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
57937
+ i0.ɵɵelementStart(0, "div", 17);
57938
+ i0.ɵɵelement(1, "div", 20)(2, "div", 21)(3, "div", 22)(4, "div", 23)(5, "div", 24);
57939
+ i0.ɵɵelementEnd();
57940
+ } if (rf & 2) {
57941
+ const ctx_r0 = i0.ɵɵnextContext();
57942
+ i0.ɵɵadvance();
57943
+ i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
57944
+ i0.ɵɵproperty("ngClass", ctx_r0.dotClasses());
57945
+ i0.ɵɵadvance();
57946
+ i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
57947
+ i0.ɵɵproperty("ngClass", ctx_r0.dotClasses());
57948
+ i0.ɵɵadvance();
57949
+ i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
57950
+ i0.ɵɵproperty("ngClass", ctx_r0.dotClasses());
57951
+ i0.ɵɵadvance();
57952
+ i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
57953
+ i0.ɵɵproperty("ngClass", ctx_r0.dotClasses());
57954
+ i0.ɵɵadvance();
57955
+ i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
57956
+ i0.ɵɵproperty("ngClass", ctx_r0.dotClasses());
57957
+ } }
57958
+ function ContentGenerationProgressComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
57959
+ i0.ɵɵelement(0, "div", 25);
57840
57960
  } if (rf & 2) {
57841
57961
  const ctx_r0 = i0.ɵɵnextContext();
57842
57962
  i0.ɵɵstyleProp("left", ctx_r0.progressPercentage(), "%");
@@ -57853,7 +57973,7 @@ class ContentGenerationProgressComponent {
57853
57973
  const status = this.itemStatus();
57854
57974
  if (!status?.percentageComplete)
57855
57975
  return 0;
57856
- return Math.min(100, Math.max(0, status.percentageComplete));
57976
+ return Math.round(Math.min(100, Math.max(0, status.percentageComplete)));
57857
57977
  }, ...(ngDevMode ? [{ debugName: "progressPercentage" }] : []));
57858
57978
  this.progressMessage = computed(() => {
57859
57979
  const status = this.itemStatus();
@@ -57918,7 +58038,7 @@ class ContentGenerationProgressComponent {
57918
58038
  }, ...(ngDevMode ? [{ debugName: "percentageClasses" }] : []));
57919
58039
  }
57920
58040
  static { this.ɵfac = function ContentGenerationProgressComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ContentGenerationProgressComponent)(); }; }
57921
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ContentGenerationProgressComponent, selectors: [["symphiq-content-generation-progress"]], inputs: { itemStatus: [1, "itemStatus"], title: [1, "title"], subtitle: [1, "subtitle"], viewMode: [1, "viewMode"], showIcon: [1, "showIcon"] }, decls: 31, vars: 21, consts: [[1, "min-h-[60vh]", "flex", "items-center", "justify-center", "px-4", "py-12", 3, "ngClass"], [1, "max-w-3xl", "w-full", "space-y-8"], [1, "text-center", "space-y-3"], [1, "flex", "items-center", "justify-center", "mb-4"], [1, "relative", "w-20", "h-20", "rounded-2xl", "flex", "items-center", "justify-center", "icon-pulse", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-10", "h-10"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "absolute", "inset-0", "rounded-2xl", "icon-glow"], [1, "text-3xl", "sm:text-4xl", "font-bold", 3, "ngClass"], [1, "text-base", "sm:text-lg", "max-w-2xl", "mx-auto", 3, "ngClass"], [1, "space-y-4"], [1, "text-center"], [1, "text-lg", "sm:text-xl", "font-medium", "message-fade", 3, "ngClass"], [1, "relative", "h-3", "rounded-full", "overflow-visible", 3, "ngClass"], [1, "absolute", "inset-0", "rounded-full", 3, "ngClass"], [1, "absolute", "inset-y-0", "left-0", "rounded-full", "transition-all", "duration-700", "ease-out", "overflow-hidden", 3, "ngClass"], [1, "absolute", "inset-0", "shimmer-effect"], [1, "absolute", "inset-0", "overflow-hidden", "rounded-full"], [1, "dots-container", "h-full"], [1, "dot", "dot-1", 3, "ngClass"], [1, "dot", "dot-2", 3, "ngClass"], [1, "dot", "dot-3", 3, "ngClass"], [1, "dot", "dot-4", 3, "ngClass"], [1, "dot", "dot-5", 3, "ngClass"], [1, "absolute", "top-1/2", "-translate-y-1/2", "w-4", "h-4", "rounded-full", "blur-md", "transition-all", "duration-700", "ease-out", 2, "margin-left", "-8px", 3, "ngClass", "left"], [1, "text-sm", "font-medium", "tabular-nums", 3, "ngClass"], [1, "absolute", "top-1/2", "-translate-y-1/2", "w-4", "h-4", "rounded-full", "blur-md", "transition-all", "duration-700", "ease-out", 2, "margin-left", "-8px", 3, "ngClass"]], template: function ContentGenerationProgressComponent_Template(rf, ctx) { if (rf & 1) {
58041
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ContentGenerationProgressComponent, selectors: [["symphiq-content-generation-progress"]], inputs: { itemStatus: [1, "itemStatus"], title: [1, "title"], subtitle: [1, "subtitle"], viewMode: [1, "viewMode"], showIcon: [1, "showIcon"] }, decls: 25, vars: 17, consts: [[1, "min-h-[60vh]", "flex", "items-center", "justify-center", "px-4", "py-12", 3, "ngClass"], [1, "max-w-3xl", "w-full", "space-y-8"], [1, "text-center", "space-y-3"], [1, "flex", "items-center", "justify-center", "mb-4"], [1, "relative", "w-20", "h-20", "rounded-2xl", "flex", "items-center", "justify-center", "icon-pulse", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-10", "h-10"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "absolute", "inset-0", "rounded-2xl", "icon-glow"], [1, "text-3xl", "sm:text-4xl", "font-bold", 3, "ngClass"], [1, "text-base", "sm:text-lg", "max-w-2xl", "mx-auto", 3, "ngClass"], [1, "space-y-4"], [1, "text-center"], [1, "text-lg", "sm:text-xl", "font-medium", "message-fade", 3, "ngClass"], [1, "relative", "h-3", "rounded-full", "overflow-visible", 3, "ngClass"], [1, "absolute", "inset-0", "rounded-full", 3, "ngClass"], [1, "absolute", "inset-y-0", "left-0", "rounded-full", "transition-all", "duration-700", "ease-out", "overflow-hidden", 3, "ngClass"], [1, "absolute", "inset-0", "shimmer-effect"], [1, "absolute", "inset-0", "overflow-visible", "pointer-events-none"], [1, "absolute", "top-1/2", "-translate-y-1/2", "w-4", "h-4", "rounded-full", "blur-md", "transition-all", "duration-700", "ease-out", 2, "margin-left", "-8px", 3, "ngClass", "left"], [1, "text-sm", "font-medium", "tabular-nums", 3, "ngClass"], [1, "dot", "dot-1", 3, "ngClass"], [1, "dot", "dot-2", 3, "ngClass"], [1, "dot", "dot-3", 3, "ngClass"], [1, "dot", "dot-4", 3, "ngClass"], [1, "dot", "dot-5", 3, "ngClass"], [1, "absolute", "top-1/2", "-translate-y-1/2", "w-4", "h-4", "rounded-full", "blur-md", "transition-all", "duration-700", "ease-out", 2, "margin-left", "-8px", 3, "ngClass"]], template: function ContentGenerationProgressComponent_Template(rf, ctx) { if (rf & 1) {
57922
58042
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "div", 4);
57923
58043
  i0.ɵɵnamespaceSVG();
57924
58044
  i0.ɵɵelementStart(5, "svg", 5);
@@ -57941,13 +58061,11 @@ class ContentGenerationProgressComponent {
57941
58061
  i0.ɵɵelementStart(18, "div", 15);
57942
58062
  i0.ɵɵelement(19, "div", 16);
57943
58063
  i0.ɵɵelementEnd();
57944
- i0.ɵɵelementStart(20, "div", 17)(21, "div", 18);
57945
- i0.ɵɵelement(22, "div", 19)(23, "div", 20)(24, "div", 21)(25, "div", 22)(26, "div", 23);
57946
- i0.ɵɵelementEnd()();
57947
- i0.ɵɵconditionalCreate(27, ContentGenerationProgressComponent_Conditional_27_Template, 1, 3, "div", 24);
58064
+ i0.ɵɵconditionalCreate(20, ContentGenerationProgressComponent_Conditional_20_Template, 6, 15, "div", 17);
58065
+ i0.ɵɵconditionalCreate(21, ContentGenerationProgressComponent_Conditional_21_Template, 1, 3, "div", 18);
57948
58066
  i0.ɵɵelementEnd();
57949
- i0.ɵɵelementStart(28, "div", 11)(29, "span", 25);
57950
- i0.ɵɵtext(30);
58067
+ i0.ɵɵelementStart(22, "div", 11)(23, "span", 19);
58068
+ i0.ɵɵtext(24);
57951
58069
  i0.ɵɵelementEnd()()()()();
57952
58070
  } if (rf & 2) {
57953
58071
  i0.ɵɵproperty("ngClass", ctx.containerClasses());
@@ -57972,23 +58090,15 @@ class ContentGenerationProgressComponent {
57972
58090
  i0.ɵɵadvance();
57973
58091
  i0.ɵɵstyleProp("width", ctx.progressPercentage(), "%");
57974
58092
  i0.ɵɵproperty("ngClass", ctx.progressBarFillClasses());
57975
- i0.ɵɵadvance(4);
57976
- i0.ɵɵproperty("ngClass", ctx.dotClasses());
57977
- i0.ɵɵadvance();
57978
- i0.ɵɵproperty("ngClass", ctx.dotClasses());
57979
- i0.ɵɵadvance();
57980
- i0.ɵɵproperty("ngClass", ctx.dotClasses());
57981
- i0.ɵɵadvance();
57982
- i0.ɵɵproperty("ngClass", ctx.dotClasses());
57983
- i0.ɵɵadvance();
57984
- i0.ɵɵproperty("ngClass", ctx.dotClasses());
58093
+ i0.ɵɵadvance(2);
58094
+ i0.ɵɵconditional(ctx.progressPercentage() > 0 && ctx.progressPercentage() < 100 ? 20 : -1);
57985
58095
  i0.ɵɵadvance();
57986
- i0.ɵɵconditional(ctx.progressPercentage() > 0 && ctx.progressPercentage() < 100 ? 27 : -1);
58096
+ i0.ɵɵconditional(ctx.progressPercentage() > 0 && ctx.progressPercentage() < 100 ? 21 : -1);
57987
58097
  i0.ɵɵadvance(2);
57988
58098
  i0.ɵɵproperty("ngClass", ctx.percentageClasses());
57989
58099
  i0.ɵɵadvance();
57990
58100
  i0.ɵɵtextInterpolate1(" ", ctx.progressPercentage(), "% complete ");
57991
- } }, dependencies: [CommonModule, i1$1.NgClass], styles: ["@keyframes _ngcontent-%COMP%_icon-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.9}}@keyframes _ngcontent-%COMP%_icon-glow-pulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.2)}}@keyframes _ngcontent-%COMP%_shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes _ngcontent-%COMP%_dots-move{0%{transform:translate(-20px);opacity:0}20%{opacity:1}80%{opacity:1}to{transform:translate(calc(100vw + 20px));opacity:0}}@keyframes _ngcontent-%COMP%_message-fade{0%,to{opacity:1}50%{opacity:.7}}.icon-pulse[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_icon-pulse 2s ease-in-out infinite}.icon-glow[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_icon-glow-pulse 2s ease-in-out infinite}.shimmer-effect[_ngcontent-%COMP%]{background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.3) 50%,transparent 100%);animation:_ngcontent-%COMP%_shimmer 2s ease-in-out infinite}.message-fade[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_message-fade 3s ease-in-out infinite}.dots-container[_ngcontent-%COMP%]{position:relative;width:100%}.dot[_ngcontent-%COMP%]{position:absolute;top:50%;width:8px;height:8px;border-radius:50%;transform:translateY(-50%);animation:_ngcontent-%COMP%_dots-move 3s linear infinite}.dot-1[_ngcontent-%COMP%]{animation-delay:0s}.dot-2[_ngcontent-%COMP%]{animation-delay:.6s}.dot-3[_ngcontent-%COMP%]{animation-delay:1.2s}.dot-4[_ngcontent-%COMP%]{animation-delay:1.8s}.dot-5[_ngcontent-%COMP%]{animation-delay:2.4s}@media (prefers-reduced-motion: reduce){.icon-pulse[_ngcontent-%COMP%], .icon-glow[_ngcontent-%COMP%], .shimmer-effect[_ngcontent-%COMP%], .message-fade[_ngcontent-%COMP%], .dot[_ngcontent-%COMP%]{animation:none}}"], changeDetection: 0 }); }
58101
+ } }, dependencies: [CommonModule, i1$1.NgClass], styles: ["@keyframes _ngcontent-%COMP%_icon-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.9}}@keyframes _ngcontent-%COMP%_icon-glow-pulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.2)}}@keyframes _ngcontent-%COMP%_shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes _ngcontent-%COMP%_dots-move{0%{transform:translate(0) scale(.8);opacity:0}10%{opacity:1;transform:translate(10px) scale(1)}25%{transform:translate(30px) scale(1.2)}40%{transform:translate(50px) scale(1)}55%{transform:translate(70px) scale(1.2)}70%{transform:translate(90px) scale(1)}85%{transform:translate(110px) scale(1.2);opacity:1}to{transform:translate(130px) scale(.8);opacity:0}}@keyframes _ngcontent-%COMP%_message-fade{0%,to{opacity:1}50%{opacity:.7}}.icon-pulse[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_icon-pulse 2s ease-in-out infinite}.icon-glow[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_icon-glow-pulse 2s ease-in-out infinite}.shimmer-effect[_ngcontent-%COMP%]{background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.3) 50%,transparent 100%);animation:_ngcontent-%COMP%_shimmer 2s ease-in-out infinite}.message-fade[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_message-fade 3s ease-in-out infinite}.dot[_ngcontent-%COMP%]{position:absolute;top:50%;width:6px;height:6px;border-radius:50%;margin-top:-3px;margin-left:-3px;animation:_ngcontent-%COMP%_dots-move 3s ease-in-out infinite}.dot-1[_ngcontent-%COMP%]{animation-delay:0s}.dot-2[_ngcontent-%COMP%]{animation-delay:.5s}.dot-3[_ngcontent-%COMP%]{animation-delay:1s}.dot-4[_ngcontent-%COMP%]{animation-delay:1.5s}.dot-5[_ngcontent-%COMP%]{animation-delay:2s}@media (prefers-reduced-motion: reduce){.icon-pulse[_ngcontent-%COMP%], .icon-glow[_ngcontent-%COMP%], .shimmer-effect[_ngcontent-%COMP%], .message-fade[_ngcontent-%COMP%], .dot[_ngcontent-%COMP%]{animation:none}}"], changeDetection: 0 }); }
57992
58102
  }
57993
58103
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContentGenerationProgressComponent, [{
57994
58104
  type: Component,
@@ -58038,16 +58148,16 @@ class ContentGenerationProgressComponent {
58038
58148
  <div class="absolute inset-0 shimmer-effect"></div>
58039
58149
  </div>
58040
58150
 
58041
- <!-- Animated Dots Overlay (shows beyond the solid bar) -->
58042
- <div class="absolute inset-0 overflow-hidden rounded-full">
58043
- <div class="dots-container h-full">
58044
- <div [ngClass]="dotClasses()" class="dot dot-1"></div>
58045
- <div [ngClass]="dotClasses()" class="dot dot-2"></div>
58046
- <div [ngClass]="dotClasses()" class="dot dot-3"></div>
58047
- <div [ngClass]="dotClasses()" class="dot dot-4"></div>
58048
- <div [ngClass]="dotClasses()" class="dot dot-5"></div>
58151
+ <!-- Animated Dots Overlay (emerges from the solid bar edge) -->
58152
+ @if (progressPercentage() > 0 && progressPercentage() < 100) {
58153
+ <div class="absolute inset-0 overflow-visible pointer-events-none">
58154
+ <div [ngClass]="dotClasses()" [style.left.%]="progressPercentage()" class="dot dot-1"></div>
58155
+ <div [ngClass]="dotClasses()" [style.left.%]="progressPercentage()" class="dot dot-2"></div>
58156
+ <div [ngClass]="dotClasses()" [style.left.%]="progressPercentage()" class="dot dot-3"></div>
58157
+ <div [ngClass]="dotClasses()" [style.left.%]="progressPercentage()" class="dot dot-4"></div>
58158
+ <div [ngClass]="dotClasses()" [style.left.%]="progressPercentage()" class="dot dot-5"></div>
58049
58159
  </div>
58050
- </div>
58160
+ }
58051
58161
 
58052
58162
  <!-- Glow effect at the progress edge -->
58053
58163
  @if (progressPercentage() > 0 && progressPercentage() < 100) {
@@ -58069,9 +58179,72 @@ class ContentGenerationProgressComponent {
58069
58179
  </div>
58070
58180
  </div>
58071
58181
  </div>
58072
- `, styles: ["@keyframes icon-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.9}}@keyframes icon-glow-pulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.2)}}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes dots-move{0%{transform:translate(-20px);opacity:0}20%{opacity:1}80%{opacity:1}to{transform:translate(calc(100vw + 20px));opacity:0}}@keyframes message-fade{0%,to{opacity:1}50%{opacity:.7}}.icon-pulse{animation:icon-pulse 2s ease-in-out infinite}.icon-glow{animation:icon-glow-pulse 2s ease-in-out infinite}.shimmer-effect{background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.3) 50%,transparent 100%);animation:shimmer 2s ease-in-out infinite}.message-fade{animation:message-fade 3s ease-in-out infinite}.dots-container{position:relative;width:100%}.dot{position:absolute;top:50%;width:8px;height:8px;border-radius:50%;transform:translateY(-50%);animation:dots-move 3s linear infinite}.dot-1{animation-delay:0s}.dot-2{animation-delay:.6s}.dot-3{animation-delay:1.2s}.dot-4{animation-delay:1.8s}.dot-5{animation-delay:2.4s}@media (prefers-reduced-motion: reduce){.icon-pulse,.icon-glow,.shimmer-effect,.message-fade,.dot{animation:none}}\n"] }]
58182
+ `, styles: ["@keyframes icon-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.9}}@keyframes icon-glow-pulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.2)}}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes dots-move{0%{transform:translate(0) scale(.8);opacity:0}10%{opacity:1;transform:translate(10px) scale(1)}25%{transform:translate(30px) scale(1.2)}40%{transform:translate(50px) scale(1)}55%{transform:translate(70px) scale(1.2)}70%{transform:translate(90px) scale(1)}85%{transform:translate(110px) scale(1.2);opacity:1}to{transform:translate(130px) scale(.8);opacity:0}}@keyframes message-fade{0%,to{opacity:1}50%{opacity:.7}}.icon-pulse{animation:icon-pulse 2s ease-in-out infinite}.icon-glow{animation:icon-glow-pulse 2s ease-in-out infinite}.shimmer-effect{background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.3) 50%,transparent 100%);animation:shimmer 2s ease-in-out infinite}.message-fade{animation:message-fade 3s ease-in-out infinite}.dot{position:absolute;top:50%;width:6px;height:6px;border-radius:50%;margin-top:-3px;margin-left:-3px;animation:dots-move 3s ease-in-out infinite}.dot-1{animation-delay:0s}.dot-2{animation-delay:.5s}.dot-3{animation-delay:1s}.dot-4{animation-delay:1.5s}.dot-5{animation-delay:2s}@media (prefers-reduced-motion: reduce){.icon-pulse,.icon-glow,.shimmer-effect,.message-fade,.dot{animation:none}}\n"] }]
58073
58183
  }], null, { itemStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemStatus", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }] }); })();
58074
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ContentGenerationProgressComponent, { className: "ContentGenerationProgressComponent", filePath: "lib/components/shared/content-generation-progress.component.ts", lineNumber: 214 }); })();
58184
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ContentGenerationProgressComponent, { className: "ContentGenerationProgressComponent", filePath: "lib/components/shared/content-generation-progress.component.ts", lineNumber: 224 }); })();
58185
+
58186
+ class ContentGenerationProgressWithConfettiComponent {
58187
+ constructor() {
58188
+ this.itemStatus = input(...(ngDevMode ? [undefined, { debugName: "itemStatus" }] : []));
58189
+ this.title = input('Generating Your Analysis', ...(ngDevMode ? [{ debugName: "title" }] : []));
58190
+ this.subtitle = input('This will appear when ready. You can check back later as this will take a few minutes to complete.', ...(ngDevMode ? [{ debugName: "subtitle" }] : []));
58191
+ this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
58192
+ this.showIcon = input(true, ...(ngDevMode ? [{ debugName: "showIcon" }] : []));
58193
+ this.profile = input(...(ngDevMode ? [undefined, { debugName: "profile" }] : []));
58194
+ this.confettiIntensity = input('normal', ...(ngDevMode ? [{ debugName: "confettiIntensity" }] : []));
58195
+ this.enableConfetti = input(true, ...(ngDevMode ? [{ debugName: "enableConfetti" }] : []));
58196
+ this.confettiDelay = input(200, ...(ngDevMode ? [{ debugName: "confettiDelay" }] : []));
58197
+ this.confettiService = inject(ConfettiService);
58198
+ this.hasCelebrated = signal(false, ...(ngDevMode ? [{ debugName: "hasCelebrated" }] : []));
58199
+ effect(() => {
58200
+ const currentProfile = this.profile();
58201
+ const currentStatus = currentProfile?.selfContentStatus;
58202
+ if (!this.enableConfetti()) {
58203
+ return;
58204
+ }
58205
+ if (currentStatus === AiDynamicContentStatusEnum.GENERATED && !this.hasCelebrated()) {
58206
+ untracked(() => {
58207
+ this.confettiService.trigger({
58208
+ intensity: this.confettiIntensity(),
58209
+ delay: this.confettiDelay()
58210
+ });
58211
+ this.hasCelebrated.set(true);
58212
+ });
58213
+ }
58214
+ if (currentStatus === AiDynamicContentStatusEnum.REQUESTED ||
58215
+ currentStatus === AiDynamicContentStatusEnum.GENERATING) {
58216
+ untracked(() => {
58217
+ this.hasCelebrated.set(false);
58218
+ });
58219
+ }
58220
+ });
58221
+ }
58222
+ static { this.ɵfac = function ContentGenerationProgressWithConfettiComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ContentGenerationProgressWithConfettiComponent)(); }; }
58223
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ContentGenerationProgressWithConfettiComponent, selectors: [["symphiq-content-generation-progress-with-confetti"]], inputs: { itemStatus: [1, "itemStatus"], title: [1, "title"], subtitle: [1, "subtitle"], viewMode: [1, "viewMode"], showIcon: [1, "showIcon"], profile: [1, "profile"], confettiIntensity: [1, "confettiIntensity"], enableConfetti: [1, "enableConfetti"], confettiDelay: [1, "confettiDelay"] }, decls: 1, vars: 5, consts: [[3, "itemStatus", "title", "subtitle", "viewMode", "showIcon"]], template: function ContentGenerationProgressWithConfettiComponent_Template(rf, ctx) { if (rf & 1) {
58224
+ i0.ɵɵelement(0, "symphiq-content-generation-progress", 0);
58225
+ } if (rf & 2) {
58226
+ i0.ɵɵproperty("itemStatus", ctx.itemStatus())("title", ctx.title())("subtitle", ctx.subtitle())("viewMode", ctx.viewMode())("showIcon", ctx.showIcon());
58227
+ } }, dependencies: [ContentGenerationProgressComponent], encapsulation: 2, changeDetection: 0 }); }
58228
+ }
58229
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContentGenerationProgressWithConfettiComponent, [{
58230
+ type: Component,
58231
+ args: [{
58232
+ selector: 'symphiq-content-generation-progress-with-confetti',
58233
+ standalone: true,
58234
+ imports: [ContentGenerationProgressComponent],
58235
+ changeDetection: ChangeDetectionStrategy.OnPush,
58236
+ template: `
58237
+ <symphiq-content-generation-progress
58238
+ [itemStatus]="itemStatus()"
58239
+ [title]="title()"
58240
+ [subtitle]="subtitle()"
58241
+ [viewMode]="viewMode()"
58242
+ [showIcon]="showIcon()"
58243
+ />
58244
+ `
58245
+ }]
58246
+ }], () => [], { itemStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemStatus", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], profile: [{ type: i0.Input, args: [{ isSignal: true, alias: "profile", required: false }] }], confettiIntensity: [{ type: i0.Input, args: [{ isSignal: true, alias: "confettiIntensity", required: false }] }], enableConfetti: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableConfetti", required: false }] }], confettiDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "confettiDelay", required: false }] }] }); })();
58247
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ContentGenerationProgressWithConfettiComponent, { className: "ContentGenerationProgressWithConfettiComponent", filePath: "lib/components/shared/content-generation-progress-with-confetti.component.ts", lineNumber: 29 }); })();
58075
58248
 
58076
58249
  const _c0$n = () => [];
58077
58250
  function SymphiqBusinessAnalysisDashboardComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
@@ -58159,13 +58332,13 @@ function SymphiqBusinessAnalysisDashboardComponent_Conditional_25_Conditional_0_
58159
58332
  } }
58160
58333
  function SymphiqBusinessAnalysisDashboardComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
58161
58334
  i0.ɵɵconditionalCreate(0, SymphiqBusinessAnalysisDashboardComponent_Conditional_25_Conditional_0_Template, 1, 5, "symphiq-journey-progress-indicator", 27);
58162
- i0.ɵɵelement(1, "symphiq-content-generation-progress", 28);
58335
+ i0.ɵɵelement(1, "symphiq-content-generation-progress-with-confetti", 28);
58163
58336
  } if (rf & 2) {
58164
- let tmp_4_0;
58337
+ let tmp_6_0;
58165
58338
  const ctx_r1 = i0.ɵɵnextContext();
58166
58339
  i0.ɵɵconditional(!ctx_r1.isOnboarded() ? 0 : -1);
58167
58340
  i0.ɵɵadvance();
58168
- i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("itemStatus", ctx_r1.itemStatus())("title", "We are generating a new Business Analysis for " + (((tmp_4_0 = ctx_r1.currentProfile()) == null ? null : tmp_4_0.profileStructured == null ? null : tmp_4_0.profileStructured.businessName) || "your business") + ".")("subtitle", "It will appear here when ready. You can check back later as this will take a few minutes to complete.");
58341
+ i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("itemStatus", ctx_r1.itemStatus())("profile", ctx_r1.profile())("confettiIntensity", "celebration")("title", "We are generating a new Business Analysis for " + (((tmp_6_0 = ctx_r1.currentProfile()) == null ? null : tmp_6_0.profileStructured == null ? null : tmp_6_0.profileStructured.businessName) || "your business") + ".")("subtitle", "It will appear here when ready. You can check back later as this will take a few minutes to complete.");
58169
58342
  } }
58170
58343
  function SymphiqBusinessAnalysisDashboardComponent_Conditional_26_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
58171
58344
  const _r6 = i0.ɵɵgetCurrentView();
@@ -58745,7 +58918,7 @@ class SymphiqBusinessAnalysisDashboardComponent {
58745
58918
  static { this.ɵfac = function SymphiqBusinessAnalysisDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SymphiqBusinessAnalysisDashboardComponent)(); }; }
58746
58919
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SymphiqBusinessAnalysisDashboardComponent, selectors: [["symphiq-business-analysis-dashboard"]], hostBindings: function SymphiqBusinessAnalysisDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
58747
58920
  i0.ɵɵlistener("scroll", function SymphiqBusinessAnalysisDashboardComponent_scroll_HostBindingHandler($event) { return ctx.onScroll($event); }, i0.ɵɵresolveWindow)("keydown", function SymphiqBusinessAnalysisDashboardComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyDown($event); }, i0.ɵɵresolveDocument);
58748
- } }, inputs: { embedded: [1, "embedded"], profile: [1, "profile"], parentHeaderOffset: [1, "parentHeaderOffset"], requestedByUser: [1, "requestedByUser"], viewMode: [1, "viewMode"], scrollEvent: [1, "scrollEvent"], scrollElement: [1, "scrollElement"], isLoading: [1, "isLoading"], isOnboarded: [1, "isOnboarded"], forDemo: [1, "forDemo"], maxAccessibleStepId: [1, "maxAccessibleStepId"], itemStatus: [1, "itemStatus"] }, outputs: { stepClick: "stepClick", nextStepClick: "nextStepClick" }, decls: 35, vars: 59, consts: [[3, "ngClass"], [1, "h-full", "transition-all", "duration-200", "ease-out", 3, "ngClass"], [1, "animated-bubbles", 2, "position", "fixed", "top", "0", "left", "0", "right", "0", "bottom", "0", "width", "100vw", "height", "100vh", "z-index", "1", "pointer-events", "none"], [1, "relative", "z-[51]"], [1, "sticky", "top-0", "z-50", 3, "ngClass"], [1, "transition-all", "duration-300", "ease-in-out", "overflow-hidden"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8", "py-8"], [1, "flex", "items-center", "justify-between"], [1, "flex", "items-center", "gap-2"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8", "py-3"], [1, "flex-1", "min-w-0", "mr-4"], [1, "flex", "items-center", "gap-4"], [1, "flex", "items-center", "gap-2", "text-sm", "flex-shrink-0"], [1, "relative"], [3, "sections", "viewMode", "embedded", "scrollElement"], [3, "viewMode", "embedded"], [3, "viewInContextRequested", "isLightMode"], [3, "searchChange", "resultSelected", "close", "isLightMode", "isOpen", "searchQuery", "results", "hasResults", "selectedIndex", "placeholder"], [3, "close", "modeSelected", "isOpen", "currentMode", "viewMode", "isLoading"], [3, "searchClick", "isLightMode"], ["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", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M15 12a3 3 0 11-6 0 3 3 0 016 0z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"], [1, "transition-opacity", "duration-300", 3, "ngClass"], [3, "searchClick", "isLightMode", "minimized"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-2", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", 3, "click", "ngClass"], [3, "viewMode", "currentStepId", "showNextStepAction", "forDemo", "maxAccessibleStepId"], [3, "viewMode", "itemStatus", "title", "subtitle"], [3, "stepClick", "nextStepClick", "viewMode", "currentStepId", "showNextStepAction", "forDemo", "maxAccessibleStepId"], [1, "mb-8"], [3, "viewMode", "businessName", "isOnboarded"], [3, "viewMoreClick", "recommendations", "viewMode"], [3, "sections", "viewMode"], [3, "section", "viewMode", "forceExpanded"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8"], [3, "viewMode", "subsections"]], template: function SymphiqBusinessAnalysisDashboardComponent_Template(rf, ctx) { if (rf & 1) {
58921
+ } }, inputs: { embedded: [1, "embedded"], profile: [1, "profile"], parentHeaderOffset: [1, "parentHeaderOffset"], requestedByUser: [1, "requestedByUser"], viewMode: [1, "viewMode"], scrollEvent: [1, "scrollEvent"], scrollElement: [1, "scrollElement"], isLoading: [1, "isLoading"], isOnboarded: [1, "isOnboarded"], forDemo: [1, "forDemo"], maxAccessibleStepId: [1, "maxAccessibleStepId"], itemStatus: [1, "itemStatus"] }, outputs: { stepClick: "stepClick", nextStepClick: "nextStepClick" }, decls: 35, vars: 59, consts: [[3, "ngClass"], [1, "h-full", "transition-all", "duration-200", "ease-out", 3, "ngClass"], [1, "animated-bubbles", 2, "position", "fixed", "top", "0", "left", "0", "right", "0", "bottom", "0", "width", "100vw", "height", "100vh", "z-index", "1", "pointer-events", "none"], [1, "relative", "z-[51]"], [1, "sticky", "top-0", "z-50", 3, "ngClass"], [1, "transition-all", "duration-300", "ease-in-out", "overflow-hidden"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8", "py-8"], [1, "flex", "items-center", "justify-between"], [1, "flex", "items-center", "gap-2"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8", "py-3"], [1, "flex-1", "min-w-0", "mr-4"], [1, "flex", "items-center", "gap-4"], [1, "flex", "items-center", "gap-2", "text-sm", "flex-shrink-0"], [1, "relative"], [3, "sections", "viewMode", "embedded", "scrollElement"], [3, "viewMode", "embedded"], [3, "viewInContextRequested", "isLightMode"], [3, "searchChange", "resultSelected", "close", "isLightMode", "isOpen", "searchQuery", "results", "hasResults", "selectedIndex", "placeholder"], [3, "close", "modeSelected", "isOpen", "currentMode", "viewMode", "isLoading"], [3, "searchClick", "isLightMode"], ["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", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M15 12a3 3 0 11-6 0 3 3 0 016 0z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"], [1, "transition-opacity", "duration-300", 3, "ngClass"], [3, "searchClick", "isLightMode", "minimized"], ["type", "button", 1, "cursor-pointer", "flex", "items-center", "gap-2", "px-2", "py-1.5", "rounded-lg", "text-xs", "font-medium", "transition-all", "duration-200", "hover:scale-105", 3, "click", "ngClass"], [3, "viewMode", "currentStepId", "showNextStepAction", "forDemo", "maxAccessibleStepId"], [3, "viewMode", "itemStatus", "profile", "confettiIntensity", "title", "subtitle"], [3, "stepClick", "nextStepClick", "viewMode", "currentStepId", "showNextStepAction", "forDemo", "maxAccessibleStepId"], [1, "mb-8"], [3, "viewMode", "businessName", "isOnboarded"], [3, "viewMoreClick", "recommendations", "viewMode"], [3, "sections", "viewMode"], [3, "section", "viewMode", "forceExpanded"], [1, "max-w-7xl", "mx-auto", "px-4", "sm:px-6", "lg:px-8"], [3, "viewMode", "subsections"]], template: function SymphiqBusinessAnalysisDashboardComponent_Template(rf, ctx) { if (rf & 1) {
58749
58922
  i0.ɵɵelementStart(0, "div", 0)(1, "div");
58750
58923
  i0.ɵɵelement(2, "div", 1);
58751
58924
  i0.ɵɵelementEnd();
@@ -58766,7 +58939,7 @@ class SymphiqBusinessAnalysisDashboardComponent {
58766
58939
  i0.ɵɵconditionalCreate(23, SymphiqBusinessAnalysisDashboardComponent_Conditional_23_Template, 5, 3);
58767
58940
  i0.ɵɵelementEnd()()()()();
58768
58941
  i0.ɵɵelementStart(24, "main", 13);
58769
- i0.ɵɵconditionalCreate(25, SymphiqBusinessAnalysisDashboardComponent_Conditional_25_Template, 2, 5)(26, SymphiqBusinessAnalysisDashboardComponent_Conditional_26_Template, 2, 1);
58942
+ i0.ɵɵconditionalCreate(25, SymphiqBusinessAnalysisDashboardComponent_Conditional_25_Template, 2, 7)(26, SymphiqBusinessAnalysisDashboardComponent_Conditional_26_Template, 2, 1);
58770
58943
  i0.ɵɵelementEnd();
58771
58944
  i0.ɵɵconditionalCreate(27, SymphiqBusinessAnalysisDashboardComponent_Conditional_27_Template, 1, 4, "symphiq-section-navigation", 14);
58772
58945
  i0.ɵɵconditionalCreate(28, SymphiqBusinessAnalysisDashboardComponent_Conditional_28_Template, 1, 4, "symphiq-floating-toc", 14);
@@ -58838,259 +59011,261 @@ class SymphiqBusinessAnalysisDashboardComponent {
58838
59011
  i0.ɵɵproperty("isLightMode", ctx.isLightMode())("isOpen", ctx.searchService.isSearchOpen())("searchQuery", ctx.searchService.getSearchQuery())("results", ctx.searchService.searchResults())("hasResults", ctx.searchService.hasResults())("selectedIndex", ctx.selectedSearchIndex())("placeholder", "Search sections, items, and analysis...");
58839
59012
  i0.ɵɵadvance();
58840
59013
  i0.ɵɵproperty("isOpen", ctx.isViewModeSwitcherOpen())("currentMode", ctx.displayMode())("viewMode", ctx.viewMode())("isLoading", ctx.isViewModeSwitching());
58841
- } }, dependencies: [CommonModule, i1$1.NgClass, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent, ContentGenerationProgressComponent], styles: ["[_nghost-%COMP%]{display:block}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}@keyframes _ngcontent-%COMP%_pulse-highlight{0%,to{transform:scale(1);box-shadow:0 0 #3b82f6b3}50%{transform:scale(1.02);box-shadow:0 0 20px 8px #3b82f64d}}[_nghost-%COMP%] .search-highlight-pulse{animation:_ngcontent-%COMP%_pulse-highlight 2s ease-in-out;border-color:#3b82f6!important}"], changeDetection: 0 }); }
59014
+ } }, dependencies: [CommonModule, i1$1.NgClass, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent, ContentGenerationProgressWithConfettiComponent], styles: ["[_nghost-%COMP%]{display:block}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}@keyframes _ngcontent-%COMP%_pulse-highlight{0%,to{transform:scale(1);box-shadow:0 0 #3b82f6b3}50%{transform:scale(1.02);box-shadow:0 0 20px 8px #3b82f64d}}[_nghost-%COMP%] .search-highlight-pulse{animation:_ngcontent-%COMP%_pulse-highlight 2s ease-in-out;border-color:#3b82f6!important}"], changeDetection: 0 }); }
58842
59015
  }
58843
59016
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SymphiqBusinessAnalysisDashboardComponent, [{
58844
59017
  type: Component,
58845
- args: [{ selector: 'symphiq-business-analysis-dashboard', standalone: true, imports: [CommonModule, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent, ContentGenerationProgressComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
58846
- <div [ngClass]="getContainerClasses()">
58847
- <!-- Scroll Progress Bar (fixed at top) -->
58848
- <div [class]="embedded() ? 'sticky top-0 left-0 right-0 h-1 z-[60] bg-slate-200/30' : 'fixed top-0 left-0 right-0 h-1 z-[60] bg-slate-200/30'">
58849
- <div
58850
- [style.width.%]="scrollProgress()"
58851
- [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
58852
- class="h-full transition-all duration-200 ease-out">
58853
- </div>
58854
- </div>
58855
-
58856
- <div class="animated-bubbles" [class.light-mode]="isLightMode()" style="position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh; z-index: 1; pointer-events: none;"></div>
58857
-
58858
- <div class="relative z-[51]">
58859
- <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
58860
- <!-- Expanded Header (default state) -->
58861
- <div
58862
- class="transition-all duration-300 ease-in-out overflow-hidden"
58863
- [class.max-h-0]="headerScrollService.isScrolled()"
58864
- [class.opacity-0]="headerScrollService.isScrolled()"
58865
- [class.max-h-96]="!headerScrollService.isScrolled()"
58866
- [class.opacity-100]="!headerScrollService.isScrolled()">
58867
- <div
58868
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
58869
- [class.pointer-events-none]="headerScrollService.isScrolled()"
58870
- [class.pointer-events-auto]="!headerScrollService.isScrolled()">
58871
- <div class="flex items-center justify-between">
58872
- <div>
58873
- <h1 [ngClass]="getMainTitleClasses()">
58874
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
58875
- </h1>
58876
- <p [ngClass]="getSubtitleClasses()">
58877
- Business Profile & Analysis
58878
- </p>
58879
- </div>
58880
- @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
58881
- <div class="flex items-center gap-2">
58882
- <symphiq-search-button
58883
- [isLightMode]="isLightMode()"
58884
- (searchClick)="openSearch()"
58885
- />
58886
- <button
58887
- type="button"
58888
- (click)="openViewModeSwitcher()"
58889
- [ngClass]="getViewModeButtonClasses()"
58890
- 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">
58891
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58892
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
58893
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
58894
- </svg>
58895
- <span>{{ displayModeLabel() }}</span>
58896
- </button>
58897
- </div>
58898
- }
58899
- </div>
58900
- </div>
58901
- </div>
58902
-
58903
- <!-- Condensed Header (scrolled state) -->
58904
- <div
58905
- class="transition-all duration-300 ease-in-out overflow-hidden"
58906
- [class.max-h-0]="!headerScrollService.isScrolled()"
58907
- [class.opacity-0]="!headerScrollService.isScrolled()"
58908
- [class.max-h-20]="headerScrollService.isScrolled()"
58909
- [class.opacity-100]="headerScrollService.isScrolled()">
58910
- <div
58911
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
58912
- [class.pointer-events-none]="!headerScrollService.isScrolled()"
58913
- [class.pointer-events-auto]="headerScrollService.isScrolled()">
58914
- <div class="flex items-center justify-between">
58915
- <div class="flex-1 min-w-0 mr-4">
58916
- <h1 [ngClass]="isLightMode() ? 'text-xl font-bold bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent truncate' : 'text-xl font-bold bg-gradient-to-r from-blue-400 to-purple-400 bg-clip-text text-transparent truncate'">
58917
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
58918
- </h1>
58919
- </div>
58920
- <div class="flex items-center gap-4">
58921
- @if (!isSimplifiedView()) {
58922
- <div class="flex items-center gap-2 text-sm flex-shrink-0">
58923
- <span [ngClass]="isLightMode() ? 'text-slate-600 font-medium' : 'text-slate-400 font-medium'" class="transition-opacity duration-300" [class.opacity-0]="sectionTitleFading()" [class.opacity-100]="!sectionTitleFading()">
58924
- {{ currentSectionTitle() }}
58925
- </span>
58926
- @if (currentSubsectionTitle()) {
58927
- <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
58928
- <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
58929
- {{ currentSubsectionTitle() }}
58930
- </span>
58931
- }
58932
- </div>
58933
- }
58934
- @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
58935
- <symphiq-search-button
58936
- [isLightMode]="isLightMode()"
58937
- [minimized]="true"
58938
- (searchClick)="openSearch()"
58939
- />
58940
- <button
58941
- type="button"
58942
- (click)="openViewModeSwitcher()"
58943
- [ngClass]="getViewModeButtonClasses()"
58944
- class="cursor-pointer flex items-center gap-2 px-2 py-1.5 rounded-lg text-xs font-medium transition-all duration-200 hover:scale-105">
58945
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
58946
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
58947
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
58948
- </svg>
58949
- </button>
58950
- }
58951
- </div>
58952
- </div>
58953
- </div>
58954
- </div>
58955
- </header>
58956
-
58957
- <main class="relative">
58958
- @if (isContentGenerating()) {
58959
- <!-- Journey Progress Banner (always show when not onboarded) -->
58960
- @if (!isOnboarded()) {
58961
- <symphiq-journey-progress-indicator
58962
- [viewMode]="viewMode()"
58963
- [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
58964
- [showNextStepAction]="false"
58965
- [forDemo]="forDemo()"
58966
- [maxAccessibleStepId]="maxAccessibleStepId()"
58967
- (stepClick)="stepClick.emit($event)"
58968
- (nextStepClick)="nextStepClick.emit()"
58969
- />
58970
- }
58971
-
58972
- <!-- Content Generation Progress Component -->
58973
- <symphiq-content-generation-progress
58974
- [viewMode]="viewMode()"
58975
- [itemStatus]="itemStatus()"
58976
- [title]="'We are generating a new Business Analysis for ' + (currentProfile()?.profileStructured?.businessName || 'your business') + '.'"
58977
- [subtitle]="'It will appear here when ready. You can check back later as this will take a few minutes to complete.'"
58978
- />
58979
- } @else {
58980
- @if (isSimplifiedView()) {
58981
- <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
58982
- @if (!isOnboarded()) {
58983
- <symphiq-journey-progress-indicator
58984
- [viewMode]="viewMode()"
58985
- [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
58986
- [showNextStepAction]="showNextStepAction()"
58987
- [forDemo]="forDemo()"
58988
- [maxAccessibleStepId]="maxAccessibleStepId()"
58989
- (stepClick)="stepClick.emit($event)"
58990
- (nextStepClick)="nextStepClick.emit()"
58991
- />
58992
- }
58993
-
58994
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
58995
- <div class="mb-8">
58996
- <symphiq-welcome-banner
58997
- [viewMode]="viewMode()"
58998
- [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
58999
- [isOnboarded]="isOnboarded()"
59000
- />
59001
- </div>
59002
-
59003
- <div class="mb-8">
59004
- <symphiq-recommendations-tiled-grid
59005
- [recommendations]="recommendationItems()"
59006
- [viewMode]="viewMode()"
59007
- (viewMoreClick)="openRecommendationDetailsModal($event)"
59008
- />
59009
- </div>
59010
-
59011
- <div>
59012
- <symphiq-collapsible-section-group
59013
- [sections]="nonRecommendationSections()"
59014
- [viewMode]="viewMode()"
59015
- />
59016
- </div>
59017
- </div>
59018
- } @else {
59019
- @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
59020
- <symphiq-profile-section
59021
- [section]="section"
59022
- [viewMode]="viewMode()"
59023
- [forceExpanded]="!isCompactView()"
59024
- />
59025
- @if (!last) {
59026
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
59027
- <symphiq-section-divider
59028
- [viewMode]="viewMode()"
59029
- [subsections]="sections()[idx + 1].subsections || []" />
59030
- </div>
59031
- }
59032
- }
59033
- }
59034
- }
59035
- </main>
59036
-
59037
- @if (!isSimplifiedView()) {
59038
- <symphiq-section-navigation
59039
- [sections]="sections()"
59040
- [viewMode]="viewMode()"
59041
- [embedded]="embedded()"
59042
- [scrollElement]="scrollElement() ?? undefined"
59043
- />
59044
- }
59045
-
59046
- @if (!isSimplifiedView()) {
59047
- <symphiq-floating-toc
59048
- [sections]="sections()"
59049
- [viewMode]="viewMode()"
59050
- [embedded]="embedded()"
59051
- [scrollElement]="scrollElement() ?? undefined"
59052
- />
59053
- }
59054
-
59055
- <symphiq-floating-back-button
59056
- [viewMode]="viewMode()"
59057
- [embedded]="embedded()"
59058
- />
59059
- </div>
59060
-
59061
- @if (isLoading()) {
59062
- <div [ngClass]="getLoadingOverlayClasses()">
59063
- <div [ngClass]="getSpinnerClasses()"></div>
59064
- </div>
59065
- }
59066
-
59067
- <symphiq-tooltip-container />
59068
- <symphiq-business-analysis-modal
59069
- [isLightMode]="isLightMode()"
59070
- (viewInContextRequested)="handleViewInContext($event)" />
59071
-
59072
- <symphiq-search-modal
59073
- [isLightMode]="isLightMode()"
59074
- [isOpen]="searchService.isSearchOpen()"
59075
- [searchQuery]="searchService.getSearchQuery()"
59076
- [results]="searchService.searchResults()"
59077
- [hasResults]="searchService.hasResults()"
59078
- [selectedIndex]="selectedSearchIndex()"
59079
- [placeholder]="'Search sections, items, and analysis...'"
59080
- (searchChange)="onSearchChange($event)"
59081
- (resultSelected)="onSearchResultSelected($event)"
59082
- (close)="closeSearch()"
59083
- />
59084
-
59085
- <symphiq-view-mode-switcher-modal
59086
- [isOpen]="isViewModeSwitcherOpen()"
59087
- [currentMode]="displayMode()"
59088
- [viewMode]="viewMode()"
59089
- [isLoading]="isViewModeSwitching()"
59090
- (close)="closeViewModeSwitcher()"
59091
- (modeSelected)="handleDisplayModeChange($event)"
59092
- />
59093
- </div>
59018
+ args: [{ selector: 'symphiq-business-analysis-dashboard', standalone: true, imports: [CommonModule, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent, ContentGenerationProgressWithConfettiComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
59019
+ <div [ngClass]="getContainerClasses()">
59020
+ <!-- Scroll Progress Bar (fixed at top) -->
59021
+ <div [class]="embedded() ? 'sticky top-0 left-0 right-0 h-1 z-[60] bg-slate-200/30' : 'fixed top-0 left-0 right-0 h-1 z-[60] bg-slate-200/30'">
59022
+ <div
59023
+ [style.width.%]="scrollProgress()"
59024
+ [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
59025
+ class="h-full transition-all duration-200 ease-out">
59026
+ </div>
59027
+ </div>
59028
+
59029
+ <div class="animated-bubbles" [class.light-mode]="isLightMode()" style="position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh; z-index: 1; pointer-events: none;"></div>
59030
+
59031
+ <div class="relative z-[51]">
59032
+ <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
59033
+ <!-- Expanded Header (default state) -->
59034
+ <div
59035
+ class="transition-all duration-300 ease-in-out overflow-hidden"
59036
+ [class.max-h-0]="headerScrollService.isScrolled()"
59037
+ [class.opacity-0]="headerScrollService.isScrolled()"
59038
+ [class.max-h-96]="!headerScrollService.isScrolled()"
59039
+ [class.opacity-100]="!headerScrollService.isScrolled()">
59040
+ <div
59041
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
59042
+ [class.pointer-events-none]="headerScrollService.isScrolled()"
59043
+ [class.pointer-events-auto]="!headerScrollService.isScrolled()">
59044
+ <div class="flex items-center justify-between">
59045
+ <div>
59046
+ <h1 [ngClass]="getMainTitleClasses()">
59047
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59048
+ </h1>
59049
+ <p [ngClass]="getSubtitleClasses()">
59050
+ Business Profile & Analysis
59051
+ </p>
59052
+ </div>
59053
+ @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59054
+ <div class="flex items-center gap-2">
59055
+ <symphiq-search-button
59056
+ [isLightMode]="isLightMode()"
59057
+ (searchClick)="openSearch()"
59058
+ />
59059
+ <button
59060
+ type="button"
59061
+ (click)="openViewModeSwitcher()"
59062
+ [ngClass]="getViewModeButtonClasses()"
59063
+ 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">
59064
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59065
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59066
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
59067
+ </svg>
59068
+ <span>{{ displayModeLabel() }}</span>
59069
+ </button>
59070
+ </div>
59071
+ }
59072
+ </div>
59073
+ </div>
59074
+ </div>
59075
+
59076
+ <!-- Condensed Header (scrolled state) -->
59077
+ <div
59078
+ class="transition-all duration-300 ease-in-out overflow-hidden"
59079
+ [class.max-h-0]="!headerScrollService.isScrolled()"
59080
+ [class.opacity-0]="!headerScrollService.isScrolled()"
59081
+ [class.max-h-20]="headerScrollService.isScrolled()"
59082
+ [class.opacity-100]="headerScrollService.isScrolled()">
59083
+ <div
59084
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
59085
+ [class.pointer-events-none]="!headerScrollService.isScrolled()"
59086
+ [class.pointer-events-auto]="headerScrollService.isScrolled()">
59087
+ <div class="flex items-center justify-between">
59088
+ <div class="flex-1 min-w-0 mr-4">
59089
+ <h1 [ngClass]="isLightMode() ? 'text-xl font-bold bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent truncate' : 'text-xl font-bold bg-gradient-to-r from-blue-400 to-purple-400 bg-clip-text text-transparent truncate'">
59090
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59091
+ </h1>
59092
+ </div>
59093
+ <div class="flex items-center gap-4">
59094
+ @if (!isSimplifiedView()) {
59095
+ <div class="flex items-center gap-2 text-sm flex-shrink-0">
59096
+ <span [ngClass]="isLightMode() ? 'text-slate-600 font-medium' : 'text-slate-400 font-medium'" class="transition-opacity duration-300" [class.opacity-0]="sectionTitleFading()" [class.opacity-100]="!sectionTitleFading()">
59097
+ {{ currentSectionTitle() }}
59098
+ </span>
59099
+ @if (currentSubsectionTitle()) {
59100
+ <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
59101
+ <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
59102
+ {{ currentSubsectionTitle() }}
59103
+ </span>
59104
+ }
59105
+ </div>
59106
+ }
59107
+ @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59108
+ <symphiq-search-button
59109
+ [isLightMode]="isLightMode()"
59110
+ [minimized]="true"
59111
+ (searchClick)="openSearch()"
59112
+ />
59113
+ <button
59114
+ type="button"
59115
+ (click)="openViewModeSwitcher()"
59116
+ [ngClass]="getViewModeButtonClasses()"
59117
+ class="cursor-pointer flex items-center gap-2 px-2 py-1.5 rounded-lg text-xs font-medium transition-all duration-200 hover:scale-105">
59118
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59119
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59120
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
59121
+ </svg>
59122
+ </button>
59123
+ }
59124
+ </div>
59125
+ </div>
59126
+ </div>
59127
+ </div>
59128
+ </header>
59129
+
59130
+ <main class="relative">
59131
+ @if (isContentGenerating()) {
59132
+ <!-- Journey Progress Banner (always show when not onboarded) -->
59133
+ @if (!isOnboarded()) {
59134
+ <symphiq-journey-progress-indicator
59135
+ [viewMode]="viewMode()"
59136
+ [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59137
+ [showNextStepAction]="false"
59138
+ [forDemo]="forDemo()"
59139
+ [maxAccessibleStepId]="maxAccessibleStepId()"
59140
+ (stepClick)="stepClick.emit($event)"
59141
+ (nextStepClick)="nextStepClick.emit()"
59142
+ />
59143
+ }
59144
+
59145
+ <!-- Content Generation Progress Component -->
59146
+ <symphiq-content-generation-progress-with-confetti
59147
+ [viewMode]="viewMode()"
59148
+ [itemStatus]="itemStatus()"
59149
+ [profile]="profile()"
59150
+ [confettiIntensity]="'celebration'"
59151
+ [title]="'We are generating a new Business Analysis for ' + (currentProfile()?.profileStructured?.businessName || 'your business') + '.'"
59152
+ [subtitle]="'It will appear here when ready. You can check back later as this will take a few minutes to complete.'"
59153
+ />
59154
+ } @else {
59155
+ @if (isSimplifiedView()) {
59156
+ <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
59157
+ @if (!isOnboarded()) {
59158
+ <symphiq-journey-progress-indicator
59159
+ [viewMode]="viewMode()"
59160
+ [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59161
+ [showNextStepAction]="showNextStepAction()"
59162
+ [forDemo]="forDemo()"
59163
+ [maxAccessibleStepId]="maxAccessibleStepId()"
59164
+ (stepClick)="stepClick.emit($event)"
59165
+ (nextStepClick)="nextStepClick.emit()"
59166
+ />
59167
+ }
59168
+
59169
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
59170
+ <div class="mb-8">
59171
+ <symphiq-welcome-banner
59172
+ [viewMode]="viewMode()"
59173
+ [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
59174
+ [isOnboarded]="isOnboarded()"
59175
+ />
59176
+ </div>
59177
+
59178
+ <div class="mb-8">
59179
+ <symphiq-recommendations-tiled-grid
59180
+ [recommendations]="recommendationItems()"
59181
+ [viewMode]="viewMode()"
59182
+ (viewMoreClick)="openRecommendationDetailsModal($event)"
59183
+ />
59184
+ </div>
59185
+
59186
+ <div>
59187
+ <symphiq-collapsible-section-group
59188
+ [sections]="nonRecommendationSections()"
59189
+ [viewMode]="viewMode()"
59190
+ />
59191
+ </div>
59192
+ </div>
59193
+ } @else {
59194
+ @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
59195
+ <symphiq-profile-section
59196
+ [section]="section"
59197
+ [viewMode]="viewMode()"
59198
+ [forceExpanded]="!isCompactView()"
59199
+ />
59200
+ @if (!last) {
59201
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
59202
+ <symphiq-section-divider
59203
+ [viewMode]="viewMode()"
59204
+ [subsections]="sections()[idx + 1].subsections || []" />
59205
+ </div>
59206
+ }
59207
+ }
59208
+ }
59209
+ }
59210
+ </main>
59211
+
59212
+ @if (!isSimplifiedView()) {
59213
+ <symphiq-section-navigation
59214
+ [sections]="sections()"
59215
+ [viewMode]="viewMode()"
59216
+ [embedded]="embedded()"
59217
+ [scrollElement]="scrollElement() ?? undefined"
59218
+ />
59219
+ }
59220
+
59221
+ @if (!isSimplifiedView()) {
59222
+ <symphiq-floating-toc
59223
+ [sections]="sections()"
59224
+ [viewMode]="viewMode()"
59225
+ [embedded]="embedded()"
59226
+ [scrollElement]="scrollElement() ?? undefined"
59227
+ />
59228
+ }
59229
+
59230
+ <symphiq-floating-back-button
59231
+ [viewMode]="viewMode()"
59232
+ [embedded]="embedded()"
59233
+ />
59234
+ </div>
59235
+
59236
+ @if (isLoading()) {
59237
+ <div [ngClass]="getLoadingOverlayClasses()">
59238
+ <div [ngClass]="getSpinnerClasses()"></div>
59239
+ </div>
59240
+ }
59241
+
59242
+ <symphiq-tooltip-container />
59243
+ <symphiq-business-analysis-modal
59244
+ [isLightMode]="isLightMode()"
59245
+ (viewInContextRequested)="handleViewInContext($event)" />
59246
+
59247
+ <symphiq-search-modal
59248
+ [isLightMode]="isLightMode()"
59249
+ [isOpen]="searchService.isSearchOpen()"
59250
+ [searchQuery]="searchService.getSearchQuery()"
59251
+ [results]="searchService.searchResults()"
59252
+ [hasResults]="searchService.hasResults()"
59253
+ [selectedIndex]="selectedSearchIndex()"
59254
+ [placeholder]="'Search sections, items, and analysis...'"
59255
+ (searchChange)="onSearchChange($event)"
59256
+ (resultSelected)="onSearchResultSelected($event)"
59257
+ (close)="closeSearch()"
59258
+ />
59259
+
59260
+ <symphiq-view-mode-switcher-modal
59261
+ [isOpen]="isViewModeSwitcherOpen()"
59262
+ [currentMode]="displayMode()"
59263
+ [viewMode]="viewMode()"
59264
+ [isLoading]="isViewModeSwitching()"
59265
+ (close)="closeViewModeSwitcher()"
59266
+ (modeSelected)="handleDisplayModeChange($event)"
59267
+ />
59268
+ </div>
59094
59269
  `, styles: [":host{display:block}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse-highlight{0%,to{transform:scale(1);box-shadow:0 0 #3b82f6b3}50%{transform:scale(1.02);box-shadow:0 0 20px 8px #3b82f64d}}:host ::ng-deep .search-highlight-pulse{animation:pulse-highlight 2s ease-in-out;border-color:#3b82f6!important}\n"] }]
59095
59270
  }], () => [], { embedded: [{ type: i0.Input, args: [{ isSignal: true, alias: "embedded", required: false }] }], profile: [{ type: i0.Input, args: [{ isSignal: true, alias: "profile", required: false }] }], parentHeaderOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentHeaderOffset", required: false }] }], requestedByUser: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestedByUser", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], scrollEvent: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollEvent", required: false }] }], scrollElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollElement", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], isOnboarded: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOnboarded", required: false }] }], forDemo: [{ type: i0.Input, args: [{ isSignal: true, alias: "forDemo", required: false }] }], maxAccessibleStepId: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxAccessibleStepId", required: false }] }], itemStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemStatus", required: false }] }], stepClick: [{ type: i0.Output, args: ["stepClick"] }], nextStepClick: [{ type: i0.Output, args: ["nextStepClick"] }], onScroll: [{
59096
59271
  type: HostListener,
@@ -59099,7 +59274,7 @@ class SymphiqBusinessAnalysisDashboardComponent {
59099
59274
  type: HostListener,
59100
59275
  args: ['document:keydown', ['$event']]
59101
59276
  }] }); })();
59102
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqBusinessAnalysisDashboardComponent, { className: "SymphiqBusinessAnalysisDashboardComponent", filePath: "lib/components/business-analysis-dashboard/symphiq-business-analysis-dashboard.component.ts", lineNumber: 333 }); })();
59277
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqBusinessAnalysisDashboardComponent, { className: "SymphiqBusinessAnalysisDashboardComponent", filePath: "lib/components/business-analysis-dashboard/symphiq-business-analysis-dashboard.component.ts", lineNumber: 335 }); })();
59103
59278
 
59104
59279
  function DashboardHeaderComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
59105
59280
  i0.ɵɵelement(0, "div", 6);
@@ -104859,5 +105034,5 @@ const PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS = ({
104859
105034
  * Generated bundle index. Do not edit.
104860
105035
  */
104861
105036
 
104862
- export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, isLightMode };
105037
+ export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfettiService, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, ContentGenerationProgressWithConfettiComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, isLightMode };
104863
105038
  //# sourceMappingURL=symphiq-components.mjs.map