@eric-emg/symphiq-components 1.2.144 → 1.2.145

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.
@@ -1,4 +1,4 @@
1
- import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3, MetricEnum, FocusAreaDomainEnum, FocusAreaHealthEnum, ProfileAnalysisPriorityEnum, CapabilityStateEnum, QuadrantEnum, AdvantageEnum, OverallGradeEnum, OperationalMaturityEnum, ProfileAnalysisEffortLevelEnum, ProfileAnalysisImpactLevelEnum, FocusAreaDomainEnumUtil, ProfileAnalysisTypeEnum, LineChartUseCaseEnum, BarChartUseCaseEnum } from '@jebgem/model';
1
+ import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3, MetricEnum, AiDynamicContentStatusEnum, FocusAreaDomainEnum, FocusAreaHealthEnum, ProfileAnalysisPriorityEnum, CapabilityStateEnum, QuadrantEnum, AdvantageEnum, OverallGradeEnum, OperationalMaturityEnum, ProfileAnalysisEffortLevelEnum, ProfileAnalysisImpactLevelEnum, FocusAreaDomainEnumUtil, ProfileAnalysisTypeEnum, LineChartUseCaseEnum, BarChartUseCaseEnum } from '@jebgem/model';
2
2
  export * from '@jebgem/model';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injectable, signal, computed, input, ChangeDetectionStrategy, Component, output, inject, ElementRef, Renderer2, effect, Directive, HostListener, untracked, ViewChild, PLATFORM_ID, Inject, Input } from '@angular/core';
@@ -51864,6 +51864,40 @@ class SymphiqCreateAccountDashboardComponent {
51864
51864
  this.nextStepClick = output();
51865
51865
  this.headerScrollService = inject(HeaderScrollService);
51866
51866
  this.fb = inject(FormBuilder);
51867
+ this.COLLAPSE_THRESHOLD = 20;
51868
+ this.EXPAND_THRESHOLD = 10;
51869
+ this.embeddedScrollEffect = effect(() => {
51870
+ const scrollEvent = this.scrollEvent();
51871
+ const isEmbedded = this.embedded();
51872
+ if (isEmbedded && !scrollEvent) {
51873
+ return;
51874
+ }
51875
+ if (!scrollEvent || !isEmbedded) {
51876
+ return;
51877
+ }
51878
+ const detail = scrollEvent.detail;
51879
+ if (!detail) {
51880
+ return;
51881
+ }
51882
+ const scrollTop = detail.scrollTop || 0;
51883
+ const currentState = this.headerScrollService.isScrolled();
51884
+ if (!currentState && scrollTop > this.COLLAPSE_THRESHOLD) {
51885
+ this.headerScrollService.isScrolled.set(true);
51886
+ }
51887
+ else if (currentState && scrollTop < this.EXPAND_THRESHOLD) {
51888
+ this.headerScrollService.isScrolled.set(false);
51889
+ }
51890
+ const scrollElement = this.scrollElement();
51891
+ if (scrollElement) {
51892
+ const scrollHeight = scrollElement.scrollHeight || 0;
51893
+ const clientHeight = scrollElement.clientHeight || 0;
51894
+ const maxScroll = scrollHeight - clientHeight;
51895
+ if (maxScroll > 0) {
51896
+ const progress = (scrollTop / maxScroll) * 100;
51897
+ this.headerScrollService.scrollProgress.set(Math.min(100, Math.max(0, progress)));
51898
+ }
51899
+ }
51900
+ }, ...(ngDevMode ? [{ debugName: "embeddedScrollEffect" }] : []));
51867
51901
  this.scrollProgress = computed(() => this.headerScrollService.scrollProgress(), ...(ngDevMode ? [{ debugName: "scrollProgress" }] : []));
51868
51902
  this.editMode = signal(false, ...(ngDevMode ? [{ debugName: "editMode" }] : []));
51869
51903
  this.sameAsShopName = signal(false, ...(ngDevMode ? [{ debugName: "sameAsShopName" }] : []));
@@ -56369,7 +56403,7 @@ function SymphiqBusinessAnalysisDashboardComponent_Conditional_36_Conditional_0_
56369
56403
  i0.ɵɵelementEnd();
56370
56404
  } if (rf & 2) {
56371
56405
  const ctx_r0 = i0.ɵɵnextContext(2);
56372
- i0.ɵɵproperty("viewMode", ctx_r0.viewMode())("currentStepId", ctx_r0.JourneyStepIdEnum.BUSINESS_ANALYSIS)("showNextStepAction", true)("forDemo", ctx_r0.forDemo())("maxAccessibleStepId", ctx_r0.maxAccessibleStepId());
56406
+ i0.ɵɵproperty("viewMode", ctx_r0.viewMode())("currentStepId", ctx_r0.JourneyStepIdEnum.BUSINESS_ANALYSIS)("showNextStepAction", ctx_r0.showNextStepAction())("forDemo", ctx_r0.forDemo())("maxAccessibleStepId", ctx_r0.maxAccessibleStepId());
56373
56407
  } }
