@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.11
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/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.esm.js +30 -24
- package/dist/components/ui/accessibility-demo.js +30 -24
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
- package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
- package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
- package/dist/components/ui/advanced-transition-system-demo.js +110 -64
- package/dist/components/ui/advanced-transition-system.esm.js +166 -122
- package/dist/components/ui/advanced-transition-system.js +166 -122
- package/dist/components/ui/animation/animated-container.esm.js +52 -29
- package/dist/components/ui/animation/animated-container.js +52 -29
- package/dist/components/ui/animation/staggered-container.esm.js +18 -9
- package/dist/components/ui/animation/staggered-container.js +18 -9
- package/dist/components/ui/animation-demo.esm.js +67 -35
- package/dist/components/ui/animation-demo.js +67 -35
- package/dist/components/ui/badge.esm.js +9 -6
- package/dist/components/ui/badge.js +9 -6
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
- package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
- package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
- package/dist/components/ui/border-radius-shadow-demo.js +23 -12
- package/dist/components/ui/button.esm.js +8 -2
- package/dist/components/ui/button.js +8 -2
- package/dist/components/ui/card.esm.js +33 -8
- package/dist/components/ui/card.js +33 -8
- package/dist/components/ui/checkbox.esm.js +3 -3
- package/dist/components/ui/checkbox.js +3 -3
- package/dist/components/ui/color-preview.esm.js +68 -45
- package/dist/components/ui/color-preview.js +68 -45
- package/dist/components/ui/data-display/chart.esm.js +112 -84
- package/dist/components/ui/data-display/chart.js +112 -84
- package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
- package/dist/components/ui/data-display/data-grid-simple.js +1 -1
- package/dist/components/ui/data-display/data-grid.esm.js +80 -67
- package/dist/components/ui/data-display/data-grid.js +80 -67
- package/dist/components/ui/data-display/list.esm.js +53 -45
- package/dist/components/ui/data-display/list.js +53 -45
- package/dist/components/ui/data-display/table.esm.js +62 -54
- package/dist/components/ui/data-display/table.js +62 -54
- package/dist/components/ui/data-display/timeline.esm.js +39 -34
- package/dist/components/ui/data-display/timeline.js +39 -34
- package/dist/components/ui/data-display/tree.esm.js +116 -84
- package/dist/components/ui/data-display/tree.js +116 -84
- package/dist/components/ui/data-display/types.esm.js +389 -364
- package/dist/components/ui/data-display/types.js +389 -364
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
- package/dist/components/ui/enterprise-mobile-experience.js +124 -73
- package/dist/components/ui/feedback/alert.esm.js +22 -15
- package/dist/components/ui/feedback/alert.js +22 -15
- package/dist/components/ui/feedback/progress.esm.js +47 -24
- package/dist/components/ui/feedback/progress.js +47 -24
- package/dist/components/ui/feedback/skeleton.esm.js +39 -29
- package/dist/components/ui/feedback/skeleton.js +39 -29
- package/dist/components/ui/feedback/toast.esm.js +62 -38
- package/dist/components/ui/feedback/toast.js +62 -38
- package/dist/components/ui/feedback/types.esm.js +83 -83
- package/dist/components/ui/feedback/types.js +83 -83
- package/dist/components/ui/font-preview.esm.js +41 -39
- package/dist/components/ui/font-preview.js +41 -39
- package/dist/components/ui/form-demo.esm.js +150 -113
- package/dist/components/ui/form-demo.js +150 -113
- package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
- package/dist/components/ui/hardware-acceleration-demo.js +137 -87
- package/dist/components/ui/input.esm.js +4 -1
- package/dist/components/ui/input.js +4 -1
- package/dist/components/ui/layout-demo.esm.js +81 -56
- package/dist/components/ui/layout-demo.js +81 -56
- package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
- package/dist/components/ui/layouts/adaptive-layout.js +27 -8
- package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
- package/dist/components/ui/layouts/desktop-layout.js +39 -19
- package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
- package/dist/components/ui/layouts/mobile-layout.js +19 -9
- package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
- package/dist/components/ui/layouts/tablet-layout.js +28 -14
- package/dist/components/ui/mobile-form-validation.esm.js +120 -87
- package/dist/components/ui/mobile-form-validation.js +120 -87
- package/dist/components/ui/mobile-input-demo.esm.js +19 -13
- package/dist/components/ui/mobile-input-demo.js +19 -13
- package/dist/components/ui/mobile-input.esm.js +185 -120
- package/dist/components/ui/mobile-input.js +185 -120
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
- package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
- package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
- package/dist/components/ui/navigation/breadcrumb.js +17 -14
- package/dist/components/ui/navigation/index.esm.js +0 -1
- package/dist/components/ui/navigation/index.js +0 -1
- package/dist/components/ui/navigation/menu.esm.js +49 -35
- package/dist/components/ui/navigation/menu.js +49 -35
- package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
- package/dist/components/ui/navigation/navigation-demo.js +81 -74
- package/dist/components/ui/navigation/pagination.esm.js +62 -50
- package/dist/components/ui/navigation/pagination.js +62 -50
- package/dist/components/ui/navigation/sidebar.esm.js +56 -42
- package/dist/components/ui/navigation/sidebar.js +56 -42
- package/dist/components/ui/navigation/stepper.esm.js +34 -23
- package/dist/components/ui/navigation/stepper.js +34 -23
- package/dist/components/ui/navigation/tabs.esm.js +32 -21
- package/dist/components/ui/navigation/tabs.js +32 -21
- package/dist/components/ui/navigation/types.esm.js +196 -195
- package/dist/components/ui/navigation/types.js +196 -195
- package/dist/components/ui/overlay/backdrop.esm.js +17 -16
- package/dist/components/ui/overlay/backdrop.js +17 -16
- package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
- package/dist/components/ui/overlay/focus-manager.js +21 -19
- package/dist/components/ui/overlay/index.esm.js +0 -2
- package/dist/components/ui/overlay/index.js +0 -2
- package/dist/components/ui/overlay/modal.esm.js +38 -34
- package/dist/components/ui/overlay/modal.js +38 -34
- package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
- package/dist/components/ui/overlay/overlay-manager.js +25 -20
- package/dist/components/ui/overlay/popover.esm.js +74 -58
- package/dist/components/ui/overlay/popover.js +74 -58
- package/dist/components/ui/overlay/portal.esm.js +7 -7
- package/dist/components/ui/overlay/portal.js +7 -7
- package/dist/components/ui/overlay/tooltip.esm.js +54 -39
- package/dist/components/ui/overlay/tooltip.js +54 -39
- package/dist/components/ui/overlay/types.esm.js +132 -131
- package/dist/components/ui/overlay/types.js +132 -131
- package/dist/components/ui/performance-demo.esm.js +135 -88
- package/dist/components/ui/performance-demo.js +135 -88
- package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
- package/dist/components/ui/semantic-input-system-demo.js +117 -80
- package/dist/components/ui/theme-customizer.esm.js +84 -52
- package/dist/components/ui/theme-customizer.js +84 -52
- package/dist/components/ui/theme-preview.esm.js +95 -43
- package/dist/components/ui/theme-preview.js +95 -43
- package/dist/components/ui/theme-switcher.esm.js +70 -44
- package/dist/components/ui/theme-switcher.js +70 -44
- package/dist/components/ui/theme-toggle.esm.js +3 -3
- package/dist/components/ui/theme-toggle.js +3 -3
- package/dist/components/ui/token-demo.esm.js +33 -21
- package/dist/components/ui/token-demo.js +33 -21
- package/dist/components/ui/touch-demo.esm.js +102 -73
- package/dist/components/ui/touch-demo.js +102 -73
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
- package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
- package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
- package/dist/components/ui/touch-friendly-interface.js +85 -61
- package/dist/hooks/use-accessibility-support.esm.js +115 -85
- package/dist/hooks/use-accessibility-support.js +115 -85
- package/dist/hooks/use-adaptive-layout.esm.js +56 -33
- package/dist/hooks/use-adaptive-layout.js +56 -33
- package/dist/hooks/use-advanced-patterns.esm.js +57 -42
- package/dist/hooks/use-advanced-patterns.js +57 -42
- package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
- package/dist/hooks/use-advanced-transition-system.js +112 -71
- package/dist/hooks/use-animation-profile.esm.js +63 -34
- package/dist/hooks/use-animation-profile.js +63 -34
- package/dist/hooks/use-battery-animations.esm.js +80 -55
- package/dist/hooks/use-battery-animations.js +80 -55
- package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
- package/dist/hooks/use-battery-conscious-loading.js +166 -123
- package/dist/hooks/use-battery-optimization.esm.js +78 -55
- package/dist/hooks/use-battery-optimization.js +78 -55
- package/dist/hooks/use-battery-status.esm.js +73 -51
- package/dist/hooks/use-battery-status.js +73 -51
- package/dist/hooks/use-component-performance.esm.js +62 -47
- package/dist/hooks/use-component-performance.js +62 -47
- package/dist/hooks/use-device-loading-states.esm.js +152 -109
- package/dist/hooks/use-device-loading-states.js +152 -109
- package/dist/hooks/use-device.esm.js +25 -14
- package/dist/hooks/use-device.js +25 -14
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
- package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
- package/dist/hooks/use-form-feedback.esm.js +124 -81
- package/dist/hooks/use-form-feedback.js +124 -81
- package/dist/hooks/use-form-performance.esm.js +127 -92
- package/dist/hooks/use-form-performance.js +127 -92
- package/dist/hooks/use-frame-rate.esm.js +56 -37
- package/dist/hooks/use-frame-rate.js +56 -37
- package/dist/hooks/use-gestures.esm.js +96 -72
- package/dist/hooks/use-gestures.js +96 -72
- package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
- package/dist/hooks/use-hardware-acceleration.js +65 -37
- package/dist/hooks/use-input-accessibility.esm.js +157 -119
- package/dist/hooks/use-input-accessibility.js +157 -119
- package/dist/hooks/use-input-performance.esm.js +139 -104
- package/dist/hooks/use-input-performance.js +139 -104
- package/dist/hooks/use-layout-performance.esm.js +50 -29
- package/dist/hooks/use-layout-performance.js +50 -29
- package/dist/hooks/use-loading-accessibility.esm.js +209 -169
- package/dist/hooks/use-loading-accessibility.js +209 -169
- package/dist/hooks/use-loading-performance.esm.js +117 -93
- package/dist/hooks/use-loading-performance.js +117 -93
- package/dist/hooks/use-memory-usage.esm.js +57 -38
- package/dist/hooks/use-memory-usage.js +57 -38
- package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
- package/dist/hooks/use-mobile-form-layout.js +111 -74
- package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
- package/dist/hooks/use-mobile-form-validation.js +211 -144
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
- package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
- package/dist/hooks/use-mobile-layout.esm.js +73 -51
- package/dist/hooks/use-mobile-layout.js +73 -51
- package/dist/hooks/use-mobile-optimization.esm.js +72 -44
- package/dist/hooks/use-mobile-optimization.js +72 -44
- package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
- package/dist/hooks/use-mobile-skeleton.js +97 -64
- package/dist/hooks/use-mobile-touch.esm.js +128 -93
- package/dist/hooks/use-mobile-touch.js +128 -93
- package/dist/hooks/use-performance-throttling.esm.js +72 -48
- package/dist/hooks/use-performance-throttling.js +72 -48
- package/dist/hooks/use-performance.esm.js +90 -52
- package/dist/hooks/use-performance.js +90 -52
- package/dist/hooks/use-reusable-architecture.esm.js +94 -65
- package/dist/hooks/use-reusable-architecture.js +94 -65
- package/dist/hooks/use-semantic-input-types.esm.js +166 -124
- package/dist/hooks/use-semantic-input-types.js +166 -124
- package/dist/hooks/use-semantic-input.esm.js +178 -126
- package/dist/hooks/use-semantic-input.js +178 -126
- package/dist/hooks/use-tablet-layout.esm.js +67 -38
- package/dist/hooks/use-tablet-layout.js +67 -38
- package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
- package/dist/hooks/use-touch-friendly-input.js +193 -149
- package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
- package/dist/hooks/use-touch-friendly-interface.js +99 -67
- package/dist/hooks/use-touch-optimization.esm.js +99 -72
- package/dist/hooks/use-touch-optimization.js +99 -72
- package/dist/index.esm.js +157 -281
- package/dist/index.js +157 -281
- package/dist/lib/utils.esm.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/plugins/theme-css-generator.esm.js +104 -55
- package/dist/plugins/theme-css-generator.js +104 -55
- package/dist/provider.esm.js +4 -4
- package/dist/provider.js +4 -4
- package/dist/styles.css +1 -1
- package/dist/theme.esm.js +633 -468
- package/dist/theme.js +633 -468
- package/dist/themes/ThemeContext.esm.js +15 -15
- package/dist/themes/ThemeContext.js +15 -15
- package/dist/themes/ThemeProvider.esm.js +25 -22
- package/dist/themes/ThemeProvider.js +25 -22
- package/dist/themes/accessibility.esm.js +147 -108
- package/dist/themes/accessibility.js +147 -108
- package/dist/themes/aria-patterns.esm.js +198 -162
- package/dist/themes/aria-patterns.js +198 -162
- package/dist/themes/base-themes.esm.js +14 -11
- package/dist/themes/base-themes.js +14 -11
- package/dist/themes/colorManager.esm.js +101 -83
- package/dist/themes/colorManager.js +101 -83
- package/dist/themes/examples/dark-theme.esm.js +133 -103
- package/dist/themes/examples/dark-theme.js +133 -103
- package/dist/themes/examples/minimal-theme.esm.js +83 -61
- package/dist/themes/examples/minimal-theme.js +83 -61
- package/dist/themes/focus-management.esm.js +202 -143
- package/dist/themes/focus-management.js +202 -143
- package/dist/themes/fontLoader.esm.js +28 -19
- package/dist/themes/fontLoader.js +28 -19
- package/dist/themes/high-contrast.esm.js +152 -104
- package/dist/themes/high-contrast.js +152 -104
- package/dist/themes/index.esm.js +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/inheritance.esm.js +35 -27
- package/dist/themes/inheritance.js +35 -27
- package/dist/themes/keyboard-navigation.esm.js +152 -123
- package/dist/themes/keyboard-navigation.js +152 -123
- package/dist/themes/motion-reduction.esm.js +193 -133
- package/dist/themes/motion-reduction.js +193 -133
- package/dist/themes/navigation.esm.js +146 -146
- package/dist/themes/navigation.js +146 -146
- package/dist/themes/screen-reader.esm.js +159 -94
- package/dist/themes/screen-reader.js +159 -94
- package/dist/themes/systemThemeDetector.esm.js +42 -34
- package/dist/themes/systemThemeDetector.js +42 -34
- package/dist/themes/themeCSSUpdater.esm.js +21 -9
- package/dist/themes/themeCSSUpdater.js +21 -9
- package/dist/themes/themePersistence.esm.js +68 -47
- package/dist/themes/themePersistence.js +68 -47
- package/dist/themes/themes/stan-design.esm.js +633 -468
- package/dist/themes/themes/stan-design.js +633 -468
- package/dist/themes/types.esm.js +301 -287
- package/dist/themes/types.js +301 -287
- package/dist/themes/useSystemTheme.esm.js +4 -4
- package/dist/themes/useSystemTheme.js +4 -4
- package/dist/themes/useTheme.esm.js +4 -4
- package/dist/themes/useTheme.js +4 -4
- package/dist/themes/validation.esm.js +128 -77
- package/dist/themes/validation.js +128 -77
- package/dist/tokens/index.esm.js +1 -2
- package/dist/tokens/index.js +1 -2
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- package/src/index.ts +146 -146
|
@@ -1,63 +1,66 @@
|
|
|
1
1
|
// Performance monitoring utilities for tracking various metrics
|
|
2
2
|
export interface PerformanceMetric {
|
|
3
|
-
name;
|
|
4
|
-
value;
|
|
5
|
-
unit;
|
|
6
|
-
timestamp;
|
|
7
|
-
metadata
|
|
3
|
+
name: string;
|
|
4
|
+
value: number;
|
|
5
|
+
unit: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
metadata?: Record<string, any>;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export interface PerformanceThreshold {
|
|
11
|
-
name;
|
|
12
|
-
warning;
|
|
13
|
-
critical;
|
|
14
|
-
unit;
|
|
11
|
+
name: string;
|
|
12
|
+
warning: number;
|
|
13
|
+
critical: number;
|
|
14
|
+
unit: string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface PerformanceReport {
|
|
18
|
-
metrics];
|
|
19
|
-
thresholds];
|
|
20
|
-
violations
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
metrics: PerformanceMetric[];
|
|
19
|
+
thresholds: PerformanceThreshold[];
|
|
20
|
+
violations: Array<{
|
|
21
|
+
metric: string;
|
|
22
|
+
value: number;
|
|
23
|
+
threshold: number;
|
|
24
|
+
severity: 'warning' | 'critical';
|
|
24
25
|
}>;
|
|
25
|
-
summary
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
summary: {
|
|
27
|
+
totalMetrics: number;
|
|
28
|
+
warnings: number;
|
|
29
|
+
criticals: number;
|
|
30
|
+
averagePerformance: number;
|
|
29
31
|
};
|
|
30
|
-
timestamp;
|
|
32
|
+
timestamp: number;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
export interface PerformanceMonitorConfig {
|
|
34
|
-
enabled;
|
|
35
|
-
autoCollect;
|
|
36
|
-
collectionInterval;
|
|
37
|
-
maxMetrics;
|
|
38
|
-
thresholds];
|
|
39
|
-
enableWebVitals;
|
|
40
|
-
enableMemoryMonitoring;
|
|
41
|
-
enableNetworkMonitoring;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
autoCollect: boolean;
|
|
38
|
+
collectionInterval: number;
|
|
39
|
+
maxMetrics: number;
|
|
40
|
+
thresholds: PerformanceThreshold[];
|
|
41
|
+
enableWebVitals: boolean;
|
|
42
|
+
enableMemoryMonitoring: boolean;
|
|
43
|
+
enableNetworkMonitoring: boolean;
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
export class PerformanceMonitor {
|
|
45
|
-
private config;
|
|
46
|
-
private metrics];
|
|
47
|
-
private thresholds, PerformanceThreshold>;
|
|
48
|
-
private observers, PerformanceObserver>;
|
|
49
|
-
private collectionTimer;
|
|
50
|
-
private startTime;
|
|
51
|
-
|
|
52
|
-
constructor(config= {
|
|
53
|
-
enabled,
|
|
54
|
-
autoCollect,
|
|
55
|
-
collectionInterval, // 5 seconds
|
|
56
|
-
maxMetrics,
|
|
57
|
-
thresholds],
|
|
58
|
-
enableWebVitals,
|
|
59
|
-
enableMemoryMonitoring,
|
|
60
|
-
enableNetworkMonitoring
|
|
47
|
+
private config: PerformanceMonitorConfig;
|
|
48
|
+
private metrics: PerformanceMetric[];
|
|
49
|
+
private thresholds: Map<string, PerformanceThreshold>;
|
|
50
|
+
private observers: Map<string, PerformanceObserver>;
|
|
51
|
+
private collectionTimer: NodeJS.Timeout | null;
|
|
52
|
+
private startTime: number;
|
|
53
|
+
|
|
54
|
+
constructor(config: PerformanceMonitorConfig = {
|
|
55
|
+
enabled: true,
|
|
56
|
+
autoCollect: true,
|
|
57
|
+
collectionInterval: 5000, // 5 seconds
|
|
58
|
+
maxMetrics: 1000,
|
|
59
|
+
thresholds: [],
|
|
60
|
+
enableWebVitals: true,
|
|
61
|
+
enableMemoryMonitoring: true,
|
|
62
|
+
enableNetworkMonitoring: true
|
|
63
|
+
}) {
|
|
61
64
|
this.config = config;
|
|
62
65
|
this.metrics = [];
|
|
63
66
|
this.thresholds = new Map();
|
|
@@ -87,13 +90,14 @@ export class PerformanceMonitor {
|
|
|
87
90
|
}
|
|
88
91
|
|
|
89
92
|
// Set up default performance thresholds
|
|
90
|
-
private setupDefaultThresholds()
|
|
91
|
-
|
|
92
|
-
{ name, warning, critical, unit},
|
|
93
|
-
{ name, warning, critical, unit},
|
|
94
|
-
{ name, warning, critical, unit},
|
|
95
|
-
{ name, warning, critical, unit},
|
|
96
|
-
{ name, warning, critical, unit}
|
|
93
|
+
private setupDefaultThresholds(): void {
|
|
94
|
+
const defaultThresholds: PerformanceThreshold[] = [
|
|
95
|
+
{ name: 'themeSwitchTime', warning: 100, critical: 300, unit: 'ms' },
|
|
96
|
+
{ name: 'componentRenderTime', warning: 50, critical: 150, unit: 'ms' },
|
|
97
|
+
{ name: 'bundleLoadTime', warning: 2000, critical: 5000, unit: 'ms' },
|
|
98
|
+
{ name: 'memoryUsage', warning: 100, critical: 500, unit: 'MB' },
|
|
99
|
+
{ name: 'firstContentfulPaint', warning: 1000, critical: 3000, unit: 'ms' },
|
|
100
|
+
{ name: 'largestContentfulPaint', warning: 2500, critical: 4000, unit: 'ms' }
|
|
97
101
|
];
|
|
98
102
|
|
|
99
103
|
defaultThresholds.forEach(threshold => {
|
|
@@ -102,7 +106,8 @@ export class PerformanceMonitor {
|
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
// Set up Web Vitals observer
|
|
105
|
-
private setupWebVitalsObserver()
|
|
109
|
+
private setupWebVitalsObserver(): void {
|
|
110
|
+
if (!('PerformanceObserver' in window)) return;
|
|
106
111
|
|
|
107
112
|
try {
|
|
108
113
|
// First Contentful Paint
|
|
@@ -110,22 +115,24 @@ export class PerformanceMonitor {
|
|
|
110
115
|
const entries = list.getEntries();
|
|
111
116
|
entries.forEach(entry => {
|
|
112
117
|
this.recordMetric('firstContentfulPaint', entry.startTime, 'ms', {
|
|
113
|
-
entryType,
|
|
114
|
-
name
|
|
118
|
+
entryType: entry.entryType,
|
|
119
|
+
name: entry.name
|
|
120
|
+
});
|
|
115
121
|
});
|
|
116
122
|
});
|
|
117
|
-
fcpObserver.observe({ entryTypes] });
|
|
123
|
+
fcpObserver.observe({ entryTypes: ['paint'] });
|
|
118
124
|
|
|
119
125
|
// Largest Contentful Paint
|
|
120
126
|
const lcpObserver = new PerformanceObserver((list) => {
|
|
121
127
|
const entries = list.getEntries();
|
|
122
128
|
entries.forEach(entry => {
|
|
123
129
|
this.recordMetric('largestContentfulPaint', entry.startTime, 'ms', {
|
|
124
|
-
entryType,
|
|
125
|
-
name
|
|
130
|
+
entryType: entry.entryType,
|
|
131
|
+
name: entry.name
|
|
132
|
+
});
|
|
126
133
|
});
|
|
127
134
|
});
|
|
128
|
-
lcpObserver.observe({ entryTypes] });
|
|
135
|
+
lcpObserver.observe({ entryTypes: ['largest-contentful-paint'] });
|
|
129
136
|
|
|
130
137
|
// First Input Delay
|
|
131
138
|
const fidObserver = new PerformanceObserver((list) => {
|
|
@@ -134,12 +141,13 @@ export class PerformanceMonitor {
|
|
|
134
141
|
if ('processingStart' in entry) {
|
|
135
142
|
const fidEntry = entry as any;
|
|
136
143
|
this.recordMetric('firstInputDelay', fidEntry.processingStart - fidEntry.startTime, 'ms', {
|
|
137
|
-
entryType,
|
|
138
|
-
name
|
|
144
|
+
entryType: entry.entryType,
|
|
145
|
+
name: entry.name
|
|
146
|
+
});
|
|
139
147
|
}
|
|
140
148
|
});
|
|
141
149
|
});
|
|
142
|
-
fidObserver.observe({ entryTypes] });
|
|
150
|
+
fidObserver.observe({ entryTypes: ['first-input'] });
|
|
143
151
|
|
|
144
152
|
// Cumulative Layout Shift
|
|
145
153
|
const clsObserver = new PerformanceObserver((list) => {
|
|
@@ -148,27 +156,29 @@ export class PerformanceMonitor {
|
|
|
148
156
|
if ('value' in entry) {
|
|
149
157
|
const clsEntry = entry as any;
|
|
150
158
|
this.recordMetric('cumulativeLayoutShift', clsEntry.value, 'score', {
|
|
151
|
-
entryType,
|
|
152
|
-
name
|
|
159
|
+
entryType: entry.entryType,
|
|
160
|
+
name: entry.name
|
|
161
|
+
});
|
|
153
162
|
}
|
|
154
163
|
});
|
|
155
164
|
});
|
|
156
|
-
clsObserver.observe({ entryTypes] });
|
|
165
|
+
clsObserver.observe({ entryTypes: ['layout-shift'] });
|
|
157
166
|
|
|
158
167
|
this.observers.set('webVitals', fcpObserver);
|
|
159
168
|
} catch (error) {
|
|
160
|
-
console.warn('Failed to set up Web Vitals observer, error);
|
|
169
|
+
console.warn('Failed to set up Web Vitals observer:', error);
|
|
161
170
|
}
|
|
162
171
|
}
|
|
163
172
|
|
|
164
173
|
// Record a performance metric
|
|
165
|
-
recordMetric(name, value, unit, metadata
|
|
174
|
+
recordMetric(name: string, value: number, unit: string, metadata?: Record<string, any>): void {
|
|
175
|
+
if (!this.config.enabled) return;
|
|
166
176
|
|
|
167
|
-
const metric= {
|
|
177
|
+
const metric: PerformanceMetric = {
|
|
168
178
|
name,
|
|
169
179
|
value,
|
|
170
180
|
unit,
|
|
171
|
-
timestamp),
|
|
181
|
+
timestamp: Date.now(),
|
|
172
182
|
metadata
|
|
173
183
|
};
|
|
174
184
|
|
|
@@ -184,7 +194,8 @@ export class PerformanceMonitor {
|
|
|
184
194
|
}
|
|
185
195
|
|
|
186
196
|
// Check if a metric violates any thresholds
|
|
187
|
-
private checkThresholds(metric)
|
|
197
|
+
private checkThresholds(metric: PerformanceMetric): void {
|
|
198
|
+
const threshold = this.thresholds.get(metric.name);
|
|
188
199
|
if (!threshold) return;
|
|
189
200
|
|
|
190
201
|
if (metric.value >= threshold.critical) {
|
|
@@ -195,24 +206,28 @@ export class PerformanceMonitor {
|
|
|
195
206
|
}
|
|
196
207
|
|
|
197
208
|
// Emit threshold violation event
|
|
198
|
-
private emitThresholdViolation(metric, threshold, severity
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
209
|
+
private emitThresholdViolation(metric: PerformanceMetric, threshold: PerformanceThreshold, severity: 'warning' | 'critical'): void {
|
|
210
|
+
const event = new CustomEvent('performanceThresholdViolation', {
|
|
211
|
+
detail: {
|
|
212
|
+
metric: metric.name,
|
|
213
|
+
value: metric.value,
|
|
214
|
+
threshold: threshold[severity],
|
|
202
215
|
severity,
|
|
203
|
-
unit,
|
|
204
|
-
timestamp
|
|
216
|
+
unit: threshold.unit,
|
|
217
|
+
timestamp: metric.timestamp
|
|
218
|
+
}
|
|
205
219
|
});
|
|
206
220
|
|
|
207
221
|
window.dispatchEvent(event);
|
|
208
222
|
|
|
209
223
|
// Log to console
|
|
210
|
-
const logMethod = severity === 'critical' ? 'error' ;
|
|
211
|
-
console[logMethod](`Performance ${severity}} = ${metric.value}${metric.unit} (threshold]}${threshold.unit})`);
|
|
224
|
+
const logMethod = severity === 'critical' ? 'error' : 'warn';
|
|
225
|
+
console[logMethod](`Performance ${severity}: ${metric.name} = ${metric.value}${metric.unit} (threshold: ${threshold[severity]}${threshold.unit})`);
|
|
212
226
|
}
|
|
213
227
|
|
|
214
228
|
// Measure theme switch performance
|
|
215
|
-
measureThemeSwitch(callback) => void)
|
|
229
|
+
measureThemeSwitch(callback: () => void): number {
|
|
230
|
+
const startTime = performance.now();
|
|
216
231
|
callback();
|
|
217
232
|
const endTime = performance.now();
|
|
218
233
|
const duration = endTime - startTime;
|
|
@@ -222,7 +237,8 @@ export class PerformanceMonitor {
|
|
|
222
237
|
}
|
|
223
238
|
|
|
224
239
|
// Measure component render performance
|
|
225
|
-
measureComponentRender(callback) => void)
|
|
240
|
+
measureComponentRender(callback: () => void): number {
|
|
241
|
+
const startTime = performance.now();
|
|
226
242
|
callback();
|
|
227
243
|
const endTime = performance.now();
|
|
228
244
|
const duration = endTime - startTime;
|
|
@@ -232,7 +248,8 @@ export class PerformanceMonitor {
|
|
|
232
248
|
}
|
|
233
249
|
|
|
234
250
|
// Measure bundle load performance
|
|
235
|
-
measureBundleLoad(callback) => Promise<any>)
|
|
251
|
+
measureBundleLoad(callback: () => Promise<any>): Promise<number> {
|
|
252
|
+
const startTime = performance.now();
|
|
236
253
|
return callback().then(() => {
|
|
237
254
|
const endTime = performance.now();
|
|
238
255
|
const duration = endTime - startTime;
|
|
@@ -242,7 +259,8 @@ export class PerformanceMonitor {
|
|
|
242
259
|
}
|
|
243
260
|
|
|
244
261
|
// Measure memory usage
|
|
245
|
-
measureMemoryUsage()
|
|
262
|
+
measureMemoryUsage(): number | null {
|
|
263
|
+
if (!this.config.enableMemoryMonitoring || !('memory' in performance)) {
|
|
246
264
|
return null;
|
|
247
265
|
}
|
|
248
266
|
|
|
@@ -250,14 +268,16 @@ export class PerformanceMonitor {
|
|
|
250
268
|
const usedMB = memory.usedJSHeapSize / 1024 / 1024;
|
|
251
269
|
|
|
252
270
|
this.recordMetric('memoryUsage', usedMB, 'MB', {
|
|
253
|
-
totalJSHeapSize,
|
|
254
|
-
jsHeapSizeLimit
|
|
271
|
+
totalJSHeapSize: memory.totalJSHeapSize / 1024 / 1024,
|
|
272
|
+
jsHeapSizeLimit: memory.jsHeapSizeLimit / 1024 / 1024
|
|
273
|
+
});
|
|
255
274
|
|
|
256
275
|
return usedMB;
|
|
257
276
|
}
|
|
258
277
|
|
|
259
278
|
// Measure network performance
|
|
260
|
-
measureNetworkPerformance()
|
|
279
|
+
measureNetworkPerformance(): void {
|
|
280
|
+
if (!this.config.enableNetworkMonitoring || !('getEntriesByType' in performance)) return;
|
|
261
281
|
|
|
262
282
|
try {
|
|
263
283
|
const navigationEntries = performance.getEntriesByType('navigation');
|
|
@@ -270,12 +290,13 @@ export class PerformanceMonitor {
|
|
|
270
290
|
this.recordMetric('firstByte', nav.responseStart - nav.fetchStart, 'ms');
|
|
271
291
|
}
|
|
272
292
|
} catch (error) {
|
|
273
|
-
console.warn('Failed to measure network performance, error);
|
|
293
|
+
console.warn('Failed to measure network performance:', error);
|
|
274
294
|
}
|
|
275
295
|
}
|
|
276
296
|
|
|
277
297
|
// Start automatic metric collection
|
|
278
|
-
startAutoCollection()
|
|
298
|
+
startAutoCollection(): void {
|
|
299
|
+
if (this.collectionTimer) return;
|
|
279
300
|
|
|
280
301
|
this.collectionTimer = setInterval(() => {
|
|
281
302
|
// Collect memory usage
|
|
@@ -290,14 +311,17 @@ export class PerformanceMonitor {
|
|
|
290
311
|
}
|
|
291
312
|
|
|
292
313
|
// Stop automatic metric collection
|
|
293
|
-
stopAutoCollection()
|
|
314
|
+
stopAutoCollection(): void {
|
|
315
|
+
if (this.collectionTimer) {
|
|
294
316
|
clearInterval(this.collectionTimer);
|
|
295
317
|
this.collectionTimer = null;
|
|
296
318
|
}
|
|
297
319
|
}
|
|
298
320
|
|
|
299
321
|
// Collect custom metrics
|
|
300
|
-
private collectCustomMetrics()
|
|
322
|
+
private collectCustomMetrics(): void {
|
|
323
|
+
// Record uptime
|
|
324
|
+
const uptime = Date.now() - this.startTime;
|
|
301
325
|
this.recordMetric('uptime', uptime, 'ms');
|
|
302
326
|
|
|
303
327
|
// Record metric count
|
|
@@ -305,24 +329,26 @@ export class PerformanceMonitor {
|
|
|
305
329
|
}
|
|
306
330
|
|
|
307
331
|
// Get metrics by name
|
|
308
|
-
getMetricsByName(name)] {
|
|
332
|
+
getMetricsByName(name: string): PerformanceMetric[] {
|
|
309
333
|
return this.metrics.filter(metric => metric.name === name);
|
|
310
334
|
}
|
|
311
335
|
|
|
312
336
|
// Get latest metric by name
|
|
313
|
-
getLatestMetric(name)
|
|
314
|
-
|
|
337
|
+
getLatestMetric(name: string): PerformanceMetric | null {
|
|
338
|
+
const metrics = this.getMetricsByName(name);
|
|
339
|
+
return metrics.length > 0 ? metrics[metrics.length - 1] : null;
|
|
315
340
|
}
|
|
316
341
|
|
|
317
342
|
// Get metrics within time range
|
|
318
|
-
getMetricsInRange(startTime, endTime)] {
|
|
343
|
+
getMetricsInRange(startTime: number, endTime: number): PerformanceMetric[] {
|
|
319
344
|
return this.metrics.filter(metric =>
|
|
320
345
|
metric.timestamp >= startTime && metric.timestamp <= endTime
|
|
321
346
|
);
|
|
322
347
|
}
|
|
323
348
|
|
|
324
349
|
// Calculate average for a metric
|
|
325
|
-
getAverageMetric(name, timeRange
|
|
350
|
+
getAverageMetric(name: string, timeRange?: { start: number; end: number }): number {
|
|
351
|
+
let metrics = this.getMetricsByName(name);
|
|
326
352
|
|
|
327
353
|
if (timeRange) {
|
|
328
354
|
metrics = this.getMetricsInRange(timeRange.start, timeRange.end);
|
|
@@ -335,10 +361,12 @@ export class PerformanceMonitor {
|
|
|
335
361
|
}
|
|
336
362
|
|
|
337
363
|
// Get performance report
|
|
338
|
-
getPerformanceReport()
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
364
|
+
getPerformanceReport(): PerformanceReport {
|
|
365
|
+
const violations: Array<{
|
|
366
|
+
metric: string;
|
|
367
|
+
value: number;
|
|
368
|
+
threshold: number;
|
|
369
|
+
severity: 'warning' | 'critical';
|
|
342
370
|
}> = [];
|
|
343
371
|
|
|
344
372
|
// Check all metrics against thresholds
|
|
@@ -347,16 +375,18 @@ export class PerformanceMonitor {
|
|
|
347
375
|
if (threshold) {
|
|
348
376
|
if (metric.value >= threshold.critical) {
|
|
349
377
|
violations.push({
|
|
350
|
-
metric,
|
|
351
|
-
value,
|
|
352
|
-
threshold,
|
|
353
|
-
severity
|
|
378
|
+
metric: metric.name,
|
|
379
|
+
value: metric.value,
|
|
380
|
+
threshold: threshold.critical,
|
|
381
|
+
severity: 'critical'
|
|
382
|
+
});
|
|
354
383
|
} else if (metric.value >= threshold.warning) {
|
|
355
384
|
violations.push({
|
|
356
|
-
metric,
|
|
357
|
-
value,
|
|
358
|
-
threshold,
|
|
359
|
-
severity
|
|
385
|
+
metric: metric.name,
|
|
386
|
+
value: metric.value,
|
|
387
|
+
threshold: threshold.warning,
|
|
388
|
+
severity: 'warning'
|
|
389
|
+
});
|
|
360
390
|
}
|
|
361
391
|
}
|
|
362
392
|
});
|
|
@@ -368,48 +398,56 @@ export class PerformanceMonitor {
|
|
|
368
398
|
const timeMetrics = this.metrics.filter(m => m.unit === 'ms');
|
|
369
399
|
const averagePerformance = timeMetrics.length > 0
|
|
370
400
|
? timeMetrics.reduce((sum, m) => sum + m.value, 0) / timeMetrics.length
|
|
371
|
-
;
|
|
401
|
+
: 0;
|
|
372
402
|
|
|
373
403
|
return {
|
|
374
|
-
metrics],
|
|
375
|
-
thresholds)),
|
|
404
|
+
metrics: [...this.metrics],
|
|
405
|
+
thresholds: Array.from(this.thresholds.values()),
|
|
376
406
|
violations,
|
|
377
|
-
summary
|
|
407
|
+
summary: {
|
|
408
|
+
totalMetrics: this.metrics.length,
|
|
378
409
|
warnings,
|
|
379
410
|
criticals,
|
|
380
411
|
averagePerformance
|
|
381
412
|
},
|
|
382
|
-
timestamp)
|
|
413
|
+
timestamp: Date.now()
|
|
383
414
|
};
|
|
384
415
|
}
|
|
385
416
|
|
|
386
417
|
// Add custom threshold
|
|
387
|
-
addThreshold(threshold)
|
|
418
|
+
addThreshold(threshold: PerformanceThreshold): void {
|
|
419
|
+
this.thresholds.set(threshold.name, threshold);
|
|
388
420
|
}
|
|
389
421
|
|
|
390
422
|
// Remove threshold
|
|
391
|
-
removeThreshold(name)
|
|
423
|
+
removeThreshold(name: string): void {
|
|
424
|
+
this.thresholds.delete(name);
|
|
392
425
|
}
|
|
393
426
|
|
|
394
427
|
// Clear all metrics
|
|
395
|
-
clearMetrics()
|
|
428
|
+
clearMetrics(): void {
|
|
429
|
+
this.metrics = [];
|
|
396
430
|
}
|
|
397
431
|
|
|
398
432
|
// Export metrics to JSON
|
|
399
|
-
exportMetrics()
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
433
|
+
exportMetrics(): string {
|
|
434
|
+
return JSON.stringify({
|
|
435
|
+
config: this.config,
|
|
436
|
+
metrics: this.metrics,
|
|
437
|
+
thresholds: Array.from(this.thresholds.values()),
|
|
438
|
+
report: this.getPerformanceReport(),
|
|
439
|
+
timestamp: new Date().toISOString()
|
|
404
440
|
}, null, 2);
|
|
405
441
|
}
|
|
406
442
|
|
|
407
443
|
// Get configuration
|
|
408
|
-
getConfig()
|
|
444
|
+
getConfig(): PerformanceMonitorConfig {
|
|
445
|
+
return { ...this.config };
|
|
409
446
|
}
|
|
410
447
|
|
|
411
448
|
// Update configuration
|
|
412
|
-
updateConfig(newConfig)
|
|
449
|
+
updateConfig(newConfig: Partial<PerformanceMonitorConfig>): void {
|
|
450
|
+
this.config = { ...this.config, ...newConfig };
|
|
413
451
|
|
|
414
452
|
// Restart auto-collection if interval changed
|
|
415
453
|
if (newConfig.collectionInterval && this.collectionTimer) {
|
|
@@ -419,7 +457,8 @@ export class PerformanceMonitor {
|
|
|
419
457
|
}
|
|
420
458
|
|
|
421
459
|
// Cleanup resources
|
|
422
|
-
destroy()
|
|
460
|
+
destroy(): void {
|
|
461
|
+
this.stopAutoCollection();
|
|
423
462
|
|
|
424
463
|
// Disconnect observers
|
|
425
464
|
this.observers.forEach(observer => {
|
|
@@ -437,10 +476,11 @@ export const performanceMonitor = new PerformanceMonitor();
|
|
|
437
476
|
|
|
438
477
|
// Utility function for measuring async operations
|
|
439
478
|
export async function measureAsync<T>(
|
|
440
|
-
name,
|
|
441
|
-
operation) => Promise<T>,
|
|
442
|
-
monitor= performanceMonitor
|
|
443
|
-
)
|
|
479
|
+
name: string,
|
|
480
|
+
operation: () => Promise<T>,
|
|
481
|
+
monitor: PerformanceMonitor = performanceMonitor
|
|
482
|
+
): Promise<T> {
|
|
483
|
+
const startTime = performance.now();
|
|
444
484
|
try {
|
|
445
485
|
const result = await operation();
|
|
446
486
|
const duration = performance.now() - startTime;
|
|
@@ -455,10 +495,11 @@ export async function measureAsync<T>(
|
|
|
455
495
|
|
|
456
496
|
// Utility function for measuring sync operations
|
|
457
497
|
export function measureSync<T>(
|
|
458
|
-
name,
|
|
459
|
-
operation) => T,
|
|
460
|
-
monitor= performanceMonitor
|
|
461
|
-
)
|
|
498
|
+
name: string,
|
|
499
|
+
operation: () => T,
|
|
500
|
+
monitor: PerformanceMonitor = performanceMonitor
|
|
501
|
+
): T {
|
|
502
|
+
const startTime = performance.now();
|
|
462
503
|
try {
|
|
463
504
|
const result = operation();
|
|
464
505
|
const duration = performance.now() - startTime;
|