Notifications: deleting leaves a Deleted/Undo row, so repeated clicks on × cannot delete the next one #1363

Closed
opened 2026-10-07 14:07:37 +00:00 by kayg · 23 comments
Owner

Owner report 2026-10-07 on production 0419170fe, Notifications panel: deleting a notification leaves an inline placeholder row "Deleted · Undo" in its place. Owner: "we dont need this. it's just a deletion of notification, i should be able to spam multiple clicks at the same place (the x) to delete multiple notifications as deleting one would move the next one to the same place."
Expected: clicking × removes the row at once (same frame, optimistic, DESIGN §59 rule 4) and the list closes the gap so the next notification moves under the pointer; rapid repeated clicks on the same spot delete one notification per click, never two per click and never a click lost to an animation or a placeholder. No inline "Deleted / Undo" row. Undo stays available without taking list space: one shared Undo toast that coalesces bursts ("3 notifications deleted · Undo" restores all of them). Motion: the gap closes with the shared duration but the next row's × must be hit-testable at the original position immediately (no pointer-events gap during the collapse). Applies to all notification groups (Today, Earlier).

Owner report 2026-10-07 on production 0419170fe, Notifications panel: deleting a notification leaves an inline placeholder row "Deleted · Undo" in its place. Owner: "we dont need this. it's just a deletion of notification, i should be able to spam multiple clicks at the same place (the x) to delete multiple notifications as deleting one would move the next one to the same place." Expected: clicking × removes the row at once (same frame, optimistic, DESIGN §59 rule 4) and the list closes the gap so the next notification moves under the pointer; rapid repeated clicks on the same spot delete one notification per click, never two per click and never a click lost to an animation or a placeholder. No inline "Deleted / Undo" row. Undo stays available without taking list space: one shared Undo toast that coalesces bursts ("3 notifications deleted · Undo" restores all of them). Motion: the gap closes with the shared duration but the next row's × must be hit-testable at the original position immediately (no pointer-events gap during the collapse). Applies to all notification groups (Today, Earlier).
Author
Owner

Starting #1363 on job/notifdel-1363, based on 0419170fe456b58614befcb12d9c9d255118f1c0 (origin/dev).

Starting #1363 on `job/notifdel-1363`, based on `0419170fe456b58614befcb12d9c9d255118f1c0` (origin/dev).
Author
Owner

Finding: docs/DESIGN.md §27 and InboxPanel.svelte currently require inline Undo rows for both Delete and Clear all. #1363 explicitly moves single-item Delete Undo into the shared toast; I will keep Clear all's existing inline Undo and update the design text to match this issue.

Finding: `docs/DESIGN.md` §27 and `InboxPanel.svelte` currently require inline Undo rows for both Delete and Clear all. #1363 explicitly moves single-item Delete Undo into the shared toast; I will keep Clear all's existing inline Undo and update the design text to match this issue.
Author
Owner

Finding: an inbox GET can start after optimistic Delete but return before the server has removed the notification. Its response could then restore the deleted row. Delete confirmation now advances the read generation before final removal; a regression releases that stale GET after confirmation and verifies both the row and unread count stay removed.

Finding: an inbox GET can start after optimistic Delete but return before the server has removed the notification. Its response could then restore the deleted row. Delete confirmation now advances the read generation before final removal; a regression releases that stale GET after confirmation and verifies both the row and unread count stay removed.
Author
Owner

Production-build Playwright evidence for #1363: the five-click case passed at 1440 and 820 CSS px in light and dark. At 390 CSS px, five real down/up pairs at the first-row × coordinate reached only four Delete buttons; the fifth response waiter timed out after 30 seconds. The test now records the actual pointer target for diagnosis. I am tracing the intercept before final gates.

Production-build Playwright evidence for #1363: the five-click case passed at 1440 and 820 CSS px in light and dark. At 390 CSS px, five real down/up pairs at the first-row × coordinate reached only four Delete buttons; the fifth response waiter timed out after 30 seconds. The test now records the actual pointer target for diagnosis. I am tracing the intercept before final gates.
Author
Owner

Confirmed and fixed #1363 phone hitbox finding: as rows were removed, the content-sized bottom sheet shrank and the fifth stationary-pointer click landed on .sheet-chrome. Notifications now uses OverlaySurface's existing three-quarter phone-sheet size, so the top edge stays fixed while rows collapse. Production-build Playwright then passed the five-click/Undo cases at 390 px in both themes. A 20-request concurrent Delete burst on 30 rows completed in 1,294.4 ms; a replay kept its receipt and a fresh read retained the other ten rows in order.

Confirmed and fixed #1363 phone hitbox finding: as rows were removed, the content-sized bottom sheet shrank and the fifth stationary-pointer click landed on `.sheet-chrome`. Notifications now uses OverlaySurface's existing three-quarter phone-sheet size, so the top edge stays fixed while rows collapse. Production-build Playwright then passed the five-click/Undo cases at 390 px in both themes. A 20-request concurrent Delete burst on 30 rows completed in 1,294.4 ms; a replay kept its receipt and a fresh read retained the other ten rows in order.
Author
Owner

The complete production-build #1363 Playwright regression now passes. It performed five real stationary-pointer clicks and Undo at 1440, 820 and 390 px in both themes, and captured all six Mac-rendered screenshots. In the separate server burst case, 20 Delete requests were dispatched in 40.4 ms; all receipts settled in 1,572.9 ms. The 10 remaining rows stayed in server order after a fresh inbox read, and replaying a client ID did not restore its row. I am checking the existing #1194 Notifications E2E and running final gates after the required origin/dev merge.

The complete production-build #1363 Playwright regression now passes. It performed five real stationary-pointer clicks and Undo at 1440, 820 and 390 px in both themes, and captured all six Mac-rendered screenshots. In the separate server burst case, 20 Delete requests were dispatched in 40.4 ms; all receipts settled in 1,572.9 ms. The 10 remaining rows stayed in server order after a fresh inbox read, and replaying a client ID did not restore its row. I am checking the existing #1194 Notifications E2E and running final gates after the required origin/dev merge.
Author
Owner

The #1363 notification profile completed locally because the free perf VM could not start the staged server (NotFound after its shared libraries were available). It used the exact-worktree prebuilt debug server. Local load average was 64.47/67.45/65.02 before and 65.06/66.34/64.83 after.

At 64 rows, Delete p50/p95 was 61.8/213.8 ms and Delete+Undo was 34.8/87.4 ms; server mean RSS was 184,939,789 bytes. At 10,000 rows, Delete was 512.6 ms and Delete+Undo 99.3 ms. The concurrent 20-delete burst completed in 2,717.47 ms with latency p50/p95 1,159.3/2,148.2 ms; every receipt succeeded, the remaining rows stayed ordered, and Undo restored the original order. The high-host-load local run is not a baseline comparison. docs/perf/baseline.json has no Delete/Undo baseline. Raw result: artifacts/notifdel-1363/perf.json.

