From 681517db215471a5e1bd85460fd21187c8d6fd34 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Wed, 10 Dec 2025 11:51:53 +0100 Subject: [PATCH] refactor: extract debounce logic into shared composable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create useDebounce composable to avoid code duplication - Apply debounce to TextSettings margin/padding inputs - Harmonize debounce delay to 500ms across all components - Fix input lag when typing values like "30mm" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/components/ElementPopup.vue | 8 ++----- src/components/PagePopup.vue | 8 ++----- src/components/editor/PageSettings.vue | 8 ++----- src/components/editor/TextSettings.vue | 30 ++++++++++++++++---------- src/composables/useDebounce.js | 15 +++++++++++++ 5 files changed, 40 insertions(+), 29 deletions(-) create mode 100644 src/composables/useDebounce.js diff --git a/src/components/ElementPopup.vue b/src/components/ElementPopup.vue index 56ba45f..de79b52 100644 --- a/src/components/ElementPopup.vue +++ b/src/components/ElementPopup.vue @@ -274,6 +274,7 @@ import { ref, computed, watch } from 'vue'; import { useStylesheetStore } from '../stores/stylesheet'; import { usePopupPosition } from '../composables/usePopupPosition'; +import { useDebounce } from '../composables/useDebounce'; import NumberInput from './ui/NumberInput.vue'; import Coloris from '@melloware/coloris'; import '@melloware/coloris/dist/coloris.css'; @@ -307,7 +308,7 @@ const colorInput = ref(null); const backgroundInput = ref(null); let isUpdatingFromStore = false; -let updateTimer = null; +const { debouncedUpdate } = useDebounce(500); // Style properties const fontFamily = ref({ value: 'Alegreya Sans' }); @@ -320,11 +321,6 @@ const background = ref({ value: 'transparent' }); const marginOuter = ref({ value: 0, unit: 'mm' }); const paddingInner = ref({ value: 0, unit: 'mm' }); -const debouncedUpdate = (callback) => { - clearTimeout(updateTimer); - updateTimer = setTimeout(callback, 1000); -}; - const immediateUpdate = (callback) => { callback(); }; diff --git a/src/components/PagePopup.vue b/src/components/PagePopup.vue index 0b309be..c48c390 100644 --- a/src/components/PagePopup.vue +++ b/src/components/PagePopup.vue @@ -285,6 +285,7 @@ import { ref, computed, watch, onMounted } from 'vue'; import { useStylesheetStore } from '../stores/stylesheet'; import { usePopupPosition } from '../composables/usePopupPosition'; +import { useDebounce } from '../composables/useDebounce'; import NumberInput from './ui/NumberInput.vue'; import Coloris from '@melloware/coloris'; import '@melloware/coloris/dist/coloris.css'; @@ -312,7 +313,7 @@ const inheritanceLocked = ref(true); const backgroundColorInput = ref(null); let isUpdatingFromStore = false; -let updateTimer = null; +const { debouncedUpdate } = useDebounce(500); const margins = ref({ top: { value: 0, unit: 'mm' }, @@ -328,11 +329,6 @@ const background = ref({ const pattern = ref(''); -const debouncedUpdate = (callback) => { - clearTimeout(updateTimer); - updateTimer = setTimeout(callback, 1000); -}; - const immediateUpdate = (callback) => { callback(); }; diff --git a/src/components/editor/PageSettings.vue b/src/components/editor/PageSettings.vue index b0a2fe7..d21a5a5 100644 --- a/src/components/editor/PageSettings.vue +++ b/src/components/editor/PageSettings.vue @@ -288,16 +288,17 @@