Coordinate Fault Proof
Mathematical proof of where MultiPageEditorComposer coordinates fail. All numbers are live — computed from the real engine, measured in the real browser DOM. No mocks. No approximations.
What each column means:
itemTopPt — the Y coordinate (top-down, PDF canvas pixels) assigned by paginateItems().
itemTopPct — same value expressed as % of canvas height.
itemTop CSSPx — the actual CSS pixel position on a 600px-wide canvas at correct aspect ratio.
Browser Height — measured scrollHeight of the textarea in that exact CSS style at that exact zone width.
Rendered Bottom — itemTop CSSPx + Browser Height. This is where the paragraph actually ends on screen.
Next Top — itemTop CSSPx of the immediately following paragraph.
Gap — Next Top − Rendered Bottom. Negative = proven overlap. Very positive = spacing inflation.
Blue Floral (floral_letterhead_01)
Engine constants · pdfW=800 pdfH=593 · textZoneWidth=560pt · font=libre_baskerville · size_id=16 → pdfPt=14 lhPt=22 paraSpacing=8 · canvas@600px scale=0.7500 · lhCssPx=16.50 psCssPx=6.00 · CSS fontSize=14px lineHeight=1.57 · pages=1
| # | Paragraph snippet | itemTopPt | itemTopPct | itemTop CSSPx | Browser Height | Rendered Bottom | Next Top | Gap | Verdict |
|---|
| 1 | I have been thinking about you every single day since you le… | 120.00pt | 20.2361% | 90.00px | 66.00px | 156.00px | 129.00px | OVERLAP -27.0px | OVERLAP |
| 2 | You taught me that love is not a feeling that fades — it is … | 172.00pt | 29.0051% | 129.00px | 66.00px | 195.00px | 168.00px | OVERLAP -27.0px | OVERLAP |
| 3 | The house is quieter than I ever imagined possible. But in t… | 224.00pt | 37.7740% | 168.00px | 88.00px | 256.00px | — | — | |
Delta analysis — browser height vs engine-allocated slot per paragraph:
- ¶1: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶2: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶3: browser=88.00px
FAILURE MODE: C: Typography Mismatch (browser height > engine slot)
Tropical Beach (tropical_beach_01)
Engine constants · pdfW=800 pdfH=534 · textZoneWidth=560pt · font=libre_baskerville · size_id=16 → pdfPt=14 lhPt=22 paraSpacing=8 · canvas@600px scale=0.7500 · lhCssPx=16.50 psCssPx=6.00 · CSS fontSize=14px lineHeight=1.57 · pages=1
| # | Paragraph snippet | itemTopPt | itemTopPct | itemTop CSSPx | Browser Height | Rendered Bottom | Next Top | Gap | Verdict |
|---|
| 1 | I have been thinking about you every single day since you le… | 120.00pt | 22.4719% | 90.00px | 66.00px | 156.00px | 129.00px | OVERLAP -27.0px | OVERLAP |
| 2 | You taught me that love is not a feeling that fades — it is … | 172.00pt | 32.2097% | 129.00px | 66.00px | 195.00px | 168.00px | OVERLAP -27.0px | OVERLAP |
| 3 | The house is quieter than I ever imagined possible. But in t… | 224.00pt | 41.9476% | 168.00px | 88.00px | 256.00px | — | — | |
Delta analysis — browser height vs engine-allocated slot per paragraph:
- ¶1: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶2: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶3: browser=88.00px
FAILURE MODE: C: Typography Mismatch (browser height > engine slot)
Angel (default)
Engine constants · pdfW=800 pdfH=1120 · textZoneWidth=560pt · font=libre_baskerville · size_id=16 → pdfPt=14 lhPt=22 paraSpacing=8 · canvas@600px scale=0.7500 · lhCssPx=16.50 psCssPx=6.00 · CSS fontSize=14px lineHeight=1.57 · pages=1
| # | Paragraph snippet | itemTopPt | itemTopPct | itemTop CSSPx | Browser Height | Rendered Bottom | Next Top | Gap | Verdict |
|---|
| 1 | I have been thinking about you every single day since you le… | 120.00pt | 10.7143% | 90.00px | 66.00px | 156.00px | 129.00px | OVERLAP -27.0px | OVERLAP |
| 2 | You taught me that love is not a feeling that fades — it is … | 172.00pt | 15.3571% | 129.00px | 66.00px | 195.00px | 168.00px | OVERLAP -27.0px | OVERLAP |
| 3 | The house is quieter than I ever imagined possible. But in t… | 224.00pt | 20.0000% | 168.00px | 88.00px | 256.00px | — | — | |
Delta analysis — browser height vs engine-allocated slot per paragraph:
- ¶1: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶2: browser=66.00px slot=39.00px Δ=+27.0px ← browser TALLER than slot (OVERLAP cause)
- ¶3: browser=88.00px
FAILURE MODE: C: Typography Mismatch (browser height > engine slot)
Failure mode key:
A — Bad Coordinates: topPt = 0 for items after the first. paginateItems returned wrong Y.
B — Stale Coordinates: itemTopsPt array is empty or not updated when layout changes.
C — Typography Mismatch: browser renders text taller than the PDF engine allocated. Browser gap is negative even though engine coordinates are correct for the PDF grid.
D — Multiple: Two or more of A/B/C fire simultaneously.