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,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);