mtrl-addons 0.2.2 → 0.2.4
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/{src/components/index.ts → dist/components/index.d.ts} +0 -2
- package/dist/components/vlist/config.d.ts +86 -0
- package/{src/components/vlist/constants.ts → dist/components/vlist/constants.d.ts} +10 -11
- package/dist/components/vlist/features/api.d.ts +7 -0
- package/{src/components/vlist/features/index.ts → dist/components/vlist/features/index.d.ts} +0 -2
- package/dist/components/vlist/features/selection.d.ts +6 -0
- package/dist/components/vlist/features/viewport.d.ts +9 -0
- package/dist/components/vlist/features.d.ts +31 -0
- package/{src/components/vlist/index.ts → dist/components/vlist/index.d.ts} +1 -10
- package/dist/components/vlist/types.d.ts +596 -0
- package/dist/components/vlist/vlist.d.ts +29 -0
- package/dist/core/compose/features/gestures/index.d.ts +86 -0
- package/dist/core/compose/features/gestures/longpress.d.ts +85 -0
- package/dist/core/compose/features/gestures/pan.d.ts +108 -0
- package/dist/core/compose/features/gestures/pinch.d.ts +111 -0
- package/dist/core/compose/features/gestures/rotate.d.ts +111 -0
- package/dist/core/compose/features/gestures/swipe.d.ts +149 -0
- package/dist/core/compose/features/gestures/tap.d.ts +79 -0
- package/{src/core/compose/features/index.ts → dist/core/compose/features/index.d.ts} +1 -2
- package/{src/core/compose/index.ts → dist/core/compose/index.d.ts} +2 -11
- package/{src/core/gestures/index.ts → dist/core/gestures/index.d.ts} +1 -20
- package/dist/core/gestures/longpress.d.ts +23 -0
- package/dist/core/gestures/manager.d.ts +14 -0
- package/dist/core/gestures/pan.d.ts +12 -0
- package/dist/core/gestures/pinch.d.ts +14 -0
- package/dist/core/gestures/rotate.d.ts +14 -0
- package/dist/core/gestures/swipe.d.ts +20 -0
- package/dist/core/gestures/tap.d.ts +12 -0
- package/dist/core/gestures/types.d.ts +320 -0
- package/dist/core/gestures/utils.d.ts +57 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/layout/config.d.ts +33 -0
- package/dist/core/layout/index.d.ts +51 -0
- package/dist/core/layout/jsx.d.ts +65 -0
- package/dist/core/layout/schema.d.ts +112 -0
- package/dist/core/layout/types.d.ts +69 -0
- package/dist/core/viewport/constants.d.ts +105 -0
- package/dist/core/viewport/features/base.d.ts +14 -0
- package/dist/core/viewport/features/collection.d.ts +41 -0
- package/dist/core/viewport/features/events.d.ts +13 -0
- package/{src/core/viewport/features/index.ts → dist/core/viewport/features/index.d.ts} +0 -7
- package/dist/core/viewport/features/item-size.d.ts +30 -0
- package/dist/core/viewport/features/loading.d.ts +34 -0
- package/dist/core/viewport/features/momentum.d.ts +17 -0
- package/dist/core/viewport/features/performance.d.ts +53 -0
- package/dist/core/viewport/features/placeholders.d.ts +38 -0
- package/dist/core/viewport/features/rendering.d.ts +16 -0
- package/dist/core/viewport/features/scrollbar.d.ts +26 -0
- package/dist/core/viewport/features/scrolling.d.ts +16 -0
- package/dist/core/viewport/features/utils.d.ts +43 -0
- package/dist/core/viewport/features/virtual.d.ts +18 -0
- package/{src/core/viewport/index.ts → dist/core/viewport/index.d.ts} +1 -17
- package/dist/core/viewport/types.d.ts +96 -0
- package/dist/core/viewport/utils/speed-tracker.d.ts +22 -0
- package/dist/core/viewport/viewport.d.ts +11 -0
- package/{src/index.ts → dist/index.d.ts} +0 -4
- package/dist/index.js +5143 -0
- package/dist/index.mjs +5111 -0
- package/dist/styles.css +254 -0
- package/dist/styles.css.map +1 -0
- package/package.json +16 -2
- package/.cursorrules +0 -117
- package/AI.md +0 -39
- package/CLAUDE.md +0 -882
- package/build.js +0 -377
- package/index.ts +0 -7
- package/scripts/analyze-orphaned-functions.ts +0 -387
- package/scripts/debug/vlist-selection.ts +0 -121
- package/src/components/vlist/config.ts +0 -323
- package/src/components/vlist/features/api.ts +0 -626
- package/src/components/vlist/features/selection.ts +0 -436
- package/src/components/vlist/features/viewport.ts +0 -59
- package/src/components/vlist/features.ts +0 -112
- package/src/components/vlist/types.ts +0 -723
- package/src/components/vlist/vlist.ts +0 -92
- package/src/core/compose/features/gestures/index.ts +0 -227
- package/src/core/compose/features/gestures/longpress.ts +0 -383
- package/src/core/compose/features/gestures/pan.ts +0 -424
- package/src/core/compose/features/gestures/pinch.ts +0 -475
- package/src/core/compose/features/gestures/rotate.ts +0 -485
- package/src/core/compose/features/gestures/swipe.ts +0 -492
- package/src/core/compose/features/gestures/tap.ts +0 -334
- package/src/core/gestures/longpress.ts +0 -68
- package/src/core/gestures/manager.ts +0 -418
- package/src/core/gestures/pan.ts +0 -48
- package/src/core/gestures/pinch.ts +0 -58
- package/src/core/gestures/rotate.ts +0 -58
- package/src/core/gestures/swipe.ts +0 -66
- package/src/core/gestures/tap.ts +0 -45
- package/src/core/gestures/types.ts +0 -387
- package/src/core/gestures/utils.ts +0 -128
- package/src/core/index.ts +0 -43
- package/src/core/layout/config.ts +0 -102
- package/src/core/layout/index.ts +0 -168
- package/src/core/layout/jsx.ts +0 -174
- package/src/core/layout/schema.ts +0 -1044
- package/src/core/layout/types.ts +0 -95
- package/src/core/viewport/constants.ts +0 -145
- package/src/core/viewport/features/base.ts +0 -73
- package/src/core/viewport/features/collection.ts +0 -1182
- package/src/core/viewport/features/events.ts +0 -130
- package/src/core/viewport/features/item-size.ts +0 -271
- package/src/core/viewport/features/loading.ts +0 -263
- package/src/core/viewport/features/momentum.ts +0 -269
- package/src/core/viewport/features/performance.ts +0 -161
- package/src/core/viewport/features/placeholders.ts +0 -335
- package/src/core/viewport/features/rendering.ts +0 -962
- package/src/core/viewport/features/scrollbar.ts +0 -434
- package/src/core/viewport/features/scrolling.ts +0 -634
- package/src/core/viewport/features/utils.ts +0 -94
- package/src/core/viewport/features/virtual.ts +0 -525
- package/src/core/viewport/types.ts +0 -133
- package/src/core/viewport/utils/speed-tracker.ts +0 -79
- package/src/core/viewport/viewport.ts +0 -265
- package/test/benchmarks/layout/advanced.test.ts +0 -656
- package/test/benchmarks/layout/comparison.test.ts +0 -519
- package/test/benchmarks/layout/performance-comparison.test.ts +0 -274
- package/test/benchmarks/layout/real-components.test.ts +0 -733
- package/test/benchmarks/layout/simple.test.ts +0 -321
- package/test/benchmarks/layout/stress.test.ts +0 -990
- package/test/collection/basic.test.ts +0 -304
- package/test/components/vlist-selection.test.ts +0 -240
- package/test/components/vlist.test.ts +0 -63
- package/test/core/collection/adapter.test.ts +0 -161
- package/test/core/collection/collection.test.ts +0 -394
- package/test/core/layout/layout.test.ts +0 -201
- package/test/utils/dom-helpers.ts +0 -275
- package/test/utils/performance-helpers.ts +0 -392
- package/tsconfig.json +0 -20
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
// src/core/viewport/features/momentum.ts
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Momentum Feature - Adds inertial scrolling to viewport
|
|
5
|
-
* Provides smooth deceleration after touch/mouse drag gestures
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { ViewportComponent, ViewportContext } from "../types";
|
|
9
|
-
import { VIEWPORT_CONSTANTS } from "../constants";
|
|
10
|
-
|
|
11
|
-
interface MomentumConfig {
|
|
12
|
-
enabled?: boolean;
|
|
13
|
-
deceleration?: number;
|
|
14
|
-
minVelocity?: number;
|
|
15
|
-
minDuration?: number;
|
|
16
|
-
minVelocityThreshold?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Adds momentum scrolling to viewport
|
|
21
|
-
*/
|
|
22
|
-
export const withMomentum = (config: MomentumConfig = {}) => {
|
|
23
|
-
return <T extends ViewportContext & ViewportComponent>(component: T): T => {
|
|
24
|
-
const {
|
|
25
|
-
enabled = VIEWPORT_CONSTANTS.MOMENTUM.ENABLED,
|
|
26
|
-
deceleration = VIEWPORT_CONSTANTS.MOMENTUM.DECELERATION_FACTOR,
|
|
27
|
-
minVelocity = VIEWPORT_CONSTANTS.MOMENTUM.MIN_VELOCITY,
|
|
28
|
-
minDuration = VIEWPORT_CONSTANTS.MOMENTUM.MIN_DURATION,
|
|
29
|
-
minVelocityThreshold = VIEWPORT_CONSTANTS.MOMENTUM.MIN_VELOCITY_THRESHOLD,
|
|
30
|
-
} = config;
|
|
31
|
-
|
|
32
|
-
// Always apply the feature, but check isEnabled at runtime
|
|
33
|
-
|
|
34
|
-
// Momentum state
|
|
35
|
-
let momentumAnimationId: number | null = null;
|
|
36
|
-
let isTouching = false;
|
|
37
|
-
let isMouseDragging = false;
|
|
38
|
-
let lastTouchPosition = 0;
|
|
39
|
-
let lastMousePosition = 0;
|
|
40
|
-
let touchStartTime = 0;
|
|
41
|
-
let viewportState: any;
|
|
42
|
-
let scrollingState: any;
|
|
43
|
-
let isEnabled = enabled; // Track current enabled state
|
|
44
|
-
|
|
45
|
-
// Get references after initialization
|
|
46
|
-
const originalInitialize = component.viewport.initialize;
|
|
47
|
-
component.viewport.initialize = () => {
|
|
48
|
-
const result = originalInitialize();
|
|
49
|
-
// Skip if already initialized
|
|
50
|
-
if (result === false) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Get viewport and scrolling states
|
|
55
|
-
viewportState = (component.viewport as any).state;
|
|
56
|
-
scrollingState = (component.viewport as any).scrollingState;
|
|
57
|
-
return result;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
// Start momentum animation
|
|
61
|
-
const startMomentum = (initialVelocity: number) => {
|
|
62
|
-
// Cancel any existing momentum
|
|
63
|
-
if (momentumAnimationId) {
|
|
64
|
-
cancelAnimationFrame(momentumAnimationId);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
let velocity = initialVelocity;
|
|
68
|
-
|
|
69
|
-
const animate = () => {
|
|
70
|
-
// Apply deceleration
|
|
71
|
-
velocity *= deceleration;
|
|
72
|
-
|
|
73
|
-
// Stop if velocity is too small
|
|
74
|
-
if (Math.abs(velocity) < minVelocity) {
|
|
75
|
-
momentumAnimationId = null;
|
|
76
|
-
// Reset velocity in scrolling feature
|
|
77
|
-
if (scrollingState) {
|
|
78
|
-
scrollingState.setVelocityToZero?.();
|
|
79
|
-
}
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Calculate scroll delta (velocity is in px/ms, so multiply by frame time)
|
|
84
|
-
const frameDelta = velocity * VIEWPORT_CONSTANTS.MOMENTUM.FRAME_TIME;
|
|
85
|
-
|
|
86
|
-
// Use scrolling feature's API to update position
|
|
87
|
-
if (component.viewport.scrollBy) {
|
|
88
|
-
component.viewport.scrollBy(frameDelta);
|
|
89
|
-
|
|
90
|
-
// Continue animation
|
|
91
|
-
momentumAnimationId = requestAnimationFrame(animate);
|
|
92
|
-
} else {
|
|
93
|
-
// No scrollBy method, stop momentum
|
|
94
|
-
momentumAnimationId = null;
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
momentumAnimationId = requestAnimationFrame(animate);
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
// Touch event handlers
|
|
102
|
-
const handleTouchStart = (e: TouchEvent) => {
|
|
103
|
-
isTouching = true;
|
|
104
|
-
const touch = e.touches[0];
|
|
105
|
-
const orientation = viewportState?.orientation || "vertical";
|
|
106
|
-
lastTouchPosition =
|
|
107
|
-
orientation === "vertical" ? touch.clientY : touch.clientX;
|
|
108
|
-
touchStartTime = Date.now();
|
|
109
|
-
|
|
110
|
-
// Cancel any ongoing momentum
|
|
111
|
-
if (momentumAnimationId) {
|
|
112
|
-
cancelAnimationFrame(momentumAnimationId);
|
|
113
|
-
momentumAnimationId = null;
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const handleTouchMove = (e: TouchEvent) => {
|
|
118
|
-
if (!isTouching) return;
|
|
119
|
-
|
|
120
|
-
e.preventDefault(); // Prevent native scrolling
|
|
121
|
-
|
|
122
|
-
const touch = e.touches[0];
|
|
123
|
-
const orientation = viewportState?.orientation || "vertical";
|
|
124
|
-
const currentPosition =
|
|
125
|
-
orientation === "vertical" ? touch.clientY : touch.clientX;
|
|
126
|
-
const delta = lastTouchPosition - currentPosition; // Inverted for natural scrolling
|
|
127
|
-
lastTouchPosition = currentPosition;
|
|
128
|
-
|
|
129
|
-
// Use scrolling feature's API
|
|
130
|
-
if (component.viewport.scrollBy) {
|
|
131
|
-
component.viewport.scrollBy(delta);
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
const handleTouchEnd = () => {
|
|
136
|
-
if (!isTouching) return;
|
|
137
|
-
isTouching = false;
|
|
138
|
-
|
|
139
|
-
const touchEndTime = Date.now();
|
|
140
|
-
const touchDuration = touchEndTime - touchStartTime;
|
|
141
|
-
|
|
142
|
-
// Get current velocity from scrolling feature
|
|
143
|
-
const velocity = component.viewport.getVelocity?.() || 0;
|
|
144
|
-
|
|
145
|
-
// Only start momentum if the touch was quick enough and we have velocity
|
|
146
|
-
if (
|
|
147
|
-
touchDuration < minDuration &&
|
|
148
|
-
Math.abs(velocity) > minVelocityThreshold
|
|
149
|
-
) {
|
|
150
|
-
startMomentum(velocity);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// Mouse event handlers for desktop
|
|
155
|
-
const handleMouseDown = (e: MouseEvent) => {
|
|
156
|
-
isMouseDragging = true;
|
|
157
|
-
const orientation = viewportState?.orientation || "vertical";
|
|
158
|
-
lastMousePosition = orientation === "vertical" ? e.clientY : e.clientX;
|
|
159
|
-
touchStartTime = Date.now();
|
|
160
|
-
|
|
161
|
-
// Cancel any ongoing momentum
|
|
162
|
-
if (momentumAnimationId) {
|
|
163
|
-
cancelAnimationFrame(momentumAnimationId);
|
|
164
|
-
momentumAnimationId = null;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Prevent text selection
|
|
168
|
-
e.preventDefault();
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const handleMouseMove = (e: MouseEvent) => {
|
|
172
|
-
if (!isMouseDragging) return;
|
|
173
|
-
|
|
174
|
-
const orientation = viewportState?.orientation || "vertical";
|
|
175
|
-
const currentPosition =
|
|
176
|
-
orientation === "vertical" ? e.clientY : e.clientX;
|
|
177
|
-
const delta = lastMousePosition - currentPosition;
|
|
178
|
-
lastMousePosition = currentPosition;
|
|
179
|
-
|
|
180
|
-
// Use scrolling feature's API
|
|
181
|
-
if (component.viewport.scrollBy) {
|
|
182
|
-
component.viewport.scrollBy(delta);
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
const handleMouseUp = () => {
|
|
187
|
-
if (!isMouseDragging) return;
|
|
188
|
-
isMouseDragging = false;
|
|
189
|
-
|
|
190
|
-
const mouseUpTime = Date.now();
|
|
191
|
-
const dragDuration = mouseUpTime - touchStartTime;
|
|
192
|
-
|
|
193
|
-
// Get current velocity from scrolling feature
|
|
194
|
-
const velocity = component.viewport.getVelocity?.() || 0;
|
|
195
|
-
|
|
196
|
-
// Start momentum for quick drags
|
|
197
|
-
if (
|
|
198
|
-
dragDuration < minDuration &&
|
|
199
|
-
Math.abs(velocity) > minVelocityThreshold
|
|
200
|
-
) {
|
|
201
|
-
startMomentum(velocity);
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// Override initialize to add event listeners
|
|
206
|
-
const originalInit = component.viewport.initialize;
|
|
207
|
-
component.viewport.initialize = () => {
|
|
208
|
-
const result = originalInit();
|
|
209
|
-
// Skip if already initialized
|
|
210
|
-
if (result === false) {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const viewportElement =
|
|
215
|
-
(component as any).viewportElement ||
|
|
216
|
-
(component.viewport as any).state?.viewportElement;
|
|
217
|
-
|
|
218
|
-
if (viewportElement) {
|
|
219
|
-
// Touch events
|
|
220
|
-
viewportElement.addEventListener("touchstart", handleTouchStart, {
|
|
221
|
-
passive: true,
|
|
222
|
-
});
|
|
223
|
-
viewportElement.addEventListener("touchmove", handleTouchMove, {
|
|
224
|
-
passive: false,
|
|
225
|
-
});
|
|
226
|
-
viewportElement.addEventListener("touchend", handleTouchEnd, {
|
|
227
|
-
passive: true,
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
// Mouse events for desktop dragging
|
|
231
|
-
viewportElement.addEventListener("mousedown", handleMouseDown);
|
|
232
|
-
viewportElement.addEventListener("mousemove", handleMouseMove);
|
|
233
|
-
viewportElement.addEventListener("mouseup", handleMouseUp);
|
|
234
|
-
viewportElement.addEventListener("mouseleave", handleMouseUp);
|
|
235
|
-
|
|
236
|
-
// Store reference for cleanup
|
|
237
|
-
(component as any)._momentumViewportElement = viewportElement;
|
|
238
|
-
}
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
// Clean up on destroy
|
|
242
|
-
if ("destroy" in component && typeof component.destroy === "function") {
|
|
243
|
-
const originalDestroy = component.destroy;
|
|
244
|
-
component.destroy = () => {
|
|
245
|
-
// Remove event listeners
|
|
246
|
-
const viewportElement = (component as any)._momentumViewportElement;
|
|
247
|
-
if (viewportElement) {
|
|
248
|
-
viewportElement.removeEventListener("touchstart", handleTouchStart);
|
|
249
|
-
viewportElement.removeEventListener("touchmove", handleTouchMove);
|
|
250
|
-
viewportElement.removeEventListener("touchend", handleTouchEnd);
|
|
251
|
-
viewportElement.removeEventListener("mousedown", handleMouseDown);
|
|
252
|
-
viewportElement.removeEventListener("mousemove", handleMouseMove);
|
|
253
|
-
viewportElement.removeEventListener("mouseup", handleMouseUp);
|
|
254
|
-
viewportElement.removeEventListener("mouseleave", handleMouseUp);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// Cancel momentum animation
|
|
258
|
-
if (momentumAnimationId) {
|
|
259
|
-
cancelAnimationFrame(momentumAnimationId);
|
|
260
|
-
momentumAnimationId = null;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
originalDestroy();
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return component;
|
|
268
|
-
};
|
|
269
|
-
};
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/compose/features
|
|
3
|
-
* @description Performance tracking feature for components
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Performance metrics interface
|
|
8
|
-
*/
|
|
9
|
-
export interface PerformanceMetrics {
|
|
10
|
-
renderCount: number;
|
|
11
|
-
scrollCount: number;
|
|
12
|
-
averageRenderTime: number;
|
|
13
|
-
averageScrollTime: number;
|
|
14
|
-
memoryUsage: number;
|
|
15
|
-
virtualizedItems: number;
|
|
16
|
-
recycledElements: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Performance configuration
|
|
21
|
-
*/
|
|
22
|
-
export interface PerformanceConfig {
|
|
23
|
-
recycleElements?: boolean;
|
|
24
|
-
bufferSize?: number;
|
|
25
|
-
trackMemory?: boolean;
|
|
26
|
-
maxSamples?: number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Component with performance tracking capabilities
|
|
31
|
-
*/
|
|
32
|
-
export interface PerformanceComponent {
|
|
33
|
-
getMetrics: () => PerformanceMetrics;
|
|
34
|
-
resetMetrics: () => any;
|
|
35
|
-
_trackScroll?: (startTime: number) => void;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Adds performance tracking to a component
|
|
40
|
-
*
|
|
41
|
-
* @param config - Performance configuration
|
|
42
|
-
* @returns Component enhancer that adds performance tracking
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* const component = pipe(
|
|
47
|
-
* createBase,
|
|
48
|
-
* withElement(),
|
|
49
|
-
* withPerformance({
|
|
50
|
-
* recycleElements: true,
|
|
51
|
-
* bufferSize: 50,
|
|
52
|
-
* trackMemory: true
|
|
53
|
-
* })
|
|
54
|
-
* )(config);
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export function withPerformance(config: PerformanceConfig = {}) {
|
|
58
|
-
return (component: any): any & PerformanceComponent => {
|
|
59
|
-
console.log("⚡ [MTRL-ADDONS] Adding performance tracking");
|
|
60
|
-
|
|
61
|
-
const maxSamples = config.maxSamples || 100;
|
|
62
|
-
|
|
63
|
-
let performanceMetrics: PerformanceMetrics = {
|
|
64
|
-
renderCount: 0,
|
|
65
|
-
scrollCount: 0,
|
|
66
|
-
averageRenderTime: 0,
|
|
67
|
-
averageScrollTime: 0,
|
|
68
|
-
memoryUsage: 0,
|
|
69
|
-
virtualizedItems: 0,
|
|
70
|
-
recycledElements: 0,
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
let renderTimes: number[] = [];
|
|
74
|
-
let scrollTimes: number[] = [];
|
|
75
|
-
|
|
76
|
-
const trackRender = (startTime: number) => {
|
|
77
|
-
const renderTime = performance.now() - startTime;
|
|
78
|
-
renderTimes.push(renderTime);
|
|
79
|
-
performanceMetrics.renderCount++;
|
|
80
|
-
performanceMetrics.averageRenderTime =
|
|
81
|
-
renderTimes.reduce((a, b) => a + b, 0) / renderTimes.length;
|
|
82
|
-
|
|
83
|
-
if (renderTimes.length > maxSamples) {
|
|
84
|
-
renderTimes = renderTimes.slice(-maxSamples);
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const trackScroll = (startTime: number) => {
|
|
89
|
-
const scrollTime = performance.now() - startTime;
|
|
90
|
-
scrollTimes.push(scrollTime);
|
|
91
|
-
performanceMetrics.scrollCount++;
|
|
92
|
-
performanceMetrics.averageScrollTime =
|
|
93
|
-
scrollTimes.reduce((a, b) => a + b, 0) / scrollTimes.length;
|
|
94
|
-
|
|
95
|
-
if (scrollTimes.length > maxSamples) {
|
|
96
|
-
scrollTimes = scrollTimes.slice(-maxSamples);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// Wrap render method with performance tracking if it exists
|
|
101
|
-
const originalRender = component.render?.bind(component);
|
|
102
|
-
if (originalRender) {
|
|
103
|
-
component.render = () => {
|
|
104
|
-
const startTime = performance.now();
|
|
105
|
-
originalRender();
|
|
106
|
-
trackRender(startTime);
|
|
107
|
-
|
|
108
|
-
// Emit performance event using component's event system
|
|
109
|
-
if (component.emit) {
|
|
110
|
-
component.emit("performance:render", {
|
|
111
|
-
renderTime: performance.now() - startTime,
|
|
112
|
-
renderCount: performanceMetrics.renderCount,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Performance methods
|
|
119
|
-
return {
|
|
120
|
-
...component,
|
|
121
|
-
|
|
122
|
-
getMetrics(): PerformanceMetrics {
|
|
123
|
-
return {
|
|
124
|
-
...performanceMetrics,
|
|
125
|
-
memoryUsage: config.trackMemory
|
|
126
|
-
? (performance as any).memory?.usedJSHeapSize || 0
|
|
127
|
-
: 0,
|
|
128
|
-
virtualizedItems: component.getItems
|
|
129
|
-
? component.getItems().length
|
|
130
|
-
: 0,
|
|
131
|
-
recycledElements: component.element.children.length,
|
|
132
|
-
};
|
|
133
|
-
},
|
|
134
|
-
|
|
135
|
-
resetMetrics() {
|
|
136
|
-
performanceMetrics = {
|
|
137
|
-
renderCount: 0,
|
|
138
|
-
scrollCount: 0,
|
|
139
|
-
averageRenderTime: 0,
|
|
140
|
-
averageScrollTime: 0,
|
|
141
|
-
memoryUsage: 0,
|
|
142
|
-
virtualizedItems: 0,
|
|
143
|
-
recycledElements: 0,
|
|
144
|
-
};
|
|
145
|
-
renderTimes = [];
|
|
146
|
-
scrollTimes = [];
|
|
147
|
-
console.log("📊 [MTRL-ADDONS] Performance metrics reset");
|
|
148
|
-
|
|
149
|
-
// Emit reset event using component's event system
|
|
150
|
-
if (component.emit) {
|
|
151
|
-
component.emit("performance:reset", {});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return component;
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
// Internal tracking helpers
|
|
158
|
-
_trackScroll: trackScroll,
|
|
159
|
-
};
|
|
160
|
-
};
|
|
161
|
-
}
|