|
| 1 | +# Page View — A4 Document Mode |
| 2 | + |
| 3 | +- Added new "Page" view mode (split layout: editor left, A4 page frames right) |
| 4 | +- New `css/page-view.css` — A4 page frame styling with shadows, page numbers, zoom levels, dark mode, responsive mobile layout |
| 5 | +- New `js/page-view.js` — reflow engine splits rendered markdown into A4-sized page frames using element height measurement |
| 6 | +- `<!-- pagebreak -->` HTML comments converted to visible markers that force new page breaks in page view |
| 7 | +- Page view header bar with page counter ("X pages"), zoom dropdown (50%–125%), and Export PDF button |
| 8 | +- `data-pagebreak` attribute added to DOMPurify whitelist in `renderer.js` |
| 9 | +- Page view button added to header, mobile menu, and Quick Action Bar (icon: `bi-file-earmark-richtext`) |
| 10 | +- `setViewMode()` in `ui-panels.js` extended with `view-page` CSS class and `enterPageMode()`/`exitPageMode()` lifecycle |
| 11 | +- Live reflow: page frames update on editor input (debounced) |
| 12 | +- Hidden render container technique for accurate element height measurement before page distribution |
| 13 | + |
| 14 | +--- |
| 15 | + |
| 16 | +## Summary |
| 17 | + |
| 18 | +New "Page" view mode that renders markdown as discrete A4-sized page frames in a side-by-side split layout (editor + pages). Writers can see exactly how their content will look on printed pages, with automatic page breaking, manual `<!-- pagebreak -->` markers, zoom control, and one-click PDF export. |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## 1. Page View CSS |
| 23 | +**Files:** `css/page-view.css` |
| 24 | +**What:** New stylesheet with `.page-frame` elements sized at 210×297mm (A4), `.page-view-header` bar, `.page-view-scroll` container with dot-grid background, zoom transform rules, page number positioning, dark mode variants, and responsive breakpoints for mobile. |
| 25 | +**Impact:** Users see professional A4 page frames with shadows, margins, and page numbers — visually matching printed output. |
| 26 | + |
| 27 | +## 2. Page View Engine |
| 28 | +**Files:** `js/page-view.js` |
| 29 | +**What:** New module implementing `enterPageMode()`, `exitPageMode()`, and `reflowPages()`. Uses a hidden off-screen container to render markdown via `renderMarkdownToContainer()`, measures each top-level element's height, and distributes them across A4-sized page frame divs based on a ~970px content height per page. Respects `.page-break-marker` elements for forced page breaks. |
| 30 | +**Impact:** Content is automatically split into realistic A4 pages in real-time as the user types. |
| 31 | + |
| 32 | +## 3. View Mode Integration |
| 33 | +**Files:** `index.html`, `js/ui-panels.js`, `src/main.js` |
| 34 | +**What:** Added Page button (`data-mode="page"`) to all three view-mode button groups. Extended `setViewMode()` with `view-page` class and enter/exit lifecycle. Added `#page-view-container` HTML with header bar (counter, zoom, export). Wired CSS/JS imports in `main.js`. |
| 35 | +**Impact:** Page view is accessible from all view mode controls and integrates seamlessly with the existing mode switching system. |
| 36 | + |
| 37 | +## 4. Pagebreak Marker Support |
| 38 | +**Files:** `js/renderer.js` |
| 39 | +**What:** Added regex preprocessing to convert `<!-- pagebreak -->` HTML comments into `<div class="page-break-marker" data-pagebreak="true">` before `marked.parse()`. Added `data-pagebreak` to DOMPurify's `ADD_ATTR` whitelist. |
| 40 | +**Impact:** Users can insert `<!-- pagebreak -->` anywhere in their markdown to force a new page in page view and PDF export. |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +## Files Changed (6 total) |
| 45 | + |
| 46 | +| File | Lines Changed | Type | |
| 47 | +|------|:---:|------| |
| 48 | +| `css/page-view.css` | +185 | New — A4 page frame styling | |
| 49 | +| `js/page-view.js` | +195 | New — reflow engine | |
| 50 | +| `index.html` | +33 | Page button (3 locations) + container HTML | |
| 51 | +| `src/main.js` | +2 | CSS/JS imports | |
| 52 | +| `js/ui-panels.js` | +10 −2 | Page mode in setViewMode() | |
| 53 | +| `js/renderer.js` | +5 −1 | Pagebreak preprocessor + DOMPurify attr | |
0 commit comments