Skip to content

Commit 1c86d60

Browse files
committed
feat: add Page View (A4 Document Mode) with split layout
- New 'Page' view mode: editor left, A4 page frames right - Reflow engine splits rendered markdown into 210×297mm page frames - <- Reflow engine splits rendered markdown into 210×297mm page frames pagebreak --> markers force new pages - Page counter, zoom dropdown (50%–125%), Export PDF button - Dark mode, responsive mobile, page numbers - New files: css/page-view.css, js/page-view.js - Modified: index.html, ui-panels.js, renderer.js, main.js
1 parent 633a735 commit 1c86d60

2 files changed

Lines changed: 55 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
| Category | Features |
2424
|:---------|:---------|
25-
| **Editor** | Live preview, split/editor/preview modes, sync scrolling, formatting toolbar, find & replace (regex), word wrap toggle, draggable resize divider |
25+
| **Editor** | Live preview, split/editor/preview/page modes, sync scrolling, formatting toolbar, find & replace (regex), word wrap toggle, draggable resize divider |
2626
| **Writing Modes** | Zen mode (distraction-free fullscreen), Focus mode (dimmed paragraphs), Dark mode, multiple preview themes (GitHub, GitLab, Notion, Dracula, Solarized, Evergreen) |
2727
| **Rendering** | GitHub-style Markdown, syntax highlighting (180+ languages), LaTeX math (MathJax), Mermaid diagrams (zoom/pan/export), PlantUML diagrams, callout blocks, footnotes, emoji, anchor links |
2828
| **🎬 Media Embedding** | Video playback via `![alt](video.mp4)` image syntax (`.mp4`, `.webm`, `.ogg`, `.mov`, `.m4v`); YouTube/Vimeo embeds auto-detected; `embed` code block for responsive media grids (`cols=1-4`, `height=N`); Video.js v10 lazy-loaded with native `<video>` fallback; website URLs render as rich link preview cards with favicon + "Open ↗" button |
@@ -459,6 +459,7 @@ TextAgent has undergone significant evolution since its inception. What started
459459

460460
| Date | Commits | Feature / Update |
461461
|------|---------|-----------------|
462+
| **2026-03-16** | | 📄 **Page View (A4 Document Mode)** — new split-layout "Page" view mode (editor left, A4 page frames right) with automatic content reflow into 210×297mm page frames; `<!-- pagebreak -->` HTML comment markers force new pages; page counter, zoom dropdown (50%–125%), and Export PDF button in page header; `page-view.js` reflow engine measures element heights and distributes across pages; `page-view.css` with shadows, page numbers, dark mode, responsive mobile; button added to header/mobile/QAB; `setViewMode()` extended with `view-page` class and enter/exit lifecycle |
462463
| **2026-03-16** | | 📱 **Mobile Layout Gap Fix** — eliminated a massive white gap that appeared between the toolbar and editor/presentation preview on mobile devices (≤1080px) by fixing a CSS flexbox bug where the closed workspace sidebar still consumed vertical height in column mode |
463464
| **2026-03-16** | | 🐛 **File-Switch State Reset** — fixed Run All button staying in "Stop" mode when switching .md files; fixed document variables leaking across files; new `resetFileSessionState()` in `workspace.js` aborts execution, force-resets `_running` flag, clears Run All button/progress bar/variables/exec context on every file switch; new `forceReset()` in `exec-controller.js` for immediate hard-reset of internal state |
464465
| **2026-03-15** | | 🚀 **Run All Engine & TTS UX** — pre-execution model readiness check auto-loads all required models (AI + Kokoro TTS) before block execution starts; detailed `[RunAll]` console logging with `console.table` block summary, per-block timing, variable resolution status (✅/⚠), and completion summary; Stop button now works during model loading via `M._execAborted` cross-module flag; `ensureModelReadyAsync()` rewritten with fail-fast on missing consent/API key; compact preflight dialog (960px, smaller fonts, all 8 columns visible); `waitForModelReady()` handles Kokoro TTS via `M.tts.isKokoroReady()`; TTS card split into 3 buttons: ▶ Run (generate audio only), ▷ Play (replay stored audio), 💾 Save (download WAV); new `M.tts.generate()`, `playLastAudio()`, `isKokoroReady()`, `initKokoro()` APIs; AI model fallback in `run-requirements.js` correctly defaults to text models |

changelogs/CHANGELOG-page-view.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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

Comments
 (0)