rlint 0.4.0 → 0.6.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/README.md +235 -32
- package/dist/checks/clickability.d.ts.map +1 -1
- package/dist/checks/clickability.js +65 -30
- package/dist/checks/clickability.js.map +1 -1
- package/dist/checks/index.d.ts +1 -0
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +5 -0
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/touch-targets.d.ts.map +1 -1
- package/dist/checks/touch-targets.js +134 -47
- package/dist/checks/touch-targets.js.map +1 -1
- package/dist/checks/viewport-meta.d.ts +3 -0
- package/dist/checks/viewport-meta.d.ts.map +1 -0
- package/dist/checks/viewport-meta.js +113 -0
- package/dist/checks/viewport-meta.js.map +1 -0
- package/dist/cli.js +179 -49
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.js +158 -31
- package/dist/mcp-server.js.map +1 -1
- package/dist/proxy/client-script.d.ts +9 -0
- package/dist/proxy/client-script.d.ts.map +1 -0
- package/dist/proxy/client-script.js +449 -0
- package/dist/proxy/client-script.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +4 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/result-cache.d.ts +46 -0
- package/dist/proxy/result-cache.d.ts.map +1 -0
- package/dist/proxy/result-cache.js +27 -0
- package/dist/proxy/result-cache.js.map +1 -0
- package/dist/proxy/server.d.ts +17 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +190 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,7 +37,14 @@ These aren't styling issues — they're **structural bugs** that can be detected
|
|
|
37
37
|
## Installation
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
|
|
40
|
+
# Install globally (recommended — makes `rlint` available everywhere)
|
|
41
|
+
npm install -g rlint
|
|
42
|
+
|
|
43
|
+
# Or use without installing
|
|
44
|
+
npx rlint check https://example.com
|
|
45
|
+
|
|
46
|
+
# Or install as a dev dependency
|
|
47
|
+
npm install --save-dev rlint
|
|
41
48
|
```
|
|
42
49
|
|
|
43
50
|
No extra setup. Renderlint uses your system Chrome — no 150MB Chromium download. If Chrome isn't installed, Chromium is downloaded automatically on first run.
|
|
@@ -47,28 +54,73 @@ No extra setup. Renderlint uses your system Chrome — no 150MB Chromium downloa
|
|
|
47
54
|
## Quick Start
|
|
48
55
|
|
|
49
56
|
```bash
|
|
57
|
+
# Dev proxy — check pages as you browse (handles auth automatically)
|
|
58
|
+
rlint dev http://localhost:5173
|
|
59
|
+
|
|
50
60
|
# Check any URL
|
|
51
|
-
|
|
61
|
+
rlint check https://example.com
|
|
52
62
|
|
|
53
|
-
# Check
|
|
54
|
-
|
|
63
|
+
# Check with auth (setup script logs in first)
|
|
64
|
+
rlint check --setup ./login.js http://localhost:3000/dashboard
|
|
55
65
|
|
|
56
|
-
#
|
|
57
|
-
|
|
66
|
+
# Mobile testing (portrait + landscape at 375x667)
|
|
67
|
+
rlint check --mobile http://localhost:3000
|
|
58
68
|
|
|
59
69
|
# Auto-detect framework and start dev server
|
|
60
|
-
|
|
70
|
+
rlint dev
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Dev Proxy (Recommended for Development)
|
|
74
|
+
|
|
75
|
+
The dev proxy solves the auth problem. Instead of opening a separate headless browser (which has no session), rlint injects check scripts into your existing browser. You're already logged in — auth is handled automatically.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Start your dev server, then:
|
|
79
|
+
rlint dev http://localhost:5173
|
|
80
|
+
|
|
81
|
+
# Proxy starts on http://localhost:3100
|
|
82
|
+
# Open that URL in your browser and browse normally
|
|
83
|
+
# rlint checks every page you visit and reports issues in your terminal
|
|
61
84
|
```
|
|
62
85
|
|
|
86
|
+
Every page you visit is checked automatically. Navigate to `/dashboard`, `/settings`, `/admin` — rlint reports issues for each page in real-time. No cookies, no setup scripts, no configuration.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
rlint dev (proxy mode)
|
|
90
|
+
Target: http://localhost:5173
|
|
91
|
+
|
|
92
|
+
Proxy running at http://localhost:3100
|
|
93
|
+
Open http://localhost:3100 in your browser.
|
|
94
|
+
Browse your app normally — rlint checks every page you visit.
|
|
95
|
+
Auth is handled automatically through your browser session.
|
|
96
|
+
|
|
97
|
+
✓ / @ 1280x720 — no issues
|
|
98
|
+
✗ /dashboard @ 1280x720 — 1 error, 2 warnings
|
|
99
|
+
✗ [overflow] Horizontal overflow detected (page scrolls 120px beyond viewport)
|
|
100
|
+
→ div.data-table
|
|
101
|
+
⚠ [touch-targets] Touch target too small: 32x28px (min: 44x44px)
|
|
102
|
+
→ a.nav-link
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### How the proxy works
|
|
106
|
+
|
|
107
|
+
1. You start `rlint dev http://localhost:5173` — a reverse proxy starts on port 3100
|
|
108
|
+
2. Open `http://localhost:3100` in your browser — it forwards everything to your dev server
|
|
109
|
+
3. For HTML pages, rlint injects a small check script that runs all 6 checks directly in your browser
|
|
110
|
+
4. Results are sent back to rlint and displayed in your terminal
|
|
111
|
+
5. SPA navigation (pushState/popstate) and dynamic content changes trigger re-checks automatically
|
|
112
|
+
6. WebSocket connections (Vite HMR, etc.) pass through — hot reload works normally
|
|
113
|
+
|
|
63
114
|
## Checks
|
|
64
115
|
|
|
65
116
|
| Check | Severity | What it catches |
|
|
66
117
|
|-------|----------|-----------------|
|
|
67
118
|
| `overflow` | error | Horizontal scrollbars from content wider than viewport |
|
|
68
|
-
| `clickability` | error | Buttons/links covered by other elements
|
|
69
|
-
| `touch-targets` | warning | Elements smaller than 44×44px (WCAG 2.5.5) |
|
|
119
|
+
| `clickability` | error | Buttons/links covered by other elements — checks center + all 4 corners |
|
|
120
|
+
| `touch-targets` | warning | Elements smaller than 44×44px (WCAG 2.5.5) + adjacent targets with <8px gap |
|
|
70
121
|
| `visibility` | warning | Interactive elements that are invisible or off-screen |
|
|
71
122
|
| `text-overflow` | warning | Text clipped without proper ellipsis handling |
|
|
123
|
+
| `viewport-meta` | warning | Missing or misconfigured viewport meta tag (mobile rendering) |
|
|
72
124
|
|
|
73
125
|
## Framework Support
|
|
74
126
|
|
|
@@ -76,10 +128,10 @@ Renderlint auto-detects your framework and handles hydration:
|
|
|
76
128
|
|
|
77
129
|
```bash
|
|
78
130
|
# Auto-detect and start dev server
|
|
79
|
-
|
|
131
|
+
rlint dev --routes /,/about,/contact
|
|
80
132
|
|
|
81
133
|
# Specify framework manually
|
|
82
|
-
|
|
134
|
+
rlint dev --framework nextjs --routes /,/api/health
|
|
83
135
|
```
|
|
84
136
|
|
|
85
137
|
Supported: **Next.js**, **SvelteKit**, **Vite**, **Remix**, **Astro**, **Nuxt**, **Create React App**
|
|
@@ -103,7 +155,15 @@ await browser.close();
|
|
|
103
155
|
|
|
104
156
|
## MCP Server (for AI Agents)
|
|
105
157
|
|
|
106
|
-
Renderlint includes an MCP server
|
|
158
|
+
Renderlint includes an MCP server so AI agents can check pages for layout bugs programmatically.
|
|
159
|
+
|
|
160
|
+
### Claude Code
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
claude mcp add rlint -- npx rlint-mcp
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Or add to your project's `.mcp.json`:
|
|
107
167
|
|
|
108
168
|
```json
|
|
109
169
|
{
|
|
@@ -116,11 +176,130 @@ Renderlint includes an MCP server for integration with Claude Code and other AI
|
|
|
116
176
|
}
|
|
117
177
|
```
|
|
118
178
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
179
|
+
### Claude Desktop
|
|
180
|
+
|
|
181
|
+
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\Claude\claude_desktop_config.json` on Windows):
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"mcpServers": {
|
|
186
|
+
"rlint": {
|
|
187
|
+
"command": "npx",
|
|
188
|
+
"args": ["rlint-mcp"]
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Cursor
|
|
195
|
+
|
|
196
|
+
Add to `.cursor/mcp.json` in your project:
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"mcpServers": {
|
|
201
|
+
"rlint": {
|
|
202
|
+
"command": "npx",
|
|
203
|
+
"args": ["rlint-mcp"]
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Available MCP Tools
|
|
210
|
+
|
|
211
|
+
| Tool | Description |
|
|
212
|
+
|------|-------------|
|
|
213
|
+
| `check_page` | Check a URL for layout issues. Automatically uses proxy cache if `rlint dev` is running. |
|
|
214
|
+
| `check_html` | Check raw HTML content directly |
|
|
215
|
+
| `check_file` | Check a local HTML file by path |
|
|
216
|
+
| `get_dev_results` | Get cached results from the running dev proxy (for authenticated pages) |
|
|
217
|
+
| `screenshot` | Take a screenshot of a URL or element (returns base64 PNG) |
|
|
218
|
+
|
|
219
|
+
All check tools accept optional parameters:
|
|
220
|
+
- `viewport` (`{ width, height }`) — custom viewport size
|
|
221
|
+
- `checks` (array) — specific checks to run: `overflow`, `clickability`, `touch-targets`, `text-overflow`, `visibility`, `viewport-meta`
|
|
222
|
+
- `mobile` (boolean) — test at mobile viewports (375x667 portrait + 667x375 landscape)
|
|
223
|
+
|
|
224
|
+
Results include element selectors, dimensions, and fix hints.
|
|
225
|
+
|
|
226
|
+
### Authenticated Pages with MCP
|
|
227
|
+
|
|
228
|
+
When `rlint dev` proxy is running, the MCP tools automatically use it:
|
|
229
|
+
|
|
230
|
+
1. `check_page` checks the proxy cache first — if the developer has already visited the page, results are returned instantly
|
|
231
|
+
2. `get_dev_results` returns all cached results from pages the developer has browsed
|
|
232
|
+
3. If the proxy isn't running, `check_page` falls back to headless Chrome (works for public pages)
|
|
233
|
+
|
|
234
|
+
This means AI agents can check authenticated pages without needing credentials — the developer's browser session handles auth.
|
|
235
|
+
|
|
236
|
+
## For LLMs: Using rlint as a CLI Tool
|
|
237
|
+
|
|
238
|
+
If you're an LLM/AI agent with shell access, you can use rlint directly from the command line to validate UI you've built or modified.
|
|
239
|
+
|
|
240
|
+
### Quick reference
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Install globally (one-time setup)
|
|
244
|
+
npm install -g rlint
|
|
245
|
+
|
|
246
|
+
# Check a running dev server
|
|
247
|
+
rlint check http://localhost:3000 --format json
|
|
248
|
+
|
|
249
|
+
# Mobile testing (portrait + landscape, recommended after UI changes)
|
|
250
|
+
rlint check --mobile --format json http://localhost:3000
|
|
251
|
+
|
|
252
|
+
# Check specific routes at mobile viewport
|
|
253
|
+
rlint check --viewport 375x667 http://localhost:3000 http://localhost:3000/about
|
|
254
|
+
|
|
255
|
+
# Check with JSON output (easiest to parse)
|
|
256
|
+
rlint check --format json http://localhost:3000
|
|
257
|
+
|
|
258
|
+
# Run only specific checks
|
|
259
|
+
rlint check --only overflow,clickability http://localhost:3000
|
|
260
|
+
|
|
261
|
+
# Auto-detect framework, start dev server, check routes
|
|
262
|
+
rlint dev --routes /,/about,/settings --format json
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Interpreting results
|
|
266
|
+
|
|
267
|
+
rlint exits with code **1** if errors are found (code **0** if clean). Use `--format json` for structured output:
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"url": "http://localhost:3000",
|
|
272
|
+
"summary": { "passed": 47, "errors": 1, "warnings": 2 },
|
|
273
|
+
"issues": [
|
|
274
|
+
{
|
|
275
|
+
"check": "overflow",
|
|
276
|
+
"severity": "error",
|
|
277
|
+
"message": "Horizontal overflow detected",
|
|
278
|
+
"element": { "selector": "div.hero-banner" },
|
|
279
|
+
"fixHint": "Add overflow-x: hidden or check for elements with fixed widths"
|
|
280
|
+
}
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Recommended workflow for LLMs
|
|
286
|
+
|
|
287
|
+
1. Make your UI changes
|
|
288
|
+
2. Ensure the dev server is running
|
|
289
|
+
3. Run `rlint check --format json http://localhost:3000` on affected routes
|
|
290
|
+
4. Parse the JSON output — fix any issues using the `fixHint` and `element.selector` fields
|
|
291
|
+
5. Re-run to verify fixes
|
|
292
|
+
|
|
293
|
+
For authenticated pages: if the MCP server is available, use the `get_dev_results` tool (requires `rlint dev` proxy running). Otherwise, use `rlint check --setup ./login.js` with a setup script.
|
|
294
|
+
|
|
295
|
+
### Available checks
|
|
296
|
+
|
|
297
|
+
- **overflow** — Horizontal scrollbars from content wider than viewport
|
|
298
|
+
- **clickability** — Buttons/links covered by other elements (checks center + 4 corners)
|
|
299
|
+
- **touch-targets** — Elements smaller than 44x44px + adjacent targets with <8px gap
|
|
300
|
+
- **text-overflow** — Text clipped without ellipsis handling
|
|
301
|
+
- **visibility** — Interactive elements that are invisible or off-screen
|
|
302
|
+
- **viewport-meta** — Missing or misconfigured viewport meta tag
|
|
124
303
|
|
|
125
304
|
## Configuration
|
|
126
305
|
|
|
@@ -159,8 +338,28 @@ jobs:
|
|
|
159
338
|
- uses: actions/setup-node@v4
|
|
160
339
|
- run: npm ci
|
|
161
340
|
- run: npm run build
|
|
341
|
+
- run: npm install -g rlint
|
|
162
342
|
- run: npm start & npx wait-on http://localhost:3000
|
|
163
|
-
- run:
|
|
343
|
+
- run: rlint check --fail-on warning http://localhost:3000
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Checking Authenticated Pages in CI
|
|
347
|
+
|
|
348
|
+
Use `--setup` to run a login script before checks. The script receives a Puppeteer page and can perform any browser actions. Cookies persist for all subsequent checks.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
rlint check --setup ./tests/login.js http://localhost:3000/dashboard http://localhost:3000/settings
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
```javascript
|
|
355
|
+
// tests/login.js
|
|
356
|
+
export default async (page) => {
|
|
357
|
+
await page.goto('http://localhost:3000/login');
|
|
358
|
+
await page.type('input[name="email"]', 'test@test.com');
|
|
359
|
+
await page.type('input[name="password"]', 'password');
|
|
360
|
+
await page.click('button[type="submit"]');
|
|
361
|
+
await page.waitForNavigation();
|
|
362
|
+
};
|
|
164
363
|
```
|
|
165
364
|
|
|
166
365
|
> **Tip:** Renderlint uses system Chrome. If unavailable, Chromium is downloaded to `~/.cache/rlint` on first run. Cache this directory in CI for faster builds.
|
|
@@ -168,21 +367,25 @@ jobs:
|
|
|
168
367
|
## CLI Reference
|
|
169
368
|
|
|
170
369
|
```
|
|
171
|
-
rlint
|
|
172
|
-
-
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
--
|
|
178
|
-
--headed Show browser window
|
|
179
|
-
--wait-for-hydration Wait for SPA hydration
|
|
370
|
+
rlint dev [url] Start proxy (with URL) or framework mode (without)
|
|
371
|
+
--proxy-port <port> Proxy port (default: 3100)
|
|
372
|
+
-r, --routes <routes> Routes to check (framework mode, default: /)
|
|
373
|
+
-p, --port <port> Dev server port (framework mode)
|
|
374
|
+
--framework <name> Framework override
|
|
375
|
+
--mobile Test mobile viewports (375x667 + 667x375)
|
|
376
|
+
--no-start-server Use existing dev server
|
|
180
377
|
|
|
181
|
-
rlint
|
|
182
|
-
|
|
183
|
-
-
|
|
184
|
-
--
|
|
185
|
-
--
|
|
378
|
+
rlint check <urls...>
|
|
379
|
+
--setup <script> Run a setup script before checks (e.g., login)
|
|
380
|
+
-v, --viewport <size> Viewport size (e.g., 375x667,1920x1080)
|
|
381
|
+
-f, --format <format> Output: text, json, junit
|
|
382
|
+
-o, --only <checks> Run specific checks only
|
|
383
|
+
-i, --ignore <selectors> Ignore matching elements
|
|
384
|
+
-c, --config <path> Config file path
|
|
385
|
+
--fail-on <severity> Exit code 1 on: error, warning
|
|
386
|
+
--mobile Test mobile viewports (375x667 + 667x375)
|
|
387
|
+
--headed Show browser window
|
|
388
|
+
--wait-for-hydration Wait for SPA hydration
|
|
186
389
|
```
|
|
187
390
|
|
|
188
391
|
## How It Works
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickability.d.ts","sourceRoot":"","sources":["../../src/checks/clickability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"clickability.d.ts","sourceRoot":"","sources":["../../src/checks/clickability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AAyB9D,eAAO,MAAM,iBAAiB,EAAE,KAmL/B,CAAC"}
|
|
@@ -26,6 +26,18 @@ export const clickabilityCheck = {
|
|
|
26
26
|
const results = [];
|
|
27
27
|
const selectorString = selectors.join(', ');
|
|
28
28
|
const elements = document.querySelectorAll(selectorString);
|
|
29
|
+
// Small inset to avoid hitting borders/edges where elementFromPoint is ambiguous
|
|
30
|
+
const EDGE_INSET = 2;
|
|
31
|
+
function isCovered(el, x, y) {
|
|
32
|
+
// Clamp to viewport
|
|
33
|
+
if (x < 0 || y < 0 || x > window.innerWidth || y > window.innerHeight)
|
|
34
|
+
return null;
|
|
35
|
+
const topEl = document.elementFromPoint(x, y);
|
|
36
|
+
if (topEl && topEl !== el && !el.contains(topEl) && !topEl.contains(el)) {
|
|
37
|
+
return topEl;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
29
41
|
for (const el of elements) {
|
|
30
42
|
// Skip ignored elements
|
|
31
43
|
const shouldIgnore = ignoreSelectors.some(sel => {
|
|
@@ -56,23 +68,36 @@ export const clickabilityCheck = {
|
|
|
56
68
|
rect.top > window.innerHeight) {
|
|
57
69
|
continue;
|
|
58
70
|
}
|
|
59
|
-
// Check center
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
// Check 5 points: center + 4 corners (inset slightly to avoid border ambiguity)
|
|
72
|
+
const points = [
|
|
73
|
+
{ name: 'center', x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 },
|
|
74
|
+
{ name: 'top-left', x: rect.left + EDGE_INSET, y: rect.top + EDGE_INSET },
|
|
75
|
+
{ name: 'top-right', x: rect.right - EDGE_INSET, y: rect.top + EDGE_INSET },
|
|
76
|
+
{ name: 'bottom-left', x: rect.left + EDGE_INSET, y: rect.bottom - EDGE_INSET },
|
|
77
|
+
{ name: 'bottom-right', x: rect.right - EDGE_INSET, y: rect.bottom - EDGE_INSET },
|
|
78
|
+
];
|
|
79
|
+
const coveredPoints = [];
|
|
80
|
+
let firstCoverer = null;
|
|
81
|
+
for (const point of points) {
|
|
82
|
+
const coverer = isCovered(el, point.x, point.y);
|
|
83
|
+
if (coverer) {
|
|
84
|
+
coveredPoints.push(point.name);
|
|
85
|
+
if (!firstCoverer)
|
|
86
|
+
firstCoverer = coverer;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (coveredPoints.length > 0 && firstCoverer) {
|
|
65
90
|
let selector = el.tagName.toLowerCase();
|
|
66
91
|
if (el.id)
|
|
67
92
|
selector += `#${el.id}`;
|
|
68
93
|
if (el.className && typeof el.className === 'string') {
|
|
69
94
|
selector += '.' + el.className.trim().split(/\s+/).join('.');
|
|
70
95
|
}
|
|
71
|
-
let coverSelector =
|
|
72
|
-
if (
|
|
73
|
-
coverSelector += `#${
|
|
74
|
-
if (
|
|
75
|
-
coverSelector += '.' +
|
|
96
|
+
let coverSelector = firstCoverer.tagName.toLowerCase();
|
|
97
|
+
if (firstCoverer.id)
|
|
98
|
+
coverSelector += `#${firstCoverer.id}`;
|
|
99
|
+
if (firstCoverer.className && typeof firstCoverer.className === 'string') {
|
|
100
|
+
coverSelector += '.' + firstCoverer.className.trim().split(/\s+/).join('.');
|
|
76
101
|
}
|
|
77
102
|
results.push({
|
|
78
103
|
selector,
|
|
@@ -90,31 +115,41 @@ export const clickabilityCheck = {
|
|
|
90
115
|
},
|
|
91
116
|
coveredBy: {
|
|
92
117
|
selector: coverSelector,
|
|
93
|
-
tagName:
|
|
94
|
-
className: typeof
|
|
118
|
+
tagName: firstCoverer.tagName,
|
|
119
|
+
className: typeof firstCoverer.className === 'string' ? firstCoverer.className : '',
|
|
95
120
|
},
|
|
121
|
+
coveredPoints,
|
|
122
|
+
totalPoints: points.length,
|
|
96
123
|
});
|
|
97
124
|
}
|
|
98
125
|
}
|
|
99
126
|
return results;
|
|
100
127
|
}, { selectors, ignoreSelectors });
|
|
101
|
-
const issues = coveredElements.map(el =>
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
const issues = coveredElements.map(el => {
|
|
129
|
+
const allCovered = el.coveredPoints.length === el.totalPoints;
|
|
130
|
+
const coverageDesc = allCovered
|
|
131
|
+
? 'fully covered'
|
|
132
|
+
: `partially covered (${el.coveredPoints.join(', ')})`;
|
|
133
|
+
return {
|
|
134
|
+
check: 'clickability',
|
|
135
|
+
severity: 'error',
|
|
136
|
+
message: `Interactive element is ${coverageDesc} by another element`,
|
|
137
|
+
element: {
|
|
138
|
+
selector: el.selector,
|
|
139
|
+
tagName: el.tagName,
|
|
140
|
+
className: el.className,
|
|
141
|
+
id: el.id,
|
|
142
|
+
textContent: el.textContent,
|
|
143
|
+
rect: el.rect,
|
|
144
|
+
},
|
|
145
|
+
details: {
|
|
146
|
+
coveredBy: el.coveredBy.selector,
|
|
147
|
+
coveredPoints: el.coveredPoints,
|
|
148
|
+
totalPoints: el.totalPoints,
|
|
149
|
+
},
|
|
150
|
+
fixHint: `Check z-index of ${el.selector} and ${el.coveredBy.selector}, or remove/reposition the covering element`,
|
|
151
|
+
};
|
|
152
|
+
});
|
|
118
153
|
return {
|
|
119
154
|
check: 'clickability',
|
|
120
155
|
passed: Math.max(0, (await page.$$(selectors.join(', '))).length - issues.length),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickability.js","sourceRoot":"","sources":["../../src/checks/clickability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clickability.js","sourceRoot":"","sources":["../../src/checks/clickability.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { clickabilityCheck } from './clickability.js';
|
|
|
3
3
|
export { touchTargetsCheck } from './touch-targets.js';
|
|
4
4
|
export { visibilityCheck } from './visibility.js';
|
|
5
5
|
export { textOverflowCheck } from './text-overflow.js';
|
|
6
|
+
export { viewportMetaCheck } from './viewport-meta.js';
|
|
6
7
|
import type { Check } from '../types.js';
|
|
7
8
|
export declare const allChecks: Check[];
|
|
8
9
|
export declare const checksByName: Record<string, Check>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAQvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,KAAK,EAO5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAU9C,CAAC"}
|
package/dist/checks/index.js
CHANGED
|
@@ -3,17 +3,20 @@ export { clickabilityCheck } from './clickability.js';
|
|
|
3
3
|
export { touchTargetsCheck } from './touch-targets.js';
|
|
4
4
|
export { visibilityCheck } from './visibility.js';
|
|
5
5
|
export { textOverflowCheck } from './text-overflow.js';
|
|
6
|
+
export { viewportMetaCheck } from './viewport-meta.js';
|
|
6
7
|
import { overflowCheck } from './overflow.js';
|
|
7
8
|
import { clickabilityCheck } from './clickability.js';
|
|
8
9
|
import { touchTargetsCheck } from './touch-targets.js';
|
|
9
10
|
import { visibilityCheck } from './visibility.js';
|
|
10
11
|
import { textOverflowCheck } from './text-overflow.js';
|
|
12
|
+
import { viewportMetaCheck } from './viewport-meta.js';
|
|
11
13
|
export const allChecks = [
|
|
12
14
|
overflowCheck,
|
|
13
15
|
clickabilityCheck,
|
|
14
16
|
touchTargetsCheck,
|
|
15
17
|
visibilityCheck,
|
|
16
18
|
textOverflowCheck,
|
|
19
|
+
viewportMetaCheck,
|
|
17
20
|
];
|
|
18
21
|
export const checksByName = {
|
|
19
22
|
overflow: overflowCheck,
|
|
@@ -23,5 +26,7 @@ export const checksByName = {
|
|
|
23
26
|
visibility: visibilityCheck,
|
|
24
27
|
'text-overflow': textOverflowCheck,
|
|
25
28
|
textOverflow: textOverflowCheck,
|
|
29
|
+
'viewport-meta': viewportMetaCheck,
|
|
30
|
+
viewportMeta: viewportMetaCheck,
|
|
26
31
|
};
|
|
27
32
|
//# sourceMappingURL=index.js.map
|
package/dist/checks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,SAAS,GAAY;IAChC,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,QAAQ,EAAE,aAAa;IACvB,YAAY,EAAE,iBAAiB;IAC/B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,eAAe;IAC3B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,iBAAiB;CAChC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,SAAS,GAAY;IAChC,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,QAAQ,EAAE,aAAa;IACvB,YAAY,EAAE,iBAAiB;IAC/B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,eAAe;IAC3B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,iBAAiB;IAC/B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,iBAAiB;CAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touch-targets.d.ts","sourceRoot":"","sources":["../../src/checks/touch-targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"touch-targets.d.ts","sourceRoot":"","sources":["../../src/checks/touch-targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AAwC9D,eAAO,MAAM,iBAAiB,EAAE,KAoO/B,CAAC"}
|