@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.
- package/.claude-plugin/marketplace.json +17 -0
- package/.claude-plugin/plugin.json +10 -0
- package/.mcp.json +8 -0
- package/dist/auth/config-manager.d.ts +13 -0
- package/dist/auth/config-manager.d.ts.map +1 -0
- package/dist/auth/config-manager.js +48 -0
- package/dist/auth/config-manager.js.map +1 -0
- package/dist/auth/usage-gate.d.ts +13 -0
- package/dist/auth/usage-gate.d.ts.map +1 -0
- package/dist/auth/usage-gate.js +69 -0
- package/dist/auth/usage-gate.js.map +1 -0
- package/dist/browser/browser-manager.d.ts +15 -0
- package/dist/browser/browser-manager.d.ts.map +1 -0
- package/dist/browser/browser-manager.js +61 -0
- package/dist/browser/browser-manager.js.map +1 -0
- package/dist/browser/viewport-manager.d.ts +8 -0
- package/dist/browser/viewport-manager.d.ts.map +1 -0
- package/dist/browser/viewport-manager.js +50 -0
- package/dist/browser/viewport-manager.js.map +1 -0
- package/dist/extraction/css-variable-resolver.d.ts +27 -0
- package/dist/extraction/css-variable-resolver.d.ts.map +1 -0
- package/dist/extraction/css-variable-resolver.js +105 -0
- package/dist/extraction/css-variable-resolver.js.map +1 -0
- package/dist/extraction/dom-labeler.d.ts +26 -0
- package/dist/extraction/dom-labeler.d.ts.map +1 -0
- package/dist/extraction/dom-labeler.js +124 -0
- package/dist/extraction/dom-labeler.js.map +1 -0
- package/dist/extraction/element-discovery.d.ts +59 -0
- package/dist/extraction/element-discovery.d.ts.map +1 -0
- package/dist/extraction/element-discovery.js +525 -0
- package/dist/extraction/element-discovery.js.map +1 -0
- package/dist/extraction/extraction-pipeline.d.ts +26 -0
- package/dist/extraction/extraction-pipeline.d.ts.map +1 -0
- package/dist/extraction/extraction-pipeline.js +200 -0
- package/dist/extraction/extraction-pipeline.js.map +1 -0
- package/dist/extraction/font-collector.d.ts +26 -0
- package/dist/extraction/font-collector.d.ts.map +1 -0
- package/dist/extraction/font-collector.js +160 -0
- package/dist/extraction/font-collector.js.map +1 -0
- package/dist/extraction/html-cleaner.d.ts +16 -0
- package/dist/extraction/html-cleaner.d.ts.map +1 -0
- package/dist/extraction/html-cleaner.js +149 -0
- package/dist/extraction/html-cleaner.js.map +1 -0
- package/dist/extraction/keyframe-collector.d.ts +16 -0
- package/dist/extraction/keyframe-collector.d.ts.map +1 -0
- package/dist/extraction/keyframe-collector.js +62 -0
- package/dist/extraction/keyframe-collector.js.map +1 -0
- package/dist/extraction/pseudo-state-handler.d.ts +36 -0
- package/dist/extraction/pseudo-state-handler.d.ts.map +1 -0
- package/dist/extraction/pseudo-state-handler.js +210 -0
- package/dist/extraction/pseudo-state-handler.js.map +1 -0
- package/dist/extraction/result-builder.d.ts +25 -0
- package/dist/extraction/result-builder.d.ts.map +1 -0
- package/dist/extraction/result-builder.js +136 -0
- package/dist/extraction/result-builder.js.map +1 -0
- package/dist/extraction/rule-deduplicator.d.ts +39 -0
- package/dist/extraction/rule-deduplicator.d.ts.map +1 -0
- package/dist/extraction/rule-deduplicator.js +107 -0
- package/dist/extraction/rule-deduplicator.js.map +1 -0
- package/dist/extraction/selector-fixer.d.ts +25 -0
- package/dist/extraction/selector-fixer.d.ts.map +1 -0
- package/dist/extraction/selector-fixer.js +111 -0
- package/dist/extraction/selector-fixer.js.map +1 -0
- package/dist/extraction/specificity.d.ts +17 -0
- package/dist/extraction/specificity.d.ts.map +1 -0
- package/dist/extraction/specificity.js +88 -0
- package/dist/extraction/specificity.js.map +1 -0
- package/dist/extraction/style-matcher.d.ts +33 -0
- package/dist/extraction/style-matcher.d.ts.map +1 -0
- package/dist/extraction/style-matcher.js +199 -0
- package/dist/extraction/style-matcher.js.map +1 -0
- package/dist/extraction/stylesheet-collector.d.ts +33 -0
- package/dist/extraction/stylesheet-collector.d.ts.map +1 -0
- package/dist/extraction/stylesheet-collector.js +71 -0
- package/dist/extraction/stylesheet-collector.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +235 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +349 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/tailwind/css-to-tailwind.d.ts +17 -0
- package/dist/tailwind/css-to-tailwind.d.ts.map +1 -0
- package/dist/tailwind/css-to-tailwind.js +1583 -0
- package/dist/tailwind/css-to-tailwind.js.map +1 -0
- package/dist/tailwind/shorthand-expander.d.ts +27 -0
- package/dist/tailwind/shorthand-expander.d.ts.map +1 -0
- package/dist/tailwind/shorthand-expander.js +812 -0
- package/dist/tailwind/shorthand-expander.js.map +1 -0
- package/dist/tailwind/tailwind-converter.d.ts +35 -0
- package/dist/tailwind/tailwind-converter.d.ts.map +1 -0
- package/dist/tailwind/tailwind-converter.js +1223 -0
- package/dist/tailwind/tailwind-converter.js.map +1 -0
- package/dist/tailwind/tailwind-helpers.d.ts +95 -0
- package/dist/tailwind/tailwind-helpers.d.ts.map +1 -0
- package/dist/tailwind/tailwind-helpers.js +593 -0
- package/dist/tailwind/tailwind-helpers.js.map +1 -0
- package/dist/tailwind/tailwind-reducer.d.ts +36 -0
- package/dist/tailwind/tailwind-reducer.d.ts.map +1 -0
- package/dist/tailwind/tailwind-reducer.js +189 -0
- package/dist/tailwind/tailwind-reducer.js.map +1 -0
- package/dist/types/index.d.ts +239 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +94 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +34 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +120 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/parsel.d.ts +41 -0
- package/dist/utils/parsel.d.ts.map +1 -0
- package/dist/utils/parsel.js +314 -0
- package/dist/utils/parsel.js.map +1 -0
- package/package.json +41 -0
- 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"}
|