From e41b9636668e5ff4a9cd97880851452835d8c2c9 Mon Sep 17 00:00:00 2001 From: thiloho <123883702+thiloho@users.noreply.github.com> Date: Sat, 17 Aug 2024 16:05:14 +0200 Subject: [PATCH] Synchronize scrolling with textarea and preview --- web-app/src/app.css | 2 +- .../src/lib/components/WebsiteEditor.svelte | 13 ++++++++++-- .../website/[websiteId]/+page.svelte | 21 +++++++++++++++++-- .../articles/[articleId]/+page.svelte | 21 +++++++++++++++++-- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/web-app/src/app.css b/web-app/src/app.css index 7034160..940eda4 100644 --- a/web-app/src/app.css +++ b/web-app/src/app.css @@ -230,7 +230,7 @@ form label { } form label:has(textarea) { - max-inline-size: 65ch; + max-inline-size: 75ch; } form .file-field { diff --git a/web-app/src/lib/components/WebsiteEditor.svelte b/web-app/src/lib/components/WebsiteEditor.svelte index a245f30..68a6dde 100644 --- a/web-app/src/lib/components/WebsiteEditor.svelte +++ b/web-app/src/lib/components/WebsiteEditor.svelte @@ -7,14 +7,23 @@ title, children, fullPreview = false, - previewContent + previewContent, + previewScrollTop = 0 } = $props<{ id: string; title: string; children: Snippet; fullPreview?: boolean; previewContent: string; + previewScrollTop?: number; }>(); + + let previewElement: HTMLDivElement; + + $effect(() => { + const scrollHeight = previewElement.scrollHeight - previewElement.clientHeight; + previewElement.scrollTop = (previewScrollTop / 100) * scrollHeight; + }); @@ -43,7 +52,7 @@ {@render children()} -
+
{#if fullPreview} {:else} diff --git a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte index fe3e319..f988edd 100644 --- a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte +++ b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte @@ -8,6 +8,15 @@ import { API_BASE_PREFIX } from "$lib/utils"; const { data, form } = $props<{ data: PageServerData; form: ActionData }>(); + + let previewContent = $state(data.home.main_content); + let mainContentTextarea: HTMLTextAreaElement; + let textareaScrollTop = $state(0); + + const updateScrollPercentage = () => { + const { scrollTop, scrollHeight, clientHeight } = mainContentTextarea; + textareaScrollTop = (scrollTop / (scrollHeight - clientHeight)) * 100; + }; @@ -15,7 +24,8 @@

Global

@@ -133,7 +143,14 @@ > diff --git a/web-app/src/routes/(authenticated)/website/[websiteId]/articles/[articleId]/+page.svelte b/web-app/src/routes/(authenticated)/website/[websiteId]/articles/[articleId]/+page.svelte index 9fe1c94..ebf3a9d 100644 --- a/web-app/src/routes/(authenticated)/website/[websiteId]/articles/[articleId]/+page.svelte +++ b/web-app/src/routes/(authenticated)/website/[websiteId]/articles/[articleId]/+page.svelte @@ -8,6 +8,15 @@ import { API_BASE_PREFIX } from "$lib/utils"; const { data, form } = $props<{ data: PageServerData; form: ActionData }>(); + + let previewContent = $state(data.article.main_content); + let mainContentTextarea: HTMLTextAreaElement; + let textareaScrollTop = $state(0); + + const updateScrollPercentage = () => { + const { scrollTop, scrollHeight, clientHeight } = mainContentTextarea; + textareaScrollTop = (scrollTop / (scrollHeight - clientHeight)) * 100; + }; @@ -15,8 +24,9 @@

Edit article

@@ -78,7 +88,14 @@