From 9e687185fb1aa6c334bb9ce8678b1e52bdd59781 Mon Sep 17 00:00:00 2001 From: Kristian Wind Date: Wed, 19 Aug 2026 21:28:16 +0200 Subject: [PATCH] =?UTF-8?q?feat(notes):=20vis=20noten=20som=20kode,=20og?= =?UTF-8?q?=20giv=20teksten=20en=20margen=20at=20=C3=A5nde=20i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kildevisningen, fordi den rige flade ikke kan tage imod Markdown. Indsat i den er "## Overskrift" fem tegn og ikke en overskrift, og der var ingen vej ind for tekst skrevet et andet sted — hvilket er en mærkelig mangel i et program, hvis hele lager er Markdown. Knappen viser filen, som den ligger i databasen, og det, man skriver der, går tilbage gennem den samme oversætter som altid. Fyldt fra kilden og ikke fra note.body, når man går tilbage: gemningen venter på sin pause, så den vej ville kaste det nyeste væk. Og kildevisningen hører til den note, den blev slået til på — skifter man note, er det den rige flade, man møder. Margenerne. Teksten lå helt ude ved kanten, og på en bred skærm blev linjerne hundrede og fyrre tegn — dér mister øjet hvilken linje det var på, når det springer tilbage. Arket har nu marginer, der vokser med ruden, og teksten en grænse på 46rem. Kun teksten: værktøjslinjen og foden hører til ruden. Co-Authored-By: Claude Opus 5 --- web/src/lib/components/NoteEditor.svelte | 110 +++++++++++++++++++++++ web/src/lib/locales/da.js | 2 + web/src/lib/locales/en.js | 2 + web/src/routes/noter/+page.svelte | 7 +- 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/web/src/lib/components/NoteEditor.svelte b/web/src/lib/components/NoteEditor.svelte index 2083c25..f509b09 100644 --- a/web/src/lib/components/NoteEditor.svelte +++ b/web/src/lib/components/NoteEditor.svelte @@ -43,6 +43,10 @@ editor.innerHTML = note.body.trim() ? markdownToHtml(note.body) : '


'; loadedId = note.id; active = {}; + // Kildevisningen hører til den note, den blev slået til på. Skifter man note, + // er det den rige flade, man skal møde — ellers står den næste note som kode, + // uden at nogen har bedt om det. + asSource = false; colourCode(); }); @@ -138,6 +142,51 @@ readSuggestions(); } + // --- kilden ---------------------------------------------------------------------- + + /** + * Noten som den Markdown, den er. + * + * Fladen er rig tekst, fordi det er den, folk kan. Men filen under er Markdown, + * og der er to ting, den rige flade ikke kan: tage imod Markdown, nogen har + * skrevet et andet sted — indsat i den rige flade er `## Overskrift` fem tegn og + * ikke en overskrift — og vise, hvad der faktisk bliver gemt. Begge dele er det + * samme svar: lad folk se kilden. + * + * Ikke en tredje tilstand at holde styr på: teksten går gennem de samme to + * funktioner som altid, kun den anden vej. Det, man ser i kildefeltet, er ord for + * ord det, der ligger i databasen. + */ + let asSource = $state(false); + let source = $state(''); + + function toggleSource() { + if (!asSource) { + source = htmlToMarkdown(editor); + asSource = true; + return; + } + asSource = false; + onchange?.(source); + // Fyldt fra kilden, ikke fra `note.body`. + // + // Noten i lageret er den sidst gemte, og gemningen venter på sin pause — så + // den vej ville kaste det, der lige er skrevet i kildefeltet, væk. `loadedId` + // røres ikke: $effect ser stadig en note, den har indlæst, og skriver ikke + // hen over det her. + queueMicrotask(() => { + if (!editor) return; + editor.innerHTML = source.trim() ? markdownToHtml(source) : '


'; + colourCode(); + }); + } + + /** Kilden skrives direkte igennem: det er filen, man redigerer. */ + function sourceChanged(event) { + source = event.currentTarget.value; + onchange?.(source); + } + // --- suggesting a project ------------------------------------------------------ let suggestions = $state([]); @@ -373,11 +422,37 @@ + + + + + + {#if asSource} + + + {/if}