The #1363 notification profile completed locally because the free perf VM could not start the staged server (`NotFound` after its shared libraries were available). It used the exact-worktree prebuilt debug server. Local load average was 64.47/67.45/65.02 before and 65.06/66.34/64.83 after. At 64 rows, Delete p50/p95 was 61.8/213.8 ms and Delete+Undo was 34.8/87.4 ms; server mean RSS was 184,939,789 bytes. At 10,000 rows, Delete was 512.6 ms and Delete+Undo 99.3 ms. The concurrent 20-delete burst completed in 2,717.47 ms with latency p50/p95 1,159.3/2,148.2 ms; every receipt succeeded, the remaining rows stayed ordered, and Undo restored the original order. The high-host-load local run is not a baseline comparison. `docs/perf/baseline.json` has no Delete/Undo baseline. Raw result: `artifacts/notifdel-1363/perf.json`.
Author
Owner

The final bun run check found a type error at apps/web/src/lib/notifications/inbox.svelte.ts:458: the delete input union also includes Clear, so the filter callback could not access intent.input.item. I captured the narrowed delete item before the callback. The rerun reports zero Svelte errors; the performance guard also passes with zero violations.

The final `bun run check` found a type error at `apps/web/src/lib/notifications/inbox.svelte.ts:458`: the delete input union also includes Clear, so the filter callback could not access `intent.input.item`. I captured the narrowed delete item before the callback. The rerun reports zero Svelte errors; the performance guard also passes with zero violations.
Author
Owner

Full bun run test result: 286 files passed and 1 failed; 2,038 tests passed and 1 failed. src/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts timed out at its existing 5,000 ms limit (the run reported 7,094 ms for the test; suite duration 802.52 s). As requested, I reran only that file with bunx vitest run src/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts --maxWorkers=2; it passed: 1 file, 4 tests, 21.64 s. No expectation or timeout was changed.

Full `bun run test` result: 286 files passed and 1 failed; 2,038 tests passed and 1 failed. `src/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts` timed out at its existing 5,000 ms limit (the run reported 7,094 ms for the test; suite duration 802.52 s). As requested, I reran only that file with `bunx vitest run src/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts --maxWorkers=2`; it passed: 1 file, 4 tests, 21.64 s. No expectation or timeout was changed.
Author
Owner

Finding: Delete Undo previously started one independent receipt request per deleted notification at once. Coalesced batches can be large, so that made Undo request fan-out unbounded. The shared toast now restores receipts with a concurrency limit of four; a focused regression test holds requests and proves the 7-item batch runs 4 then 3 while preserving order. The focused notification test passed (10/10), and the production Playwright run passed five fixed-position clicks, Undo, a 20-delete burst, and macOS screenshots at 1440/820/390 in light and dark.

Finding: Delete Undo previously started one independent receipt request per deleted notification at once. Coalesced batches can be large, so that made Undo request fan-out unbounded. The shared toast now restores receipts with a concurrency limit of four; a focused regression test holds requests and proves the 7-item batch runs 4 then 3 while preserving order. The focused notification test passed (10/10), and the production Playwright run passed five fixed-position clicks, Undo, a 20-delete burst, and macOS screenshots at 1440/820/390 in light and dark.
Author
Owner

#1363 complete

Branch: job/notifdel-1363 (based on dev; merged origin/dev once before final gates). Head: bf523375ffe4514a8184751251f6622bcafd5853 (Bound coalesced notification Undo requests). Worktree is clean.

Built

  • Notification Delete now removes its row optimistically in the same frame. The inline Deleted / Undo placeholder is gone. The top row stays at the stationary pointer hitbox while later rows collapse, so five real clicks at the same × position delete five successive notifications.
  • Consecutive Deletes coalesce in the app's shared Undo toast. It says N notifications deleted · Undo and restores the deleted items in server order. Client receipt IDs keep retries idempotent; inbox read generations prevent stale refreshes from resurrecting deleted rows.
  • Delete Undo sends at most four independent receipt writes at once. Clear all keeps its existing inline Undo.
  • The phone Notifications sheet uses the shared OverlaySurface three-quarter size to keep the Delete hitbox fixed as rows collapse. Existing shared Menu, row action buttons/tooltips and toast adapter provide the controls; no feature-local primitive restyling was added.
  • Added the real-server production Playwright regression, a notification mutation benchmark profile, toast/store regression coverage, and the DESIGN §27 decision update.

Files

  • apps/web/src/lib/notifications/InboxPanel.svelte
  • apps/web/src/lib/notifications/inbox.svelte.ts
  • apps/web/src/lib/notifications/inbox.svelte.test.ts
  • apps/web/src/lib/notifications/model.ts
  • apps/web/src/lib/notifications/model.test.ts
  • apps/web/src/lib/stores/toasts.svelte.ts
  • apps/web/src/lib/stores/toasts.svelte.test.ts
  • apps/web/e2e/notifdel-1363.mjs
  • apps/web/e2e/notifications-1194.mjs
  • apps/web/package.json
  • bench/notifications-inbox-1194.mjs
  • contracts/perf/adoption-1058.json
  • contracts/perf/exceptions.json
  • contracts/perf/registry.json
  • docs/DESIGN.md

UX gaps closed

  • Fixed-coordinate repeated clicks work on phone and desktop without moving the pointer or waiting for row motion.
  • Keyboard and menu Delete preserve list focus; pointer Delete does not pull focus away from the clicked control. Delete is named for assistive technology, and the shared toast announces the batch Undo.
  • Undo restores all coalesced rows in order. The regression also covers stale-read fencing, idempotent replay and a 20-delete server burst.
  • Captured macOS-rendered production screenshots in light and dark at 1440, 820 and 390 CSS pixels. CALTERNAL_E2E_MAC=1 supplies macOS shortcut rendering.
  • UX gaps left: none found in this issue's Delete/Undo flow.

Screenshots: 1440 light, 1440 dark, 820 light, 820 dark, 390 light, 390 dark.

Gates and verification

Commands ran in the requested order. The exact final build and check outputs include:

cd apps/web && bun run build — exit 0:

Compressed 917 static variants; saved 21487564 bytes.

cd apps/web && bun run check — exit 0:

perf-lint: PASS; 0 violations; 22544 scoped exceptions
User browser caches use userStorage; only documented device/public-link exceptions remain.
Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Keyboard focus rings use the shared focus tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
svelte-check found 0 errors and 1 warning in 1 file

The one warning is unrelated existing CSS in packages/ui/src/components/calendar/AttachmentDeck.svelte:1055: Warn: Do not use empty rulesets (css).

cd apps/web && bun run test — exit 1; one unrelated Calendar retry test timed out at its existing 5000 ms limit under load:

Test Files  1 failed | 286 passed (287)
Tests  1 failed | 2038 passed (2039)
Start at  19:28:24
Duration  802.52s (transform 28%, environment 25%, import 23%, tests 18%, setup 6%)
error: script "test" exited with code 1

