From 6f3f7c7e039f951acbca6a2d2e1b79e0d06cc11b Mon Sep 17 00:00:00 2001 From: Frederic Cabassut Date: Thu, 5 Mar 2026 23:00:58 +0100 Subject: [PATCH] fix: undo/redo buttons now reactively update on editor changes Add a tick counter that increments on every TipTap transaction, propagated from TiptapEditor through NoteEditor to FormattingToolbar. This forces Svelte 5 to re-evaluate canUndo/canRedo state in the template since plain object method calls aren't tracked reactively. Co-Authored-By: Claude Opus 4.6 --- src/lib/components/FormattingToolbar.svelte | 14 +++++++++----- src/lib/components/NoteEditor.svelte | 4 +++- src/lib/components/TiptapEditor.svelte | 4 +++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/lib/components/FormattingToolbar.svelte b/src/lib/components/FormattingToolbar.svelte index 771136b..eb5bc59 100644 --- a/src/lib/components/FormattingToolbar.svelte +++ b/src/lib/components/FormattingToolbar.svelte @@ -26,10 +26,14 @@ } from 'lucide-svelte'; interface Props { + tick?: number; editor: Editor | undefined; } - let { editor }: Props = $props(); + let { editor, tick }: Props = $props(); + + function canUndo() { void tick; return editor?.can().chain().focus().undo().run() ?? false; } + function canRedo() { void tick; return editor?.can().chain().focus().redo().run() ?? false; } let openDropdown: string | null = $state(null); let linkUrl: string = $state(''); @@ -111,8 +115,8 @@