Links say what happened to their note; # tag picker; contrast (#448, #449, #450) #513

Closed
kayg wants to merge 0 commits from train/2026-10-16t into dev
Owner

Replaces #479 (the forge ignores pushes to an open PR). Same content as links-app-5, plus one fix.

Cause: a notes.list read that was in flight when a note was deleted for real (Undo of a made note) could land after the notes.deleted event and put the note back in the page's list. Then word() saw a note at the path and drew a plain link, so the link never got cm-link-new although the server said new. Seen in the full suite on chromium-390 with the #125 changes (slower, later list reads); reproduced by a test that holds a list read back.

Fix (apps/web/src/lib/notes.svelte.ts): notes that went are remembered by when; loadNotes and refreshRecent do not put back a note that went after their read began. A restore (notes.created) forgets the mark. The link look still follows the real state through the existing events and one re-ask, no polling.

Test: missing-links.spec.ts "a late list answer from before a note was taken back does not bring it back" (failed before the fix, passes after). Assertions in the original test are unchanged.

Do not merge from here.

🤖 Generated with Claude Code

https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b

(Replaces #496, merged with current dev. Review on #496.)

Replaces #479 (the forge ignores pushes to an open PR). Same content as links-app-5, plus one fix. Cause: a `notes.list` read that was in flight when a note was deleted for real (Undo of a made note) could land after the `notes.deleted` event and put the note back in the page's list. Then `word()` saw a note at the path and drew a plain link, so the link never got `cm-link-new` although the server said `new`. Seen in the full suite on chromium-390 with the #125 changes (slower, later list reads); reproduced by a test that holds a list read back. Fix (`apps/web/src/lib/notes.svelte.ts`): notes that went are remembered by when; `loadNotes` and `refreshRecent` do not put back a note that went after their read began. A restore (`notes.created`) forgets the mark. The link look still follows the real state through the existing events and one re-ask, no polling. Test: `missing-links.spec.ts` "a late list answer from before a note was taken back does not bring it back" (failed before the fix, passes after). Assertions in the original test are unchanged. Do not merge from here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b (Replaces #496, merged with current dev. Review on #496.)
- Links read like words: accent words after a kind icon (note, day, photo, file, web), no pill or
  underline at rest, the pill on hover or with the caret inside, nothing before the full stop.
- A link to a note never written makes it at that path (notes.make-from-link, a job Undo takes
  back); one in the Trash opens a card with its first lines, Restore and Open; one deleted for good
  names the day, with Create a new note and Remove link. ⌘↵ does what a click does.
- History remembers where notes used to live (departed); notes.link-states answers a batch of
  paths with index lookups and one read; notes.relink repoints links to a note moved outside.
- `#` and a letter offers the tags that exist, nested one level at a time, with counts.
- The drag handle and the → ⋯ pill are ink icons on the dense floating glass.
- Faint pages give the editor's text its halo, and links a wash of paper, to keep 4.5:1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
- The caret lands at the end of a note opened to type in (a note made from a link, under its title).
- Answers are asked again 400 ms after a burst of notes coming, going or moving, not per event.
- Tests: toasts found by their words at every width; a day link to a day that exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
The editor is one view for every note, so a tap on a link kept the caret, and the phone's text bar
swept the "Made" toast and its Undo away. Following a link now lets the keyboard go (except for a
card, which keeps the caret to come back to), and the toast is sent before the move so it rides
along to the new note's bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
- A link to a day with no note yet keeps its day icon and opens that day through daily.open (the
  Journal's way), never an ordinary note named after the date. Weeks, months and years keep their
  icon too.
- An answer asked for again while a request for the same path was out is asked once more when it
  comes back (its answer could be from before the change), and a link whose note leaves the list
  asks at once: made, trashed, restored or deleted for good on another device, the look follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
Links: no paper wash behind links on faint pages; card buttons side by side, the obvious one icon-only when they don't fit (#448)
Some checks failed
CI / server (pull_request) Successful in 29s
CI / rust (pull_request) Successful in 2m1s
CI / web (pull_request) Failing after 50m0s
3e1a255d6c
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
Links: card actions right-aligned like a dialog, the primary on the far right (#448)
Some checks failed
CI / server (pull_request) Successful in 32s
CI / rust (pull_request) Successful in 2m22s
CI / web (pull_request) Failing after 51m28s
c40997494f
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Yyy8fQGxPLkLa8v8NXz7T
Links: both card buttons share one fixed height in every state, contents centred (#448)
Some checks failed
CI / server (pull_request) Successful in 31s
CI / rust (pull_request) Successful in 2m16s
CI / web (pull_request) Failing after 53m0s
5efebef892
Icon-only, icon plus words and the 44px touch size all use the same height, so the
buttons' tops and bottoms line up. The card test now measures after the card settles.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Links: a list read that left before a note went does not bring it back; test for it (#448)
Some checks failed
CI / server (pull_request) Successful in 22s
CI / rust (pull_request) Successful in 2m3s
CI / web (pull_request) Failing after 53m5s
6d7c545729
A notes.list answer in flight when a note is deleted for real (Undo of a made note) landed
after the delete event and put the note back in the page's list, so its link stayed plain.
Notes that went are remembered by when; a read that began earlier cannot put them back.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Merge remote-tracking branch 'origin/issue/448-links-app-6' into train/2026-10-16t
Some checks failed
CI / server (pull_request) Successful in 1m3s
CI / rust (pull_request) Failing after 2m33s
CI / web (pull_request) Failing after 57m2s
e04510cdcd
# Conflicts:
#	crates/notes/src/trash.rs
Author
Owner

This PR's commits are on dev (landed). Forgejo kept it open and its merge endpoint answers 405, so it is closed by hand.

This PR's commits are on dev (landed). Forgejo kept it open and its merge endpoint answers 405, so it is closed by hand.
kayg closed this pull request 2026-10-21 11:32:57 +00:00
Some checks failed
CI / server (pull_request) Successful in 1m3s
CI / rust (pull_request) Failing after 2m33s
CI / web (pull_request) Failing after 57m2s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
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!513
No description provided.