@productivemark/snipcss 1.0.0

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 (117) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +10 -0
  3. package/.mcp.json +8 -0
  4. package/dist/auth/config-manager.d.ts +13 -0
  5. package/dist/auth/config-manager.d.ts.map +1 -0
  6. package/dist/auth/config-manager.js +48 -0
  7. package/dist/auth/config-manager.js.map +1 -0
  8. package/dist/auth/usage-gate.d.ts +13 -0
  9. package/dist/auth/usage-gate.d.ts.map +1 -0
  10. package/dist/auth/usage-gate.js +69 -0
  11. package/dist/auth/usage-gate.js.map +1 -0
  12. package/dist/browser/browser-manager.d.ts +15 -0
  13. package/dist/browser/browser-manager.d.ts.map +1 -0
  14. package/dist/browser/browser-manager.js +61 -0
  15. package/dist/browser/browser-manager.js.map +1 -0
  16. package/dist/browser/viewport-manager.d.ts +8 -0
  17. package/dist/browser/viewport-manager.d.ts.map +1 -0
  18. package/dist/browser/viewport-manager.js +50 -0
  19. package/dist/browser/viewport-manager.js.map +1 -0
  20. package/dist/extraction/css-variable-resolver.d.ts +27 -0
  21. package/dist/extraction/css-variable-resolver.d.ts.map +1 -0
  22. package/dist/extraction/css-variable-resolver.js +105 -0
  23. package/dist/extraction/css-variable-resolver.js.map +1 -0
  24. package/dist/extraction/dom-labeler.d.ts +26 -0
  25. package/dist/extraction/dom-labeler.d.ts.map +1 -0
  26. package/dist/extraction/dom-labeler.js +124 -0
  27. package/dist/extraction/dom-labeler.js.map +1 -0
  28. package/dist/extraction/element-discovery.d.ts +59 -0
  29. package/dist/extraction/element-discovery.d.ts.map +1 -0
  30. package/dist/extraction/element-discovery.js +525 -0
  31. package/dist/extraction/element-discovery.js.map +1 -0
  32. package/dist/extraction/extraction-pipeline.d.ts +26 -0
  33. package/dist/extraction/extraction-pipeline.d.ts.map +1 -0
  34. package/dist/extraction/extraction-pipeline.js +200 -0
  35. package/dist/extraction/extraction-pipeline.js.map +1 -0
  36. package/dist/extraction/font-collector.d.ts +26 -0
  37. package/dist/extraction/font-collector.d.ts.map +1 -0
  38. package/dist/extraction/font-collector.js +160 -0
  39. package/dist/extraction/font-collector.js.map +1 -0
  40. package/dist/extraction/html-cleaner.d.ts +16 -0
  41. package/dist/extraction/html-cleaner.d.ts.map +1 -0
  42. package/dist/extraction/html-cleaner.js +149 -0
  43. package/dist/extraction/html-cleaner.js.map +1 -0
  44. package/dist/extraction/keyframe-collector.d.ts +16 -0
  45. package/dist/extraction/keyframe-collector.d.ts.map +1 -0
  46. package/dist/extraction/keyframe-collector.js +62 -0
  47. package/dist/extraction/keyframe-collector.js.map +1 -0
  48. package/dist/extraction/pseudo-state-handler.d.ts +36 -0
  49. package/dist/extraction/pseudo-state-handler.d.ts.map +1 -0
  50. package/dist/extraction/pseudo-state-handler.js +210 -0
  51. package/dist/extraction/pseudo-state-handler.js.map +1 -0
  52. package/dist/extraction/result-builder.d.ts +25 -0
  53. package/dist/extraction/result-builder.d.ts.map +1 -0
  54. package/dist/extraction/result-builder.js +136 -0
  55. package/dist/extraction/result-builder.js.map +1 -0
  56. package/dist/extraction/rule-deduplicator.d.ts +39 -0
  57. package/dist/extraction/rule-deduplicator.d.ts.map +1 -0
  58. package/dist/extraction/rule-deduplicator.js +107 -0
  59. package/dist/extraction/rule-deduplicator.js.map +1 -0
  60. package/dist/extraction/selector-fixer.d.ts +25 -0
  61. package/dist/extraction/selector-fixer.d.ts.map +1 -0
  62. package/dist/extraction/selector-fixer.js +111 -0
  63. package/dist/extraction/selector-fixer.js.map +1 -0
  64. package/dist/extraction/specificity.d.ts +17 -0
  65. package/dist/extraction/specificity.d.ts.map +1 -0
  66. package/dist/extraction/specificity.js +88 -0
  67. package/dist/extraction/specificity.js.map +1 -0
  68. package/dist/extraction/style-matcher.d.ts +33 -0
  69. package/dist/extraction/style-matcher.d.ts.map +1 -0
  70. package/dist/extraction/style-matcher.js +199 -0
  71. package/dist/extraction/style-matcher.js.map +1 -0
  72. package/dist/extraction/stylesheet-collector.d.ts +33 -0
  73. package/dist/extraction/stylesheet-collector.d.ts.map +1 -0
  74. package/dist/extraction/stylesheet-collector.js +71 -0
  75. package/dist/extraction/stylesheet-collector.js.map +1 -0
  76. package/dist/index.d.ts +3 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +235 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp-server.d.ts +3 -0
  81. package/dist/mcp-server.d.ts.map +1 -0
  82. package/dist/mcp-server.js +349 -0
  83. package/dist/mcp-server.js.map +1 -0
  84. package/dist/tailwind/css-to-tailwind.d.ts +17 -0
  85. package/dist/tailwind/css-to-tailwind.d.ts.map +1 -0
  86. package/dist/tailwind/css-to-tailwind.js +1583 -0
  87. package/dist/tailwind/css-to-tailwind.js.map +1 -0
  88. package/dist/tailwind/shorthand-expander.d.ts +27 -0
  89. package/dist/tailwind/shorthand-expander.d.ts.map +1 -0
  90. package/dist/tailwind/shorthand-expander.js +812 -0
  91. package/dist/tailwind/shorthand-expander.js.map +1 -0
  92. package/dist/tailwind/tailwind-converter.d.ts +35 -0
  93. package/dist/tailwind/tailwind-converter.d.ts.map +1 -0
  94. package/dist/tailwind/tailwind-converter.js +1223 -0
  95. package/dist/tailwind/tailwind-converter.js.map +1 -0
  96. package/dist/tailwind/tailwind-helpers.d.ts +95 -0
  97. package/dist/tailwind/tailwind-helpers.d.ts.map +1 -0
  98. package/dist/tailwind/tailwind-helpers.js +593 -0
  99. package/dist/tailwind/tailwind-helpers.js.map +1 -0
  100. package/dist/tailwind/tailwind-reducer.d.ts +36 -0
  101. package/dist/tailwind/tailwind-reducer.d.ts.map +1 -0
  102. package/dist/tailwind/tailwind-reducer.js +189 -0
  103. package/dist/tailwind/tailwind-reducer.js.map +1 -0
  104. package/dist/types/index.d.ts +239 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/index.js +94 -0
  107. package/dist/types/index.js.map +1 -0
  108. package/dist/utils/helpers.d.ts +34 -0
  109. package/dist/utils/helpers.d.ts.map +1 -0
  110. package/dist/utils/helpers.js +120 -0
  111. package/dist/utils/helpers.js.map +1 -0
  112. package/dist/utils/parsel.d.ts +41 -0
  113. package/dist/utils/parsel.d.ts.map +1 -0
  114. package/dist/utils/parsel.js +314 -0
  115. package/dist/utils/parsel.js.map +1 -0
  116. package/package.json +41 -0
  117. package/skills/workflow/SKILL.md +95 -0
