@eric-emg/symphiq-components 1.2.163 → 1.2.164

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.
@@ -58556,6 +58556,18 @@ class SymphiqBusinessAnalysisDashboardComponent {
58556
58556
  this.lastSubsectionTitle = '';
58557
58557
  this.lastScrollY = 0;
58558
58558
  this.scrollDirection = 'down';
58559
+ effect(() => {
58560
+ const profile = this.profile();
58561
+ this.currentProfile.set(profile);
58562
+ this.lookupService.setProfile(profile);
58563
+ if (profile) {
58564
+ this.searchService.setProfile(profile);
58565
+ }
58566
+ if (profile?.profileStructured?.sections) {
58567
+ const recommendations = profile.profileStructured?.recommendations;
58568
+ this.profileContextService.indexProfile(profile.profileStructured.sections, recommendations);
58569
+ }
58570
+ });
58559
58571
  }
58560
58572
  onScroll() {
58561
58573
  this.headerScrollService.handleScroll(this.embedded());
@@ -58716,16 +58728,6 @@ class SymphiqBusinessAnalysisDashboardComponent {
58716
58728
  }, 2000);
58717
58729
  }
58718
58730
  ngOnInit() {
58719
- this.currentProfile.set(this.profile());
58720
- this.lookupService.setProfile(this.profile());
58721
- const profile = this.profile();
58722
- if (profile) {
58723
- this.searchService.setProfile(profile);
58724
- }
58725
- if (profile?.profileStructured?.sections) {
58726
- const recommendations = profile.profileStructured?.recommendations;
58727
- this.profileContextService.indexProfile(profile.profileStructured.sections, recommendations);
58728
- }
58729
58731
  }