56374
56408
  function SymphiqBusinessAnalysisDashboardComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
56375
56409
  const _r2 = i0.ɵɵgetCurrentView();
@@ -56472,6 +56506,7 @@ class SymphiqBusinessAnalysisDashboardComponent {
56472
56506
  this.stepClick = output();
56473
56507
  this.nextStepClick = output();
56474
56508
  this.JourneyStepIdEnum = JourneyStepIdEnum;
56509
+ this.showNextStepAction = computed(() => this.profile()?.selfContentStatus === AiDynamicContentStatusEnum.GENERATED, ...(ngDevMode ? [{ debugName: "showNextStepAction" }] : []));
56475
56510
  this.headerScrollService = inject(HeaderScrollService);
56476
56511
  this.lookupService = inject(ProfileItemLookupService);
56477
56512
  this.navigationService = inject(NavigationStateService);
@@ -57047,228 +57082,228 @@ class SymphiqBusinessAnalysisDashboardComponent {
57047
57082
  }
57048
57083
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SymphiqBusinessAnalysisDashboardComponent, [{
57049
57084
  type: Component,
57050
- args: [{ selector: 'symphiq-business-analysis-dashboard', standalone: true, imports: [CommonModule, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57051
- <div [ngClass]="getContainerClasses()">
57052
- <!-- Scroll Progress Bar (fixed at top) -->
57053
- <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'">
57054
- <div
57055
- [style.width.%]="scrollProgress()"
57056
- [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
57057
- class="h-full transition-all duration-200 ease-out">
57058
- </div>
57059
- </div>
57060
-
57061
- <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>
57062
-
57063
- <div class="relative z-[51]">
57064
- <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
57065
- <!-- Expanded Header (default state) -->
57066
- <div
57067
- class="transition-all duration-300 ease-in-out overflow-hidden"
57068
- [class.max-h-0]="headerScrollService.isScrolled()"
57069
- [class.opacity-0]="headerScrollService.isScrolled()"
57070
- [class.max-h-96]="!headerScrollService.isScrolled()"
57071
- [class.opacity-100]="!headerScrollService.isScrolled()">
57072
- <div
57073
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
57074
- [class.pointer-events-none]="headerScrollService.isScrolled()"
57075
- [class.pointer-events-auto]="!headerScrollService.isScrolled()">
57076
- <div class="flex items-center justify-between">
57077
- <div>
57078
- <h1 [ngClass]="getMainTitleClasses()">
57079
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
57080
- </h1>
57081
- <p [ngClass]="getSubtitleClasses()">
57082
- Business Profile & Analysis
57083
- </p>
57084
- </div>
57085
- <div class="flex items-center gap-2">
57086
- <symphiq-search-button
57087
- [isLightMode]="isLightMode()"
57088
- (searchClick)="openSearch()"
57089
- />
57090
- <button
57091
- type="button"
57092
- (click)="openViewModeSwitcher()"
57093
- [ngClass]="getViewModeButtonClasses()"
57094
- 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">
57095
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57096
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
57097
- <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>
57098
- </svg>
57099
- <span>{{ displayModeLabel() }}</span>
57100
- </button>
57101
- </div>
57102
- </div>
57103
- </div>
57104
- </div>
57105
-
57106
- <!-- Condensed Header (scrolled state) -->
57107
- <div
57108
- class="transition-all duration-300 ease-in-out overflow-hidden"
57109
- [class.max-h-0]="!headerScrollService.isScrolled()"
57110
- [class.opacity-0]="!headerScrollService.isScrolled()"
57111
- [class.max-h-20]="headerScrollService.isScrolled()"
57112
- [class.opacity-100]="headerScrollService.isScrolled()">
57113
- <div
57114
- class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
57115
- [class.pointer-events-none]="!headerScrollService.isScrolled()"
57116
- [class.pointer-events-auto]="headerScrollService.isScrolled()">
57117
- <div class="flex items-center justify-between">
57118
- <div class="flex-1 min-w-0 mr-4">
57119
- <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'">
57120
- {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
57121
- </h1>
57122
- </div>
57123
- <div class="flex items-center gap-4">
57124
- @if (!isSimplifiedView()) {
57125
- <div class="flex items-center gap-2 text-sm flex-shrink-0">
57126
- <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()">
57127
- {{ currentSectionTitle() }}
57128
- </span>
57129
- @if (currentSubsectionTitle()) {
57130
- <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
57131
- <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
57132
- {{ currentSubsectionTitle() }}
57133
- </span>
57134
- }
57135
- </div>
57136
- }
57137
- <symphiq-search-button
57138
- [isLightMode]="isLightMode()"
57139
- [minimized]="true"
57140
- (searchClick)="openSearch()"
57141
- />
57142
- <button
57143
- type="button"
57144
- (click)="openViewModeSwitcher()"
57145
- [ngClass]="getViewModeButtonClasses()"
57146
- 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">
57147
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57148
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
57149
- <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>
57150
- </svg>
57151
- </button>
57152
- </div>
57153
- </div>
57154
- </div>
57155
- </div>
57156
- </header>
57157
-
57158
- <main class="relative">
57159
- @if (isSimplifiedView()) {
57160
- <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
57161
- @if (!isOnboarded()) {
57162
- <symphiq-journey-progress-indicator
57163
- [viewMode]="viewMode()"
57164
- [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
57165
- [showNextStepAction]="true"
57166
- [forDemo]="forDemo()"
57167
- [maxAccessibleStepId]="maxAccessibleStepId()"
57168
- (stepClick)="stepClick.emit($event)"
57169
- (nextStepClick)="nextStepClick.emit()"
57170
- />
57171
- }
57172
-
57173
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
57174
- <div class="mb-8">
57175
- <symphiq-welcome-banner
57176
- [viewMode]="viewMode()"
57177
- [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
57178
- [isOnboarded]="isOnboarded()"
57179
- />
57180
- </div>
57181
-
57182
- <div class="mb-8">
57183
- <symphiq-recommendations-tiled-grid
57184
- [recommendations]="recommendationItems()"
57185
- [viewMode]="viewMode()"
57186
- (viewMoreClick)="openRecommendationDetailsModal($event)"
57187
- />
57188
- </div>
57189
-
57190
- <div>
57191
- <symphiq-collapsible-section-group
57192
- [sections]="nonRecommendationSections()"
57193
- [viewMode]="viewMode()"
57194
- />
57195
- </div>
57196
- </div>
57197
- } @else {
57198
- @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
57199
- <symphiq-profile-section
57200
- [section]="section"
57201
- [viewMode]="viewMode()"
57202
- [forceExpanded]="!isCompactView()"
57203
- />
57204
- @if (!last) {
57205
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
57206
- <symphiq-section-divider
57207
- [viewMode]="viewMode()"
57208
- [subsections]="sections()[idx + 1].subsections || []" />
57209
- </div>
57210
- }
57211
- }
57212
- }
57213
- </main>
57214
-
57215
- @if (!isSimplifiedView()) {
57216
- <symphiq-section-navigation
57217
- [sections]="sections()"
57218
- [viewMode]="viewMode()"
57219
- [embedded]="embedded()"
57220
- [scrollElement]="scrollElement() ?? undefined"
57221
- />
57222
- }
57223
-
57224
- @if (!isSimplifiedView()) {
57225
- <symphiq-floating-toc
57226
- [sections]="sections()"
57227
- [viewMode]="viewMode()"
57228
- [embedded]="embedded()"
57229
- [scrollElement]="scrollElement() ?? undefined"
57230
- />
57231
- }
57232
-
57233
- <symphiq-floating-back-button
57234
- [viewMode]="viewMode()"
57235
- [embedded]="embedded()"
57236
- />
57237
- </div>
57238
-
57239
- @if (isLoading()) {
57240
- <div [ngClass]="getLoadingOverlayClasses()">
57241
- <div [ngClass]="getSpinnerClasses()"></div>
57242
- </div>
57243
- }
57244
-
57245
- <symphiq-tooltip-container />
57246
- <symphiq-business-analysis-modal
57247
- [isLightMode]="isLightMode()"
57248
- (viewInContextRequested)="handleViewInContext($event)" />
57249
-
57250
- <symphiq-search-modal
57251
- [isLightMode]="isLightMode()"
57252
- [isOpen]="searchService.isSearchOpen()"
57253
- [searchQuery]="searchService.getSearchQuery()"
57254
- [results]="searchService.searchResults()"
57255
- [hasResults]="searchService.hasResults()"
57256
- [selectedIndex]="selectedSearchIndex()"
57257
- [placeholder]="'Search sections, items, and analysis...'"
57258
- (searchChange)="onSearchChange($event)"
57259
- (resultSelected)="onSearchResultSelected($event)"
57260
- (close)="closeSearch()"
57261
- />
57262
-
57263
- <symphiq-view-mode-switcher-modal
57264
- [isOpen]="isViewModeSwitcherOpen()"
57265
- [currentMode]="displayMode()"
57266
- [viewMode]="viewMode()"
57267
- [isLoading]="isViewModeSwitching()"
57268
- (close)="closeViewModeSwitcher()"
57269
- (modeSelected)="handleDisplayModeChange($event)"
57270
- />
57271
- </div>
57085
+ args: [{ selector: 'symphiq-business-analysis-dashboard', standalone: true, imports: [CommonModule, ProfileSectionComponent, SectionNavigationComponent, FloatingTocComponent, FloatingBackButtonComponent, TooltipContainerComponent, SectionDividerComponent, BusinessAnalysisModalComponent, SearchButtonComponent, SearchModalComponent, ViewModeSwitcherModalComponent, JourneyProgressIndicatorComponent, WelcomeBannerComponent, RecommendationsTiledGridComponent, CollapsibleSectionGroupComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57086
+ <div [ngClass]="getContainerClasses()">
57087
+ <!-- Scroll Progress Bar (fixed at top) -->
57088
+ <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'">
57089
+ <div
57090
+ [style.width.%]="scrollProgress()"
57091
+ [ngClass]="isLightMode() ? 'bg-gradient-to-r from-blue-500 to-purple-500' : 'bg-gradient-to-r from-blue-400 to-purple-400'"
57092
+ class="h-full transition-all duration-200 ease-out">
57093
+ </div>
57094
+ </div>
57095
+
57096
+ <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>
57097
+
57098
+ <div class="relative z-[51]">
57099
+ <header [ngClass]="getHeaderClasses()" class="sticky top-0 z-50">
57100
+ <!-- Expanded Header (default state) -->
57101
+ <div
57102
+ class="transition-all duration-300 ease-in-out overflow-hidden"
57103
+ [class.max-h-0]="headerScrollService.isScrolled()"
57104
+ [class.opacity-0]="headerScrollService.isScrolled()"
57105
+ [class.max-h-96]="!headerScrollService.isScrolled()"
57106
+ [class.opacity-100]="!headerScrollService.isScrolled()">
57107
+ <div
57108
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"
57109
+ [class.pointer-events-none]="headerScrollService.isScrolled()"
57110
+ [class.pointer-events-auto]="!headerScrollService.isScrolled()">
57111
+ <div class="flex items-center justify-between">
57112
+ <div>
57113
+ <h1 [ngClass]="getMainTitleClasses()">
57114
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
57115
+ </h1>
57116
+ <p [ngClass]="getSubtitleClasses()">
57117
+ Business Profile & Analysis
57118
+ </p>
57119
+ </div>
57120
+ <div class="flex items-center gap-2">
57121
+ <symphiq-search-button
57122
+ [isLightMode]="isLightMode()"
57123
+ (searchClick)="openSearch()"
57124
+ />
57125
+ <button
57126
+ type="button"
57127
+ (click)="openViewModeSwitcher()"
57128
+ [ngClass]="getViewModeButtonClasses()"
57129
+ 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">
57130
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57131
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
57132
+ <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>
57133
+ </svg>
57134
+ <span>{{ displayModeLabel() }}</span>
57135
+ </button>
57136
+ </div>
57137
+ </div>
57138
+ </div>
57139
+ </div>
57140
+
57141
+ <!-- Condensed Header (scrolled state) -->
57142
+ <div
57143
+ class="transition-all duration-300 ease-in-out overflow-hidden"
57144
+ [class.max-h-0]="!headerScrollService.isScrolled()"
57145
+ [class.opacity-0]="!headerScrollService.isScrolled()"
57146
+ [class.max-h-20]="headerScrollService.isScrolled()"
57147
+ [class.opacity-100]="headerScrollService.isScrolled()">
57148
+ <div
57149
+ class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3"
57150
+ [class.pointer-events-none]="!headerScrollService.isScrolled()"
57151
+ [class.pointer-events-auto]="headerScrollService.isScrolled()">
57152
+ <div class="flex items-center justify-between">
57153
+ <div class="flex-1 min-w-0 mr-4">
57154
+ <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'">
57155
+ {{ currentProfile()?.profileStructured?.businessName || 'Business Analysis' }}
57156
+ </h1>
57157
+ </div>
57158
+ <div class="flex items-center gap-4">
57159
+ @if (!isSimplifiedView()) {
57160
+ <div class="flex items-center gap-2 text-sm flex-shrink-0">
57161
+ <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()">
57162
+ {{ currentSectionTitle() }}
57163
+ </span>
57164
+ @if (currentSubsectionTitle()) {
57165
+ <span [ngClass]="isLightMode() ? 'text-slate-400' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">›</span>
57166
+ <span [ngClass]="isLightMode() ? 'text-slate-500' : 'text-slate-500'" class="transition-opacity duration-300" [class.opacity-0]="subsectionTitleFading()" [class.opacity-100]="!subsectionTitleFading()">
57167
+ {{ currentSubsectionTitle() }}
57168
+ </span>
57169
+ }
57170
+ </div>
57171
+ }
57172
+ <symphiq-search-button
57173
+ [isLightMode]="isLightMode()"
57174
+ [minimized]="true"
57175
+ (searchClick)="openSearch()"
57176
+ />
57177
+ <button
57178
+ type="button"
57179
+ (click)="openViewModeSwitcher()"
57180
+ [ngClass]="getViewModeButtonClasses()"
57181
+ 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">
57182
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57183
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
57184
+ <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>
57185
+ </svg>
57186
+ </button>
57187
+ </div>
57188
+ </div>
57189
+ </div>
57190
+ </div>
57191
+ </header>
57192
+
57193
+ <main class="relative">
57194
+ @if (isSimplifiedView()) {
57195
+ <!-- Journey Progress Banner - Full Width Sticky (only show when not onboarded) -->
57196
+ @if (!isOnboarded()) {
57197
+ <symphiq-journey-progress-indicator
57198
+ [viewMode]="viewMode()"
57199
+ [currentStepId]="JourneyStepIdEnum.BUSINESS_ANALYSIS"
57200
+ [showNextStepAction]="showNextStepAction()"
57201
+ [forDemo]="forDemo()"
57202
+ [maxAccessibleStepId]="maxAccessibleStepId()"
57203
+ (stepClick)="stepClick.emit($event)"
57204
+ (nextStepClick)="nextStepClick.emit()"
57205
+ />
57206
+ }
57207
+
57208
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
57209
+ <div class="mb-8">
57210
+ <symphiq-welcome-banner
57211
+ [viewMode]="viewMode()"
57212
+ [businessName]="currentProfile()?.profileStructured?.businessName || 'your business'"
57213
+ [isOnboarded]="isOnboarded()"
57214
+ />
57215
+ </div>
57216
+
57217
+ <div class="mb-8">
57218
+ <symphiq-recommendations-tiled-grid
57219
+ [recommendations]="recommendationItems()"
57220
+ [viewMode]="viewMode()"
57221
+ (viewMoreClick)="openRecommendationDetailsModal($event)"
57222
+ />
57223
+ </div>
57224
+
57225
+ <div>
57226
+ <symphiq-collapsible-section-group
57227
+ [sections]="nonRecommendationSections()"
57228
+ [viewMode]="viewMode()"
57229
+ />
57230
+ </div>
57231
+ </div>
57232
+ } @else {
57233
+ @for (section of sections(); track trackBySectionId($index, section); let idx = $index; let last = $last) {
57234
+ <symphiq-profile-section
57235
+ [section]="section"
57236
+ [viewMode]="viewMode()"
57237
+ [forceExpanded]="!isCompactView()"
57238
+ />
57239
+ @if (!last) {
57240
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
57241
+ <symphiq-section-divider
57242
+ [viewMode]="viewMode()"
57243
+ [subsections]="sections()[idx + 1].subsections || []" />
57244
+ </div>
57245
+ }
57246
+ }
57247
+ }
57248
+ </main>
57249
+
57250
+ @if (!isSimplifiedView()) {
57251
+ <symphiq-section-navigation
57252
+ [sections]="sections()"
57253
+ [viewMode]="viewMode()"
57254
+ [embedded]="embedded()"
57255
+ [scrollElement]="scrollElement() ?? undefined"
57256
+ />
57257
+ }
57258
+
57259
+ @if (!isSimplifiedView()) {
57260
+ <symphiq-floating-toc
57261
+ [sections]="sections()"
57262
+ [viewMode]="viewMode()"
57263
+ [embedded]="embedded()"
57264
+ [scrollElement]="scrollElement() ?? undefined"
57265
+ />
57266
+ }
57267
+
57268
+ <symphiq-floating-back-button
57269
+ [viewMode]="viewMode()"
57270
+ [embedded]="embedded()"
57271
+ />
57272
+ </div>
57273
+
57274
+ @if (isLoading()) {
57275
+ <div [ngClass]="getLoadingOverlayClasses()">
57276
+ <div [ngClass]="getSpinnerClasses()"></div>
57277
+ </div>
57278
+ }
57279
+
57280
+ <symphiq-tooltip-container />
57281
+ <symphiq-business-analysis-modal
57282
+ [isLightMode]="isLightMode()"
57283
+ (viewInContextRequested)="handleViewInContext($event)" />
57284
+
57285
+ <symphiq-search-modal
57286
+ [isLightMode]="isLightMode()"
57287
+ [isOpen]="searchService.isSearchOpen()"
57288
+ [searchQuery]="searchService.getSearchQuery()"
57289
+ [results]="searchService.searchResults()"
57290
+ [hasResults]="searchService.hasResults()"
57291
+ [selectedIndex]="selectedSearchIndex()"
57292
+ [placeholder]="'Search sections, items, and analysis...'"
57293
+ (searchChange)="onSearchChange($event)"
57294
+ (resultSelected)="onSearchResultSelected($event)"
57295
+ (close)="closeSearch()"
57296
+ />
57297
+
57298
+ <symphiq-view-mode-switcher-modal
57299
+ [isOpen]="isViewModeSwitcherOpen()"
57300
+ [currentMode]="displayMode()"
57301
+ [viewMode]="viewMode()"
57302
+ [isLoading]="isViewModeSwitching()"
57303
+ (close)="closeViewModeSwitcher()"
57304
+ (modeSelected)="handleDisplayModeChange($event)"
57305
+ />
57306
+ </div>
57272
57307
  `, 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"] }]
57273
57308
  }], () => [], { 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 }] }], stepClick: [{ type: i0.Output, args: ["stepClick"] }], nextStepClick: [{ type: i0.Output, args: ["nextStepClick"] }], onScroll: [{
57274
57309
  type: HostListener,
@@ -57277,7 +57312,7 @@ class SymphiqBusinessAnalysisDashboardComponent {
57277
57312
  type: HostListener,
57278
57313
  args: ['document:keydown', ['$event']]
57279
57314
  }] }); })();
57280
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqBusinessAnalysisDashboardComponent, { className: "SymphiqBusinessAnalysisDashboardComponent", filePath: "lib/components/business-analysis-dashboard/symphiq-business-analysis-dashboard.component.ts", lineNumber: 302 }); })();
57315
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqBusinessAnalysisDashboardComponent, { className: "SymphiqBusinessAnalysisDashboardComponent", filePath: "lib/components/business-analysis-dashboard/symphiq-business-analysis-dashboard.component.ts", lineNumber: 303 }); })();
57281
57316
 
57282
57317
  function DashboardHeaderComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
57283
57318
  i0.ɵɵelement(0, "div", 6);