As requested, reran the failing file alone; it passed:

Test Files  1 passed (1)
Tests  4 passed (4)
Start at  19:41:59
Duration  21.64s (transform 74%, tests 10%, environment 8%, import 6%, setup 2%)

After the bounded Undo change, the focused notification suite passed:

Test Files  1 passed (1)
Tests  10 passed (10)
Start at  19:56:24
Duration  27.40s (transform 82%, import 7%, environment 6%, tests 3%, setup 3%)

Production Playwright E2E on the final code passed against the real server and API:

BURST 20 concurrent Delete requests dispatched in 15.5 ms; all responses settled in 544.2 ms
PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots

No Rust source or crate changed, so no Rust crate gate applied. cargo clean removed 7.3 GiB; web build output was removed.

Performance

Expected work: each Delete filters the currently loaded n rows (O(n)) and sends one receipt mutation; a coalesced Undo restores N receipts with min(4, N) concurrent writes. The profile covers 64 rows/10 rounds and the 10,000-row retention limit.

The local fallback profile ran on a busy development host because the perf VM could not start the staged server. Load average was 64.47 / 67.45 / 65.02 before and 65.06 / 66.34 / 64.83 after; it is not a baseline-comparable measurement. There is no Delete/Undo operation baseline in docs/perf/baseline.json (the existing inbox baseline is list-read only). At 64 rows, single Delete p50/p95 was 61.8 / 213.8 ms and Delete+Undo was 34.8 / 87.4 ms; mean server RSS was 184,939,789 B and mean CPU was 7.41%. At 10,000 rows, Delete was 512.6 ms and Clear was 5,665.9 ms. The captured 20-request E2E burst settled in 544.2 ms. The local benchmark record was taken before the final four-write Undo concurrency cap; its large-batch Undo timings are not claimed for the final cap.

Decisions not specified in DESIGN

  • Reused the app's existing 8-second UNDO_MS window for Delete Undo so the shared toast owns its timer and accessibility behavior.
  • Capped receipt restoration at four concurrent writes to bound burst pressure while allowing independent restores to proceed together.
  • Set the phone sheet to the shared three-quarter size and disabled FLIP for the first live row so its × remains under a stationary pointer while following rows collapse.

For the merge round

  • cd apps/web && bun run test — rerun the full web suite and confirm the Calendar retry timeout does not recur.
  • Run the full production E2E and adversarial matrices for the merged branch, including CALTERNAL_E2E_MAC=1 CALTERNAL_E2E_ASSET_OVERRIDE=1 bun apps/web/e2e/notifdel-1363.mjs — confirm click-through Undo, idempotent replay, stable order, macOS screenshots, and the 20-request burst against the combined build.
# #1363 complete Branch: `job/notifdel-1363` (based on `dev`; merged `origin/dev` once before final gates). Head: `bf523375ffe4514a8184751251f6622bcafd5853` (`Bound coalesced notification Undo requests`). Worktree is clean. ## Built - Notification Delete now removes its row optimistically in the same frame. The inline `Deleted / Undo` placeholder is gone. The top row stays at the stationary pointer hitbox while later rows collapse, so five real clicks at the same × position delete five successive notifications. - Consecutive Deletes coalesce in the app's shared Undo toast. It says `N notifications deleted · Undo` and restores the deleted items in server order. Client receipt IDs keep retries idempotent; inbox read generations prevent stale refreshes from resurrecting deleted rows. - Delete Undo sends at most four independent receipt writes at once. Clear all keeps its existing inline Undo. - The phone Notifications sheet uses the shared `OverlaySurface` three-quarter size to keep the Delete hitbox fixed as rows collapse. Existing shared Menu, row action buttons/tooltips and toast adapter provide the controls; no feature-local primitive restyling was added. - Added the real-server production Playwright regression, a notification mutation benchmark profile, toast/store regression coverage, and the DESIGN §27 decision update. ## Files - `apps/web/src/lib/notifications/InboxPanel.svelte` - `apps/web/src/lib/notifications/inbox.svelte.ts` - `apps/web/src/lib/notifications/inbox.svelte.test.ts` - `apps/web/src/lib/notifications/model.ts` - `apps/web/src/lib/notifications/model.test.ts` - `apps/web/src/lib/stores/toasts.svelte.ts` - `apps/web/src/lib/stores/toasts.svelte.test.ts` - `apps/web/e2e/notifdel-1363.mjs` - `apps/web/e2e/notifications-1194.mjs` - `apps/web/package.json` - `bench/notifications-inbox-1194.mjs` - `contracts/perf/adoption-1058.json` - `contracts/perf/exceptions.json` - `contracts/perf/registry.json` - `docs/DESIGN.md` ## UX gaps closed - Fixed-coordinate repeated clicks work on phone and desktop without moving the pointer or waiting for row motion. - Keyboard and menu Delete preserve list focus; pointer Delete does not pull focus away from the clicked control. Delete is named for assistive technology, and the shared toast announces the batch Undo. - Undo restores all coalesced rows in order. The regression also covers stale-read fencing, idempotent replay and a 20-delete server burst. - Captured macOS-rendered production screenshots in light and dark at 1440, 820 and 390 CSS pixels. `CALTERNAL_E2E_MAC=1` supplies macOS shortcut rendering. - UX gaps left: none found in this issue's Delete/Undo flow. Screenshots: [1440 light](https://git.kayg.org/attachments/2b54bf75-58e3-4eb4-8505-330c64d73da3), [1440 dark](https://git.kayg.org/attachments/f409c69a-eba1-4fe4-a701-76d5e6ca0e5b), [820 light](https://git.kayg.org/attachments/43de3b5a-924d-4d55-90f1-f5862bcc4cee), [820 dark](https://git.kayg.org/attachments/0e5ed306-90a2-4555-a885-8ec475da2442), [390 light](https://git.kayg.org/attachments/2e04d20c-e048-4859-ab8f-6d343ee2b47a), [390 dark](https://git.kayg.org/attachments/5d304c53-6487-4215-ab7d-2715391228d1). ## Gates and verification Commands ran in the requested order. The exact final build and check outputs include: `cd apps/web && bun run build` — exit 0: ```text Compressed 917 static variants; saved 21487564 bytes. ``` `cd apps/web && bun run check` — exit 0: ```text perf-lint: PASS; 0 violations; 22544 scoped exceptions User browser caches use userStorage; only documented device/public-link exceptions remain. Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Keyboard focus rings use the shared focus tokens. UI transitions and animation options use shared motion tokens or documented exceptions. svelte-check found 0 errors and 1 warning in 1 file ``` The one warning is unrelated existing CSS in `packages/ui/src/components/calendar/AttachmentDeck.svelte:1055`: `Warn: Do not use empty rulesets (css)`. `cd apps/web && bun run test` — exit 1; one unrelated Calendar retry test timed out at its existing 5000 ms limit under load: ```text Test Files 1 failed | 286 passed (287) Tests 1 failed | 2038 passed (2039) Start at 19:28:24 Duration 802.52s (transform 28%, environment 25%, import 23%, tests 18%, setup 6%) error: script "test" exited with code 1 ``` As requested, reran the failing file alone; it passed: ```text Test Files 1 passed (1) Tests 4 passed (4) Start at 19:41:59 Duration 21.64s (transform 74%, tests 10%, environment 8%, import 6%, setup 2%) ``` After the bounded Undo change, the focused notification suite passed: ```text Test Files 1 passed (1) Tests 10 passed (10) Start at 19:56:24 Duration 27.40s (transform 82%, import 7%, environment 6%, tests 3%, setup 3%) ``` Production Playwright E2E on the final code passed against the real server and API: ```text BURST 20 concurrent Delete requests dispatched in 15.5 ms; all responses settled in 544.2 ms PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots ``` No Rust source or crate changed, so no Rust crate gate applied. `cargo clean` removed 7.3 GiB; web build output was removed. ## Performance Expected work: each Delete filters the currently loaded `n` rows (`O(n)`) and sends one receipt mutation; a coalesced Undo restores `N` receipts with `min(4, N)` concurrent writes. The profile covers 64 rows/10 rounds and the 10,000-row retention limit. The local fallback profile ran on a busy development host because the perf VM could not start the staged server. Load average was 64.47 / 67.45 / 65.02 before and 65.06 / 66.34 / 64.83 after; it is not a baseline-comparable measurement. There is no Delete/Undo operation baseline in `docs/perf/baseline.json` (the existing inbox baseline is list-read only). At 64 rows, single Delete p50/p95 was 61.8 / 213.8 ms and Delete+Undo was 34.8 / 87.4 ms; mean server RSS was 184,939,789 B and mean CPU was 7.41%. At 10,000 rows, Delete was 512.6 ms and Clear was 5,665.9 ms. The captured 20-request E2E burst settled in 544.2 ms. The local benchmark record was taken before the final four-write Undo concurrency cap; its large-batch Undo timings are not claimed for the final cap. ## Decisions not specified in DESIGN - Reused the app's existing 8-second `UNDO_MS` window for Delete Undo so the shared toast owns its timer and accessibility behavior. - Capped receipt restoration at four concurrent writes to bound burst pressure while allowing independent restores to proceed together. - Set the phone sheet to the shared three-quarter size and disabled FLIP for the first live row so its × remains under a stationary pointer while following rows collapse. ## For the merge round - `cd apps/web && bun run test` — rerun the full web suite and confirm the Calendar retry timeout does not recur. - Run the full production E2E and adversarial matrices for the merged branch, including `CALTERNAL_E2E_MAC=1 CALTERNAL_E2E_ASSET_OVERRIDE=1 bun apps/web/e2e/notifdel-1363.mjs` — confirm click-through Undo, idempotent replay, stable order, macOS screenshots, and the 20-request burst against the combined build.
Author
Owner