@@ -0,0 +1,525 @@
1
+ /** Max descendants before a parent segment is considered too large and split */
2
+ const MAX_PARENT_SECTION = 800;
3
+ /** Max height (px) for bottom-up parent merging */
4
+ const MAX_MERGE_HEIGHT = 2000;
5
+ /** Grid step size (px) for elementFromPoint sampling */
6
+ const GRID_STEP = 80;
7
+ /**
8
+ * Discover page segments using the SnipCSS page segmenter approach:
9
+ * 1. Sample visible elements via grid-point probing (elementFromPoint)
10
+ * 2. Scroll the page to catch all content including lazy-loaded
11
+ * 3. Bottom-up merge: consolidate small elements into parent containers
12
+ * 4. Smart filter: split oversized parents, remove redundant wrappers
13
+ * 5. Generate unique selectors and enrich with semantic metadata
14
+ *
15
+ * Ported from snip-extension/js/page_segmenter.js
16
+ */
17
+ export async function discoverElements(page) {
18
+ // Scroll the page and collect elements at grid points
19
+ const rawElements = await page.evaluate(async (gridStep) => {
20
+ const SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'IFRAME', 'NOSCRIPT', 'LINK', 'META', 'BR', 'HR']);
21
+ // --- Step 1: Scroll to bottom to trigger lazy loading ---
22
+ const scrollHeight = document.body.scrollHeight;
23
+ // Only do scroll passes for tall pages
24
+ if (scrollHeight > 3500) {
25
+ let previousHeight = 0;
26
+ let attempts = 0;
27
+ while (attempts < 3) {
28
+ window.scrollTo(0, document.body.scrollHeight);
29
+ await new Promise(r => setTimeout(r, 1500));
30
+ const newHeight = document.body.scrollHeight;
31
+ if (newHeight > previousHeight) {
32
+ previousHeight = newHeight;
33
+ attempts = 0;
34
+ }
35
+ else {
36
+ attempts++;
37
+ }
38
+ }
39
+ }
40
+ // --- Step 2: Collect elements at grid points across entire page ---
41
+ const elements = new Set();
42
+ const totalHeight = document.body.scrollHeight;
43
+ let scrollY = 0;
44
+ const scrollStep = window.innerHeight * 0.9;
45
+ while (scrollY < totalHeight - window.innerHeight) {
46
+ window.scrollTo(0, scrollY);
47
+ await new Promise(r => setTimeout(r, 300));
48
+ // Probe grid points in current viewport
49
+ for (let x = 0; x <= window.innerWidth; x += gridStep) {
50
+ for (let y = 0; y <= window.innerHeight; y += gridStep) {
51
+ const elem = document.elementFromPoint(x, y);
52
+ if (elem && !SKIP_TAGS.has(elem.tagName) && elem !== document.body && elem !== document.documentElement) {
53
+ elements.add(elem);
54
+ }
55
+ }
56
+ }
57
+ scrollY += scrollStep;
58
+ }
59
+ // Collect at the very bottom
60
+ window.scrollTo(0, Math.max(0, totalHeight - window.innerHeight));
61
+ await new Promise(r => setTimeout(r, 300));
62
+ for (let x = 0; x <= window.innerWidth; x += gridStep) {
63
+ for (let y = 0; y <= window.innerHeight; y += gridStep) {
64
+ const elem = document.elementFromPoint(x, y);
65
+ if (elem && !SKIP_TAGS.has(elem.tagName) && elem !== document.body && elem !== document.documentElement) {
66
+ elements.add(elem);
67
+ }
68
+ }
69
+ }
70
+ // Scroll back to top
71
+ window.scrollTo(0, 0);
72
+ await new Promise(r => setTimeout(r, 300));
73
+ return Array.from(elements).map(el => {
74
+ // Return a stable reference: build a path selector for each element
75
+ // so we can re-find it after returning from evaluate
76
+ const path = [];
77
+ let current = el;
78
+ while (current && current !== document.body && current !== document.documentElement) {
79
+ const par = current.parentElement;
80
+ if (par) {
81
+ const index = Array.from(par.children).indexOf(current);
82
+ path.unshift(`${index}`);
83
+ }
84
+ current = par;
85
+ }
86
+ return path.join('/');
87
+ });
88
+ }, GRID_STEP);
89
+ // Now run the segmentation logic (processElements + filterElements) inside the page
90
+ const segmented = await page.evaluate((args) => {
91
+ const { paths, defaultMaxMergeHeight, maxParentSection } = args;
92
+ // Adaptive merge height: on short pages, use a tighter threshold
93
+ // so elements don't all collapse into one root container
94
+ const docHeight = document.documentElement.scrollHeight;
95
+ const viewportHeight = window.innerHeight;
96
+ let maxMergeHeight;
97
+ if (docHeight < viewportHeight * 2) {
98
+ // Page fits in 1-2 viewports: need fine granularity
99
+ maxMergeHeight = 150;
100
+ }
101
+ else if (docHeight < viewportHeight * 4) {
102
+ // Page fits in 2-4 viewports: moderate
103
+ maxMergeHeight = 600;
104
+ }
105
+ else {
106
+ // Long scrollable page: standard behavior
107
+ maxMergeHeight = defaultMaxMergeHeight;
108
+ }
109
+ const SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'IFRAME', 'NOSCRIPT', 'LINK', 'META']);
110
+ // Re-resolve elements from paths
111
+ function resolveElement(path) {
112
+ let current = document.body;
113
+ const indices = path.split('/').map(Number);
114
+ for (const idx of indices) {
115
+ if (!current.children[idx])
116
+ return null;
117
+ current = current.children[idx];
118
+ }
119
+ return current;
120
+ }
121
+ const elementsArray = paths.map(resolveElement).filter((e) => e !== null);
122
+ // Filter out body, snipcss markers
123
+ let filtered = elementsArray.filter(element => {
124
+ if (element === document.body)
125
+ return false;
126
+ if (!element.classList)
127
+ return true;
128
+ const classList = Array.from(element.classList);
129
+ return !classList.includes('skipcss') && !classList.some(c => c.includes('snipcss'));
130
+ });
131
+ // --- processElements: bottom-up merge ---
132
+ // Group by depth
133
+ function getDepth(el) {
134
+ let depth = 0;
135
+ let cur = el;
136
+ while (cur && cur.parentNode && cur.parentNode !== document.body) {
137
+ cur = cur.parentNode;
138
+ depth++;
139
+ }
140
+ return depth;
141
+ }
142
+ const depthMap = new Map();
143
+ const elementDepths = new Map();
144
+ let maxDepth = 0;
145
+ filtered.forEach(elem => {
146
+ const depth = getDepth(elem);
147
+ elementDepths.set(elem, depth);
148
+ if (!depthMap.has(depth))
149
+ depthMap.set(depth, new Set());
150
+ depthMap.get(depth).add(elem);
151
+ if (depth > maxDepth)
152
+ maxDepth = depth;
153
+ });
154
+ let elementsSet = new Set(filtered);
155
+ const processedElements = new Set(filtered);
156
+ // Walk from deepest to shallowest, merging children into parents
157
+ for (let depth = maxDepth; depth >= 1; depth--) {
158
+ const atDepth = depthMap.get(depth);
159
+ if (!atDepth)
160
+ continue;
161
+ atDepth.forEach(elem => {
162
+ const parent = elem.parentNode;
163
+ if (parent && parent !== document.body) {
164
+ const parentHeight = parent.offsetHeight;
165
+ if (parentHeight < maxMergeHeight) {
166
+ if (!processedElements.has(parent)) {
167
+ const parentDepth = depth - 1;
168
+ if (!depthMap.has(parentDepth))
169
+ depthMap.set(parentDepth, new Set());
170
+ depthMap.get(parentDepth).add(parent);
171
+ processedElements.add(parent);
172
+ elementsSet.add(parent);
173
+ }
174
+ elementsSet.delete(elem);
175
+ }
176
+ }
177
+ });
178
+ }
179
+ // --- filterElements: smart parent/child deduplication ---
180
+ const elementToChildren = new Map();
181
+ const elemArr = Array.from(elementsSet);
182
+ elemArr.forEach(element => {
183
+ const parent = element.parentElement;
184
+ if (parent && parent !== document.body && elementsSet.has(parent)) {
185
+ if (!elementToChildren.has(parent))
186
+ elementToChildren.set(parent, new Set());
187
+ elementToChildren.get(parent).add(element);
188
+ }
189
+ });
190
+ const toRemove = new Set();
191
+ elementToChildren.forEach((childrenSet, parent) => {
192
+ const allDirectChildren = Array.from(parent.children)
193
+ .filter(child => !SKIP_TAGS.has(child.tagName));
194
+ const allChildrenInSet = allDirectChildren.every(child => elementsSet.has(child));
195
+ if (allChildrenInSet) {
196
+ // All children are segments — remove the parent wrapper
197
+ toRemove.add(parent);
198
+ }
199
+ else {
200
+ const totalDescendants = parent.querySelectorAll('*:not(script):not(style):not(iframe)').length;
201
+ if (totalDescendants > maxParentSection) {
202
+ // Parent too large — split into direct children
203
+ allDirectChildren.forEach(child => {
204
+ if (!elementsSet.has(child))
205
+ elementsSet.add(child);
206
+ });
207
+ toRemove.add(parent);
208
+ }
209
+ else {
210
+ // Parent is manageable — keep parent, remove descendants
211
+ elementsSet.forEach(elem => {
212
+ if (parent !== elem && parent.contains(elem)) {
213
+ toRemove.add(elem);
214
+ }
215
+ });
216
+ }
217
+ }
218
+ });
219
+ toRemove.forEach(elem => elementsSet.delete(elem));
220
+ // --- Build unique selectors and metadata for each segment ---
221
+ function testSelectorCount(sel, expected) {
222
+ try {
223
+ return document.querySelectorAll(sel).length === expected;
224
+ }
225
+ catch {
226
+ return false;
227
+ }
228
+ }
229
+ function getUniqueSelector(elem) {
230
+ // Try ID first
231
+ if (elem.id) {
232
+ const idSel = `#${elem.id}`;
233
+ if (testSelectorCount(idSel, 1))
234
+ return idSel;
235
+ }
236
+ // Try semantic tag if unique
237
+ const tag = elem.tagName.toLowerCase();
238
+ const semanticTags = new Set(['header', 'nav', 'main', 'footer', 'aside', 'article']);
239
+ if (semanticTags.has(tag) && testSelectorCount(tag, 1))
240
+ return tag;
241
+ // Try class-based selector
242
+ if (elem.classList.length > 0) {
243
+ const classes = Array.from(elem.classList).filter(c => !c.includes('snipcss') && !c.includes('skipcss'));
244
+ if (classes.length > 0) {
245
+ const classSel = '.' + classes.slice(0, 3).join('.');
246
+ if (testSelectorCount(classSel, 1))
247
+ return classSel;
248
+ }
249
+ }
250
+ // Build nth-child path upward until unique (ported from page_segmenter.js)
251
+ const elemTag = elem.tagName.toLowerCase();
252
+ let par = elem.parentElement;
253
+ if (!par)
254
+ return elemTag;
255
+ let myIndex = Array.from(par.children).indexOf(elem) + 1;
256
+ let selector = `${elemTag}:nth-child(${myIndex})`;
257
+ if (par === document.body) {
258
+ return `body > ${selector}`;
259
+ }
260
+ let maxLevels = 20;
261
+ while (par && par !== document.body && maxLevels > 0) {
262
+ const prevElem = par;
263
+ const prevTag = prevElem.tagName.toLowerCase();
264
+ par = prevElem.parentElement;
265
+ if (!par)
266
+ break;
267
+ // Test without nth-child on parent first
268
+ const testSel = `${prevTag} > ${selector}`;
269
+ if (testSelectorCount(testSel, 1))
270
+ return testSel;
271
+ myIndex = Array.from(par.children).indexOf(prevElem) + 1;
272
+ selector = `${prevTag}:nth-child(${myIndex}) > ${selector}`;
273
+ if (par === document.body)
274
+ break;
275
+ maxLevels--;
276
+ }
277
+ selector = `body > ${selector}`;
278
+ if (testSelectorCount(selector, 1))
279
+ return selector;
280
+ // Last resort: use the full path even if not unique
281
+ return selector;
282
+ }
283
+ function getParentChain(el) {
284
+ const parts = [];
285
+ let current = el.parentElement;
286
+ let count = 0;
287
+ while (current && current !== document.body && count < 3) {
288
+ const t = current.tagName.toLowerCase();
289
+ if (current.id) {
290
+ parts.unshift(`#${current.id}`);
291
+ }
292
+ else if (current.classList.length > 0) {
293
+ const cls = Array.from(current.classList).filter(c => !c.includes('snipcss'))[0];
294
+ parts.unshift(cls ? `${t}.${cls}` : t);
295
+ }
296
+ else {
297
+ parts.unshift(t);
298
+ }
299
+ current = current.parentElement;
300
+ count++;
301
+ }
302
+ return parts.length > 0 ? `inside ${parts.join(' > ')}` : 'top-level';
303
+ }
304
+ // Sort by vertical position (top of page first)
305
+ const finalElements = Array.from(elementsSet)
306
+ .filter(el => el !== document.body)
307
+ .sort((a, b) => {
308
+ const ar = a.getBoundingClientRect();
309
+ const br = b.getBoundingClientRect();
310
+ return (ar.top + window.scrollY) - (br.top + window.scrollY);
311
+ });
312
+ return finalElements.map(el => {
313
+ const rect = el.getBoundingClientRect();
314
+ const scrollY = window.scrollY;
315
+ const tag = el.tagName.toLowerCase();
316
+ const role = el.getAttribute('role') || '';
317
+ const classes = Array.from(el.classList).filter(c => !c.includes('snipcss')).join(' ');
318
+ let backgroundColor = '';
319
+ try {
320
+ const computed = window.getComputedStyle(el);
321
+ backgroundColor = computed.backgroundColor || '';
322
+ if (backgroundColor === 'rgba(0, 0, 0, 0)')
323
+ backgroundColor = 'transparent';
324
+ }
325
+ catch { /* ignore */ }
326
+ let depth = 0;
327
+ let cur = el;
328
+ while (cur && cur.parentNode && cur.parentNode !== document.body) {
329
+ cur = cur.parentNode;
330
+ depth++;
331
+ }
332
+ return {
333
+ tag,
334
+ selector: getUniqueSelector(el),
335
+ classes,
336
+ id: el.id || '',
337
+ role,
338
+ text: (el.textContent || '').trim().substring(0, 80),
339
+ childCount: el.children.length,
340
+ rect: {
341
+ x: Math.round(rect.x + window.scrollX),
342
+ y: Math.round(rect.y + scrollY),
343
+ width: Math.round(rect.width),
344
+ height: Math.round(rect.height),
345
+ },
346
+ backgroundColor,
347
+ parentChain: getParentChain(el),
348
+ depth,
349
+ };
350
+ });
351
+ }, { paths: rawElements, defaultMaxMergeHeight: MAX_MERGE_HEIGHT, maxParentSection: MAX_PARENT_SECTION });
352
+ // Assign numeric labels and semantic types
353
+ return segmented.map((el, index) => ({
354
+ label: index + 1,
355
+ selector: el.selector,
356
+ tag: el.tag,
357
+ semanticType: inferSemanticType(el.tag, el.role, el.classes, el.rect, el.depth),
358
+ parentContext: el.parentChain,
359
+ rect: el.rect,
360
+ backgroundColor: el.backgroundColor,
361
+ childCount: el.childCount,
362
+ textPreview: el.text,
363
+ classes: el.classes,
364
+ id: el.id,
365
+ depth: el.depth,
366
+ }));
367
+ }
368
+ /**
369
+ * Infer a human-readable semantic type from element metadata.
370
+ */
371
+ function inferSemanticType(tag, role, classes, rect, depth) {
372
+ const classLower = classes.toLowerCase();
373
+ const roleLower = role.toLowerCase();
374
+ // Direct semantic tag matches
375
+ if (tag === 'header' || roleLower === 'banner')
376
+ return 'Header';
377
+ if (tag === 'nav' || roleLower === 'navigation')
378
+ return 'Navigation';
379
+ if (tag === 'footer' || roleLower === 'contentinfo')
380
+ return 'Footer';
381
+ if (tag === 'aside' || roleLower === 'complementary')
382
+ return 'Sidebar';
383
+ if (tag === 'form' || roleLower === 'form')
384
+ return 'Form';
385
+ if (tag === 'article')
386
+ return 'Article';
387
+ if (tag === 'main' || roleLower === 'main')
388
+ return 'Main Content';
389
+ // Class-based inference
390
+ if (/sidebar|side-nav|side-menu/i.test(classLower))
391
+ return 'Sidebar';
392
+ if (/hero|banner|jumbotron/i.test(classLower))
393
+ return 'Hero Section';
394
+ if (/card|tile/i.test(classLower))
395
+ return 'Card';
396
+ if (/modal|dialog|popup/i.test(classLower))
397
+ return 'Modal/Dialog';
398
+ if (/nav|menu|navbar|topbar/i.test(classLower))
399
+ return 'Navigation';
400
+ if (/footer/i.test(classLower))
401
+ return 'Footer';
402
+ if (/header/i.test(classLower))
403
+ return 'Header';
404
+ if (/pricing|plan/i.test(classLower))
405
+ return 'Pricing';
406
+ if (/testimonial|review/i.test(classLower))
407
+ return 'Testimonial';
408
+ if (/gallery|carousel|slider|swiper/i.test(classLower))
409
+ return 'Gallery/Carousel';
410
+ if (/cta|call-to-action/i.test(classLower))
411
+ return 'Call to Action';
412
+ if (/feature|benefit/i.test(classLower))
413
+ return 'Feature';
414
+ if (/tab|tabs/i.test(classLower))
415
+ return 'Tabs';
416
+ if (/accordion|collapse/i.test(classLower))
417
+ return 'Accordion';
418
+ if (/breadcrumb/i.test(classLower))
419
+ return 'Breadcrumb';
420
+ if (/search/i.test(classLower) || roleLower === 'search')
421
+ return 'Search';
422
+ if (/table|grid/i.test(classLower))
423
+ return 'Table/Grid';
424
+ if (/list/i.test(classLower))
425
+ return 'List';
426
+ if (/btn|button/i.test(classLower))
427
+ return 'Button';
428
+ if (/input|field|control/i.test(classLower))
429
+ return 'Form Control';
430
+ // Position/size-based inference
431
+ if (tag === 'section') {
432
+ if (rect.y < 200 && rect.height > 300)
433
+ return 'Hero Section';
434
+ return 'Section';
435
+ }
436
+ // Generic fallback
437
+ if (depth <= 1 && rect.width > 600)
438
+ return 'Container';
439
+ if (rect.width < 400 && rect.height < 400 && depth >= 2)
440
+ return 'Widget';
441
+ return 'Element';
442
+ }
443
+ /**
444
+ * Inject numbered badge overlay into the page at each element's position.
445
+ */
446
+ export async function injectLabelOverlay(page, elements) {
447
+ const labelData = elements.map(el => ({
448
+ label: el.label,
449
+ x: el.rect.x,
450
+ y: el.rect.y,
451
+ w: el.rect.width,
452
+ h: el.rect.height,
453
+ }));
454
+ await page.evaluate((labels) => {
455
+ // Remove any existing overlay
456
+ const existing = document.getElementById('__snipcss_labels__');
457
+ if (existing)
458
+ existing.remove();
459
+ const overlay = document.createElement('div');
460
+ overlay.id = '__snipcss_labels__';
461
+ overlay.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647';
462
+ labels.forEach(({ label, x, y, w, h }) => {
463
+ // Draw a subtle outline around the element
464
+ const outline = document.createElement('div');
465
+ outline.style.cssText = `
466
+ position: absolute;
467
+ left: ${x - 1}px;
468
+ top: ${y - 1}px;
469
+ width: ${w + 2}px;
470
+ height: ${h + 2}px;
471
+ border: 2px solid rgba(255, 0, 0, 0.4);
472
+ border-radius: 2px;
473
+ pointer-events: none;
474
+ `;
475
+ overlay.appendChild(outline);
476
+ // Add numbered badge
477
+ const badge = document.createElement('span');
478
+ badge.textContent = `#${label}`;
479
+ badge.style.cssText = `
480
+ position: absolute;
481
+ left: ${x}px;
482
+ top: ${y}px;
483
+ background: #e11d48;
484
+ color: white;
485
+ font: bold 11px monospace;
486
+ padding: 2px 5px;
487
+ border-radius: 3px;
488
+ transform: translate(0, -100%);
489
+ white-space: nowrap;
490
+ box-shadow: 0 1px 3px rgba(0,0,0,0.5);
491
+ line-height: 1.2;
492
+ `;
493
+ overlay.appendChild(badge);
494
+ });
495
+ document.body.appendChild(overlay);
496
+ }, labelData);
497
+ }
498
+ /**
499
+ * Remove the label overlay from the page.
500
+ */
501
+ export async function removeLabelOverlay(page) {
502
+ try {
503
+ await page.evaluate(() => {
504
+ const el = document.getElementById('__snipcss_labels__');
505
+ if (el)
506
+ el.remove();
507
+ });
508
+ }
509
+ catch {
510
+ // Ignore cleanup errors
511
+ }
512
+ }
513
+ /**
514
+ * Format discovered elements as a human-readable legend.
515
+ */
516
+ export function formatElementLegend(elements) {
517
+ const lines = [];
518
+ for (const el of elements) {
519
+ const size = `${el.rect.width}x${el.rect.height}`;
520
+ const preview = el.textPreview.substring(0, 50).replace(/\n/g, ' ');
521
+ lines.push(`#${el.label}: \`${el.selector}\` (${el.semanticType}, ${size}) ${el.parentContext} — "${preview}"`);
522
+ }
523
+ return lines.join('\n');
524
+ }
525
+ //# sourceMappingURL=element-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-discovery.js","sourceRoot":"","sources":["../../src/extraction/element-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ExtractionOptions, ExtractionResult } from '../types/index.js';
2
+ import { BrowserManager } from '../browser/browser-manager.js';
3
+ /**
4
+ * Main extraction pipeline orchestrator.
5
+ * Replaces the doSnipper() function from snipbackground.js.
6
+ */
7
+ export declare class ExtractionPipeline {
8
+ private browserManager;
9
+ private viewportManager;
10
+ private stylesheetCollector;
11
+ private domLabeler;
12
+ private styleMatcher;
13
+ private pseudoStateHandler;
14
+ private keyframeCollector;
15
+ private fontCollector;
16
+ private variableResolver;
17
+ private selectorFixer;
18
+ private ruleDeduplicator;
19
+ private resultBuilder;
20
+ constructor(browserManager: BrowserManager);
21
+ /**
22
+ * Extract CSS from a page element and optionally convert to Tailwind.
23
+ */
24
+ extract(url: string, selector: string, options?: ExtractionOptions): Promise<ExtractionResult>;
25
+ }
26
+ //# sourceMappingURL=extraction-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-pipeline.d.ts","sourceRoot":"","sources":["../../src/extraction/extraction-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EACc,iBAAiB,EAAE,gBAAgB,EAEvD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAiB5E;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,aAAa,CAAuB;gBAEhC,cAAc,EAAE,cAAc;IAI1C;;OAEG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;CAmO7B"}