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.
Files changed (129) hide show
  1. package/{src/components/index.ts → dist/components/index.d.ts} +0 -2
  2. package/dist/components/vlist/config.d.ts +86 -0
  3. package/{src/components/vlist/constants.ts → dist/components/vlist/constants.d.ts} +10 -11
  4. package/dist/components/vlist/features/api.d.ts +7 -0
  5. package/{src/components/vlist/features/index.ts → dist/components/vlist/features/index.d.ts} +0 -2
  6. package/dist/components/vlist/features/selection.d.ts +6 -0
  7. package/dist/components/vlist/features/viewport.d.ts +9 -0
  8. package/dist/components/vlist/features.d.ts +31 -0
  9. package/{src/components/vlist/index.ts → dist/components/vlist/index.d.ts} +1 -10
  10. package/dist/components/vlist/types.d.ts +596 -0
  11. package/dist/components/vlist/vlist.d.ts +29 -0
  12. package/dist/core/compose/features/gestures/index.d.ts +86 -0
  13. package/dist/core/compose/features/gestures/longpress.d.ts +85 -0
  14. package/dist/core/compose/features/gestures/pan.d.ts +108 -0
  15. package/dist/core/compose/features/gestures/pinch.d.ts +111 -0
  16. package/dist/core/compose/features/gestures/rotate.d.ts +111 -0
  17. package/dist/core/compose/features/gestures/swipe.d.ts +149 -0
  18. package/dist/core/compose/features/gestures/tap.d.ts +79 -0
  19. package/{src/core/compose/features/index.ts → dist/core/compose/features/index.d.ts} +1 -2
  20. package/{src/core/compose/index.ts → dist/core/compose/index.d.ts} +2 -11
  21. package/{src/core/gestures/index.ts → dist/core/gestures/index.d.ts} +1 -20
  22. package/dist/core/gestures/longpress.d.ts +23 -0
  23. package/dist/core/gestures/manager.d.ts +14 -0
  24. package/dist/core/gestures/pan.d.ts +12 -0
  25. package/dist/core/gestures/pinch.d.ts +14 -0
  26. package/dist/core/gestures/rotate.d.ts +14 -0
  27. package/dist/core/gestures/swipe.d.ts +20 -0
  28. package/dist/core/gestures/tap.d.ts +12 -0
  29. package/dist/core/gestures/types.d.ts +320 -0
  30. package/dist/core/gestures/utils.d.ts +57 -0
  31. package/dist/core/index.d.ts +13 -0
  32. package/dist/core/layout/config.d.ts +33 -0
  33. package/dist/core/layout/index.d.ts +51 -0
  34. package/dist/core/layout/jsx.d.ts +65 -0
  35. package/dist/core/layout/schema.d.ts +112 -0
  36. package/dist/core/layout/types.d.ts +69 -0
  37. package/dist/core/viewport/constants.d.ts +105 -0
  38. package/dist/core/viewport/features/base.d.ts +14 -0
  39. package/dist/core/viewport/features/collection.d.ts +41 -0
  40. package/dist/core/viewport/features/events.d.ts +13 -0
  41. package/{src/core/viewport/features/index.ts → dist/core/viewport/features/index.d.ts} +0 -7
  42. package/dist/core/viewport/features/item-size.d.ts +30 -0
  43. package/dist/core/viewport/features/loading.d.ts +34 -0
  44. package/dist/core/viewport/features/momentum.d.ts +17 -0
  45. package/dist/core/viewport/features/performance.d.ts +53 -0
  46. package/dist/core/viewport/features/placeholders.d.ts +38 -0
  47. package/dist/core/viewport/features/rendering.d.ts +16 -0
  48. package/dist/core/viewport/features/scrollbar.d.ts +26 -0
  49. package/dist/core/viewport/features/scrolling.d.ts +16 -0
  50. package/dist/core/viewport/features/utils.d.ts +43 -0
  51. package/dist/core/viewport/features/virtual.d.ts +18 -0
  52. package/{src/core/viewport/index.ts → dist/core/viewport/index.d.ts} +1 -17
  53. package/dist/core/viewport/types.d.ts +96 -0
  54. package/dist/core/viewport/utils/speed-tracker.d.ts +22 -0
  55. package/dist/core/viewport/viewport.d.ts +11 -0
  56. package/{src/index.ts → dist/index.d.ts} +0 -4
  57. package/dist/index.js +5143 -0
  58. package/dist/index.mjs +5111 -0
  59. package/dist/styles.css +254 -0
  60. package/dist/styles.css.map +1 -0
  61. package/package.json +16 -2
  62. package/.cursorrules +0 -117
  63. package/AI.md +0 -39
  64. package/CLAUDE.md +0 -882
  65. package/build.js +0 -377
  66. package/index.ts +0 -7
  67. package/scripts/analyze-orphaned-functions.ts +0 -387
  68. package/scripts/debug/vlist-selection.ts +0 -121
  69. package/src/components/vlist/config.ts +0 -323
  70. package/src/components/vlist/features/api.ts +0 -626
  71. package/src/components/vlist/features/selection.ts +0 -436
  72. package/src/components/vlist/features/viewport.ts +0 -59
  73. package/src/components/vlist/features.ts +0 -112
  74. package/src/components/vlist/types.ts +0 -723
  75. package/src/components/vlist/vlist.ts +0 -92
  76. package/src/core/compose/features/gestures/index.ts +0 -227
  77. package/src/core/compose/features/gestures/longpress.ts +0 -383
  78. package/src/core/compose/features/gestures/pan.ts +0 -424
  79. package/src/core/compose/features/gestures/pinch.ts +0 -475
  80. package/src/core/compose/features/gestures/rotate.ts +0 -485
  81. package/src/core/compose/features/gestures/swipe.ts +0 -492
  82. package/src/core/compose/features/gestures/tap.ts +0 -334
  83. package/src/core/gestures/longpress.ts +0 -68
  84. package/src/core/gestures/manager.ts +0 -418
  85. package/src/core/gestures/pan.ts +0 -48
  86. package/src/core/gestures/pinch.ts +0 -58
  87. package/src/core/gestures/rotate.ts +0 -58
  88. package/src/core/gestures/swipe.ts +0 -66
  89. package/src/core/gestures/tap.ts +0 -45
  90. package/src/core/gestures/types.ts +0 -387
  91. package/src/core/gestures/utils.ts +0 -128
  92. package/src/core/index.ts +0 -43
  93. package/src/core/layout/config.ts +0 -102
  94. package/src/core/layout/index.ts +0 -168
  95. package/src/core/layout/jsx.ts +0 -174
  96. package/src/core/layout/schema.ts +0 -1044
  97. package/src/core/layout/types.ts +0 -95
  98. package/src/core/viewport/constants.ts +0 -145
  99. package/src/core/viewport/features/base.ts +0 -73
  100. package/src/core/viewport/features/collection.ts +0 -1182
  101. package/src/core/viewport/features/events.ts +0 -130
  102. package/src/core/viewport/features/item-size.ts +0 -271
  103. package/src/core/viewport/features/loading.ts +0 -263
  104. package/src/core/viewport/features/momentum.ts +0 -269
  105. package/src/core/viewport/features/performance.ts +0 -161
  106. package/src/core/viewport/features/placeholders.ts +0 -335
  107. package/src/core/viewport/features/rendering.ts +0 -962
  108. package/src/core/viewport/features/scrollbar.ts +0 -434
  109. package/src/core/viewport/features/scrolling.ts +0 -634
  110. package/src/core/viewport/features/utils.ts +0 -94
  111. package/src/core/viewport/features/virtual.ts +0 -525
  112. package/src/core/viewport/types.ts +0 -133
  113. package/src/core/viewport/utils/speed-tracker.ts +0 -79
  114. package/src/core/viewport/viewport.ts +0 -265
  115. package/test/benchmarks/layout/advanced.test.ts +0 -656
  116. package/test/benchmarks/layout/comparison.test.ts +0 -519
  117. package/test/benchmarks/layout/performance-comparison.test.ts +0 -274
  118. package/test/benchmarks/layout/real-components.test.ts +0 -733
  119. package/test/benchmarks/layout/simple.test.ts +0 -321
  120. package/test/benchmarks/layout/stress.test.ts +0 -990
  121. package/test/collection/basic.test.ts +0 -304
  122. package/test/components/vlist-selection.test.ts +0 -240
  123. package/test/components/vlist.test.ts +0 -63
  124. package/test/core/collection/adapter.test.ts +0 -161
  125. package/test/core/collection/collection.test.ts +0 -394
  126. package/test/core/layout/layout.test.ts +0 -201
  127. package/test/utils/dom-helpers.ts +0 -275
  128. package/test/utils/performance-helpers.ts +0 -392
  129. 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
- }