Starting #1363 in worktree /home/kayg/Developer/calternal-wt/notifdel-1363 on branch job/notifdel-1363 at bf523375ff. Merge-base with origin/dev is 0419170fe4.

Starting #1363 in worktree /home/kayg/Developer/calternal-wt/notifdel-1363 on branch job/notifdel-1363 at bf523375ffe4514a8184751251f6622bcafd5853. Merge-base with origin/dev is 0419170fe456b58614befcb12d9c9d255118f1c0.
Author
Owner

Finding before the fix: InboxPanel.svelte moves focus with raw focus() after a keyboard Delete (line 215), so the shared focusQuietly helper is not applied at this restoration point. Clear all currently publishes a pending inlineUndoRows entry, then confirms an inline row; inbox.svelte.test.ts explicitly asserts that row and no toast (lines 278–290), while DESIGN §27 lines 825–826 prescribes it. For the Open control, InboxPanel.svelte renders nt-toast-actions after nt-open and its CSS adds bottom padding; I found no DESIGN decision for that placement. The nt-toast-actions layout originated as the action-label row in code history, not as a documented row-layout rule. I am updating the Clear all rule to this issue owner decision and moving Open into the row trailing controls.

Finding before the fix: InboxPanel.svelte moves focus with raw focus() after a keyboard Delete (line 215), so the shared focusQuietly helper is not applied at this restoration point. Clear all currently publishes a pending inlineUndoRows entry, then confirms an inline row; inbox.svelte.test.ts explicitly asserts that row and no toast (lines 278–290), while DESIGN §27 lines 825–826 prescribes it. For the Open control, InboxPanel.svelte renders nt-toast-actions after nt-open and its CSS adds bottom padding; I found no DESIGN decision for that placement. The nt-toast-actions layout originated as the action-label row in code history, not as a documented row-layout rule. I am updating the Clear all rule to this issue owner decision and moving Open into the row trailing controls.
Author
Owner

The first web check found the touched InboxPanel list moved its existing exact render-bound perf pin: perf-lint reports the 512eeb70f0460be4 scope as unused or changed after the template restructure. I will refresh only the exact live hashes after merging origin/dev; exception counts and ratchet ceilings will stay unchanged.

The first web check found the touched InboxPanel list moved its existing exact render-bound perf pin: perf-lint reports the 512eeb70f0460be4 scope as unused or changed after the template restructure. I will refresh only the exact live hashes after merging origin/dev; exception counts and ratchet ceilings will stay unchanged.
Author
Owner

The exact-pin refresh is complete. Evidence: perf-lint reports PASS; 0 violations; 22544 scoped exceptions. I changed only the live hashes for the two existing InboxPanel list scopes and six cache raw-read entries inside the touched mutation controller. The ledger count and ratchet ceilings did not change.

The exact-pin refresh is complete. Evidence: perf-lint reports PASS; 0 violations; 22544 scoped exceptions. I changed only the live hashes for the two existing InboxPanel list scopes and six cache raw-read entries inside the touched mutation controller. The ledger count and ratchet ceilings did not change.
Author
Owner

The required origin/dev merge reached one content conflict in contracts/perf/registry.json. I kept the merged dev registry fields and resolved the two InboxPanel list hashes from the merged component source; no product-code conflicts remain. The full check and tests will run against this merged state.

The required origin/dev merge reached one content conflict in contracts/perf/registry.json. I kept the merged dev registry fields and resolved the two InboxPanel list hashes from the merged component source; no product-code conflicts remain. The full check and tests will run against this merged state.
Author
Owner

Post-merge bun run test reached 292 passing files and 2106 passing tests; one unrelated fontsGroup menu test timed out at the 5000 ms limit. Evidence from the run: the test took 11176 ms and Vitest reported Test timed out in 5000ms. The file is outside the Notifications changes. A one-file rerun with --maxWorkers=1 passed (1 file, 1 test, 56.34 s wall including transform). I did not change its expectation.

