mtrl-addons 0.2.2 → 0.2.3

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 (128) 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 +5 -1
  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/scripts/analyze-orphaned-functions.ts +0 -387
  67. package/scripts/debug/vlist-selection.ts +0 -121
  68. package/src/components/vlist/config.ts +0 -323
  69. package/src/components/vlist/features/api.ts +0 -626
  70. package/src/components/vlist/features/selection.ts +0 -436
  71. package/src/components/vlist/features/viewport.ts +0 -59
  72. package/src/components/vlist/features.ts +0 -112
  73. package/src/components/vlist/types.ts +0 -723
  74. package/src/components/vlist/vlist.ts +0 -92
  75. package/src/core/compose/features/gestures/index.ts +0 -227
  76. package/src/core/compose/features/gestures/longpress.ts +0 -383
  77. package/src/core/compose/features/gestures/pan.ts +0 -424
  78. package/src/core/compose/features/gestures/pinch.ts +0 -475
  79. package/src/core/compose/features/gestures/rotate.ts +0 -485
  80. package/src/core/compose/features/gestures/swipe.ts +0 -492
  81. package/src/core/compose/features/gestures/tap.ts +0 -334
  82. package/src/core/gestures/longpress.ts +0 -68
  83. package/src/core/gestures/manager.ts +0 -418
  84. package/src/core/gestures/pan.ts +0 -48
  85. package/src/core/gestures/pinch.ts +0 -58
  86. package/src/core/gestures/rotate.ts +0 -58
  87. package/src/core/gestures/swipe.ts +0 -66
  88. package/src/core/gestures/tap.ts +0 -45
  89. package/src/core/gestures/types.ts +0 -387
  90. package/src/core/gestures/utils.ts +0 -128
  91. package/src/core/index.ts +0 -43
  92. package/src/core/layout/config.ts +0 -102
  93. package/src/core/layout/index.ts +0 -168
  94. package/src/core/layout/jsx.ts +0 -174
  95. package/src/core/layout/schema.ts +0 -1044
  96. package/src/core/layout/types.ts +0 -95
  97. package/src/core/viewport/constants.ts +0 -145
  98. package/src/core/viewport/features/base.ts +0 -73
  99. package/src/core/viewport/features/collection.ts +0 -1182
  100. package/src/core/viewport/features/events.ts +0 -130
  101. package/src/core/viewport/features/item-size.ts +0 -271
  102. package/src/core/viewport/features/loading.ts +0 -263
  103. package/src/core/viewport/features/momentum.ts +0 -269
  104. package/src/core/viewport/features/performance.ts +0 -161
  105. package/src/core/viewport/features/placeholders.ts +0 -335
  106. package/src/core/viewport/features/rendering.ts +0 -962
  107. package/src/core/viewport/features/scrollbar.ts +0 -434
  108. package/src/core/viewport/features/scrolling.ts +0 -634
  109. package/src/core/viewport/features/utils.ts +0 -94
  110. package/src/core/viewport/features/virtual.ts +0 -525
  111. package/src/core/viewport/types.ts +0 -133
  112. package/src/core/viewport/utils/speed-tracker.ts +0 -79
  113. package/src/core/viewport/viewport.ts +0 -265
  114. package/test/benchmarks/layout/advanced.test.ts +0 -656
  115. package/test/benchmarks/layout/comparison.test.ts +0 -519
  116. package/test/benchmarks/layout/performance-comparison.test.ts +0 -274
  117. package/test/benchmarks/layout/real-components.test.ts +0 -733
  118. package/test/benchmarks/layout/simple.test.ts +0 -321
  119. package/test/benchmarks/layout/stress.test.ts +0 -990
  120. package/test/collection/basic.test.ts +0 -304
  121. package/test/components/vlist-selection.test.ts +0 -240
  122. package/test/components/vlist.test.ts +0 -63
  123. package/test/core/collection/adapter.test.ts +0 -161
  124. package/test/core/collection/collection.test.ts +0 -394
  125. package/test/core/layout/layout.test.ts +0 -201
  126. package/test/utils/dom-helpers.ts +0 -275
  127. package/test/utils/performance-helpers.ts +0 -392
  128. 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
- }