pulse: 1× local vs 3× remote, local cards don't trigger all-tab dot
Locally-created cards (editor, quick capture, duplicate) now get a single subtle pulse instead of the triple-pulse reserved for relay- synced cards. Local cards also never trigger the unread dot on the fixed "all" bucket tab — the user just created them, there's nothing "unseen" about their own work. state.js: new state.recentlyCreatedIds Set. Populated by editor.js doSave (POST), app.js quick capture (POST), and context-menu.js duplicate (both date-rename and copy paths). board.js renderBoard diff: new card ids are checked against recentlyCreatedIds at diff time. Local ids go into a renderBoard- local newLocalIds set (never into state.unseenCardIds). Remote ids go into unseenCardIds as before. board.js drain block (end of renderBoard): two-phase drain. Phase 1: newLocalIds → pulseCards(local, 'card-pulse-local') with 900ms timeout, works in any bucket. Consumed recentlyCreatedIds entries are deleted. Phase 2: remaining unseenCardIds (remote only) → pulseCards(remote, 'card-pulse-new') with 2400ms timeout, only on activeBucket=all. decorateAllUnreadDot() reads only state.unseenCardIds which now contains exclusively remote ids → no dot from local card creation. style.css: new .card-pulse-local class — same @keyframes but animation-iteration-count:1. Anim-fast/slow overrides added. chore: bump version to 0.9.16 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
088c225202
commit
ce6ca73ea0
7 files changed
+51
-17
No files matched your search
@@ -283,9 +283,11 @@ export function showContextMenu(x, y, card) {
|
||||
const newDate = await showDialog({ title: 'duplicate_to_date', input: 'date', defaultValue: curDate, okLabel: 'Duplicate' });
|
||||
if (!newDate) return;
|
||||
const newTitle = card.title.replace(/^\d{4}-\d{2}-\d{2}/, newDate.trim());
|
||||
await api('api/cards', { method: 'POST', body: { title: newTitle, body: card.body, color: card.color, bucket_id: card.bucket_id, position: -1 } });
|
||||
const dup1 = await api('api/cards', { method: 'POST', body: { title: newTitle, body: card.body, color: card.color, bucket_id: card.bucket_id, position: -1 } });
|
||||
if (dup1?.id) state.recentlyCreatedIds?.add(String(dup1.id));
|
||||
} else {
|
||||
await api('api/cards', { method: 'POST', body: { title: card.title + ' (copy)', body: card.body, color: card.color, bucket_id: card.bucket_id, position: -1 } });
|
||||
const dup2 = await api('api/cards', { method: 'POST', body: { title: card.title + ' (copy)', body: card.body, color: card.color, bucket_id: card.bucket_id, position: -1 } });
|
||||
if (dup2?.id) state.recentlyCreatedIds?.add(String(dup2.id));
|
||||
}
|
||||
await window._reloadAll();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user