Post-merge bun run test reached 292 passing files and 2106 passing tests; one unrelated fontsGroup menu test timed out at the 5000 ms limit. Evidence from the run: the test took 11176 ms and Vitest reported Test timed out in 5000ms. The file is outside the Notifications changes. A one-file rerun with --maxWorkers=1 passed (1 file, 1 test, 56.34 s wall including transform). I did not change its expectation.
Author
Owner

The first re-capture run completed desktop/tablet and reached 390 px before stopping at the post-Undo alignment assertion. Evidence: the 390 px capture showed the environmental ‘Update available’ toast because the local production build ID did not match the shared server; the assertion also sampled a row while its Undo restore motion was active. I’m rebuilding with the shared server build ID and waiting for row motion to finish before measuring. No production layout adjustment is assumed from this transient measurement.

The first re-capture run completed desktop/tablet and reached 390 px before stopping at the post-Undo alignment assertion. Evidence: the 390 px capture showed the environmental ‘Update available’ toast because the local production build ID did not match the shared server; the assertion also sampled a row while its Undo restore motion was active. I’m rebuilding with the shared server build ID and waiting for row motion to finish before measuring. No production layout adjustment is assumed from this transient measurement.
Author
Owner

Follow-up evidence: after waiting for row animations, the 390 px Open/Delete geometry assertion passed in light and dark. The keyboard check then showed the helper was seeing Delete’s programmatically restored row focus before any Tab event. I now blur that focus before Tab, without changing the shared modality predicate. Focused run passed: BURST 20 concurrent Delete requests dispatched in 92.2 ms; all responses settled in 478.8 ms; PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots. Test harness fix committed as 2f03f8874.

Follow-up evidence: after waiting for row animations, the 390 px Open/Delete geometry assertion passed in light and dark. The keyboard check then showed the helper was seeing Delete’s programmatically restored row focus before any Tab event. I now blur that focus before Tab, without changing the shared modality predicate. Focused run passed: BURST 20 concurrent Delete requests dispatched in 92.2 ms; all responses settled in 478.8 ms; PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots. Test harness fix committed as 2f03f8874.
Author
Owner

Full Mac-emulated production e2e passed across 1440/820/390 px in Paper and Tokyo Night. It wrote all 18 mouse-five-delete, Tab+Delete, and Clear all empty-state screenshots under artifacts/notifdel-1363/. Final output: BURST 20 concurrent Delete requests dispatched in 7.4 ms; all responses settled in 351.3 ms; PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots.

Full Mac-emulated production e2e passed across 1440/820/390 px in Paper and Tokyo Night. It wrote all 18 mouse-five-delete, Tab+Delete, and Clear all empty-state screenshots under artifacts/notifdel-1363/. Final output: BURST 20 concurrent Delete requests dispatched in 7.4 ms; all responses settled in 351.3 ms; PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots.
Author
Owner

The first #1194 full recapture stopped after the 390 px images: its ArrowDown assertion used row locators created before a full page navigation. I rebound them to the reopened panel and kept the expected IDs and focus assertions unchanged. The complete rerun passed: PASS Notifications #1194: 24 screenshots at 390, 820 and 1440 px in light and dark.

The first #1194 full recapture stopped after the 390 px images: its ArrowDown assertion used row locators created before a full page navigation. I rebound them to the reopened panel and kept the expected IDs and focus assertions unchanged. The complete rerun passed: PASS Notifications #1194: 24 screenshots at 390, 820 and 1440 px in light and dark.
Author
Owner

#1363 final report

Branch: job/notifdel-1363
Base: origin/dev at ef0aa12b1
Head: 82ba8065f

Built

  • Delete now removes each notification in the same frame and restores focus with the shared quiet-focus helper. Mouse Delete leaves no ring; Tab + Delete keeps the keyboard ring on the next live row.
  • Clear all now uses the shared coalesced Undo toast and leaves the real empty state. The server's clear receipt restores the full set.
  • Open now sits inside the row on the trailing side beside time and Delete. The shared Pill is centered on the row action line.
  • Added coverage for five same-position mouse clicks, keyboard Delete, Clear all, durable receipt replay, and a 20-request burst.
  • Updated DESIGN §27 and the notification mutation profile. All screenshot evidence uses the production web build with macOS platform emulation.

UX gaps closed

  • Mouse and keyboard focus continuity now follow their required ring behavior.
  • Clear all no longer inserts an inline confirmation row; its toast reports the count and Undo restores the inbox.
  • Open stays inside the row’s hover box and lines up with Delete.

UX gaps left: None found in the requested flows.

Decisions not specified in DESIGN

  • The Clear all UI keeps only the loaded pre-clear row view in memory while Undo is live. The server receipt remains authoritative for durable restoration; inbox contents are not copied to User storage.
  • Delete receipt restores use a concurrency limit of four to bound independent writes. The value is an implementation limit; the shared design specifies bounded work but not the number.

Files

  • apps/web/src/lib/notifications/InboxPanel.svelte
  • apps/web/src/lib/notifications/inbox.svelte.ts
  • apps/web/src/lib/notifications/model.ts
  • apps/web/src/lib/stores/toasts.svelte.ts
  • apps/web/src/lib/notifications/inbox.svelte.test.ts
  • apps/web/src/lib/notifications/model.test.ts
  • apps/web/src/lib/stores/toasts.svelte.test.ts
  • apps/web/e2e/notifdel-1363.mjs
  • apps/web/e2e/notifications-1194.mjs
  • apps/web/package.json
  • bench/notifications-inbox-1194.mjs
  • contracts/perf/adoption-1058.json
  • contracts/perf/exceptions.json
  • contracts/perf/registry.json
  • docs/DESIGN.md

Gates (verbatim)

bun run check:

perf-lint: PASS; 0 violations; 22543 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

Focused inbox/model tests:

Test Files  2 passed (2)
      Tests  22 passed (22)

bun run test completed with one unrelated timeout in src/lib/fontsGroup.svelte.test.ts; the isolated rerun passed:

FAIL  |component| src/lib/fontsGroup.svelte.test.ts > font menus > previews each choice in its own local face only while its shared menu is open
Error: Test timed out in 5000ms.
Test Files  1 failed | 292 passed (293)
      Tests  1 failed | 2106 passed (2107)
Test Files  1 passed (1)
      Tests  1 passed (1)

The isolated font test passed in 56.34 s overall, with about 2.2 s in the test itself. The full-suite timeout occurred while other host jobs were running. No expectation was changed.

Production build:

Compressed 914 static variants; saved 21488670 bytes.
Removed 1 file, 356B total

cargo clean output above. Rust sources were not changed, so no Rust crate gates ran. node --check for both e2e scripts and git diff --check exited 0 with no output.

Full notification e2e output:

BURST 20 concurrent Delete requests dispatched in 7.4 ms; all responses settled in 351.3 ms
PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots
PASS Notifications #1194: 24 screenshots at 390, 820 and 1440 px in light and dark

The focused 390 px #1363 run also passed. The full #1363 run wrote 18 screenshots; the adjacent #1194 run wrote 24. All 42 PNGs are attached below.

