From f51c77cefec27eb27b752037f858935437fafa14 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Mon, 24 Nov 2025 16:51:55 +0100 Subject: [PATCH] feat: iframe-based PagedJS preview with reactive CSS editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Isolate PagedJS in iframe to avoid DOM/CSS conflicts - Add EditorPanel for global CSS controls - Add StylesheetViewer with highlight.js syntax highlighting - Add ElementPopup for element-specific CSS editing - CSS modifications update preview reactively - Support px/rem/em units 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- package-lock.json | 10 + package.json | 1 + src/App.vue | 283 ++++++++++++++++++---------- src/assets/print-styles.css | 19 ++ src/components/EditorPanel.vue | 72 +++++++ src/components/ElementPopup.vue | 152 +++++++++++++++ src/components/PagedJsWrapper.vue | 37 +++- src/components/SidePanel.vue | 22 +++ src/components/StylesheetViewer.vue | 54 ++++++ 9 files changed, 541 insertions(+), 109 deletions(-) create mode 100644 src/assets/print-styles.css create mode 100644 src/components/EditorPanel.vue create mode 100644 src/components/ElementPopup.vue create mode 100644 src/components/SidePanel.vue create mode 100644 src/components/StylesheetViewer.vue diff --git a/package-lock.json b/package-lock.json index ed16ede..331bddd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "geoproject", "version": "0.0.0", "dependencies": { + "highlight.js": "^11.11.1", "pagedjs": "^0.4.3", "vue": "^3.5.24" }, @@ -1182,6 +1183,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", diff --git a/package.json b/package.json index 6a0a97e..2e1896a 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "preview": "vite preview" }, "dependencies": { + "highlight.js": "^11.11.1", "pagedjs": "^0.4.3", "vue": "^3.5.24" }, diff --git a/src/App.vue b/src/App.vue index 5401f04..2372aa6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,116 +1,193 @@ - - - - + + + + + + diff --git a/src/assets/print-styles.css b/src/assets/print-styles.css new file mode 100644 index 0000000..7429227 --- /dev/null +++ b/src/assets/print-styles.css @@ -0,0 +1,19 @@ +/* PagedJS print styles */ +@page { + size: A4; + margin: 20mm 15mm 26mm 15mm; +} + +h2 { + break-before: page; +} + +@page { + @bottom-center { + content: string(title); + } +} + +.chapter > h2 { + string-set: title content(text); +} diff --git a/src/components/EditorPanel.vue b/src/components/EditorPanel.vue new file mode 100644 index 0000000..e8b157c --- /dev/null +++ b/src/components/EditorPanel.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/ElementPopup.vue b/src/components/ElementPopup.vue new file mode 100644 index 0000000..add01f3 --- /dev/null +++ b/src/components/ElementPopup.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/components/PagedJsWrapper.vue b/src/components/PagedJsWrapper.vue index 8e7c81a..45c7189 100644 --- a/src/components/PagedJsWrapper.vue +++ b/src/components/PagedJsWrapper.vue @@ -1,6 +1,33 @@ - + - + diff --git a/src/components/SidePanel.vue b/src/components/SidePanel.vue new file mode 100644 index 0000000..611fee8 --- /dev/null +++ b/src/components/SidePanel.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/components/StylesheetViewer.vue b/src/components/StylesheetViewer.vue new file mode 100644 index 0000000..a0dbcf9 --- /dev/null +++ b/src/components/StylesheetViewer.vue @@ -0,0 +1,54 @@ + + + + +