From b9ec36611da1719d71e369488edf4ae8ea927c75 Mon Sep 17 00:00:00 2001 From: Ulas Date: Mon, 30 Mar 2026 21:18:44 +0200 Subject: [PATCH] feat: consistent vibration feedback via vibrate() utility across modules Co-Authored-By: Claude Sonnet 4.6 --- public/pages/budget.js | 3 ++- public/pages/contacts.js | 3 ++- public/pages/notes.js | 3 ++- public/pages/shopping.js | 3 ++- public/pages/tasks.js | 6 +++--- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/public/pages/budget.js b/public/pages/budget.js index 4fa5972..86af7ae 100644 --- a/public/pages/budget.js +++ b/public/pages/budget.js @@ -7,7 +7,7 @@ import { api } from '/api.js'; import { openModal as openSharedModal, closeModal } from '/components/modal.js'; -import { stagger } from '/utils/ux.js'; +import { stagger, vibrate } from '/utils/ux.js'; // -------------------------------------------------------- // Konstanten @@ -424,6 +424,7 @@ async function deleteEntry(id) { const sumRes = await api.get(`/budget/summary?month=${state.month}`); state.summary = sumRes.data; renderBody(); + vibrate([30, 50, 30]); window.oikos?.showToast('Eintrag gelöscht', 'success'); } catch (err) { window.oikos?.showToast(err.data?.error ?? 'Fehler', 'error'); diff --git a/public/pages/contacts.js b/public/pages/contacts.js index e8fc55d..d196d14 100644 --- a/public/pages/contacts.js +++ b/public/pages/contacts.js @@ -6,7 +6,7 @@ import { api } from '/api.js'; import { openModal as openSharedModal, closeModal } from '/components/modal.js'; -import { stagger } from '/utils/ux.js'; +import { stagger, vibrate } from '/utils/ux.js'; // -------------------------------------------------------- // Konstanten @@ -314,6 +314,7 @@ async function deleteContact(id) { await api.delete(`/contacts/${id}`); state.contacts = state.contacts.filter((c) => c.id !== id); renderList(); + vibrate([30, 50, 30]); window.oikos?.showToast('Kontakt gelöscht', 'success'); } catch (err) { window.oikos?.showToast(err.data?.error ?? 'Fehler', 'error'); diff --git a/public/pages/notes.js b/public/pages/notes.js index 49917cb..e466404 100644 --- a/public/pages/notes.js +++ b/public/pages/notes.js @@ -6,7 +6,7 @@ import { api } from '/api.js'; import { openModal as openSharedModal, closeModal } from '/components/modal.js'; -import { stagger } from '/utils/ux.js'; +import { stagger, vibrate } from '/utils/ux.js'; // -------------------------------------------------------- // Konstanten @@ -459,6 +459,7 @@ async function deleteNote(id) { await api.delete(`/notes/${id}`); state.notes = state.notes.filter((n) => n.id !== id); renderGrid(); + vibrate([30, 50, 30]); window.oikos?.showToast('Notiz gelöscht', 'success'); } catch (err) { window.oikos?.showToast(err.data?.error ?? 'Fehler', 'error'); diff --git a/public/pages/shopping.js b/public/pages/shopping.js index 8fff69d..69a7419 100644 --- a/public/pages/shopping.js +++ b/public/pages/shopping.js @@ -5,7 +5,7 @@ */ import { api } from '/api.js'; -import { stagger } from '/utils/ux.js'; +import { stagger, vibrate } from '/utils/ux.js'; // -------------------------------------------------------- // Konstanten @@ -441,6 +441,7 @@ function wireListContentEvents(container) { try { await api.patch(`/shopping/items/${id}`, { is_checked: newVal }); + vibrate(10); } catch (err) { // Zurückrollen if (item) item.is_checked = checked; diff --git a/public/pages/tasks.js b/public/pages/tasks.js index 6572928..82a9c69 100644 --- a/public/pages/tasks.js +++ b/public/pages/tasks.js @@ -7,7 +7,7 @@ import { api } from '/api.js'; import { renderRRuleFields, bindRRuleEvents, getRRuleValues } from '/rrule-ui.js'; import { openModal as openSharedModal, closeModal } from '/components/modal.js'; -import { stagger } from '/utils/ux.js'; +import { stagger, vibrate } from '/utils/ux.js'; // -------------------------------------------------------- // Konstanten @@ -766,7 +766,7 @@ function wireSwipeGestures(container) { // Swipe links → Status-Toggle (offen ↔ erledigt) card.style.transition = 'transform 0.2s ease'; card.style.transform = 'translateX(-110%)'; - if (navigator.vibrate) navigator.vibrate(40); + vibrate(40); setTimeout(async () => { resetCard(false); try { @@ -781,7 +781,7 @@ function wireSwipeGestures(container) { } else if (dx > SWIPE_THRESHOLD) { // Swipe rechts → Bearbeiten-Modal resetCard(true); - if (navigator.vibrate) navigator.vibrate(20); + vibrate(20); try { const task = await loadTaskForEdit(taskId); openTaskModal({ task, users: state.users }, container);