Performance profile

Expected work: average 64 rows across 10 rounds; worst case 10,000 rows; burst case 20 concurrent Deletes and their Undos. The perf VM was held by bignote-1349 for 45 minutes, so this is a local measurement. Host load average was 27.30 / 29.84 / 32.37 before and 27.25 / 29.61 / 32.23 after.

64-row average phase (10 rounds):

Operation p50 p95
Delete 15.9 ms 25.4 ms
Delete Undo 16.9 ms 34.0 ms
Clear all 22.7 ms 57.3 ms
Clear Undo 24.8 ms 65.1 ms

Average-phase resources: mean / peak RSS 183.2 / 183.4 MB; mean / peak CPU 19.22% / 195.67%.

10,000-row scenario (one sample per operation): Delete 43.3 ms; Delete Undo 20.2 ms; Clear all 2,106.1 ms; Clear Undo 1,869.0 ms. Mean / peak RSS 213.6 / 222.3 MB; mean / peak CPU 66.9% / 395.48%.

20-request burst over 10,000 rows: Delete p50 / p95 251.6 / 310.4 ms, 399.2 ms wall time; Undo p50 / p95 84.7 / 142.2 ms, 195.4 ms wall time. Mean / peak RSS 223.8 / 225.5 MB; mean / peak CPU 49.9% / 261.22%.

docs/perf/baseline.json has a separate notifications.inbox list-read baseline of p50 1.7 ms / p95 3.6 ms; it is not a direct Delete/Clear comparison. Raw local results are in artifacts/notifications-inbox-1363-local.json.

Screenshots attached

#1363 interaction set (18 PNGs)

State Width Theme Attachment
Five mouse Deletes 390 px Light (Paper) mouse-five-deleted-390-paper.png
Five mouse Deletes 390 px Dark (Tokyo Night) mouse-five-deleted-390-tokyo-night.png
Five mouse Deletes 820 px Light (Paper) mouse-five-deleted-820-paper.png
Five mouse Deletes 820 px Dark (Tokyo Night) mouse-five-deleted-820-tokyo-night.png
Five mouse Deletes 1440 px Light (Paper) mouse-five-deleted-1440-paper.png
Five mouse Deletes 1440 px Dark (Tokyo Night) mouse-five-deleted-1440-tokyo-night.png
Tab + Delete 390 px Light (Paper) keyboard-delete-390-paper.png
Tab + Delete 390 px Dark (Tokyo Night) keyboard-delete-390-tokyo-night.png
Tab + Delete 820 px Light (Paper) keyboard-delete-820-paper.png
Tab + Delete 820 px Dark (Tokyo Night) keyboard-delete-820-tokyo-night.png
Tab + Delete 1440 px Light (Paper) keyboard-delete-1440-paper.png
Tab + Delete 1440 px Dark (Tokyo Night) keyboard-delete-1440-tokyo-night.png
Clear all empty state 390 px Light (Paper) clear-all-empty-390-paper.png
Clear all empty state 390 px Dark (Tokyo Night) clear-all-empty-390-tokyo-night.png
Clear all empty state 820 px Light (Paper) clear-all-empty-820-paper.png
Clear all empty state 820 px Dark (Tokyo Night) clear-all-empty-820-tokyo-night.png
Clear all empty state 1440 px Light (Paper) clear-all-empty-1440-paper.png
Clear all empty state 1440 px Dark (Tokyo Night) clear-all-empty-1440-tokyo-night.png

#1194 adjacent Delete/Undo and Clear/Undo set (24 PNGs)

State Width Theme Attachment
Delete toast 390 px Light (Paper) delete-toast-390-paper.png
Delete toast 390 px Dark (Tokyo Night) delete-toast-390-tokyo-night.png
Delete toast 820 px Light (Paper) delete-toast-820-paper.png
Delete toast 820 px Dark (Tokyo Night) delete-toast-820-tokyo-night.png
Delete toast 1440 px Light (Paper) delete-toast-1440-paper.png
Delete toast 1440 px Dark (Tokyo Night) delete-toast-1440-tokyo-night.png
Delete Undo 390 px Light (Paper) delete-toast-undo-390-paper.png
Delete Undo 390 px Dark (Tokyo Night) delete-toast-undo-390-tokyo-night.png
Delete Undo 820 px Light (Paper) delete-toast-undo-820-paper.png
Delete Undo 820 px Dark (Tokyo Night) delete-toast-undo-820-tokyo-night.png
Delete Undo 1440 px Light (Paper) delete-toast-undo-1440-paper.png
Delete Undo 1440 px Dark (Tokyo Night) delete-toast-undo-1440-tokyo-night.png
Clear toast + empty state 390 px Light (Paper) clear-toast-390-paper.png
Clear toast + empty state 390 px Dark (Tokyo Night) clear-toast-390-tokyo-night.png
Clear toast + empty state 820 px Light (Paper) clear-toast-820-paper.png
Clear toast + empty state 820 px Dark (Tokyo Night) clear-toast-820-tokyo-night.png
Clear toast + empty state 1440 px Light (Paper) clear-toast-1440-paper.png
Clear toast + empty state 1440 px Dark (Tokyo Night) clear-toast-1440-tokyo-night.png
Clear Undo 390 px Light (Paper) clear-undo-390-paper.png
Clear Undo 390 px Dark (Tokyo Night) clear-undo-390-tokyo-night.png
Clear Undo 820 px Light (Paper) clear-undo-820-paper.png
Clear Undo 820 px Dark (Tokyo Night) clear-undo-820-tokyo-night.png
Clear Undo 1440 px Light (Paper) clear-undo-1440-paper.png
Clear Undo 1440 px Dark (Tokyo Night) clear-undo-1440-tokyo-night.png

No push, deploy, merge to dev, or issue closure was performed.

