// scripts/generate-overflow-test-pdf.mjs import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { chromium } from 'playwright'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // --- Helper functions to generate HTML for each page --- function box(left, top, width, height) { return `left:${left}%;top:${top}%;width:${width}%;height:${height}%;`; } function labelStyle(left, top) { return `left:${left}%;top:${top}%;`; } function makeBox(left, top, width, height, label, { labelBelow = false } = {}) { const labelTop = labelBelow ? top + height + 0.5 : top - 1.5; return `
${label}
`; } // --- Pages 1-2: Date / Email (3×3 multi-line grid with text align variants) --- function makeFieldOverflowPageWithGrid(title) { const startX = 10; const boxWidth = 35; // Section A: Single-line height const slHeight = 1.75; const slStartY = 15; const slRowSpacing = 8; const sectionARows = [ { y: slStartY, label: 'M_AUTO TA_LEFT VA_MIDDLE' }, { y: slStartY + slRowSpacing, label: 'M_AUTO TA_LEFT VA_MIDDLE' }, { y: slStartY + 2 * slRowSpacing, label: 'M_AUTO TA_LEFT VA_MIDDLE' }, ]; // Section B: Multi-line height — 3×3 grid // Rows: TA_LEFT, TA_CENTER, TA_RIGHT // Columns: short, medium, long text const mlHeight = 12; const mlBoxWidth = 30; const mlColumnX = [2.5, 35, 67.5]; const mlRowY = [45, 63, 83]; const mlTextAligns = ['LEFT', 'CENTER', 'RIGHT']; let content = `
${title}
`; for (const r of sectionARows) { content += makeBox(startX, r.y, boxWidth, slHeight, r.label); } for (let ri = 0; ri < 3; ri++) { for (let ci = 0; ci < 3; ci++) { const label = `M_AUTO TA_${mlTextAligns[ri]} VA_MIDDLE`; content += makeBox(mlColumnX[ci], mlRowY[ri], mlBoxWidth, mlHeight, label); } } return content; } // --- Page 3: Signature (stacked multi-line, no text align control) --- function makeSignatureOverflowPage(title) { const startX = 10; const boxWidth = 35; // Section A: Single-line height const slHeight = 1.75; const slStartY = 15; const slRowSpacing = 8; const sectionARows = [ { y: slStartY, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, { y: slStartY + slRowSpacing, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, { y: slStartY + 2 * slRowSpacing, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, ]; // Section B: Multi-line height — stacked single column const mlHeight = 12; const mlStartY = 45; const mlRowSpacing = 18; const sectionBRows = [ { y: mlStartY, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, { y: mlStartY + mlRowSpacing, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, { y: mlStartY + 2 * mlRowSpacing, label: 'M_AUTO TA_CENTER VA_MIDDLE' }, ]; let content = `
${title}
`; for (const r of sectionARows) { content += makeBox(startX, r.y, boxWidth, slHeight, r.label); } for (const r of sectionBRows) { content += makeBox(startX, r.y, boxWidth, mlHeight, r.label); } return content; } // --- Pages 4-5: Text Field Auto Mode --- function makeTextAutoPage(title, boxHeight, isSingleLine) { const boxWidth = 28; const columns = [ { col: 0, x: 5, textAlign: 'left' }, { col: 1, x: 35.5, textAlign: 'center' }, { col: 2, x: 66, textAlign: 'right' }, ]; const verticalAligns = ['top', 'middle', 'bottom']; let content = `
${title}
`; if (isSingleLine) { // Single-line: stagger all 9 items evenly down the page. // Each item gets its own Y position to avoid horizontal overflow collision. const itemCount = 9; // 3 rows × 3 columns const startY = 10; const endY = 92; const spacing = (endY - startY) / (itemCount - 1); let itemIndex = 0; for (let ri = 0; ri < 3; ri++) { for (let ci = 0; ci < columns.length; ci++) { const col = columns[ci]; const y = startY + itemIndex * spacing; const label = `M_AUTO TA_${col.textAlign.toUpperCase()} VA_${verticalAligns[ri].toUpperCase()}`; content += makeBox(col.x, y, boxWidth, boxHeight, label); itemIndex++; } } } else { // Multi-line: 3 rows evenly spaced, bottom row near page bottom. // Box is 12% tall. Top of last box at 80% so bottom edge is at 92%. const startY = 10; const lastRowY = 80; // 80 + 12 = 92% (page bottom with padding) const midY = (startY + lastRowY) / 2; // 45% const rowYPositions = [startY, midY, lastRowY]; for (let ri = 0; ri < 3; ri++) { const labelBelow = verticalAligns[ri] === 'bottom'; for (const col of columns) { const label = `M_AUTO TA_${col.textAlign.toUpperCase()} VA_${verticalAligns[ri].toUpperCase()}`; content += makeBox(col.x, rowYPositions[ri], boxWidth, boxHeight, label, { labelBelow }); } } } return content; } // --- Page 6: Explicit Modes --- function makePage6() { const boxWidth = 25; let content = `
Text Field Explicit Modes
`; // Section A: Horizontal mode — centered on page, staggered vertically const centeredX = (100 - boxWidth) / 2; // 37.5% const horizontalRows = [ { x: centeredX, y: 15, label: 'M_HORIZONTAL TA_LEFT VA_TOP' }, { x: centeredX, y: 21, label: 'M_HORIZONTAL TA_CENTER VA_TOP' }, { x: centeredX, y: 27, label: 'M_HORIZONTAL TA_RIGHT VA_TOP' }, ]; for (const r of horizontalRows) { content += makeBox(r.x, r.y, boxWidth, 1.75, r.label); } // Section B: Vertical mode — place side by side so vertical overflow has room below content += ''; const verticalCols = [ { x: 5, y: 43, label: 'M_VERTICAL TA_LEFT VA_TOP', labelBelow: false }, { x: 37.5, y: 43, label: 'M_VERTICAL TA_LEFT VA_MIDDLE', labelBelow: false }, { x: 70, y: 43, label: 'M_VERTICAL TA_LEFT VA_BOTTOM', labelBelow: true }, ]; for (const c of verticalCols) { content += makeBox(c.x, c.y, boxWidth, 12, c.label, { labelBelow: c.labelBelow }); } return content; } // --- Page 7: Crop Mode --- function makePage7() { return `
Crop Mode (no overflow)
${makeBox(10, 15, 25, 1.75, 'M_CROP TA_LEFT VA_TOP')} ${makeBox(10, 30, 25, 12, 'M_CROP TA_LEFT VA_TOP')}`; } // --- Assemble all pages --- function buildPage(contentFn) { return `
${typeof contentFn === 'string' ? contentFn : contentFn}
`; } const html = ` ${buildPage(makeFieldOverflowPageWithGrid('Date Field Overflow Tests'))} ${buildPage(makeFieldOverflowPageWithGrid('Email Field Overflow Tests'))} ${buildPage(makeSignatureOverflowPage('Signature Field Overflow Tests'))} ${buildPage(makeTextAutoPage('Text Field Auto - Single-line Height', 1.75, true))} ${buildPage(makeTextAutoPage('Text Field Auto - Multi-line Height', 12, false))} ${buildPage(makeTextAutoPage('Text Field Auto - Multi-line Height Overflow', 12, false))} ${buildPage(makePage6())} ${buildPage(makePage7())} `; async function main() { const browser = await chromium.launch(); const page = await browser.newPage(); await page.setContent(html, { waitUntil: 'networkidle' }); const outputPath = path.join(__dirname, '../assets/field-overflow.pdf'); await page.pdf({ path: outputPath, format: 'A4', printBackground: true, margin: { top: '0', right: '0', bottom: '0', left: '0' }, }); await browser.close(); console.log(`PDF generated: assets/field-overflow.pdf`); } main().catch(console.error);