@empline/preflight 1.1.44 → 1.1.45
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.
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Layout Overflow Containment Preflight
|
|
4
|
+
*
|
|
5
|
+
* Detects dashboard/page layouts where the main content area lacks proper
|
|
6
|
+
* overflow containment, which can cause horizontal page scrollbars.
|
|
7
|
+
*
|
|
8
|
+
* When a flex container has `minWidth: 0` (to allow shrinking) but no
|
|
9
|
+
* `overflow: hidden`, scrollable children (like TableContainer) won't
|
|
10
|
+
* properly trigger internal scrolling - instead the content can expand
|
|
11
|
+
* and create page-level horizontal scrollbars.
|
|
12
|
+
*
|
|
13
|
+
* BLOCKING: Yes - horizontal page scrollbars are a significant UX issue
|
|
14
|
+
*/
|
|
15
|
+
import { PreflightCheckResult } from "../../core/types";
|
|
16
|
+
export declare const id = "ui/layout-overflow-containment";
|
|
17
|
+
export declare const name = "Layout Overflow Containment";
|
|
18
|
+
export declare const description = "Ensures dashboard layouts contain overflow to prevent page-level scrollbars";
|
|
19
|
+
export declare const category = "ui";
|
|
20
|
+
export declare const blocking = true;
|
|
21
|
+
export declare const tags: string[];
|
|
22
|
+
export declare function run(): Promise<PreflightCheckResult>;
|
|
23
|
+
//# sourceMappingURL=layout-overflow-containment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-overflow-containment.d.ts","sourceRoot":"","sources":["../../../src/checks/ui/layout-overflow-containment.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAI1E,eAAO,MAAM,EAAE,mCAAmC,CAAC;AACnD,eAAO,MAAM,IAAI,gCAAgC,CAAC;AAClD,eAAO,MAAM,WAAW,gFAAgF,CAAC;AACzG,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA6C,CAAC;AA0I/D,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA2DzD"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Layout Overflow Containment Preflight
|
|
5
|
+
*
|
|
6
|
+
* Detects dashboard/page layouts where the main content area lacks proper
|
|
7
|
+
* overflow containment, which can cause horizontal page scrollbars.
|
|
8
|
+
*
|
|
9
|
+
* When a flex container has `minWidth: 0` (to allow shrinking) but no
|
|
10
|
+
* `overflow: hidden`, scrollable children (like TableContainer) won't
|
|
11
|
+
* properly trigger internal scrolling - instead the content can expand
|
|
12
|
+
* and create page-level horizontal scrollbars.
|
|
13
|
+
*
|
|
14
|
+
* BLOCKING: Yes - horizontal page scrollbars are a significant UX issue
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
51
|
+
exports.run = run;
|
|
52
|
+
const fs = __importStar(require("node:fs"));
|
|
53
|
+
const path = __importStar(require("node:path"));
|
|
54
|
+
const glob_1 = require("glob");
|
|
55
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
56
|
+
// METADATA
|
|
57
|
+
exports.id = "ui/layout-overflow-containment";
|
|
58
|
+
exports.name = "Layout Overflow Containment";
|
|
59
|
+
exports.description = "Ensures dashboard layouts contain overflow to prevent page-level scrollbars";
|
|
60
|
+
exports.category = "ui";
|
|
61
|
+
exports.blocking = true;
|
|
62
|
+
exports.tags = ["ui", "layout", "responsive", "overflow"];
|
|
63
|
+
// Patterns that indicate a layout file
|
|
64
|
+
const LAYOUT_FILE_PATTERNS = [
|
|
65
|
+
"**/*Layout*.tsx",
|
|
66
|
+
"**/*PageLayout*.tsx",
|
|
67
|
+
"**/layout.tsx",
|
|
68
|
+
"**/DashboardPage*.tsx",
|
|
69
|
+
];
|
|
70
|
+
const EXCLUDE_PATTERNS = [
|
|
71
|
+
"**/node_modules/**",
|
|
72
|
+
"**/.next/**",
|
|
73
|
+
"**/dist/**",
|
|
74
|
+
"**/*.test.tsx",
|
|
75
|
+
"**/*.spec.tsx",
|
|
76
|
+
];
|
|
77
|
+
// Pattern: flex container with minWidth: 0 but no overflow handling
|
|
78
|
+
const MIN_WIDTH_ZERO_PATTERN = /minWidth:\s*0/;
|
|
79
|
+
const OVERFLOW_PATTERN = /overflow:\s*["']?(hidden|auto|scroll)/;
|
|
80
|
+
const OVERFLOW_X_PATTERN = /overflowX:\s*["']?(hidden|auto|scroll)/;
|
|
81
|
+
const OVERFLOW_CLASS_PATTERN = /overflow-(?:hidden|auto|x-hidden|y-auto)/;
|
|
82
|
+
// Pattern: CSSProperties object assignment for main/content areas
|
|
83
|
+
const CONTENT_STYLE_PATTERN = /(content|main|container)Style.*?{([^}]+)}/is;
|
|
84
|
+
function analyzeLayoutFile(filePath) {
|
|
85
|
+
const issues = [];
|
|
86
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
87
|
+
const lines = content.split("\n");
|
|
88
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
89
|
+
// Check for flex containers with minWidth: 0 but no overflow
|
|
90
|
+
// This is the exact pattern that causes page-level horizontal scrollbars
|
|
91
|
+
// Find style objects that have minWidth: 0
|
|
92
|
+
for (let i = 0; i < lines.length; i++) {
|
|
93
|
+
const line = lines[i];
|
|
94
|
+
// Skip comments and preflight-ignore
|
|
95
|
+
if (line.includes("//") && line.includes("preflight-ignore"))
|
|
96
|
+
continue;
|
|
97
|
+
if (line.includes("/*") && line.includes("preflight-ignore"))
|
|
98
|
+
continue;
|
|
99
|
+
// Check if this line has minWidth: 0
|
|
100
|
+
if (MIN_WIDTH_ZERO_PATTERN.test(line)) {
|
|
101
|
+
// Look at surrounding context (the style object) for overflow handling
|
|
102
|
+
const contextStart = Math.max(0, i - 15);
|
|
103
|
+
const contextEnd = Math.min(lines.length, i + 15);
|
|
104
|
+
const context = lines.slice(contextStart, contextEnd).join("\n");
|
|
105
|
+
// Find the style object boundaries
|
|
106
|
+
const beforeLine = content.substring(0, content.split("\n").slice(0, i).join("\n").length);
|
|
107
|
+
const lastBracePos = beforeLine.lastIndexOf("{");
|
|
108
|
+
const styleObjectStart = beforeLine.substring(lastBracePos);
|
|
109
|
+
// Get the full style object by finding matching braces
|
|
110
|
+
let braceCount = 1;
|
|
111
|
+
let endIndex = i;
|
|
112
|
+
for (let j = i; j < lines.length && braceCount > 0; j++) {
|
|
113
|
+
const jLine = lines[j];
|
|
114
|
+
for (const char of jLine) {
|
|
115
|
+
if (char === "{")
|
|
116
|
+
braceCount++;
|
|
117
|
+
if (char === "}")
|
|
118
|
+
braceCount--;
|
|
119
|
+
}
|
|
120
|
+
endIndex = j;
|
|
121
|
+
if (braceCount === 0)
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
const styleObjectLines = lines.slice(contextStart, endIndex + 1).join("\n");
|
|
125
|
+
// Check if this style object has overflow handling
|
|
126
|
+
const hasOverflow = OVERFLOW_PATTERN.test(styleObjectLines) ||
|
|
127
|
+
OVERFLOW_X_PATTERN.test(styleObjectLines);
|
|
128
|
+
// Check if it's a scroll container (which intentionally scrolls)
|
|
129
|
+
const isScrollContainer = /scrollContainer|scroll.*container/i.test(styleObjectLines);
|
|
130
|
+
// Check for flex: 1 (indicating main content area)
|
|
131
|
+
const isFlexExpand = /flex:\s*1|flex:\s*['"]?1/.test(styleObjectLines);
|
|
132
|
+
// If it has minWidth: 0 and flex expansion but no overflow, flag it
|
|
133
|
+
if (!hasOverflow && isFlexExpand && !isScrollContainer) {
|
|
134
|
+
// Check if there's a comment explaining why overflow is not needed
|
|
135
|
+
const hasExplanation = /no.*overflow|overflow.*not.*need|intentional/i.test(context);
|
|
136
|
+
if (!hasExplanation) {
|
|
137
|
+
issues.push({
|
|
138
|
+
file: relativePath,
|
|
139
|
+
line: i + 1,
|
|
140
|
+
pattern: "minWidth: 0 without overflow containment",
|
|
141
|
+
message: `Flex container has minWidth: 0 but no overflow handling. This can cause page-level horizontal scrollbars when content (like tables) exceeds available width. Add \`overflow: "hidden"\` to force scrollable children to scroll internally.`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Check for dashboard/page layouts that render TableContainer without overflow
|
|
148
|
+
if (content.includes("TableContainer") || content.includes("overflow-x-auto")) {
|
|
149
|
+
// Check if the layout has a main content wrapper with overflow hidden
|
|
150
|
+
const hasContentOverflow = /component=["']main["'].*overflow/i.test(content) ||
|
|
151
|
+
/main.*overflow.*hidden/i.test(content) ||
|
|
152
|
+
OVERFLOW_CLASS_PATTERN.test(content);
|
|
153
|
+
// Check if there's a proper container hierarchy
|
|
154
|
+
const hasProperContainment = content.includes("overflow: \"hidden\"") ||
|
|
155
|
+
content.includes("overflow: 'hidden'") ||
|
|
156
|
+
content.includes("overflow-hidden");
|
|
157
|
+
if (!hasContentOverflow && !hasProperContainment) {
|
|
158
|
+
// Only flag if this is actually a layout file, not a component using tables
|
|
159
|
+
const isLayoutFile = /Layout|Page\s*\(|export\s+default\s+function\s+\w+Page/.test(content);
|
|
160
|
+
if (isLayoutFile) {
|
|
161
|
+
issues.push({
|
|
162
|
+
file: relativePath,
|
|
163
|
+
line: 1,
|
|
164
|
+
pattern: "Layout with scrollable content but no overflow containment",
|
|
165
|
+
message: `This layout renders scrollable content (TableContainer) but may lack proper overflow containment on the parent. Ensure the main content area has \`overflow: "hidden"\` to prevent page-level horizontal scrollbars.`,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return issues;
|
|
171
|
+
}
|
|
172
|
+
async function run() {
|
|
173
|
+
const startTime = Date.now();
|
|
174
|
+
const findings = [];
|
|
175
|
+
// Get layout files
|
|
176
|
+
const allFiles = [];
|
|
177
|
+
for (const pattern of LAYOUT_FILE_PATTERNS) {
|
|
178
|
+
const matches = await (0, glob_1.glob)(pattern, {
|
|
179
|
+
cwd: process.cwd(),
|
|
180
|
+
ignore: EXCLUDE_PATTERNS,
|
|
181
|
+
});
|
|
182
|
+
allFiles.push(...matches);
|
|
183
|
+
}
|
|
184
|
+
// Deduplicate files
|
|
185
|
+
const uniqueFiles = [...new Set(allFiles)];
|
|
186
|
+
console.log(`\n${console_chars_1.emoji.search} ${exports.name}`);
|
|
187
|
+
console.log(` Checking ${uniqueFiles.length} layout files...`);
|
|
188
|
+
// Analyze each file
|
|
189
|
+
const allIssues = [];
|
|
190
|
+
for (const file of uniqueFiles) {
|
|
191
|
+
const filePath = path.join(process.cwd(), file);
|
|
192
|
+
if (!fs.existsSync(filePath))
|
|
193
|
+
continue;
|
|
194
|
+
const issues = analyzeLayoutFile(filePath);
|
|
195
|
+
allIssues.push(...issues);
|
|
196
|
+
}
|
|
197
|
+
// Convert to findings
|
|
198
|
+
for (const issue of allIssues) {
|
|
199
|
+
findings.push({
|
|
200
|
+
level: "error",
|
|
201
|
+
message: issue.message,
|
|
202
|
+
file: issue.file,
|
|
203
|
+
startLine: issue.line,
|
|
204
|
+
ruleId: "layout-overflow-containment",
|
|
205
|
+
suggestion: `Add \`overflow: "hidden"\` to the flex container to contain horizontal overflow.`,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const passed = findings.length === 0;
|
|
209
|
+
if (passed) {
|
|
210
|
+
console.log(` ${console_chars_1.emoji.success} All layouts have proper overflow containment`);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
console.log(` ${console_chars_1.emoji.error} Found ${findings.length} layout(s) missing overflow containment`);
|
|
214
|
+
for (const finding of findings) {
|
|
215
|
+
console.log(` ${finding.file}:${finding.startLine}`);
|
|
216
|
+
console.log(` ${finding.message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
passed,
|
|
221
|
+
findings,
|
|
222
|
+
duration: Date.now() - startTime,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
// CLI entry point
|
|
226
|
+
async function main() {
|
|
227
|
+
const result = await run();
|
|
228
|
+
if (result.passed) {
|
|
229
|
+
console.log(`\n${console_chars_1.emoji.success} LAYOUT OVERFLOW CONTAINMENT CHECK PASSED`);
|
|
230
|
+
process.exit(0);
|
|
231
|
+
}
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
if (require.main === module) {
|
|
235
|
+
main().catch((err) => {
|
|
236
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=layout-overflow-containment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-overflow-containment.js","sourceRoot":"","sources":["../../../src/checks/ui/layout-overflow-containment.ts"],"names":[],"mappings":"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"}
|