@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.
- package/fesm2022/symphiq-components.mjs +263 -261
- package/fesm2022/symphiq-components.mjs.map +1 -1
- package/index.d.ts +18 -18
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|