58730
58732
  ngAfterViewInit() {
58731
58733
  // Use a single observer for subsections which includes parent section information
@@ -59024,257 +59026,257 @@ class SymphiqBusinessAnalysisDashboardComponent {
59024
59026
  }
59025
59027
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SymphiqBusinessAnalysisDashboardComponent, [{
59026
59028
  type: Component,
59027
- 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: `
59028
- <div [ngClass]="getContainerClasses()">
59029
- <!-- Scroll Progress Bar (fixed at top) -->
59030
- <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'">
59031
- <div
59032
- [style.width.%]="scrollProgress()"
59033
- [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
59034
- class="h-full transition-all duration-200 ease-out">
59035
- </div>
59036
- </div>
59037
-
59038
- <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>
59039
-
59040
- <div class="relative z-[51]">
59041
- <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
59042
- <!-- Expanded Header (default state) -->
59043
- <div
59044
- class="transition-all duration-300 ease-in-out overflow-hidden"
59045
- [class.max-h-0]="headerScrollService.isScrolled()"
59046
- [class.opacity-0]="headerScrollService.isScrolled()"
59047
- [class.max-h-96]="!headerScrollService.isScrolled()"
59048
- [class.opacity-100]="!headerScrollService.isScrolled()">
59049
- <div
59050
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
59051
- [class.pointer-events-none]="headerScrollService.isScrolled()"
59052
- [class.pointer-events-auto]="!headerScrollService.isScrolled()">
59053
- <div class="flex items-center justify-between">
59054
- <div>
59055
- <h1 [ngClass]="getMainTitleClasses()">
59056
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59057
- </h1>
59058
- <p [ngClass]="getSubtitleClasses()">
59059
- Business Profile & Analysis
59060
- </p>
59061
- </div>
59062
- @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59063
- <div class="flex items-center gap-2">
59064
- <symphiq-search-button
59065
- [isLightMode]="isLightMode()"
59066
- (searchClick)="openSearch()"
59067
- />
59068
- <button
59069
- type="button"
59070
- (click)="openViewModeSwitcher()"
59071
- [ngClass]="getViewModeButtonClasses()"
59072
- 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">
59073
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59074
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59075
- <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>
59076
- </svg>
59077
- <span>{{ displayModeLabel() }}</span>
59078
- </button>
59079
- </div>
59080
- }
59081
- </div>
59082
- </div>
59083
- </div>
59084
-
59085
- <!-- Condensed Header (scrolled state) -->
59086
- <div
59087
- class="transition-all duration-300 ease-in-out overflow-hidden"
59088
- [class.max-h-0]="!headerScrollService.isScrolled()"
59089
- [class.opacity-0]="!headerScrollService.isScrolled()"
59090
- [class.max-h-20]="headerScrollService.isScrolled()"
59091
- [class.opacity-100]="headerScrollService.isScrolled()">
59092
- <div
59093
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
59094
- [class.pointer-events-none]="!headerScrollService.isScrolled()"
59095
- [class.pointer-events-auto]="headerScrollService.isScrolled()">
59096
- <div class="flex items-center justify-between">
59097
- <div class="flex-1 min-w-0 mr-4">
59098
- <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'">
59099
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59100
- </h1>
59101
- </div>
59102
- <div class="flex items-center gap-4">
59103
- @if (!isSimplifiedView()) {
59104
- <div class="flex items-center gap-2 text-sm flex-shrink-0">
59105
- <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()">
59106
- {{ currentSectionTitle() }}
59107
- </span>
59108
- @if (currentSubsectionTitle()) {
59109
- <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
59110
- <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
59111
- {{ currentSubsectionTitle() }}
59112
- </span>
59113
- }
59114
- </div>
59115
- }
59116
- @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59117
- <symphiq-search-button
59118
- [isLightMode]="isLightMode()"
59119
- [minimized]="true"
59120
- (searchClick)="openSearch()"
59121
- />
59122
- <button
59123
- type="button"
59124
- (click)="openViewModeSwitcher()"
59125
- [ngClass]="getViewModeButtonClasses()"
59126
- 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">
59127
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59128
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59129
- <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>
59130
- </svg>
59131
- </button>
59132
- }
59133
- </div>
59134
- </div>
59135
- </div>
59136
- </div>
59137
- </header>
59138
-
59139
- <main class="relative">
59140
- @if (isContentGenerating()) {
59141
- <!-- Journey Progress Banner (always show when not onboarded) -->
59142
- @if (!isOnboarded()) {
59143
- <symphiq-journey-progress-indicator
59144
- [viewMode]="viewMode()"
59145
- [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59146
- [showNextStepAction]="false"
59147
- [forDemo]="forDemo()"
59148
- [maxAccessibleStepId]="maxAccessibleStepId()"
59149
- (stepClick)="stepClick.emit($event)"
59150
- (nextStepClick)="nextStepClick.emit()"
59151
- />
59152
- }
59153
-
59154
- <!-- Content Generation Progress Component -->
59155
- <symphiq-content-generation-progress-with-confetti
59156
- [viewMode]="viewMode()"
59157
- [itemStatus]="itemStatus()"
59158
- [profile]="profile()"
59159
- [confettiIntensity]="'celebration'"
59160
- [title]="'We are generating a new Business Analysis for ' + (currentProfile()?.profileStructured?.businessName || 'your business') + '.'"
59161
- [subtitle]="'It will appear here when ready. You can check back later as this will take a few minutes to complete.'"
59162
- />
59163
- } @else {
59164
- @if (isSimplifiedView()) {
59165
- <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
59166
- @if (!isOnboarded()) {
59167
- <symphiq-journey-progress-indicator
59168
- [viewMode]="viewMode()"
59169
- [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59170
- [showNextStepAction]="showNextStepAction()"
59171
- [forDemo]="forDemo()"
59172
- [maxAccessibleStepId]="maxAccessibleStepId()"
59173
- (stepClick)="stepClick.emit($event)"
59174
- (nextStepClick)="nextStepClick.emit()"
59175
- />
59176
- }
59177
-
59178
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
59179
- <div class="mb-8">
59180
- <symphiq-welcome-banner
59181
- [viewMode]="viewMode()"
59182
- [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
59183
- [isOnboarded]="isOnboarded()"
59184
- />
59185
- </div>
59186
-
59187
- <div class="mb-8">
59188
- <symphiq-recommendations-tiled-grid
59189
- [recommendations]="recommendationItems()"
59190
- [viewMode]="viewMode()"
59191
- (viewMoreClick)="openRecommendationDetailsModal($event)"
59192
- />
59193
- </div>
59194
-
59195
- <div>
59196
- <symphiq-collapsible-section-group
59197
- [sections]="nonRecommendationSections()"
59198
- [viewMode]="viewMode()"
59199
- />
59200
- </div>
59201
- </div>
59202
- } @else {
59203
- @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
59204
- <symphiq-profile-section
59205
- [section]="section"
59206
- [viewMode]="viewMode()"
59207
- [forceExpanded]="!isCompactView()"
59208
- />
59209
- @if (!last) {
59210
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
59211
- <symphiq-section-divider
59212
- [viewMode]="viewMode()"
59213
- [subsections]="sections()[idx + 1].subsections || []" />
59214
- </div>
59215
- }
59216
- }
59217
- }
59218
- }
59219
- </main>
59220
-
59221
- @if (!isSimplifiedView()) {
59222
- <symphiq-section-navigation
59223
- [sections]="sections()"
59224
- [viewMode]="viewMode()"
59225
- [embedded]="embedded()"
59226
- [scrollElement]="scrollElement() ?? undefined"
59227
- />
59228
- }
59229
-
59230
- @if (!isSimplifiedView()) {
59231
- <symphiq-floating-toc
59232
- [sections]="sections()"
59233
- [viewMode]="viewMode()"
59234
- [embedded]="embedded()"
59235
- [scrollElement]="scrollElement() ?? undefined"
59236
- />
59237
- }
59238
-
59239
- <symphiq-floating-back-button
59240
- [viewMode]="viewMode()"
59241
- [embedded]="embedded()"
59242
- />
59243
- </div>
59244
-
59245
- @if (isLoading()) {
59246
- <div [ngClass]="getLoadingOverlayClasses()">
59247
- <div [ngClass]="getSpinnerClasses()"></div>
59248
- </div>
59249
- }
59250
-
59251
- <symphiq-tooltip-container />
59252
- <symphiq-business-analysis-modal
59253
- [isLightMode]="isLightMode()"
59254
- (viewInContextRequested)="handleViewInContext($event)" />
59255
-
59256
- <symphiq-search-modal
59257
- [isLightMode]="isLightMode()"
59258
- [isOpen]="searchService.isSearchOpen()"
59259
- [searchQuery]="searchService.getSearchQuery()"
59260
- [results]="searchService.searchResults()"
59261
- [hasResults]="searchService.hasResults()"
59262
- [selectedIndex]="selectedSearchIndex()"
59263
- [placeholder]="'Search sections, items, and analysis...'"
59264
- (searchChange)="onSearchChange($event)"
59265
- (resultSelected)="onSearchResultSelected($event)"
59266
- (close)="closeSearch()"
59267
- />
59268
-
59269
- <symphiq-view-mode-switcher-modal
59270
- [isOpen]="isViewModeSwitcherOpen()"
59271
- [currentMode]="displayMode()"
59272
- [viewMode]="viewMode()"
59273
- [isLoading]="isViewModeSwitching()"
59274
- (close)="closeViewModeSwitcher()"
59275
- (modeSelected)="handleDisplayModeChange($event)"
59276
- />
59277
- </div>
59029
+ 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: `
59030
+ <div [ngClass]="getContainerClasses()">
59031
+ <!-- Scroll Progress Bar (fixed at top) -->
59032
+ <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'">
59033
+ <div
59034
+ [style.width.%]="scrollProgress()"
59035
+ [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
59036
+ class="h-full transition-all duration-200 ease-out">
59037
+ </div>
59038
+ </div>
59039
+
59040
+ <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>
59041
+
59042
+ <div class="relative z-[51]">
59043
+ <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
59044
+ <!-- Expanded Header (default state) -->
59045
+ <div
59046
+ class="transition-all duration-300 ease-in-out overflow-hidden"
59047
+ [class.max-h-0]="headerScrollService.isScrolled()"
59048
+ [class.opacity-0]="headerScrollService.isScrolled()"
59049
+ [class.max-h-96]="!headerScrollService.isScrolled()"
59050
+ [class.opacity-100]="!headerScrollService.isScrolled()">
59051
+ <div
59052
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
59053
+ [class.pointer-events-none]="headerScrollService.isScrolled()"
59054
+ [class.pointer-events-auto]="!headerScrollService.isScrolled()">
59055
+ <div class="flex items-center justify-between">
59056
+ <div>
59057
+ <h1 [ngClass]="getMainTitleClasses()">
59058
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59059
+ </h1>
59060
+ <p [ngClass]="getSubtitleClasses()">
59061
+ Business Profile & Analysis
59062
+ </p>
59063
+ </div>
59064
+ @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59065
+ <div class="flex items-center gap-2">
59066
+ <symphiq-search-button
59067
+ [isLightMode]="isLightMode()"
59068
+ (searchClick)="openSearch()"
59069
+ />
59070
+ <button
59071
+ type="button"
59072
+ (click)="openViewModeSwitcher()"
59073
+ [ngClass]="getViewModeButtonClasses()"
59074
+ 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">
59075
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59076
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59077
+ <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>
59078
+ </svg>
59079
+ <span>{{ displayModeLabel() }}</span>
59080
+ </button>
59081
+ </div>
59082
+ }
59083
+ </div>
59084
+ </div>
59085
+ </div>
59086
+
59087
+ <!-- Condensed Header (scrolled state) -->
59088
+ <div
59089
+ class="transition-all duration-300 ease-in-out overflow-hidden"
59090
+ [class.max-h-0]="!headerScrollService.isScrolled()"
59091
+ [class.opacity-0]="!headerScrollService.isScrolled()"
59092
+ [class.max-h-20]="headerScrollService.isScrolled()"
59093
+ [class.opacity-100]="headerScrollService.isScrolled()">
59094
+ <div
59095
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
59096
+ [class.pointer-events-none]="!headerScrollService.isScrolled()"
59097
+ [class.pointer-events-auto]="headerScrollService.isScrolled()">
59098
+ <div class="flex items-center justify-between">
59099
+ <div class="flex-1 min-w-0 mr-4">
59100
+ <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'">
59101
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
59102
+ </h1>
59103
+ </div>
59104
+ <div class="flex items-center gap-4">
59105
+ @if (!isSimplifiedView()) {
59106
+ <div class="flex items-center gap-2 text-sm flex-shrink-0">
59107
+ <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()">
59108
+ {{ currentSectionTitle() }}
59109
+ </span>
59110
+ @if (currentSubsectionTitle()) {
59111
+ <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
59112
+ <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
59113
+ {{ currentSubsectionTitle() }}
59114
+ </span>
59115
+ }
59116
+ </div>
59117
+ }
59118
+ @if (profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED) {
59119
+ <symphiq-search-button
59120
+ [isLightMode]="isLightMode()"
59121
+ [minimized]="true"
59122
+ (searchClick)="openSearch()"
59123
+ />
59124
+ <button
59125
+ type="button"
59126
+ (click)="openViewModeSwitcher()"
59127
+ [ngClass]="getViewModeButtonClasses()"
59128
+ 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">
59129
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59130
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
59131
+ <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>
59132
+ </svg>
59133
+ </button>
59134
+ }
59135
+ </div>
59136
+ </div>
59137
+ </div>
59138
+ </div>
59139
+ </header>
59140
+
59141
+ <main class="relative">
59142
+ @if (isContentGenerating()) {
59143
+ <!-- Journey Progress Banner (always show when not onboarded) -->
59144
+ @if (!isOnboarded()) {
59145
+ <symphiq-journey-progress-indicator
59146
+ [viewMode]="viewMode()"
59147
+ [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59148
+ [showNextStepAction]="false"
59149
+ [forDemo]="forDemo()"
59150
+ [maxAccessibleStepId]="maxAccessibleStepId()"
59151
+ (stepClick)="stepClick.emit($event)"
59152
+ (nextStepClick)="nextStepClick.emit()"
59153
+ />
59154
+ }
59155
+
59156
+ <!-- Content Generation Progress Component -->
59157
+ <symphiq-content-generation-progress-with-confetti
59158
+ [viewMode]="viewMode()"
59159
+ [itemStatus]="itemStatus()"
59160
+ [profile]="profile()"
59161
+ [confettiIntensity]="'celebration'"
59162
+ [title]="'We are generating a new Business Analysis for ' + (currentProfile()?.profileStructured?.businessName || 'your business') + '.'"
59163
+ [subtitle]="'It will appear here when ready. You can check back later as this will take a few minutes to complete.'"
59164
+ />
59165
+ } @else {
59166
+ @if (isSimplifiedView()) {
59167
+ <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
59168
+ @if (!isOnboarded()) {
59169
+ <symphiq-journey-progress-indicator
59170
+ [viewMode]="viewMode()"
59171
+ [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
59172
+ [showNextStepAction]="showNextStepAction()"
59173
+ [forDemo]="forDemo()"
59174
+ [maxAccessibleStepId]="maxAccessibleStepId()"
59175
+ (stepClick)="stepClick.emit($event)"
59176
+ (nextStepClick)="nextStepClick.emit()"
59177
+ />
59178
+ }
59179
+
59180
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
59181
+ <div class="mb-8">
59182
+ <symphiq-welcome-banner
59183
+ [viewMode]="viewMode()"
59184
+ [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
59185
+ [isOnboarded]="isOnboarded()"
59186
+ />
59187
+ </div>
59188
+
59189
+ <div class="mb-8">
59190
+ <symphiq-recommendations-tiled-grid
59191
+ [recommendations]="recommendationItems()"
59192
+ [viewMode]="viewMode()"
59193
+ (viewMoreClick)="openRecommendationDetailsModal($event)"
59194
+ />
59195
+ </div>
59196
+
59197
+ <div>
59198
+ <symphiq-collapsible-section-group
59199
+ [sections]="nonRecommendationSections()"
59200
+ [viewMode]="viewMode()"
59201
+ />
59202
+ </div>
59203
+ </div>
59204
+ } @else {
59205
+ @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
59206
+ <symphiq-profile-section
59207
+ [section]="section"
59208
+ [viewMode]="viewMode()"
59209
+ [forceExpanded]="!isCompactView()"
59210
+ />
59211
+ @if (!last) {
59212
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
59213
+ <symphiq-section-divider
59214
+ [viewMode]="viewMode()"
59215
+ [subsections]="sections()[idx + 1].subsections || []" />
59216
+ </div>
59217
+ }
59218
+ }
59219
+ }
59220
+ }
59221
+ </main>
59222
+
59223
+ @if (!isSimplifiedView()) {
59224
+ <symphiq-section-navigation
59225
+ [sections]="sections()"
59226
+ [viewMode]="viewMode()"
59227
+ [embedded]="embedded()"
59228
+ [scrollElement]="scrollElement() ?? undefined"
59229
+ />
59230
+ }
59231
+
59232
+ @if (!isSimplifiedView()) {
59233
+ <symphiq-floating-toc
59234
+ [sections]="sections()"
59235
+ [viewMode]="viewMode()"
59236
+ [embedded]="embedded()"
59237
+ [scrollElement]="scrollElement() ?? undefined"
59238
+ />
59239
+ }
59240
+
59241
+ <symphiq-floating-back-button
59242
+ [viewMode]="viewMode()"
59243
+ [embedded]="embedded()"
59244
+ />
59245
+ </div>
59246
+
59247
+ @if (isLoading()) {
59248
+ <div [ngClass]="getLoadingOverlayClasses()">
59249
+ <div [ngClass]="getSpinnerClasses()"></div>
59250
+ </div>
59251
+ }
59252
+
59253
+ <symphiq-tooltip-container />
59254
+ <symphiq-business-analysis-modal
59255
+ [isLightMode]="isLightMode()"
59256
+ (viewInContextRequested)="handleViewInContext($event)" />
59257
+
59258
+ <symphiq-search-modal
59259
+ [isLightMode]="isLightMode()"
59260
+ [isOpen]="searchService.isSearchOpen()"
59261
+ [searchQuery]="searchService.getSearchQuery()"
59262
+ [results]="searchService.searchResults()"
59263
+ [hasResults]="searchService.hasResults()"
59264
+ [selectedIndex]="selectedSearchIndex()"
59265
+ [placeholder]="'Search sections, items, and analysis...'"
59266
+ (searchChange)="onSearchChange($event)"
59267
+ (resultSelected)="onSearchResultSelected($event)"
59268
+ (close)="closeSearch()"
59269
+ />
59270
+
59271
+ <symphiq-view-mode-switcher-modal
59272
+ [isOpen]="isViewModeSwitcherOpen()"
59273
+ [currentMode]="displayMode()"
59274
+ [viewMode]="viewMode()"
59275
+ [isLoading]="isViewModeSwitching()"
59276
+ (close)="closeViewModeSwitcher()"
59277
+ (modeSelected)="handleDisplayModeChange($event)"
59278
+ />
59279
+ </div>
59278
59280
  `, 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"] }]
59279
59281
  }], () => [], { 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: [{
59280
59282
  type: HostListener,