@eric-emg/symphiq-components 1.2.40 → 1.2.42
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 +264 -23
- package/fesm2022/symphiq-components.mjs.map +1 -1
- package/index.d.ts +11 -4
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -20743,7 +20743,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_80_Conditional_29_F
|
|
|
20743
20743
|
i0.ɵɵclassMap(ctx_r2.getBentoCardClass(metric_r19, ɵ$index_447_r20));
|
|
20744
20744
|
i0.ɵɵstyleProp("animation-delay", 0.6 + ɵ$index_438_r21 * 0.15 + ɵ$index_447_r20 * 0.08 + "s");
|
|
20745
20745
|
i0.ɵɵadvance();
|
|
20746
|
-
i0.ɵɵproperty("metric", metric_r19)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(metric_r19))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.
|
|
20746
|
+
i0.ɵɵproperty("metric", metric_r19)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(metric_r19))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.analysisData())("isLightMode", ctx_r2.isLightMode())("viewMode", ctx_r2.viewMode())("isCompactMode", false);
|
|
20747
20747
|
} }
|
|
20748
20748
|
function SymphiqFunnelAnalysisDashboardComponent_Conditional_80_Conditional_29_For_2_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
20749
20749
|
i0.ɵɵelementStart(0, "div", 127);
|
|
@@ -20765,7 +20765,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_80_Conditional_29_F
|
|
|
20765
20765
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
20766
20766
|
i0.ɵɵstyleProp("animation-delay", 0.6 + ɵ$index_438_r21 * 0.15 + ɵ$index_455_r24 * 0.08 + "s");
|
|
20767
20767
|
i0.ɵɵadvance();
|
|
20768
|
-
i0.ɵɵproperty("metric", metric_r23)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(metric_r23))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.
|
|
20768
|
+
i0.ɵɵproperty("metric", metric_r23)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(metric_r23))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.analysisData())("isLightMode", ctx_r2.isLightMode())("viewMode", ctx_r2.viewMode())("isCompactMode", true);
|
|
20769
20769
|
} }
|
|
20770
20770
|
function SymphiqFunnelAnalysisDashboardComponent_Conditional_80_Conditional_29_For_2_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
20771
20771
|
i0.ɵɵelementStart(0, "div", 128);
|
|
@@ -20834,7 +20834,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_80_Conditional_29_F
|
|
|
20834
20834
|
i0.ɵɵstyleProp("animation-delay", 0.5 + ɵ$index_438_r21 * 0.15 + "s");
|
|
20835
20835
|
i0.ɵɵproperty("libSymphiqSearchHighlight", ctx_r2.searchService.highlightedResultId())("highlightId", "metric-" + ɵ$index_438_r21);
|
|
20836
20836
|
i0.ɵɵadvance();
|
|
20837
|
-
i0.ɵɵproperty("metric", funnelGroup_r22.funnelMetric)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(funnelGroup_r22.funnelMetric))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.
|
|
20837
|
+
i0.ɵɵproperty("metric", funnelGroup_r22.funnelMetric)("insights", ctx_r2.insights())("charts", ctx_r2.chartsForMetric(funnelGroup_r22.funnelMetric))("allCharts", ctx_r2.allCharts())("analysis", ctx_r2.analysisData())("isLightMode", ctx_r2.isLightMode())("viewMode", ctx_r2.viewMode())("isCompactMode", ctx_r2.viewModeService.isCompact());
|
|
20838
20838
|
i0.ɵɵadvance();
|
|
20839
20839
|
i0.ɵɵconditional(funnelGroup_r22.relatedMetrics.length > 0 ? 2 : -1);
|
|
20840
20840
|
} }
|
|
@@ -21243,10 +21243,11 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21243
21243
|
// Input signals (Angular 20 signal-based inputs)
|
|
21244
21244
|
this.requestedByUser = input(...(ngDevMode ? [undefined, { debugName: "requestedByUser" }] : []));
|
|
21245
21245
|
this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
|
|
21246
|
-
this.funnelAnalysis = input(
|
|
21246
|
+
this.funnelAnalysis = input(...(ngDevMode ? [undefined, { debugName: "funnelAnalysis" }] : []));
|
|
21247
21247
|
this.embedded = input(false, ...(ngDevMode ? [{ debugName: "embedded" }] : []));
|
|
21248
21248
|
this.scrollContainerId = input(...(ngDevMode ? [undefined, { debugName: "scrollContainerId" }] : []));
|
|
21249
21249
|
this.isLoading = input(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
|
|
21250
|
+
this.useSampleData = input(false, ...(ngDevMode ? [{ debugName: "useSampleData" }] : []));
|
|
21250
21251
|
// State signals
|
|
21251
21252
|
this.selectedCategory = signal('ALL', ...(ngDevMode ? [{ debugName: "selectedCategory" }] : []));
|
|
21252
21253
|
this.reverseSortOrder = signal(false, ...(ngDevMode ? [{ debugName: "reverseSortOrder" }] : []));
|
|
@@ -21289,7 +21290,17 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21289
21290
|
];
|
|
21290
21291
|
// Computed signals (automatically memoized)
|
|
21291
21292
|
this.isLightMode = computed(() => this.viewMode() === ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "isLightMode" }] : []));
|
|
21292
|
-
|
|
21293
|
+
// Analysis data - use sample data if useSampleData is true, otherwise use provided data
|
|
21294
|
+
this.analysisData = computed(() => {
|
|
21295
|
+
if (this.useSampleData()) {
|
|
21296
|
+
return FUNNEL_ANALYSIS;
|
|
21297
|
+
}
|
|
21298
|
+
return this.funnelAnalysis();
|
|
21299
|
+
}, ...(ngDevMode ? [{ debugName: "analysisData" }] : []));
|
|
21300
|
+
this.performanceOverview = computed(() => {
|
|
21301
|
+
const analysis = this.analysisData();
|
|
21302
|
+
return analysis ? normalizeToV3(analysis.performanceOverviewStructured) : { overallAssessment: {}, insights: [], metrics: [], breakdowns: [], charts: [] };
|
|
21303
|
+
}, ...(ngDevMode ? [{ debugName: "performanceOverview" }] : []));
|
|
21293
21304
|
// Derived data signals
|
|
21294
21305
|
this.insights = computed(() => {
|
|
21295
21306
|
const overview = this.performanceOverview();
|
|
@@ -21621,6 +21632,11 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21621
21632
|
// Manage overall assessment loading state during view mode transitions
|
|
21622
21633
|
}
|
|
21623
21634
|
ngAfterViewInit() {
|
|
21635
|
+
console.log('[SCROLL DEBUG] ngAfterViewInit called', {
|
|
21636
|
+
embedded: this.embedded(),
|
|
21637
|
+
scrollContainerId: this.scrollContainerId(),
|
|
21638
|
+
isScrolled: this.isScrolled()
|
|
21639
|
+
});
|
|
21624
21640
|
// Ensure modal has data after view is initialized
|
|
21625
21641
|
if (this.modalComponent) {
|
|
21626
21642
|
this.modalComponent.setMetricsAndInsights(this.allMetrics(), this.insights(), this.allCharts());
|
|
@@ -21632,6 +21648,11 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21632
21648
|
if (this.scrollContainerId()) {
|
|
21633
21649
|
const setupScrollContainer = () => {
|
|
21634
21650
|
const element = document.getElementById(this.scrollContainerId());
|
|
21651
|
+
console.log('[SCROLL DEBUG] setupScrollContainer attempt', {
|
|
21652
|
+
scrollContainerId: this.scrollContainerId(),
|
|
21653
|
+
elementFound: !!element,
|
|
21654
|
+
elementTag: element?.tagName
|
|
21655
|
+
});
|
|
21635
21656
|
if (!element) {
|
|
21636
21657
|
return false;
|
|
21637
21658
|
}
|
|
@@ -21641,9 +21662,64 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21641
21662
|
// Get the scrollable element from Ionic
|
|
21642
21663
|
if (typeof ionContent.getScrollElement === 'function') {
|
|
21643
21664
|
ionContent.getScrollElement().then((scrollElement) => {
|
|
21665
|
+
console.log('[SCROLL DEBUG] Ionic scroll element found', {
|
|
21666
|
+
scrollTop: scrollElement.scrollTop,
|
|
21667
|
+
scrollHeight: scrollElement.scrollHeight,
|
|
21668
|
+
clientHeight: scrollElement.clientHeight
|
|
21669
|
+
});
|
|
21644
21670
|
// Store reference for use in scrollToSection and tooltips
|
|
21645
21671
|
this.embeddedScrollContainer = scrollElement;
|
|
21646
21672
|
this.tooltipService.setScrollContainer(scrollElement);
|
|
21673
|
+
// Helper function to check and update scroll state
|
|
21674
|
+
const checkInitialScroll = () => {
|
|
21675
|
+
const currentScrollTop = scrollElement.scrollTop;
|
|
21676
|
+
const scrollHeight = scrollElement.scrollHeight;
|
|
21677
|
+
const clientHeight = scrollElement.clientHeight;
|
|
21678
|
+
console.log('[SCROLL DEBUG] Checking initial scroll position', {
|
|
21679
|
+
scrollTop: currentScrollTop,
|
|
21680
|
+
scrollHeight,
|
|
21681
|
+
clientHeight,
|
|
21682
|
+
shouldCollapse: currentScrollTop > 50
|
|
21683
|
+
});
|
|
21684
|
+
if (currentScrollTop > 50) {
|
|
21685
|
+
console.log('[SCROLL DEBUG] Collapsing header due to scroll position', { currentScrollTop });
|
|
21686
|
+
this.isScrolled.set(true);
|
|
21687
|
+
}
|
|
21688
|
+
else {
|
|
21689
|
+
console.log('[SCROLL DEBUG] Expanding header due to scroll position', { currentScrollTop });
|
|
21690
|
+
this.isScrolled.set(false);
|
|
21691
|
+
}
|
|
21692
|
+
};
|
|
21693
|
+
// Use ResizeObserver to detect when content has finished rendering
|
|
21694
|
+
let lastHeight = scrollElement.scrollHeight;
|
|
21695
|
+
let stableCount = 0;
|
|
21696
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
21697
|
+
const currentHeight = scrollElement.scrollHeight;
|
|
21698
|
+
console.log('[SCROLL DEBUG] Content height changed', {
|
|
21699
|
+
lastHeight,
|
|
21700
|
+
currentHeight,
|
|
21701
|
+
stableCount
|
|
21702
|
+
});
|
|
21703
|
+
if (currentHeight === lastHeight) {
|
|
21704
|
+
stableCount++;
|
|
21705
|
+
// Height has been stable for 2 consecutive observations
|
|
21706
|
+
if (stableCount >= 2) {
|
|
21707
|
+
console.log('[SCROLL DEBUG] Content height stabilized, checking scroll position');
|
|
21708
|
+
checkInitialScroll();
|
|
21709
|
+
resizeObserver.disconnect();
|
|
21710
|
+
}
|
|
21711
|
+
}
|
|
21712
|
+
else {
|
|
21713
|
+
stableCount = 0;
|
|
21714
|
+
lastHeight = currentHeight;
|
|
21715
|
+
// Check on each significant height change
|
|
21716
|
+
checkInitialScroll();
|
|
21717
|
+
}
|
|
21718
|
+
});
|
|
21719
|
+
// Observe the scroll element for size changes
|
|
21720
|
+
resizeObserver.observe(scrollElement);
|
|
21721
|
+
// Also check immediately
|
|
21722
|
+
checkInitialScroll();
|
|
21647
21723
|
// Attach scroll listeners
|
|
21648
21724
|
scrollElement.addEventListener('scroll', () => this.onContainerScroll(scrollElement), { passive: true });
|
|
21649
21725
|
ionContent.addEventListener('ionScroll', () => this.onContainerScroll(scrollElement), { passive: true });
|
|
@@ -21665,16 +21741,106 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21665
21741
|
}
|
|
21666
21742
|
else {
|
|
21667
21743
|
// Fallback for older Ionic versions
|
|
21744
|
+
console.log('[SCROLL DEBUG] Using fallback for older Ionic', {
|
|
21745
|
+
scrollTop: element.scrollTop
|
|
21746
|
+
});
|
|
21668
21747
|
this.embeddedScrollContainer = element;
|
|
21669
21748
|
this.tooltipService.setScrollContainer(element);
|
|
21749
|
+
// Helper function to check and update scroll state
|
|
21750
|
+
const checkInitialScroll = () => {
|
|
21751
|
+
const currentScrollTop = element.scrollTop;
|
|
21752
|
+
console.log('[SCROLL DEBUG] Checking initial scroll position (fallback)', {
|
|
21753
|
+
scrollTop: currentScrollTop,
|
|
21754
|
+
shouldCollapse: currentScrollTop > 50
|
|
21755
|
+
});
|
|
21756
|
+
if (currentScrollTop > 50) {
|
|
21757
|
+
console.log('[SCROLL DEBUG] Collapsing header due to scroll position', { currentScrollTop });
|
|
21758
|
+
this.isScrolled.set(true);
|
|
21759
|
+
}
|
|
21760
|
+
else {
|
|
21761
|
+
console.log('[SCROLL DEBUG] Expanding header due to scroll position', { currentScrollTop });
|
|
21762
|
+
this.isScrolled.set(false);
|
|
21763
|
+
}
|
|
21764
|
+
};
|
|
21765
|
+
// Use ResizeObserver to detect when content has finished rendering
|
|
21766
|
+
let lastHeight = element.scrollHeight;
|
|
21767
|
+
let stableCount = 0;
|
|
21768
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
21769
|
+
const currentHeight = element.scrollHeight;
|
|
21770
|
+
console.log('[SCROLL DEBUG] Content height changed (fallback)', {
|
|
21771
|
+
lastHeight,
|
|
21772
|
+
currentHeight,
|
|
21773
|
+
stableCount
|
|
21774
|
+
});
|
|
21775
|
+
if (currentHeight === lastHeight) {
|
|
21776
|
+
stableCount++;
|
|
21777
|
+
if (stableCount >= 2) {
|
|
21778
|
+
console.log('[SCROLL DEBUG] Content height stabilized (fallback), checking scroll position');
|
|
21779
|
+
checkInitialScroll();
|
|
21780
|
+
resizeObserver.disconnect();
|
|
21781
|
+
}
|
|
21782
|
+
}
|
|
21783
|
+
else {
|
|
21784
|
+
stableCount = 0;
|
|
21785
|
+
lastHeight = currentHeight;
|
|
21786
|
+
checkInitialScroll();
|
|
21787
|
+
}
|
|
21788
|
+
});
|
|
21789
|
+
resizeObserver.observe(element);
|
|
21790
|
+
checkInitialScroll();
|
|
21670
21791
|
element.addEventListener('scroll', () => this.onContainerScroll(element), { passive: true });
|
|
21671
21792
|
return true;
|
|
21672
21793
|
}
|
|
21673
21794
|
}
|
|
21674
21795
|
else {
|
|
21675
21796
|
// Regular HTML element
|
|
21797
|
+
console.log('[SCROLL DEBUG] Regular HTML element setup', {
|
|
21798
|
+
scrollTop: element.scrollTop
|
|
21799
|
+
});
|
|
21676
21800
|
this.embeddedScrollContainer = element;
|
|
21677
21801
|
this.tooltipService.setScrollContainer(element);
|
|
21802
|
+
// Helper function to check and update scroll state
|
|
21803
|
+
const checkInitialScroll = () => {
|
|
21804
|
+
const currentScrollTop = element.scrollTop;
|
|
21805
|
+
console.log('[SCROLL DEBUG] Checking initial scroll position (regular)', {
|
|
21806
|
+
scrollTop: currentScrollTop,
|
|
21807
|
+
shouldCollapse: currentScrollTop > 50
|
|
21808
|
+
});
|
|
21809
|
+
if (currentScrollTop > 50) {
|
|
21810
|
+
console.log('[SCROLL DEBUG] Collapsing header due to scroll position', { currentScrollTop });
|
|
21811
|
+
this.isScrolled.set(true);
|
|
21812
|
+
}
|
|
21813
|
+
else {
|
|
21814
|
+
console.log('[SCROLL DEBUG] Expanding header due to scroll position', { currentScrollTop });
|
|
21815
|
+
this.isScrolled.set(false);
|
|
21816
|
+
}
|
|
21817
|
+
};
|
|
21818
|
+
// Use ResizeObserver to detect when content has finished rendering
|
|
21819
|
+
let lastHeight = element.scrollHeight;
|
|
21820
|
+
let stableCount = 0;
|
|
21821
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
21822
|
+
const currentHeight = element.scrollHeight;
|
|
21823
|
+
console.log('[SCROLL DEBUG] Content height changed (regular)', {
|
|
21824
|
+
lastHeight,
|
|
21825
|
+
currentHeight,
|
|
21826
|
+
stableCount
|
|
21827
|
+
});
|
|
21828
|
+
if (currentHeight === lastHeight) {
|
|
21829
|
+
stableCount++;
|
|
21830
|
+
if (stableCount >= 2) {
|
|
21831
|
+
console.log('[SCROLL DEBUG] Content height stabilized (regular), checking scroll position');
|
|
21832
|
+
checkInitialScroll();
|
|
21833
|
+
resizeObserver.disconnect();
|
|
21834
|
+
}
|
|
21835
|
+
}
|
|
21836
|
+
else {
|
|
21837
|
+
stableCount = 0;
|
|
21838
|
+
lastHeight = currentHeight;
|
|
21839
|
+
checkInitialScroll();
|
|
21840
|
+
}
|
|
21841
|
+
});
|
|
21842
|
+
resizeObserver.observe(element);
|
|
21843
|
+
checkInitialScroll();
|
|
21678
21844
|
element.addEventListener('scroll', () => this.onContainerScroll(element), { passive: true });
|
|
21679
21845
|
return true;
|
|
21680
21846
|
}
|
|
@@ -21914,6 +22080,12 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21914
22080
|
return;
|
|
21915
22081
|
}
|
|
21916
22082
|
const scrollPosition = container.scrollTop;
|
|
22083
|
+
console.log('[SCROLL DEBUG] onContainerScroll', {
|
|
22084
|
+
scrollPosition,
|
|
22085
|
+
isScrolled: this.isScrolled(),
|
|
22086
|
+
isProgrammaticScroll: this.isProgrammaticScroll,
|
|
22087
|
+
lastScrollPosition: this.lastScrollPosition
|
|
22088
|
+
});
|
|
21917
22089
|
// Update scroll progress for smooth bar animation
|
|
21918
22090
|
const containerHeight = container.clientHeight;
|
|
21919
22091
|
const scrollHeight = container.scrollHeight;
|
|
@@ -21922,11 +22094,13 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21922
22094
|
this.scrollProgress.set(Math.min(100, Math.max(0, progress)));
|
|
21923
22095
|
// Skip header state updates during programmatic scrolling or cooldown
|
|
21924
22096
|
if (this.isProgrammaticScroll) {
|
|
22097
|
+
console.log('[SCROLL DEBUG] Skipping - programmatic scroll');
|
|
21925
22098
|
return;
|
|
21926
22099
|
}
|
|
21927
22100
|
const now = Date.now();
|
|
21928
22101
|
const timeSinceLastChange = now - this.lastStateChangeTime;
|
|
21929
22102
|
if (timeSinceLastChange < this.STATE_CHANGE_COOLDOWN) {
|
|
22103
|
+
console.log('[SCROLL DEBUG] Skipping - within cooldown', { timeSinceLastChange });
|
|
21930
22104
|
return;
|
|
21931
22105
|
}
|
|
21932
22106
|
if (this.scrollTimeout) {
|
|
@@ -21939,11 +22113,14 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
21939
22113
|
let newState = currentState;
|
|
21940
22114
|
if (!currentState && scrollPosition > COLLAPSE_THRESHOLD) {
|
|
21941
22115
|
newState = true;
|
|
22116
|
+
console.log('[SCROLL DEBUG] Should collapse header', { scrollPosition, COLLAPSE_THRESHOLD });
|
|
21942
22117
|
}
|
|
21943
22118
|
else if (currentState && scrollPosition < EXPAND_THRESHOLD) {
|
|
21944
22119
|
newState = false;
|
|
22120
|
+
console.log('[SCROLL DEBUG] Should expand header', { scrollPosition, EXPAND_THRESHOLD });
|
|
21945
22121
|
}
|
|
21946
22122
|
if (newState !== currentState) {
|
|
22123
|
+
console.log('[SCROLL DEBUG] Changing header state', { from: currentState, to: newState });
|
|
21947
22124
|
this.isScrolled.set(newState);
|
|
21948
22125
|
this.lastStateChangeTime = Date.now();
|
|
21949
22126
|
}
|
|
@@ -22120,7 +22297,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22120
22297
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dashboardContainer = _t.first);
|
|
22121
22298
|
} }, hostBindings: function SymphiqFunnelAnalysisDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
22122
22299
|
i0.ɵɵlistener("scroll", function SymphiqFunnelAnalysisDashboardComponent_scroll_HostBindingHandler($event) { return ctx.onScroll($event); }, i0.ɵɵresolveWindow);
|
|
22123
|
-
} }, inputs: { requestedByUser: [1, "requestedByUser"], viewMode: [1, "viewMode"], funnelAnalysis: [1, "funnelAnalysis"], embedded: [1, "embedded"], scrollContainerId: [1, "scrollContainerId"], isLoading: [1, "isLoading"] }, decls: 88, vars: 102, consts: [["dashboardContainer", ""], [1, "bg-transparent"], [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, "absolute", "inset-0", 3, "ngClass"], [1, "absolute", "inset-0", "opacity-[0.03]", "z-20", 2, "background-image", "url('data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23000000' fill-opacity='1'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E')"], [1, "absolute", "top-0", "right-0", "w-[800px]", "h-[800px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "absolute", "bottom-0", "left-0", "w-[600px]", "h-[600px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "absolute", "top-1/2", "left-1/2", "-translate-x-1/2", "-translate-y-1/2", "w-[700px]", "h-[700px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "h-full", "transition-all", "duration-200", "ease-out", 3, "ngClass"], [1, "sticky", "top-0", "z-50", "animate-fade-in", 2, "animation-delay", "0s"], [1, "transition-all", "duration-300", "ease-in-out", "overflow-hidden"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8", "py-6", "sm:py-8"], [1, "flex", "flex-col", "sm:flex-row", "items-start", "sm:items-center", "justify-between", "gap-3", "sm:gap-0"], [1, "flex-1"], [1, "flex", "items-center", "gap-3"], [1, "text-2xl", "sm:text-3xl", "font-bold", "mb-2", "bg-gradient-to-r", "from-blue-600", "via-purple-600", "to-indigo-600", "bg-clip-text", "text-transparent"], ["title", "Refreshing data...", 1, "animate-spin", "w-4", "h-4", "border-2", "border-blue-500/30", "border-t-blue-500", "rounded-full"], [1, "flex", "flex-wrap", "items-center", "justify-between", "gap-3", "sm:gap-4"], [1, "text-sm", "sm:text-base"], [1, "flex", "items-center", "gap-4"], ["type", "button", "title", "Search (/ or Cmd+K)", 1, "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"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"], [1, "flex", "items-center", "gap-2"], ["type", "button", 1, "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"], [1, "flex", "items-center", "gap-2", "sm:gap-3", "whitespace-nowrap"], [1, "text-xs", "sm:text-sm", "font-medium"], [3, "click", "mousedown", "pointerdown"], [1, "px-3", "sm:px-4", "py-1.5", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-colors", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "flex", "flex-col", "gap-4", "min-w-[180px]"], [1, "text-left", "sm:text-right"], [1, "text-xs", "sm:text-sm"], [1, "text-sm", "sm:text-base", "font-medium"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8", "py-3"], [1, "flex", "items-center", "justify-between", "gap-4"], [1, "flex", "items-center", "gap-4", "flex-1", "min-w-0"], [1, "text-lg", "font-bold", "truncate", "bg-gradient-to-r", "from-blue-600", "via-purple-600", "to-indigo-600", "bg-clip-text", "text-transparent"], [1, "hidden", "lg:flex", "items-center", "gap-3", "px-4", "py-1.5", "rounded-lg", 3, "ngClass"], ["type", "button", "title", "Search (/ or Cmd+K)", 1, "p-2", "rounded-lg", "transition-all", "duration-200", "hover:scale-110", 3, "click"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["type", "button", 1, "p-2", "rounded-lg", "transition-all", "duration-200", "hover:scale-110", 3, "click", "title"], [1, "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-colors", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [1, "sticky", "top-[var(--header-height)]", "z-40", "border-b", "backdrop-blur-md", "animate-slide-up-fade", 3, "ngClass"], [1, "fixed", "right-6", "top-1/2", "-translate-y-1/2", "z-40", "hidden", "xl:flex", "flex-col", "gap-3"], [1, "w-3", "h-3", "rounded-full", "transition-all", "duration-200", "hover:scale-150", "active:scale-100", 3, "title", "ngClass"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8"], [1, "pt-8", "sm:pt-12", "pb-16", "sm:pb-24"], ["id", "overall-section", 1, "animate-fade-in-up", "mb-20", "sm:mb-28", 2, "animation-delay", "0.1s"], [3, "isLightMode"], [3, "resultSelected", "isLightMode"], [3, "expandedChange", "scrollToTop", "toggleView", "isLightMode", "isCompactMode", "isExpanded"], [3, "navigate", "isLightMode", "sections", "activeSection"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 6h16M4 12h16M4 18h16"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"], [1, "text-xs", "font-medium"], [1, "text-sm", "font-bold"], [1, "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "flex-shrink-0", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "flex-1", "min-w-0"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "text-sm", "font-semibold", "truncate", 3, "ngClass"], [1, "px-2", "py-0.5", "rounded", "text-xs", "font-medium", "uppercase", "border", "flex-shrink-0", 3, "ngClass"], ["title", "Clear search", 1, "p-2", "rounded-lg", "transition-colors", "flex-shrink-0", 3, "click", "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "w-3", "h-3", "rounded-full", "transition-all", "duration-200", "hover:scale-150", "active:scale-100", 3, "click", "title", "ngClass"], [1, "rounded-xl", "border", "p-6", "sm:p-8", "animate-pulse", 3, "ngClass"], [3, "assessment", "revenueMetric", "charts", "metrics", "isLightMode", "isLoading", "isCompactMode", "isChartsLoading"], [1, "space-y-6"], [3, "width", "height", "isLightMode"], [1, "flex-1", "space-y-2"], [1, "space-y-2"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-4", "mt-6"], [1, "relative", "mb-16", "sm:mb-20", "animate-fade-in", 2, "animation-delay", "0.15s"], ["id", "insights-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at center, black 0%, transparent 70%)", 3, "ngClass"], [1, "relative"], [1, "flex", "items-center", "justify-between", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.2s"], [1, "pl-4", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"], [1, "text-xl", "sm:text-2xl", "font-bold"], [1, "masonry-grid"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-3", "gap-4"], ["aria-hidden", "true", 1, "absolute", "inset-0", "flex", "items-center"], [1, "w-full", "h-px", "bg-gradient-to-r", 3, "ngClass"], [1, "relative", "flex", "justify-center"], [1, "px-4", "py-2", "rounded-full", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "rounded-xl", "border", "p-6", "animate-pulse", "min-h-[280px]", 3, "ngClass"], [1, "space-y-4"], [1, "flex", "items-center", "gap-3", "mb-4"], [1, "mt-6", "space-y-2"], [1, "flex", "gap-2", "mt-4"], [1, "animate-fade-in-up", 3, "class", "animation-delay", "libSymphiqSearchHighlight", "highlightId"], [1, "animate-fade-in-up", 3, "libSymphiqSearchHighlight", "highlightId"], [3, "insight", "allMetrics", "charts", "allCharts", "isLightMode", "viewMode", "isCompactMode"], [1, "animate-fade-in-up", 3, "animation-delay", "libSymphiqSearchHighlight", "highlightId"], [1, "relative", "mb-14", "sm:mb-24", "mt-24", "sm:mt-32", "animate-fade-in", 2, "animation-delay", "0.35s"], ["id", "metrics-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at top right, black 0%, transparent 70%)", 3, "ngClass"], [1, "flex", "flex-col", "gap-4", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.4s"], [1, "flex", "items-center", "justify-between"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"], [1, "hidden", "sm:flex", "gap-2", "sm:gap-3", "items-center", "relative"], [1, "absolute", "-right-2", "top-1/2", "-translate-y-1/2", "z-10"], [1, "px-3", "sm:px-4", "py-2", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-all", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [1, "px-3", "sm:px-4", "py-2", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "transition-all", "flex", "items-center", "gap-2", "cursor-pointer", "hover:scale-105", "active:scale-95", 3, "click", "title"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4"], [1, "sm:hidden", "-mx-6", "px-6"], [1, "flex", "gap-2", "overflow-x-auto", "pb-2", "snap-x", "snap-mandatory", "scrollbar-hide"], [1, "space-y-8", "sm:space-y-10"], [1, "space-y-8", "sm:space-y-10", 3, "animate-content-change", "transition-opacity-slow"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"], [1, "w-4", "h-4", "border-2", "border-blue-500/30", "border-t-blue-500", "rounded-full", "animate-spin"], ["disabled", "", 1, "font-semibold", 3, "value"], [1, "px-4", "py-2", "rounded-full", "text-xs", "font-medium", "whitespace-nowrap", "transition-all", "duration-200", "flex-shrink-0", "snap-start", "active:scale-95", 3, "ngClass", "opacity-70"], [1, "px-4", "py-2", "rounded-full", "text-xs", "font-medium", "whitespace-nowrap", "transition-all", "duration-200", "flex-shrink-0", "snap-start", "active:scale-95", 3, "click", "ngClass"], [1, "rounded-xl", "border", "p-6", "animate-pulse", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "mb-4"], [1, "grid", "grid-cols-2", "md:grid-cols-4", "gap-4", "mt-6"], [1, "rounded-xl", "p-12", "border", "text-center", "animate-fade-in", 3, "ngClass"], [1, "w-full", "animate-fade-in-up", 3, "libSymphiqSearchHighlight", "highlightId"], [3, "metric", "insights", "charts", "allCharts", "analysis", "isLightMode", "viewMode", "isCompactMode"], [1, "bento-grid", "mt-4"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-4", "gap-3", "sm:gap-4", "mt-4"], [1, "animate-fade-in-up", 3, "class", "animation-delay"], [1, "animate-fade-in-up"], [1, "h-full", 3, "metric", "insights", "charts", "allCharts", "analysis", "isLightMode", "viewMode", "isCompactMode"], [1, "animate-fade-in-up", 3, "animation-delay"], [1, "rounded-xl", "border", "p-6", "animate-pulse", "min-h-[240px]", 3, "ngClass"], [1, "flex", "items-center", "gap-3", "mt-4"], [1, "mt-4"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-16", "h-16", "mx-auto", "mb-4", 3, "ngClass"], [1, "text-lg", "font-semibold", "mb-2", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "relative", "mb-16", "sm:mb-20", "mt-28", "sm:mt-36", "animate-fade-in", 2, "animation-delay", "0.65s"], ["id", "breakdowns-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at bottom left, black 0%, transparent 70%)", 3, "ngClass"], [1, "flex", "flex-col", "sm:flex-row", "sm:items-center", "justify-between", "gap-4", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.7s"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], [1, "relative", "inline-block", 3, "click", "mousedown", "pointerdown"], [1, "px-3", "py-2", "text-sm", "rounded-lg", "border", "transition-all", "duration-200", "cursor-pointer", "focus:ring-2", "focus:ring-blue-500", "focus:outline-none", 3, "ngModelChange", "ngModel", "ngClass"], [1, "space-y-6", 3, "animate-content-change", "transition-opacity-slow"], [1, "w-4", "h-4", "border-2", "border-purple-500/30", "border-t-purple-500", "rounded-full", "animate-spin"], [1, "space-y-3"], [1, "flex", "items-center", "justify-between", "p-3", "rounded-lg", 3, "ngClass"], [3, "breakdown", "charts", "isLightMode", "isCompactMode"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], [1, "relative", "mb-16", "sm:mb-20", "mt-28", "sm:mt-36", "animate-fade-in", 2, "animation-delay", "0.85s"], ["id", "competitive-section", 1, "relative"], [1, "flex", "items-center", "justify-between", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.9s"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"], [1, "hidden", "sm:block", "relative"], [3, "metrics", "allCharts", "isLightMode", "isCompactMode"], [1, "w-4", "h-4", "border-2", "border-indigo-500/30", "border-t-indigo-500", "rounded-full", "animate-spin"], [1, "grid", "grid-cols-1", "md:grid-cols-3", "gap-4", "mt-6"]], template: function SymphiqFunnelAnalysisDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
22300
|
+
} }, inputs: { requestedByUser: [1, "requestedByUser"], viewMode: [1, "viewMode"], funnelAnalysis: [1, "funnelAnalysis"], embedded: [1, "embedded"], scrollContainerId: [1, "scrollContainerId"], isLoading: [1, "isLoading"], useSampleData: [1, "useSampleData"] }, decls: 88, vars: 102, consts: [["dashboardContainer", ""], [1, "bg-transparent"], [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, "absolute", "inset-0", 3, "ngClass"], [1, "absolute", "inset-0", "opacity-[0.03]", "z-20", 2, "background-image", "url('data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23000000' fill-opacity='1'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E')"], [1, "absolute", "top-0", "right-0", "w-[800px]", "h-[800px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "absolute", "bottom-0", "left-0", "w-[600px]", "h-[600px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "absolute", "top-1/2", "left-1/2", "-translate-x-1/2", "-translate-y-1/2", "w-[700px]", "h-[700px]", "rounded-full", "blur-3xl", "z-0", 3, "ngClass"], [1, "h-full", "transition-all", "duration-200", "ease-out", 3, "ngClass"], [1, "sticky", "top-0", "z-50", "animate-fade-in", 2, "animation-delay", "0s"], [1, "transition-all", "duration-300", "ease-in-out", "overflow-hidden"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8", "py-6", "sm:py-8"], [1, "flex", "flex-col", "sm:flex-row", "items-start", "sm:items-center", "justify-between", "gap-3", "sm:gap-0"], [1, "flex-1"], [1, "flex", "items-center", "gap-3"], [1, "text-2xl", "sm:text-3xl", "font-bold", "mb-2", "bg-gradient-to-r", "from-blue-600", "via-purple-600", "to-indigo-600", "bg-clip-text", "text-transparent"], ["title", "Refreshing data...", 1, "animate-spin", "w-4", "h-4", "border-2", "border-blue-500/30", "border-t-blue-500", "rounded-full"], [1, "flex", "flex-wrap", "items-center", "justify-between", "gap-3", "sm:gap-4"], [1, "text-sm", "sm:text-base"], [1, "flex", "items-center", "gap-4"], ["type", "button", "title", "Search (/ or Cmd+K)", 1, "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"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"], [1, "flex", "items-center", "gap-2"], ["type", "button", 1, "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"], [1, "flex", "items-center", "gap-2", "sm:gap-3", "whitespace-nowrap"], [1, "text-xs", "sm:text-sm", "font-medium"], [3, "click", "mousedown", "pointerdown"], [1, "px-3", "sm:px-4", "py-1.5", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-colors", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "flex", "flex-col", "gap-4", "min-w-[180px]"], [1, "text-left", "sm:text-right"], [1, "text-xs", "sm:text-sm"], [1, "text-sm", "sm:text-base", "font-medium"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8", "py-3"], [1, "flex", "items-center", "justify-between", "gap-4"], [1, "flex", "items-center", "gap-4", "flex-1", "min-w-0"], [1, "text-lg", "font-bold", "truncate", "bg-gradient-to-r", "from-blue-600", "via-purple-600", "to-indigo-600", "bg-clip-text", "text-transparent"], [1, "hidden", "lg:flex", "items-center", "gap-3", "px-4", "py-1.5", "rounded-lg", 3, "ngClass"], ["type", "button", "title", "Search (/ or Cmd+K)", 1, "p-2", "rounded-lg", "transition-all", "duration-200", "hover:scale-110", 3, "click"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["type", "button", 1, "p-2", "rounded-lg", "transition-all", "duration-200", "hover:scale-110", 3, "click", "title"], [1, "px-3", "py-1.5", "rounded-lg", "text-xs", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-colors", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [1, "sticky", "top-[var(--header-height)]", "z-40", "border-b", "backdrop-blur-md", "animate-slide-up-fade", 3, "ngClass"], [1, "fixed", "right-6", "top-1/2", "-translate-y-1/2", "z-40", "hidden", "xl:flex", "flex-col", "gap-3"], [1, "w-3", "h-3", "rounded-full", "transition-all", "duration-200", "hover:scale-150", "active:scale-100", 3, "title", "ngClass"], [1, "max-w-7xl", "mx-auto", "px-6", "sm:px-8"], [1, "pt-8", "sm:pt-12", "pb-16", "sm:pb-24"], ["id", "overall-section", 1, "animate-fade-in-up", "mb-20", "sm:mb-28", 2, "animation-delay", "0.1s"], [3, "isLightMode"], [3, "resultSelected", "isLightMode"], [3, "expandedChange", "scrollToTop", "toggleView", "isLightMode", "isCompactMode", "isExpanded"], [3, "navigate", "isLightMode", "sections", "activeSection"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 6h16M4 12h16M4 18h16"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"], [1, "text-xs", "font-medium"], [1, "text-sm", "font-bold"], [1, "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "flex-shrink-0", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "flex-1", "min-w-0"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "text-sm", "font-semibold", "truncate", 3, "ngClass"], [1, "px-2", "py-0.5", "rounded", "text-xs", "font-medium", "uppercase", "border", "flex-shrink-0", 3, "ngClass"], ["title", "Clear search", 1, "p-2", "rounded-lg", "transition-colors", "flex-shrink-0", 3, "click", "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "w-3", "h-3", "rounded-full", "transition-all", "duration-200", "hover:scale-150", "active:scale-100", 3, "click", "title", "ngClass"], [1, "rounded-xl", "border", "p-6", "sm:p-8", "animate-pulse", 3, "ngClass"], [3, "assessment", "revenueMetric", "charts", "metrics", "isLightMode", "isLoading", "isCompactMode", "isChartsLoading"], [1, "space-y-6"], [3, "width", "height", "isLightMode"], [1, "flex-1", "space-y-2"], [1, "space-y-2"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-4", "mt-6"], [1, "relative", "mb-16", "sm:mb-20", "animate-fade-in", 2, "animation-delay", "0.15s"], ["id", "insights-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at center, black 0%, transparent 70%)", 3, "ngClass"], [1, "relative"], [1, "flex", "items-center", "justify-between", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.2s"], [1, "pl-4", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"], [1, "text-xl", "sm:text-2xl", "font-bold"], [1, "masonry-grid"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-3", "gap-4"], ["aria-hidden", "true", 1, "absolute", "inset-0", "flex", "items-center"], [1, "w-full", "h-px", "bg-gradient-to-r", 3, "ngClass"], [1, "relative", "flex", "justify-center"], [1, "px-4", "py-2", "rounded-full", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 10V3L4 14h7v7l9-11h-7z"], [1, "rounded-xl", "border", "p-6", "animate-pulse", "min-h-[280px]", 3, "ngClass"], [1, "space-y-4"], [1, "flex", "items-center", "gap-3", "mb-4"], [1, "mt-6", "space-y-2"], [1, "flex", "gap-2", "mt-4"], [1, "animate-fade-in-up", 3, "class", "animation-delay", "libSymphiqSearchHighlight", "highlightId"], [1, "animate-fade-in-up", 3, "libSymphiqSearchHighlight", "highlightId"], [3, "insight", "allMetrics", "charts", "allCharts", "isLightMode", "viewMode", "isCompactMode"], [1, "animate-fade-in-up", 3, "animation-delay", "libSymphiqSearchHighlight", "highlightId"], [1, "relative", "mb-14", "sm:mb-24", "mt-24", "sm:mt-32", "animate-fade-in", 2, "animation-delay", "0.35s"], ["id", "metrics-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at top right, black 0%, transparent 70%)", 3, "ngClass"], [1, "flex", "flex-col", "gap-4", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.4s"], [1, "flex", "items-center", "justify-between"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"], [1, "hidden", "sm:flex", "gap-2", "sm:gap-3", "items-center", "relative"], [1, "absolute", "-right-2", "top-1/2", "-translate-y-1/2", "z-10"], [1, "px-3", "sm:px-4", "py-2", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "focus:border-transparent", "transition-all", "duration-200", "cursor-pointer", 3, "ngModelChange", "ngModel"], [1, "px-3", "sm:px-4", "py-2", "rounded-lg", "text-xs", "sm:text-sm", "font-medium", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "transition-all", "flex", "items-center", "gap-2", "cursor-pointer", "hover:scale-105", "active:scale-95", 3, "click", "title"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4"], [1, "sm:hidden", "-mx-6", "px-6"], [1, "flex", "gap-2", "overflow-x-auto", "pb-2", "snap-x", "snap-mandatory", "scrollbar-hide"], [1, "space-y-8", "sm:space-y-10"], [1, "space-y-8", "sm:space-y-10", 3, "animate-content-change", "transition-opacity-slow"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"], [1, "w-4", "h-4", "border-2", "border-blue-500/30", "border-t-blue-500", "rounded-full", "animate-spin"], ["disabled", "", 1, "font-semibold", 3, "value"], [1, "px-4", "py-2", "rounded-full", "text-xs", "font-medium", "whitespace-nowrap", "transition-all", "duration-200", "flex-shrink-0", "snap-start", "active:scale-95", 3, "ngClass", "opacity-70"], [1, "px-4", "py-2", "rounded-full", "text-xs", "font-medium", "whitespace-nowrap", "transition-all", "duration-200", "flex-shrink-0", "snap-start", "active:scale-95", 3, "click", "ngClass"], [1, "rounded-xl", "border", "p-6", "animate-pulse", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "mb-4"], [1, "grid", "grid-cols-2", "md:grid-cols-4", "gap-4", "mt-6"], [1, "rounded-xl", "p-12", "border", "text-center", "animate-fade-in", 3, "ngClass"], [1, "w-full", "animate-fade-in-up", 3, "libSymphiqSearchHighlight", "highlightId"], [3, "metric", "insights", "charts", "allCharts", "analysis", "isLightMode", "viewMode", "isCompactMode"], [1, "bento-grid", "mt-4"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-4", "gap-3", "sm:gap-4", "mt-4"], [1, "animate-fade-in-up", 3, "class", "animation-delay"], [1, "animate-fade-in-up"], [1, "h-full", 3, "metric", "insights", "charts", "allCharts", "analysis", "isLightMode", "viewMode", "isCompactMode"], [1, "animate-fade-in-up", 3, "animation-delay"], [1, "rounded-xl", "border", "p-6", "animate-pulse", "min-h-[240px]", 3, "ngClass"], [1, "flex", "items-center", "gap-3", "mt-4"], [1, "mt-4"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-16", "h-16", "mx-auto", "mb-4", 3, "ngClass"], [1, "text-lg", "font-semibold", "mb-2", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "relative", "mb-16", "sm:mb-20", "mt-28", "sm:mt-36", "animate-fade-in", 2, "animation-delay", "0.65s"], ["id", "breakdowns-section", 1, "relative"], [1, "absolute", "inset-0", "-mx-6", "sm:-mx-8", "-mt-8", "rounded-3xl", "opacity-30", "backdrop-blur-sm", 2, "mask-image", "radial-gradient(ellipse at bottom left, black 0%, transparent 70%)", 3, "ngClass"], [1, "flex", "flex-col", "sm:flex-row", "sm:items-center", "justify-between", "gap-4", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.7s"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], [1, "relative", "inline-block", 3, "click", "mousedown", "pointerdown"], [1, "px-3", "py-2", "text-sm", "rounded-lg", "border", "transition-all", "duration-200", "cursor-pointer", "focus:ring-2", "focus:ring-blue-500", "focus:outline-none", 3, "ngModelChange", "ngModel", "ngClass"], [1, "space-y-6", 3, "animate-content-change", "transition-opacity-slow"], [1, "w-4", "h-4", "border-2", "border-purple-500/30", "border-t-purple-500", "rounded-full", "animate-spin"], [1, "space-y-3"], [1, "flex", "items-center", "justify-between", "p-3", "rounded-lg", 3, "ngClass"], [3, "breakdown", "charts", "isLightMode", "isCompactMode"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], [1, "relative", "mb-16", "sm:mb-20", "mt-28", "sm:mt-36", "animate-fade-in", 2, "animation-delay", "0.85s"], ["id", "competitive-section", 1, "relative"], [1, "flex", "items-center", "justify-between", "mb-6", "sm:mb-8", "animate-fade-in", 2, "animation-delay", "0.9s"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"], [1, "hidden", "sm:block", "relative"], [3, "metrics", "allCharts", "isLightMode", "isCompactMode"], [1, "w-4", "h-4", "border-2", "border-indigo-500/30", "border-t-indigo-500", "rounded-full", "animate-spin"], [1, "grid", "grid-cols-1", "md:grid-cols-3", "gap-4", "mt-6"]], template: function SymphiqFunnelAnalysisDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
22124
22301
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
22125
22302
|
i0.ɵɵelementStart(0, "div", 1, 0);
|
|
22126
22303
|
i0.ɵɵelement(2, "div", 2);
|
|
@@ -22250,7 +22427,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22250
22427
|
i0.ɵɵadvance();
|
|
22251
22428
|
i0.ɵɵclassProp("pointer-events-none", ctx.isScrolled())("pointer-events-auto", !ctx.isScrolled());
|
|
22252
22429
|
i0.ɵɵadvance(5);
|
|
22253
|
-
i0.ɵɵtextInterpolate((tmp_21_0 = ctx.
|
|
22430
|
+
i0.ɵɵtextInterpolate((tmp_21_0 = ctx.analysisData()) == null ? null : tmp_21_0.title);
|
|
22254
22431
|
i0.ɵɵadvance();
|
|
22255
22432
|
i0.ɵɵconditional(ctx.isLoading() && !ctx.isShowingLoader() ? 19 : -1);
|
|
22256
22433
|
i0.ɵɵadvance(2);
|
|
@@ -22285,7 +22462,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22285
22462
|
i0.ɵɵadvance();
|
|
22286
22463
|
i0.ɵɵclassProp("pointer-events-none", !ctx.isScrolled())("pointer-events-auto", ctx.isScrolled());
|
|
22287
22464
|
i0.ɵɵadvance(4);
|
|
22288
|
-
i0.ɵɵtextInterpolate((tmp_43_0 = ctx.
|
|
22465
|
+
i0.ɵɵtextInterpolate((tmp_43_0 = ctx.analysisData()) == null ? null : tmp_43_0.title);
|
|
22289
22466
|
i0.ɵɵadvance();
|
|
22290
22467
|
i0.ɵɵconditional(ctx.revenueMetric() ? 57 : -1);
|
|
22291
22468
|
i0.ɵɵadvance(2);
|
|
@@ -22431,7 +22608,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22431
22608
|
<div class="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 sm:gap-0">
|
|
22432
22609
|
<div class="flex-1">
|
|
22433
22610
|
<div class="flex items-center gap-3">
|
|
22434
|
-
<h1 class="text-2xl sm:text-3xl font-bold mb-2 bg-gradient-to-r from-blue-600 via-purple-600 to-indigo-600 bg-clip-text text-transparent">{{
|
|
22611
|
+
<h1 class="text-2xl sm:text-3xl font-bold mb-2 bg-gradient-to-r from-blue-600 via-purple-600 to-indigo-600 bg-clip-text text-transparent">{{analysisData()?.title}}</h1>
|
|
22435
22612
|
@if (isLoading() && !isShowingLoader()) {
|
|
22436
22613
|
<!-- Subtle refresh indicator -->
|
|
22437
22614
|
<div class="animate-spin w-4 h-4 border-2 border-blue-500/30 border-t-blue-500 rounded-full" title="Refreshing data..."></div>
|
|
@@ -22516,7 +22693,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22516
22693
|
[class.pointer-events-auto]="isScrolled()">
|
|
22517
22694
|
<div class="flex items-center justify-between gap-4">
|
|
22518
22695
|
<div class="flex items-center gap-4 flex-1 min-w-0">
|
|
22519
|
-
<h1 class="text-lg font-bold truncate bg-gradient-to-r from-blue-600 via-purple-600 to-indigo-600 bg-clip-text text-transparent">{{
|
|
22696
|
+
<h1 class="text-lg font-bold truncate bg-gradient-to-r from-blue-600 via-purple-600 to-indigo-600 bg-clip-text text-transparent">{{analysisData()?.title}}</h1>
|
|
22520
22697
|
@if (revenueMetric()) {
|
|
22521
22698
|
<div class="hidden lg:flex items-center gap-3 px-4 py-1.5 rounded-lg" [ngClass]="isLightMode() ? 'bg-emerald-50 border border-emerald-200' : 'bg-emerald-500/10 border border-emerald-500/20'">
|
|
22522
22699
|
<span [class]="metaLabelClass()" class="text-xs font-medium">Revenue:</span>
|
|
@@ -22919,7 +23096,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22919
23096
|
[insights]="insights()"
|
|
22920
23097
|
[charts]="chartsForMetric(funnelGroup.funnelMetric)"
|
|
22921
23098
|
[allCharts]="allCharts()"
|
|
22922
|
-
[analysis]="
|
|
23099
|
+
[analysis]="analysisData()"
|
|
22923
23100
|
[isLightMode]="isLightMode()"
|
|
22924
23101
|
[viewMode]="viewMode()"
|
|
22925
23102
|
[isCompactMode]="viewModeService.isCompact()" />
|
|
@@ -22939,7 +23116,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22939
23116
|
[insights]="insights()"
|
|
22940
23117
|
[charts]="chartsForMetric(metric)"
|
|
22941
23118
|
[allCharts]="allCharts()"
|
|
22942
|
-
[analysis]="
|
|
23119
|
+
[analysis]="analysisData()"
|
|
22943
23120
|
[isLightMode]="isLightMode()"
|
|
22944
23121
|
[viewMode]="viewMode()"
|
|
22945
23122
|
[isCompactMode]="false" />
|
|
@@ -22956,7 +23133,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
22956
23133
|
[insights]="insights()"
|
|
22957
23134
|
[charts]="chartsForMetric(metric)"
|
|
22958
23135
|
[allCharts]="allCharts()"
|
|
22959
|
-
[analysis]="
|
|
23136
|
+
[analysis]="analysisData()"
|
|
22960
23137
|
[isLightMode]="isLightMode()"
|
|
22961
23138
|
[viewMode]="viewMode()"
|
|
22962
23139
|
[isCompactMode]="true" />
|
|
@@ -23217,7 +23394,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
23217
23394
|
}], dashboardContainer: [{
|
|
23218
23395
|
type: ViewChild,
|
|
23219
23396
|
args: ['dashboardContainer', { static: false }]
|
|
23220
|
-
}], requestedByUser: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestedByUser", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], funnelAnalysis: [{ type: i0.Input, args: [{ isSignal: true, alias: "funnelAnalysis", required: false }] }], embedded: [{ type: i0.Input, args: [{ isSignal: true, alias: "embedded", required: false }] }], scrollContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollContainerId", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], onScroll: [{
|
|
23397
|
+
}], requestedByUser: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestedByUser", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], funnelAnalysis: [{ type: i0.Input, args: [{ isSignal: true, alias: "funnelAnalysis", required: false }] }], embedded: [{ type: i0.Input, args: [{ isSignal: true, alias: "embedded", required: false }] }], scrollContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollContainerId", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], useSampleData: [{ type: i0.Input, args: [{ isSignal: true, alias: "useSampleData", required: false }] }], onScroll: [{
|
|
23221
23398
|
type: HostListener,
|
|
23222
23399
|
args: ['window:scroll', ['$event']]
|
|
23223
23400
|
}] }); })();
|
|
@@ -23619,20 +23796,30 @@ function SymphiqFunnelAnalysisPreviewComponent_Conditional_24_Template(rf, ctx)
|
|
|
23619
23796
|
class SymphiqFunnelAnalysisPreviewComponent {
|
|
23620
23797
|
constructor() {
|
|
23621
23798
|
// Inputs
|
|
23622
|
-
this.analysisInput = input
|
|
23799
|
+
this.analysisInput = input(undefined, ...(ngDevMode ? [{ debugName: "analysisInput", alias: 'funnelAnalysis' }] : [{ alias: 'funnelAnalysis' }]));
|
|
23623
23800
|
this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
|
|
23801
|
+
this.useSampleData = input(false, ...(ngDevMode ? [{ debugName: "useSampleData" }] : []));
|
|
23802
|
+
this.scrollContainerId = input(undefined, ...(ngDevMode ? [{ debugName: "scrollContainerId" }] : []));
|
|
23624
23803
|
// Computed theme
|
|
23625
23804
|
this.isLightMode = computed(() => this.viewMode() === ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "isLightMode" }] : []));
|
|
23626
23805
|
// Outputs
|
|
23627
23806
|
this.onViewAnalysis = output();
|
|
23628
23807
|
// Services
|
|
23629
23808
|
this.tooltipDataService = inject(TooltipDataService);
|
|
23809
|
+
this.tooltipService = inject(TooltipService);
|
|
23630
23810
|
this.competitiveScoreService = inject(CompetitiveScoreService);
|
|
23811
|
+
// Analysis data - use sample data if useSampleData is true, otherwise use provided data
|
|
23812
|
+
this.analysisData = computed(() => {
|
|
23813
|
+
if (this.useSampleData()) {
|
|
23814
|
+
return FUNNEL_ANALYSIS;
|
|
23815
|
+
}
|
|
23816
|
+
return this.analysisInput();
|
|
23817
|
+
}, ...(ngDevMode ? [{ debugName: "analysisData" }] : []));
|
|
23631
23818
|
// Normalized analysis data
|
|
23632
|
-
this.title = computed(() => this.
|
|
23819
|
+
this.title = computed(() => this.analysisData()?.title || '', ...(ngDevMode ? [{ debugName: "title" }] : []));
|
|
23633
23820
|
this.analysis = computed(() => {
|
|
23634
|
-
const rawAnalysis = this.
|
|
23635
|
-
return normalizeToV3(rawAnalysis
|
|
23821
|
+
const rawAnalysis = this.analysisData();
|
|
23822
|
+
return rawAnalysis ? normalizeToV3(rawAnalysis.performanceOverviewStructured) : { overallAssessment: {}, insights: [], metrics: [], breakdowns: [], charts: [] };
|
|
23636
23823
|
}, ...(ngDevMode ? [{ debugName: "analysis" }] : []));
|
|
23637
23824
|
this.overallAssessment = computed(() => this.analysis().overallAssessment || {}, ...(ngDevMode ? [{ debugName: "overallAssessment" }] : []));
|
|
23638
23825
|
this.metrics = computed(() => this.analysis().metrics || [], ...(ngDevMode ? [{ debugName: "metrics" }] : []));
|
|
@@ -23829,6 +24016,60 @@ class SymphiqFunnelAnalysisPreviewComponent {
|
|
|
23829
24016
|
}, ...(ngDevMode ? [{ debugName: "statusIconClass" }] : []));
|
|
23830
24017
|
this.insightsCardClass = computed(() => getInsightsCardClasses(this.viewMode()), ...(ngDevMode ? [{ debugName: "insightsCardClass" }] : []));
|
|
23831
24018
|
this.insightsBadgeClass = computed(() => getInsightsBadgeClasses(this.viewMode()), ...(ngDevMode ? [{ debugName: "insightsBadgeClass" }] : []));
|
|
24019
|
+
// Set up scroll container for tooltips when scrollContainerId changes
|
|
24020
|
+
effect(() => {
|
|
24021
|
+
const containerId = this.scrollContainerId();
|
|
24022
|
+
if (containerId) {
|
|
24023
|
+
const setupTooltipScrollContainer = () => {
|
|
24024
|
+
const element = document.getElementById(containerId);
|
|
24025
|
+
if (!element) {
|
|
24026
|
+
return false;
|
|
24027
|
+
}
|
|
24028
|
+
// Check if this is an Ionic ion-content element
|
|
24029
|
+
if (element.tagName.toLowerCase() === 'ion-content') {
|
|
24030
|
+
const ionContent = element;
|
|
24031
|
+
// Get the scrollable element from Ionic
|
|
24032
|
+
if (typeof ionContent.getScrollElement === 'function') {
|
|
24033
|
+
ionContent.getScrollElement().then((scrollElement) => {
|
|
24034
|
+
this.tooltipService.setScrollContainer(scrollElement);
|
|
24035
|
+
}).catch((error) => {
|
|
24036
|
+
console.error('Error getting Ionic scroll element for tooltips:', error);
|
|
24037
|
+
});
|
|
24038
|
+
return true;
|
|
24039
|
+
}
|
|
24040
|
+
else {
|
|
24041
|
+
// Fallback for older Ionic versions
|
|
24042
|
+
this.tooltipService.setScrollContainer(element);
|
|
24043
|
+
return true;
|
|
24044
|
+
}
|
|
24045
|
+
}
|
|
24046
|
+
else {
|
|
24047
|
+
// Regular HTML element
|
|
24048
|
+
this.tooltipService.setScrollContainer(element);
|
|
24049
|
+
return true;
|
|
24050
|
+
}
|
|
24051
|
+
};
|
|
24052
|
+
// Try to set up immediately
|
|
24053
|
+
if (!setupTooltipScrollContainer()) {
|
|
24054
|
+
// If not found, retry with delays (element might not be in DOM yet)
|
|
24055
|
+
let retries = 0;
|
|
24056
|
+
const maxRetries = 10;
|
|
24057
|
+
const retryInterval = setInterval(() => {
|
|
24058
|
+
retries++;
|
|
24059
|
+
if (setupTooltipScrollContainer() || retries >= maxRetries) {
|
|
24060
|
+
clearInterval(retryInterval);
|
|
24061
|
+
if (retries >= maxRetries) {
|
|
24062
|
+
console.warn(`Tooltip scroll container with id "${containerId}" not found after ${maxRetries} retries.`);
|
|
24063
|
+
}
|
|
24064
|
+
}
|
|
24065
|
+
}, 100);
|
|
24066
|
+
}
|
|
24067
|
+
}
|
|
24068
|
+
else {
|
|
24069
|
+
// No scroll container specified, reset to null (use window)
|
|
24070
|
+
this.tooltipService.setScrollContainer(null);
|
|
24071
|
+
}
|
|
24072
|
+
});
|
|
23832
24073
|
}
|
|
23833
24074
|
// Helper methods for metrics
|
|
23834
24075
|
metricMiniCardClass(metric) {
|
|
@@ -23919,8 +24160,8 @@ class SymphiqFunnelAnalysisPreviewComponent {
|
|
|
23919
24160
|
extractChartData(performanceItemId) {
|
|
23920
24161
|
if (!performanceItemId)
|
|
23921
24162
|
return undefined;
|
|
23922
|
-
const analysis = this.
|
|
23923
|
-
const charts = analysis
|
|
24163
|
+
const analysis = this.analysisData();
|
|
24164
|
+
const charts = analysis?.performanceOverviewStructured?.charts || [];
|
|
23924
24165
|
const chart = charts.find((c) => c.performanceItemId === performanceItemId && c.areaChartData);
|
|
23925
24166
|
if (!chart || !chart.areaChartData || !chart.areaChartData.series) {
|
|
23926
24167
|
return undefined;
|
|
@@ -23941,7 +24182,7 @@ class SymphiqFunnelAnalysisPreviewComponent {
|
|
|
23941
24182
|
this.onViewAnalysis.emit();
|
|
23942
24183
|
}
|
|
23943
24184
|
static { this.ɵfac = function SymphiqFunnelAnalysisPreviewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SymphiqFunnelAnalysisPreviewComponent)(); }; }
|
|
23944
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SymphiqFunnelAnalysisPreviewComponent, selectors: [["symphiq-funnel-analysis-preview"]], inputs: { analysisInput: [1, "funnelAnalysis", "analysisInput"], viewMode: [1, "viewMode"] }, outputs: { onViewAnalysis: "onViewAnalysis" }, decls: 34, vars: 40, consts: [[1, "w-full", "sm:max-w-md", "rounded-xl", "border", "shadow-lg", "backdrop-blur-lg", "transition-all", "duration-300", "sm:hover:shadow-xl", "sm:hover:scale-[1.01]", "overflow-hidden"], [1, "px-3", "py-2", "sm:px-4", "sm:py-3", "border-b", "flex", "items-center", "justify-between", "gap-2", "sm:gap-3"], [1, "flex-1", "min-w-0"], [1, "text-sm", "font-bold", "truncate"], [1, "text-xs", "truncate", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-center", "gap-1.5", "sm:gap-2", "flex-shrink-0"], ["tooltipType", "badge", 1, "px-2", "py-1", "rounded", "text-center", "min-w-[44px]", "min-h-[44px]", "flex", "items-center", "justify-center", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "text-lg", "font-bold"], [1, "p-3", "sm:p-4", "space-y-2.5", "sm:space-y-3"], ["tooltipType", "metric", 1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "cursor-help", "active:scale-[0.98]", 3, "class", "libSymphiqTooltip", "tooltipPosition"], [1, "grid", "grid-cols-2", "gap-1.5", "sm:gap-2"], ["tooltipType", "metric", 1, "rounded-lg", "p-1.5", "sm:p-2", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "class", "libSymphiqTooltip", "tooltipPosition"], [1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "class"], [1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]"], [1, "flex", "items-center", "justify-between", "mb-2"], [1, "flex", "items-center", "gap-1.5", "sm:gap-2"], [1, "text-lg"], [1, "text-xs", "sm:text-sm", "font-bold"], ["tooltipType", "competitive", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "class", "animate-pulse", "libSymphiqTooltip", "tooltipPosition"], ["tooltipType", "narrative", 1, "text-xs", "leading-relaxed", "line-clamp-3", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "px-3", "py-1.5", "sm:px-4", "sm:py-2", "border-t"], [1, "w-full", "py-2.5", "sm:py-2", "rounded-lg", "font-semibold", "text-xs", "transition-all", "duration-300", "sm:hover:scale-105", "active:scale-[0.98]", "flex", "items-center", "justify-center", "gap-2", "group", "cursor-pointer", "min-h-[44px]", 3, "click"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3", "transition-transform", "duration-300", "group-hover:translate-x-1"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7l5 5m0 0l-5 5m5-5H6"], ["tooltipType", "metric", 1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "cursor-help", "active:scale-[0.98]", 3, "libSymphiqTooltip", "tooltipPosition"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5", "sm:w-4", "sm:h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "text-xs", "font-semibold"], ["tooltipType", "status", 1, "px-2", "py-1", "rounded", "text-xs", "font-bold", "flex", "items-center", "gap-1", "relative", "z-10", "min-h-[32px]", 3, "mouseenter", "mouseleave", "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-baseline", "justify-between"], [1, "text-lg", "sm:text-xl", "font-bold"], [1, "flex", "items-center", "gap-1"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-3", "h-3"], ["fill-rule", "evenodd", "d", "M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z", "clip-rule", "evenodd"], ["tooltipType", "metric", 1, "rounded-lg", "p-1.5", "sm:p-2", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-center", "justify-between", "mb-1"], [1, "text-xs", "font-medium", "truncate", "flex-1"], [1, "w-2", "h-2", "rounded-full", "flex-shrink-0"], [1, "flex", "items-center", "justify-between"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"], ["tooltipType", "insightsList", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "libSymphiqTooltip", "tooltipPosition"], ["tooltipType", "competitive", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "libSymphiqTooltip", "tooltipPosition"]], template: function SymphiqFunnelAnalysisPreviewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
24185
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SymphiqFunnelAnalysisPreviewComponent, selectors: [["symphiq-funnel-analysis-preview"]], inputs: { analysisInput: [1, "funnelAnalysis", "analysisInput"], viewMode: [1, "viewMode"], useSampleData: [1, "useSampleData"], scrollContainerId: [1, "scrollContainerId"] }, outputs: { onViewAnalysis: "onViewAnalysis" }, decls: 34, vars: 40, consts: [[1, "w-full", "sm:max-w-md", "rounded-xl", "border", "shadow-lg", "backdrop-blur-lg", "transition-all", "duration-300", "sm:hover:shadow-xl", "sm:hover:scale-[1.01]", "overflow-hidden"], [1, "px-3", "py-2", "sm:px-4", "sm:py-3", "border-b", "flex", "items-center", "justify-between", "gap-2", "sm:gap-3"], [1, "flex-1", "min-w-0"], [1, "text-sm", "font-bold", "truncate"], [1, "text-xs", "truncate", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-center", "gap-1.5", "sm:gap-2", "flex-shrink-0"], ["tooltipType", "badge", 1, "px-2", "py-1", "rounded", "text-center", "min-w-[44px]", "min-h-[44px]", "flex", "items-center", "justify-center", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "text-lg", "font-bold"], [1, "p-3", "sm:p-4", "space-y-2.5", "sm:space-y-3"], ["tooltipType", "metric", 1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "cursor-help", "active:scale-[0.98]", 3, "class", "libSymphiqTooltip", "tooltipPosition"], [1, "grid", "grid-cols-2", "gap-1.5", "sm:gap-2"], ["tooltipType", "metric", 1, "rounded-lg", "p-1.5", "sm:p-2", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "class", "libSymphiqTooltip", "tooltipPosition"], [1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "class"], [1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]"], [1, "flex", "items-center", "justify-between", "mb-2"], [1, "flex", "items-center", "gap-1.5", "sm:gap-2"], [1, "text-lg"], [1, "text-xs", "sm:text-sm", "font-bold"], ["tooltipType", "competitive", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "class", "animate-pulse", "libSymphiqTooltip", "tooltipPosition"], ["tooltipType", "narrative", 1, "text-xs", "leading-relaxed", "line-clamp-3", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "px-3", "py-1.5", "sm:px-4", "sm:py-2", "border-t"], [1, "w-full", "py-2.5", "sm:py-2", "rounded-lg", "font-semibold", "text-xs", "transition-all", "duration-300", "sm:hover:scale-105", "active:scale-[0.98]", "flex", "items-center", "justify-center", "gap-2", "group", "cursor-pointer", "min-h-[44px]", 3, "click"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3", "transition-transform", "duration-300", "group-hover:translate-x-1"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7l5 5m0 0l-5 5m5-5H6"], ["tooltipType", "metric", 1, "rounded-lg", "p-2.5", "sm:p-3", "border", "transition-all", "duration-200", "sm:hover:scale-105", "cursor-help", "active:scale-[0.98]", 3, "libSymphiqTooltip", "tooltipPosition"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5", "sm:w-4", "sm:h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "text-xs", "font-semibold"], ["tooltipType", "status", 1, "px-2", "py-1", "rounded", "text-xs", "font-bold", "flex", "items-center", "gap-1", "relative", "z-10", "min-h-[32px]", 3, "mouseenter", "mouseleave", "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-baseline", "justify-between"], [1, "text-lg", "sm:text-xl", "font-bold"], [1, "flex", "items-center", "gap-1"], ["fill", "currentColor", "viewBox", "0 0 20 20", 1, "w-3", "h-3"], ["fill-rule", "evenodd", "d", "M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z", "clip-rule", "evenodd"], ["tooltipType", "metric", 1, "rounded-lg", "p-1.5", "sm:p-2", "border", "transition-all", "duration-200", "sm:hover:scale-105", "active:scale-[0.98]", 3, "libSymphiqTooltip", "tooltipPosition"], [1, "flex", "items-center", "justify-between", "mb-1"], [1, "text-xs", "font-medium", "truncate", "flex-1"], [1, "w-2", "h-2", "rounded-full", "flex-shrink-0"], [1, "flex", "items-center", "justify-between"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"], ["tooltipType", "insightsList", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "libSymphiqTooltip", "tooltipPosition"], ["tooltipType", "competitive", 1, "px-2", "py-0.5", "rounded", "text-xs", "font-bold", 3, "libSymphiqTooltip", "tooltipPosition"]], template: function SymphiqFunnelAnalysisPreviewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
23945
24186
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h3", 3);
|
|
23946
24187
|
i0.ɵɵtext(4, "Funnel Analysis");
|
|
23947
24188
|
i0.ɵɵelementEnd();
|
|
@@ -24203,8 +24444,8 @@ class SymphiqFunnelAnalysisPreviewComponent {
|
|
|
24203
24444
|
<!-- Tooltip Container -->
|
|
24204
24445
|
<symphiq-tooltip-container />
|
|
24205
24446
|
`, styles: ["@keyframes statusPulse{0%,to{opacity:1}50%{opacity:.6}}.status-pulse{animation:statusPulse 2s ease-in-out infinite}\n"] }]
|
|
24206
|
-
}],
|
|
24207
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqFunnelAnalysisPreviewComponent, { className: "SymphiqFunnelAnalysisPreviewComponent", filePath: "lib/components/funnel-analysis-preview/symphiq-funnel-analysis-preview.component.ts", lineNumber:
|
|
24447
|
+
}], () => [], { analysisInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "funnelAnalysis", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], useSampleData: [{ type: i0.Input, args: [{ isSignal: true, alias: "useSampleData", required: false }] }], scrollContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollContainerId", required: false }] }], onViewAnalysis: [{ type: i0.Output, args: ["onViewAnalysis"] }] }); })();
|
|
24448
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqFunnelAnalysisPreviewComponent, { className: "SymphiqFunnelAnalysisPreviewComponent", filePath: "lib/components/funnel-analysis-preview/symphiq-funnel-analysis-preview.component.ts", lineNumber: 216 }); })();
|
|
24208
24449
|
|
|
24209
24450
|
const _c0$3 = ["chartdiv"];
|
|
24210
24451
|
class LineChartComponent {
|