From 2088423b597738d98a8a28eed6682c57f53559b7 Mon Sep 17 00:00:00 2001 From: Steffen Becker Date: Tue, 2 Jun 2026 19:50:26 +0200 Subject: [PATCH] feat: page margin setting --- CHANGELOG.md | 4 +- src/App.svelte | 12 +- src/lib/editor/Editor.svelte | 32 +++- src/lib/editor/ToolbarExpanded.svelte | 261 +++++++++++++++++++++++++- src/lib/editor/pageBreaks.ts | 74 ++++++-- src/lib/export/odt.ts | 19 +- src/lib/storage/pageMargins.ts | 49 +++++ src/styles/editor.css | 10 +- 8 files changed, 420 insertions(+), 41 deletions(-) create mode 100644 src/lib/storage/pageMargins.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index cac91c7..27a7e5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,9 +29,10 @@ - Zoom feature - font selection - font size selection -- line spacing button +- line spacing + paragraph spacing - text alignment - show formatting marks +- margins ### Not yet implemented - ODT import / open existing file @@ -51,7 +52,6 @@ 1 cm on paper ≈ 1 cm on screen. Possible future fix: add a user-side calibration (DPI value or visual ruler) that scales the `zoom` factor. Decided 2026-05-26 not worth the effort for now. -- limited font types to make sure it works on all browsers ("web safe fonts") --- diff --git a/src/App.svelte b/src/App.svelte index 71b1aad..17a1066 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -7,6 +7,7 @@ import { getPageBreakDebug } from './lib/editor/pageBreaks'; import { getColorDebug } from './lib/editor/colorDebug'; import { loadTheme, saveTheme, applyTheme, loadToolbarExpanded, saveToolbarExpanded, loadFormattingMarks, saveFormattingMarks, type ThemeMode } from './lib/storage/theme'; + import { loadPageMargins, savePageMargins, type PageMargins } from './lib/storage/pageMargins'; let editor: Editor | null = $state(null); let tick: number = $state(0); @@ -18,11 +19,16 @@ let toolbarExpanded = $state(loadToolbarExpanded()); let showFormattingMarks = $state(loadFormattingMarks()); let zoom = $state(Math.max(20, Math.min(300, parseInt(localStorage.getItem('odf-editor-zoom') ?? '100', 10)))); + let pageMargins: PageMargins = $state(loadPageMargins()); $effect(() => { saveFormattingMarks(showFormattingMarks); }); + $effect(() => { + savePageMargins(pageMargins); + }); + function setZoom(value: number) { zoom = Math.max(20, Math.min(300, value)); localStorage.setItem('odf-editor-zoom', String(zoom)); @@ -49,7 +55,7 @@ } async function handleExport() { - if (editor) await exportToOdt(editor); + if (editor) await exportToOdt(editor, pageMargins); } function handleDebugDump() { @@ -161,9 +167,9 @@ {#if toolbarExpanded} - + {/if} - +