mtrl-addons 0.2.1 → 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 -9
  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 +6 -1
  62. package/src/styles/components/_vlist.scss +234 -213
  63. package/.cursorrules +0 -117
  64. package/AI.md +0 -241
  65. package/build.js +0 -201
  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 -322
  70. package/src/components/vlist/features/selection.ts +0 -444
  71. package/src/components/vlist/features/viewport.ts +0 -65
  72. package/src/components/vlist/features.ts +0 -112
  73. package/src/components/vlist/types.ts +0 -591
  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 -1001
  96. package/src/core/layout/types.ts +0 -95
  97. package/src/core/viewport/constants.ts +0 -140
  98. package/src/core/viewport/features/base.ts +0 -73
  99. package/src/core/viewport/features/collection.ts +0 -882
  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 -260
  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 -568
  107. package/src/core/viewport/features/scrollbar.ts +0 -434
  108. package/src/core/viewport/features/scrolling.ts +0 -618
  109. package/src/core/viewport/features/utils.ts +0 -88
  110. package/src/core/viewport/features/virtual.ts +0 -384
  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 -246
  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,387 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import * as fs from "fs";
4
- import * as path from "path";
5
-
6
- // List of orphaned functions from the previous analysis
7
- const orphanedFunctions = [
8
- {
9
- name: "hasOverlappingPendingRange",
10
- file: "features/collection/collection.ts",
11
- line: 198,
12
- },
13
- {
14
- name: "getCursorForOffset",
15
- file: "features/collection/collection.ts",
16
- line: 603,
17
- },
18
- { name: "getElements", file: "features/viewport/scrollbar.ts", line: 57 },
19
- {
20
- name: "updateScrollbarDimensions",
21
- file: "features/viewport/scrollbar.ts",
22
- line: 104,
23
- },
24
- {
25
- name: "updateScrollbarPosition",
26
- file: "features/viewport/scrollbar.ts",
27
- line: 127,
28
- },
29
- {
30
- name: "getScrollRatioFromVirtualPosition",
31
- file: "features/viewport/scrollbar.ts",
32
- line: 141,
33
- },
34
- {
35
- name: "getVirtualPositionFromScrollRatio",
36
- file: "features/viewport/scrollbar.ts",
37
- line: 152,
38
- },
39
- { name: "hideScrollbar", file: "features/viewport/scrollbar.ts", line: 179 },
40
- {
41
- name: "handleThumbMouseDown",
42
- file: "features/viewport/scrollbar.ts",
43
- line: 190,
44
- },
45
- {
46
- name: "handleThumbDrag",
47
- file: "features/viewport/scrollbar.ts",
48
- line: 210,
49
- },
50
- {
51
- name: "handleThumbMouseUp",
52
- file: "features/viewport/scrollbar.ts",
53
- line: 243,
54
- },
55
- {
56
- name: "handleTrackClick",
57
- file: "features/viewport/scrollbar.ts",
58
- line: 319,
59
- },
60
- {
61
- name: "generatePlaceholderItems",
62
- file: "features/viewport/placeholders.ts",
63
- line: 175,
64
- },
65
- {
66
- name: "hasAnalyzedStructure",
67
- file: "features/viewport/placeholders.ts",
68
- line: 242,
69
- },
70
- {
71
- name: "initializeTracking",
72
- file: "features/viewport/scrolling.ts",
73
- line: 186,
74
- },
75
- {
76
- name: "startIdleDetection",
77
- file: "features/viewport/scrolling.ts",
78
- line: 194,
79
- },
80
- { name: "checkIdle", file: "features/viewport/scrolling.ts", line: 195 },
81
- {
82
- name: "setVelocityToZero",
83
- file: "features/viewport/scrolling.ts",
84
- line: 219,
85
- },
86
- {
87
- name: "updateVelocityTracking",
88
- file: "features/viewport/scrolling.ts",
89
- line: 255,
90
- },
91
- {
92
- name: "calculateWindowedVelocity",
93
- file: "features/viewport/scrolling.ts",
94
- line: 340,
95
- },
96
- {
97
- name: "setupScrollbarEvents",
98
- file: "features/viewport/scrolling.ts",
99
- line: 635,
100
- },
101
- {
102
- name: "checkForMissingData",
103
- file: "features/viewport/viewport.ts",
104
- line: 155,
105
- },
106
- {
107
- name: "setupCollectionEventListeners",
108
- file: "features/viewport/viewport.ts",
109
- line: 298,
110
- },
111
- {
112
- name: "setupScrollbarPlugin",
113
- file: "features/viewport/viewport.ts",
114
- line: 437,
115
- },
116
- { name: "setupContainer", file: "features/viewport/viewport.ts", line: 509 },
117
- {
118
- name: "setupResizeObserver",
119
- file: "features/viewport/viewport.ts",
120
- line: 557,
121
- },
122
- {
123
- name: "measureContainer",
124
- file: "features/viewport/viewport.ts",
125
- line: 571,
126
- },
127
- {
128
- name: "calculateIndexFromVirtualPosition",
129
- file: "features/viewport/virtual.ts",
130
- line: 241,
131
- },
132
- {
133
- name: "getMaxScrollPosition",
134
- file: "features/viewport/virtual.ts",
135
- line: 263,
136
- },
137
- { name: "getRangeKey", file: "features/viewport/loading.ts", line: 75 },
138
- { name: "canLoad", file: "features/viewport/loading.ts", line: 82 },
139
- { name: "processQueue", file: "features/viewport/loading.ts", line: 109 },
140
- { name: "executeLoad", file: "features/viewport/loading.ts", line: 181 },
141
- {
142
- name: "cancelPendingLoads",
143
- file: "features/viewport/loading.ts",
144
- line: 223,
145
- },
146
- { name: "cacheItemSize", file: "features/viewport/item-size.ts", line: 69 },
147
- {
148
- name: "triggerBatchedUpdates",
149
- file: "features/viewport/item-size.ts",
150
- line: 83,
151
- },
152
- {
153
- name: "scheduleBatchedUpdates",
154
- file: "features/viewport/item-size.ts",
155
- line: 101,
156
- },
157
- {
158
- name: "updateEstimatedSize",
159
- file: "features/viewport/item-size.ts",
160
- line: 153,
161
- },
162
- {
163
- name: "calculateTotalSize",
164
- file: "features/viewport/item-size.ts",
165
- line: 183,
166
- },
167
- { name: "clearCache", file: "features/viewport/item-size.ts", line: 216 },
168
- {
169
- name: "getMeasuredSizes",
170
- file: "features/viewport/item-size.ts",
171
- line: 231,
172
- },
173
- ];
174
-
175
- const underusedExports = [
176
- {
177
- name: "getLoadingTemplate",
178
- file: "features/viewport/template.ts",
179
- line: 59,
180
- },
181
- { name: "getEmptyTemplate", file: "features/viewport/template.ts", line: 72 },
182
- { name: "getErrorTemplate", file: "features/viewport/template.ts", line: 85 },
183
- {
184
- name: "convertRenderItemToTemplate",
185
- file: "features/viewport/template.ts",
186
- line: 99,
187
- },
188
- {
189
- name: "substituteVariables",
190
- file: "features/viewport/template.ts",
191
- line: 177,
192
- },
193
- {
194
- name: "calculateOptimalOverscan",
195
- file: "utils/calculations.ts",
196
- line: 144,
197
- },
198
- { name: "validateContainer", file: "config.ts", line: 232 },
199
- { name: "validateListManagerConfig", file: "config.ts", line: 253 },
200
- { name: "getFeatureConfigs", file: "config.ts", line: 356 },
201
- ];
202
-
203
- interface FunctionCategory {
204
- category: string;
205
- description: string;
206
- functions: typeof orphanedFunctions;
207
- recommendation: string;
208
- }
209
-
210
- function categorizeOrphanedFunctions(): FunctionCategory[] {
211
- const categories: FunctionCategory[] = [
212
- {
213
- category: "Scrollbar Internal Helpers",
214
- description:
215
- "Private scrollbar functions that might be part of internal implementation",
216
- functions: orphanedFunctions.filter(
217
- (f) =>
218
- f.file.includes("scrollbar.ts") &&
219
- [
220
- "getElements",
221
- "updateScrollbarDimensions",
222
- "updateScrollbarPosition",
223
- "getScrollRatioFromVirtualPosition",
224
- "getVirtualPositionFromScrollRatio",
225
- "hideScrollbar",
226
- "handleThumbMouseDown",
227
- "handleThumbDrag",
228
- "handleThumbMouseUp",
229
- "handleTrackClick",
230
- ].includes(f.name)
231
- ),
232
- recommendation:
233
- "Review if these are used via object methods or event handlers",
234
- },
235
- {
236
- category: "Velocity Tracking Helpers",
237
- description: "Functions related to scroll velocity tracking",
238
- functions: orphanedFunctions.filter(
239
- (f) =>
240
- f.file.includes("scrolling.ts") &&
241
- [
242
- "initializeTracking",
243
- "startIdleDetection",
244
- "checkIdle",
245
- "setVelocityToZero",
246
- "updateVelocityTracking",
247
- "calculateWindowedVelocity",
248
- ].includes(f.name)
249
- ),
250
- recommendation:
251
- "Check if used in closures or as part of velocity tracking system",
252
- },
253
- {
254
- category: "Setup Functions",
255
- description: "Setup and initialization functions",
256
- functions: orphanedFunctions.filter(
257
- (f) => f.name.startsWith("setup") || f.name.includes("initialize")
258
- ),
259
- recommendation: "Verify if called during component initialization",
260
- },
261
- {
262
- category: "Loading Manager Internals",
263
- description: "Internal loading queue management functions",
264
- functions: orphanedFunctions.filter((f) => f.file.includes("loading.ts")),
265
- recommendation: "Check if used within loading manager closure",
266
- },
267
- {
268
- category: "Size Cache Management",
269
- description: "Item size measurement and caching functions",
270
- functions: orphanedFunctions.filter((f) =>
271
- f.file.includes("item-size.ts")
272
- ),
273
- recommendation: "Verify if used in size management system",
274
- },
275
- {
276
- category: "Utility Functions",
277
- description: "General utility and calculation functions",
278
- functions: orphanedFunctions.filter(
279
- (f) =>
280
- !f.file.includes("scrollbar.ts") &&
281
- !f.file.includes("scrolling.ts") &&
282
- !f.file.includes("loading.ts") &&
283
- !f.file.includes("item-size.ts") &&
284
- !f.name.startsWith("setup")
285
- ),
286
- recommendation: "Safe to remove if truly unused",
287
- },
288
- ];
289
-
290
- return categories.filter((c) => c.functions.length > 0);
291
- }
292
-
293
- function analyzeFileForIndirectUsage(
294
- filePath: string,
295
- functionName: string
296
- ): boolean {
297
- try {
298
- const fullPath = path.join(__dirname, "../src/core/list-manager", filePath);
299
- const content = fs.readFileSync(fullPath, "utf-8");
300
-
301
- // Check for indirect usage patterns
302
- const patterns = [
303
- // Used in object/map
304
- new RegExp(`['"\`]${functionName}['"\`]\\s*:`),
305
- new RegExp(`\\[['"\`]${functionName}['"\`]\\]`),
306
-
307
- // Assigned to variable/property
308
- new RegExp(`\\w+\\.${functionName}\\s*=`),
309
- new RegExp(`this\\.${functionName}\\s*=`),
310
-
311
- // Used in return statement
312
- new RegExp(`return\\s+.*${functionName}`),
313
-
314
- // Passed as callback
315
- new RegExp(`\\(\\s*${functionName}\\s*\\)`),
316
- new RegExp(`,\\s*${functionName}\\s*[,)]`),
317
- ];
318
-
319
- return patterns.some((pattern) => pattern.test(content));
320
- } catch (error) {
321
- return false;
322
- }
323
- }
324
-
325
- // Main analysis
326
- console.log("🔍 Detailed Analysis of Orphaned Functions\n");
327
-
328
- const categories = categorizeOrphanedFunctions();
329
-
330
- categories.forEach((category) => {
331
- console.log(`\n📁 ${category.category}`);
332
- console.log(` ${category.description}`);
333
- console.log(` 💡 ${category.recommendation}\n`);
334
-
335
- category.functions.forEach((func) => {
336
- const hasIndirectUsage = analyzeFileForIndirectUsage(func.file, func.name);
337
- const status = hasIndirectUsage
338
- ? "⚠️ May have indirect usage"
339
- : "❌ Appears truly orphaned";
340
- console.log(` ${status}: ${func.name} (line ${func.line})`);
341
- });
342
- });
343
-
344
- console.log("\n\n📊 Summary by Category:");
345
- categories.forEach((category) => {
346
- console.log(
347
- ` ${category.category}: ${category.functions.length} functions`
348
- );
349
- });
350
-
351
- console.log("\n\n🔍 Underused Exported Functions:");
352
- console.log(" These are exported but only used in their own file:\n");
353
- underusedExports.forEach((func) => {
354
- console.log(` ⚠️ ${func.name} in ${func.file} (line ${func.line})`);
355
- });
356
-
357
- console.log("\n\n💡 Recommendations:");
358
- console.log(
359
- " 1. Start with 'Utility Functions' category - these are safest to remove"
360
- );
361
- console.log(" 2. Review 'Setup Functions' - some might be called indirectly");
362
- console.log(
363
- " 3. Check 'Loading Manager Internals' - might be used in closures"
364
- );
365
- console.log(
366
- " 4. Be careful with 'Scrollbar Internal Helpers' - might be event handlers"
367
- );
368
- console.log(
369
- " 5. Consider making underused exports private if not part of public API"
370
- );
371
-
372
- // Generate a cleanup script
373
- const cleanupScript = `
374
- // Safe to remove functions (appear truly orphaned):
375
- ${orphanedFunctions
376
- .filter((f) => !analyzeFileForIndirectUsage(f.file, f.name))
377
- .map((f) => `// - ${f.name} in ${f.file}`)
378
- .join("\n")}
379
- `;
380
-
381
- fs.writeFileSync(
382
- path.join(__dirname, "orphaned-functions-cleanup.txt"),
383
- cleanupScript
384
- );
385
- console.log(
386
- "\n\n✅ Generated orphaned-functions-cleanup.txt with safe-to-remove functions"
387
- );
@@ -1,121 +0,0 @@
1
- // scripts/debug/vlist-selection.ts
2
-
3
- import puppeteer from "puppeteer";
4
-
5
- async function testVListSelection() {
6
- console.log("🎯 Testing VList Selection Feature");
7
-
8
- const browser = await puppeteer.launch({
9
- headless: false,
10
- devtools: true,
11
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
12
- });
13
-
14
- const page = await browser.newPage();
15
-
16
- // Listen to console logs
17
- page.on("console", (msg) => {
18
- const text = msg.text();
19
- if (text.includes("[Selection]") || text.includes("selection")) {
20
- console.log(`💬 [${msg.type().toUpperCase()}] ${text}`);
21
- }
22
- });
23
-
24
- await page.goto("http://localhost:4000/examples/vlist-addons");
25
-
26
- // Wait for list to load
27
- await page.waitForSelector(".mtrl-viewport-item", { timeout: 5000 });
28
-
29
- console.log("📋 Page loaded, looking for list items...");
30
-
31
- // Get info about items
32
- const itemInfo = await page.evaluate(() => {
33
- const items = document.querySelectorAll(".mtrl-viewport-item");
34
- const firstItem = items[0];
35
- const listItem = firstItem?.querySelector(".list-item, .user-item");
36
-
37
- return {
38
- viewportItemCount: items.length,
39
- firstViewportItemClasses: firstItem?.className,
40
- firstViewportItemDataIndex: firstItem?.getAttribute("data-index"),
41
- firstListItemClasses: listItem?.className,
42
- firstListItemDataId: listItem?.getAttribute("data-id"),
43
- hasClickHandler: !!(window as any).listExample?.userList,
44
- };
45
- });
46
-
47
- console.log("📊 Item info:", itemInfo);
48
-
49
- // Click on the first item
50
- console.log("🖱️ Clicking on first item...");
51
- await page.click(".mtrl-viewport-item:first-child");
52
-
53
- // Wait a bit for selection to process
54
- await page.waitForTimeout(500);
55
-
56
- // Check if selection class was applied
57
- const selectionInfo = await page.evaluate(() => {
58
- const firstItem = document.querySelector(".mtrl-viewport-item:first-child");
59
- const listItem = firstItem?.querySelector(".list-item, .user-item");
60
- const selectedItems = document.querySelectorAll(
61
- ".mtrl-list-item--selected"
62
- );
63
-
64
- return {
65
- hasSelectionClass: listItem?.classList.contains(
66
- "mtrl-list-item--selected"
67
- ),
68
- listItemClasses: listItem?.className,
69
- selectedCount: selectedItems.length,
70
- userListExists: !!(window as any).listExample?.userList,
71
- hasSelectItems:
72
- typeof (window as any).listExample?.userList?.selectItems ===
73
- "function",
74
- hasGetSelectedItems:
75
- typeof (window as any).listExample?.userList?.getSelectedItems ===
76
- "function",
77
- };
78
- });
79
-
80
- console.log("✅ Selection info after click:", selectionInfo);
81
-
82
- // Try programmatic selection
83
- console.log("🔧 Testing programmatic selection...");
84
- const programmaticResult = await page.evaluate(() => {
85
- const userList = (window as any).listExample?.userList;
86
- if (userList && userList.selectItems) {
87
- userList.selectItems([0, 1, 2]);
88
- const selected = userList.getSelectedItems
89
- ? userList.getSelectedItems()
90
- : [];
91
- return {
92
- success: true,
93
- selectedCount: selected.length,
94
- selectedIds: selected.map((item: any) => item.id),
95
- };
96
- }
97
- return { success: false, reason: "No selectItems method" };
98
- });
99
-
100
- console.log("📊 Programmatic selection result:", programmaticResult);
101
-
102
- // Final check
103
- await page.waitForTimeout(500);
104
- const finalState = await page.evaluate(() => {
105
- const selectedElements = document.querySelectorAll(
106
- ".mtrl-list-item--selected"
107
- );
108
- return {
109
- selectedElementCount: selectedElements.length,
110
- selectedClasses: Array.from(selectedElements).map((el) => el.className),
111
- };
112
- });
113
-
114
- console.log("🎯 Final selection state:", finalState);
115
-
116
- // Keep browser open for inspection
117
- console.log("✨ Test complete. Browser will stay open for inspection.");
118
- console.log("Press Ctrl+C to exit.");
119
- }
120
-
121
- testVListSelection().catch(console.error);