diff --git a/CHANGELOG.md b/CHANGELOG.md index fc13022..cac91c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,13 +22,9 @@ - Filename derived from first H1/H2/H3 heading, fallback `document.odt` - Favicon (hand-coded SVG, no external assets) - Lists (ordered / unordered) -- Light / Dark / Auto appearance mode (settings menu in toolbar) +- Light / Dark / Allblack / Auto appearance mode (settings menu in toolbar) - expandable extended toolbar - DIN A4 print layout with visual page breaks - - Repeating multi-page background (page surface + gap between pages) - - Shadow edges at page boundaries for depth effect - - Dynamic page snapping (editor always shows full pages) - - Print-ready @media print styles with @page A4 sizing - add bottom toolbar to show page number - Zoom feature - font selection diff --git a/src/App.svelte b/src/App.svelte index 2fba4e7..f8a5c2a 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -118,6 +118,10 @@ + {:else if themeMode === 'allBlack'} + + + {:else} @@ -128,7 +132,7 @@ {#if themeOpen} - {#each ([['light', 'Light'], ['dark', 'Dark'], ['auto', 'Auto']] as const) as [m, label]} + {#each ([['light', 'Light'], ['dark', 'Dark'], ['allBlack', 'AllBlack'], ['auto', 'Auto']] as const) as [m, label]} diff --git a/src/lib/storage/theme.ts b/src/lib/storage/theme.ts index 2b78d79..be77ea5 100644 --- a/src/lib/storage/theme.ts +++ b/src/lib/storage/theme.ts @@ -1,4 +1,4 @@ -export type ThemeMode = 'light' | 'dark' | 'auto'; +export type ThemeMode = 'light' | 'dark' | 'allBlack' | 'auto'; const THEME_KEY = 'odf-editor-theme'; const TOOLBAR_KEY = 'odf-editor-toolbar-expanded'; @@ -6,7 +6,7 @@ const FORMATTING_MARKS_KEY = 'odf-editor-formatting-marks'; export function loadTheme(): ThemeMode { const saved = localStorage.getItem(THEME_KEY); - if (saved === 'light' || saved === 'dark' || saved === 'auto') return saved; + if (saved === 'light' || saved === 'dark' || saved === 'allBlack' || saved === 'auto') return saved; return 'auto'; } @@ -30,7 +30,7 @@ export function saveFormattingMarks(enabled: boolean): void { localStorage.setItem(FORMATTING_MARKS_KEY, String(enabled)); } -function resolveMode(mode: ThemeMode): 'light' | 'dark' { +function resolveMode(mode: ThemeMode): 'light' | 'dark' | 'allBlack' { if (mode === 'auto') { return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } diff --git a/src/styles/editor.css b/src/styles/editor.css index 4d1db81..cc648d6 100644 --- a/src/styles/editor.css +++ b/src/styles/editor.css @@ -25,43 +25,43 @@ font-family: var(--font-serif); font-size: 1.05rem; line-height: 1.5; - color: var(--color-text); + color: var(--color-page-text); /* Multi-page background: page surfaces separated by editor background */ background: /* Left border per page */ repeating-linear-gradient( to bottom, - var(--color-border) 0px, - var(--color-border) var(--page-height), + var(--color-page-border) 0px, + var(--color-page-border) var(--page-height), transparent var(--page-height), transparent var(--page-cycle) ), /* Right border per page */ repeating-linear-gradient( to bottom, - var(--color-border) 0px, - var(--color-border) var(--page-height), + var(--color-page-border) 0px, + var(--color-page-border) var(--page-height), transparent var(--page-height), transparent var(--page-cycle) ), /* Top/bottom border lines of each page */ repeating-linear-gradient( to bottom, - var(--color-border) 0px, - var(--color-border) 1px, + var(--color-page-border) 0px, + var(--color-page-border) 1px, transparent 1px, transparent calc(var(--page-height) - 1px), - var(--color-border) calc(var(--page-height) - 1px), - var(--color-border) var(--page-height), + var(--color-page-border) calc(var(--page-height) - 1px), + var(--color-page-border) var(--page-height), transparent var(--page-height), transparent var(--page-cycle) ), /* Page surface (white) alternating with gap (transparent = editor bg shows) */ repeating-linear-gradient( to bottom, - var(--color-surface) 0px, - var(--color-surface) var(--page-height), + var(--color-page-bg) 0px, + var(--color-page-bg) var(--page-height), transparent var(--page-height), transparent var(--page-cycle) ); diff --git a/src/styles/global.css b/src/styles/global.css index 7acb04c..6c2358c 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -19,22 +19,40 @@ --color-border: #e2e8f0; --color-text: #1e293b; --color-text-muted: #94a3b8; - --color-primary: #3b82f6; - --color-primary-hover: #2563eb; + --color-primary: #52748b; --color-toolbar-bg: #ffffff; --color-btn-hover: #cbd5e1; + --color-page-bg: #ffffff; + --color-page-text: #1e293b; + --color-page-border: #e2e8f0; } [data-theme="dark"] { --color-bg: #0d1117; --color-surface: #161b22; --color-border: #30363d; - --color-text: #e6edf3; + --color-text: #f2e6f3; --color-text-muted: #7d8590; - --color-primary: #2f81f7; - --color-primary-hover: #388bfd; + --color-primary: #52748b; --color-toolbar-bg: #161b22; --color-btn-hover: #3b4350; + --color-page-bg: #ffffff; + --color-page-text: #1e293b; + --color-page-border: #e2e8f0; +} + +[data-theme="allBlack"] { + --color-bg: #0d1117; + --color-surface: #161b22; + --color-border: #30363d; + --color-text: #e6edf3; + --color-text-muted: #7d8590; + --color-primary: #52748b; + --color-toolbar-bg: #161b22; + --color-btn-hover: #3b4350; + --color-page-bg: #161b22; + --color-page-text: #e6edf3; + --color-page-border: #30363d; } html, body {