#1363 final report **Branch:** `job/notifdel-1363` **Base:** `origin/dev` at `ef0aa12b1` **Head:** `82ba8065f` ## Built - Delete now removes each notification in the same frame and restores focus with the shared quiet-focus helper. Mouse Delete leaves no ring; Tab + Delete keeps the keyboard ring on the next live row. - Clear all now uses the shared coalesced Undo toast and leaves the real empty state. The server's clear receipt restores the full set. - Open now sits inside the row on the trailing side beside time and Delete. The shared Pill is centered on the row action line. - Added coverage for five same-position mouse clicks, keyboard Delete, Clear all, durable receipt replay, and a 20-request burst. - Updated DESIGN §27 and the notification mutation profile. All screenshot evidence uses the production web build with macOS platform emulation. ## UX gaps closed - Mouse and keyboard focus continuity now follow their required ring behavior. - Clear all no longer inserts an inline confirmation row; its toast reports the count and Undo restores the inbox. - Open stays inside the row’s hover box and lines up with Delete. **UX gaps left:** None found in the requested flows. ## Decisions not specified in DESIGN - The Clear all UI keeps only the loaded pre-clear row view in memory while Undo is live. The server receipt remains authoritative for durable restoration; inbox contents are not copied to User storage. - Delete receipt restores use a concurrency limit of four to bound independent writes. The value is an implementation limit; the shared design specifies bounded work but not the number. ## Files - `apps/web/src/lib/notifications/InboxPanel.svelte` - `apps/web/src/lib/notifications/inbox.svelte.ts` - `apps/web/src/lib/notifications/model.ts` - `apps/web/src/lib/stores/toasts.svelte.ts` - `apps/web/src/lib/notifications/inbox.svelte.test.ts` - `apps/web/src/lib/notifications/model.test.ts` - `apps/web/src/lib/stores/toasts.svelte.test.ts` - `apps/web/e2e/notifdel-1363.mjs` - `apps/web/e2e/notifications-1194.mjs` - `apps/web/package.json` - `bench/notifications-inbox-1194.mjs` - `contracts/perf/adoption-1058.json` - `contracts/perf/exceptions.json` - `contracts/perf/registry.json` - `docs/DESIGN.md` ## Gates (verbatim) `bun run check`: ```text perf-lint: PASS; 0 violations; 22543 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` Focused inbox/model tests: ```text Test Files 2 passed (2) Tests 22 passed (22) ``` `bun run test` completed with one unrelated timeout in `src/lib/fontsGroup.svelte.test.ts`; the isolated rerun passed: ```text FAIL |component| src/lib/fontsGroup.svelte.test.ts > font menus > previews each choice in its own local face only while its shared menu is open Error: Test timed out in 5000ms. Test Files 1 failed | 292 passed (293) Tests 1 failed | 2106 passed (2107) ``` ```text Test Files 1 passed (1) Tests 1 passed (1) ``` The isolated font test passed in 56.34 s overall, with about 2.2 s in the test itself. The full-suite timeout occurred while other host jobs were running. No expectation was changed. Production build: ```text Compressed 914 static variants; saved 21488670 bytes. ``` ```text Removed 1 file, 356B total ``` `cargo clean` output above. Rust sources were not changed, so no Rust crate gates ran. `node --check` for both e2e scripts and `git diff --check` exited 0 with no output. Full notification e2e output: ```text BURST 20 concurrent Delete requests dispatched in 7.4 ms; all responses settled in 351.3 ms PASS Notifications #1363: five-click Undo, 20-request burst, and Mac-rendered screenshots PASS Notifications #1194: 24 screenshots at 390, 820 and 1440 px in light and dark ``` The focused 390 px #1363 run also passed. The full #1363 run wrote 18 screenshots; the adjacent #1194 run wrote 24. All 42 PNGs are attached below. ## Performance profile Expected work: average 64 rows across 10 rounds; worst case 10,000 rows; burst case 20 concurrent Deletes and their Undos. The perf VM was held by `bignote-1349` for 45 minutes, so this is a local measurement. Host load average was 27.30 / 29.84 / 32.37 before and 27.25 / 29.61 / 32.23 after. **64-row average phase (10 rounds):** | Operation | p50 | p95 | |---|---:|---:| | Delete | 15.9 ms | 25.4 ms | | Delete Undo | 16.9 ms | 34.0 ms | | Clear all | 22.7 ms | 57.3 ms | | Clear Undo | 24.8 ms | 65.1 ms | Average-phase resources: mean / peak RSS 183.2 / 183.4 MB; mean / peak CPU 19.22% / 195.67%. **10,000-row scenario (one sample per operation):** Delete 43.3 ms; Delete Undo 20.2 ms; Clear all 2,106.1 ms; Clear Undo 1,869.0 ms. Mean / peak RSS 213.6 / 222.3 MB; mean / peak CPU 66.9% / 395.48%. **20-request burst over 10,000 rows:** Delete p50 / p95 251.6 / 310.4 ms, 399.2 ms wall time; Undo p50 / p95 84.7 / 142.2 ms, 195.4 ms wall time. Mean / peak RSS 223.8 / 225.5 MB; mean / peak CPU 49.9% / 261.22%. `docs/perf/baseline.json` has a separate `notifications.inbox` list-read baseline of p50 1.7 ms / p95 3.6 ms; it is not a direct Delete/Clear comparison. Raw local results are in `artifacts/notifications-inbox-1363-local.json`. ## Screenshots attached ### #1363 interaction set (18 PNGs) | State | Width | Theme | Attachment | |---|---:|---|---| | Five mouse Deletes | 390 px | Light (Paper) | [mouse-five-deleted-390-paper.png](https://git.kayg.org/attachments/7271d2b1-51cd-488f-a2b1-ccdc9c1a6630) | | Five mouse Deletes | 390 px | Dark (Tokyo Night) | [mouse-five-deleted-390-tokyo-night.png](https://git.kayg.org/attachments/53412864-53ed-4f82-aa6b-b35c53357025) | | Five mouse Deletes | 820 px | Light (Paper) | [mouse-five-deleted-820-paper.png](https://git.kayg.org/attachments/56bb0a56-8e78-49e9-ac3a-314a7b913303) | | Five mouse Deletes | 820 px | Dark (Tokyo Night) | [mouse-five-deleted-820-tokyo-night.png](https://git.kayg.org/attachments/8215b0a9-f28a-411e-a4a4-4a260b57fbdb) | | Five mouse Deletes | 1440 px | Light (Paper) | [mouse-five-deleted-1440-paper.png](https://git.kayg.org/attachments/e7557689-286f-458d-a894-bde63f1302ea) | | Five mouse Deletes | 1440 px | Dark (Tokyo Night) | [mouse-five-deleted-1440-tokyo-night.png](https://git.kayg.org/attachments/c832f6ef-9ffa-4192-aa9a-36ac3b9c02d0) | | Tab + Delete | 390 px | Light (Paper) | [keyboard-delete-390-paper.png](https://git.kayg.org/attachments/c623ebd4-123d-4874-8482-9d40cb5de579) | | Tab + Delete | 390 px | Dark (Tokyo Night) | [keyboard-delete-390-tokyo-night.png](https://git.kayg.org/attachments/d57a4788-c86d-445c-b6cf-c210a9443793) | | Tab + Delete | 820 px | Light (Paper) | [keyboard-delete-820-paper.png](https://git.kayg.org/attachments/93f21a06-7c66-46b6-ba59-aaa652fb8be5) | | Tab + Delete | 820 px | Dark (Tokyo Night) | [keyboard-delete-820-tokyo-night.png](https://git.kayg.org/attachments/258f2b67-f3c2-4c66-9a1f-3fea336be36e) | | Tab + Delete | 1440 px | Light (Paper) | [keyboard-delete-1440-paper.png](https://git.kayg.org/attachments/21e17cc5-8cb9-4f7a-af5c-b2c899668f4c) | | Tab + Delete | 1440 px | Dark (Tokyo Night) | [keyboard-delete-1440-tokyo-night.png](https://git.kayg.org/attachments/b9de04ac-8bfd-4afd-8b2f-353a871c86e4) | | Clear all empty state | 390 px | Light (Paper) | [clear-all-empty-390-paper.png](https://git.kayg.org/attachments/4ba7ce35-40a9-4862-bd31-8394ea419ae7) | | Clear all empty state | 390 px | Dark (Tokyo Night) | [clear-all-empty-390-tokyo-night.png](https://git.kayg.org/attachments/d019dff2-6370-4c03-8789-77c24613cb12) | | Clear all empty state | 820 px | Light (Paper) | [clear-all-empty-820-paper.png](https://git.kayg.org/attachments/7e1e7eb6-1901-4109-92ea-d50a70061065) | | Clear all empty state | 820 px | Dark (Tokyo Night) | [clear-all-empty-820-tokyo-night.png](https://git.kayg.org/attachments/33ade5bf-f55b-4dcd-876e-c589d8655f24) | | Clear all empty state | 1440 px | Light (Paper) | [clear-all-empty-1440-paper.png](https://git.kayg.org/attachments/6b9428d8-90d6-46fe-82fe-ba76f48d4d3e) | | Clear all empty state | 1440 px | Dark (Tokyo Night) | [clear-all-empty-1440-tokyo-night.png](https://git.kayg.org/attachments/e46097e4-cbd0-49b9-9416-351c21ee7065) | ### #1194 adjacent Delete/Undo and Clear/Undo set (24 PNGs) | State | Width | Theme | Attachment | |---|---:|---|---| | Delete toast | 390 px | Light (Paper) | [delete-toast-390-paper.png](https://git.kayg.org/attachments/2945ea39-4aa0-42ce-a862-85f7df132e07) | | Delete toast | 390 px | Dark (Tokyo Night) | [delete-toast-390-tokyo-night.png](https://git.kayg.org/attachments/d577994b-f83d-40a9-93d2-9578135d586f) | | Delete toast | 820 px | Light (Paper) | [delete-toast-820-paper.png](https://git.kayg.org/attachments/c0f54e78-8ff1-4401-a207-4a7f95f9f528) | | Delete toast | 820 px | Dark (Tokyo Night) | [delete-toast-820-tokyo-night.png](https://git.kayg.org/attachments/32b02e6f-68a6-4b27-ab3a-f87ffa690b66) | | Delete toast | 1440 px | Light (Paper) | [delete-toast-1440-paper.png](https://git.kayg.org/attachments/a23011bf-d879-4975-8787-ce81c9c03222) | | Delete toast | 1440 px | Dark (Tokyo Night) | [delete-toast-1440-tokyo-night.png](https://git.kayg.org/attachments/0ee66321-d9da-482d-9abb-7419b2c43911) | | Delete Undo | 390 px | Light (Paper) | [delete-toast-undo-390-paper.png](https://git.kayg.org/attachments/7e249531-67a5-4305-97e7-c1d8197339bf) | | Delete Undo | 390 px | Dark (Tokyo Night) | [delete-toast-undo-390-tokyo-night.png](https://git.kayg.org/attachments/3c2b1f9c-cf79-482b-9583-b777859a07ed) | | Delete Undo | 820 px | Light (Paper) | [delete-toast-undo-820-paper.png](https://git.kayg.org/attachments/7a4680ef-3d47-4c0e-ad65-ec2f1c2c3e4d) | | Delete Undo | 820 px | Dark (Tokyo Night) | [delete-toast-undo-820-tokyo-night.png](https://git.kayg.org/attachments/f588a137-f9ff-485a-9b89-794eac8142f0) | | Delete Undo | 1440 px | Light (Paper) | [delete-toast-undo-1440-paper.png](https://git.kayg.org/attachments/f811c033-7c82-4a1c-8358-e93ccaeab315) | | Delete Undo | 1440 px | Dark (Tokyo Night) | [delete-toast-undo-1440-tokyo-night.png](https://git.kayg.org/attachments/63cd1f4d-6722-4c9f-95c0-d4cb6c5a604c) | | Clear toast + empty state | 390 px | Light (Paper) | [clear-toast-390-paper.png](https://git.kayg.org/attachments/2f30d727-13a5-4274-8edc-fcfb8501a3a2) | | Clear toast + empty state | 390 px | Dark (Tokyo Night) | [clear-toast-390-tokyo-night.png](https://git.kayg.org/attachments/fbc4d896-414b-41aa-883b-30e320004da3) | | Clear toast + empty state | 820 px | Light (Paper) | [clear-toast-820-paper.png](https://git.kayg.org/attachments/97920a3b-7c0a-47f7-bb5e-503cbcc46bbf) | | Clear toast + empty state | 820 px | Dark (Tokyo Night) | [clear-toast-820-tokyo-night.png](https://git.kayg.org/attachments/f5dc8458-a7da-4243-86eb-0c8a94a303cf) | | Clear toast + empty state | 1440 px | Light (Paper) | [clear-toast-1440-paper.png](https://git.kayg.org/attachments/39015327-e2ec-4b27-b3a9-a1a1d2ac2b7b) | | Clear toast + empty state | 1440 px | Dark (Tokyo Night) | [clear-toast-1440-tokyo-night.png](https://git.kayg.org/attachments/20bb7c26-ee3e-4215-972d-78ad21d0cc84) | | Clear Undo | 390 px | Light (Paper) | [clear-undo-390-paper.png](https://git.kayg.org/attachments/1db09f05-f97e-4844-9486-a8993faae989) | | Clear Undo | 390 px | Dark (Tokyo Night) | [clear-undo-390-tokyo-night.png](https://git.kayg.org/attachments/bb198e51-7994-43d8-9ad1-2237b4d0c8d9) | | Clear Undo | 820 px | Light (Paper) | [clear-undo-820-paper.png](https://git.kayg.org/attachments/10e35354-cdc3-4166-9ef6-dde31292d1d9) | | Clear Undo | 820 px | Dark (Tokyo Night) | [clear-undo-820-tokyo-night.png](https://git.kayg.org/attachments/1bbf1856-9fee-4e29-a7f5-aea7fc63746d) | | Clear Undo | 1440 px | Light (Paper) | [clear-undo-1440-paper.png](https://git.kayg.org/attachments/aa5a28a4-5256-4cff-8344-a61e3370a654) | | Clear Undo | 1440 px | Dark (Tokyo Night) | [clear-undo-1440-tokyo-night.png](https://git.kayg.org/attachments/1d92dc93-dc6e-4358-aa70-0232cd97c7b1) | **No push, deploy, merge to `dev`, or issue closure was performed.**
Author
Owner

Deployed to calternal.cloud in merge round 35b (build 9dc65437e, live 2026-10-09 ~11:07 IST). Closing.

Deployed to calternal.cloud in merge round 35b (build 9dc65437e, live 2026-10-09 ~11:07 IST). Closing.
kayg closed this issue 2026-10-09 05:36:57 +00:00
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal-v0#1363
No description provided.