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:
thandClaude Opus 4.6 committed 2026-04-12 11:15:53 +02:00
1 parent 088c225202
commit ce6ca73ea0
7 files changed
+51 -17

No files matched your search

+12
View File
@@ -786,12 +786,24 @@ body.detail-image-fs-open { overflow: hidden; }
animation: card-pulse-new 0.8s ease-in-out 3;
z-index: 5;
}
/* Single pulse for cards the user just created themselves — subtler
than the triple-pulse for relay-synced cards so the user registers
"I made this" without the urgency of "someone else sent this". */
.board-card.card-pulse-local {
animation: card-pulse-new 0.8s ease-in-out 1;
z-index: 5;
}
/* Pin the cadence so anim-fast/anim-slow can't strobe it */
body.anim-fast .board-card.card-pulse-new,
body.anim-slow .board-card.card-pulse-new {
animation: card-pulse-new 0.8s ease-in-out 3 !important;
animation-duration: 0.8s !important;
}
body.anim-fast .board-card.card-pulse-local,
body.anim-slow .board-card.card-pulse-local {
animation: card-pulse-new 0.8s ease-in-out 1 !important;
animation-duration: 0.8s !important;
}
/* Super-bucket dropdown popover. Positioned via inline styles by
openSuperDropdown() in buckets.js. Lives on document.body (not